package org.activiti.spring.test.components.scope; import org.activiti.engine.ProcessEngine; import org.activiti.engine.RuntimeService; import org.activiti.engine.TaskService; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.springframework.util.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; import static org.junit.Assert.*; class ProcessScopeTestEngine { private int customerId = 43; private String keyForObjectType(Map<String, Object> runtimeVars, Class<?> clazz) { for (Map.Entry<String, Object> e : runtimeVars.entrySet()) { Object value = e.getValue(); if (value.getClass().isAssignableFrom(clazz)) { return e.getKey(); } } return null; } private StatefulObject run() { Map<String, Object> vars = new HashMap<String, Object>(); vars.put("customerId", customerId); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("component-waiter", vars); Map<String, Object> runtimeVars = runtimeService.getVariables(processInstance.getId()); String statefulObjectVariableKey = keyForObjectType(runtimeVars, StatefulObject.class); assertTrue(!runtimeVars.isEmpty()); assertTrue(StringUtils.hasText(statefulObjectVariableKey)); StatefulObject scopedObject = (StatefulObject) runtimeService.getVariable(processInstance.getId(), statefulObjectVariableKey); assertNotNull(scopedObject); assertTrue(StringUtils.hasText(scopedObject.getName())); assertEquals(2, scopedObject.getVisitedCount()); // the process has paused String procId = processInstance.getProcessInstanceId(); List<Task> tasks = taskService.createTaskQuery().executionId(procId).list(); assertEquals(1, tasks.size()); Task t = tasks.iterator().next(); this.taskService.claim(t.getId(), "me"); this.taskService.complete(t.getId()); scopedObject = (StatefulObject) runtimeService.getVariable(processInstance.getId(), statefulObjectVariableKey); assertEquals(3, scopedObject.getVisitedCount()); assertEquals(customerId, scopedObject.getCustomerId()); return scopedObject; } private ProcessEngine processEngine; private RuntimeService runtimeService; private TaskService taskService; public void testScopedProxyCreation() { StatefulObject one = run(); StatefulObject two = run(); assertNotSame(one.getName(), two.getName()); assertEquals(one.getVisitedCount(), two.getVisitedCount()); } public ProcessScopeTestEngine(ProcessEngine processEngine) { this.processEngine = processEngine; this.runtimeService = this.processEngine.getRuntimeService(); this.taskService = this.processEngine.getTaskService(); } }