一、前言
现在越来越多的公司开始使用工作流,但是却因为官方界面的问题,考虑用户不会操作,要自行设计工作流的画图界面,实现客户画图,保存启动xxx审批流程的功能,诸如钉钉的审批流程种类就有不下50种,要灵活的实现客户的需求是现在我们要解决的问题,从而产生了问题就是,不用工作流的画图界面怎么生成工作流图呢?
首先我们要知道工作流图的本质是xml,本质是xml拼接,如果是简单的功能问题,我们可以利用自定义流程来实现,就是类封装的形式,本文是博主自行设计的方法,利用type,id,value等将工作流图保存为标准的工作流xml格式。然后重点是要保存为a.bpmn20.xml这样的命名方式,对后期的使用更为方便哦。
本文真实可行,近期还测试过(2018/03/23),放心舔包,最近超迷刺激战场的。。。。。哈哈
二、
2.1 XML拼接的基本方法
/**
* Created by xuhy on 2018/1/18.
*/
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* XML元素类
* @author xuhy
*/
public class Element {
private String name; //元素名
private String nodeText = ""; //文本值
private Map<String,String> property = new HashMap<String,String>(); //属性
private boolean isleaf = true; //是否子节点
private List<Element> child = new ArrayList<Element>(); //子节点
public Element(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNodeText() {
return nodeText;
}
public void setNodeText(String nodeText) {
this.nodeText = nodeText;
}
public Map<String, String> getProperty() {
return property;
}
public void setProperty(Map<String, String> property) {
this.property = property;
}
public boolean isIsleaf() {
return isleaf;
}
//这个方法应该屏蔽
public void setIsleaf(boolean isleaf) {
this.isleaf = isleaf;
}
public List<Element> getChild() {
return child;
}
public void setChild(List<Element> child) {
this.child = child;
if(this.isleaf && this.child.size() > 0){
this.isleaf = false;
}
}
/**
* 添加属性
* @param key
* @param value
*/
public void addProperty(String key,String value){
this.property.put(key, value);
}
/**
* 添加子节点
* @param el
*/
public void addChild(Element el){
this.child.add(el);
if(this.isleaf && this.child.size() > 0){
this.isleaf = false;
}
}
}
2.2
/**
* XMl工具类
* @author xhy
*/
public class XmlUtil {
static String lt = "<";
static String ltEnd = "</";
static String rt = ">";
static String rhtEnd = "/>";
static String quotes = "\"";
static String equal = "=";
static String blank = " ";
public static String elementToXml(Element el){
StringBuffer result = new StringBuffer();
//元素开始
result.append(lt).append(el.getName());
//判断是否有属性
if(el.getProperty() != null && el.getProperty().size() > 0 ){
Iterator iter = el.getProperty().keySet().iterator();
while (iter.hasNext()) {
String key = String.valueOf(iter.next());
String value = el.getProperty().get(key);
result.append(blank).append(key).append(equal)
.append(quotes).append(value).append(quotes).append(blank);
}
}
result.append(rt);//结束标记
/*
* 判断是否是叶子节点
* 是叶子节点,添加节点内容
* 不是叶子节点,循环添加子节点
*/
if(el.isIsleaf()){
result.append(el.getNodeText());
}else{
for(Element element :el.getChild()){
result.append(elementToXml(element));
}
}
//元素结束
result.append(ltEnd).append(el.getName()).append(rt);
return result.toString();
}
}
2.3
关于枚举类是从官方那边把所有类型数据取过来,改成枚举类的。没把我写的累死了,太多了,虽然有些用不到,但是还是放着吧。
/**
* Created by xuhy on 2018/1/19.
*/
public enum bpmnEnum {
OTHER_XMLNS(10010,"xmlns"),
PROCESS(10011,"process"),
BPMN2_NAMESPACE(10011, "http://www.omg.org/spec/BPMN/20100524/MODEL"),
XSI_NAMESPACE(10012, "http://www.w3.org/2001/XMLSchema-instance"),
XSI_PREFIX(10013, "xsi"),
SCHEMA_NAMESPACE(10014, "http://www.w3.org/2001/XMLSchema"),
XSD_PREFIX(10015, "xsd"),
TTYPE_LANGUAGE_ATTRIBUTE(10016, "typeLanguage"),
XPATH_NAMESPACE(10017, "http://www.w3.org/1999/XPath"),
EXPRESSION_LANGUAGE_ATTRIBUTE(10018, "expressionLanguage"),
PROCESS_NAMESPACE(10019, "http://www.activiti.org/test"),
TARGET_NAMESPACE_ATTRIBUTE(10010, "targetNamespace"),
ACTIVITI_EXTENSIONS_NAMESPACE(1000, "http://activiti.org/bpmn"),
ACTIVITI_EXTENSIONS_PREFIX(1001, "activiti"),
BPMNDI_NAMESPACE(1002, "http://www.omg.org/spec/BPMN/20100524/DI"),
BPMNDI_PREFIX(1003, "bpmndi"),
OMGDC_NAMESPACE(1004, "http://www.omg.org/spec/DD/20100524/DC"),
mOMGDC_PREFIX(1005, "omgdc"),
OMGDI_NAMESPACE(1006, "http://www.omg.org/spec/DD/20100524/DI"),
OMGDI_PREFIX(1007, "omgdi"),
ATTRIBUTE_ID(1008, "id"),
ATTRIBUTE_NAME(1009, "name"),
ATTRIBUTE_TYPE(1010, "type"),
ATTRIBUTE_DEFAULT(1011, "default"),
ATTRIBUTE_ITEM_REF(1012, "itemRef"),
ELEMENT_DEFINITIONS(1013, "definitions"),
ELEMENT_DOCUMENTATION(1014, "documentation"),
ELEMENT_SIGNAL(1015, "signal"),
ELEMENT_MESSAGE(1016, "message"),
ELEMENT_ERROR(1017, "error"),
ELEMENT_COLLABORATION(1018, "collaboration"),
ELEMENT_PARTICIPANT(1019, "participant"),
ELEMENT_MESSAGE_FLOW(1020, "messageFlow"),
ELEMENT_LANESET(1021, "laneSet"),
ELEMENT_LANE(1022, "lane"),
ELEMENT_FLOWNODE_REF(1023, "flowNodeRef"),
ATTRIBUTE_PROCESS_REF(1024, "processRef"),
ELEMENT_RESOURCE(1025, "resource"),
ELEMENT_PROCESS(1026, "process"),
ATTRIBUTE_PROCESS_EXECUTABLE(1027, "isExecutable"),
ELEMENT_POTENTIAL_STARTER(1028, "potentialStarter"),
ATTRIBUTE_PROCESS_CANDIDATE_USERS(1029, "candidateStarterUsers"),
ATTRIBUTE_PROCESS_CANDIDATE_GROUPS(1030, "candidateStarterGroups"),
ELEMENT_SUBPROCESS(1031, "subProcess"),
ATTRIBUTE_TRIGGERED_BY(1032, "triggeredByEvent"),
ELEMENT_TRANSACTION(1033, "transaction"),
ELEMENT_DATA_STATE(1034, "dataState"),
ELEMENT_EXTENSIONS(1035, "extensionElements"),
ELEMENT_EXECUTION_LISTENER(1036, "executionListener"),
ELEMENT_EVENT_LISTENER(1037, "eventListener"),
ELEMENT_TASK_LISTENER(1038, "taskListener"),
ATTRIBUTE_LISTENER_EVENT(1039, "event"),
ATTRIBUTE_LISTENER_EVENTS(1040, "events"),
ATTRIBUTE_LISTENER_ENTITY_TYPE(1041, "entityType"),
ATTRIBUTE_LISTENER_CLASS(1042, "class"),
ATTRIBUTE_LISTENER_EXPRESSION(1043, "expression"),
ATTRIBUTE_LISTENER_DELEGATEEXPRESSION(1044, "delegateExpression"),
ATTRIBUTE_LISTENER_THROW_EVENT_TYPE(1045, "throwEvent"),
ATTRIBUTE_LISTENER_THROW_SIGNAL_EVENT_NAME(1046, "signalName"),
ATTRIBUTE_LISTENER_THROW_MESSAGE_EVENT_NAME(1047, "messageName"),
ATTRIBUTE_LISTENER_THROW_ERROR_EVENT_CODE(1048, "errorCode"),
ATTRIBUTE_LISTENER_THROW_EVENT_TYPE_SIGNAL(1049, "signal"),
ATTRIBUTE_LISTENER_THROW_EVENT_TYPE_GLOBAL_SIGNAL(1050, "globalSignal"),
ATTRIBUTE_LISTENER_THROW_EVENT_TYPE_MESSAGE(1051, "message"),
ATTRIBUTE_LISTENER_THROW_EVENT_TYPE_ERROR(1052, "error"),
ATTRIBUTE_VALUE_TRUE(1053, "true"),
ATTRIBUTE_VALUE_FALSE(1054, "false"),
ATTRIBUTE_ACTIVITY_ASYNCHRONOUS(1055, "async"),
ATTRIBUTE_ACTIVITY_EXCLUSIVE(1056, "exclusive"),
ATTRIBUTE_ACTIVITY_ISFORCOMPENSATION(1057, "isForCompensation"),
ELEMENT_IMPORT(1058, "import"),
ATTRIBUTE_IMPORT_TYPE(1059, "importType"),
ATTRIBUTE_LOCATION(1060, "location"),
ATTRIBUTE_NAMESPACE(1061, "namespace"),
ELEMENT_INTERFACE(1062, "interface"),
ELEMENT_OPERATION(1063, "operation"),
ATTRIBUTE_IMPLEMENTATION_REF(1064, "implementationRef"),
ELEMENT_IN_MESSAGE(1065, "inMessageRef"),
ELEMENT_OUT_MESSAGE(1066, "outMessageRef"),
ELEMENT_ITEM_DEFINITION(1067, "itemDefinition"),
ATTRIBUTE_STRUCTURE_REF(1068, "structureRef"),
ATTRIBUTE_ITEM_KIND(1069, "itemKind"),
ELEMENT_DATA_STORE(1070, "dataStore"),
ELEMENT_DATA_STORE_REFERENCE(1071, "dataStoreReference"),
ATTRIBUTE_ITEM_SUBJECT_REF(1072, "itemSubjectRef"),
ATTRIBUTE_DATA_STORE_REF(1073, "dataStoreRef"),
ELEMENT_IOSPECIFICATION(1074, "ioSpecification"),
ELEMENT_DATA_INPUT(1075, "dataInput"),
ELEMENT_DATA_OUTPUT(1076, "dataOutput"),
ELEMENT_DATA_INPUT_REFS(1077, "dataInputRefs"),
ELEMENT_DATA_OUTPUT_REFS(1078, "dataOutputRefs"),
ELEMENT_INPUT_ASSOCIATION(1079, "dataInputAssociation"),
ELEMENT_OUTPUT_ASSOCIATION(1080, "dataOutputAssociation"),
ELEMENT_SOURCE_REF(1081, "sourceRef"),
ELEMENT_TARGET_REF(1082, "targetRef"),
ELEMENT_TRANSFORMATION(1083, "transformation"),
ELEMENT_ASSIGNMENT(1084, "assignment"),
ELEMENT_FROM(1085, "from"),
ELEMENT_TO(1086, "to"),
ELEMENT_TASK_MAIL(1087, "mailTask"),
ELEMENT_TASK(1088, "task"),
ELEMENT_TASK_BUSINESSRULE(1089, "businessRuleTask"),
ELEMENT_TASK_MANUAL(1090, "manualTask"),
ELEMENT_TASK_RECEIVE(1091, "receiveTask"),
ELEMENT_TASK_SCRIPT(1092, "scriptTask"),
ELEMENT_TASK_SEND(1093, "sendTask"),
ELEMENT_TASK_SERVICE(1094, "serviceTask"),
ELEMENT_TASK_USER(1095, "userTask"),
ELEMENT_CALL_ACTIVITY(1096, "callActivity"),
ATTRIBUTE_EVENT_START_INITIATOR(1097, "initiator"),
ATTRIBUTE_FORM_FORMKEY(1098, "formKey"),
ELEMENT_MULTIINSTANCE(1099, "multiInstanceLoopCharacteristics"),
ELEMENT_MULTIINSTANCE_CARDINALITY(1100, "loopCardinality"),
ELEMENT_MULTIINSTANCE_DATAINPUT(1101, "loopDataInputRef"),
ELEMENT_MULTIINSTANCE_DATAITEM(1102, "inputDataItem"),
ELEMENT_MULTIINSTANCE_CONDITION(1103, "completionCondition"),
ATTRIBUTE_MULTIINSTANCE_SEQUENTIAL(1104, "isSequential"),
ATTRIBUTE_MULTIINSTANCE_COLLECTION(1105, "collection"),
ATTRIBUTE_MULTIINSTANCE_VARIABLE(1106, "elementVariable"),
ATTRIBUTE_MULTIINSTANCE_INDEX_VARIABLE(1107, "elementIndexVariable"),
ATTRIBUTE_TASK_IMPLEMENTATION(1108, "implementation"),
ATTRIBUTE_TASK_OPERATION_REF(1109, "operationRef"),
ATTRIBUTE_TASK_SCRIPT_TEXT(1110, "script"),
ATTRIBUTE_TASK_SCRIPT_FORMAT(1111, "scriptFormat"),
ATTRIBUTE_TASK_SCRIPT_RESULTVARIABLE(1112, "resultVariable"),
ATTRIBUTE_TASK_SCRIPT_AUTO_STORE_VARIABLE(1113, "autoStoreVariables"),
ATTRIBUTE_TASK_SERVICE_CLASS(1114, "class"),
ATTRIBUTE_TASK_SERVICE_EXPRESSION(1115, "expression"),
ATTRIBUTE_TASK_SERVICE_DELEGATEEXPRESSION(1116, "delegateExpression"),
ATTRIBUTE_TASK_SERVICE_RESULTVARIABLE(1117, "resultVariableName"),
ATTRIBUTE_TASK_SERVICE_EXTENSIONID(1118, "extensionId"),
ATTRIBUTE_TASK_SERVICE_SKIP_EXPRESSION(1119, "skipExpression"),
ATTRIBUTE_TASK_USER_ASSIGNEE(1120, "assignee"),
ATTRIBUTE_TASK_USER_OWNER(1121, "owner"),
ATTRIBUTE_TASK_USER_CANDIDATEUSERS(1122, "candidateUsers"),
ATTRIBUTE_TASK_USER_CANDIDATEGROUPS(1123, "candidateGroups"),
ATTRIBUTE_TASK_USER_DUEDATE(1124, "dueDate"),
ATTRIBUTE_TASK_USER_BUSINESS_CALENDAR_NAME(1125, "businessCalendarName"),
ATTRIBUTE_TASK_USER_CATEGORY(1126, "category"),
ATTRIBUTE_TASK_USER_PRIORITY(1127, "priority"),
ATTRIBUTE_TASK_USER_SKIP_EXPRESSION(1128, "skipExpression"),
ATTRIBUTE_TASK_RULE_VARIABLES_INPUT(1129, "ruleVariablesInput"),
ATTRIBUTE_TASK_RULE_RESULT_VARIABLE(1130, "resultVariable"),
ATTRIBUTE_TASK_RULE_RULES(1131, "rules"),
ATTRIBUTE_TASK_RULE_EXCLUDE(1132, "exclude"),
ATTRIBUTE_TASK_RULE_CLASS(1133, "class"),
ATTRIBUTE_CALL_ACTIVITY_CALLEDELEMENT(1134, "calledElement"),
ATTRIBUTE_CALL_ACTIVITY_INHERITVARIABLES(1135, "inheritVariables"),
ELEMENT_CALL_ACTIVITY_IN_PARAMETERS(1136, "in"),
ELEMENT_CALL_ACTIVITY_OUT_PARAMETERS(1137, "out"),
ATTRIBUTE_IOPARAMETER_SOURCE(1138, "source"),
ATTRIBUTE_IOPARAMETER_SOURCE_EXPRESSION(1139, "sourceExpression"),
ATTRIBUTE_IOPARAMETER_TARGET(1140, "target"),
ELEMENT_SEQUENCE_FLOW(1141, "sequenceFlow"),
ELEMENT_FLOW_CONDITION(1142, "conditionExpression"),
ATTRIBUTE_FLOW_SOURCE_REF(1143, "sourceRef"),
ATTRIBUTE_FLOW_TARGET_REF(1144, "targetRef"),
ATTRIBUTE_FLOW_SKIP_EXPRESSION(1145, "skipExpression"),
ELEMENT_TEXT_ANNOTATION(1146, "textAnnotation"),
ATTRIBUTE_TEXTFORMAT(1147, "textFormat"),
ELEMENT_TEXT_ANNOTATION_TEXT(1148, "text"),
ELEMENT_ASSOCIATION(1149, "association"),
ELEMENT_GATEWAY_EXCLUSIVE(1150, "exclusiveGateway"),
ELEMENT_GATEWAY_EVENT(1151, "eventBasedGateway"),
ELEMENT_GATEWAY_INCLUSIVE(1152, "inclusiveGateway"),
ELEMENT_GATEWAY_PARALLEL(1153, "parallelGateway"),
ELEMENT_GATEWAY_COMPLEX(1154, "complexGateway"),
ELEMENT_EVENT_START(1155, "startEvent"),
ELEMENT_EVENT_END(1156, "endEvent"),
ELEMENT_EVENT_BOUNDARY(1157, "boundaryEvent"),
ELEMENT_EVENT_THROW(1158, "intermediateThrowEvent"),
ELEMENT_EVENT_CATCH(1159, "intermediateCatchEvent"),
ATTRIBUTE_BOUNDARY_ATTACHEDTOREF(1160, "attachedToRef"),
ATTRIBUTE_BOUNDARY_CANCELACTIVITY(1161, "cancelActivity"),
ELEMENT_EVENT_ERRORDEFINITION(1162, "errorEventDefinition"),
ATTRIBUTE_ERROR_REF(1163, "errorRef"),
ATTRIBUTE_ERROR_CODE(1164, "errorCode"),
ELEMENT_EVENT_MESSAGEDEFINITION(1165, "messageEventDefinition"),
ATTRIBUTE_MESSAGE_REF(1166, "messageRef"),
ELEMENT_EVENT_SIGNALDEFINITION(1167, "signalEventDefinition"),
ATTRIBUTE_SIGNAL_REF(1168, "signalRef"),
ATTRIBUTE_SCOPE(1169, "scope"),
ELEMENT_EVENT_TIMERDEFINITION(1170, "timerEventDefinition"),
ATTRIBUTE_CALENDAR_NAME(1171, "businessCalendarName"),
ATTRIBUTE_TIMER_DATE(1172, "timeDate"),
ATTRIBUTE_TIMER_CYCLE(1173, "timeCycle"),
ATTRIBUTE_END_DATE(1174, "endDate"),
ATTRIBUTE_TIMER_DURATION(1175, "timeDuration"),
ELEMENT_EVENT_TERMINATEDEFINITION(1176, "terminateEventDefinition"),
ATTRIBUTE_TERMINATE_ALL(1177, "terminateAll"),
ELEMENT_EVENT_CANCELDEFINITION(1178, "cancelEventDefinition"),
ELEMENT_EVENT_COMPENSATEDEFINITION(1179, "compensateEventDefinition"),
ATTRIBUTE_COMPENSATE_ACTIVITYREF(1180, "activityRef"),
ATTRIBUTE_COMPENSATE_WAITFORCOMPLETION(1181, "waitForCompletion"),
ELEMENT_FORMPROPERTY(1182, "formProperty"),
ATTRIBUTE_FORM_ID(1183, "id"),
ATTRIBUTE_FORM_NAME(1184, "name"),
ATTRIBUTE_FORM_TYPE(1185, "type"),
ATTRIBUTE_FORM_EXPRESSION(1186, "expression"),
ATTRIBUTE_FORM_VARIABLE(1187, "variable"),
ATTRIBUTE_FORM_READABLE(1188, "readable"),
ATTRIBUTE_FORM_WRITABLE(1189, "writable"),
ATTRIBUTE_FORM_REQUIRED(1190, "required"),
ATTRIBUTE_FORM_DEFAULT(1191, "default"),
ATTRIBUTE_FORM_DATEPATTERN(1192, "datePattern"),
ELEMENT_VALUE(1193, "value"),
ELEMENT_FIELD(1194, "field"),
ATTRIBUTE_FIELD_NAME(1195, "name"),
ATTRIBUTE_FIELD_(1196, "Value"),
ATTRIBUTE_FIELD_EXPRESSION(1197, "expression"),
ELEMENT_FIELD_(1198, "field"),
ALFRESCO_TYPE(1199, "alfrescoScriptType"),
ELEMENT_DI_DIAGRAM(1200, "BPMNDiagram"),
ELEMENT_DI_PLANE(1201, "BPMNPlane"),
ELEMENT_DI_SHAPE(1202, "BPMNShape"),
ELEMENT_DI_EDGE(1203, "BPMNEdge"),
ELEMENT_DI_LABEL(1204, "BPMNLabel"),
ELEMENT_DI_BOUNDS(1205, "Bounds"),
ELEMENT_DI_WAYPOINT(1206, "waypoint"),
ATTRIBUTE_DI_BPMNELEMENT(1207, "bpmnElement"),
ATTRIBUTE_DI_IS_EXPANDED(1208, "isExpanded"),
ATTRIBUTE_DI_WIDTH(1209, "width"),
ATTRIBUTE_DI_HEIGHT(1210, "height"),
ATTRIBUTE_DI_X(1211, "x"),
ATTRIBUTE_DI_Y(1212, "y"),
ELEMENT_DATA_OBJECT(1213, "dataObject"),
ATTRIBUTE_DATA_ID(1214, "id"),
ATTRIBUTE_DATA_NAME(1215, "name"),
ATTRIBUTE_DATA_ITEM_REF(1216, "itemSubjectRef"),
ELEMENT_DATA_VALUE(1217, "value"),
ELEMENT_CUSTOM_RESOURCE(1218, "customResource"),
ELEMENT_RESOURCE_ASSIGNMENT(1219, "resourceAssignmentExpression"),
ELEMENT_FORMAL_EXPRESSION(1220, "formalExpression"),
ELEMENT_RESOURCE_REF(1221, "resourceRef"),
ATTRIBUTE_ASSOCIATION_DIRECTION(1222, "associationDirection"),
FAILED_JOB_RETRY_TIME_CYCLE(1223, "failedJobRetryTimeCycle"),
MAP_EXCEPTION(1224, "mapException"),
MAP_EXCEPTION_ERRORCODE(1225, "errorCode"),
MAP_EXCEPTION_ANDCHILDREN(1226, "includeChildExceptions");
Integer code;
String value;
bpmnEnum(Integer code, String value) {
this.code = code;
this.value = value;
}
public Integer getCode() {
return code;
}
public String getValue() {
return value;
}
public static bpmnEnum getByValue(Integer code) {
for (bpmnEnum bpmnEnum : bpmnEnum.values()) {
if (bpmnEnum.getCode().equals(code)) {
return bpmnEnum;
}
}
return null;
}
}
2.4关于常用的bpmn的属性也封装了一下,因为官方不包含下面内容。
/**
* Created by xuhy on 2018/1/19.
*/
public enum bpmnProcessKey {
ID(1,"id"),
NAME(2,"name"),
ISEXECUTABLE(3,"isExecutable"),
ACTIVITIASSIGNEE(4,"activiti:assignee"),
EXCLUSIVEDEFAULT(5,"default"),
SOURCEREF(6,"sourceRef"),
TARGETREF(7,"targetRef"),
SKIPEXPRESSION(8,"skipExpression"),
ACTIVITIEXPRESSION(9,"activiti:expression");
bpmnProcessKey(Integer code, String value) {
this.code = code;
this.value = value;
}
Integer code;
String value;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
2.5重点来了,bpmn拼接,博主封装了一天,终于成功,高兴^_^
/**
* Created by ASUS on 2018/1/19.
*/
public final class BpmnXmlUtil {
/**
* @Description 根目录组装
* @return
*/
public static Element getBpmnXmlRoot(){
Element eleRoot = new Element(getbpmnValue(1013));
eleRoot.addProperty("xmlns:", bpmnEnum.BPMN2_NAMESPACE.getValue() );
eleRoot.addProperty("xmlns:xsi", bpmnEnum.XSI_NAMESPACE.getValue());
eleRoot.addProperty("xmlns:xsd",bpmnEnum.SCHEMA_NAMESPACE.getValue() );
eleRoot.addProperty("xmlns:activiti",bpmnEnum.ACTIVITI_EXTENSIONS_NAMESPACE.getValue() );
eleRoot.addProperty("xmlns:bpmndi",bpmnEnum.BPMNDI_NAMESPACE.getValue() );
eleRoot.addProperty("xmlns:omgdc",bpmnEnum.OMGDC_NAMESPACE.getValue() );
eleRoot.addProperty("xmlns:omgdi",bpmnEnum.OMGDI_NAMESPACE.getValue() );
eleRoot.addProperty("typeLanguage",bpmnEnum.SCHEMA_NAMESPACE.getValue());
eleRoot.addProperty("expressionLanguage",bpmnEnum.XPATH_NAMESPACE.getValue());
eleRoot.addProperty("targetNamespace",bpmnEnum.PROCESS_NAMESPACE.getValue());
return eleRoot;
}
/**
* @description真正任务开始之前的组装
* @param eleRoot
* @param mapProcess
* @param mapStart
* @return
*/
public static Element bpmnXmlBeforeStartEvent(Element eleRoot,Map<Integer, String> mapProcess,Map<Integer, String> mapStart){
Element eP = bpmnAnalysis(1011,mapProcess);
eleRoot.addChild(eP);
Element elStart = bpmnAnalysis(1155,mapStart);
eP.addChild(elStart);
return eP;
}
public static Element bpmnAnalysis(Integer elementType, Map<Integer, String> map){
Element elementOrig = new Element(getbpmnValue(elementType));
elementOrig.addProperty(bpmnProcessKey.ID.getValue(), map.get(bpmnProcessKey.ID.getCode()));
elementOrig.addProperty(bpmnProcessKey.NAME.getValue(), map.get(bpmnProcessKey.NAME.getCode()));
switch (elementType) {
case 1095:
elementOrig.addProperty(bpmnProcessKey.ACTIVITIASSIGNEE.getValue(), map.get(bpmnProcessKey.ACTIVITIASSIGNEE.getCode()));
break;
case 1011:
elementOrig.addProperty(bpmnProcessKey.ISEXECUTABLE.getValue(), map.get(bpmnProcessKey.ISEXECUTABLE.getCode()));
break;
case 1150:
elementOrig.addProperty(bpmnProcessKey.EXCLUSIVEDEFAULT.getValue(),map.get(bpmnProcessKey.EXCLUSIVEDEFAULT.getCode()));
break;
case 1141:
elementOrig.addProperty(bpmnProcessKey.SOURCEREF.getValue(),map.get(bpmnProcessKey.SOURCEREF.getCode()));
elementOrig.addProperty(bpmnProcessKey.TARGETREF.getValue(),map.get(bpmnProcessKey.TARGETREF.getCode()));
elementOrig.addProperty(bpmnProcessKey.SKIPEXPRESSION.getValue(),map.get(bpmnProcessKey.SKIPEXPRESSION.getCode()));
break;
case 1094:
//可写默认处理器xxservice
elementOrig.addProperty(bpmnProcessKey.ACTIVITIEXPRESSION.getValue(),map.get(bpmnProcessKey.ACTIVITIEXPRESSION.getCode()));
break;
}
return elementOrig;
}
/**
* @description 根据元素code获取元素属性
* @param bpmnEnumCode xml元素code值
* @return bpmnEnumValue xml元素 名称
*/
public static String getbpmnValue(Integer bpmnEnumCode) {
String bpmnEnumValue = bpmnEnum.getByValue(bpmnEnumCode).getValue();
return bpmnEnumValue;
}
public static String bpmnXMLSplit(Map<Integer, String> mapProcess,Map<Integer, Map<Integer, String>> elementCode){
//mapStart 固定参数
Map<Integer, String> mapStart = new LinkedHashMap<>();//--------start部分
mapStart.put(1,"startevent0");
mapStart.put(2,"开始");
//mapEnd总结束 固定参数
Map<Integer, String> mapEnd = new LinkedHashMap<>();//--------start部分
mapEnd.put(1,"endevent0");
mapEnd.put(2,"结束");
Element eleRoot = getBpmnXmlRoot();
Element eP = bpmnXmlBeforeStartEvent(eleRoot,mapProcess,mapStart);
for (Integer key : elementCode.keySet()) {
Element eleOrig2 = bpmnAnalysis(key, elementCode.get(key));
eP.addChild(eleOrig2);
}
Element endElement = bpmnAnalysis(1156,mapEnd);
eP.addChild(endElement);
return (XmlUtil.elementToXml(eleRoot));
}
}
三、校验成果
/**
* 测试main方法
* @param args
*/
public static void main(String[] args) {
Map<Integer, String> mapProcess = new LinkedHashMap<>();
Map<Integer, Map<Integer, String>> elementCode = new LinkedHashMap<>();
mapProcess.put(1,"htTongProcess");
mapProcess.put(2,"htTong Process");
mapProcess.put(3,"true");
Map<Integer,String> mapNei01 = new LinkedHashMap<>();
mapNei01.put(1,"usertask1");
mapNei01.put(2,"费用申请报销");
elementCode.put(1095,mapNei01);
Map<Integer,String> mapNei02 = new LinkedHashMap<>();
mapNei02.put(1,"exclusivegateway1");
mapNei02.put(2,"Exclusive Gateway");
mapNei02.put(5,"flow3");
elementCode.put(1150,mapNei02);
//mapStart 写死
Map<Integer, String> mapStart = new LinkedHashMap<>();//--------start部分
mapStart.put(1,"startevent1");
mapStart.put(2,"开始");
//mapEnd写死
Map<Integer, String> mapEnd = new LinkedHashMap<>();//--------start部分
mapEnd.put(1,"endevent1");
mapEnd.put(2,"结束");
Element eleRoot = new BpmnXmlUtil().getBpmnXmlRoot();
Element eP = new BpmnXmlUtil().bpmnXmlBeforeStartEvent(eleRoot,mapProcess,mapStart);
for (Integer key : elementCode.keySet()) {
Element eleOrig2 = new BpmnXmlUtil().bpmnAnalysis(key, elementCode.get(key));
eP.addChild(eleOrig2);
}
Element endElement = new BpmnXmlUtil().bpmnAnalysis(1156,mapEnd);
eP.addChild(endElement);
System.out.println((XmlUtil.elementToXml(eleRoot)));
}
四、输出结果
略