activiti bpmnModel的使用

bpmnModel对象,是activiti动态部署钟很重要的一个对象,如果bpmnModel对象不能深入的理解,那可能如果自己需要开发一套流程设计器,就显得力不从心,之前我们公司自己开发了一套activiti web设计器,如下图所示:

 

 

activiti web设计器设计的时候,存储格式是自定义的json对象,那现在问题来了,我们怎么把我们自己的json格式转化为标准的bpmn需要的xml文件呢?这一点很重要?所以这也是本节课需要重点讲解的地方,大家实际开发可以举一反三。灵活的运用到项目中。

1.1.1. BpmnModel使用

因为平时我们在使用的时候,展示流程图没有使用是默认的流程生成的这种方式,所以这里坐标信息,暂时不演示,主要演示节点等的核心功能。

1.1.1.1. eclipse绘制流程

为了方便演示,这里我们先在eclipse中绘制一个简单的流程。具体的流程图如下:

 

流程图的xml文件如下:直接用文本打开bpmn文件即可:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">  
  3.   <process id="process1" isExecutable="true">  
  4.     <startEvent id="start1shareniu" name="start1shareniu"></startEvent>  
  5.     <sequenceFlow id="starttouserTask" name="starttouserTask" sourceRef="start1shareniu" targetRef="userTask1shareniu"></sequenceFlow>  
  6.     <userTask id="userTask1shareniu" name="userTask1shareniu"></userTask>  
  7.     <sequenceFlow id="userTasktoend" name="userTasktoend" sourceRef="userTask1shareniu" targetRef="endEventshareniu"></sequenceFlow>  
  8.     <endEvent id="endEventshareniu" name="endEventshareniu"></endEvent>  
  9.   </process>  
  10.   <bpmndi:BPMNDiagram id="BPMNDiagram_process1">  
  11.     <bpmndi:BPMNPlane bpmnElement="process1" id="BPMNPlane_process1">  
  12.       <bpmndi:BPMNShape bpmnElement="start1shareniu" id="BPMNShape_start1shareniu">  
  13.         <omgdc:Bounds height="35.0" width="35.0" x="70.0" y="150.0"></omgdc:Bounds>  
  14.       </bpmndi:BPMNShape>  
  15.       <bpmndi:BPMNShape bpmnElement="userTask1shareniu" id="BPMNShape_userTask1shareniu">  
  16.         <omgdc:Bounds height="60.0" width="100.0" x="180.0" y="110.0"></omgdc:Bounds>  
  17.       </bpmndi:BPMNShape>  
  18.       <bpmndi:BPMNShape bpmnElement="endEventshareniu" id="BPMNShape_endEventshareniu">  
  19.         <omgdc:Bounds height="35.0" width="35.0" x="380.0" y="76.0"></omgdc:Bounds>  
  20.       </bpmndi:BPMNShape>  
  21.       <bpmndi:BPMNEdge bpmnElement="starttouserTask" id="BPMNEdge_starttouserTask">  
  22.         <omgdi:waypoint x="87.0" y="150.0"></omgdi:waypoint>  
  23.         <omgdi:waypoint x="100.0" y="139.0"></omgdi:waypoint>  
  24.         <omgdi:waypoint x="180.0" y="140.0"></omgdi:waypoint>  
  25.         <bpmndi:BPMNLabel>  
  26.           <omgdc:Bounds height="14.0" width="100.0" x="87.0" y="150.0"></omgdc:Bounds>  
  27.         </bpmndi:BPMNLabel>  
  28.       </bpmndi:BPMNEdge>  
  29.       <bpmndi:BPMNEdge bpmnElement="userTasktoend" id="BPMNEdge_userTasktoend">  
  30.         <omgdi:waypoint x="280.0" y="140.0"></omgdi:waypoint>  
  31.         <omgdi:waypoint x="324.0" y="129.0"></omgdi:waypoint>  
  32.         <omgdi:waypoint x="324.0" y="93.0"></omgdi:waypoint>  
  33.         <omgdi:waypoint x="380.0" y="93.0"></omgdi:waypoint>  
  34.         <bpmndi:BPMNLabel>  
  35.           <omgdc:Bounds height="14.0" width="100.0" x="414.0" y="126.0"></omgdc:Bounds>  
  36.         </bpmndi:BPMNLabel>  
  37.       </bpmndi:BPMNEdge>  
  38.     </bpmndi:BPMNPlane>  
  39.   </bpmndi:BPMNDiagram>  
  40. </definitions>  


1.1.1.2. 自己生成

下面的代码,就是生成这个bpmnmodel 核心代码,代码如下所示:

  1. //实例化BpmnModel对象  
  2. BpmnModel bpmnModel=new BpmnModel();  
  3. //开始节点的属性  
  4. StartEvent startEvent=new StartEvent();  
  5. startEvent.setId("start1shareniu");  
  6. startEvent.setName("start1shareniu");  
  7. //普通的UserTask节点  
  8. UserTask userTask=new UserTask();  
  9. userTask.setId("userTask1shareniu");  
  10. userTask.setName("userTask1shareniu");  
  11. //结束节点属性  
  12. EndEvent endEvent=new EndEvent();  
  13. endEvent.setId("endEventshareniu");  
  14. endEvent.setName("endEventshareniu");  
  15. //连线信息  
  16. List<SequenceFlow> sequenceFlows=new ArrayList<SequenceFlow>();  
  17. List<SequenceFlow> toEnd=new ArrayList<SequenceFlow>();  
  18. SequenceFlow s1=new SequenceFlow();  
  19. s1.setId("starttouserTask");  
  20. s1.setName("starttouserTask");  
  21. s1.setSourceRef("start1shareniu");  
  22. s1.setTargetRef("userTask1shareniu");  
  23. sequenceFlows.add(s1);  
  24. SequenceFlow s2=new SequenceFlow();  
  25. s2.setId("userTasktoend");  
  26. s2.setName("userTasktoend");  
  27. s2.setSourceRef("userTask1shareniu");  
  28. s2.setTargetRef("endEventshareniu");  
  29. toEnd.add(s2);  
  30. startEvent.setOutgoingFlows(sequenceFlows);  
  31. userTask.setOutgoingFlows(toEnd);  
  32. userTask.setIncomingFlows(sequenceFlows);  
  33. endEvent.setIncomingFlows(toEnd);  
  34. //Process对象  
  35. Process process=new Process();  
  36. process.setId("process1");  
  37. process.addFlowElement(startEvent);  
  38. process.addFlowElement(s1);  
  39. process.addFlowElement(userTask);  
  40. process.addFlowElement(s2);  
  41. process.addFlowElement(endEvent);  
  42. bpmnModel.addProcess(process);  

上面的代码,我们已经写好了bpmnmodel绘制的流程,那我们怎么知道对还是不对呢?下面就开始将我们的bpmnmodel对象转化为标准的xml文件看一下。

1.1.2. BpmnModel转化xml

将上面的对象转化为标准的xml代码如下所示:

//bpmnModel 转换为标准的bpmn xml文件

BpmnXMLConverter bpmnXMLConverter=new BpmnXMLConverter();

byte[] convertToXML = bpmnXMLConverter.convertToXML(bpmnModel);

String bytes=new String(convertToXML);

System.out.println(bytes);

运行程序,看一下程序的输出如下:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">  
  3.   <process id="process1" isExecutable="true">  
  4.     <startEvent id="start1shareniu" name="start1shareniu"></startEvent>  
  5.     <sequenceFlow id="starttouserTask" name="starttouserTask" sourceRef="start1shareniu" targetRef="userTask1shareniu"></sequenceFlow>  
  6.     <userTask id="userTask1shareniu" name="userTask1shareniu"></userTask>  
  7.     <sequenceFlow id="userTasktoend" name="userTasktoend" sourceRef="userTask1shareniu" targetRef="endEventshareniu"></sequenceFlow>  
  8.     <endEvent id="endEventshareniu" name="endEventshareniu"></endEvent>  
  9.   </process>  
  10.   <bpmndi:BPMNDiagram id="BPMNDiagram_process1">  
  11.     <bpmndi:BPMNPlane bpmnElement="process1" id="BPMNPlane_process1"></bpmndi:BPMNPlane>  
  12.   </bpmndi:BPMNDiagram>  
  13. </definitions>  

我们看到转化的xml文件,对比eclipse绘制流程的xml,除了坐标没有,其他的都是正确的。那我们怎么验证我们生成的xml是正确的呢?因为转化成功,也不一定可以使用的。接下来看一下bpmnmodel如何验证。

1.1.3. BpmnModel验证

验证的方法代码如下所示:

//验证bpmnModel 是否是正确的bpmn xml文件

ProcessValidatorFactory processValidatorFactory=new ProcessValidatorFactory();

ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator();

//验证失败信息的封装ValidationError

List<ValidationError> validate = defaultProcessValidator.validate(bpmnModel);

System.out.println(validate.size());

需要说明的是:ValidationError封装的是验证信息,如果size0说明,bpmnmodel正确,大于0,说明自定义的bpmnmodel是错误的,不可以使用的。

验证还是很有必要使用的,因为流程部署的时候,我们最好验证一次,没有问题在部署。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值