package com.indra.ti.gears.camunda; import static org.junit.Assert.assertNull; import javax.sql.DataSource; import org.camunda.bpm.application.ProcessApplication; import org.camunda.bpm.engine.FormService; import org.camunda.bpm.engine.HistoryService; import org.camunda.bpm.engine.IdentityService; import org.camunda.bpm.engine.ManagementService; import org.camunda.bpm.engine.ProcessEngine; import org.camunda.bpm.engine.ProcessEngineConfiguration; import org.camunda.bpm.engine.RepositoryService; import org.camunda.bpm.engine.RuntimeService; import org.camunda.bpm.engine.TaskService; import org.camunda.bpm.engine.delegate.DelegateExecution; import org.camunda.bpm.engine.delegate.ExecutionListener; import org.camunda.bpm.engine.delegate.JavaDelegate; import org.camunda.bpm.engine.history.HistoricVariableInstance; import org.camunda.bpm.engine.runtime.ProcessInstance; import org.camunda.bpm.engine.spring.SpringExpressionManager; import org.camunda.bpm.engine.spring.SpringProcessEngineConfiguration; import org.camunda.bpm.engine.spring.application.SpringProcessApplication; import org.camunda.bpm.engine.spring.container.ManagedProcessEngineFactoryBean; import org.camunda.bpm.engine.test.Deployment; import org.camunda.bpm.engine.test.ProcessEngineRule; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.PlatformTransactionManager; @ContextConfiguration(classes = {CamundaEngineTest.TestConfiguration.class}) @RunWith(SpringJUnit4ClassRunner.class) public class CamundaEngineTest { private static final Logger LOGGER = LoggerFactory.getLogger(CamundaEngineTest.class); @Autowired private RuntimeService runtimeService; @Autowired private HistoryService historyService; @Autowired @Rule public ProcessEngineRule processEngineRule; @Test @Deployment(resources = {"workflow/ServiceTask.bpmn"}) public void testListenerInvocation() { ProcessInstance pi = runtimeService.startProcessInstanceByKey("ServiceTask"); HistoricVariableInstance hvi = historyService.createHistoricVariableInstanceQuery() .processInstanceId(pi.getProcessInstanceId()) .variableName("objectId") .singleResult(); // Lets check that the variable was removed by the end listener assertNull(hvi); } @ProcessApplication private static class MyProcessApplication extends SpringProcessApplication { @Override public ExecutionListener getExecutionListener() { return new ExecutionListener() { public void notify(DelegateExecution execution) throws Exception { LOGGER.info("Got execution {}", execution); //TODO: Check on the execution information execution.removeVariable("objectId"); } }; } } public static class TestConfiguration { @Autowired private ApplicationContext context; @Autowired private ProcessEngine processEngine; @Bean public SpringProcessApplication springProcessApplication() { return new MyProcessApplication(); } @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("org.h2.Driver"); dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1"); dataSource.setUsername("sa"); dataSource.setPassword("sa"); return dataSource; } @Bean public PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource()); } @Bean public SpringProcessEngineConfiguration processEngineConfiguration() { SpringProcessEngineConfiguration processEngineConfiguration = new SpringProcessEngineConfiguration(); processEngineConfiguration.setDataSource(dataSource()); processEngineConfiguration.setProcessEngineName("default"); processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); processEngineConfiguration.setTransactionManager(transactionManager()); processEngineConfiguration.setJobExecutorActivate(true); processEngineConfiguration.setExpressionManager(new SpringExpressionManager(context, null)); return processEngineConfiguration; } @Bean public ManagedProcessEngineFactoryBean engineFactory(SpringProcessEngineConfiguration engineConfiguration) { ManagedProcessEngineFactoryBean factoryBean = new ManagedProcessEngineFactoryBean(); factoryBean.setProcessEngineConfiguration(engineConfiguration); return factoryBean; } @Bean public JavaDelegate delegateImplementation() { return new JavaDelegate() { public void execute(DelegateExecution execution) { execution.setVariable("objectId", toString()); } }; } @Bean public ProcessEngine processEngine(ManagedProcessEngineFactoryBean factoryBean) throws Exception { return factoryBean.getObject(); } @Bean public ProcessEngineRule processEngineRule() { return new ProcessEngineRule(processEngine); } @Bean public RepositoryService repositoryService() { return processEngine.getRepositoryService(); } @Bean public RuntimeService runtimeService() { return processEngine.getRuntimeService(); } @Bean public TaskService taskService() { return processEngine.getTaskService(); } @Bean public HistoryService historyService() { return processEngine.getHistoryService(); } @Bean public FormService formService() { return processEngine.getFormService(); } @Bean public IdentityService identityService() { return processEngine.getIdentityService(); } @Bean public ManagementService managementService() { return processEngine.getManagementService(); } } }