package com.oa.jbpm.handler;
import java.util.Iterator;
import java.util.Set;
import org.hibernate.Session;
import org.jbpm.graph.exe.Token;
public class JbpmUtil {
public static Object getNodeType(Session session, long nodeId) {
String sql = "SELECT CLASS_ FROM JBPM_NODE where ID_=?";
Object result = session.createSQLQuery(sql).setParameter(0, nodeId).uniqueResult();
return result;
}
/**
* 递归获取Token中子TOKEN所在节点的名称
*
* @param parenToken
* @param set
* @return
*/
public static Set getCurrentNodeNames(Token parenToken, Set set) {
Iterator<Token> it = parenToken.getChildren().values().iterator();
while (it.hasNext()) {
Token currentToken = it.next();
// 如果还有活动的子节点,说明还未全到达Join节点,需要对所有的节点的所在节点进行记录
if (currentToken.hasActiveChildren()) {
getCurrentNodeNames(currentToken, set);
} else if (!currentToken.hasEnded()) {
set.add(currentToken.getNode().getName());
}
}
return set;
}
public static Set getChildToken(Token parentToken) {
Iterator<Token> it = parentToken.getChildren().values().iterator();
return null;
}
public static String getTokenName(Token parent, String transitionName) {
String tokenName = null;
if (transitionName != null) {
if (!parent.hasChild(transitionName)) {
tokenName = transitionName;
} else {
int i = 2;
tokenName = transitionName + Integer.toString(i);
while (parent.hasChild(tokenName)) {
i++;
tokenName = transitionName + Integer.toString(i);
}
}
} else { // no transition name
int size = (parent.getChildren() != null ? parent.getChildren().size() + 1 : 1);
tokenName = Integer.toString(size);
}
return tokenName;
}
public static void rollbackFork(long currentToken,long processInstance,String nodeName,Session session,long nodeId) {
//将所有任务实例设置成完成状态 0 当今currentToken的ID
String sql1 = "UPDATE jbpm_taskinstance SET END_ = NOW() ,ISOPEN_=0,ISSIGNALLING_=0 where TOKEN_ in ( SELECT a.ID_ FROM jbpm_token a, jbpm_token b WHERE a.PARENT_ = b.PARENT_ AND b.ID_ = ? ) and ISNULL(END_)";
//激活fork 节点 1 流程实例ID 2 当前fork节点的名字
String sql2="UPDATE jbpm_taskinstance SET END_=NULL,ISOPEN_=1,ISSIGNALLING_=1 where PROCINST_=? AND NAME_=?";
//1 修改token执行 fork上面的节点ID 2 currentToken 的ID
String sql3="UPDATE jbpm_token a INNER JOIN jbpm_token b SET a.NODE_=? WHERE a.PARENT_=b.PARENT_ and b.ID_=?" ;
// session.beginTransaction();
session.createSQLQuery(sql1).setParameter(0, currentToken).executeUpdate();
// session.createSQLQuery(sql2).setParameter(0, processInstance).setParameter(1, nodeName).executeUpdate();
session.createSQLQuery(sql3).setParameter(0, nodeId).setParameter(1, currentToken).executeUpdate();
// session.getTransaction().commit();
}
}