`
JadeLuo
  • 浏览: 426265 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

DOM 对Jbpm jdpl.xml文件的解析

阅读更多
package com.huike.leave.service.util;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

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

import org.jbpm.api.Configuration;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;
import org.jbpm.api.task.Task;
import org.jbpm.pvm.internal.model.Activity;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class ParseXmlFile {

DocumentBuilderFactory documentBuilderFactory = null;
DocumentBuilder documentBuilder = null;
Document doc = null;
InputStream inputStream = null;
Element rootElement = null;
NodeList childNodes = null;
Node childNodes_item = null;
List<Node> first_layer_child_node_AsList = new ArrayList<Node>();

StringBuffer all_untreated_nodeNames_As_StringBuffer = new StringBuffer();
String[] nodeTypeNameAsArray = null;

List<String> first_layer_child_node_name_property_AsList = new ArrayList<String>();
List<String> first_layer_child_node_g_property_AsList = new ArrayList<String>();
List<String> first_layer_child_node_to_property_AsList = new ArrayList<String>();

List<String> transition_to_AsLsit = new ArrayList<String>();
List<String> transition_name_AsLsit = new ArrayList<String>();
Map<String,List<String>> transition_containt_to_name = new HashMap<String,List<String>>();

List<String> task_assignee_AsList = new ArrayList<String>();
List<String> decision_expr_AsList = new ArrayList<String>();
List<String> end_state_AsList = new ArrayList<String>();

String key = null;


/**
* 设计存放jpdl.xml文件中各节点信息及其对应关系的集合
* @throws ParserConfigurationException
* @throws SAXException
*/

List<Map<String,String>> process = new ArrayList<Map<String,String>>();

Map<String,Map<String,String>> process_task = new HashMap<String,Map<String,String>>();
Map<String,String> task = new HashMap<String,String>();
Map<String,String> decision = new HashMap<String,String>();

Map<String,String> transition = new HashMap<String,String>();
Map<String,String> transition_to = new HashMap<String,String>();


public ParseXmlFile(){
// this.ParseXmlFile();
}
/**
* 创建DocumentBuilderFactory(文档构建工厂)实例, 用于创建设DocumentBuilder(文档构建对象)
*/
public  ParseXmlFile(String filePath) throws ParserConfigurationException, SAXException {
documentBuilderFactory = DocumentBuilderFactory.newInstance();
try {
documentBuilder = documentBuilderFactory.newDocumentBuilder();
} catch (ParserConfigurationException e1) {
e1.printStackTrace();
}
/**
* 获取要解析的jpdl.xml文件的输入流对象
*/
try {
inputStream = new FileInputStream(filePath);
} catch (FileNotFoundException e) {
new Exception("jpdl.xml file not found!");
e.printStackTrace();
}

/**
* 利用DocumentBuilder(文档构建对象)从jpdl.xml文件中解析出Document(文档对象)
*/
try {
doc = documentBuilder.parse(inputStream);
} catch (IOException e) {
new Exception("parse xml error!");
e.printStackTrace();
}
}

/**
* 获取根节点
* @return
* @throws SAXException
*/
public Element getRootElement() throws SAXException {
rootElement = doc.getDocumentElement();
if (rootElement.getAttribute("name") != null) {
key = rootElement.getAttribute("name");
System.out.println("<process name=\" "
+ rootElement.getAttribute("name")
+ "\" xmlns=\"http://jbpm.org/4.0/jpdl\">"); // 输出流程定义的key值
}
return rootElement;
}

/**
* 生成一个存放process节点下的第一层所有子节点的节点名的字符串数组 遍历所有节点
* ,并把各个节点的类型保存到一个数组中,方法其它方法调用(仅作测试用)
*
* @return String[] strArray 各个节点的类型,不包括根节点(process),一般是从start
*         开始,也可能从on开始
*/

/**
* 获取根元素下的子节点
*/
public String[] getChildNodesNameAsStringArray(Element rootElement) {

childNodes = rootElement.getChildNodes();

if (childNodes != null) {
for (int i = 0; i < childNodes.getLength(); i++) {
childNodes_item = childNodes.item(i);

first_layer_child_node_AsList.add(childNodes_item);

all_untreated_nodeNames_As_StringBuffer.append(childNodes_item
.getNodeName()); // 每遍历出一个节点类型名则附加到一起,因为此时遍历出的类型名包含了#text.....

// 进入第一层节点的处理,如start task decision end
if (childNodes_item.getNodeType() == Node.ELEMENT_NODE) {

}
}
nodeTypeNameAsArray = all_untreated_nodeNames_As_StringBuffer
.toString().split("#text");// 分离出含#text的类型名,并存入一个字符串数组
}
return nodeTypeNameAsArray;
}

/**
* 获取指定节点的属性值
*
* @return nodePropertyMap
* @param String
*            nodeName
* @param Element
*            rootElement
*/
public Map<String, String> getNodePropertyAsMap(String nodeName,
Element rootElement) {
Map<String, String> map = new HashMap<String, String>();

childNodes = rootElement.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
childNodes_item = childNodes.item(i);
String currentNodeName = null;
if(i%2 != 0)
{
currentNodeName = childNodes_item.getNodeName();
System.out.println(childNodes_item.getNodeName());
}
// currentNodeName = childNodes_item.getNodeName().split("#text")[0];
// System.out.println("currentNodeName" + i + currentNodeName);

if (childNodes_item.getNodeType() == Node.ELEMENT_NODE) {
if (currentNodeName.equals(nodeName)) {

// 获取start task decision 和节点name属性值
if (childNodes_item.getAttributes().getNamedItem("name") != null) {
first_layer_child_node_name_property_AsList
.add(childNodes_item.getAttributes()
.getNamedItem("name").getNodeValue());
System.out.println(" childNodes_item name = "
+ childNodes_item.getAttributes()
.getNamedItem("name").getNodeValue());
map.put("name", childNodes_item.getAttributes()
.getNamedItem("name").getNodeValue());
}

// 获取start task decision 和节点to属性值
if (childNodes_item.getAttributes().getNamedItem("to") != null) {
first_layer_child_node_to_property_AsList
.add(childNodes_item.getAttributes()
.getNamedItem("to").getNodeValue());
System.out.println(" childNodes_item to = "
+ childNodes_item.getAttributes()
.getNamedItem("to").getNodeValue());
map.put("to", childNodes_item.getAttributes()
.getNamedItem("to").getNodeValue());
}

// 获取task节点assignee属性值
if (childNodes_item.getAttributes()
.getNamedItem("assignee") != null) {
task_assignee_AsList.add(childNodes_item
.getAttributes().getNamedItem("assignee")
.getNodeValue());
System.out.println(" task_assignee_AsList assignee = "
+ childNodes_item.getAttributes()
.getNamedItem("assignee")
.getNodeValue());
map.put("assignee", childNodes_item.getAttributes()
.getNamedItem("assignee").getNodeValue());
}

// 获取decision节点expr属性值
if (childNodes_item.getAttributes().getNamedItem("expr") != null) {
decision_expr_AsList.add(childNodes_item
.getAttributes()
.getNamedItem("expr")
.getNodeValue()
.substring(
2,
childNodes_item.getAttributes()
.getNamedItem("expr")
.getNodeValue().length() - 1));
System.out.println(" decision_expr_AsList expr= "
+ childNodes_item
.getAttributes()
.getNamedItem("expr")
.getNodeValue()
.substring(
2,
childNodes_item.getAttributes()
.getNamedItem("expr")
.getNodeValue()
.length() - 1));
map.put("expr", childNodes_item.getAttributes()
.getNamedItem("expr").getNodeValue());

}
// 获取end节点state属性值
if (childNodes_item.getAttributes().getNamedItem("state") != null) {
end_state_AsList.add(childNodes_item
.getAttributes()
.getNamedItem("state")
.getNodeValue()
.substring(
2,
childNodes_item.getAttributes()
.getNamedItem("state")
.getNodeValue().length() - 1));
System.out.println(" end_state_AsList state= "
+ childNodes_item
.getAttributes()
.getNamedItem("state")
.getNodeValue()
.substring(
2,
childNodes_item.getAttributes()
.getNamedItem("state")
.getNodeValue()
.length() - 1));
}

// 获取 transition
// 节点的属性,从childNodes_item节点的第一个子节点开始,遍历其兄弟节点(Sibling),并取其to属性和name属性的值
for (Node node = childNodes_item.getFirstChild(); node != null; node = node
.getNextSibling()) {
if (node.getNodeType() == Node.ELEMENT_NODE) {
if (node.getNodeName().equals("transition")) {
// 获取 transition 节点的to属性的值
String transition_to = node.getAttributes()
.getNamedItem("to").getNodeValue();
transition_to_AsLsit.add(transition_to);

// 获取 transition 节点的name属性的值
String transition_name = node.getAttributes()
.getNamedItem("name").getNodeValue();
transition_name_AsLsit.add(transition_name);
}
}
transition_containt_to_name.put("to",
transition_to_AsLsit);
transition_containt_to_name.put("name",
transition_name_AsLsit);
}
}
}
}
return map;
}

public static void main(String args[]) throws ParserConfigurationException, SAXException{
// new ParseXmlFile("build/classes/com/huike/leave/service/Order.jpdl.xml");
ParseXmlFile pxf = new ParseXmlFile("build/classes/com/huike/leave/service/Order.jpdl.xml");
// pxf.getNodePropertyAsMap("start", pxf.getRootElement());
// pxf.getNodePropertyAsMap("task", pxf.getRootElement());

}


// public void parseXmlFile() throws ParserConfigurationException, SAXException {
// ProcessEngine processEngine = new Configuration().buildProcessEngine();
// RepositoryService repositoryService = processEngine
// .getRepositoryService();
// ExecutionService executionService = processEngine.getExecutionService();
// TaskService taskService = processEngine.getTaskService();
//
// /**
// * 发布流程定义:获得流程定义deploymentId
// */
// String deploymentId = repositoryService
// .createDeployment()
// .addResourceFromClasspath(
// "com/huike/leave/service/Order.jpdl.xml").deploy();
//
// /**
// * 获得流程定义的ID
// */
// String id = repositoryService.createProcessDefinitionQuery()
// .deploymentId(deploymentId).uniqueResult().getId();
//
// /**
// * 获取jpdl.xml文件中process节点的name属性的值,即得到该流程的key,通过该key即可启动新流程
// * 注:但此方法对于开始之后执行任务的中要求动态分配所有者时,在启动时无法确定分配人的key,
// * 即不能确定要传的Map对象,如不传则无法启动成功 if(task_assignee_AsList.size()!=0)
// * System.out.println(task_assignee_AsList.get(0).substring(2,
// * task_assignee_AsList.get(0).length()-1));
// *
// * String owner = task_assignee_AsList.get(0).substring(2,
// * task_assignee_AsList.get(0).length()-1);
// *
// * Map<String,Object> map = new HashMap<String,Object>(); map.put(owner,
// * "testOwner"); ProcessInstance processInstance =
// * executionService.startProcessInstanceByKey(key,map);
// */
//
// /**
// * 启动流程实例(注:在jpdl.xml文件中,如果任务要求动态绑定所有者,则不能根据id直接启动流程实例
// */
// if (task_assignee_AsList.size() != 0)
// System.out.println(task_assignee_AsList.get(0).substring(2,
// task_assignee_AsList.get(0).length() - 1));
//
// String assignee = task_assignee_AsList.get(0).substring(2,
// task_assignee_AsList.get(0).length() - 1);
//
// /**
// * 获取
// */
// String decider = "manager";
// String decision_transition_name = "是";
// String true_or_no = decision_transition_name;
//
// Map<String, Object> map = new HashMap<String, Object>();
// map.put(assignee, "testOwner");
// map.put("time", new Date());
// map.put("leaveDay", 5);
// map.put("content", "test");
// map.put("position", "经理");
//
// map.put(decider, true_or_no);
// // map.put("manager", "是");
// // map.put("position", "普通员工");
// // map.put("manager", "否");
//
// ProcessInstance processInstance = executionService
// .startProcessInstanceByKey(key, map);
// List<Task> taskList = taskService.findPersonalTasks((String) map
// .get(assignee));
//
// if (taskList.size() > 0) {
// Task task = taskList.get(0);
// taskService.setVariables(task.getId(), map);
// taskService.completeTask(task.getId());
// System.out.println("申请任务完成,流程根据判断转到经理审核或老板审批");
// } else
// new Exception("apply error!");
//
// /**
// * 获取jbpm中各节点的类型
// */
// ExecutionImpl executionImpl = (ExecutionImpl) processInstance;
// ProcessDefinitionImpl processDefinitionImpl = executionImpl
// .getProcessDefinition();
// Map<String, Activity> activitiesMap = processDefinitionImpl
// .getActivitiesMap();
// Set<String> activitiesKeySet = activitiesMap.keySet();
//
// for (String str : activitiesKeySet) {
// System.out.println(activitiesMap.get(str).getType()
// + activitiesMap.get(str).getParent()
// + activitiesMap.get(str).getName());
// }
// }
}
分享到:
评论

相关推荐

    根据jbpm4的.jpdl.xml流程定义文件,绘制出流程图

    本篇我们将聚焦于Jbpm4中的流程定义文件——jpdl.xml,以及如何根据该文件绘制出对应的流程图。 首先,我们要理解什么是JPDL(Jbpm Process Definition Language)。JPDL是一种基于XML的语言,用于描述Jbpm中的业务...

    jbpm jbpm4.3.jar

    jbpm jbpm4.3.jar DDDDDDDD

    JBPM采购申请系统——05_构建JBPM数据库.7z

    JBPM采购申请系统——05_构建JBPM数据库.7z JBPM采购申请系统——05_构建JBPM数据库.7z JBPM采购申请系统——05_构建JBPM数据库.7z JBPM采购申请系统——05_构建JBPM数据库.7z JBPM采购申请系统——05_构建JBPM...

    解决jbpm中gpd.xml的中文乱码

    7. **ui.jar解析**:ui.jar可能是jbpm工作台的UI组件库,其中可能包含了对gpd.xml的解析逻辑。确保该库在处理XML时考虑到了中文字符的编码问题。 通过以上这些步骤,通常可以解决jbpm中gpd.xml的中文乱码问题。在...

    jbpm的eclipse的流程设计器插件designer中的gpd.xml文件乱码问题

    然而,有时在使用Eclipse Designer时,可能会遇到gpd.xml文件显示乱码的问题,这可能对流程图的正确理解和编辑造成困扰。 当gpd.xml文件出现乱码,通常是因为编码设置不正确或者文件在不同编码环境下被读取或写入...

    将Spring与JBPM集成.txt

    这里`jbpm.cfg.xml`是一个包含JBPM配置的文件,如数据库连接、工作流资源位置等信息。 3. **加载和部署流程定义**:使用`JbpmConfiguration`实例来创建一个`JbpmContext`对象,然后通过这个上下文对象部署流程定义...

    spring-modules-jbpm31.jar

    spring-modules-jbpm31.jar

    jbpm4.rar_jbpm_jbpm designer_jbpm4

    在jBPM 4中,设计的流程模型可以被编译为XML格式的流程定义文件(*.bpmn或*.bpmn20.xml),这些文件随后可以被jBPM引擎执行。引擎负责解析流程定义,管理和执行流程实例,监控流程状态,并处理流程中的事件和任务。...

    jBPM4.x使用前的准备工作

    jbPM4.x不仅支持传统的XML流程定义,还引入了基于Java的流程定义,使得流程的编写更加直观和灵活。 总之,深入了解jbPM的核心组件、配置合适的开发环境、学习如何设计和部署流程,是成功运用jbPM4.x的前提。通过...

    jbpm3.2 .jar

    这个库文件包含了处理和解析JPDL文件所需的类和方法,使得开发者能够以声明式的方式设计复杂的流程模型。 mail文件夹可能包含了与发送电子邮件相关的类和配置,这在jbpm中可能是用来实现流程中自动发送通知或确认...

    jbpm4.3-src.zip

    1. jbpm.execution.hbm.xml:这个文件包含了jbpm执行层的Hibernate映射配置。Hibernate是一个流行的Java ORM框架,用于将Java对象与关系数据库进行映射。在这个文件中,你可以看到jbpm如何将执行时的对象,如任务...

    jbpm3.2.x开发所需jar包

    JPDL是Jbpm使用的XML格式,用于描述业务流程的结构和行为。 2. **jbpm-persistence.jar**:此jar包处理Jbpm流程实例的持久化,支持多种数据库,如MySQL、Oracle等。它提供了与Hibernate的集成,使得流程实例数据...

    spring-modules-jbpm30.jar

    spring-modules-jbpm30.jar spring-modules-jbpm30.jar

    JBPM整合项目.doc

    同时,需要修改hibernate.cfg.xml文件,以包含JBPM工作流的映射文件,比如jbpm.repository.hbm.xml、jbpm.execution.hbm.xml等,这使得系统能够识别并处理JBPM的工作流数据。 生成JBPM的数据库表是整合过程中的一个...

    JBPM数据库表创建\jbpm.jpdl.oracle.sql

    JBPM数据库表创建\jbpm.jpdl.oracle.sqlJBPM数据库表创建\jbpm.jpdl.oracle.sqlJBPM数据库表创建\jbpm.jpdl.oracle.sqlJBPM数据库表创建\jbpm.jpdl.oracle.sqlJBPM数据库表创建\jbpm.jpdl.oracle.sql

    jbpm-4.4.zip part03

    【jbpm-4.4.zip part03】这个压缩文件是关于jbpm 4.4版本的组成部分,jbpm(Java Business Process Management)是一个开源的工作流管理系统,它提供了业务流程建模、部署、执行和监控的功能。jbpm 4.4是该系统的一...

    jbpm.mysql.create.sql

    jbpm.mysql.create.sql jbpm mysql建表语句

    jbpm学习笔记.docx

    - 用户可以创建自己的jbpm.xml文件,用于定义和管理流程实例,这通常涉及到定义工作流的各个步骤、任务分配规则和流程变量等。 通过以上步骤,读者可以逐步理解并实践jbpm的使用,从流程设计、数据库配置到开发...

    jbpm例子.doc

    - `jbpm.cfg.xml`: jBPM配置文件,采用默认配置,可查看并自定义配置细节。 - `log4j.properties`: log4j的日志配置文件,用于日志记录。 - `SimpleProcessTest.java`: 单元测试代码,针对`processdefinition.xml...

Global site tag (gtag.js) - Google Analytics