protected BpmnModelInstance createModelExecutionListener(String listener) { return Bpmn.createExecutableProcess(PROCESS_KEY) .startEvent("startEvent") .userTask("userTask1").name("User task") .camundaExecutionListenerExpression(listener, "${execution.setProcessBusinessKey(execution.getVariable(\"" + BUSINESS_KEY_VARIABLE + "\"))}") .userTask("userTask2") .endEvent("endEvent") .done(); }
@Test public void testSetVariableInEndListener() { final BpmnModelInstance modelInstance = Bpmn.createExecutableProcess(CONDITIONAL_EVENT_PROCESS_KEY) .startEvent() .userTask(TASK_WITH_CONDITION_ID) .name(TASK_WITH_CONDITION) .camundaExecutionListenerExpression(ExecutionListener.EVENTNAME_END, EXPR_SET_VARIABLE) .userTask().name(AFTER_TASK) .endEvent() .done(); deployConditionalBoundaryEventProcess(modelInstance, TASK_WITH_CONDITION_ID, true); // given ProcessInstance procInst = runtimeService.startProcessInstanceByKey(CONDITIONAL_EVENT_PROCESS_KEY); TaskQuery taskQuery = taskService.createTaskQuery().processInstanceId(procInst.getId()); Task task = taskQuery.singleResult(); assertNotNull(task); assertEquals(TASK_WITH_CONDITION, task.getName()); //when task is completed taskService.complete(task.getId()); //then end listener sets variable //conditional event is not triggered tasksAfterVariableIsSet = taskQuery.list(); assertEquals(AFTER_TASK, tasksAfterVariableIsSet.get(0).getName()); }
@Test public void testNonInterruptingSetVariableInStartListener() { BpmnModelInstance modelInstance = Bpmn.createExecutableProcess(CONDITIONAL_EVENT_PROCESS_KEY) .startEvent(START_EVENT_ID) .userTask(TASK_BEFORE_CONDITION_ID) .name(TASK_BEFORE_CONDITION) .userTask(TASK_WITH_CONDITION_ID) .camundaExecutionListenerExpression(ExecutionListener.EVENTNAME_START, EXPR_SET_VARIABLE) .name(TASK_WITH_CONDITION) .endEvent(END_EVENT_ID) .done(); modelInstance = specifier.specifyConditionalProcess(modelInstance, false); engine.manageDeployment(repositoryService.createDeployment().addModelInstance(CONDITIONAL_MODEL, modelInstance).deploy()); // given ProcessInstance procInst = runtimeService.startProcessInstanceByKey(CONDITIONAL_EVENT_PROCESS_KEY); TaskQuery taskQuery = taskService.createTaskQuery().processInstanceId(procInst.getId()); //when task is completed taskService.complete(taskQuery.singleResult().getId()); //then start listener sets variable //non interrupting boundary event is triggered tasksAfterVariableIsSet = taskQuery.list(); assertEquals(specifier.expectedTaskCount(), tasksAfterVariableIsSet.size()); assertEquals(specifier.expectedSubscriptions(), conditionEventSubscriptionQuery.list().size()); specifier.assertTaskNames(tasksAfterVariableIsSet, false, false); }
@Test public void testNonInterruptingSetVariableInStartListener() { final BpmnModelInstance modelInstance = Bpmn.createExecutableProcess(CONDITIONAL_EVENT_PROCESS_KEY) .startEvent() .userTask(TASK_BEFORE_CONDITION_ID) .name(TASK_BEFORE_CONDITION) .userTask(TASK_WITH_CONDITION_ID).name(TASK_WITH_CONDITION) .camundaExecutionListenerExpression(ExecutionListener.EVENTNAME_START, EXPR_SET_VARIABLE) .endEvent() .done(); deployConditionalBoundaryEventProcess(modelInstance, TASK_WITH_CONDITION_ID, false); // given ProcessInstance procInst = runtimeService.startProcessInstanceByKey(CONDITIONAL_EVENT_PROCESS_KEY); TaskQuery taskQuery = taskService.createTaskQuery().processInstanceId(procInst.getId()); Task task = taskQuery.singleResult(); assertNotNull(task); assertEquals(TASK_BEFORE_CONDITION, task.getName()); //when task is completed taskService.complete(task.getId()); //then start listener sets variable //non interrupting boundary event is not triggered tasksAfterVariableIsSet = taskQuery.list(); assertEquals(TASK_WITH_CONDITION, tasksAfterVariableIsSet.get(0).getName()); }
@Test public void testNonInterruptingSetVariableInEndListener() { final BpmnModelInstance modelInstance = Bpmn.createExecutableProcess(CONDITIONAL_EVENT_PROCESS_KEY) .startEvent() .userTask(TASK_WITH_CONDITION_ID) .name(TASK_WITH_CONDITION) .camundaExecutionListenerExpression(ExecutionListener.EVENTNAME_END, EXPR_SET_VARIABLE) .userTask().name(AFTER_TASK) .endEvent() .done(); deployConditionalBoundaryEventProcess(modelInstance, TASK_WITH_CONDITION_ID, false); // given ProcessInstance procInst = runtimeService.startProcessInstanceByKey(CONDITIONAL_EVENT_PROCESS_KEY); TaskQuery taskQuery = taskService.createTaskQuery().processInstanceId(procInst.getId()); Task task = taskQuery.singleResult(); assertNotNull(task); assertEquals(TASK_WITH_CONDITION, task.getName()); //when task is completed taskService.complete(task.getId()); //then end listener sets variable //non interrupting boundary event is not triggered tasksAfterVariableIsSet = taskQuery.list(); assertEquals(AFTER_TASK, tasksAfterVariableIsSet.get(0).getName()); }
@Test public void testSetVariableInStartListener() { final BpmnModelInstance modelInstance = Bpmn.createExecutableProcess(CONDITIONAL_EVENT_PROCESS_KEY) .startEvent() .userTask(TASK_BEFORE_CONDITION_ID) .name(TASK_BEFORE_CONDITION) .userTask(TASK_WITH_CONDITION_ID).name(TASK_WITH_CONDITION) .camundaExecutionListenerExpression(ExecutionListener.EVENTNAME_START, EXPR_SET_VARIABLE) .endEvent() .done(); deployConditionalBoundaryEventProcess(modelInstance, TASK_WITH_CONDITION_ID, true); // given ProcessInstance procInst = runtimeService.startProcessInstanceByKey(CONDITIONAL_EVENT_PROCESS_KEY); TaskQuery taskQuery = taskService.createTaskQuery().processInstanceId(procInst.getId()); Task task = taskQuery.singleResult(); assertNotNull(task); assertEquals(TASK_BEFORE_CONDITION, task.getName()); //when task is completed taskService.complete(task.getId()); //then start listener sets variable //boundary event is triggered by default evaluation behavior tasksAfterVariableIsSet = taskQuery.list(); assertEquals(TASK_AFTER_CONDITION, 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 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()); }
@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 testNonInterruptingSetVariableInEndListener() { BpmnModelInstance modelInstance = Bpmn.createExecutableProcess(CONDITIONAL_EVENT_PROCESS_KEY) .startEvent(START_EVENT_ID) .userTask(TASK_BEFORE_CONDITION_ID) .name(TASK_BEFORE_CONDITION) .camundaExecutionListenerExpression(ExecutionListener.EVENTNAME_END, EXPR_SET_VARIABLE) .userTask(TASK_WITH_CONDITION_ID) .name(TASK_WITH_CONDITION) .endEvent(END_EVENT_ID) .done(); modelInstance = specifier.specifyConditionalProcess(modelInstance, false); engine.manageDeployment(repositoryService.createDeployment().addModelInstance(CONDITIONAL_MODEL, modelInstance).deploy()); // given ProcessInstance procInst = runtimeService.startProcessInstanceByKey(CONDITIONAL_EVENT_PROCESS_KEY); TaskQuery taskQuery = taskService.createTaskQuery().processInstanceId(procInst.getId()); //when task is completed taskService.complete(taskQuery.singleResult().getId()); //then end listener sets variable //non interrupting boundary event is triggered tasksAfterVariableIsSet = taskQuery.list(); assertEquals(specifier.expectedTaskCount(), tasksAfterVariableIsSet.size()); specifier.assertTaskNames(tasksAfterVariableIsSet, false, false); }
@Test public void testNonInterruptingSetVariableOnEndExecutionListenerInSubProcess() { 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) .userTask().name(TASK_AFTER_OUTPUT_MAPPING) .endEvent() .subProcessDone() .endEvent() .done(); deployMixedProcess(modelInstance, 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 conditional boundary should not triggered but conditional start event tasksAfterVariableIsSet = taskQuery.list(); assertEquals(2, tasksAfterVariableIsSet.size()); assertTaskNames(tasksAfterVariableIsSet, TASK_AFTER_CONDITIONAL_START_EVENT, TASK_AFTER_OUTPUT_MAPPING); }
@Test public void testSetVariableOnStartExecutionListenerInSubProcess() { final BpmnModelInstance modelInstance = Bpmn.createExecutableProcess(CONDITIONAL_EVENT_PROCESS_KEY) .startEvent() .subProcess(SUB_PROCESS_ID) .embeddedSubProcess() .startEvent() .userTask(TASK_BEFORE_CONDITION_ID) .name(TASK_BEFORE_CONDITION) .userTask(TASK_WITH_CONDITION_ID) .camundaExecutionListenerExpression(ExecutionListener.EVENTNAME_START, 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()); }
.name(TASK_BEFORE_CONDITION) .userTask(TASK_WITH_CONDITION_ID) .camundaExecutionListenerExpression(ExecutionListener.EVENTNAME_START, EXPR_SET_VARIABLE) .name(TASK_WITH_CONDITION) .endEvent()
@Test public void testSetVariableInEndListener() { BpmnModelInstance modelInstance = Bpmn.createExecutableProcess(CONDITIONAL_EVENT_PROCESS_KEY) .startEvent(START_EVENT_ID) .userTask(TASK_BEFORE_CONDITION_ID) .name(TASK_BEFORE_CONDITION) .camundaExecutionListenerExpression(ExecutionListener.EVENTNAME_END, EXPR_SET_VARIABLE) .userTask(TASK_WITH_CONDITION_ID) .name(TASK_WITH_CONDITION) .endEvent(END_EVENT_ID) .done(); modelInstance = specifier.specifyConditionalProcess(modelInstance, true); engine.manageDeployment(repositoryService.createDeployment().addModelInstance(CONDITIONAL_MODEL, modelInstance).deploy()); // given ProcessInstance procInst = runtimeService.startProcessInstanceByKey(CONDITIONAL_EVENT_PROCESS_KEY); TaskQuery taskQuery = taskService.createTaskQuery().processInstanceId(procInst.getId()); Task task = taskQuery.singleResult(); //when task is completed taskService.complete(task.getId()); //then end listener sets variable //conditional event is triggered tasksAfterVariableIsSet = taskQuery.list(); specifier.assertTaskNames(tasksAfterVariableIsSet, true, false); }
@Test public void testSetVariableInStartListener() { BpmnModelInstance modelInstance = Bpmn.createExecutableProcess(CONDITIONAL_EVENT_PROCESS_KEY) .startEvent(START_EVENT_ID) .userTask(TASK_BEFORE_CONDITION_ID) .name(TASK_BEFORE_CONDITION) .userTask(TASK_WITH_CONDITION_ID) .name(TASK_WITH_CONDITION) .camundaExecutionListenerExpression(ExecutionListener.EVENTNAME_START, EXPR_SET_VARIABLE) .endEvent(END_EVENT_ID) .done(); modelInstance = specifier.specifyConditionalProcess(modelInstance, true); engine.manageDeployment(repositoryService.createDeployment().addModelInstance(CONDITIONAL_MODEL, modelInstance).deploy()); // given ProcessInstance procInst = runtimeService.startProcessInstanceByKey(CONDITIONAL_EVENT_PROCESS_KEY); TaskQuery taskQuery = taskService.createTaskQuery().processInstanceId(procInst.getId()); Task task = taskQuery.singleResult(); assertNotNull(task); assertEquals(TASK_BEFORE_CONDITION, task.getName()); //when task is completed taskService.complete(task.getId()); //then start listener sets variable //conditional event is triggered tasksAfterVariableIsSet = taskQuery.list(); specifier.assertTaskNames(tasksAfterVariableIsSet, true, false); }
.userTask(TASK_WITH_CONDITION_ID) .name(TASK_WITH_CONDITION) .camundaExecutionListenerExpression(ExecutionListener.EVENTNAME_START, EXPR_SET_VARIABLE_ON_PARENT) .endEvent() .subProcessDone()
.userTask(TASK_BEFORE_CONDITION_ID) .name(TASK_BEFORE_CONDITION) .camundaExecutionListenerExpression(ExecutionListener.EVENTNAME_END, EXPR_SET_VARIABLE_ON_PARENT) .userTask(TASK_WITH_CONDITION_ID) .name(TASK_WITH_CONDITION)
.userTask(TASK_WITH_CONDITION_ID) .name(TASK_WITH_CONDITION) .camundaExecutionListenerExpression(ExecutionListener.EVENTNAME_START, EXPR_SET_VARIABLE_ON_PARENT) .endEvent() .subProcessDone()
.userTask(TASK_BEFORE_CONDITION_ID) .name(TASK_BEFORE_CONDITION) .camundaExecutionListenerExpression(ExecutionListener.EVENTNAME_END, EXPR_SET_VARIABLE_ON_PARENT) .userTask(TASK_WITH_CONDITION_ID) .name(TASK_WITH_CONDITION)
protected BpmnModelInstance createModelExecutionListener(String listener) { return Bpmn.createExecutableProcess(PROCESS_KEY) .startEvent("startEvent") .userTask("userTask1").name("User task") .camundaExecutionListenerExpression(listener, "${execution.setProcessBusinessKey(execution.getVariable(\"" + BUSINESS_KEY_VARIABLE + "\"))}") .userTask("userTask2") .endEvent("endEvent") .done(); }