package org.activiti.engine.test.api.variables; import java.io.Serializable; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.delegate.JavaDelegate; import org.activiti.engine.impl.test.PluggableActivitiTestCase; import org.activiti.engine.repository.Deployment; import org.activiti.engine.task.Task; /** * Testing various constructs with variables. * Created to test the changes done in https://activiti.atlassian.net/browse/ACT-1900. * * @author Joram Barrez */ public class VariablesTest extends PluggableActivitiTestCase { protected String processInstanceId; @Override protected void setUp() throws Exception { super.setUp(); repositoryService.createDeployment() .addClasspathResource("org/activiti/engine/test/api/variables/VariablesTest.bpmn20.xml") .deploy(); // Creating 50 vars in total Map<String, Object> vars = generateVariables(); processInstanceId = runtimeService.startProcessInstanceByKey("variablesTest", vars).getId(); } private Map<String, Object> generateVariables() { Map<String, Object> vars = new HashMap<String, Object>(); // 10 Strings for (int i=0; i<10; i++) { vars.put("stringVar" + i, "stringVarValue-" + i); } // 10 integers for (int i=0; i<10; i++) { vars.put("intVar" + i, i * 100); } // 10 dates for (int i=0; i<10; i++) { vars.put("dateVar" + i, new Date()); } // 10 booleans for (int i=0; i<10; i++) { vars.put("booleanValue" + i, (i%2 == 0)); } // 10 Serializables for (int i=0; i<10; i++) { vars.put("serializableValue" + i, new TestSerializableVariable(i)); } return vars; } @Override protected void tearDown() throws Exception { for (Deployment deployment : repositoryService.createDeploymentQuery().list()) { repositoryService.deleteDeployment(deployment.getId(), true); } super.tearDown(); } public void testGetVariables() { // Regular getVariables after process instance start Map<String, Object> vars = runtimeService.getVariables(processInstanceId); assertEquals(50, vars.size()); int nrOfStrings = 0, nrOfInts = 0, nrOfDates = 0, nrOfBooleans = 0, nrOfSerializable = 0; for (String variableName : vars.keySet()) { Object variableValue = vars.get(variableName); if (variableValue instanceof String) { nrOfStrings++; } else if (variableValue instanceof Integer) { nrOfInts++; } else if (variableValue instanceof Boolean) { nrOfBooleans++; } else if (variableValue instanceof Date) { nrOfDates++; } else if (variableValue instanceof TestSerializableVariable) { nrOfSerializable++; } } assertEquals(10, nrOfStrings); assertEquals(10, nrOfBooleans); assertEquals(10, nrOfDates); assertEquals(10, nrOfInts); assertEquals(10, nrOfSerializable); // Trying the same after moving the process Task task = taskService.createTaskQuery().singleResult(); taskService.complete(task.getId()); task = taskService.createTaskQuery().taskName("Task 3").singleResult(); String executionId = task.getExecutionId(); assertFalse(processInstanceId.equals(executionId)); vars = runtimeService.getVariables(processInstanceId); assertEquals(50, vars.size()); nrOfStrings = 0; nrOfInts = 0; nrOfDates = 0; nrOfBooleans = 0; nrOfSerializable = 0; for (String variableName : vars.keySet()) { Object variableValue = vars.get(variableName); if (variableValue instanceof String) { nrOfStrings++; } else if (variableValue instanceof Integer) { nrOfInts++; } else if (variableValue instanceof Boolean) { nrOfBooleans++; } else if (variableValue instanceof Date) { nrOfDates++; } else if (variableValue instanceof TestSerializableVariable) { nrOfSerializable++; } } assertEquals(10, nrOfStrings); assertEquals(10, nrOfBooleans); assertEquals(10, nrOfDates); assertEquals(10, nrOfInts); assertEquals(10, nrOfSerializable); } public void testGetVariablesLocal() { // Regular getVariables after process instance start Map<String, Object> vars = runtimeService.getVariablesLocal(processInstanceId); assertEquals(50, vars.size()); int nrOfStrings = 0, nrOfInts = 0, nrOfDates = 0, nrOfBooleans = 0, nrOfSerializable = 0; for (String variableName : vars.keySet()) { Object variableValue = vars.get(variableName); if (variableValue instanceof String) { nrOfStrings++; } else if (variableValue instanceof Integer) { nrOfInts++; } else if (variableValue instanceof Boolean) { nrOfBooleans++; } else if (variableValue instanceof Date) { nrOfDates++; } else if (variableValue instanceof TestSerializableVariable) { nrOfSerializable++; } } assertEquals(10, nrOfStrings); assertEquals(10, nrOfBooleans); assertEquals(10, nrOfDates); assertEquals(10, nrOfInts); assertEquals(10, nrOfSerializable); // Trying the same after moving the process Task task = taskService.createTaskQuery().singleResult(); taskService.complete(task.getId()); task = taskService.createTaskQuery().taskName("Task 3").singleResult(); String executionId = task.getExecutionId(); assertFalse(processInstanceId.equals(executionId)); // On the local scope level, the vars shouldn't be visible vars = runtimeService.getVariablesLocal(executionId); assertEquals(0, vars.size()); } public void testGetVariable() { // This actually does a specific select. Before, this was not the case (all variables were fetched) // See the logging to verify this String value = (String) runtimeService.getVariable(processInstanceId, "stringVar3"); assertEquals("stringVarValue-3", value); } public void testGetVariablesLocal2() { // Trying the same after moving the process Task task = taskService.createTaskQuery().singleResult(); taskService.complete(task.getId()); task = taskService.createTaskQuery().taskName("Task 3").singleResult(); String executionId = task.getExecutionId(); assertFalse(processInstanceId.equals(executionId)); runtimeService.setVariableLocal(executionId, "stringVar1", "hello"); runtimeService.setVariableLocal(executionId, "stringVar2", "world"); runtimeService.setVariableLocal(executionId, "myVar", "test123"); Map<String, Object> vars = runtimeService.getVariables(processInstanceId); assertEquals(50, vars.size()); int nrOfStrings = 0; int nrOfInts = 0; int nrOfDates = 0; int nrOfBooleans = 0; int nrOfSerializable = 0; for (String variableName : vars.keySet()) { Object variableValue = vars.get(variableName); if (variableValue instanceof String) { nrOfStrings++; } else if (variableValue instanceof Integer) { nrOfInts++; } else if (variableValue instanceof Boolean) { nrOfBooleans++; } else if (variableValue instanceof Date) { nrOfDates++; } else if (variableValue instanceof TestSerializableVariable) { nrOfSerializable++; } } assertEquals(10, nrOfStrings); assertEquals(10, nrOfBooleans); assertEquals(10, nrOfDates); assertEquals(10, nrOfInts); assertEquals(10, nrOfSerializable); assertEquals("stringVarValue-1", vars.get("stringVar1")); assertEquals("stringVarValue-2", vars.get("stringVar2")); assertNull(vars.get("myVar")); // Execution local vars = runtimeService.getVariables(executionId); nrOfStrings = 0; nrOfInts = 0; nrOfDates = 0; nrOfBooleans = 0; nrOfSerializable = 0; for (String variableName : vars.keySet()) { Object variableValue = vars.get(variableName); if (variableValue instanceof String) { nrOfStrings++; } else if (variableValue instanceof Integer) { nrOfInts++; } else if (variableValue instanceof Boolean) { nrOfBooleans++; } else if (variableValue instanceof Date) { nrOfDates++; } else if (variableValue instanceof TestSerializableVariable) { nrOfSerializable++; } } assertEquals(11, nrOfStrings); assertEquals(10, nrOfBooleans); assertEquals(10, nrOfDates); assertEquals(10, nrOfInts); assertEquals(10, nrOfSerializable); assertEquals("hello", vars.get("stringVar1")); assertEquals("world", vars.get("stringVar2")); assertEquals("test123", vars.get("myVar")); } public void testGetVariablesWithCollectionThroughRuntimeService() { Map<String, Object> vars = runtimeService.getVariables(processInstanceId, Arrays.asList("intVar1", "intVar3", "intVar5", "intVar9")); assertEquals(4, vars.size()); assertEquals(100, vars.get("intVar1")); assertEquals(300, vars.get("intVar3")); assertEquals(500, vars.get("intVar5")); assertEquals(900, vars.get("intVar9")); assertEquals(4, runtimeService.getVariablesLocal(processInstanceId, Arrays.asList("intVar1", "intVar3", "intVar5", "intVar9")).size()); // Trying the same after moving the process Task task = taskService.createTaskQuery().singleResult(); taskService.complete(task.getId()); task = taskService.createTaskQuery().taskName("Task 3").singleResult(); String executionId = task.getExecutionId(); assertFalse(processInstanceId.equals(executionId)); assertEquals(0, runtimeService.getVariablesLocal(executionId, Arrays.asList("intVar1", "intVar3", "intVar5", "intVar9")).size()); } @org.activiti.engine.test.Deployment public void testGetVariableAllVariableFetchingDefault() { // Testing it the default way, all using getVariable("someVar"); Map<String, Object> vars = generateVariables(); vars.put("testVar", "hello"); String processInstanceId = runtimeService.startProcessInstanceByKey("variablesFetchingTestProcess", vars).getId(); taskService.complete(taskService.createTaskQuery().taskName("Task A").singleResult().getId()); taskService.complete(taskService.createTaskQuery().taskName("Task B").singleResult().getId()); // Triggers service task invocation vars = runtimeService.getVariables(processInstanceId); assertEquals(51, vars.size()); String varValue = (String) runtimeService.getVariable(processInstanceId, "testVar"); assertEquals("HELLO world", varValue); } @org.activiti.engine.test.Deployment public void testGetVariableAllVariableFetchingDisabled() { Map<String, Object> vars = generateVariables(); vars.put("testVar", "hello"); String processInstanceId = runtimeService.startProcessInstanceByKey("variablesFetchingTestProcess", vars).getId(); taskService.complete(taskService.createTaskQuery().taskName("Task A").singleResult().getId()); taskService.complete(taskService.createTaskQuery().taskName("Task B").singleResult().getId()); // Triggers service task invocation String varValue = (String) runtimeService.getVariable(processInstanceId, "testVar"); assertEquals("HELLO world!", varValue); } @org.activiti.engine.test.Deployment public void testGetVariableInDelegateMixed() { Map<String, Object> vars = generateVariables(); String processInstanceId = runtimeService.startProcessInstanceByKey("variablesFetchingTestProcess", vars).getId(); taskService.complete(taskService.createTaskQuery().taskName("Task A").singleResult().getId()); taskService.complete(taskService.createTaskQuery().taskName("Task B").singleResult().getId()); // Triggers service task invocation assertEquals("test 1 2 3", (String) runtimeService.getVariable(processInstanceId, "testVar")); assertEquals("Hiya", (String) runtimeService.getVariable(processInstanceId, "testVar2")); } @org.activiti.engine.test.Deployment public void testGetVariableInDelegateMixed2() { Map<String, Object> vars = generateVariables(); vars.put("testVar", "1"); String processInstanceId = runtimeService.startProcessInstanceByKey("variablesFetchingTestProcess", vars).getId(); taskService.complete(taskService.createTaskQuery().taskName("Task A").singleResult().getId()); taskService.complete(taskService.createTaskQuery().taskName("Task B").singleResult().getId()); // Triggers service task invocation assertEquals("1234", (String) runtimeService.getVariable(processInstanceId, "testVar")); } @org.activiti.engine.test.Deployment public void testGetVariableInDelegateMixed3() { Map<String, Object> vars = generateVariables(); vars.put("testVar1", "one"); vars.put("testVar2", "two"); vars.put("testVar3", "three"); String processInstanceId = runtimeService.startProcessInstanceByKey("variablesFetchingTestProcess", vars).getId(); taskService.complete(taskService.createTaskQuery().taskName("Task A").singleResult().getId()); taskService.complete(taskService.createTaskQuery().taskName("Task B").singleResult().getId()); // Triggers service task invocation assertEquals("one-CHANGED", (String) runtimeService.getVariable(processInstanceId, "testVar1")); assertEquals("two-CHANGED", (String) runtimeService.getVariable(processInstanceId, "testVar2")); assertNull(runtimeService.getVariable(processInstanceId, "testVar3")); } public void testTaskGetVariables() { Task task = taskService.createTaskQuery().taskName("Task 1").singleResult(); Map<String, Object> vars = taskService.getVariables(task.getId()); assertEquals(50, vars.size()); int nrOfStrings = 0, nrOfInts = 0, nrOfDates = 0, nrOfBooleans = 0, nrOfSerializable = 0; for (String variableName : vars.keySet()) { Object variableValue = vars.get(variableName); if (variableValue instanceof String) { nrOfStrings++; } else if (variableValue instanceof Integer) { nrOfInts++; } else if (variableValue instanceof Boolean) { nrOfBooleans++; } else if (variableValue instanceof Date) { nrOfDates++; } else if (variableValue instanceof TestSerializableVariable) { nrOfSerializable++; } } assertEquals(10, nrOfStrings); assertEquals(10, nrOfBooleans); assertEquals(10, nrOfDates); assertEquals(10, nrOfInts); assertEquals(10, nrOfSerializable); // Get variables local assertEquals(0, taskService.getVariablesLocal(task.getId()).size()); // Get collection of variables assertEquals(2, taskService.getVariables(task.getId(), Arrays.asList("intVar2", "intVar5")).size()); assertEquals(0, taskService.getVariablesLocal(task.getId(), Arrays.asList("intVar2", "intVar5")).size()); // Get Variable assertEquals("stringVarValue-3", taskService.getVariable(task.getId(), "stringVar3")); assertNull(taskService.getVariable(task.getId(), "stringVarDoesNotExist")); assertNull(taskService.getVariableLocal(task.getId(), "stringVar3")); // Set local variable taskService.setVariableLocal(task.getId(), "localTaskVar", "localTaskVarValue"); assertEquals(51, taskService.getVariables(task.getId()).size()); assertEquals(1, taskService.getVariablesLocal(task.getId()).size()); assertEquals(2, taskService.getVariables(task.getId(), Arrays.asList("intVar2", "intVar5")).size()); assertEquals(0, taskService.getVariablesLocal(task.getId(), Arrays.asList("intVar2", "intVar5")).size()); assertEquals("localTaskVarValue", taskService.getVariable(task.getId(), "localTaskVar")); assertEquals("localTaskVarValue", taskService.getVariableLocal(task.getId(), "localTaskVar")); } // Class to test variable serialization public static class TestSerializableVariable implements Serializable { private static final long serialVersionUID = 1L; private int number; public TestSerializableVariable(int number) { this.number = number; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } } // Test delegates public static class TestJavaDelegate1 implements JavaDelegate { public void execute(DelegateExecution execution) throws Exception { String var = (String) execution.getVariable("testVar"); execution.setVariable("testVar", var.toUpperCase()); } } public static class TestJavaDelegate2 implements JavaDelegate { public void execute(DelegateExecution execution) throws Exception { String var = (String) execution.getVariable("testVar"); execution.setVariable("testVar", var + " world"); } } public static class TestJavaDelegate3 implements JavaDelegate { public void execute(DelegateExecution execution) throws Exception { } } ////////////////////////////////////////// public static class TestJavaDelegate4 implements JavaDelegate { public void execute(DelegateExecution execution) throws Exception { String var = (String) execution.getVariable("testVar", false); execution.setVariable("testVar", var.toUpperCase()); } } public static class TestJavaDelegate5 implements JavaDelegate { public void execute(DelegateExecution execution) throws Exception { String var = (String) execution.getVariable("testVar", false); execution.setVariable("testVar", var + " world"); } } public static class TestJavaDelegate6 implements JavaDelegate { public void execute(DelegateExecution execution) throws Exception { String var = (String) execution.getVariable("testVar", false); execution.setVariable("testVar", var + "!"); } } ////////////////////////////////////////// public static class TestJavaDelegate7 implements JavaDelegate { public void execute(DelegateExecution execution) throws Exception { // Setting variable through 'default' way of setting variable execution.setVariable("testVar", "test"); } } public static class TestJavaDelegate8 implements JavaDelegate { public void execute(DelegateExecution execution) throws Exception { String var = (String) execution.getVariable("testVar", false); execution.setVariable("testVar", var + " 1 2 3"); } } public static class TestJavaDelegate9 implements JavaDelegate { public void execute(DelegateExecution execution) throws Exception { execution.setVariable("testVar2", "Hiya"); } } ////////////////////////////////////////// public static class TestJavaDelegate10 implements JavaDelegate { public void execute(DelegateExecution execution) throws Exception { String testVar = (String) execution.getVariable("testVar", false); execution.setVariable("testVar", testVar + "2"); } } public static class TestJavaDelegate11 implements JavaDelegate { public void execute(DelegateExecution execution) throws Exception { String testVar = (String) execution.getVariable("testVar", false); execution.setVariable("testVar", testVar + "3"); } } public static class TestJavaDelegate12 implements JavaDelegate { public void execute(DelegateExecution execution) throws Exception { String testVar = (String) execution.getVariable("testVar"); execution.setVariable("testVar", testVar + "4"); } } // //////////////////////////////////////// public static class TestJavaDelegate13 implements JavaDelegate { public void execute(DelegateExecution execution) throws Exception { Map<String, Object> vars = execution.getVariables(Arrays.asList("testVar1", "testVar2", "testVar3"), false); String testVar1 = (String) vars.get("testVar1"); String testVar2 = (String) vars.get("testVar2"); String testVar3 = (String) vars.get("testVar3"); execution.setVariable("testVar1", testVar1 + "-CHANGED", false); execution.setVariable("testVar2", testVar2 + "-CHANGED", false); execution.setVariable("testVar3", testVar3 + "-CHANGED", false); execution.setVariableLocal("localVar", "localValue", false); } } public static class TestJavaDelegate14 implements JavaDelegate { public void execute(DelegateExecution execution) throws Exception { String value = (String) execution.getVariable("testVar2"); String localVarValue = (String) execution.getVariableLocal("localValue"); execution.setVariableLocal("testVar2", value + localVarValue); } } public static class TestJavaDelegate15 implements JavaDelegate { public void execute(DelegateExecution execution) throws Exception { execution.removeVariable("testVar3"); } } }