JBPM封装类

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;
 }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值