public <FlowElementType extends FlowElement> List<FlowElementType> findFlowElementsInSubProcessOfType(SubProcess subProcess, Class<FlowElementType> type) { return findFlowElementsInSubProcessOfType(subProcess, type, true); }
public <FlowElementType extends FlowElement> List<FlowElementType> findFlowElementsInSubProcessOfType(SubProcess subProcess, Class<FlowElementType> type) { return findFlowElementsInSubProcessOfType(subProcess, type, true); }
@SuppressWarnings("unchecked") public <FlowElementType extends FlowElement> List<FlowElementType> findFlowElementsOfType(Class<FlowElementType> type, boolean goIntoSubprocesses) { List<FlowElementType> foundFlowElements = new ArrayList<>(); for (FlowElement flowElement : this.getFlowElements()) { if (type.isInstance(flowElement)) { foundFlowElements.add((FlowElementType) flowElement); } if (flowElement instanceof SubProcess) { if (goIntoSubprocesses) { foundFlowElements.addAll(findFlowElementsInSubProcessOfType((SubProcess) flowElement, type)); } } } return foundFlowElements; }
@SuppressWarnings("unchecked") public <FlowElementType extends FlowElement> List<FlowElementType> findFlowElementsInSubProcessOfType(SubProcess subProcess, Class<FlowElementType> type, boolean goIntoSubprocesses) { List<FlowElementType> foundFlowElements = new ArrayList<>(); for (FlowElement flowElement : subProcess.getFlowElements()) { if (type.isInstance(flowElement)) { foundFlowElements.add((FlowElementType) flowElement); } if (flowElement instanceof SubProcess) { if (goIntoSubprocesses) { foundFlowElements.addAll(findFlowElementsInSubProcessOfType((SubProcess) flowElement, type)); } } } return foundFlowElements; }
@SuppressWarnings("unchecked") public <FlowElementType extends FlowElement> List<FlowElementType> findFlowElementsOfType(Class<FlowElementType> type, boolean goIntoSubprocesses) { List<FlowElementType> foundFlowElements = new ArrayList<>(); for (FlowElement flowElement : this.getFlowElements()) { if (type.isInstance(flowElement)) { foundFlowElements.add((FlowElementType) flowElement); } if (flowElement instanceof SubProcess) { if (goIntoSubprocesses) { foundFlowElements.addAll(findFlowElementsInSubProcessOfType((SubProcess) flowElement, type)); } } } return foundFlowElements; }
@SuppressWarnings("unchecked") public <FlowElementType extends FlowElement> List<FlowElementType> findFlowElementsInSubProcessOfType(SubProcess subProcess, Class<FlowElementType> type, boolean goIntoSubprocesses) { List<FlowElementType> foundFlowElements = new ArrayList<>(); for (FlowElement flowElement : subProcess.getFlowElements()) { if (type.isInstance(flowElement)) { foundFlowElements.add((FlowElementType) flowElement); } if (flowElement instanceof SubProcess) { if (goIntoSubprocesses) { foundFlowElements.addAll(findFlowElementsInSubProcessOfType((SubProcess) flowElement, type)); } } } return foundFlowElements; }
@Override protected void executeValidation(BpmnModel bpmnModel, Process process, List<ValidationError> errors) { List<SubProcess> subProcesses = process.findFlowElementsOfType(SubProcess.class); for (SubProcess subProcess : subProcesses) { if (!(subProcess instanceof EventSubProcess)) { // Verify start events List<StartEvent> startEvents = process.findFlowElementsInSubProcessOfType(subProcess, StartEvent.class, false); if (startEvents.size() > 1) { addError(errors, Problems.SUBPROCESS_MULTIPLE_START_EVENTS, process, subProcess, "Multiple start events not supported for subprocess"); } for (StartEvent startEvent : startEvents) { if (!startEvent.getEventDefinitions().isEmpty()) { addError(errors, Problems.SUBPROCESS_START_EVENT_EVENT_DEFINITION_NOT_ALLOWED, process, startEvent, "event definitions only allowed on start event if subprocess is an event subprocess"); } } } } }
@Override protected void executeValidation(BpmnModel bpmnModel, Process process, List<ValidationError> errors) { List<EventSubProcess> eventSubprocesses = process.findFlowElementsOfType(EventSubProcess.class); for (EventSubProcess eventSubprocess : eventSubprocesses) { List<StartEvent> startEvents = process.findFlowElementsInSubProcessOfType(eventSubprocess, StartEvent.class); for (StartEvent startEvent : startEvents) { if (startEvent.getEventDefinitions() != null && !startEvent.getEventDefinitions().isEmpty()) { EventDefinition eventDefinition = startEvent.getEventDefinitions().get(0); if (!(eventDefinition instanceof org.flowable.bpmn.model.ErrorEventDefinition) && !(eventDefinition instanceof MessageEventDefinition) && !(eventDefinition instanceof SignalEventDefinition) && !(eventDefinition instanceof TimerEventDefinition)) { addError(errors, Problems.EVENT_SUBPROCESS_INVALID_START_EVENT_DEFINITION, process, eventSubprocess, "start event of event subprocess must be of type 'error', 'timer', 'message' or 'signal'"); } } } } }