使用OSWorkflow的API
1. 接口选择
OSWorkflow提供了com.opensymphony.workflow.Workflow接口的多个实现类,你可以在你的程序中直接使用。
(1) BasicWorkflow
BasicWorkflow不支持事务处理,但是可以通过外覆BasicWorkflow的方式来支持事务,这要以来于你的持久化的实现。BasicWorkflow通过下面的方式创建: Workflow wf = new BasicWorkflow(username);
username是当前请求的用户名。
(2) EJBWorkflow
EJBWorkflow使用EJB容器来管理事务。这是在ejb-jar.xml文件中配置的。它是这样建立的:
Workflow wf = new EJBWorkflow();
这里不需要指定用户名,因为一旦用户被授权,它会从EJB容器中自动将用户名载入。
(3) OfbizWorkflow
OfbizWorkflow与BasicWorkflow唯一不同的地方在于,通过ofbiz的TransactionUtil调用可以支持事务处理。
2. 创建一个新的工作流
下面简单介绍了如何使用OSWorkflow的API来创建一个新的工作流。首先应该创建定义工作流的文件。然后,你的程序必须知道初始化步骤的值,以便进行流程实例的初始化。在你初始化一个工作流之前,你必须创建它,这样的话,你就可以得到这个工作流的引用。下面是例程代码:
Workflow wf = new BasicWorkflow(username);
HashMap inputs = new HashMap();
inputs.put("docTitle", request.getParameter("title"));
wf.initialize("workflowName", 1, inputs);
注意:一般情况下,你应该使用一个Workflow类型的引用,而不应该是BasicWorkflow的引用。
3. 执行动作
在OSWorkflow中,执行一个动作非常简单:
Workflow wf = new BasicWorkflow(username);
HashMap inputs = new HashMap();
inputs.put("docTitle", request.getParameter("title"));
long id = Long.parseLong(request.getParameter("workflowId"));
wf.doAction(id, 1, inputs);
4. 查询
在OSWorkflow 2.6中,引入了新的ExpressionQuery API。
注意:不是所有的workflow的存储都支持查询。目前,Hibernate,JDBC和内存存储都支持查询。然而,hibernate存储不支持混合类型的查询(例如:一个历史和当前步骤的查询信息的查询)。要执行查询,就要建立一个WorkflowExpressionQuery对象,然后在WorkflowExpressionQuery对象中调用查询方法。
下面是一个查询的例子:
//Get all workflow entry ID's for which the owner is 'testuser'
new WorkflowExpressionQuery(
new FieldExpression(FieldExpression.OWNER, //Check the OWNER field
FieldExpression.CURRENT_STEPS, //Look in the current steps context
FieldExpression.EQUALS, //check equality
"testuser")); //the equality value is 'testuser'
//Get all workflow entry ID's that have the name 'myworkflow'
new WorkflowExpressionQuery(
new FieldExpression(FieldExpression.NAME, //Check the NAME field
FieldExpression.ENTRY, //Look in the entries context
FieldExpression.EQUALS, //Check equality
'myworkflow')) //equality value is 'myworkflow'
下面是一个嵌套查询的例子:
// Get all finished workflow entries where the current owner is 'testuser'
Expression queryLeft = new FieldExpression( FieldExpression.OWNER, FieldExpression.CURRENT_STEPS, FieldExpression.EQUALS, 'testuser');
Expression queryRight = new FieldExpression(FieldExpression.STATUS, FieldExpression.CURRENT_STEPS, FieldExpression.EQUALS, "Finished", true);
WorkflowExpressionQuery query = new WorkflowExpressionQuery( new NestedExpression(new Expression[] {queryLeft, queryRight},NestedExpression.AND));
Finally, here is an example of a mixed-context query. Note that this query is not supported by the Hibernate workflow store.
//Get all workflow entries that were finished in the past
//or are currently marked finished
Expression queryLeft = new FieldExpression(FieldExpression.FINISH_DATE, FieldExpression.HISTORY_STEPS, FieldExpression.LT, new Date());
Expression queryRight = new FieldExpression( FieldExpression.STATUS, FieldExpression.CURRENT_STEPS, FieldExpression.EQUALS, "Finished");
WorkflowExpressionQuery query = new WorkflowExpressionQuery(new NestedExpression(new Expression[] {queryLeft, queryRight},NestedExpression.OR));