/* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.activiti.engine.test.api.task; import java.io.Serializable; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.activiti.engine.impl.persistence.entity.VariableInstance; import org.activiti.engine.impl.test.PluggableActivitiTestCase; import org.activiti.engine.runtime.Execution; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.activiti.engine.test.Deployment; /** * @author Tom Baeyens */ public class TaskVariablesTest extends PluggableActivitiTestCase { public void testStandaloneTaskVariables() { Task task = taskService.newTask(); task.setName("gonzoTask"); taskService.saveTask(task); String taskId = task.getId(); taskService.setVariable(taskId, "instrument", "trumpet"); assertEquals("trumpet", taskService.getVariable(taskId, "instrument")); taskService.deleteTask(taskId, true); } @Deployment public void testTaskExecutionVariables() { String processInstanceId = runtimeService.startProcessInstanceByKey("oneTaskProcess").getId(); String taskId = taskService.createTaskQuery().singleResult().getId(); Map<String, Object> expectedVariables = new HashMap<String, Object>(); assertEquals(expectedVariables, runtimeService.getVariables(processInstanceId)); assertEquals(expectedVariables, taskService.getVariables(taskId)); assertEquals(expectedVariables, runtimeService.getVariablesLocal(processInstanceId)); assertEquals(expectedVariables, taskService.getVariablesLocal(taskId)); runtimeService.setVariable(processInstanceId, "instrument", "trumpet"); expectedVariables = new HashMap<String, Object>(); assertEquals(expectedVariables, taskService.getVariablesLocal(taskId)); expectedVariables.put("instrument", "trumpet"); assertEquals(expectedVariables, runtimeService.getVariables(processInstanceId)); assertEquals(expectedVariables, taskService.getVariables(taskId)); assertEquals(expectedVariables, runtimeService.getVariablesLocal(processInstanceId)); taskService.setVariable(taskId, "player", "gonzo"); assertTrue(taskService.hasVariable(taskId, "player")); assertFalse(taskService.hasVariableLocal(taskId, "budget")); expectedVariables = new HashMap<String, Object>(); assertEquals(expectedVariables, taskService.getVariablesLocal(taskId)); expectedVariables.put("player", "gonzo"); expectedVariables.put("instrument", "trumpet"); assertEquals(expectedVariables, runtimeService.getVariables(processInstanceId)); assertEquals(expectedVariables, taskService.getVariables(taskId)); assertEquals(expectedVariables, runtimeService.getVariablesLocal(processInstanceId)); taskService.setVariableLocal(taskId, "budget", "unlimited"); assertTrue(taskService.hasVariableLocal(taskId, "budget")); assertTrue(taskService.hasVariable(taskId, "budget")); expectedVariables = new HashMap<String, Object>(); expectedVariables.put("budget", "unlimited"); assertEquals(expectedVariables, taskService.getVariablesLocal(taskId)); expectedVariables.put("player", "gonzo"); expectedVariables.put("instrument", "trumpet"); assertEquals(expectedVariables, taskService.getVariables(taskId)); expectedVariables = new HashMap<String, Object>(); expectedVariables.put("player", "gonzo"); expectedVariables.put("instrument", "trumpet"); assertEquals(expectedVariables, runtimeService.getVariables(processInstanceId)); assertEquals(expectedVariables, runtimeService.getVariablesLocal(processInstanceId)); } public void testSerializableTaskVariable() { Task task = taskService.newTask(); task.setName("MyTask"); taskService.saveTask(task); // Set variable Map<String, Object> vars = new HashMap<String, Object>(); MyVariable myVariable = new MyVariable("Hello world"); vars.put("theVar", myVariable); taskService.setVariables(task.getId(), vars); // Fetch variable MyVariable variable = (MyVariable) taskService.getVariable(task.getId(), "theVar"); assertEquals("Hello world", variable.getValue()); // Cleanup taskService.deleteTask(task.getId(), true); } @Deployment public void testGetVariablesLocalByTaskIds(){ ProcessInstance processInstance1 = runtimeService.startProcessInstanceByKey("twoTaskProcess"); ProcessInstance processInstance2 = runtimeService.startProcessInstanceByKey("twoTaskProcess"); List<Task> taskList1 = taskService.createTaskQuery().processInstanceId(processInstance1.getId()).list(); List<Task> taskList2 = taskService.createTaskQuery().processInstanceId(processInstance2.getId()).list(); // Task local variables for(Task task : taskList1){ if ("usertask1".equals(task.getTaskDefinitionKey())){ taskService.setVariableLocal(task.getId(), "taskVar1", "sayHello1"); } else { taskService.setVariableLocal(task.getId(), "taskVar2", "sayHello2"); } // Execution variables taskService.setVariable(task.getId(), "executionVar1", "helloWorld1"); } // Task local variables for (Task task : taskList2){ if ("usertask1".equals(task.getTaskDefinitionKey())){ taskService.setVariableLocal(task.getId(), "taskVar3", "sayHello3"); } else { taskService.setVariableLocal(task.getId(), "taskVar4", "sayHello4"); } // Execution variables taskService.setVariable(task.getId(), "executionVar2", "helloWorld2"); } // only 1 process Set<String> taskIds = new HashSet<String>(); taskIds.add(taskList1.get(0).getId()); taskIds.add(taskList1.get(1).getId()); List<VariableInstance> variables = taskService.getVariableInstancesLocalByTaskIds(taskIds); assertEquals(2, variables.size()); checkVariable(taskList1.get(0).getId(), "taskVar1" , "sayHello1", variables); checkVariable(taskList1.get(1).getId(), "taskVar2" , "sayHello2", variables); // 2 process taskIds = new HashSet<String>(); taskIds.add(taskList1.get(0).getId()); taskIds.add(taskList1.get(1).getId()); taskIds.add(taskList2.get(0).getId()); taskIds.add(taskList2.get(1).getId()); variables = taskService.getVariableInstancesLocalByTaskIds(taskIds); assertEquals(4, variables.size()); checkVariable(taskList1.get(0).getId(), "taskVar1" , "sayHello1", variables); checkVariable(taskList1.get(1).getId(), "taskVar2" , "sayHello2", variables); checkVariable(taskList2.get(0).getId(), "taskVar3" , "sayHello3", variables); checkVariable(taskList2.get(1).getId(), "taskVar4" , "sayHello4", variables); // mixture 2 process taskIds = new HashSet<String>(); taskIds.add(taskList1.get(0).getId()); taskIds.add(taskList2.get(1).getId()); variables = taskService.getVariableInstancesLocalByTaskIds(taskIds); assertEquals(2, variables.size()); checkVariable(taskList1.get(0).getId(), "taskVar1" , "sayHello1", variables); checkVariable(taskList2.get(1).getId(), "taskVar4" , "sayHello4", variables); } private void checkVariable(String taskId, String name, String value, List<VariableInstance> variables){ for (VariableInstance variable : variables){ if (taskId.equals(variable.getTaskId())){ assertEquals(name, variable.getName()); assertEquals(value, variable.getValue()); return; } } fail(); } @Deployment(resources={ "org/activiti/engine/test/api/task/TaskVariablesTest.testTaskExecutionVariables.bpmn20.xml" }) public void testGetVariablesLocalByTaskIdsForSerializableType(){ runtimeService.startProcessInstanceByKey("oneTaskProcess").getId(); String taskId = taskService.createTaskQuery().singleResult().getId(); StringBuilder sb = new StringBuilder("a"); for (int i = 0; i < 4001; i++) { sb.append("a"); } String serializableTypeVar = sb.toString(); taskService.setVariableLocal(taskId, "taskVar1", serializableTypeVar); // only 1 process Set<String> taskIds = new HashSet<String>(); taskIds.add(taskId); List<VariableInstance> variables = taskService.getVariableInstancesLocalByTaskIds(taskIds); assertEquals(serializableTypeVar, variables.get(0).getValue()); } @Deployment(resources={ "org/activiti/engine/test/api/runtime/variableScope.bpmn20.xml" }) public void testGetVariablesLocalByTaskIdsForScope(){ Map<String, Object> processVars = new HashMap<String, Object>(); processVars.put("processVar", "processVar"); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("variableScopeProcess", processVars); Set<String> executionIds = new HashSet<String>(); List<Execution> executions = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).list(); for (Execution execution : executions){ if (!processInstance.getId().equals(execution.getId())){ executionIds.add(execution.getId()); runtimeService.setVariableLocal(execution.getId(), "executionVar", "executionVar"); } } List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list(); Set<String> taskIds = new HashSet<String>(); for (Task task : tasks){ taskService.setVariableLocal(task.getId(), "taskVar", "taskVar"); taskIds.add(task.getId()); } List<VariableInstance> variableInstances = taskService.getVariableInstancesLocalByTaskIds(taskIds); assertEquals(variableInstances.size(), 2); assertEquals(variableInstances.get(0).getName(), "taskVar"); assertEquals(variableInstances.get(0).getValue() , "taskVar"); assertEquals(variableInstances.get(1).getName(), "taskVar"); assertEquals(variableInstances.get(1).getValue() , "taskVar"); } public static class MyVariable implements Serializable { private static final long serialVersionUID = 1L; private String value; public MyVariable(String value) { this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } }