protected FlowElement convertJsonToElement(JsonNode elementNode, JsonNode modelNode, Map<String, JsonNode> shapeMap) { StartEvent startEvent = new StartEvent(); startEvent.setInitiator(getPropertyValueAsString(PROPERTY_NONE_STARTEVENT_INITIATOR, elementNode)); String stencilId = BpmnJsonConverterUtil.getStencilId(elementNode); if (STENCIL_EVENT_START_NONE.equals(stencilId)) { String formKey = getPropertyValueAsString(PROPERTY_FORMKEY, elementNode); if (StringUtils.isNotEmpty(formKey)) { startEvent.setFormKey(formKey); } else { JsonNode formReferenceNode = getProperty(PROPERTY_FORM_REFERENCE, elementNode); if (formReferenceNode != null && formReferenceNode.get("id") != null) { if (formMap != null && formMap.containsKey(formReferenceNode.get("id").asText())) { startEvent.setFormKey(formMap.get(formReferenceNode.get("id").asText())); } } } convertJsonToFormProperties(elementNode, startEvent); } else if (STENCIL_EVENT_START_TIMER.equals(stencilId)) { convertJsonToTimerDefinition(elementNode, startEvent); } else if (STENCIL_EVENT_START_ERROR.equals(stencilId)) { convertJsonToErrorDefinition(elementNode, startEvent); } else if (STENCIL_EVENT_START_MESSAGE.equals(stencilId)) { convertJsonToMessageDefinition(elementNode, startEvent); } else if (STENCIL_EVENT_START_SIGNAL.equals(stencilId)) { convertJsonToSignalDefinition(elementNode, startEvent); } return startEvent; }
protected void validateEventDefinitionTypes(List<StartEvent> startEvents, Process process, List<ValidationError> errors) { for (StartEvent startEvent : startEvents) { if (startEvent.getEventDefinitions() != null && !startEvent.getEventDefinitions().isEmpty()) { EventDefinition eventDefinition = startEvent.getEventDefinitions().get(0); if (!(eventDefinition instanceof MessageEventDefinition) && !(eventDefinition instanceof TimerEventDefinition) && !(eventDefinition instanceof SignalEventDefinition)) { addError(errors, Problems.START_EVENT_INVALID_EVENT_DEFINITION, process, startEvent, "Unsupported event definition on start event"); } } } }
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); } } addFormProperties(startEvent.getFormProperties(), propertiesNode); addEventProperties(startEvent, propertiesNode); }
@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) { writeQualifiedAttribute(ATTRIBUTE_EVENT_START_INTERRUPTING, String.valueOf(startEvent.isInterrupting()), xtw); } }
@Override protected BaseElement convertXMLToElement(XMLStreamReader xtr, BpmnModel model) throws Exception { String formKey = xtr.getAttributeValue(ACTIVITI_EXTENSIONS_NAMESPACE, ATTRIBUTE_FORM_FORMKEY); StartEvent startEvent = null; if (StringUtils.isNotEmpty(formKey) && model.getStartEventFormTypes() != null && model.getStartEventFormTypes().contains(formKey)) { startEvent = new AlfrescoStartEvent(); } if (startEvent == null) { startEvent = new StartEvent(); } BpmnXMLUtil.addXMLLocation(startEvent, xtr); startEvent.setInitiator(xtr.getAttributeValue(ACTIVITI_EXTENSIONS_NAMESPACE, ATTRIBUTE_EVENT_START_INITIATOR)); boolean interrupting = true; String interruptingAttribute = xtr.getAttributeValue(ACTIVITI_EXTENSIONS_NAMESPACE, 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; }
/** * 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.activiti.bpmn.model.Process process = new org.activiti.bpmn.model.Process(); model.addProcess(process); process.setId("oneTaskProcess"); process.setName("The one task process"); StartEvent startEvent = new StartEvent(); startEvent.setId("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"); process.addFlowElement(endEvent); process.addFlowElement(new SequenceFlow("start", "theTask")); process.addFlowElement(new SequenceFlow("theTask", "theEnd")); return model; }
protected void initializeProcess(WorkflowDefinitionConversion conversion) { WorkflowDefinition workflowDefinition = conversion.getWorkflowDefinition(); // Create new process Process process = conversion.getProcess(); process.setId(generateProcessId(workflowDefinition)); process.setName(workflowDefinition.getName()); process.setDocumentation(workflowDefinition.getDescription()); if (workflowDefinition.getCategory() != null) { conversion.getBpmnModel().setTargetNamespace(workflowDefinition.getCategory()); } conversion.setProcess(process); // Add start-event StartEvent startEvent = new StartEvent(); startEvent.setId(START_EVENT_ID); if(workflowDefinition.getStartFormDefinition() != null && workflowDefinition.getStartFormDefinition().getFormKey() != null) { startEvent.setFormKey(workflowDefinition.getStartFormDefinition().getFormKey()); } process.addFlowElement(startEvent); conversion.setLastActivityId(startEvent.getId()); }
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 = jobManager.createTimerJob(timerEventDefinition, false, null, TimerStartEventJobHandler.TYPE, TimerEventHandler.createConfiguration(startEvent.getId(), timerEventDefinition.getEndDate(), timerEventDefinition.getCalendarName()));
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); } } }
/** * Find form properties of the current start event step * * @param model * BPMN model containing the process definition with the current start event step * @return The form properties of the current start event step, or {@code null} if the no start event step exists * with the given non start event identifier ({@link #noneStartEventId}). */ private List<FormProperty> findFormPropertiesOfStartEvent(final BpmnModel model) { final Process process = model.getProcessById(this.getProcessDefinitionId()); for (final org.activiti.bpmn.model.FlowElement flowElt : process.getFlowElements()) { // search the None Start Event step if ((flowElt instanceof StartEvent) && (flowElt.getId().equals(this.noneStartEventId)) && ((StartEvent) flowElt).getEventDefinitions().isEmpty()) { final StartEvent startEvent = (StartEvent) flowElt; return startEvent.getFormProperties(); } } return null; }
((UserTask) parentElement).getFormProperties().add(property); } else { ((StartEvent) parentElement).getFormProperties().add(property);
protected void createProcessDefinitionStartEvent(BpmnParse bpmnParse, ActivityImpl startEventActivity, StartEvent startEvent, ProcessDefinitionEntity processDefinition) { if (StringUtils.isNotEmpty(startEvent.getInitiator())) { processDefinition.setProperty(PROPERTYNAME_INITIATOR_VARIABLE_NAME, startEvent.getInitiator()); } // all start events share the same behavior: startEventActivity.setActivityBehavior(bpmnParse.getActivityBehaviorFactory().createNoneStartEventActivityBehavior(startEvent)); if (startEvent.getEventDefinitions().size() > 0) { EventDefinition eventDefinition = startEvent.getEventDefinitions().get(0); if (eventDefinition instanceof TimerEventDefinition || eventDefinition instanceof MessageEventDefinition) { bpmnParse.getBpmnParserHandlers().parseElement(bpmnParse, eventDefinition); } else { bpmnParse.getBpmnModel().addProblem("Unsupported event definition on start event", eventDefinition); } } }
@Override protected void writeAdditionalAttributes(BaseElement element, XMLStreamWriter xtw) throws Exception { StartEvent startEvent = (StartEvent) element; writeQualifiedAttribute(ATTRIBUTE_EVENT_START_INITIATOR, startEvent.getInitiator(), xtw); writeQualifiedAttribute(ATTRIBUTE_FORM_FORMKEY, startEvent.getFormKey(), xtw); }
public static StartFormHandler getStartFormHandler(CommandContext commandContext, ProcessDefinition processDefinition) { StartFormHandler startFormHandler = new DefaultStartFormHandler(); org.activiti.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 = commandContext.getDeploymentEntityManager().findById(processDefinition.getDeploymentId()); startFormHandler.parseConfiguration(formProperties, formKey, deploymentEntity, processDefinition); return startFormHandler; } return null; }
@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 = (MessageEventDefinition) eventDefinition; BpmnModel bpmnModel = bpmnParse.getBpmnModel(); String messageRef = messageDefinition.getMessageRef(); if (bpmnModel.containsMessageId(messageRef)) { Message message = bpmnModel.getMessage(messageRef); messageDefinition.setMessageRef(message.getName()); messageDefinition.setExtensionElements(message.getExtensionElements()); } element.setBehavior(bpmnParse.getActivityBehaviorFactory().createEventSubProcessMessageStartEventActivityBehavior(element, messageDefinition)); } else if (eventDefinition instanceof ErrorEventDefinition) { element.setBehavior(bpmnParse.getActivityBehaviorFactory().createEventSubProcessErrorStartEventActivityBehavior(element)); } } } else if (CollectionUtil.isEmpty(element.getEventDefinitions())) { element.setBehavior(bpmnParse.getActivityBehaviorFactory().createNoneStartEventActivityBehavior(element)); } if (element.getSubProcess() == null && (CollectionUtil.isEmpty(element.getEventDefinitions()) || bpmnParse.getCurrentProcess().getInitialFlowElement() == null)) { bpmnParse.getCurrentProcess().setInitialFlowElement(element); } }
protected void restoreTimerStartEvent(ProcessDefinition previousProcessDefinition, StartEvent startEvent, EventDefinition eventDefinition) { TimerEventDefinition timerEventDefinition = (TimerEventDefinition) eventDefinition; TimerJobEntity timer = TimerUtil.createTimerEntityForTimerEventDefinition((TimerEventDefinition) eventDefinition, false, null, TimerStartEventJobHandler.TYPE, TimerEventHandler.createConfiguration(startEvent.getId(), timerEventDefinition.getEndDate(), timerEventDefinition.getCalendarName())); if (timer != null) { TimerJobEntity timerJob = getJobManager().createTimerJob((TimerEventDefinition) eventDefinition, false, null, TimerStartEventJobHandler.TYPE, TimerEventHandler.createConfiguration(startEvent.getId(), timerEventDefinition.getEndDate(), timerEventDefinition.getCalendarName())); timerJob.setProcessDefinitionId(previousProcessDefinition.getId()); if (previousProcessDefinition.getTenantId() != null) { timerJob.setTenantId(previousProcessDefinition.getTenantId()); } getJobManager().scheduleTimerJob(timerJob); } }
if (startEvent.isInterrupting()) { List<ExecutionEntity> childExecutions = executionEntityManager.findChildExecutionsByParentExecutionId(executionEntity.getParentId()); for (ExecutionEntity childExecution : childExecutions) { if (!childExecution.getId().equals(executionEntity.getId())) { executionEntityManager.deleteExecutionAndRelatedData(childExecution, DeleteReason.EVENT_SUBPROCESS_INTERRUPTING + "(" + startEvent.getId() + ")", false);
initiatorVariableName = ((StartEvent) initialFlowElement).getInitiator();
startEvent.setInitiator(getInitiatorVariable());
public BpmnModel createTwoTasksTestProcess() { BpmnModel model = new BpmnModel(); org.activiti.bpmn.model.Process process = new org.activiti.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; }