/* 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.event; import org.activiti.engine.delegate.event.ActivitiEvent; import org.activiti.engine.delegate.event.ActivitiEventType; import org.activiti.engine.delegate.event.ActivitiVariableEvent; import org.activiti.engine.impl.history.HistoryLevel; 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; import java.util.HashMap; import java.util.Map; /** * Test case for all {@link ActivitiEvent}s related to variables. * * @author Frederik Heremans */ public class VariableEventsTest extends PluggableActivitiTestCase { private TestVariableEventListener listener; /** * Test create, update and delete variables on a process-instance, using the * API. */ @Deployment(resources = { "org/activiti/engine/test/api/runtime/oneTaskProcess.bpmn20.xml" }) public void testProcessInstanceVariableEvents() throws Exception { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess"); assertNotNull(processInstance); // Check create event runtimeService.setVariable(processInstance.getId(), "testVariable", "The value"); assertEquals(1, listener.getEventsReceived().size()); ActivitiVariableEvent event = (ActivitiVariableEvent) listener.getEventsReceived().get(0); assertEquals(ActivitiEventType.VARIABLE_CREATED, event.getType()); assertEquals(processInstance.getProcessDefinitionId(), event.getProcessDefinitionId()); assertEquals(processInstance.getId(), event.getExecutionId()); assertEquals(processInstance.getId(), event.getProcessInstanceId()); assertNull(event.getTaskId()); assertEquals("testVariable", event.getVariableName()); assertEquals("The value", event.getVariableValue()); listener.clearEventsReceived(); // Update variable runtimeService.setVariable(processInstance.getId(), "testVariable", "Updated value"); assertEquals(1, listener.getEventsReceived().size()); event = (ActivitiVariableEvent) listener.getEventsReceived().get(0); assertEquals(ActivitiEventType.VARIABLE_UPDATED, event.getType()); assertEquals(processInstance.getProcessDefinitionId(), event.getProcessDefinitionId()); assertEquals(processInstance.getId(), event.getExecutionId()); assertEquals(processInstance.getId(), event.getProcessInstanceId()); assertNull(event.getTaskId()); assertEquals("testVariable", event.getVariableName()); assertEquals("Updated value", event.getVariableValue()); listener.clearEventsReceived(); // Delete variable runtimeService.removeVariable(processInstance.getId(), "testVariable"); assertEquals(1, listener.getEventsReceived().size()); event = (ActivitiVariableEvent) listener.getEventsReceived().get(0); assertEquals(ActivitiEventType.VARIABLE_DELETED, event.getType()); // process definition Id can't be recognized in DB flush assertEquals(null, event.getProcessDefinitionId()); assertEquals(processInstance.getId(), event.getExecutionId()); assertEquals(processInstance.getId(), event.getProcessInstanceId()); assertNull(event.getTaskId()); assertEquals("testVariable", event.getVariableName()); // deleted variable value is always null assertEquals(null, event.getVariableValue()); listener.clearEventsReceived(); // Create, update and delete multiple variables Map<String, Object> vars = new HashMap<String, Object>(); vars.put("test", 123); vars.put("test2", 456); runtimeService.setVariables(processInstance.getId(), vars); runtimeService.setVariables(processInstance.getId(), vars); runtimeService.removeVariables(processInstance.getId(), vars.keySet()); assertEquals(6, listener.getEventsReceived().size()); assertEquals(ActivitiEventType.VARIABLE_CREATED, listener.getEventsReceived().get(0).getType()); assertEquals(ActivitiEventType.VARIABLE_CREATED, listener.getEventsReceived().get(1).getType()); assertEquals(ActivitiEventType.VARIABLE_UPDATED, listener.getEventsReceived().get(2).getType()); assertEquals(ActivitiEventType.VARIABLE_UPDATED, listener.getEventsReceived().get(3).getType()); assertEquals(ActivitiEventType.VARIABLE_DELETED, listener.getEventsReceived().get(4).getType()); assertEquals(ActivitiEventType.VARIABLE_DELETED, listener.getEventsReceived().get(5).getType()); listener.clearEventsReceived(); // Delete inexistent variable should not dispatch event runtimeService.removeVariable(processInstance.getId(), "unexistingVariable"); assertTrue(listener.getEventsReceived().isEmpty()); } @Deployment(resources = {"org/activiti/engine/test/api/runtime/oneTaskProcess.bpmn20.xml"}) public void testStartEndProcessInstanceVariableEvents() throws Exception { Map<String, Object> variables = new HashMap<String, Object>(); variables.put("var1", "value1"); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess", variables); assertEquals(1, listener.getEventsReceived().size()); assertEquals(ActivitiEventType.VARIABLE_CREATED, listener.getEventsReceived().get(0).getType()); Task task = taskService.createTaskQuery().processInstanceId( processInstance.getId()).singleResult(); taskService.complete(task.getId()); assertEquals(2, listener.getEventsReceived().size()); assertEquals(ActivitiEventType.VARIABLE_DELETED, listener.getEventsReceived().get(1).getType()); } /** * Test create event of variables when process is started with variables passed in. */ @Deployment(resources = { "org/activiti/engine/test/api/runtime/oneTaskProcess.bpmn20.xml" }) public void testProcessInstanceVariableEventsOnStart() throws Exception { HashMap<String, Object> vars = new HashMap<String, Object>(); vars.put("testVariable", "The value"); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess", vars); assertNotNull(processInstance); // Check create event assertEquals(1, listener.getEventsReceived().size()); ActivitiVariableEvent event = (ActivitiVariableEvent) listener.getEventsReceived().get(0); assertEquals(ActivitiEventType.VARIABLE_CREATED, event.getType()); assertEquals(processInstance.getProcessDefinitionId(), event.getProcessDefinitionId()); assertEquals(processInstance.getId(), event.getExecutionId()); assertEquals(processInstance.getId(), event.getProcessInstanceId()); assertNull(event.getTaskId()); assertEquals("testVariable", event.getVariableName()); assertEquals("The value", event.getVariableValue()); listener.clearEventsReceived(); } /** * Test create, update and delete variables locally on a child-execution of * the process instance. */ @Deployment public void testProcessInstanceVariableEventsOnChildExecution() throws Exception { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("variableProcess"); assertNotNull(processInstance); Execution child = runtimeService.createExecutionQuery().parentId(processInstance.getId()).singleResult(); assertNotNull(child); runtimeService.setVariableLocal(child.getId(), "test", 1234567); assertEquals(1, listener.getEventsReceived().size()); ActivitiVariableEvent event = (ActivitiVariableEvent) listener.getEventsReceived().get(0); assertEquals(ActivitiEventType.VARIABLE_CREATED, event.getType()); // Execution and process-id should differ assertEquals(child.getId(), event.getExecutionId()); assertEquals(processInstance.getId(), event.getProcessInstanceId()); } /** * Test variable events when done within a process (eg. execution-listener) */ @Deployment public void ActivitiEventType() throws Exception { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("variableProcess"); assertNotNull(processInstance); assertEquals(3, listener.getEventsReceived().size()); // Check create event ActivitiVariableEvent event = (ActivitiVariableEvent) listener.getEventsReceived().get(0); assertEquals(ActivitiEventType.VARIABLE_CREATED, event.getType()); assertEquals(processInstance.getProcessDefinitionId(), event.getProcessDefinitionId()); assertEquals(processInstance.getId(), event.getExecutionId()); assertEquals(processInstance.getId(), event.getProcessInstanceId()); assertNull(event.getTaskId()); assertEquals("variable", event.getVariableName()); assertEquals(123, event.getVariableValue()); // Check udpate event event = (ActivitiVariableEvent) listener.getEventsReceived().get(1); assertEquals(ActivitiEventType.VARIABLE_UPDATED, event.getType()); assertEquals(processInstance.getProcessDefinitionId(), event.getProcessDefinitionId()); assertEquals(processInstance.getId(), event.getExecutionId()); assertEquals(processInstance.getId(), event.getProcessInstanceId()); assertNull(event.getTaskId()); assertEquals("variable", event.getVariableName()); assertEquals(456, event.getVariableValue()); // Check delete event event = (ActivitiVariableEvent) listener.getEventsReceived().get(2); assertEquals(ActivitiEventType.VARIABLE_DELETED, event.getType()); assertEquals(processInstance.getProcessDefinitionId(), event.getProcessDefinitionId()); assertEquals(processInstance.getId(), event.getExecutionId()); assertEquals(processInstance.getId(), event.getProcessInstanceId()); assertNull(event.getTaskId()); assertEquals("variable", event.getVariableName()); assertEquals(456, event.getVariableValue()); } /** * Test create, update and delete of task-local variables. */ @Deployment(resources = { "org/activiti/engine/test/api/runtime/oneTaskProcess.bpmn20.xml" }) public void testTaskVariableEvents() throws Exception { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess"); assertNotNull(processInstance); Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()) .singleResult(); assertNotNull(task); taskService.setVariableLocal(task.getId(), "testVariable", "The value"); taskService.setVariableLocal(task.getId(), "testVariable", "Updated value"); taskService.removeVariableLocal(task.getId(), "testVariable"); // Check create event assertEquals(3, listener.getEventsReceived().size()); ActivitiVariableEvent event = (ActivitiVariableEvent) listener.getEventsReceived().get(0); assertEquals(ActivitiEventType.VARIABLE_CREATED, event.getType()); assertEquals(processInstance.getProcessDefinitionId(), event.getProcessDefinitionId()); assertEquals(processInstance.getId(), event.getExecutionId()); assertEquals(processInstance.getId(), event.getProcessInstanceId()); assertEquals(task.getId(), event.getTaskId()); assertEquals("testVariable", event.getVariableName()); assertEquals("The value", event.getVariableValue()); event = (ActivitiVariableEvent) listener.getEventsReceived().get(1); assertEquals(ActivitiEventType.VARIABLE_UPDATED, event.getType()); assertEquals(processInstance.getProcessDefinitionId(), event.getProcessDefinitionId()); assertEquals(processInstance.getId(), event.getExecutionId()); assertEquals(processInstance.getId(), event.getProcessInstanceId()); assertEquals(task.getId(), event.getTaskId()); assertEquals("testVariable", event.getVariableName()); assertEquals("Updated value", event.getVariableValue()); event = (ActivitiVariableEvent) listener.getEventsReceived().get(2); assertEquals(ActivitiEventType.VARIABLE_DELETED, event.getType()); assertEquals(null, event.getProcessDefinitionId()); // process definition Id is set to null assertEquals(processInstance.getId(), event.getExecutionId()); assertEquals(processInstance.getId(), event.getProcessInstanceId()); assertEquals(task.getId(), event.getTaskId()); assertEquals("testVariable", event.getVariableName()); // deleted values are always null assertEquals(null, event.getVariableValue()); listener.clearEventsReceived(); } /** * Test variable events when done within a process (eg. execution-listener) */ @Deployment public void testTaskVariableEventsWithinProcess() throws Exception { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("variableProcess"); assertNotNull(processInstance); Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()) .singleResult(); assertNotNull(task); assertEquals(3, listener.getEventsReceived().size()); // Check create event ActivitiVariableEvent event = (ActivitiVariableEvent) listener.getEventsReceived().get(0); assertEquals(ActivitiEventType.VARIABLE_CREATED, event.getType()); assertEquals(processInstance.getProcessDefinitionId(), event.getProcessDefinitionId()); assertEquals(processInstance.getId(), event.getExecutionId()); assertEquals(processInstance.getId(), event.getProcessInstanceId()); assertEquals(task.getId(), event.getTaskId()); assertEquals("variable", event.getVariableName()); assertEquals(123, event.getVariableValue()); // Check udpate event event = (ActivitiVariableEvent) listener.getEventsReceived().get(1); assertEquals(ActivitiEventType.VARIABLE_UPDATED, event.getType()); assertEquals(processInstance.getProcessDefinitionId(), event.getProcessDefinitionId()); assertEquals(processInstance.getId(), event.getExecutionId()); assertEquals(processInstance.getId(), event.getProcessInstanceId()); assertEquals(task.getId(), event.getTaskId()); assertEquals("variable", event.getVariableName()); assertEquals(456, event.getVariableValue()); // Check delete event event = (ActivitiVariableEvent) listener.getEventsReceived().get(2); assertEquals(ActivitiEventType.VARIABLE_DELETED, event.getType()); // process definition Id can't be recognized in DB flush assertEquals(null, event.getProcessDefinitionId()); assertEquals(processInstance.getId(), event.getExecutionId()); assertEquals(processInstance.getId(), event.getProcessInstanceId()); assertEquals(task.getId(), event.getTaskId()); assertEquals("variable", event.getVariableName()); // deleted variable value is always null assertEquals(null, event.getVariableValue()); } /** * Test to check create, update an delete behavior for variables on a task not related to a process. */ public void testTaskVariableStandalone() throws Exception { Task newTask = taskService.newTask(); try { taskService.saveTask(newTask); taskService.setVariable(newTask.getId(), "testVariable", 123); taskService.setVariable(newTask.getId(), "testVariable", 456); taskService.removeVariable(newTask.getId(), "testVariable"); assertEquals(3, listener.getEventsReceived().size()); ActivitiVariableEvent event = (ActivitiVariableEvent) listener.getEventsReceived().get(0); assertEquals(ActivitiEventType.VARIABLE_CREATED, event.getType()); assertNull(event.getProcessDefinitionId()); assertNull(event.getExecutionId()); assertNull(event.getProcessInstanceId()); assertEquals(newTask.getId(), event.getTaskId()); assertEquals("testVariable", event.getVariableName()); assertEquals(123, event.getVariableValue()); event = (ActivitiVariableEvent) listener.getEventsReceived().get(1); assertEquals(ActivitiEventType.VARIABLE_UPDATED, event.getType()); assertNull(event.getProcessDefinitionId()); assertNull(event.getExecutionId()); assertNull(event.getProcessInstanceId()); assertEquals(newTask.getId(), event.getTaskId()); assertEquals("testVariable", event.getVariableName()); assertEquals(456, event.getVariableValue()); event = (ActivitiVariableEvent) listener.getEventsReceived().get(2); assertEquals(ActivitiEventType.VARIABLE_DELETED, event.getType()); assertNull(event.getProcessDefinitionId()); assertNull(event.getExecutionId()); assertNull(event.getProcessInstanceId()); assertEquals(newTask.getId(), event.getTaskId()); assertEquals("testVariable", event.getVariableName()); // deleted variable value is always null assertEquals(null, event.getVariableValue()); } finally { // Cleanup task and history to ensure a clean DB after test success/failure if(newTask.getId() != null) { taskService.deleteTask(newTask.getId()); if(processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.ACTIVITY)) { historyService.deleteHistoricTaskInstance(newTask.getId()); } } } } @Override protected void initializeServices() { super.initializeServices(); listener = new TestVariableEventListener(); processEngineConfiguration.getEventDispatcher().addEventListener(listener); } @Override protected void tearDown() throws Exception { super.tearDown(); if (listener != null) { listener.clearEventsReceived(); processEngineConfiguration.getEventDispatcher().removeEventListener(listener); } } }