Workflow configuration can also be done manually via an XML file. This process is inherently more complex because you need to know in advance the format of an Activiti workflow definition. Fortunately, these XML files usually follow a schema that defines the structure they will have. For the case at hand, it can be consulted at https://www.omg.org/spec/BPMN/2.0/PDF.
Looking at the file contents, it can be divided into two clearly distinct parts.
The first part is the definition of the workflow sequence and the tasks executed by each of these sequences.
The second part establishes the graphical structure that will allow the use of the administration front end discussed in the previous point. To generate this graphical structure, it is necessary to first open and save it with the Yaoqiang BPMN Editor utility.
As a configuration example, we will indicate the format of the diagram generated with Activiti. The areas where the activities performed by each workflow sequence are defined can be clearly seen:
<serviceTask id="PROCESSOWNER_NOTIFICATION" name="P.Owner notification" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.SentNotificationJavaDelegate">
<extensionElements>
<activiti:field name="notificationCode" stringValue="7" />
</extensionElements>
<incoming>flow1</incoming>
<outgoing>flowN2</outgoing>
</serviceTask>
The PROCESSOWNER_NOTIFICATION task and the Java class responsible for implementing it are defined. We can also see that it indicates that the sequence that originates this task is the workflow sequence called "flow1" and that when it finishes, the "flowN2" task will be executed.
An example where these workflow sequences are defined would be:
<sequenceFlow id="flow1" sourceRef="Event_Start" targetRef="PROCESSOWNER_NOTIFICATION" />
<sequenceFlow id="flowN2" sourceRef="PROCESSOWNER_NOTIFICATION" targetRef="PROCESSOWNER_VALIDATOR" />
You can observe that the name of the workflow sequence is indicated, who can originate it (sourceRef) and which task will be executed (targetRef).
For the following workflow
The generated XML would be the following:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="DC" xmlns:xsd="http://www.w3.org/2001/XMLSchema " xmlns:yaoqiang="http://bpmn.sourceforge.net " id="_1613572957230" name="" targetNamespace="DC" exporter="Yaoqiang BPMN Editor" exporterVersion="5.3" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL http://bpmn.sourceforge.net/schemas/BPMN20.xsd">
<process id="ADHERENCE" name="Request of adherence" processType="None" isClosed="false" isExecutable="true">
<extensionElements>
<yaoqiang:description />
<yaoqiang:pageFormat height="841.8897637795276" imageableHeight="831.8897637795276" imageableWidth="588.1102362204724" imageableX="5.0" imageableY="5.0" orientation="0" width="598.1102362204724" />
<yaoqiang:page background="#FFFFFF" horizontalCount="1" verticalCount="1" />
</extensionElements>
<startEvent id="Event_Start" name="Start">
<outgoing>flow1</outgoing>
<outputSet />
</startEvent>
<serviceTask id="DATA_OWNER_NOTIFICATION" name="Owner notification" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.SentNotificationJavaDelegate">
<extensionElements>
<activiti:field name="notificationCode" stringValue="20" />
</extensionElements>
<incoming>flow1</incoming>
<outgoing>flow2</outgoing>
</serviceTask>
<userTask id="DATA_OWNER_VALIDATOR" name="Data owner validation" implementation="##unspecified">
<extensionElements>
<activiti:field name="validatorRole" stringValue="data_owner" />
</extensionElements>
<incoming>flow2</incoming>
<outgoing>Flow3_OK</outgoing>
<outgoing>Flow3_KO</outgoing>
<multiInstanceLoopCharacteristics activiti:collection="MODULE_ORGANIZATIONAL_UNIT">
<completionCondition xsi:type="tFormalExpression">${ACCEPTED != 'true'}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<serviceTask id="END_KO_NOTIFICATION" name="Event KO notification" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.SentNotificationJavaDelegate">
<extensionElements>
<activiti:field name="notificationCode" stringValue="11" />
</extensionElements>
<incoming>CANCEL</incoming>
<outgoing>Flow_065hvgf</outgoing>
</serviceTask>
<serviceTask id="FINAL_EXEC" name="End" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.LastExecutionJavaDelegate">
<incoming>Flow3_OK</incoming>
<outgoing>Flow_1uee4uh</outgoing>
</serviceTask>
<serviceTask id="FINAL_REJECT_EXEC" name="Reject" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.LastExecutionJavaDelegate">
<incoming>Flow3_KO</incoming>
<outgoing>KO</outgoing>
</serviceTask>
<serviceTask id="CANCEL_EXEC" name="Cancel" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.CancelTaskWorkflowDelegate">
<incoming>KO</incoming>
<outgoing>CANCEL</outgoing>
</serviceTask>
<endEvent id="Event_End" name="End">
<incoming>Flow_065hvgf</incoming>
<incoming>Flow_03tyub3</incoming>
<inputSet />
</endEvent>
<sequenceFlow id="flow1" sourceRef="Event_Start" targetRef="DATA_OWNER_NOTIFICATION" />
<sequenceFlow id="flow2" sourceRef="DATA_OWNER_NOTIFICATION" targetRef="DATA_OWNER_VALIDATOR" />
<sequenceFlow id="Flow3_OK" sourceRef="DATA_OWNER_VALIDATOR" targetRef="FINAL_EXEC">
<conditionExpression xsi:type="tFormalExpression">${ACCEPTED == 'true'}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="Flow3_KO" sourceRef="DATA_OWNER_VALIDATOR" targetRef="FINAL_REJECT_EXEC">
<conditionExpression xsi:type="tFormalExpression">${ACCEPTED == 'false'}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="KO" sourceRef="FINAL_REJECT_EXEC" targetRef="CANCEL_EXEC" />
<sequenceFlow id="CANCEL" sourceRef="CANCEL_EXEC" targetRef="END_KO_NOTIFICATION" />
<sequenceFlow id="Flow_1uee4uh" sourceRef="FINAL_EXEC" targetRef="END_OK_NOTIFICATION" />
<sequenceFlow id="Flow_065hvgf" sourceRef="END_KO_NOTIFICATION" targetRef="Event_End" />
<serviceTask id="END_OK_NOTIFICATION" name="Event OK notification" activiti:class="com.anjana.hermes.functionalities.SentNotificationJavaDelegate">
<extensionElements>
<activiti:field name="notificationCode" stringValue="10" />
</extensionElements>
<incoming>Flow_1uee4uh</incoming>
<outgoing>Flow_03tyub3</outgoing>
</serviceTask>
<sequenceFlow id="Flow_03tyub3" sourceRef="END_OK_NOTIFICATION" targetRef="Event_End" />
</process>
<bpmndi:BPMNDiagram id="Yaoqiang_Diagram-ADHERENCE_-_ARCHITECT" name="Untitled Diagram" resolution="96">
<bpmndi:BPMNPlane bpmnElement="ADHERENCE">
<bpmndi:BPMNEdge id="Yaoqiang-CANCEL" bpmnElement="CANCEL">
<di:waypoint x="742" y="264" />
<di:waypoint x="817" y="264" />
<bpmndi:BPMNLabel>
<dc:Bounds x="906.33" y="253.58" width="6" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Yaoqiang-KO" bpmnElement="KO">
<di:waypoint x="589" y="264" />
<di:waypoint x="657" y="264" />
<bpmndi:BPMNLabel>
<dc:Bounds x="761.32" y="253.58" width="6" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Yaoqiang-Flow3_KO" bpmnElement="Flow3_KO">
<di:waypoint x="342" y="217" />
<di:waypoint x="423" y="217" />
<di:waypoint x="423" y="280" />
<di:waypoint x="504" y="280" />
<bpmndi:BPMNLabel>
<dc:Bounds x="414.5" y="230.08" width="119" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Yaoqiang-Flow3_OK" bpmnElement="Flow3_OK">
<di:waypoint x="342" y="217" />
<di:waypoint x="423" y="217" />
<di:waypoint x="423" y="160" />
<di:waypoint x="504" y="160" />
<bpmndi:BPMNLabel>
<dc:Bounds x="417" y="182.08" width="114" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Yaoqiang-flow2" bpmnElement="flow2">
<di:waypoint x="197.32352941176464" y="216" />
<di:waypoint x="257.32352941176464" y="216" />
<bpmndi:BPMNLabel>
<dc:Bounds x="224.32" y="206.08" width="6" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Yaoqiang-flow1" bpmnElement="flow1">
<di:waypoint x="52.32285357569175" y="216" />
<di:waypoint x="112.32352941176464" y="216" />
<bpmndi:BPMNLabel>
<dc:Bounds x="79.32" y="206.08" width="6" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1uee4uh_di" bpmnElement="Flow_1uee4uh">
<di:waypoint x="589" y="160" />
<di:waypoint x="820" y="160" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_065hvgf_di" bpmnElement="Flow_065hvgf">
<di:waypoint x="902" y="264" />
<di:waypoint x="950" y="264" />
<di:waypoint x="950" y="217" />
<di:waypoint x="1004" y="217" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_03tyub3_di" bpmnElement="Flow_03tyub3">
<di:waypoint x="920" y="180" />
<di:waypoint x="952" y="180" />
<di:waypoint x="952" y="217" />
<di:waypoint x="1004" y="217" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="Yaoqiang-Event_Start" bpmnElement="Event_Start">
<dc:Bounds x="20" y="200" width="32" height="32" />
<bpmndi:BPMNLabel>
<dc:Bounds x="21.5" y="240.08" width="29" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Yaoqiang-DATA_OWNER_NOTIFICATION" bpmnElement="DATA_OWNER_NOTIFICATION">
<dc:Bounds x="112" y="188.5" width="85" height="55" />
<bpmndi:BPMNLabel>
<dc:Bounds x="125.5" y="200.58" width="58" height="34.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Yaoqiang-DATA_OWNER_VALIDATOR" bpmnElement="DATA_OWNER_VALIDATOR">
<dc:Bounds x="257" y="188.5" width="85" height="55" />
<bpmndi:BPMNLabel>
<dc:Bounds x="268" y="200.58" width="63" height="34.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Yaoqiang-FINAL_REJECT_EXEC" bpmnElement="FINAL_REJECT_EXEC">
<dc:Bounds x="504" y="236" width="85" height="55" />
<bpmndi:BPMNLabel>
<dc:Bounds x="673.5" y="255.58" width="36" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Yaoqiang-CANCEL_EXEC" bpmnElement="CANCEL_EXEC">
<dc:Bounds x="657" y="236" width="85" height="55" />
<bpmndi:BPMNLabel>
<dc:Bounds x="817" y="255.58" width="39" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Yaoqiang-FINAL_EXEC" bpmnElement="FINAL_EXEC">
<dc:Bounds x="504" y="132" width="85" height="55" />
<bpmndi:BPMNLabel>
<dc:Bounds x="679.5" y="160.58" width="24" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Yaoqiang-END_OK_NOTIFICATION" bpmnElement="END_KO_NOTIFICATION">
<dc:Bounds x="817" y="236" width="85" height="55" />
<bpmndi:BPMNLabel>
<dc:Bounds x="517.5" y="153.08" width="58" height="34.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_082ilpu_di" bpmnElement="END_OK_NOTIFICATION">
<dc:Bounds x="820" y="140" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Yaoqiang-Event_End_KO" bpmnElement="Event_End">
<dc:Bounds x="1004" y="201" width="32" height="32" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1010" y="240" width="20" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
XML Elements
-
Sequence and tasks. The following elements can be identified in the XML:
-
Tasks that are executed automatically by the system, identified within the XML with serviceTask tags.
-
Tasks that are executed through human interaction. These tasks are represented within userTask tags.
-
Definition of execution sequences, identified with sequenceFlow tags.
-
<process id="ADHERENCE" name="Request of adherence" processType="None" isClosed="false" isExecutable="true">
<extensionElements>
<yaoqiang:description />
<yaoqiang:pageFormat height="841.8897637795276" imageableHeight="831.8897637795276" imageableWidth="588.1102362204724" imageableX="5.0" imageableY="5.0" orientation="0" width="598.1102362204724" />
<yaoqiang:page background="#FFFFFF" horizontalCount="1" verticalCount="1" />
</extensionElements>
<startEvent id="Event_Start" name="Start">
<outgoing>flow1</outgoing>
<outputSet />
</startEvent>
<serviceTask id="DATA_OWNER_NOTIFICATION" name="Owner notification" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.SentNotificationJavaDelegate">
<extensionElements>
<activiti:field name="notificationCode" stringValue="20" />
</extensionElements>
<incoming>flow1</incoming>
<outgoing>flow2</outgoing>
</serviceTask>
<userTask id="DATA_OWNER_VALIDATOR" name="Data owner validation" implementation="##unspecified">
<extensionElements>
<activiti:field name="validatorRole" stringValue="data_owner" />
</extensionElements>
<incoming>flow2</incoming>
<outgoing>Flow3_OK</outgoing>
<outgoing>Flow3_KO</outgoing>
<multiInstanceLoopCharacteristics activiti:collection="MODULE_ORGANIZATIONAL_UNIT">
<completionCondition xsi:type="tFormalExpression">${ACCEPTED != 'true'}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<serviceTask id="END_KO_NOTIFICATION" name="Event KO notification" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.SentNotificationJavaDelegate">
<extensionElements>
<activiti:field name="notificationCode" stringValue="11" />
</extensionElements>
<incoming>CANCEL</incoming>
<outgoing>Flow_065hvgf</outgoing>
</serviceTask>
<serviceTask id="FINAL_EXEC" name="End" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.LastExecutionJavaDelegate">
<incoming>Flow3_OK</incoming>
<outgoing>Flow_1uee4uh</outgoing>
</serviceTask>
<serviceTask id="FINAL_REJECT_EXEC" name="Reject" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.LastExecutionJavaDelegate">
<incoming>Flow3_KO</incoming>
<outgoing>KO</outgoing>
</serviceTask>
<serviceTask id="CANCEL_EXEC" name="Cancel" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.CancelTaskWorkflowDelegate">
<incoming>KO</incoming>
<outgoing>CANCEL</outgoing>
</serviceTask>
<endEvent id="Event_End" name="End">
<incoming>Flow_065hvgf</incoming>
<incoming>Flow_03tyub3</incoming>
<inputSet />
</endEvent>
<sequenceFlow id="flow1" sourceRef="Event_Start" targetRef="DATA_OWNER_NOTIFICATION" />
<sequenceFlow id="flow2" sourceRef="DATA_OWNER_NOTIFICATION" targetRef="DATA_OWNER_VALIDATOR" />
<sequenceFlow id="Flow3_OK" sourceRef="DATA_OWNER_VALIDATOR" targetRef="FINAL_EXEC">
<conditionExpression xsi:type="tFormalExpression">${ACCEPTED == 'true'}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="Flow3_KO" sourceRef="DATA_OWNER_VALIDATOR" targetRef="FINAL_REJECT_EXEC">
<conditionExpression xsi:type="tFormalExpression">${ACCEPTED == 'false'}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="KO" sourceRef="FINAL_REJECT_EXEC" targetRef="CANCEL_EXEC" />
<sequenceFlow id="CANCEL" sourceRef="CANCEL_EXEC" targetRef="END_KO_NOTIFICATION" />
<sequenceFlow id="Flow_1uee4uh" sourceRef="FINAL_EXEC" targetRef="END_OK_NOTIFICATION" />
<sequenceFlow id="Flow_065hvgf" sourceRef="END_KO_NOTIFICATION" targetRef="Event_End" />
<serviceTask id="END_OK_NOTIFICATION" name="Event OK notification" activiti:class="com.anjana.hermes.functionalities.SentNotificationJavaDelegate">
<extensionElements>
<activiti:field name="notificationCode" stringValue="10" />
</extensionElements>
<incoming>Flow_1uee4uh</incoming>
<outgoing>Flow_03tyub3</outgoing>
</serviceTask>
<sequenceFlow id="Flow_03tyub3" sourceRef="END_OK_NOTIFICATION" targetRef="Event_End" />
</process>
Among the various tasks that can be defined at this point, the following are implemented:
-
CancelTaskWorkflowDelegate. This task cancels the indicated workflow.
-
LastExecutionJavaDelegate. Calls the endpoint responsible for performing the last execution of the workflow depending on the affected object and object type.
-
SentNotificationJavaDelegate. This task is responsible for sending notifications according to the task in question and its status.
Another feature of these tasks is that they indicate which workflow sequence activates them and which is the next sequence to execute. This is indicated with the incoming and outgoing tags.
<serviceTask id="FINAL_EXEC" name="End" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.LastExecutionJavaDelegate">
<incoming>Flow3_OK</incoming>
<outgoing>Flow_1uee4uh</outgoing>
</serviceTask>
In the definition of workflow sequences, a condition can be specified that, when true, will cause that sequence to execute. This feature, together with the previous one concerning tasks where the next step to execute is specified, will allow us to define branching within the workflow.
<sequenceFlow id="Flow3_OK" sourceRef="DATA_OWNER_VALIDATOR" targetRef="FINAL_EXEC">
<conditionExpression xsi:type="tFormalExpression">${ACCEPTED == 'true'}</conditionExpression>
</sequenceFlow>
User tasks are used to allow prior validation of a specific automatic task when necessary. The elements of this task are as follows:
-
activity:field name="validatorRole". Indicates the role of who must perform the validation.
-
incoming. Indicates the workflow sequence that originates this task.
-
outgoing. Indicates which workflow sequence will be generated depending on the response given. In the example, we define two possibilities corresponding to a correct or incorrect validation.
-
completionCondition. Condition that must be met to consider the task as completed.
The way to orchestrate the various tasks, both automatic and non-automatic, is done through the workflow sequences explained above.
-
Definition of graphical structure. We recall that this definition is established by opening and saving the XML using the Yaoqiang BPMN Editor application.
<bpmndi:BPMNDiagram id="Yaoqiang_Diagram-ADHERENCE_-_ARCHITECT" name="Untitled Diagram" resolution="96">
<bpmndi:BPMNPlane bpmnElement="ADHERENCE">
<bpmndi:BPMNEdge id="Yaoqiang-CANCEL" bpmnElement="CANCEL">
<di:waypoint x="742" y="264" />
<di:waypoint x="817" y="264" />
<bpmndi:BPMNLabel>
<dc:Bounds x="906.33" y="253.58" width="6" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Yaoqiang-KO" bpmnElement="KO">
<di:waypoint x="589" y="264" />
<di:waypoint x="657" y="264" />
<bpmndi:BPMNLabel>
<dc:Bounds x="761.32" y="253.58" width="6" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Yaoqiang-Flow3_KO" bpmnElement="Flow3_KO">
<di:waypoint x="342" y="217" />
<di:waypoint x="423" y="217" />
<di:waypoint x="423" y="280" />
<di:waypoint x="504" y="280" />
<bpmndi:BPMNLabel>
<dc:Bounds x="414.5" y="230.08" width="119" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Yaoqiang-Flow3_OK" bpmnElement="Flow3_OK">
<di:waypoint x="342" y="217" />
<di:waypoint x="423" y="217" />
<di:waypoint x="423" y="160" />
<di:waypoint x="504" y="160" />
<bpmndi:BPMNLabel>
<dc:Bounds x="417" y="182.08" width="114" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Yaoqiang-flow2" bpmnElement="flow2">
<di:waypoint x="197.32352941176464" y="216" />
<di:waypoint x="257.32352941176464" y="216" />
<bpmndi:BPMNLabel>
<dc:Bounds x="224.32" y="206.08" width="6" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Yaoqiang-flow1" bpmnElement="flow1">
<di:waypoint x="52.32285357569175" y="216" />
<di:waypoint x="112.32352941176464" y="216" />
<bpmndi:BPMNLabel>
<dc:Bounds x="79.32" y="206.08" width="6" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1uee4uh_di" bpmnElement="Flow_1uee4uh">
<di:waypoint x="589" y="160" />
<di:waypoint x="820" y="160" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_065hvgf_di" bpmnElement="Flow_065hvgf">
<di:waypoint x="902" y="264" />
<di:waypoint x="950" y="264" />
<di:waypoint x="950" y="217" />
<di:waypoint x="1004" y="217" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_03tyub3_di" bpmnElement="Flow_03tyub3">
<di:waypoint x="920" y="180" />
<di:waypoint x="952" y="180" />
<di:waypoint x="952" y="217" />
<di:waypoint x="1004" y="217" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="Yaoqiang-Event_Start" bpmnElement="Event_Start">
<dc:Bounds x="20" y="200" width="32" height="32" />
<bpmndi:BPMNLabel>
<dc:Bounds x="21.5" y="240.08" width="29" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Yaoqiang-DATA_OWNER_NOTIFICATION" bpmnElement="DATA_OWNER_NOTIFICATION">
<dc:Bounds x="112" y="188.5" width="85" height="55" />
<bpmndi:BPMNLabel>
<dc:Bounds x="125.5" y="200.58" width="58" height="34.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Yaoqiang-DATA_OWNER_VALIDATOR" bpmnElement="DATA_OWNER_VALIDATOR">
<dc:Bounds x="257" y="188.5" width="85" height="55" />
<bpmndi:BPMNLabel>
<dc:Bounds x="268" y="200.58" width="63" height="34.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Yaoqiang-FINAL_REJECT_EXEC" bpmnElement="FINAL_REJECT_EXEC">
<dc:Bounds x="504" y="236" width="85" height="55" />
<bpmndi:BPMNLabel>
<dc:Bounds x="673.5" y="255.58" width="36" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Yaoqiang-CANCEL_EXEC" bpmnElement="CANCEL_EXEC">
<dc:Bounds x="657" y="236" width="85" height="55" />
<bpmndi:BPMNLabel>
<dc:Bounds x="817" y="255.58" width="39" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Yaoqiang-FINAL_EXEC" bpmnElement="FINAL_EXEC">
<dc:Bounds x="504" y="132" width="85" height="55" />
<bpmndi:BPMNLabel>
<dc:Bounds x="679.5" y="160.58" width="24" height="19.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Yaoqiang-END_OK_NOTIFICATION" bpmnElement="END_KO_NOTIFICATION">
<dc:Bounds x="817" y="236" width="85" height="55" />
<bpmndi:BPMNLabel>
<dc:Bounds x="517.5" y="153.08" width="58" height="34.84" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_082ilpu_di" bpmnElement="END_OK_NOTIFICATION">
<dc:Bounds x="820" y="140" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Yaoqiang-Event_End_KO" bpmnElement="Event_End">
<dc:Bounds x="1004" y="201" width="32" height="32" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1010" y="240" width="20" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>