diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/TaskService.java b/modules/activiti-engine/src/main/java/org/activiti/engine/TaskService.java index 0b537c48c0d48538946142277512c20689077217..fb6f0cf480937a424b8e9617ec72bb470a7f8fb9 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/TaskService.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/TaskService.java @@ -189,6 +189,17 @@ public interface TaskService { * @throws ActivitiObjectNotFoundException when no task exists with the given id. */ void complete(String taskId, Map variables); + + /** + * Called when the task is successfully executed, + * and the required task paramaters are given by the end-user. + * @param taskId the id of the task to complete, cannot be null. + * @param variables task parameters. May be null or empty. + * @param localScope If true, the provided variables will be stored task-local, + * instead of process instance wide (which is the default for {@link #complete(String, Map)}). + * @throws ActivitiObjectNotFoundException when no task exists with the given id. + */ + void complete(String taskId, Map variables, boolean localScope); /** * Changes the assignee of the given task to the given userId. diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/TaskServiceImpl.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/TaskServiceImpl.java index 0180cb30dc9cef794ecece73d1e61196ce941d80..e8ca828d651a38619efd61cc73f633d58f2a7d5e 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/TaskServiceImpl.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/TaskServiceImpl.java @@ -171,6 +171,10 @@ public class TaskServiceImpl extends ServiceImpl implements TaskService { public void complete(String taskId, Map variables) { commandExecutor.execute(new CompleteTaskCmd(taskId, variables)); } + + public void complete(String taskId, Map variables,boolean localScope) { + commandExecutor.execute(new CompleteTaskCmd(taskId, variables, localScope)); + } public void delegateTask(String taskId, String userId) { commandExecutor.execute(new DelegateTaskCmd(taskId, userId)); diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/CompleteTaskCmd.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/CompleteTaskCmd.java index 9347c13a9d5ac3134e11b4bda4e74e201e3b1bba..5ddce13b0491b9a12825af7cf80c72cb980fea09 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/CompleteTaskCmd.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/CompleteTaskCmd.java @@ -25,15 +25,26 @@ public class CompleteTaskCmd extends NeedsActiveTaskCmd { private static final long serialVersionUID = 1L; protected Map variables; + protected boolean localScope; public CompleteTaskCmd(String taskId, Map variables) { super(taskId); this.variables = variables; } + public CompleteTaskCmd(String taskId, Map variables, boolean localScope) { + super(taskId); + this.variables = variables; + this.localScope = localScope; + } + protected Void execute(CommandContext commandContext, TaskEntity task) { if (variables!=null) { - task.setExecutionVariables(variables); + if (localScope) { + task.setVariablesLocal(variables); + } else { + task.setExecutionVariables(variables); + } } task.complete(); diff --git a/modules/activiti-engine/src/test/java/org/activiti/engine/test/api/task/TaskServiceTest.java b/modules/activiti-engine/src/test/java/org/activiti/engine/test/api/task/TaskServiceTest.java index 154de296ccfd5ebe8e769f1da2a1790a25dac6c3..8e7e3dc0917dd5bb44d6e1ca74487424025eef7e 100644 --- a/modules/activiti-engine/src/test/java/org/activiti/engine/test/api/task/TaskServiceTest.java +++ b/modules/activiti-engine/src/test/java/org/activiti/engine/test/api/task/TaskServiceTest.java @@ -596,6 +596,55 @@ public class TaskServiceTest extends PluggableActivitiTestCase { assertEquals("myValue", variables.get("myParam")); } + @Deployment(resources = { + "org/activiti/engine/test/api/twoTasksProcess.bpmn20.xml" }) +public void testCompleteWithParametersTask2() { + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("twoTasksProcess"); + + // Fetch first task + Task task = taskService.createTaskQuery().singleResult(); + assertEquals("First task", task.getName()); + + // Complete first task + Map taskParams = new HashMap(); + taskParams.put("myParam", "myValue"); + taskService.complete(task.getId(), taskParams, false); // Only difference with previous test + + // Fetch second task + task = taskService.createTaskQuery().singleResult(); + assertEquals("Second task", task.getName()); + + // Verify task parameters set on execution + Map variables = runtimeService.getVariables(processInstance.getId()); + assertEquals(1, variables.size()); + assertEquals("myValue", variables.get("myParam")); +} + + @Deployment + public void testCompleteWithTaskLocalParameters() { + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("testTaskLocalVars"); + + // Fetch first task + Task task = taskService.createTaskQuery().singleResult(); + + // Complete first task + Map taskParams = new HashMap(); + taskParams.put("a", 1); + taskParams.put("b", 1); + taskService.complete(task.getId(), taskParams, true); + + // Verify vars are not stored process instance wide + assertNull(runtimeService.getVariable(processInstance.getId(), "a")); + assertNull(runtimeService.getVariable(processInstance.getId(), "b")); + + // verify script listener has done its job + assertEquals(new Integer(2), runtimeService.getVariable(processInstance.getId(), "sum")); + + // Fetch second task + task = taskService.createTaskQuery().singleResult(); + + } + public void testSetAssignee() { User user = identityService.newUser("user"); identityService.saveUser(user); diff --git a/modules/activiti-engine/src/test/resources/org/activiti/engine/test/api/task/TaskServiceTest.testCompleteWithTaskLocalParameters.bpmn20.xml b/modules/activiti-engine/src/test/resources/org/activiti/engine/test/api/task/TaskServiceTest.testCompleteWithTaskLocalParameters.bpmn20.xml new file mode 100644 index 0000000000000000000000000000000000000000..d415c73385f9ee6dd6cb4d91eb202b8e5b5c09d2 --- /dev/null +++ b/modules/activiti-engine/src/test/resources/org/activiti/engine/test/api/task/TaskServiceTest.testCompleteWithTaskLocalParameters.bpmn20.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + var a = task.getVariableLocal('a'); + var b = task.getVariableLocal('b'); + var sum = new java.lang.Integer(a + b); + task.setVariable('sum', sum); + + + + + + + + + + + + + +