@Override protected String getStencilId(BaseElement baseElement) { EndEvent endEvent = (EndEvent) baseElement; List<EventDefinition> eventDefinitions = endEvent.getEventDefinitions(); if (eventDefinitions.size() != 1) { return STENCIL_EVENT_END_NONE; } EventDefinition eventDefinition = eventDefinitions.get(0); if (eventDefinition instanceof ErrorEventDefinition) { return STENCIL_EVENT_END_ERROR; } else if (eventDefinition instanceof CancelEventDefinition) { return STENCIL_EVENT_END_CANCEL; } else if (eventDefinition instanceof TerminateEventDefinition) { return STENCIL_EVENT_END_TERMINATE; } else { return STENCIL_EVENT_END_NONE; } }
public TerminateEndEventActivityBehavior(EndEvent endEvent) { this.endEvent = endEvent.clone(); // Terminate all attribute if (endEvent.getEventDefinitions() != null) { for (EventDefinition eventDefinition : endEvent.getEventDefinitions()) { if (eventDefinition instanceof TerminateEventDefinition) { TerminateEventDefinition terminateEventDefinition = (TerminateEventDefinition) eventDefinition; if (terminateEventDefinition.isTerminateAll()) { this.terminateAll = true; break; } } } } }
process.addFlowElement(userTask); EndEvent endEvent = new EndEvent(); endEvent.setId(dynamicUserTaskBuilder.nextEndEventId(process.getFlowElementMap())); process.addFlowElement(endEvent); process.addFlowElement(flowToUserTask); SequenceFlow flowFromUserTask = new SequenceFlow(userTask.getId(), endEvent.getId()); flowFromUserTask.setId(dynamicUserTaskBuilder.nextFlowId(process.getFlowElementMap())); process.addFlowElement(flowFromUserTask); bpmnModel.addGraphicInfo(endEvent.getId(), endGraphicInfo);
@Override protected FlowElement convertJsonToElement(JsonNode elementNode, JsonNode modelNode, Map<String, JsonNode> shapeMap) { EndEvent endEvent = new EndEvent(); String stencilId = BpmnJsonConverterUtil.getStencilId(elementNode); if (STENCIL_EVENT_END_ERROR.equals(stencilId)) { convertJsonToErrorDefinition(elementNode, endEvent); } else if (STENCIL_EVENT_END_CANCEL.equals(stencilId)) { CancelEventDefinition eventDefinition = new CancelEventDefinition(); endEvent.getEventDefinitions().add(eventDefinition); } else if (STENCIL_EVENT_END_TERMINATE.equals(stencilId)) { TerminateEventDefinition eventDefinition = new TerminateEventDefinition(); String terminateAllStringValue = getPropertyValueAsString(PROPERTY_TERMINATE_ALL, elementNode); if (StringUtils.isNotEmpty(terminateAllStringValue)) { eventDefinition.setTerminateAll("true".equals(terminateAllStringValue)); } String terminateMiStringValue = getPropertyValueAsString(PROPERTY_TERMINATE_MULTI_INSTANCE, elementNode); if (StringUtils.isNotEmpty(terminateMiStringValue)) { eventDefinition.setTerminateMultiInstance("true".equals(terminateMiStringValue)); } endEvent.getEventDefinitions().add(eventDefinition); } return endEvent; } }
if (!endEvent.getEventDefinitions().isEmpty()) { eventDefinition = endEvent.getEventDefinitions().get(0); String errorCode = bpmnParse.getBpmnModel().getErrors().get(errorDefinition.getErrorCode()); if (StringUtils.isEmpty(errorCode)) { LOGGER.warn("errorCode is required for an error event {}", endEvent.getId()); ScopeImpl scope = bpmnParse.getCurrentScope(); if (scope.getProperty("type") == null || !scope.getProperty("type").equals("transaction")) { LOGGER.warn("end event with cancelEventDefinition only supported inside transaction subprocess (id={})", endEvent.getId()); } else { endEventActivity.setProperty("type", "cancelEndEvent"); endEventActivity.setAsync(endEvent.isAsynchronous()); endEventActivity.setExclusive(!endEvent.isNotExclusive()); endEventActivity.setActivityBehavior(bpmnParse.getActivityBehaviorFactory().createTerminateEndEventActivityBehavior(endEvent)); endEventActivity.setAsync(endEvent.isAsynchronous()); endEventActivity.setExclusive(!endEvent.isNotExclusive()); endEventActivity.setActivityBehavior(bpmnParse.getActivityBehaviorFactory().createNoneEndEventActivityBehavior(endEvent));
@Override protected void executeParse(BpmnParse bpmnParse, EndEvent endEvent) { EventDefinition eventDefinition = null; if (endEvent.getEventDefinitions().size() > 0) { eventDefinition = endEvent.getEventDefinitions().get(0); if (eventDefinition instanceof ErrorEventDefinition) { ErrorEventDefinition errorDefinition = (ErrorEventDefinition) eventDefinition; if (bpmnParse.getBpmnModel().containsErrorRef(errorDefinition.getErrorCode())) { String errorCode = bpmnParse.getBpmnModel().getErrors().get(errorDefinition.getErrorCode()); if (StringUtils.isEmpty(errorCode)) { LOGGER.warn("errorCode is required for an error event {}", endEvent.getId()); } } endEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createErrorEndEventActivityBehavior(endEvent, errorDefinition)); } else if (eventDefinition instanceof TerminateEventDefinition) { endEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createTerminateEndEventActivityBehavior(endEvent)); } else if (eventDefinition instanceof CancelEventDefinition) { endEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createCancelEndEventActivityBehavior(endEvent)); } else { endEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createNoneEndEventActivityBehavior(endEvent)); } } else { endEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createNoneEndEventActivityBehavior(endEvent)); } }
/** * Since the 'one task process' is used everywhere the actual process content doesn't matter, instead of copying around the BPMN 2.0 xml one could use this method which gives a {@link BpmnModel} * version of the same process back. */ public BpmnModel createOneTaskTestProcess() { BpmnModel model = new BpmnModel(); org.flowable.bpmn.model.Process process = new org.flowable.bpmn.model.Process(); model.addProcess(process); process.setId("oneTaskProcess"); process.setName("The one task process"); StartEvent startEvent = new StartEvent(); startEvent.setId("start"); startEvent.setName("The start"); process.addFlowElement(startEvent); UserTask userTask = new UserTask(); userTask.setName("The Task"); userTask.setId("theTask"); userTask.setAssignee("kermit"); process.addFlowElement(userTask); EndEvent endEvent = new EndEvent(); endEvent.setId("theEnd"); endEvent.setName("The end"); process.addFlowElement(endEvent); process.addFlowElement(new SequenceFlow("start", "theTask")); process.addFlowElement(new SequenceFlow("theTask", "theEnd")); return model; }
public BpmnModel createTwoTasksTestProcess() { BpmnModel model = new BpmnModel(); org.flowable.bpmn.model.Process process = new org.flowable.bpmn.model.Process(); model.addProcess(process); process.setId("twoTasksProcess"); process.setName("The two tasks process"); StartEvent startEvent = new StartEvent(); startEvent.setId("start"); process.addFlowElement(startEvent); UserTask userTask = new UserTask(); userTask.setName("The First Task"); userTask.setId("task1"); userTask.setAssignee("kermit"); process.addFlowElement(userTask); UserTask userTask2 = new UserTask(); userTask2.setName("The Second Task"); userTask2.setId("task2"); userTask2.setAssignee("kermit"); process.addFlowElement(userTask2); EndEvent endEvent = new EndEvent(); endEvent.setId("theEnd"); process.addFlowElement(endEvent); process.addFlowElement(new SequenceFlow("start", "task1")); process.addFlowElement(new SequenceFlow("start", "task2")); process.addFlowElement(new SequenceFlow("task1", "theEnd")); process.addFlowElement(new SequenceFlow("task2", "theEnd")); return model; }
@Override protected BaseElement convertXMLToElement(XMLStreamReader xtr, BpmnModel model) throws Exception { EndEvent endEvent = new EndEvent(); BpmnXMLUtil.addXMLLocation(endEvent, xtr); parseChildElements(getXMLElementName(), endEvent, model, xtr); return endEvent; }
protected boolean isEndEventInMultiInstanceSubprocess(ExecutionEntity executionEntity) { if (executionEntity.getCurrentFlowElement() instanceof EndEvent) { SubProcess subProcess = ((EndEvent) execution.getCurrentFlowElement()).getSubProcess(); return !executionEntity.getParent().isProcessInstanceType() && subProcess != null && subProcess.getLoopCharacteristics() != null && subProcess.getBehavior() instanceof MultiInstanceActivityBehavior; } return false; }
EndEvent endEvent = new EndEvent(); endEvent.setId(dynamicEmbeddedSubProcessBuilder.nextEndEventId(process.getFlowElementMap())); process.addFlowElement(endEvent); process.addFlowElement(flowToSubProcess); SequenceFlow flowFromSubProcess = new SequenceFlow(subProcess.getId(), endEvent.getId()); flowFromSubProcess.setId(dynamicEmbeddedSubProcessBuilder.nextFlowId(process.getFlowElementMap())); process.addFlowElement(flowFromSubProcess); bpmnModel.addGraphicInfo(endEvent.getId(), endGraphicInfo);
parentSubProcess.addFlowElement(forkFlow2); EndEvent endEvent = new EndEvent(); endEvent.setId(dynamicEmbeddedSubProcessBuilder.nextEndEventId(process.getFlowElementMap())); parentSubProcess.addFlowElement(endEvent); parentSubProcess.addFlowElement(joinFlow2); SequenceFlow endFlow = new SequenceFlow(join.getId(), endEvent.getId()); endFlow.setId(dynamicEmbeddedSubProcessBuilder.nextFlowId(process.getFlowElementMap())); parentSubProcess.addFlowElement(endFlow); bpmnModel.addGraphicInfo(endEvent.getId(), endGraphicInfo);
@Override protected void writeAdditionalChildElements(BaseElement element, BpmnModel model, XMLStreamWriter xtw) throws Exception { EndEvent endEvent = (EndEvent) element; writeEventDefinitions(endEvent, endEvent.getEventDefinitions(), model, xtw); } }
subProcess.addFlowElement(forkFlow2); EndEvent endEvent = new EndEvent(); endEvent.setId(dynamicUserTaskBuilder.nextEndEventId(process.getFlowElementMap())); subProcess.addFlowElement(endEvent); subProcess.addFlowElement(joinFlow2); SequenceFlow endFlow = new SequenceFlow(join.getId(), endEvent.getId()); endFlow.setId(dynamicUserTaskBuilder.nextFlowId(process.getFlowElementMap())); subProcess.addFlowElement(endFlow); bpmnModel.addGraphicInfo(endEvent.getId(), endGraphicInfo);
@Override protected void executeValidation(BpmnModel bpmnModel, Process process, List<ValidationError> errors) { List<EndEvent> endEvents = process.findFlowElementsOfType(EndEvent.class); for (EndEvent endEvent : endEvents) { if (endEvent.getEventDefinitions() != null && !endEvent.getEventDefinitions().isEmpty()) { EventDefinition eventDefinition = endEvent.getEventDefinitions().get(0); // Error end event if (eventDefinition instanceof CancelEventDefinition) { FlowElementsContainer parent = process.findParent(endEvent); if (!(parent instanceof Transaction)) { addError(errors, Problems.END_EVENT_CANCEL_ONLY_INSIDE_TRANSACTION, process, endEvent, "end event with cancelEventDefinition only supported inside transaction subprocess"); } } } } }
@Override public TerminateEndEventActivityBehavior createTerminateEndEventActivityBehavior(EndEvent endEvent) { boolean terminateAll = false; boolean terminateMultiInstance = false; if (endEvent.getEventDefinitions() != null && endEvent.getEventDefinitions().size() > 0 && endEvent.getEventDefinitions().get(0) instanceof TerminateEventDefinition) { terminateAll = ((TerminateEventDefinition) endEvent.getEventDefinitions().get(0)).isTerminateAll(); terminateMultiInstance = ((TerminateEventDefinition) endEvent.getEventDefinitions().get(0)).isTerminateMultiInstance(); } TerminateEndEventActivityBehavior terminateEndEventActivityBehavior = new TerminateEndEventActivityBehavior(); terminateEndEventActivityBehavior.setTerminateAll(terminateAll); terminateEndEventActivityBehavior.setTerminateMultiInstance(terminateMultiInstance); return terminateEndEventActivityBehavior; }