Search code examples
xmlvalidationbpmncamundabpmn.io

Camunda BPMN validation successful although model is incomplete


I designed an incomplete bpmn process in bpmn.io (see the xml below, you can load it into the modeler on bpmn.io).

In the next step I wrote a simple validation function according to this guide. The function is also below.

The Problem

My Problem is, that there is no error thrown although the model seems to be invalid (no endEvent and just one sequenceFlow going out of an xor gateway). The validateModel method from the BPMN class just calls the same method from it's internal parser. Did I miss something like to define the scheme in before or did I just completely misunderstood what a valid bpmn looks like and how to validate it?

Validation Method

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;
}

BPMN XML Content

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

Solution

  • Your model is a valid BPMN model. The validation checks the XML file against the XSD scheme. That does not and cannot check if you model is good in the sense that it is good designed or consistent.