public void testPropagateTenantIdToConcurrentExecution() { deploymentForTenant(TENANT_ID, Bpmn.createExecutableProcess(PROCESS_DEFINITION_KEY) .startEvent() .parallelGateway("fork") .userTask() .parallelGateway("join") .endEvent() .moveToNode("fork") .userTask() .connectTo("join") .done()); startProcessInstance(PROCESS_DEFINITION_KEY); List<Execution> executions = runtimeService.createExecutionQuery().list(); assertThat(executions.size(), is(3)); assertThat(executions.get(0).getTenantId(), is(TENANT_ID)); // inherit the tenant id from process instance assertThat(executions.get(1).getTenantId(), is(TENANT_ID)); assertThat(executions.get(2).getTenantId(), is(TENANT_ID)); }
protected BpmnModelInstance addBoundaryEvent(BpmnModelInstance modelInstance, String activityId, String userTaskName, boolean isInterrupting) { return modify(modelInstance) .activityBuilder(activityId) .boundaryEvent() .cancelActivity(isInterrupting) .conditionalEventDefinition() .condition(CONDITION_EXPR) .conditionalEventDefinitionDone() .userTask() .name(userTaskName) .endEvent() .done(); }
@Override public BpmnModelInstance getProcessWithVarName(boolean interrupting, String condition) { return modify(TASK_MODEL) .userTaskBuilder(TASK_BEFORE_CONDITION_ID) .boundaryEvent() .cancelActivity(interrupting) .conditionalEventDefinition(CONDITIONAL_EVENT) .condition(condition) .camundaVariableName(VARIABLE_NAME) .conditionalEventDefinitionDone() .userTask() .name(TASK_AFTER_CONDITION) .endEvent() .done(); }
protected void deployBoundaryEventProcess(AbstractActivityBuilder builder, String conditionExpr, boolean isInterrupting) { final BpmnModelInstance modelInstance = builder .boundaryEvent() .cancelActivity(isInterrupting) .conditionalEventDefinition(CONDITIONAL_EVENT) .condition(conditionExpr) .conditionalEventDefinitionDone() .userTask() .name(TASK_AFTER_CONDITION) .endEvent() .done(); engine.manageDeployment(repositoryService.createDeployment().addModelInstance(CONDITIONAL_MODEL, modelInstance).deploy()); }
@Override public BpmnModelInstance getProcessWithVarEvents(boolean interrupting, String varEvent) { return modify(TASK_MODEL) .userTaskBuilder(TASK_BEFORE_CONDITION_ID) .boundaryEvent() .cancelActivity(interrupting) .conditionalEventDefinition(CONDITIONAL_EVENT) .condition(CONDITION_EXPR) .camundaVariableEvents(varEvent) .conditionalEventDefinitionDone() .userTask() .name(TASK_AFTER_CONDITION) .endEvent() .done(); }
protected void deployParallelProcessWithEventBasedGateway() { BpmnModelInstance modelInstance = Bpmn.createExecutableProcess(CONDITIONAL_EVENT_PROCESS_KEY) .startEvent() .parallelGateway() .id(PARALLEL_GATEWAY_ID) .userTask(TASK_BEFORE_EVENT_BASED_GW_ID) .eventBasedGateway() .id(EVENT_BASED_GATEWAY_ID) .intermediateCatchEvent() .conditionalEventDefinition() .condition(CONDITION_EXPR) .conditionalEventDefinitionDone() .userTask() .name(TASK_AFTER_CONDITION) .endEvent() .moveToNode(PARALLEL_GATEWAY_ID) .userTask(TASK_BEFORE_SERVICE_TASK_ID) .serviceTask() .camundaClass(SetVariableDelegate.class.getName()) .endEvent() .done(); engine.manageDeployment(repositoryService.createDeployment().addModelInstance(CONDITIONAL_MODEL, modelInstance).deploy()); }
protected BpmnModelInstance addEventSubProcess(BpmnModelInstance model, String parentId, String userTaskName, boolean isInterrupting) { return modify(model) .addSubProcessTo(parentId) .triggerByEvent() .embeddedSubProcess() .startEvent() .interrupting(isInterrupting) .conditionalEventDefinition() .condition(CONDITION_EXPR) .conditionalEventDefinitionDone() .userTask() .name(userTaskName) .endEvent() .done(); }
@Override public BpmnModelInstance getProcessWithVarNameAndEvents(boolean interrupting, String varEvent) { return modify(TASK_MODEL) .userTaskBuilder(TASK_BEFORE_CONDITION_ID) .boundaryEvent() .cancelActivity(interrupting) .conditionalEventDefinition(CONDITIONAL_EVENT) .condition(CONDITION_EXPR) .camundaVariableName(VARIABLE_NAME) .camundaVariableEvents(varEvent) .conditionalEventDefinitionDone() .userTask() .name(TASK_AFTER_CONDITION) .endEvent() .done(); }
@Override public BpmnModelInstance specifyConditionalProcess(BpmnModelInstance modelInstance, boolean isInterrupting) { return modify(modelInstance) .addSubProcessTo(CONDITIONAL_EVENT_PROCESS_KEY) .triggerByEvent() .embeddedSubProcess() .startEvent() .interrupting(isInterrupting) .conditionalEventDefinition() .condition(CONDITION_EXPR) .conditionalEventDefinitionDone() .userTask() .name(TASK_AFTER_CONDITION) .endEvent() .done(); }
@Override public BpmnModelInstance getProcessWithVarName(boolean interrupting, String condition) { return modify(TASK_MODEL) .addSubProcessTo(CONDITIONAL_EVENT_PROCESS_KEY) .triggerByEvent() .embeddedSubProcess() .startEvent() .interrupting(interrupting) .conditionalEventDefinition(CONDITIONAL_EVENT) .condition(condition) .camundaVariableName(VARIABLE_NAME) .conditionalEventDefinitionDone() .userTask() .name(TASK_AFTER_CONDITION) .endEvent() .done(); }
@Override public BpmnModelInstance getProcessWithVarEvents(boolean interrupting, String varEvent) { return modify(TASK_MODEL) .addSubProcessTo(CONDITIONAL_EVENT_PROCESS_KEY) .triggerByEvent() .embeddedSubProcess() .startEvent() .interrupting(interrupting) .conditionalEventDefinition(CONDITIONAL_EVENT) .condition(CONDITION_EXPR) .camundaVariableEvents(varEvent) .conditionalEventDefinitionDone() .userTask() .name(TASK_AFTER_CONDITION) .endEvent() .done(); }
public void testRemoveConcurrentExecutionLocalVariablesOnJoin() { deployment(Bpmn.createExecutableProcess("process") .startEvent() .parallelGateway("fork") .userTask("task1") .parallelGateway("join") .userTask("afterTask") .endEvent() .moveToNode("fork") .userTask("task2") .connectTo("join") .done()); // given runtimeService.startProcessInstanceByKey("process"); List<Task> tasks = taskService.createTaskQuery().list(); for (Task task : tasks) { runtimeService.setVariableLocal(task.getExecutionId(), "var", "value"); } // when taskService.complete(tasks.get(0).getId()); taskService.complete(tasks.get(1).getId()); // then assertEquals(0, runtimeService.createVariableInstanceQuery().count()); }
public void testRemoveConcurrentExecutionLocalVariablesOnJoin() { deployment(Bpmn.createExecutableProcess("process") .startEvent() .inclusiveGateway("fork") .userTask("task1") .inclusiveGateway("join") .userTask("afterTask") .endEvent() .moveToNode("fork") .userTask("task2") .connectTo("join") .done()); // given runtimeService.startProcessInstanceByKey("process"); List<Task> tasks = taskService.createTaskQuery().list(); for (Task task : tasks) { runtimeService.setVariableLocal(task.getExecutionId(), "var", "value"); } // when taskService.complete(tasks.get(0).getId()); taskService.complete(tasks.get(1).getId()); // then assertEquals(0, runtimeService.createVariableInstanceQuery().count()); }
@Override public BpmnModelInstance getProcessWithVarNameAndEvents(boolean interrupting, String varEvent) { return modify(TASK_MODEL) .addSubProcessTo(CONDITIONAL_EVENT_PROCESS_KEY) .triggerByEvent() .embeddedSubProcess() .startEvent() .interrupting(interrupting) .conditionalEventDefinition(CONDITIONAL_EVENT) .condition(CONDITION_EXPR) .camundaVariableName(VARIABLE_NAME) .camundaVariableEvents(varEvent) .conditionalEventDefinitionDone() .userTask() .name(TASK_AFTER_CONDITION) .endEvent() .done(); }
protected void deployConditionalEventSubProcess(BpmnModelInstance model, String parentId, boolean isInterrupting) { final BpmnModelInstance modelInstance = modify(model) .addSubProcessTo(parentId) .id("eventSubProcess") .triggerByEvent() .embeddedSubProcess() .startEvent() .interrupting(isInterrupting) .conditionalEventDefinition(CONDITIONAL_EVENT) .condition(CONDITION_EXPR) .conditionalEventDefinitionDone() .userTask("taskAfterCond") .name(TASK_AFTER_CONDITION) .endEvent().done(); engine.manageDeployment(repositoryService.createDeployment().addModelInstance(CONDITIONAL_MODEL, modelInstance).deploy()); }
@Test public void testMigrateAsyncAfterTransitionInstanceAddOutgoingFlowCase3() { // given ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(AsyncProcessModels.ASYNC_AFTER_USER_TASK_PROCESS); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(modify(AsyncProcessModels.ASYNC_AFTER_USER_TASK_PROCESS) .changeElementId("flow1", "flow2") .activityBuilder("userTask1") .sequenceFlowId("flow3") .userTask("userTask3") .endEvent() .done()); MigrationPlan migrationPlan = rule.getRuntimeService() .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapEqualActivities() .build(); ProcessInstance processInstance = rule.getRuntimeService().startProcessInstanceById(sourceProcessDefinition.getId()); testHelper.completeTask("userTask1"); // when try { testHelper.migrateProcessInstance(migrationPlan, processInstance); Assert.fail("should fail"); } catch (MigratingProcessInstanceValidationException e) { assertThat(e.getValidationReport()) .hasTransitionInstanceFailures("userTask1", "Transition instance is assigned to a sequence flow that cannot be matched in the target activity" ); } }
@Test public void testMigrateBoundaryEventOnUserTaskAndTriggerEvent() { // given BpmnModelInstance sourceProcess = ProcessModels.ONE_TASK_PROCESS.clone(); MigratingBpmnEventTrigger eventTrigger = eventFactory.addBoundaryEvent( rule.getProcessEngine(), sourceProcess, USER_TASK_ID, BOUNDARY_ID); ModifiableBpmnModelInstance.wrap(sourceProcess).flowNodeBuilder(BOUNDARY_ID) .userTask(AFTER_BOUNDARY_TASK) .endEvent() .done(); BpmnModelInstance targetProcess = modify(sourceProcess).changeElementId(BOUNDARY_ID, NEW_BOUNDARY_ID); ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(sourceProcess); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(targetProcess); MigrationPlan migrationPlan = rule.getRuntimeService().createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities(USER_TASK_ID, USER_TASK_ID) .mapActivities(BOUNDARY_ID, NEW_BOUNDARY_ID).updateEventTrigger() .build(); // when ProcessInstance processInstance = testHelper.createProcessInstanceAndMigrate(migrationPlan); // then it is possible to trigger boundary event and successfully complete the migrated instance eventTrigger.inContextOf(NEW_BOUNDARY_ID).trigger(processInstance.getId()); testHelper.completeTask(AFTER_BOUNDARY_TASK); testHelper.assertProcessEnded(testHelper.snapshotBeforeMigration.getProcessInstanceId()); }
@Test public void testMigrateBoundaryEventToSubProcessAndTriggerEvent() { // given BpmnModelInstance sourceProcess = ProcessModels.SUBPROCESS_PROCESS.clone(); MigratingBpmnEventTrigger eventTrigger = eventFactory.addBoundaryEvent( rule.getProcessEngine(), sourceProcess, SUB_PROCESS_ID, BOUNDARY_ID); ModifiableBpmnModelInstance.wrap(sourceProcess).flowNodeBuilder(BOUNDARY_ID) .userTask(AFTER_BOUNDARY_TASK) .endEvent() .done(); BpmnModelInstance targetProcess = modify(sourceProcess).changeElementId(BOUNDARY_ID, NEW_BOUNDARY_ID); ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(sourceProcess); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(targetProcess); MigrationPlan migrationPlan = rule.getRuntimeService().createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities(SUB_PROCESS_ID, SUB_PROCESS_ID) .mapActivities(USER_TASK_ID, USER_TASK_ID) .mapActivities(BOUNDARY_ID, NEW_BOUNDARY_ID).updateEventTrigger() .build(); // when ProcessInstance processInstance = testHelper.createProcessInstanceAndMigrate(migrationPlan); // then it is possible to trigger the event and successfully complete the migrated instance eventTrigger.inContextOf(NEW_BOUNDARY_ID).trigger(processInstance.getId()); testHelper.completeTask(AFTER_BOUNDARY_TASK); testHelper.assertProcessEnded(testHelper.snapshotBeforeMigration.getProcessInstanceId()); }
@Test public void testMigrateBoundaryEventToSubProcessWithScopeUserTaskAndTriggerEvent() { // given BpmnModelInstance sourceProcess = ProcessModels.SCOPE_TASK_SUBPROCESS_PROCESS.clone(); MigratingBpmnEventTrigger eventTrigger = eventFactory.addBoundaryEvent( rule.getProcessEngine(), sourceProcess, SUB_PROCESS_ID, BOUNDARY_ID); ModifiableBpmnModelInstance.wrap(sourceProcess).flowNodeBuilder(BOUNDARY_ID) .userTask(AFTER_BOUNDARY_TASK) .endEvent() .done(); BpmnModelInstance targetProcess = modify(sourceProcess).changeElementId(BOUNDARY_ID, NEW_BOUNDARY_ID); ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(sourceProcess); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(targetProcess); MigrationPlan migrationPlan = rule.getRuntimeService().createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities(SUB_PROCESS_ID, SUB_PROCESS_ID) .mapActivities(USER_TASK_ID, USER_TASK_ID) .mapActivities(BOUNDARY_ID, NEW_BOUNDARY_ID).updateEventTrigger() .build(); // when ProcessInstance processInstance = testHelper.createProcessInstanceAndMigrate(migrationPlan); // then it is possible to trigger the event and successfully complete the migrated instance eventTrigger.inContextOf(NEW_BOUNDARY_ID).trigger(processInstance.getId()); testHelper.completeTask(AFTER_BOUNDARY_TASK); testHelper.assertProcessEnded(testHelper.snapshotBeforeMigration.getProcessInstanceId()); }
@Test public void testMigrateBoundaryEventOnConcurrentScopeUserTaskAndTriggerEvent() { // given BpmnModelInstance sourceProcess = ProcessModels.PARALLEL_SCOPE_TASKS.clone(); MigratingBpmnEventTrigger eventTrigger = eventFactory.addBoundaryEvent( rule.getProcessEngine(), sourceProcess, USER_TASK_1_ID, BOUNDARY_ID); ModifiableBpmnModelInstance.wrap(sourceProcess).flowNodeBuilder(BOUNDARY_ID) .userTask(AFTER_BOUNDARY_TASK) .endEvent() .done(); BpmnModelInstance targetProcess = modify(sourceProcess) .changeElementId("boundary", "newBoundary"); ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(sourceProcess); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(targetProcess); MigrationPlan migrationPlan = rule.getRuntimeService().createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities(USER_TASK_1_ID, USER_TASK_1_ID) .mapActivities(USER_TASK_2_ID, USER_TASK_2_ID) .mapActivities(BOUNDARY_ID, NEW_BOUNDARY_ID).updateEventTrigger() .build(); // when ProcessInstance processInstance = testHelper.createProcessInstanceAndMigrate(migrationPlan); // then it is possible to trigger the event and successfully complete the migrated instance eventTrigger.inContextOf(NEW_BOUNDARY_ID).trigger(processInstance.getId()); testHelper.completeTask(AFTER_BOUNDARY_TASK); testHelper.completeTask(USER_TASK_2_ID); testHelper.assertProcessEnded(testHelper.snapshotBeforeMigration.getProcessInstanceId()); }