package org.activiti.standalone.jpa; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.history.HistoricData; import org.activiti.engine.history.HistoricVariableInstance; import org.activiti.engine.history.ProcessInstanceHistoryLog; import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.activiti.engine.impl.persistence.entity.HistoricDetailVariableInstanceUpdateEntity; import org.activiti.engine.impl.persistence.entity.HistoricVariableInstanceEntity; import org.activiti.engine.impl.test.AbstractActivitiTestCase; import org.activiti.engine.impl.variable.EntityManagerSession; import org.activiti.engine.impl.variable.EntityManagerSessionFactory; import org.activiti.engine.task.Task; import org.activiti.engine.test.Deployment; /** * @author Daisuke Yoshimoto */ public class HistoricJPAVariableTest extends AbstractActivitiTestCase { protected static ProcessEngine cachedProcessEngine; private static EntityManagerFactory entityManagerFactory; private static FieldAccessJPAEntity simpleEntityFieldAccess; private static boolean entitiesInitialized = false; protected String processInstanceId; @Override protected void initializeProcessEngine() { if (cachedProcessEngine==null) { ProcessEngineConfigurationImpl processEngineConfiguration = (ProcessEngineConfigurationImpl) ProcessEngineConfiguration .createProcessEngineConfigurationFromResource("org/activiti/standalone/jpa/activiti.cfg.xml"); cachedProcessEngine = processEngineConfiguration.buildProcessEngine(); EntityManagerSessionFactory entityManagerSessionFactory = (EntityManagerSessionFactory) processEngineConfiguration .getSessionFactories() .get(EntityManagerSession.class); entityManagerFactory = entityManagerSessionFactory.getEntityManagerFactory(); } processEngine = cachedProcessEngine; } public void setupJPAEntities() { if(!entitiesInitialized) { EntityManager manager = entityManagerFactory.createEntityManager(); manager.getTransaction().begin(); // Simple test data simpleEntityFieldAccess = new FieldAccessJPAEntity(); simpleEntityFieldAccess.setId(1L); simpleEntityFieldAccess.setValue("value1"); manager.persist(simpleEntityFieldAccess); manager.flush(); manager.getTransaction().commit(); manager.close(); entitiesInitialized = true; } } @Deployment public void testGetJPAEntityAsHistoricVariable() { setupJPAEntities(); // ----------------------------------------------------------------------------- // Simple test, Start process with JPA entities as variables // ----------------------------------------------------------------------------- Map<String, Object> variables = new HashMap<String, Object>(); variables.put("simpleEntityFieldAccess", simpleEntityFieldAccess); // Start the process with the JPA-entities as variables. They will be stored in the DB. this.processInstanceId = runtimeService.startProcessInstanceByKey("JPAVariableProcess", variables).getId(); for (Task task : taskService.createTaskQuery().includeTaskLocalVariables().list()) { taskService.complete(task.getId()); } // Get JPAEntity Variable by HistoricVariableInstanceQuery HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery() .processInstanceId(processInstanceId).variableName("simpleEntityFieldAccess").singleResult(); Object value = historicVariableInstance.getValue(); assertTrue(value instanceof FieldAccessJPAEntity); assertEquals(((FieldAccessJPAEntity)value).getValue(), simpleEntityFieldAccess.getValue()); } @Deployment public void testGetJPAEntityAsHistoricLog() { setupJPAEntities(); // ----------------------------------------------------------------------------- // Simple test, Start process with JPA entities as variables // ----------------------------------------------------------------------------- Map<String, Object> variables = new HashMap<String, Object>(); variables.put("simpleEntityFieldAccess", simpleEntityFieldAccess); // Start the process with the JPA-entities as variables. They will be stored in the DB. this.processInstanceId = runtimeService.startProcessInstanceByKey("JPAVariableProcess", variables).getId(); // Finish tasks for (Task task : taskService.createTaskQuery().includeTaskLocalVariables().list()) { taskService.complete(task.getId()); } // Get JPAEntity Variable by ProcessInstanceHistoryLogQuery ProcessInstanceHistoryLog log = historyService.createProcessInstanceHistoryLogQuery(processInstanceId) .includeVariables() .singleResult(); List<HistoricData> events = log.getHistoricData(); for (HistoricData event : events) { Object value = ((HistoricVariableInstanceEntity) event).getValue(); assertTrue(value instanceof FieldAccessJPAEntity); assertEquals(((FieldAccessJPAEntity)value).getValue(), simpleEntityFieldAccess.getValue()); } } @Deployment (resources={"org/activiti/standalone/jpa/HistoricJPAVariableTest.testGetJPAEntityAsHistoricLog.bpmn20.xml"}) public void testGetJPAUpdateEntityAsHistoricLog() { setupJPAEntities(); // ----------------------------------------------------------------------------- // Simple test, Start process with JPA entities as variables // ----------------------------------------------------------------------------- Map<String, Object> variables = new HashMap<String, Object>(); variables.put("simpleEntityFieldAccess", simpleEntityFieldAccess); // Start the process with the JPA-entities as variables. They will be stored in the DB. this.processInstanceId = runtimeService.startProcessInstanceByKey("JPAVariableProcess", variables).getId(); // Finish tasks for (Task task : taskService.createTaskQuery().includeProcessVariables().list()) { taskService.setVariable(task.getId(), "simpleEntityFieldAccess", simpleEntityFieldAccess); taskService.complete(task.getId()); } // Get JPAEntity Variable by ProcessInstanceHistoryLogQuery ProcessInstanceHistoryLog log = historyService.createProcessInstanceHistoryLogQuery(processInstanceId) .includeVariableUpdates() .singleResult(); List<HistoricData> events = log.getHistoricData(); for (HistoricData event : events) { Object value = ((HistoricDetailVariableInstanceUpdateEntity) event).getValue(); assertTrue(value instanceof FieldAccessJPAEntity); assertEquals(((FieldAccessJPAEntity)value).getValue(), simpleEntityFieldAccess.getValue()); } } }