com.opensymphony.workflow.ofbiz
这部分还真不大清楚到底是干什么,知道有个开源的ofbiz工作流项目,但是究竟这个类具体怎么样用还没有实践过。
OfbizWorkflow :里面的三个方法(initialize、doAction、changeEntryState)都是调用abstractworkflow里的相应方法
OfbizWorkflowContext:setRollbackOnly()只有一个rollback方法,调用的是org.ofbiz.core.entity.TransactionUtil.setRollbackOnly()方法。
com.opensymphony.workflow.query
**
该包主要为查询而设计,但不是所有的工作流存储都支持查询。通常,Hibernate 和 JDBC 都支持,而内存工作流存储不支持。值得注意的是 Hibernate 存储不支持混合型查询(例如,一个查询同时包含了 history step 上下文和 current step 上下文)。
在这里分别介绍两种查询方式:一种是已经被列为不推荐的,另外一种是认为大家可以正在使用的。
先介绍类WorkflowQuery。但是目前这个类已经处于Deprecated状态。就先谈谈这个已经被定为不赞成的类吧。
这个类到底干什么的呢?WorkflowQuery主要是负责装配查询条件,它是如何装配条件的呢?
WorkflowQuery提供了两种类型的构造函数:
public WorkflowQuery(int field, int type, int operator, Object value)
public WorkflowQuery(WorkflowQuery left, int operator, WorkflowQuery right)
我们可以利用第一个构造函数创建基本的WorkflowQuery实例,然后利用第二个构造函数组织装配。以查询执行者是“test”且状态是“Underway”的step实例为例:
WorkflowQuery queryLeft = new WorkflowQuery(
WorkflowQuery.OWNER, WorkflowQuery.CURRENT, WorkflowQuery.EQUALS, “test");
WorkflowQuery queryRight = new WorkflowQuery(
WorkflowQuery.STATUS, WorkflowQuery.CURRENT, WorkflowQuery.EQUALS, “Underway");
WorkflowQuery query = new WorkflowQuery(
queryLeft, WorkflowQuery.AND, queryRight);
List workflows = wf.query(query);
for (Iterator iterator = workflows.iterator(); iterator.hasNext();)
Long wfId = (Long) iterator.next();
}
而实际的真正查询动作还是由AbstractWorkflow里的query方法,
public List query(WorkflowQuery query) throws StoreException {
return getPersistence().query(query);
},
然后再由WorkflowStore的query方法执行具体查询操作。不同的WorkflowStore实例其查询方式不尽相同,以MemoryWorkflowStore为例,它将遍历所有位于cache中的流程,然后将满足条件的流程ID放入一个ArrayList中返回,查询的核心代码采用了递归调用的形式
当我跟踪到AbstractWorkflow的时候发现了,替代WorkflowQuery的类,即WorkflowExpressionQuery。此类的构造函数为一无参数和一以Expression为参数,
其他相关类即是此包内其他剩余的几个包,Expression是一个抽象类。FieldExpression和NestedExpression都继承于Expression.
由于这部分基本没有注释,真不知道他是怎么想的,所以一些部分我也是不能理解。请大家谅解,互相学习吧!通过实例来看看是如何使用WorkflowExpressionQuery进行查询的。对了,使用WorkflowExpressionQuery的实际查询和WorkflowQuery的过程一样,都是通过AbstractWorkflow的query进而调用workflowstroe的query来进行实际查询的。
下面转载一个使用该api进行查询的实例:(来源于http://my.so-net.net.tw/idealist/OSWorkflow/program05.html)
Query.java · package tw.idv.idealist;
· import java.util.*;
· import com.opensymphony.workflow.*;
· import com.opensymphony.workflow.query.*;
· import com.opensymphony.workflow.spi.WorkflowEntry;
· /**
· * @author steven
· */
· public class Query extends AbstractWorkflow {
· public List getCompleted() {
· FieldExpression fe = new FieldExpression(FieldExpression.STATE,
· FieldExpression.ENTRY,
· FieldExpression.EQUALS,
· new Integer(WorkflowEntry.COMPLETED));
· List list = null;
· try {
· list = getPersistence().query(new WorkflowExpressionQuery(fe));
· } catch (StoreException e) {
· e.printStackTrace();
· }
· return list;
· }
· }
completed.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5" %>
<%@ page import="tw.idv.idealist.*" %>
<%@ page import="java.util.*" %>
<META http-equiv="Content-Type" content="text/html; charset=BIG5">
<META http-equiv="Content-Style-Type" content="text/css">
<LINK href="theme/Master.css" rel="stylesheet"
type="text/css">
<TITLE>completed.jsp</TITLE>
</HEAD>
<BODY>
已完成的工作流編號:<br>
<%
Query query = new Query();
List completed = query.getCompleted();
for(int i=0; i<completed.size(); i++) {
Long wfId = (Long) completed.get(i);
out.println("workflow id => " + wfId + "<br>");
}
%>
</BODY>
</HTML>
· 测试
访问jsp页面
欢迎交流yun15291li@hotmail.com