bpmn-io / bpmnlint

Validate BPMN diagrams based on configurable lint rules.
MIT License
119 stars 36 forks source link

`no-implicit-start` doesn't consider boundary events #105

Closed nhomble closed 1 year ago

nhomble commented 1 year ago

Describe the Bug

bpmnlint reports no-implicit-start on boundary events branching from a subprocess (for example a timer event). This seems like a common use case and an oversight in the rule. The rule checks for bpmn:StartEvent but doesn't seem to consider bpmn:timerEventDefinition.

Steps to Reproduce

  1. Given a bpmn
  2. With a subprocess
  3. And a timer boundary event
  4. When bpmnlint is ran
  5. Then an error occurs on the timer event node

Expected Behavior

I would expect this to succeed.

Environment

nhomble commented 1 year ago

repro-no-implicit-start

  Event_1x4m35h  error  Element is an implicit start  no-implicit-start
nhomble commented 1 year ago
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1nocwgb" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.11.0" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.2.0">
  <bpmn:process id="Process_0i57bwz" isExecutable="true">
    <bpmn:startEvent id="StartEvent_1" name="parent start">
      <bpmn:outgoing>Flow_0bu3icg</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:subProcess id="Activity_18ubf90">
      <bpmn:incoming>Flow_0bu3icg</bpmn:incoming>
      <bpmn:outgoing>Flow_0pdcwa4</bpmn:outgoing>
      <bpmn:startEvent id="Event_023wu9j" name="inner start">
        <bpmn:outgoing>Flow_16efqxk</bpmn:outgoing>
      </bpmn:startEvent>
      <bpmn:endEvent id="Event_1my5vhq" name="inner end">
        <bpmn:incoming>Flow_16efqxk</bpmn:incoming>
      </bpmn:endEvent>
      <bpmn:sequenceFlow id="Flow_16efqxk" sourceRef="Event_023wu9j" targetRef="Event_1my5vhq" />
    </bpmn:subProcess>
    <bpmn:sequenceFlow id="Flow_0bu3icg" sourceRef="StartEvent_1" targetRef="Activity_18ubf90" />
    <bpmn:endEvent id="Event_0vvi83j" name="end">
      <bpmn:incoming>Flow_0pdcwa4</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_0pdcwa4" sourceRef="Activity_18ubf90" targetRef="Event_0vvi83j" />
    <bpmn:endEvent id="Event_082t5hz" name="timeout">
      <bpmn:incoming>Flow_1onvoer</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_1onvoer" sourceRef="Event_1x4m35h" targetRef="Event_082t5hz" />
    <bpmn:boundaryEvent id="Event_1x4m35h" name="timeout" attachedToRef="Activity_18ubf90">
      <bpmn:outgoing>Flow_1onvoer</bpmn:outgoing>
      <bpmn:timerEventDefinition id="TimerEventDefinition_06rgs6y">
        <bpmn:timeDuration xsi:type="bpmn:tFormalExpression">P1D</bpmn:timeDuration>
      </bpmn:timerEventDefinition>
    </bpmn:boundaryEvent>
  </bpmn:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_0i57bwz">
      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
        <dc:Bounds x="179" y="159" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="169" y="202" width="56" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Event_0vvi83j_di" bpmnElement="Event_0vvi83j">
        <dc:Bounds x="702" y="159" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="711" y="202" width="19" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Event_082t5hz_di" bpmnElement="Event_082t5hz">
        <dc:Bounds x="452" y="342" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="452" y="385" width="37" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_18ubf90_di" bpmnElement="Activity_18ubf90" isExpanded="true">
        <dc:Bounds x="280" y="77" width="350" height="200" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Event_023wu9j_di" bpmnElement="Event_023wu9j">
        <dc:Bounds x="320" y="159" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="314" y="202" width="49" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Event_1my5vhq_di" bpmnElement="Event_1my5vhq">
        <dc:Bounds x="412" y="159" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="407" y="202" width="46" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="Flow_16efqxk_di" bpmnElement="Flow_16efqxk">
        <di:waypoint x="356" y="177" />
        <di:waypoint x="412" y="177" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="Event_13dbj4q_di" bpmnElement="Event_1x4m35h">
        <dc:Bounds x="362" y="259" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="362" y="302" width="37" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="Flow_0bu3icg_di" bpmnElement="Flow_0bu3icg">
        <di:waypoint x="215" y="177" />
        <di:waypoint x="280" y="177" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_0pdcwa4_di" bpmnElement="Flow_0pdcwa4">
        <di:waypoint x="630" y="177" />
        <di:waypoint x="702" y="177" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_1onvoer_di" bpmnElement="Flow_1onvoer">
        <di:waypoint x="380" y="295" />
        <di:waypoint x="380" y="360" />
        <di:waypoint x="452" y="360" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>
nikku commented 1 year ago

Thanks for reporting. I'll look into a fix.

nikku commented 1 year ago

Will be addressed via https://github.com/bpmn-io/bpmnlint/pull/106, along with other scenarios.

nikku commented 1 year ago

Fixed with v8.3.2. Thanks again for reporting.