package io.trygvis.calamus.engine; import org.drools.core.marshalling.impl.ClassObjectMarshallingStrategyAcceptor; import org.drools.core.marshalling.impl.SerializablePlaceholderResolverStrategy; import org.drools.persistence.jpa.marshaller.JPAPlaceholderResolverStrategy; import org.jbpm.process.audit.JPAAuditLogService; import org.kie.api.io.Resource; import org.kie.api.io.ResourceType; import org.kie.api.marshalling.ObjectMarshallingStrategy; import org.kie.api.runtime.EnvironmentName; import org.kie.api.runtime.manager.RuntimeEnvironment; import org.kie.api.runtime.manager.RuntimeManager; import org.kie.internal.io.ResourceFactory; import org.kie.spring.factorybeans.RuntimeEnvironmentFactoryBean; import org.kie.spring.factorybeans.RuntimeManagerFactoryBean; import org.slf4j.Logger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; import org.springframework.transaction.PlatformTransactionManager; import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; import java.util.HashMap; import java.util.Map; import static org.slf4j.LoggerFactory.getLogger; /** * http://planet.jboss.org/post/jbpm_6_with_spring */ @Configuration public class CalamusJbpmConfig { private final Logger log = getLogger(getClass()); @Bean @Lazy public RuntimeEnvironmentFactoryBean runtimeEnvironment(DataSource dataSource, CalamusDbConfig.DbMigrations dbMigrations, EntityManagerFactory entityManagerFactory, PlatformTransactionManager platformTransactionManager) { // System.out.println("CalamusConfig.runtimeEnvironmentFactoryBean"); // System.out.println("dataSource = " + dataSource); // System.out.println("dbMigrations = " + dbMigrations); // System.out.println("entityManagerFactory = " + entityManagerFactory); // System.out.println("platformTransactionManager = " + platformTransactionManager); RuntimeEnvironmentFactoryBean x = new RuntimeEnvironmentFactoryBean(); x.setType("DEFAULT"); Map assets = new HashMap<>(); assets.put(ResourceFactory.newClassPathResource("Deploy.bpmn2", getClass()), ResourceType.BPMN2); x.setAssets(assets); // x.setClassLoader(getClass().getClassLoader()); x.setEntityManagerFactory(entityManagerFactory); x.setTransactionManager(platformTransactionManager); ObjectMarshallingStrategy[] objectMarshallingStrategies = { // set the entity manager factory for jpa strategy so it // know how to store and read entities new JPAPlaceholderResolverStrategy(entityManagerFactory), // set the serialization based strategy as last one to // deal with non entities classes new SerializablePlaceholderResolverStrategy(ClassObjectMarshallingStrategyAcceptor.DEFAULT) }; x.setEnvironmentEntries(new HashMap<>()); x.getEnvironmentEntries().put(EnvironmentName.OBJECT_MARSHALLING_STRATEGIES, objectMarshallingStrategies); return x; } @Bean @Lazy public RuntimeManager runtimeManagerFactoryBean(RuntimeEnvironment runtimeEnvironment) throws Exception { RuntimeManagerFactoryBean x = new RuntimeManagerFactoryBean(); x.setIdentifier("spring-rm"); x.setRuntimeEnvironment(runtimeEnvironment); x.afterPropertiesSet(); return (RuntimeManager) x.getObject(); } @Bean public JPAAuditLogService jpaAuditLogService(EntityManagerFactory entityManagerFactory) { return new JPAAuditLogService(entityManagerFactory); } }