Saya merancang proses bpmn yang tidak lengkap di bpmn.io (lihat xml di bawah, Anda dapat memuatnya ke pemodel di bpmn.io ).
Pada langkah selanjutnya saya menulis fungsi validasi sederhana menurut panduan ini. Fungsinya juga ada di bawah.
Masalahnya
Masalah saya adalah, tidak ada kesalahan yang terjadi meskipun model tampaknya tidak valid (tidak ada endEvent dan hanya satu sequenceFlow yang keluar dari gateway xor). Metode validasiModel dari kelas BPMN hanya memanggil metode yang sama dari parser internalnya. Apakah saya melewatkan sesuatu seperti mendefinisikan skema sebelumnya atau apakah saya benar-benar salah memahami seperti apa bpmn yang valid dan bagaimana cara memvalidasinya?
Metode Validasi
public String validateModel(String modelString) {
String message = "";
try {
InputStream stream = new ByteArrayInputStream(modelString.getBytes(Charset.forName("UTF-8")));
BpmnParser parser = new BpmnParser();
BpmnModelInstance modelinstance = parser.parseModelFromStream(stream);
parser.validateModel(modelinstance.getDocument());
Bpmn.validateModel(modelinstance); //does the same as above, just added for completeness
message = "Model is conform!";
} catch (Exception e) {
message = e.getMessage();
}
return message;
}
Konten XML BPMN
<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" 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" id="sample-diagram" targetNamespace="http://bpmn.io/schema/bpmn" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
<bpmn2:process id="Process_1" isExecutable="false">
<bpmn2:startEvent id="StartEvent_1">
<bpmn2:outgoing>SequenceFlow_061afhx</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:task id="Task_06azz4c">
<bpmn2:incoming>SequenceFlow_061afhx</bpmn2:incoming>
<bpmn2:outgoing>SequenceFlow_0lw11e7</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:sequenceFlow id="SequenceFlow_061afhx" sourceRef="StartEvent_1" targetRef="Task_06azz4c" />
<bpmn2:exclusiveGateway id="ExclusiveGateway_0eezp6n">
<bpmn2:incoming>SequenceFlow_0lw11e7</bpmn2:incoming>
<bpmn2:outgoing>SequenceFlow_06uvwwf</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:sequenceFlow id="SequenceFlow_0lw11e7" sourceRef="Task_06azz4c" targetRef="ExclusiveGateway_0eezp6n" />
<bpmn2:task id="Task_1j0gerp">
<bpmn2:incoming>SequenceFlow_06uvwwf</bpmn2:incoming>
</bpmn2:task>
<bpmn2:sequenceFlow id="SequenceFlow_06uvwwf" sourceRef="ExclusiveGateway_0eezp6n" targetRef="Task_1j0gerp" />
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="412" y="240" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Task_06azz4c_di" bpmnElement="Task_06azz4c">
<dc:Bounds x="647" y="218" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="SequenceFlow_061afhx_di" bpmnElement="SequenceFlow_061afhx">
<di:waypoint xsi:type="dc:Point" x="448" y="258" />
<di:waypoint xsi:type="dc:Point" x="503" y="258" />
<di:waypoint xsi:type="dc:Point" x="503" y="258" />
<di:waypoint xsi:type="dc:Point" x="647" y="258" />
<bpmndi:BPMNLabel>
<dc:Bounds x="457" y="253" width="90" height="20" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="ExclusiveGateway_0eezp6n_di" bpmnElement="ExclusiveGateway_0eezp6n" isMarkerVisible="true">
<dc:Bounds x="672" y="60" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="652" y="110" width="90" height="20" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="SequenceFlow_0lw11e7_di" bpmnElement="SequenceFlow_0lw11e7">
<di:waypoint xsi:type="dc:Point" x="697" y="218" />
<di:waypoint xsi:type="dc:Point" x="697" y="110" />
<bpmndi:BPMNLabel>
<dc:Bounds x="631" y="97" width="90" height="20" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="Task_1j0gerp_di" bpmnElement="Task_1j0gerp">
<dc:Bounds x="899" y="45" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="SequenceFlow_06uvwwf_di" bpmnElement="SequenceFlow_06uvwwf">
<di:waypoint xsi:type="dc:Point" x="722" y="85" />
<di:waypoint xsi:type="dc:Point" x="899" y="85" />
<bpmndi:BPMNLabel>
<dc:Bounds x="765.5" y="75" width="90" height="20" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>