public static final BpmnModelInstance subProcessProcess(String key) { return Bpmn.createExecutableProcess(key) .startEvent() .subProcess() .camundaExecutionListenerClass(ExecutionListener.EVENTNAME_START, InstantiationListener.class.getName()) .camundaExecutionListenerClass(ExecutionListener.EVENTNAME_END, RemovalListener.class.getName()) .embeddedSubProcess() .startEvent() .userTask("userTask") .endEvent() .subProcessDone() .endEvent() .done(); }
public void testPropagateTenantIdToEmbeddedSubprocess() { deploymentForTenant(TENANT_ID, Bpmn.createExecutableProcess(PROCESS_DEFINITION_KEY) .startEvent() .subProcess() .embeddedSubProcess() .startEvent() .userTask() .endEvent() .subProcessDone() .endEvent() .done()); startProcessInstance(PROCESS_DEFINITION_KEY); List<Execution> executions = runtimeService.createExecutionQuery().list(); assertThat(executions.size(), is(2)); assertThat(executions.get(0).getTenantId(), is(TENANT_ID)); // inherit the tenant id from parent execution (e.g. process instance) assertThat(executions.get(1).getTenantId(), is(TENANT_ID)); }
public void testEmbeddedSubprocess() { deploymentForTenant("tenant1", Bpmn.createExecutableProcess(PROCESS_DEFINITION_KEY) .startEvent() .subProcess() .embeddedSubProcess() .startEvent() .serviceTask() .camundaClass(AssertingJavaDelegate.class.getName()) .endEvent() .subProcessDone() .endEvent() .done()); AssertingJavaDelegate.addAsserts(hasTenantId("tenant1")); startProcessInstance(PROCESS_DEFINITION_KEY); }
public void testTaskInsideEmbeddedSubprocess() { deployment(Bpmn.createExecutableProcess("testProcess") .startEvent() .subProcess() .embeddedSubProcess() .startEvent() .serviceTask() .camundaClass(AssertingJavaDelegate.class.getName()) .endEvent() .subProcessDone() .endEvent() .done()); AssertingJavaDelegate.addAsserts( new DelegateExecutionAsserter() { public void doAssert(DelegateExecution execution) { assertFalse(execution.equals(execution.getProcessInstance())); assertNull(execution.getSuperExecution()); } } ); runtimeService.startProcessInstanceByKey("testProcess"); }
public static BpmnModelInstance subProcessBpmnCallActivityProcess(String calledProcessKey) { return ProcessModels.newModel() .startEvent() .subProcess("subProcess") .embeddedSubProcess() .startEvent() .callActivity("callActivity") .calledElement(calledProcessKey) .userTask("userTask") .endEvent() .subProcessDone() .endEvent() .done(); }
public static BpmnModelInstance prepareCompensationEventProcess() { return Bpmn.createExecutableProcess(PROCESS_ID) .startEvent() .subProcess("subProcess") .embeddedSubProcess() .startEvent() .endEvent() .subProcessDone() .intermediateThrowEvent(FAILING_EVENT) .camundaAsyncBefore(true) .camundaFailedJobRetryTimeCycle(SCHEDULE) .compensateEventDefinition() .compensateEventDefinitionDone() .serviceTask() .camundaClass(FailingDelegate.class.getName()) .endEvent() .done(); }
private BpmnModelInstance prepareFailingSubProcess() { BpmnModelInstance bpmnModelInstance = Bpmn.createExecutableProcess(PROCESS_ID) .startEvent() .subProcess() .embeddedSubProcess() .startEvent() .serviceTask() .camundaClass(FAILING_CLASS) .camundaAsyncBefore() .endEvent() .subProcessDone() .endEvent() .done(); return bpmnModelInstance; } }
@Test public void testSetLocalScopeInSubprocessWithStartExecutionListener() { testHelper.deploy(Bpmn.createExecutableProcess("process") .startEvent() .subProcess().embeddedSubProcess() .startEvent().id("activityId") .camundaExecutionListenerClass(ExecutionListener.EVENTNAME_START, ExecutionListener.class) .endEvent() .subProcessDone() .endEvent() .done()); engineRule.getRuntimeService().startProcessInstanceByKey("process"); }
@Test public void testSetLocalScopeInSubprocessWithEndExecutionListener() { testHelper.deploy(Bpmn.createExecutableProcess("process") .startEvent() .subProcess().embeddedSubProcess() .startEvent() .endEvent().id("activityId") .camundaExecutionListenerClass(ExecutionListener.EVENTNAME_END, ExecutionListener.class) .subProcessDone() .endEvent() .done()); engineRule.getRuntimeService().startProcessInstanceByKey("process"); }
@Test public void testTriggerInnerEventSubProcess() { //given BpmnModelInstance modelInstance = Bpmn.createExecutableProcess(CONDITIONAL_EVENT_PROCESS_KEY) .startEvent() .subProcess(SUB_PROCESS_ID) .embeddedSubProcess() .startEvent() .userTask(TASK_BEFORE_CONDITION_ID) .name(TASK_BEFORE_CONDITION) .endEvent() .subProcessDone() .endEvent() .done(); deployConditionalEventSubProcess(modelInstance, SUB_PROCESS_ID, true); //when runtimeService.createProcessInstanceByKey(CONDITIONAL_EVENT_PROCESS_KEY) .startBeforeActivity(TASK_BEFORE_CONDITION_ID) .setVariable(VARIABLE_NAME, "1") .executeWithVariablesInReturn(); //then tasksAfterVariableIsSet = taskService.createTaskQuery().list(); assertEquals(1, tasksAfterVariableIsSet.size()); assertEquals(TASK_AFTER_CONDITION_ID, tasksAfterVariableIsSet.get(0).getTaskDefinitionKey()); }
@Test public void testTriggerBoundaryEventFromInnerSubProcess() { //given BpmnModelInstance modelInstance = Bpmn.createExecutableProcess(CONDITIONAL_EVENT_PROCESS_KEY) .startEvent() .subProcess(SUB_PROCESS_ID) .embeddedSubProcess() .startEvent() .userTask(TASK_BEFORE_CONDITION_ID) .name(TASK_BEFORE_CONDITION) .endEvent() .subProcessDone() .endEvent() .done(); deployConditionalBoundaryEventProcess(modelInstance, SUB_PROCESS_ID, true); //when runtimeService.createProcessInstanceByKey(CONDITIONAL_EVENT_PROCESS_KEY) .startBeforeActivity(TASK_BEFORE_CONDITION_ID) .setVariable(VARIABLE_NAME, "1") .executeWithVariablesInReturn(); //then tasksAfterVariableIsSet = taskService.createTaskQuery().list(); assertEquals(1, tasksAfterVariableIsSet.size()); assertEquals(TASK_AFTER_CONDITION_ID, tasksAfterVariableIsSet.get(0).getTaskDefinitionKey()); }
@Test public void testSetLocalScopeInSubprocessWithJavaDelegate() { testHelper.deploy(Bpmn.createExecutableProcess("process") .startEvent() .subProcess().embeddedSubProcess() .startEvent() .serviceTask().id("activityId") .camundaClass(JavaDelegate.class) .endEvent() .subProcessDone() .endEvent() .done()); engineRule.getRuntimeService().startProcessInstanceByKey("process"); }
@Test public void testSetLocalScopeInSubprocessWithTaskListener() { testHelper.deploy(Bpmn.createExecutableProcess("process") .startEvent() .subProcess().embeddedSubProcess() .startEvent() .userTask().id("activityId") .camundaTaskListenerClass(TaskListener.EVENTNAME_CREATE, TaskListener.class) .endEvent() .subProcessDone() .endEvent() .done()); engineRule.getRuntimeService().startProcessInstanceByKey("process"); }
@Test public void testSetVariableOnStartExecutionListenerInSubProcessWithBoundary() { BpmnModelInstance modelInstance = Bpmn.createExecutableProcess(CONDITIONAL_EVENT_PROCESS_KEY) .startEvent() .subProcess(SUB_PROCESS_ID) .camundaExecutionListenerExpression(ExecutionListener.EVENTNAME_START, EXPR_SET_VARIABLE) .embeddedSubProcess() .startEvent() .userTask(TASK_WITH_CONDITION_ID) .name(TASK_WITH_CONDITION) .endEvent() .subProcessDone() .endEvent() .done(); modelInstance = addEventSubProcess(modelInstance, SUB_PROCESS_ID, TASK_AFTER_COND_START_EVENT_IN_SUB_PROCESS, true); deployMixedProcess(modelInstance, CONDITIONAL_EVENT_PROCESS_KEY, SUB_PROCESS_ID, true); // given ProcessInstance procInst = runtimeService.startProcessInstanceByKey(CONDITIONAL_EVENT_PROCESS_KEY); TaskQuery taskQuery = taskService.createTaskQuery().processInstanceId(procInst.getId()); //when start listener sets variable //then conditional boundary should not triggered but conditional start event tasksAfterVariableIsSet = taskQuery.list(); assertEquals(TASK_AFTER_CONDITIONAL_START_EVENT, tasksAfterVariableIsSet.get(0).getName()); }
@Test public void testSetVariableOnOutputMappingInSubProcess() { final BpmnModelInstance modelInstance = Bpmn.createExecutableProcess(CONDITIONAL_EVENT_PROCESS_KEY) .startEvent() .subProcess(SUB_PROCESS_ID) .embeddedSubProcess() .startEvent() .userTask(TASK_WITH_CONDITION_ID) .camundaOutputParameter(VARIABLE_NAME, "1") .name(TASK_WITH_CONDITION) .endEvent() .subProcessDone() .endEvent() .done(); deployMixedProcess(modelInstance, SUB_PROCESS_ID, true); // given ProcessInstance procInst = runtimeService.startProcessInstanceByKey(CONDITIONAL_EVENT_PROCESS_KEY); TaskQuery taskQuery = taskService.createTaskQuery().processInstanceId(procInst.getId()); Task task = taskQuery.singleResult(); //when task before is completed taskService.complete(task.getId()); //then conditional boundary should not triggered but conditional start event tasksAfterVariableIsSet = taskQuery.list(); assertEquals(TASK_AFTER_CONDITIONAL_START_EVENT, tasksAfterVariableIsSet.get(0).getName()); }
@Test public void testSetVariableOnEndExecutionListenerInSubProcess() { final BpmnModelInstance modelInstance = Bpmn.createExecutableProcess(CONDITIONAL_EVENT_PROCESS_KEY) .startEvent() .subProcess(SUB_PROCESS_ID) .embeddedSubProcess() .startEvent() .userTask(TASK_WITH_CONDITION_ID) .camundaExecutionListenerExpression(ExecutionListener.EVENTNAME_END, EXPR_SET_VARIABLE) .name(TASK_WITH_CONDITION) .endEvent() .subProcessDone() .endEvent() .done(); deployMixedProcess(modelInstance, SUB_PROCESS_ID, true); // given ProcessInstance procInst = runtimeService.startProcessInstanceByKey(CONDITIONAL_EVENT_PROCESS_KEY); TaskQuery taskQuery = taskService.createTaskQuery().processInstanceId(procInst.getId()); Task task = taskQuery.singleResult(); //when task before is completed taskService.complete(task.getId()); //then conditional boundary should not triggered but conditional start event tasksAfterVariableIsSet = taskQuery.list(); assertEquals(TASK_AFTER_CONDITIONAL_START_EVENT, tasksAfterVariableIsSet.get(0).getName()); }
@Test public void testSetVariableOnOutputMappingInSubProcessWithBoundary() { BpmnModelInstance modelInstance = Bpmn.createExecutableProcess(CONDITIONAL_EVENT_PROCESS_KEY) .startEvent() .subProcess(SUB_PROCESS_ID) .embeddedSubProcess() .startEvent() .userTask(TASK_WITH_CONDITION_ID) .camundaOutputParameter(VARIABLE_NAME, "1") .name(TASK_WITH_CONDITION) .endEvent() .subProcessDone() .endEvent() .done(); modelInstance = addEventSubProcess(modelInstance, SUB_PROCESS_ID, TASK_AFTER_COND_START_EVENT_IN_SUB_PROCESS, true); deployMixedProcess(modelInstance, CONDITIONAL_EVENT_PROCESS_KEY, SUB_PROCESS_ID, true); // given ProcessInstance procInst = runtimeService.startProcessInstanceByKey(CONDITIONAL_EVENT_PROCESS_KEY); TaskQuery taskQuery = taskService.createTaskQuery().processInstanceId(procInst.getId()); Task task = taskQuery.singleResult(); //when task before is completed taskService.complete(task.getId()); //then conditional boundary should not triggered but conditional start event tasksAfterVariableIsSet = taskQuery.list(); assertEquals(TASK_AFTER_CONDITIONAL_START_EVENT, tasksAfterVariableIsSet.get(0).getName()); }
@Test public void testSetVariableOnEndExecutionListenerInSubProcessWithBoundary() { BpmnModelInstance modelInstance = Bpmn.createExecutableProcess(CONDITIONAL_EVENT_PROCESS_KEY) .startEvent() .subProcess(SUB_PROCESS_ID) .embeddedSubProcess() .startEvent() .userTask(TASK_WITH_CONDITION_ID) .camundaExecutionListenerExpression(ExecutionListener.EVENTNAME_END, EXPR_SET_VARIABLE) .name(TASK_WITH_CONDITION) .endEvent() .subProcessDone() .endEvent() .done(); modelInstance = addEventSubProcess(modelInstance, SUB_PROCESS_ID, TASK_AFTER_COND_START_EVENT_IN_SUB_PROCESS, true); deployMixedProcess(modelInstance, CONDITIONAL_EVENT_PROCESS_KEY, SUB_PROCESS_ID, true); // given ProcessInstance procInst = runtimeService.startProcessInstanceByKey(CONDITIONAL_EVENT_PROCESS_KEY); TaskQuery taskQuery = taskService.createTaskQuery().processInstanceId(procInst.getId()); Task task = taskQuery.singleResult(); //when task before is completed taskService.complete(task.getId()); //then conditional boundary should not triggered but conditional start event tasksAfterVariableIsSet = taskQuery.list(); assertEquals(TASK_AFTER_CONDITIONAL_START_EVENT, tasksAfterVariableIsSet.get(0).getName()); }
@Test public void testNonInterruptingSetVariableOnEndExecutionListenerInSubProcessWithBoundary() { BpmnModelInstance modelInstance = Bpmn.createExecutableProcess(CONDITIONAL_EVENT_PROCESS_KEY) .startEvent() .subProcess(SUB_PROCESS_ID) .embeddedSubProcess() .startEvent() .userTask(TASK_WITH_CONDITION_ID) .camundaExecutionListenerExpression(ExecutionListener.EVENTNAME_END, EXPR_SET_VARIABLE) .name(TASK_WITH_CONDITION) .userTask().name(TASK_AFTER_OUTPUT_MAPPING) .endEvent() .subProcessDone() .endEvent() .done(); modelInstance = addEventSubProcess(modelInstance, SUB_PROCESS_ID, TASK_AFTER_COND_START_EVENT_IN_SUB_PROCESS, false); deployMixedProcess(modelInstance, CONDITIONAL_EVENT_PROCESS_KEY, SUB_PROCESS_ID, false); // given ProcessInstance procInst = runtimeService.startProcessInstanceByKey(CONDITIONAL_EVENT_PROCESS_KEY); TaskQuery taskQuery = taskService.createTaskQuery().processInstanceId(procInst.getId()); //when task before is completed taskService.complete(taskQuery.singleResult().getId()); //then all conditional events are triggered tasksAfterVariableIsSet = taskQuery.list(); assertEquals(4, tasksAfterVariableIsSet.size()); }
/** * CAM-8005 - StackOverflowError must not happen. */ @Test public void testDeleteProcessInstancesManyParallelSubprocesses() { final BpmnModelInstance multiInstanceWithSubprocess = Bpmn.createExecutableProcess("multiInstanceWithSubprocess") .startEvent() .subProcess() .embeddedSubProcess() .startEvent() .userTask("userTask") .endEvent() .subProcessDone() .multiInstance().cardinality("300").multiInstanceDone() .endEvent() .done(); testRule.deploy(multiInstanceWithSubprocess); final ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("multiInstanceWithSubprocess"); runtimeService.deleteProcessInstance(processInstance.getId(), "some reason"); assertEquals(0, runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).count()); }