package com.sxito.jbpm;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import junit.framework.TestCase;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.Transition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.taskmgmt.def.Task;
import org.jbpm.taskmgmt.exe.TaskInstance;
public class Jbpm_08_SearchNextTransactions extends TestCase {
//获取jbpm配置
static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
/**
* 目的::::从开始节点搜索可选路径
* 实现方法 根据公文Id得到公文对象
* 根据公文得到流程实例编号
* 根据流程编号编号得到流程实例
* 根据流程实例得到RootToken
* 根据RootToken得到当前节点根据当前节点找到离开的线(该方法无法执行流程定义里的条件)
* 根据RootToken得到可利用的线(判断条件执行后的线)
* 如果调用一下signal()方法 则会随即选取一个
* 如果调用signal()方法的时候指定参数TransactionName则按指定的transaction往下流
* 如果碰到fork和join节点 在fork节点会把所有的分支都列出来!!
*/
public void testSearchNextTransactionsFromStartStatus(){
//创建jbpm上下文对象
JbpmContext context = jbpmConfiguration.createJbpmContext();
try{
int documentId = 15;
Document doc = (Document)context.getSession().load(Document.class, documentId);
long processInstanceId = doc.getProcessInstanceId();
ProcessInstance instance = (ProcessInstance) context.getProcessInstance(processInstanceId);
// List transactions = instance.getRootToken().getNode().getLeavingTransitions();
Set transactions = instance.getRootToken().getAvailableTransitions();
for (Iterator<Transition> iterator = transactions.iterator(); iterator
.hasNext();) {
Transition transition = (Transition) iterator.next();
System.err.println("公文【"+doc.getTitle()+"】的下一步可选节点为【"+transition.getName()+"】");
}
}catch(Exception e){
e.printStackTrace();
context.setRollbackOnly();
}finally{
context.close();
}
}
/**
* 从中间的tasknode节点如何得到离开的线
*
* 根据用户找到他的所有任务实例(TaskInstance)对象
* 遍历任务实例(TaskInstance)对象找到与该任务实例(TaskInstance)对应的流程实例(ProcessInstance)对象
* 并获得该流程实例(ProcessInstance)对象相关的公文id(documentId)
* 如果该公文就是要查找到准备离开的公文
* 找到该公文可利用的离开的线
* 遍历这些线并打印出来
*/
public void testSearchNextTransactionsFromTaskNode(){
//创建jbpm上下文对象
JbpmContext context = jbpmConfiguration.createJbpmContext();
try{
String actorId = "张三";
int documentId = 1;
List nextInstance = context.getTaskMgmtSession().findTaskInstances(actorId);
for (Iterator iterator1 = nextInstance.iterator(); iterator1
.hasNext();) {
TaskInstance taskInstance = (TaskInstance) iterator1.next();
Integer docId = (Integer) taskInstance.getProcessInstance().getContextInstance().getTransientVariable("documentId");
Document doc = (Document)context.getSession().load(Document.class, docId);
if(docId.equals(documentId)){
List ti = taskInstance.getAvailableTransitions();
for (Iterator iterator = ti.iterator(); iterator.hasNext();) {
Transition transition = (Transition) iterator.next();
System.err.println("公文【"+doc.getTitle()+"】的下一步可选节点为【"+transition.getName()+"】");
}
}
}
}catch(Exception e){
e.printStackTrace();
context.setRollbackOnly();
}finally{
context.close();
}
}
}
附一含有条件的流程定义文件(条件即为日期,日期大于10 就给张三审批 小于等于10就给李四审批)日期对象在创建公文时被放到流程定义里去了
<?xml version="1.0" encoding="UTF-8"?>
<process-definition
xmlns="" name="test05">
<start-state name="test10开始"><!-- condition务必要使用大括号 我用的小括号怎么找都找不到原因浪费了好多时间 -->
<transition name="提交给test10张三审批" to="test10张三审批" condition="#{days gt 10}"></transition>
<transition name="提交给test10李四审批" to="test10李四审批" condition="#{days le 10}"></transition>
</start-state>
<task-node name="test10张三审批">
<task name="">
<assigment actor-id = "张三"></assigment>
</task>
<transition name="test10即将结束1" to="test10结束"></transition>
</task-node>
<task-node name="test10李四审批">
<task name="">
<assigment actor-id = "李四"></assigment>
</task>
<transition name="test10即将结束2" to="test10结束"></transition>
</task-node>
<end-state name="test10结束"></end-state>
</process-definition>