jeesite的activite流程读取xml

package com.thinkgem.jeesite.modules.act.utils;


import java.io.InputStream;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;


import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;


import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


import com.google.common.collect.Lists;
import com.thinkgem.jeesite.common.utils.SpringContextHolder;
import com.thinkgem.jeesite.common.utils.StringUtils;
import com.thinkgem.jeesite.modules.act.dao.ActDao;
import com.thinkgem.jeesite.modules.sys.dao.RoleDao;
import com.thinkgem.jeesite.modules.sys.entity.User;
import com.thinkgem.jeesite.modules.sys.utils.UserUtils;


public class ReadXML {

private static RoleDao roleDao = SpringContextHolder.getBean(RoleDao.class);
private static ActDao actDao = SpringContextHolder.getBean(ActDao.class);
public static final int FLOW_PASS = 6;

public List<NextNoteInfo> findNextNodes(InputStream resourceAsStream, String nodeId, String procInsId) {
Element element = null;
// 可以使用绝对路劲
//File f = new File("NewFile.xml");
// documentBuilder为抽象不能直接实例化(将XML文件转换为DOM文件)
DocumentBuilder db = null;
DocumentBuilderFactory dbf = null;
List<NextNoteInfo> list = Lists.newArrayList();
try {
// 返回documentBuilderFactory对象
dbf = DocumentBuilderFactory.newInstance();
// 返回db对象用documentBuilderFatory对象获得返回documentBuildr对象
db = dbf.newDocumentBuilder();
// 得到一个DOM并返回给document对象
//Document dt = db.parse(f);
Document dt = db.parse(resourceAsStream);
// 得到一个elment根元素
element = dt.getDocumentElement();
// 获得根元素下的子节点
NodeList childNodes = element.getChildNodes();
// 获得每个对应位置i的结点
Node childnode = childNodes.item(1);
// 获得根元素下的孫子节点
NodeList childchildNodes = childnode.getChildNodes();
// 递归
recursionFindNextNodes(childchildNodes, list, nodeId, procInsId);
//根据Collections.sort重载方法来实现List排序
Collections.sort(list,new Comparator<NextNoteInfo>(){  
@Override  
public int compare(NextNoteInfo nextNotesInfo1, NextNoteInfo nextNotesInfo2) {  
return nextNotesInfo1.getSequenceFlowPass().compareTo(nextNotesInfo2.getSequenceFlowPass());  
}  

}); 
} catch (Exception e) {
e.printStackTrace();
}
return list;
}

/**
* 递归
* @param childchildNodes
* @param nextNodeIdList
* @param nodeId
*/
public void recursionFindNextNodes(NodeList childchildNodes, List<NextNoteInfo> list, String nodeId, String procInsId){
for (int i = 1; i < childchildNodes.getLength(); i=i+2) {
Element childchildnode = (Element)childchildNodes.item(i);
String childchildNodeSourceRef = childchildnode.getAttribute("sourceRef");
if(nodeId.equals(childchildNodeSourceRef)){//查找哪个箭头的起始点sourceRef是当前任务节点id
String childchildNodeTargetRef = childchildnode.getAttribute("targetRef");
for (int j = 1; j < childchildNodes.getLength(); j=j+2) {
Element childchildnode1 = (Element)childchildNodes.item(j);
String childchildNodeId1 = childchildnode1.getAttribute("id");
String childchildNodeAttrName1 = childchildnode1.getAttribute("name");
String assignee = childchildnode1.getAttribute("activiti:assignee");
String candidateGroups = childchildnode1.getAttribute("activiti:candidateGroups");
String candidateUsers = childchildnode1.getAttribute("activiti:candidateUsers");
if(childchildNodeId1.equals(childchildNodeTargetRef)){//查找箭头的终止点targetRef所指向的节点(不一定是任务节点)
String childchildNodeName1 = childchildnode1.getNodeName();
if("userTask".equals(childchildNodeName1)||"endEvent".equals(childchildNodeName1)){//如果箭头的终止点targetRef所指向的节点是任务节点userTask或结束节点endEvent,表示已找到下个任务节点
String childchildNodeAttrName = childchildnode.getAttribute("name");//箭头名称
NextNoteInfo nextNoteInfo = new NextNoteInfo();
nextNoteInfo.setNoteId(childchildNodeId1);//下一节点id
nextNoteInfo.setSequenceFlowName(childchildNodeAttrName+"至—"+childchildNodeAttrName1);//箭头名称+指向任务节点名字
NodeList child3Nodes = childchildnode.getChildNodes();//获取箭头节点的子节点
if(child3Nodes.getLength()==0){//表示没有子节点
nextNoteInfo.setSequenceFlowPass("empty");//箭头判断条件
}else{
for (int k = 1; k < child3Nodes.getLength(); k=k+2) {
Element child3node = (Element)child3Nodes.item(k);
String child3NodeXsi_Type = child3node.getAttribute("xsi:type");
if("tFormalExpression".equals(child3NodeXsi_Type)){
String child3NodeTextContent = child3node.getTextContent();//箭头判断条件
nextNoteInfo.setSequenceFlowPass(child3NodeTextContent.substring(8, 9));//箭头判断条件,如pass==1,就是“1”
break;
}
}
}
List<UserLoginNameAndName> userList = Lists.newArrayList();
String historyAssignee = "";
if(StringUtils.isNotBlank(procInsId)){
historyAssignee = actDao.findHistoryAssignee(procInsId, childchildNodeId1);
}
Boolean notAssignee = true;
if(StringUtils.isNotBlank(assignee)){//assignee配置了登录名
notAssignee = false;
UserLoginNameAndName userLoginNameAndName = new UserLoginNameAndName();
userLoginNameAndName.setLoginName(assignee);
if("${apply}".equals(assignee)){
userLoginNameAndName.setName("申请人");
userLoginNameAndName.setIsGoBack("true");
}else{
userLoginNameAndName.setName(UserUtils.getByLoginName(assignee).getName());
if(StringUtils.isNotBlank(historyAssignee)&&!"empty".equals(nextNoteInfo.getSequenceFlowPass())&&Integer.parseInt(nextNoteInfo.getSequenceFlowPass())>FLOW_PASS){
userLoginNameAndName.setIsGoBack("true");
}
}
userList.add(userLoginNameAndName);
}else {
if(StringUtils.isNotBlank(historyAssignee)&&!"empty".equals(nextNoteInfo.getSequenceFlowPass())&&Integer.parseInt(nextNoteInfo.getSequenceFlowPass())>FLOW_PASS){
notAssignee = false;
UserLoginNameAndName userLoginNameAndName = new UserLoginNameAndName();
userLoginNameAndName.setLoginName(historyAssignee);
userLoginNameAndName.setName(UserUtils.getByLoginName(historyAssignee).getName());
userLoginNameAndName.setIsGoBack("true");
userList.add(userLoginNameAndName);
}else{
if(StringUtils.isNotBlank(candidateGroups)){//下一节点candidateGroups
notAssignee = false;
String []roleEnnameArr = candidateGroups.split(",");
if(roleEnnameArr.length==1){
for(String roleEnname:roleEnnameArr){
List<String> userIdlist = roleDao.findRoleId(roleEnname);
for(String userId:userIdlist){
User user = UserUtils.get(userId);
UserLoginNameAndName userLoginNameAndName = new UserLoginNameAndName();
userLoginNameAndName.setLoginName(user.getLoginName());
userLoginNameAndName.setName(user.getName());
userList.add(userLoginNameAndName);

}
}
}else{
List<String> userIdAllList = Lists.newArrayList();
for(String roleEnname:roleEnnameArr){
List<String> userIdlist = roleDao.findRoleId(roleEnname);
for(String userId:userIdlist){
userIdAllList.add(userId);
}
}
HashSet hashSet= new HashSet(userIdAllList); 
userIdAllList.clear(); 
userIdAllList.addAll(hashSet); 
for(String userId:userIdAllList){
User user = UserUtils.get(userId);
UserLoginNameAndName userLoginNameAndName = new UserLoginNameAndName();
userLoginNameAndName.setLoginName(user.getLoginName());
userLoginNameAndName.setName(user.getName());
userList.add(userLoginNameAndName);
}
}
}
if(StringUtils.isNotBlank(candidateUsers)){
notAssignee = false;
String []loginNameArr = candidateUsers.split(",");
for(String loginName:loginNameArr){
Boolean isSame = false;
for(UserLoginNameAndName userLoginNameAndName:userList){
if(loginName.equals(userLoginNameAndName.getLoginName())){
isSame = true;
break;
}
}
if(!isSame){
User user = UserUtils.getByLoginName(loginName);
UserLoginNameAndName userLoginNameAndName = new UserLoginNameAndName();
userLoginNameAndName.setLoginName(loginName);
userLoginNameAndName.setName(user.getName());
userList.add(userLoginNameAndName);
}
}
}
}
}
if(notAssignee){//获取上级
User immediatesuperior1 =UserUtils.getUser().getImmediatesuperior();
User immediatesuperior =UserUtils.get(immediatesuperior1.getId());
if(immediatesuperior!=null){
UserLoginNameAndName userLoginNameAndName = new UserLoginNameAndName();
userLoginNameAndName.setLoginName(immediatesuperior.getLoginName());
userLoginNameAndName.setName(immediatesuperior.getName());
userList.add(userLoginNameAndName);
}
}
nextNoteInfo.setUserList(userList);//下一任务节点的参与者信息
list.add(nextNoteInfo);
}else{
recursionFindNextNodes(childchildNodes, list, childchildNodeId1, procInsId);//递归查找下一环节
}
break;
}
}
}
}
}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值