package com.oa.extend;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.annotation.Resource;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.def.Transition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.taskmgmt.exe.TaskInstance;
import org.springframework.stereotype.Component;
import org.springmodules.workflow.jbpm31.JbpmTemplate;
import com.oa.model.Document;
import com.oa.model.DocumentProperty;
import com.oa.util.Constant;
@Component("jbpmCore")
public class JbpmCoreImp implements JbpmCore {
private JbpmTemplate jbpmTemplate;
/*
* (non-Javadoc)
*
* @see com.oa.extend.JbpmCore#addProcessInstance(java.lang.String,
* com.oa.model.Document)
*/
public long addProcessInstance(String processName, Document document, List<DocumentProperty> props) {
System.out.println("addprocessinstance 流成名字" + processName);
JbpmContext context = getJbpmContext();
ProcessDefinition def = context.getGraphSession().findLatestProcessDefinition(processName);
System.out.println(def + "sfsdfsd");
ProcessInstance instance = new ProcessInstance(def);
instance.getContextInstance().setVariable("document", document.getId());
// 将公文标题也提交到流程实例变量中,以便在E-Mail中能够提示这个公文的名称
instance.getContextInstance().setVariable("docTitle", document.getTitle());
// 将公文的相关属性设置进入流程实例变量 ============================没有出去空的选项
if (props != null) {
for (DocumentProperty property : props) {
if (property!=null&&!property.isNull()) {
String propertyname = property.getPropertyName();
Object value = property.getValue();
instance.getContextInstance().setVariable(propertyname, value);
}
}
}
// Set props=document
// Map props = document.getProperties();
// if(props != null){
// Set entries = props.entrySet();
// for (Iterator iterator = entries.iterator(); iterator.hasNext();) {
// Map.Entry entry = (Map.Entry) iterator.next();
// String propertyName = (String)entry.getKey();
// Object obj = document.getProperty(propertyName);
// //将变量放入流程实例变量
// instance.getContextInstance().setVariable(propertyName, obj);
// }
// }
context.save(instance);
context.close();
return instance.getId();
}
/*
* (non-Javadoc)
*
* @see com.oa.extend.JbpmCore#delProcessDefinition(java.lang.String)
*/
public void delProcessDefinition(String processName) {
JbpmContext context = getJbpmContext();
List defs = context.getGraphSession().findAllProcessDefinitionVersions(processName);
for (Iterator iterator = defs.iterator(); iterator.hasNext();) {
ProcessDefinition def = (ProcessDefinition) iterator.next();
context.getGraphSession().deleteProcessDefinition(def);
}
context.close();
}
/*
* (non-Javadoc)
*
* @see com.oa.extend.JbpmCore#delProcessInstance(long)
*/
public void delProcessInstance(long processInstanceId) {
JbpmContext context = getJbpmContext();
context.getGraphSession().deleteProcessInstance(processInstanceId);
context.close();
}
/*
* (non-Javadoc)
*
* @see com.oa.extend.JbpmCore#deployProcessDefinition(byte[])
*/
public String deployProcessDefinition(byte[] processDef) {
JbpmContext context = getJbpmContext();
ProcessDefinition def = ProcessDefinition.parseXmlInputStream(new ByteArrayInputStream(processDef));
context.deployProcessDefinition(def);
context.close();
return def.getName();
}
public String deployProcessDefinition(String processdefintion) throws FileNotFoundException {
System.err.println("jbpmCoreImp");
JbpmContext context = getJbpmContext();
ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(new FileInputStream(new File(processdefintion)));
if (context == null) {
System.out.println(" context is null");
}
context.deployProcessDefinition(processDefinition);
String name = processDefinition.getName();
context.close();
return name;
}
/*
* (non-Javadoc)
*
* @see com.oa.extend.JbpmCore#nextStep(long, java.lang.String,
* java.lang.String)
*/
public String nextStep(long processInstanceId, String actorId, String transitionName) {
JbpmContext context = getJbpmContext();
ProcessInstance instance = context.getProcessInstance(processInstanceId);
// instance.getContextInstance().setVariable("currentNode", instance.getRootToken().getNode().getName());
// 当前节点
String currentNodeName = instance.getRootToken().getNode().getName();
// instance.getRootToken().getActiveChildren().values().iterator().next();
// 起点的名称
String startNodeName = instance.getProcessDefinition().getStartState().getName();
// 如果是在起点
if (startNodeName.equals(currentNodeName)) {
if (transitionName == null) {
instance.signal();
} else {
instance.signal(transitionName);
}
} else {
List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
for (Iterator iterator = taskInstances.iterator(); iterator.hasNext();) {
TaskInstance ti = (TaskInstance) iterator.next();
if (ti.getProcessInstance().getId() == processInstanceId) {
if (transitionName == null) {
ti.end();
} else {
if(transitionName.matches(Constant.rollbackRegex)){
Collection<TaskInstance> taskinstances = ti.getTaskMgmtInstance().getUnfinishedTasks(ti.getToken());
for (TaskInstance taskInstance : taskinstances) {
taskInstance.end(transitionName);
}
}else {
ti.end(transitionName);
}
/* if (transitionName.equals("回退")) {
Collection<TaskInstance> taskinstances = ti.getTaskMgmtInstance().getUnfinishedTasks(ti.getToken());
for (TaskInstance taskInstance : taskinstances) {
taskInstance.end("回退");
}
} else {
ti.end(transitionName);
}*/
}
break;
}
}
// 查找所属组的任务实例
List pooledTaskInstances = context.getTaskMgmtSession().findPooledTaskInstances(actorId);
for (Iterator iterator = pooledTaskInstances.iterator(); iterator.hasNext();) {
TaskInstance ti = (TaskInstance) iterator.next();
if (ti.getProcessInstance().getId() == processInstanceId) {
if (transitionName == null) {
ti.end();
} else {
ti.end(transitionName);
}
break;
}
}
}
String name = instance.getRootToken().getNode().getName();
// 返回转向之后的节点名称
context.close();
return name;
}
// 回退
/*
* (non-Javadoc)
*
* @see com.oa.extend.JbpmCore#backStep(long, java.lang.String)
*/
public Object[] backStep(long processInstanceId, String actorId) {
JbpmContext context = getJbpmContext();
// 根据流程实例标识查找流程实例
ProcessInstance instance = context.getProcessInstance(processInstanceId);
Object[] os = new Object[2];
// 搜索用户对应的所有的任务实例
List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
for (Iterator iterator = taskInstances.iterator(); iterator.hasNext();) {
TaskInstance ti = (TaskInstance) iterator.next();
System.out.println("outter " + ti.getName());
if (ti.getProcessInstance().getId() == processInstanceId) {
System.out.println("equals+++++++++++++++++");
// 先判断是否是要回退到起点
Set set = ti.getToken().getNode().getArrivingTransitions();
// Set set = (Set)
// ti.getToken().getNode().getLeavingTransitions();
for (Iterator iterator2 = set.iterator(); iterator2.hasNext();) {
Transition t = (Transition) iterator2.next();
System.out.println("inner transition" + t.getName());
// 如果它需要回退到起点
if (t.getFrom().equals(ti.getProcessInstance().getProcessDefinition().getStartState())) {
System.out.println("inner node equals");
int docId = (Integer) ti.getProcessInstance().getContextInstance().getVariable("document");
// 结束当前的流程实例
ti.getProcessInstance().end();
// 结束当前任务实例
ti.end();
// 重新创建流程实例对象
ProcessInstance pi = new ProcessInstance(ti.getProcessInstance().getProcessDefinition());
pi.getContextInstance().setVariable("document", docId);
// 将流程实例对象重新持久化到数据库
context.save(pi);
os[0] = Document.New;
os[1] = pi.getId();
context.close();
return os;
}
}
System.out.println("===------------=====hewr");
// 如果不需要回退到起点
System.out.println("back====");
Collection<TaskInstance> taskinstances = ti.getTaskMgmtInstance().getUnfinishedTasks(ti.getToken());
for (TaskInstance taskInstance : taskinstances) {
taskInstance.end("回退");
}
// ti.end("回退");
break;
}
}
os[0] = instance.getRootToken().getNode().getName();
os[1] = processInstanceId;
context.close();
return os;
}
/*
* (non-Javadoc)
*
* @see com.oa.extend.JbpmCore#searchMyTaskList(java.lang.String)
*/
/*
* public List searchMyTaskList(String actorId) {
*
* JbpmContext context = getJbpmContext(); List docIds = new ArrayList();
* List taskInstances =
* context.getTaskMgmtSession().findTaskInstances(actorId); for (Iterator
* iterator = taskInstances.iterator(); iterator.hasNext();) { TaskInstance
* ti = (TaskInstance) iterator.next(); Object docId =
* ti.getProcessInstance().getContextInstance().getVariable("document");
* docIds.add(docId); }
*
* //查找所属组的任务实例 List pooledTaskInstances =
* context.getTaskMgmtSession().findPooledTaskInstances(actorId); for
* (Iterator iterator = pooledTaskInstances.iterator(); iterator
* .hasNext();) { TaskInstance ti = (TaskInstance) iterator.next(); Integer
* docId =
* (Integer)ti.getProcessInstance().getContextInstance().getVariable(
* "document"); System.out.println(docId+
* " jbpmCoreIMp searchMyTaskList findPooledTaskInstances");
* docIds.add(docId); } context.close(); return docIds; }
*/
public List searchMyTaskList(String actorId) {
JbpmContext context = getJbpmContext();
List docIds = new ArrayList();
List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
for (Iterator iterator = taskInstances.iterator(); iterator.hasNext();) {
TaskInstance ti = (TaskInstance) iterator.next();
Integer docId = (Integer) ti.getProcessInstance().getContextInstance().getVariable("document");
docIds.add(docId);
}
// 查找所属组的任务实例
List pooledTaskInstances = context.getTaskMgmtSession().findPooledTaskInstances(actorId);
for (Iterator iterator = pooledTaskInstances.iterator(); iterator.hasNext();) {
TaskInstance ti = (TaskInstance) iterator.next();
Integer docId = (Integer) ti.getProcessInstance().getContextInstance().getVariable("document");
docIds.add(docId);
}
context.close();
return docIds;
}
/*
* (non-Javadoc)
*
* @see com.oa.extend.JbpmCore#searchNextTransitions(long, java.lang.String)
*/
public List searchNextTransitions(long processInstanceId, String actorId) {
JbpmContext context = getJbpmContext();
ProcessInstance instance = context.getProcessInstance(processInstanceId);
System.out.println("JbpmCoreImp searchNextTransitions " + processInstanceId);
// 当前节点
String currentNodeName = instance.getRootToken().getNode().getName();
// 起点的名称
String startNodeName = instance.getProcessDefinition().getStartState().getName();
Collection transitions = null;
// 如果是在起点
if (startNodeName.equals(currentNodeName)) {
transitions = instance.getRootToken().getAvailableTransitions();
} else {
List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
for (Iterator iterator = taskInstances.iterator(); iterator.hasNext();) {
TaskInstance ti = (TaskInstance) iterator.next();
if (ti.getProcessInstance().getId() == processInstanceId) {
transitions = ti.getAvailableTransitions();
break;
}
}
// 查找所属组的任务实例
List pooledTaskInstances = context.getTaskMgmtSession().findPooledTaskInstances(actorId);
for (Iterator iterator = pooledTaskInstances.iterator(); iterator.hasNext();) {
TaskInstance ti = (TaskInstance) iterator.next();
if (ti.getProcessInstance().getId() == processInstanceId) {
transitions = ti.getAvailableTransitions();
}
}
}
List transitionNames = new ArrayList();
if (transitions != null) {
// 为了不把Transition对象直接暴露给OA系统,需要将其转换为名称列表
for (Iterator iterator = transitions.iterator(); iterator.hasNext();) {
Transition transition = (Transition) iterator.next();
transitionNames.add(transition.getName());
}
}
context.close();
return transitionNames;
}
private JbpmContext getJbpmContext() {
JbpmContext context = jbpmTemplate.getJbpmConfiguration().createJbpmContext();
return context;
}
/*
* (non-Javadoc)
*
* @see com.oa.extend.JbpmCore#getJbpmTemplate()
*/
public JbpmTemplate getJbpmTemplate() {
return jbpmTemplate;
}
/*
* (non-Javadoc)
*
* @see
* com.oa.extend.JbpmCore#setJbpmTemplate(org.springmodules.workflow.jbpm31
* .JbpmTemplate)
*/
@Resource
public void setJbpmTemplate(JbpmTemplate jbpmTemplate) {
this.jbpmTemplate = jbpmTemplate;
}
}