JBPM封装类
package net.sweet.service.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.sweet.dao.JbpmObjectUtilsDAO;
import net.sweet.jbpm.form.item.Item;
import net.sweet.jbpm.variable.VariableKey;
import net.sweet.log.level.Logger;
import net.sweet.service.DataBaseProber;
import net.sweet.service.WorkflowDriver;
import net.sweet.util.Constants;
import net.sweet.util.comparator.TaskInstanceComparator;
import org.jbpm.JbpmContext;
import org.jbpm.JbpmException;
import org.jbpm.context.exe.variableinstance.StringInstance;
import org.jbpm.db.GraphSession;
import org.jbpm.db.TaskMgmtSession;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;
import org.jbpm.taskmgmt.def.Task;
import org.jbpm.taskmgmt.exe.TaskInstance;
import org.jbpm.taskmgmt.exe.TaskMgmtInstance;
import org.springframework.transaction.annotation.Transactional;
import org.springmodules.workflow.jbpm31.JbpmCallback;
import org.springmodules.workflow.jbpm31.JbpmTemplate;
@SuppressWarnings("unchecked")
public class JbpmWorkflowDriver implements WorkflowDriver {
private JbpmTemplate jbpmTemplate;
private DataBaseProber dataBaseProber;
private JbpmObjectUtilsDAO jbpmObjectUtilsDao;
public void setJbpmObjectUtilsDao(JbpmObjectUtilsDAO jbpmObjectUtilsDao) {
this.jbpmObjectUtilsDao = jbpmObjectUtilsDao;
}
public void setJbpmTemplate(JbpmTemplate jbpmTemplate) {
this.jbpmTemplate = jbpmTemplate;
}
public void setDataBaseProber(DataBaseProber dataBaseProber) {
this.dataBaseProber = dataBaseProber;
}
/**
* 返回当前系统所有流程定义
*/
@Transactional(readOnly = true)
public List<?> listAllProcessDefinition() {
return (List<?>) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
Logger.debug("go into listAllProcessDefinition");
return jbpmContext.getGraphSession()
.findAllProcessDefinitions();
}
});
}
/**
* 开始流程实例,并设置流程发起者
*/
@Transactional
public Long startProcessInstance(final Long processDefinitionId,
final String username) {
return (Long) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
GraphSession graphSession = jbpmContext.getGraphSession();
ProcessDefinition processDefinition = graphSession
// .findLatestProcessDefinition("Approve");
.loadProcessDefinition(processDefinitionId);
ProcessInstance processInstance = new ProcessInstance(
processDefinition);
// 设置流程发起人
processInstance.getContextInstance().setVariable(
VariableKey.PROCESS_STARTER.name(), username);
processInstance.signal();
TaskInstance taskInstance = (TaskInstance) processInstance
.getTaskMgmtInstance().getTaskInstances().iterator()
.next();
// taskInstance.getComments()
Logger.debug("Task name is :" + taskInstance.getName());
taskInstance.setActorId(username);
taskInstance.setVariable(VariableKey.PROCESS_STARTER.name(),
username);
/*
* taskInstance.setDescription("This is a [" + username + "]
* '制单' task");
*/
taskInstance.setDueDate(Constants.TASK_DUE_DATE);
// taskInstance.end();
// Save the process instance along with the task instance
jbpmContext.save(processInstance);
return processInstance.getId();
}
});
}
/**
* 根据流程定义名字开启流程实例
*/
@Transactional
public Long startProcessInstance(final String processDefinitionName,
final String username) {
return (Long) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
GraphSession graphSession = jbpmContext.getGraphSession();
ProcessDefinition processDefinition = graphSession
.findLatestProcessDefinition(processDefinitionName);
ProcessInstance processInstance = new ProcessInstance(
processDefinition);
// 设置流程发起人
processInstance.getContextInstance().setVariable(
VariableKey.PROCESS_STARTER.name(), username);
processInstance.signal();
/*
* TaskInstance taskInstance = (TaskInstance) processInstance
* .getTaskMgmtInstance().getTaskInstances().iterator() .next();
* taskInstance.setActorId(username);
*/
// taskInstance.setVariable(VariableKey.PROCESS_STARTER.name(),
// username);
// taskInstance.end();
// Save the process instance along with the task instance
jbpmContext.save(processInstance);
return processInstance.getId();
}
});
}
/**
* 根据流程实例获得当前流程的当前任务实例
*/
@Transactional(readOnly = true)
public TaskInstance getCurrentTaskInstance(final Long processInstanceId) {
return (TaskInstance) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
ProcessInstance processInstance = jbpmContext
.loadProcessInstance(processInstanceId);
return processInstance.getTaskMgmtInstance().getTaskInstances()
.iterator().next();
}
});
}
/**
* 保存流程实例
*/
@Transactional
public void saveProcessInstance(final Long processInstanceId) {
jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
ProcessInstance processInstance = jbpmContext
.loadProcessInstance(processInstanceId);
jbpmContext.save(processInstance);
return null;
}
});
}
/**
* 根据流程实例获得当前流程的当前任务实例
*/
@Transactional(readOnly = true)
public Task getCurrentTask(final Long processInstanceId) {
return (Task) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
ProcessInstance processInstance = jbpmContext
.loadProcessInstance(processInstanceId);
return ((TaskInstance) processInstance.getTaskMgmtInstance()
.getTaskInstances().iterator().next()).getTask();
}
});
}
/**
* 取得当前任务实例所在的实例管理上下文中所有任务实例
*
* @param taskInstanceId
* @return
*/
@Transactional(readOnly = true)
public Collection getAllTaskInstances(final Long taskInstanceId) {
return (Collection) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
TaskInstance task = jbpmContext.getTaskInstance(taskInstanceId);
List sortList = new ArrayList();
sortList.addAll(task.getTaskMgmtInstance().getTaskInstances());
Collections.sort(sortList, new TaskInstanceComparator());
return sortList;
}
});
}
/**
* 完成任务实例,并保存流程实例变量
*/
@Transactional
public void endTaskInstance(final Long taskInstanceId,
final Map formParams, final String opinion, final String transition) {
jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
TaskInstance task = jbpmContext.getTaskInstance(taskInstanceId);
Set keySet = formParams.keySet();
for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
String key = (String) iterator.next();
if (key.startsWith(Item.ITEM_PREFIX)
&& !key
.endsWith(Item.FILE_PARAMETER_APPEND_POSTFIX)) {// 判断需要保存在流程实例中的变量
String value = getValue(((String[]) formParams.get(key)));
if (!isLargeString(value))// 判断是否为长字符串,如果是,则以byte[]形式保存,否则直接保存字符串
task.getContextInstance().setVariable(key, value);
else
task.getContextInstance().setVariable(key,
value.getBytes());
}
}
// task.setVariable("opinion", opinion);
task.setVariableLocally(VariableKey.TASK_OPINION.name(),
opinion);
// task.getVariablesLocally()
// task.addComment(new Comment(opinion));
task.end(transition);
// task.getPooledActors();
jbpmContext.save(task);
return null;
}
});
}
/**
* 完成任务实例
*/
@Transactional
public void endTaskInstance(final Long taskInstanceId,
final String opinion, final String transition,
final String taskProcessPerson) {
jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
TaskInstance task = jbpmContext.getTaskInstance(taskInstanceId);
task.setVariableLocally(VariableKey.TASK_OPINION.name(),
opinion);
task.setVariableLocally(VariableKey.TASK_PROCESS_PERSON.name(),
taskProcessPerson);
task.end(transition);
jbpmContext.save(task);
return null;
}
});
}
/**
* 判断当前字符串是否属于长字符串,具体参照标准为‘jbpm_variableinstance’表中的‘STRINGVALUE_’字段长度
*
* @param str
* @return
*/
private boolean isLargeString(String str) {
if (str.length() >= dataBaseProber.getFieldPrecision(
"jbpm_variableinstance", "STRINGVALUE_"))
return true;
return false;
}
/**
* 将字符数组的空间值循环构成字符串
*
* @param values
* @return
*/
private String getValue(String[] values) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < values.length; i++) {
sb.append(values[i]);
if (i != values.length - 1)
sb.append(Item.MUTIPUL_VALUE_SPLIT);
}
return sb.toString();
}
/**
* 完成任务,并结束任务
*/
/*
* @Transactional public void doTaskWithTaskEnd(final Long
* processInstanceId, final String transition) { jbpmTemplate.execute(new
* JbpmCallback() { public Object doInJbpm(JbpmContext jbpmContext) throws
* JbpmException { ProcessInstance processInstance = jbpmContext
* .loadProcessInstance(processInstanceId); TaskInstance task =
* (TaskInstance) processInstance
* .getTaskMgmtInstance().getTaskInstances().iterator() .next();
* task.end(transition); jbpmContext.save(processInstance); return null; }
* }); }
*/
/**
* 根据参与者名称获得当前所有非池任务实例
*/
@SuppressWarnings("unchecked")
@Transactional
public List<Object> getTaskList(final String username) {
return (List<Object>) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
/*
* ProcessInstance processInstance = jbpmContext
* .loadProcessInstance(processInstanceId);
*/
TaskMgmtSession taskMgmtSession = new TaskMgmtSession(
jbpmContext.getSession());
// return taskMgmtSession.findPooledTaskInstances(username);
return taskMgmtSession.findTaskInstances(username);
}
});
}
/**
* 根据参与者名称获得当前所有池任务实例
*/
@SuppressWarnings("unchecked")
@Transactional
public List<Object> getPooledTaskList(final String username) {
return (List<Object>) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
TaskMgmtSession taskMgmtSession = new TaskMgmtSession(
jbpmContext.getSession());
return taskMgmtSession.findPooledTaskInstances(username);
}
});
}
/**
* 结束任务,并跳转到指定节点
*/
@Transactional
public void endTask(final Long taskInstanceId, final String transition) {
jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
TaskInstance taskInstance = jbpmContext
.getTaskInstance(taskInstanceId);
taskInstance.end(transition);
return null;
}
});
}
/**
* 判断流程实例是否结束
*/
@Transactional(readOnly = true)
public Boolean isFinish(final Long processInstanceId) {
return (Boolean) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
ProcessInstance processInstance = jbpmContext
.loadProcessInstance(processInstanceId);
return processInstance.hasEnded();
}
});
}
/**
* 获得当前任务节点的所有可能流向
*/
@Transactional(readOnly = true)
public List<?> getTransitionByTaskNode(final Long taskInstanceId) {
return (List<?>) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
TaskInstance ti = jbpmContext.getTaskInstance(taskInstanceId);
Logger.debug(ti.getContextInstance().getVariables());
List<?> transitions = ti.getTask().getTaskNode()
.getLeavingTransitionsList();
return transitions;
}
});
}
/**
* 获得当前任务实例对应的任务节点名称
*/
@Transactional(readOnly = true)
public String getTaskNodeName(final Long taskInstanceId) {
return (String) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
TaskInstance ti = jbpmContext.getTaskInstance(taskInstanceId);
Logger.debug(ti.getContextInstance().getVariables());
return ti.getTask().getTaskNode().getName();
}
});
}
/**
* 获得流程实例信息
*/
@Transactional(readOnly = true)
public ProcessInstance getProcessInstance(final Long processInstanceId) {
return (ProcessInstance) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
return jbpmContext.getProcessInstance(processInstanceId);
}
});
}
/**
* 获得流程实例变量集合
*/
@Transactional(readOnly = true)
public Map<String, String> getProcessInstanceVariables(
final Long processInstanceId) {
return (Map<String, String>) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
return jbpmContext.getProcessInstance(processInstanceId)
.getContextInstance().getVariables();
}
});
}
/**
* 获得任务实例信息
*/
@Transactional(readOnly = true)
public TaskInstance getTaskInstance(final Long taskInstanceId) {
return (TaskInstance) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
return jbpmContext.getTaskInstance(taskInstanceId);
}
});
}
/**
* 根据流程定义,获得所有流程实例
*/
@Transactional(readOnly = true)
public List<?> getProcessInstances(final Long processDefinitionId) {
return (List<?>) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
return jbpmContext.getGraphSession().findProcessInstances(
processDefinitionId);
}
});
}
/**
* 根据流程实例得到当前所有任务实例
*/
@Transactional(readOnly = true)
public Collection<?> getTaskInstances(final Long processInstanceId) {
return (Collection<?>) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
ProcessInstance processInstance = jbpmContext
.loadProcessInstance(processInstanceId);
List sortList = new ArrayList();
sortList.addAll(processInstance.getTaskMgmtInstance()
.getTaskInstances());
Collections.sort(sortList, new TaskInstanceComparator());
return sortList;
}
});
}
/**
* 根据流程定义ID获得流程定义名称
*
* @param processDefinitionId
* @return
*/
@Transactional(readOnly = true)
public String getProcessDefinitionName(final Long processDefinitionId) {
return (String) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
return jbpmContext.getGraphSession().getProcessDefinition(
processDefinitionId).getName();
}
});
}
/**
* 根据流程定义获得任务列表
*
* @param processDefinitionId
* @return
*/
@Transactional(readOnly = true)
public Map findTaskNode(final Long processDefinitionId) {
return (Map) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
return jbpmContext.getGraphSession().getProcessDefinition(
processDefinitionId).getTaskMgmtDefinition().getTasks();
}
});
}
/**
* 根据任务实例获得当前流程定义
*
* @param processDefinitionId
* @return
*/
@Transactional(readOnly = true)
public ProcessDefinition findProcessDefinition(final Long taskInstanceId) {
return (ProcessDefinition) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
return jbpmContext.getTaskInstance(taskInstanceId)
.getContextInstance().getProcessInstance()
.getProcessDefinition();
}
});
}
/**
* 获得流程实例中的变量值
*
* @param processInstanceId
* @param key
* @return
*/
@Transactional(readOnly = true)
public Object getVariable(final Long processInstanceId, final String key) {
return jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
return jbpmContext.loadProcessInstance(processInstanceId)
.getContextInstance().getVariable(key);
}
});
}
/**
* 根据任务实例标识得到流程实例的变量值
*
* @param processInsanceId
* @param key
* 变量key
* @param value
* 变量值
*/
@Transactional(readOnly = true)
public Object getVariableByTaskInstance(final Long taskInstanceId,
final String key) {
return jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
return jbpmContext.loadTaskInstance(taskInstanceId)
.getContextInstance().getVariable(key);
}
});
}
/**
* 向流程实例中保存流程变量
*
* @param processInsanceId
* @param key
* 变量key
* @param value
* 变量值
*/
@Transactional
public void insertVariable(final Long processInstanceId, final String key,
final Object value) {
jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
jbpmContext.loadProcessInstance(processInstanceId)
.getContextInstance().setVariable(key, value);
return null;
}
});
}
/**
* 获得令牌实例对象
*
* @param tokenInstanceId
* @return
*/
@Transactional(readOnly = true)
public Token getTokenInstance(final Long tokenInstanceId) {
return (Token) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
return jbpmContext.loadToken(tokenInstanceId);
}
});
}
/**
* 根据流程定义名字开启流程实例并停留在开始节点手动往下流转
*/
@Transactional
public Long startProcessInstanceNoSignal(
final String processDefinitionName, final String username) {
return (Long) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
GraphSession graphSession = jbpmContext.getGraphSession();
ProcessDefinition processDefinition = graphSession
.findLatestProcessDefinition(processDefinitionName);
ProcessInstance processInstance = new ProcessInstance(
processDefinition);
// 设置流程发起人
processInstance.getContextInstance().setVariable(
VariableKey.PROCESS_STARTER.name(), username);
/*
* TaskInstance taskInstance = (TaskInstance) processInstance
* .getTaskMgmtInstance().getTaskInstances().iterator() .next();
* taskInstance.setActorId(username);
*/
// taskInstance.setVariable(VariableKey.PROCESS_STARTER.name(),
// username);
// taskInstance.end();
// Save the process instance along with the task instance
jbpmContext.save(processInstance);
return processInstance.getId();
}
});
}
/**
* 根据流程实例结束掉这个实例中所有未完成的任务
*
* @param processInsanceId
*/
@Transactional
public void endUnfinishedTasksByProcessInstanceId(
final Long processInstanceId) {
jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
TaskMgmtInstance tmi = jbpmContext.loadProcessInstance(
processInstanceId).getTaskMgmtInstance();
Collection<TaskInstance> taskInstanceCollection = tmi
.getTaskInstances();
for (TaskInstance taskInstance : taskInstanceCollection) {
// 如果任务实例没有结束就结束掉该任务
if (!taskInstance.hasEnded()) {
taskInstance.end();
jbpmContext.save(taskInstance);
}
}
return null;
}
});
}
/**
* 得到流程发起者的所有流程实例
*
* @param processStarter
* @return
*/
@Transactional
public List getProcessInstances(String processStarter,
String processDefinitionName, Boolean hasEnded) {
String hql = "FROM StringInstance WHERE name = ? AND value = ? "
+ "AND processInstance.processDefinition.name = ? ";
if (hasEnded != null) {
if (hasEnded)
hql = hql + "AND processInstance.end IS NOT NULL ";
else
hql = hql + "AND processInstance.end IS NULL ";
}
List list = jbpmObjectUtilsDao.find(hql, new Object[] {
VariableKey.PROCESS_STARTER.name(), processStarter,
processDefinitionName });
List processInstances = new ArrayList();
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
StringInstance si = (StringInstance) iterator.next();
processInstances.add(this.getProcessInstance(si
.getProcessInstance().getId()));
}
return processInstances;
}
}