osworkflow api 之 query and ofbiz

com.opensymphony.workflow.ofbiz

这部分还真不大清楚到底是干什么,知道有个开源的ofbiz工作流项目,但是究竟这个类具体怎么样用还没有实践过。

OfbizWorkflow :里面的三个方法(initializedoActionchangeEntryState)都是调用abstractworkflow里的相应方法

OfbizWorkflowContextsetRollbackOnly()只有一个rollback方法,调用的是org.ofbiz.core.entity.TransactionUtil.setRollbackOnly()方法。

com.opensymphony.workflow.query

**

该包主要为查询而设计,但不是所有的工作流存储都支持查询。通常,Hibernate JDBC 都支持,而内存工作流存储不支持。值得注意的是 Hibernate 存储不支持混合型查询(例如,一个查询同时包含了 history step 上下文和 current step 上下文)。

 

Expression

FieldExpression

NestedExpression

WorkflowExpressionQuery

WorkflowQuery

在这里分别介绍两种查询方式:一种是已经被列为不推荐的,另外一种是认为大家可以正在使用的。

先介绍类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);

}

然后再由WorkflowStorequery方法执行具体查询操作。不同的WorkflowStore实例其查询方式不尽相同,以MemoryWorkflowStore为例,它将遍历所有位于cache中的流程,然后将满足条件的流程ID放入一个ArrayList中返回,查询的核心代码采用了递归调用的形式

 

当我跟踪到AbstractWorkflow的时候发现了,替代WorkflowQuery的类,即WorkflowExpressionQuery。此类的构造函数为一无参数和一以Expression为参数,

其他相关类即是此包内其他剩余的几个包,Expression是一个抽象类。FieldExpressionNestedExpression都继承于Expression.

由于这部分基本没有注释,真不知道他是怎么想的,所以一些部分我也是不能理解。请大家谅解,互相学习吧!通过实例来看看是如何使用WorkflowExpressionQuery进行查询的。对了,使用WorkflowExpressionQuery的实际查询和WorkflowQuery的过程一样,都是通过AbstractWorkflowquery进而调用workflowstroequery来进行实际查询的。

下面转载一个使用该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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值