Configuration

Workflows in XML

Workflow configuration can also be done manually using an XML file. This process is inherently more complex because you need to know in advance the format that the definition of an Activiti workflow will have. Fortunately, these XML files usually follow a schema where the structure of these files is established. For the case at hand, you can consult https://www.omg.org/spec/BPMN/2.0/PDF.

Looking at the content of the file, it can be divided into two clearly differentiated parts.

First, there is the definition of the workflow sequence and the tasks executed by each of these sequences.

Second, the graphical structure is established, which will allow the administration front-end mentioned in the previous point to be used. In order to generate this graphical structure, the file must first be opened and saved using the Yaoqiang BPMN Editor tool.

As a configuration example, we will show the format of the diagram generated with Activiti. The areas where the activities performed by each workflow sequence are defined can be clearly seen:

XML
<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 is defined, along with the Java class responsible for implementing it. We can also see that it indicates the workflow sequence that originates this task is called "flow1", and that once it finishes, the "flowN2" task will be executed.


An example where these workflow sequences are defined would be:

XML
<sequenceFlow id="flow1" sourceRef="Event_Start" targetRef="PROCESSOWNER_NOTIFICATION" />

<sequenceFlow id="flowN2" sourceRef="PROCESSOWNER_NOTIFICATION" targetRef="PROCESSOWNER_VALIDATOR" />


It can be seen 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

https://lh7-rt.googleusercontent.com/docsz/AD_4nXdu6wnLgS87BJAsWvrmpYgq7AJRPIwBtJwVxPLkwU41W7wlwgRvn288_JnC_dr42JOBXwRrmPEr8kbSVSQwbYEsXFvHjndC3aefJPD6FN-887fVgxDJl4QinJy-DrBr2tRCSRVReXnQ2gUvnv5O_SJexXOp?key=VuGvqD0xqkUCXHbH5grjaQ


The generated xml would be as follows:

XML
<?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 the serviceTask tags.

    • Tasks that are executed through human interaction. These tasks are represented within the userTask tags.

    • Definition of execution sequences, identified with the sequenceFlow tags.

XML
<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 different tasks that can currently be defined, 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 be executed. This is indicated with the incoming and outcoming tags.

XML
<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 the workflow sequences, a condition can be specified that, when true, will execute that sequence. This feature, together with the previous one for tasks where the next step to execute is specified, will allow us to define branches within the workflow.


XML
<sequenceFlow id="Flow3_OK" sourceRef="DATA_OWNER_VALIDATOR" targetRef="FINAL_EXEC">
      <conditionExpression xsi:type="tFormalExpression">${ACCEPTED == 'true'}</conditionExpression>
</sequenceFlow>


User tasks are used to have prior validation of a given automatic task if necessary. The elements of this task are as follows:


https://lh7-rt.googleusercontent.com/docsz/AD_4nXdHOU71tT1HhD3cf7jPLKd2hrL7fmYb0ZyLSVsbALzY-DpzdNkvS4MLiRm_4fyPDjNqCQxNrwXQf8Me9w49MxxfAHh6IIv8_04KPlN54jiSNnCZMjipuMP8W29HkUUGyHGQqzXpiMFzUAyqSCkMK1f3muA0?key=VuGvqD0xqkUCXHbH5grjaQ


  • activity:field name="validatorRole". Indicates the role of the person who must perform the validation.

  • incoming. Indicates the workflow sequence that originates this task.

  • outgoing. Indicates which workflow sequence will be generated based 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 finished.


The way of orchestrating the different tasks, both automatic and non-automatic, is done through the workflow sequences explained above.

  • Definition of the graphical structure. Recall that this definition is established by opening and saving the xml using the Yaoqiang BPMN Editor application.

XML
<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>