Activiti——流程图XML以及与流程文件的转换
在这个XML片断中,一个BPMNShape表示一个流程元素,这是流程元素对应的流程图的描述,以上的XML表示“startevent1”这个流程元素,高为“35”,宽为“35”,X坐标值为“360”,Y坐标值为“170”,其中X和Y坐标是相对于“画布”中的原点(0,0)而言的,每个设计器的画布原点有可能不一致,以Activiti的Eclipse插件为例,Activiti流程设计器的原点在设计器的左上
1、流程图XML
BPMN对于流程图也有定义,流程图的各个元素使用XML来表示,流程引擎的编辑器通过读取和操作流程的XML来展现和修改流程图。BPMN规范定义了表示这些流程图元素的XML格式,每个流程引擎厂商根据这些格式(规范),来实现自己的流程设计器,由于使用统的规范,因此使用不同厂商的流程设计器打开的流程文件它们所展示的流程图内容是一致的,但它们会存在外观上的差别。
BPMN规范将流程图中的各种元素抽象为两类:节点
和衔接
,任务、事件和网关等这类流程元素,可以使用节点来表示,它们在表现上都有一个共同点:只有一个位置信息。衔接用于连接两个流程元素,例如顺序流就属于衔接元素,这类元素会有两个以上的位置信息。
1.1、节点元素
一个节点表示一个流程元素,因此它只拥有一个位置信息。以下的XML片断表示一个流程元素图对应的XML:
<bpmndi:BPMNShape bpmnElement="startevent1"
id="BPMNShape_startevent1">
<omgdc:Bounds height="35" width="35" x="360" y="170"></omgdc:Bounds>
</bpmndi:BPMNShape>
在这个XML片断中,一个BPMNShape表示一个流程元素,这是流程元素对应的流程图的描述,以上的XML表示“startevent1”这个流程元素,高为“35”,宽为“35”,X坐标值为“360”,Y坐标值为“170”,其中X和Y坐标是相对于“画布”中的原点(0,0)而言的,每个设计器的画布原点有可能不一致,以Activiti的Eclipse插件为例,Activiti流程设计器的原点在设计器的左上角。
对于Activiti的API,无论节点还是衔接均被抽象为一个DiagramElement对象,这个对象有两个子类:DiagramEdge和DiagramNode,其中DiagramNode表示节点,该对象有4个Double类型的属性,分别用来表示节点的长宽和XY坐标。
1.2、衔接元素
一个衔接元素可以有多个连接点,对应的Activiti类为DiagramEdge。Activiti使用DiagramEdge Waypoint对象来表示连接点,因此一个DiagramEdge中会有多个DiagramEdge Waypoint对象,一个DiagramEdge Waypoint实例只需要关心衔接点的XY坐标,它并不保存大小属性。以下的XML表示一个衔接元素:
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="215" y="237"></omgdi:waypoint>
<omgdi:waypoint x="260" y="207"></omgdi:waypoint>
</bpmndi:BPMNEdge>
BPMNEdge表示一个衔接,对应的流程元素是“fow1”,这是一个顺序流,第一个衔接点的坐标是(215,247),第二个衔接点的坐标是(260,207)。
2、流程图与流程文件的转换
Activiti提供了一个activiti–bpmn-converter模块,使用该模块的API,可以实现流程对象与流程图之间的转换。BPMN对象和流程图之间可以相互转换,开发人员可以使用这些API来开发自己的流程设计器。这里并不局限于某种表现层技术,可以根据表现层定义的数据被转换为BPMN的模型,然后使用activiti-bpmn-converter将其转换为流程图。
模块activiti-bpmn-model主要用于存放对应BPMN规范的对象,activiti–bpmn-converter主要提供模型与ML之间的转换功能。
@Test
public void test() {
//创建一个BPMN模型实例
BpmnModel bpmnModel = new BpmnModel();
//创建流程
Process process = new Process();
process.setId("myProcess");
bpmnModel.getProcesses().add(process);
//创建任务
UserTask task = new UserTask();
task.setId("myTask");
process.addFlowElement(task);
//设置任务的图形信息
GraphicInfo g1 = new GraphicInfo();
g1.setHeight(100);
g1.setWidth(200);
g1.setX(110);
g1.setY(120);
bpmnModel.addGraphicInfo("myTask", g1);
//XML转换器,将BPMN模型转换为XML文档
BpmnXMLConverter converter = new BpmnXMLConverter();
byte[] bytes = converter.convertToXML(bpmnModel);
System.out.println(new String(bytes));
}
<?xml version="1.0" encoding="UTF-8"?>
<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">
<process id="myProcess" isExecutable="true">
<userTask id="myTask"></userTask>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_myProcess">
<bpmndi:BPMNPlane bpmnElement="myProcess" id="BPMNPlane_myProcess">
<bpmndi:BPMNShape bpmnElement="myTask" id="BPMNShape_myTask">
<omgdc:Bounds height="100.0" width="200.0" x="110.0" y="120.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)