package org.activiti.test.spring.boot;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.impl.pvm.delegate.ActivityExecution;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.spring.boot.DataSourceProcessEngineAutoConfiguration;
import org.activiti.spring.integration.ActivitiInboundGateway;
import org.activiti.spring.integration.IntegrationActivityBehavior;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.core.task.TaskExecutor;
import org.springframework.integration.dsl.IntegrationFlow;
import org.springframework.integration.dsl.IntegrationFlows;
import org.springframework.integration.dsl.support.GenericHandler;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.client.RestTemplate;
/**
* Test the Spring Integration inbound inboundGateway support.
*
* @author Josh Long
*/
public class IntegrationAutoConfigurationTest {
@Configuration
@Import(BaseConfiguration.class)
public static class InboundGatewayConfiguration {
@Bean
public IntegrationActivityBehavior activitiDelegate(ActivitiInboundGateway activitiInboundGateway) {
return new IntegrationActivityBehavior(activitiInboundGateway);
}
@Bean
public ActivitiInboundGateway inboundGateway(ProcessEngine processEngine) {
return new ActivitiInboundGateway(processEngine, "customerId", "projectId", "orderId");
}
@Bean
public IntegrationFlow inboundProcess(ActivitiInboundGateway inboundGateway) {
return IntegrationFlows
.from(inboundGateway)
.handle(new GenericHandler<ActivityExecution>() {
@Override
public Object handle(ActivityExecution execution, Map<String, Object> headers) {
return MessageBuilder.withPayload(execution)
.setHeader("projectId", projectId)
.setHeader("orderId", "246")
.copyHeaders(headers).build();
}
})
.get();
}
@Bean(name="analysingService")
public AnalysingService service() {
return new AnalysingService();
}
public static class AnalysingService {
private final AtomicReference<String> stringAtomicReference
= new AtomicReference<String>();
public void dump(String projectId) {
this.stringAtomicReference.set(projectId);
}
public AtomicReference<String> getStringAtomicReference() {
return stringAtomicReference;
}
}
}
public static final String projectId = "2143243";
private AnnotationConfigApplicationContext context(Class<?>... clzz) {
AnnotationConfigApplicationContext annotationConfigApplicationContext
= new AnnotationConfigApplicationContext();
annotationConfigApplicationContext.register(clzz);
annotationConfigApplicationContext.refresh();
return annotationConfigApplicationContext;
}
@Test
public void testLaunchingGatewayProcessDefinition() throws Exception {
AnnotationConfigApplicationContext applicationContext = this.context(InboundGatewayConfiguration.class);
RepositoryService repositoryService = applicationContext.getBean(RepositoryService.class);
RuntimeService runtimeService = applicationContext.getBean(RuntimeService.class);
ProcessEngine processEngine = applicationContext.getBean(ProcessEngine.class);
Assert.assertNotNull("the process engine should not be null", processEngine);
Assert.assertNotNull("we should have a default repositoryService included", repositoryService);
String integrationGatewayProcess = "integrationGatewayProcess";
List<ProcessDefinition> processDefinitionList = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(integrationGatewayProcess)
.list();
ProcessDefinition processDefinition = processDefinitionList.iterator().next();
Assert.assertEquals(processDefinition.getKey(), integrationGatewayProcess);
Map<String, Object> vars = new HashMap<String, Object>();
vars.put("customerId", 232);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(integrationGatewayProcess, vars);
Assert.assertNotNull("the processInstance should not be null", processInstance);
org.junit.Assert.assertTrue(
applicationContext.getBean(InboundGatewayConfiguration.AnalysingService.class)
.getStringAtomicReference().get().equals(projectId));
}
@Configuration
@Import({DataSourceAutoConfiguration.class,
DataSourceProcessEngineAutoConfiguration.DataSourceProcessEngineConfiguration.class,
IntegrationAutoConfiguration.class})
public static class BaseConfiguration {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
public TaskExecutor taskExecutor() {
return new SimpleAsyncTaskExecutor();
}
}
}