public void setValues(StartEvent otherEvent) { super.setValues(otherEvent); setInitiator(otherEvent.getInitiator()); setFormKey(otherEvent.getFormKey()); setInterrupting(otherEvent.isInterrupting); formProperties = new ArrayList<>(); if (otherEvent.getFormProperties() != null && !otherEvent.getFormProperties().isEmpty()) { for (FormProperty property : otherEvent.getFormProperties()) { formProperties.add(property.clone()); } } } }
/** * 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; }
@Override protected void writeAdditionalAttributes(BaseElement element, BpmnModel model, XMLStreamWriter xtw) throws Exception { StartEvent startEvent = (StartEvent) element; writeQualifiedAttribute(ATTRIBUTE_EVENT_START_INITIATOR, startEvent.getInitiator(), xtw); writeQualifiedAttribute(ATTRIBUTE_FORM_FORMKEY, startEvent.getFormKey(), xtw); if (startEvent.getEventDefinitions() != null && startEvent.getEventDefinitions().size() > 0) { writeDefaultAttribute(ATTRIBUTE_EVENT_START_INTERRUPTING, String.valueOf(startEvent.isInterrupting()), xtw); } }
@Override public StartEvent clone() { StartEvent clone = new StartEvent(); clone.setValues(this); return clone; }
BpmnModel bpmnModel, ProcessDefinitionEntity originalProcessDefinitionEntity, DeploymentEntity newDeploymentEntity) { List<StartEvent> startEvents = process.findFlowElementsOfType(StartEvent.class); StartEvent initialStartEvent = null; for (StartEvent startEvent : startEvents) { if (startEvent.getEventDefinitions().size() == 0) { initialStartEvent = startEvent; break; process.addFlowElement(flowFromUserTask); SequenceFlow initialFlow = initialStartEvent.getOutgoingFlows().get(0); initialFlow.setSourceRef(parallelGateway.getId()); SequenceFlow flowFromStart = new SequenceFlow(initialStartEvent.getId(), parallelGateway.getId()); flowFromStart.setId(dynamicUserTaskBuilder.nextFlowId(process.getFlowElementMap())); process.addFlowElement(flowFromStart); GraphicInfo elementGraphicInfo = bpmnModel.getGraphicInfo(initialStartEvent.getId()); if (elementGraphicInfo != null) { double yDiff = 0; Map<String, GraphicInfo> locationMap = bpmnModel.getLocationMap(); for (String locationId : locationMap.keySet()) { if (initialStartEvent.getId().equals(locationId)) { continue;
FlowElement flowElement = process.getFlowElement(taskEntity.getTaskDefinitionKey(), true); if (!(flowElement instanceof UserTask)) { throw new FlowableException("No UserTask instance found for task definition key " + taskEntity.getTaskDefinitionKey()); String subProcessId = dynamicUserTaskBuilder.nextSubProcessId(process.getFlowElementMap()); subProcess.setId(subProcessId); subProcess.setName(flowElement.getName()); userTask.setOutgoingFlows(new ArrayList<>()); bpmnModel.removeGraphicInfo(userTask.getId()); subProcess.addFlowElement(userTask); StartEvent startEvent = new StartEvent(); startEvent.setId(dynamicUserTaskBuilder.nextStartEventId(process.getFlowElementMap())); subProcess.addFlowElement(startEvent); subProcess.addFlowElement(fork); SequenceFlow startFlow1 = new SequenceFlow(startEvent.getId(), fork.getId()); startFlow1.setId(dynamicUserTaskBuilder.nextFlowId(process.getFlowElementMap())); subProcess.addFlowElement(startFlow1); bpmnModel.addGraphicInfo(startEvent.getId(), startGraphicInfo);
if (!startEvent.getEventDefinitions().isEmpty()) { Optional<ExecutionEntity> startEventExecution = inactiveExecutionsByProcessInstanceId.stream().filter(execution -> execution.getActivityId().equals(startEvent.getId())).findFirst(); EventDefinition eventDefinition = startEvent.getEventDefinitions().get(0); List<EventSubscriptionEntity> eventSubscriptions = null; if (eventDefinition instanceof SignalEventDefinition) { eventSubscriptions = eventSubscriptionEntityManager.findEventSubscriptionsByProcessInstanceAndActivityId(eventSubProcessExecution.getProcessInstanceId(), startEvent.getId(), SignalEventSubscriptionEntity.EVENT_TYPE); } else if (eventDefinition instanceof MessageEventDefinition) { eventSubscriptions = eventSubscriptionEntityManager.findEventSubscriptionsByProcessInstanceAndActivityId(eventSubProcessExecution.getProcessInstanceId(), startEvent.getId(), MessageEventSubscriptionEntity.EVENT_TYPE); if (startEvent.isInterrupting() || isOnlyRemainingExecutionAtParentScope) { //Current eventSubProcess plus its startEvent if (eventSubscriptions != null && !eventSubscriptions.isEmpty()) { eventSubscriptions.forEach(eventSubscriptionEntityManager::delete); executionEntityManager.deleteExecutionAndRelatedData(startEventExecution.get(), DeleteReason.EVENT_SUBPROCESS_INTERRUPTING + "(" + startEvent.getId() + ")", false); if (!childExecutionEntity.isEnded() && !childExecutionEntity.getId().equals(eventSubProcessExecution.getId()) && !movingExecutionIds.contains(childExecutionEntity.getId())) { executionEntityManager.deleteExecutionAndRelatedData(childExecutionEntity, DeleteReason.EVENT_SUBPROCESS_INTERRUPTING + "(" + startEvent.getId() + ")", false); timerExecution.setActive(false); TimerJobEntity timerJob = TimerUtil.createTimerEntityForTimerEventDefinition(timerEventDefinition, false, timerExecution, TriggerTimerEventJobHandler.TYPE, TimerEventHandler.createConfiguration(startEvent.getId(), timerEventDefinition.getEndDate(), timerEventDefinition.getCalendarName())); if (timerJob != null) { timerJobService.scheduleTimerJob(timerJob);
@Override protected void convertElementToJson(ObjectNode propertiesNode, BaseElement baseElement) { StartEvent startEvent = (StartEvent) baseElement; if (StringUtils.isNotEmpty(startEvent.getInitiator())) { propertiesNode.put(PROPERTY_NONE_STARTEVENT_INITIATOR, startEvent.getInitiator()); } if (StringUtils.isNotEmpty(startEvent.getFormKey())) { if (formKeyMap != null && formKeyMap.containsKey(startEvent.getFormKey())) { ObjectNode formRefNode = objectMapper.createObjectNode(); ModelInfo modelInfo = formKeyMap.get(startEvent.getFormKey()); formRefNode.put("id", modelInfo.getId()); formRefNode.put("name", modelInfo.getName()); formRefNode.put("key", modelInfo.getKey()); propertiesNode.set(PROPERTY_FORM_REFERENCE, formRefNode); } else { setPropertyValue(PROPERTY_FORMKEY, startEvent.getFormKey(), propertiesNode); } } if (startEvent.getSubProcess() instanceof EventSubProcess && !startEvent.isInterrupting()) { propertiesNode.put(PROPERTY_INTERRUPTING, false); } else { propertiesNode.put(PROPERTY_INTERRUPTING, true); } addFormProperties(startEvent.getFormProperties(), propertiesNode); addEventProperties(startEvent, propertiesNode); }
@Override protected BaseElement convertXMLToElement(XMLStreamReader xtr, BpmnModel model) throws Exception { String formKey = BpmnXMLUtil.getAttributeValue(ATTRIBUTE_FORM_FORMKEY, xtr); StartEvent startEvent = null; if (StringUtils.isNotEmpty(formKey)) { if (model.getStartEventFormTypes() != null && model.getStartEventFormTypes().contains(formKey)) { startEvent = new AlfrescoStartEvent(); } } if (startEvent == null) { startEvent = new StartEvent(); } BpmnXMLUtil.addXMLLocation(startEvent, xtr); startEvent.setInitiator(BpmnXMLUtil.getAttributeValue(ATTRIBUTE_EVENT_START_INITIATOR, xtr)); boolean interrupting = true; String interruptingAttribute = xtr.getAttributeValue(null, ATTRIBUTE_EVENT_START_INTERRUPTING); if (ATTRIBUTE_VALUE_FALSE.equalsIgnoreCase(interruptingAttribute)) { interrupting = false; } startEvent.setInterrupting(interrupting); startEvent.setFormKey(formKey); parseChildElements(getXMLElementName(), startEvent, model, xtr); return startEvent; }
protected void addSignalEventSubscriptions(CommandContext commandContext, ProcessDefinitionEntity processDefinition, org.flowable.bpmn.model.Process process, BpmnModel bpmnModel) { if (CollectionUtil.isNotEmpty(process.getFlowElements())) { for (FlowElement element : process.getFlowElements()) { if (element instanceof StartEvent) { StartEvent startEvent = (StartEvent) element; if (CollectionUtil.isNotEmpty(startEvent.getEventDefinitions())) { EventDefinition eventDefinition = startEvent.getEventDefinitions().get(0); if (eventDefinition instanceof SignalEventDefinition) { SignalEventDefinition signalEventDefinition = (SignalEventDefinition) eventDefinition; SignalEventSubscriptionEntity subscriptionEntity = CommandContextUtil.getEventSubscriptionEntityManager(commandContext).createSignalEventSubscription(); Signal signal = bpmnModel.getSignal(signalEventDefinition.getSignalRef()); if (signal != null) { subscriptionEntity.setEventName(signal.getName()); } else { subscriptionEntity.setEventName(signalEventDefinition.getSignalRef()); } subscriptionEntity.setActivityId(startEvent.getId()); subscriptionEntity.setProcessDefinitionId(processDefinition.getId()); if (processDefinition.getTenantId() != null) { subscriptionEntity.setTenantId(processDefinition.getTenantId()); } CommandContextUtil.getEventSubscriptionEntityManager(commandContext).insert(subscriptionEntity); } } } } } }
protected void restorePreviousStartEventsIfNeeded(ProcessDefinition processDefinition) { ProcessDefinitionEntity latestProcessDefinition = findLatestProcessDefinition(processDefinition); if (latestProcessDefinition != null && processDefinition.getId().equals(latestProcessDefinition.getId())) { // Try to find a previous version (it could be some versions are missing due to deletions) ProcessDefinition previousProcessDefinition = findNewLatestProcessDefinitionAfterRemovalOf(processDefinition); if (previousProcessDefinition != null) { BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(previousProcessDefinition.getId()); org.flowable.bpmn.model.Process previousProcess = ProcessDefinitionUtil.getProcess(previousProcessDefinition.getId()); if (CollectionUtil.isNotEmpty(previousProcess.getFlowElements())) { List<StartEvent> startEvents = previousProcess.findFlowElementsOfType(StartEvent.class); if (CollectionUtil.isNotEmpty(startEvents)) { for (StartEvent startEvent : startEvents) { if (CollectionUtil.isNotEmpty(startEvent.getEventDefinitions())) { EventDefinition eventDefinition = startEvent.getEventDefinitions().get(0); if (eventDefinition instanceof TimerEventDefinition) { restoreTimerStartEvent(previousProcessDefinition, startEvent, eventDefinition); } else if (eventDefinition instanceof SignalEventDefinition) { restoreSignalStartEvent(previousProcessDefinition, bpmnModel, startEvent, eventDefinition); } else if (eventDefinition instanceof MessageEventDefinition) { restoreMessageStartEvent(previousProcessDefinition, bpmnModel, startEvent, eventDefinition); } } } } } } } }
@Override protected void executeParse(BpmnParse bpmnParse, StartEvent element) { if (element.getSubProcess() != null && element.getSubProcess() instanceof EventSubProcess) { if (CollectionUtil.isNotEmpty(element.getEventDefinitions())) { EventDefinition eventDefinition = element.getEventDefinitions().get(0); if (eventDefinition instanceof MessageEventDefinition) { MessageEventDefinition messageDefinition = fillMessageRef(bpmnParse, eventDefinition); element.setBehavior(bpmnParse.getActivityBehaviorFactory().createEventSubProcessMessageStartEventActivityBehavior(element, messageDefinition)); element.setBehavior(bpmnParse.getActivityBehaviorFactory().createEventSubProcessSignalStartEventActivityBehavior( element, signalDefinition, signal)); element.setBehavior(bpmnParse.getActivityBehaviorFactory().createEventSubProcessTimerStartEventActivityBehavior( element, timerEventDefinition)); element.setBehavior(bpmnParse.getActivityBehaviorFactory().createEventSubProcessErrorStartEventActivityBehavior(element)); } else if (CollectionUtil.isEmpty(element.getEventDefinitions())) { element.setBehavior(bpmnParse.getActivityBehaviorFactory().createNoneStartEventActivityBehavior(element)); } else if (CollectionUtil.isNotEmpty(element.getEventDefinitions())) { EventDefinition eventDefinition = element.getEventDefinitions().get(0); if (eventDefinition instanceof MessageEventDefinition) { fillMessageRef(bpmnParse, eventDefinition); if (element.getSubProcess() == null && (CollectionUtil.isEmpty(element.getEventDefinitions()) || bpmnParse.getCurrentProcess().getInitialFlowElement() == null)) { bpmnParse.getCurrentProcess().setInitialFlowElement(element);
protected List<FormDefinition> getFormDefinitionsFromModel(BpmnModel bpmnModel, ProcessDefinition processDefinition) { Set<String> formKeys = new HashSet<>(); List<FormDefinition> formDefinitions = new ArrayList<>(); // for all start events List<StartEvent> startEvents = bpmnModel.getMainProcess().findFlowElementsOfType(StartEvent.class, true); for (StartEvent startEvent : startEvents) { if (StringUtils.isNotEmpty(startEvent.getFormKey())) { formKeys.add(startEvent.getFormKey()); } } // for all user tasks List<UserTask> userTasks = bpmnModel.getMainProcess().findFlowElementsOfType(UserTask.class, true); for (UserTask userTask : userTasks) { if (StringUtils.isNotEmpty(userTask.getFormKey())) { formKeys.add(userTask.getFormKey()); } } for (String formKey : formKeys) { addFormDefinitionToCollection(formDefinitions, formKey, processDefinition); } return formDefinitions; }
protected void addMessageEventSubscriptions(ProcessDefinitionEntity processDefinition, Process process, BpmnModel bpmnModel) { if (CollectionUtil.isNotEmpty(process.getFlowElements())) { for (FlowElement element : process.getFlowElements()) { if (element instanceof StartEvent) { StartEvent startEvent = (StartEvent) element; if (CollectionUtil.isNotEmpty(startEvent.getEventDefinitions())) { EventDefinition eventDefinition = startEvent.getEventDefinitions().get(0); if (eventDefinition instanceof MessageEventDefinition) { MessageEventDefinition messageEventDefinition = (MessageEventDefinition) eventDefinition; insertMessageEvent(messageEventDefinition, startEvent, processDefinition, bpmnModel); } } } } } }
protected List<TimerJobEntity> getTimerDeclarations(ProcessDefinitionEntity processDefinition, Process process) { List<TimerJobEntity> timers = new ArrayList<>(); if (CollectionUtil.isNotEmpty(process.getFlowElements())) { for (FlowElement element : process.getFlowElements()) { if (element instanceof StartEvent) { StartEvent startEvent = (StartEvent) element; if (CollectionUtil.isNotEmpty(startEvent.getEventDefinitions())) { EventDefinition eventDefinition = startEvent.getEventDefinitions().get(0); if (eventDefinition instanceof TimerEventDefinition) { TimerEventDefinition timerEventDefinition = (TimerEventDefinition) eventDefinition; TimerJobEntity timerJob = TimerUtil.createTimerEntityForTimerEventDefinition(timerEventDefinition, false, null, TimerStartEventJobHandler.TYPE, TimerEventHandler.createConfiguration(startEvent.getId(), timerEventDefinition.getEndDate(), timerEventDefinition.getCalendarName()));
@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'"); } } } } }
protected void createStartFormHandlers(BpmnParse bpmnParse, StartEvent startEvent, ProcessDefinitionEntity processDefinition) { if (processDefinition.getInitial() != null) { if (startEvent.getId().equals(processDefinition.getInitial().getId())) { StartFormHandler startFormHandler = new DefaultStartFormHandler(); startFormHandler.parseConfiguration(startEvent.getFormProperties(), startEvent.getFormKey(), bpmnParse.getDeployment(), processDefinition); processDefinition.setStartFormHandler(startFormHandler); } } }
public StartFormHandler getStartFormHandler(CommandContext commandContext, ProcessDefinition processDefinition) { StartFormHandler startFormHandler = new DefaultStartFormHandler(); org.flowable.bpmn.model.Process process = ProcessDefinitionUtil.getProcess(processDefinition.getId()); FlowElement initialFlowElement = process.getInitialFlowElement(); if (initialFlowElement instanceof StartEvent) { StartEvent startEvent = (StartEvent) initialFlowElement; List<FormProperty> formProperties = startEvent.getFormProperties(); String formKey = startEvent.getFormKey(); DeploymentEntity deploymentEntity = CommandContextUtil.getDeploymentEntityManager(commandContext).findById(processDefinition.getDeploymentId()); startFormHandler.parseConfiguration(formProperties, formKey, deploymentEntity, processDefinition); return startFormHandler; } return null; }
Process process = bpmnModel.getProcessById(processDefinition.getKey()); FlowElement startElement = process.getInitialFlowElement(); if (StringUtils.isNotEmpty(startEvent.getFormKey())) { FormRepositoryService formRepositoryService = CommandContextUtil.getFormRepositoryService(commandContext); formInfo = formRepositoryService.getFormModelByKey(startEvent.getFormKey()); } else { formInfo = formRepositoryService.getFormModelByKey(startEvent.getFormKey(), tenantId, processEngineConfiguration.isFallbackToDefaultTenant());
initiatorVariableName = ((StartEvent) initialFlowElement).getInitiator(); processInstance.setVariables(processDataObjects(process.getDataObjects()));