package io.trygvis.engine; import bitronix.tm.BitronixTransactionManager; import bitronix.tm.TransactionManagerServices; import bitronix.tm.resource.jdbc.PoolingDataSource; import com.googlecode.flyway.core.Flyway; import com.googlecode.flyway.core.api.MigrationInfo; import com.googlecode.flyway.core.api.MigrationInfoService; import org.jbpm.process.audit.JPAAuditLogService; import org.kie.api.io.Resource; import org.kie.api.io.ResourceType; import org.kie.api.runtime.manager.RuntimeEnvironment; 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.DependsOn; import org.springframework.context.annotation.Lazy; import org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy; import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.jta.JtaTransactionManager; import org.springframework.transaction.support.TransactionTemplate; import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; import java.util.Date; import java.util.HashMap; import java.util.Map; import static java.lang.String.format; import static org.slf4j.LoggerFactory.getLogger; /** * http://planet.jboss.org/post/jbpm_6_with_spring */ @Configuration @EnableTransactionManagement public class CalamusDbConfig { private final Logger log = getLogger(getClass()); @Bean public DataSource dataSource() { PoolingDataSource ds = new PoolingDataSource(); ds.setUniqueName("jdbc/jbpm-ds"); ds.setClassName(bitronix.tm.resource.jdbc.lrc.LrcXADataSource.class.getCanonicalName()); ds.setMaxPoolSize(3); ds.setAllowLocalTransactions(true); ds.getDriverProperties().put("user", "jbpm"); ds.getDriverProperties().put("password", "jbpm"); ds.getDriverProperties().put("url", "jdbc:postgresql://localhost/jbpm"); ds.getDriverProperties().put("driverClassName", org.postgresql.Driver.class.getCanonicalName()); ds.init(); return new TransactionAwareDataSourceProxy(new LazyConnectionDataSourceProxy(ds)); // return ds; } public static class DbMigrations { } @Bean public DbMigrations dbMigrations(DataSource dataSource) { runFlyway(log, dataSource, "", "public"); return new DbMigrations(); } private static void runFlyway(Logger log, DataSource dataSource, String prefix, String schema) { log.info("Running migrations for {}", schema); Flyway flyway = new Flyway(); flyway.setDataSource(dataSource); flyway.setSchemas(schema); flyway.setLocations("db/" + prefix); flyway.setInitOnMigrate(true); MigrationInfoService info = flyway.info(); log.info(format("%-15s %-10s %-19s %s", "Version", "State", "Installed on", "Description")); for (MigrationInfo mi : info.all()) { Date installedOn = mi.getInstalledOn(); log.info(format("%-15s %-10s %-19s %s", mi.getVersion(), trimToEmpty(mi.getState().getDisplayName()), installedOn != null ? new Date(installedOn.getTime()).toString() : "", trimToEmpty(mi.getDescription()))); } flyway.migrate(); } private static String trimToEmpty(String string) { if (string == null) { return ""; } return string.trim(); } @Bean(destroyMethod = "shutdown") public BitronixTransactionManager bitronixTransactionManager() { // bitronix.tm.Configuration configuration = TransactionManagerServices.getConfiguration(); return TransactionManagerServices.getTransactionManager(); } @Bean public PlatformTransactionManager platformTransactionManager(BitronixTransactionManager transactionManager) { return new JtaTransactionManager(transactionManager, transactionManager); } @Bean public TransactionTemplate transactionTemplate(PlatformTransactionManager platformTransactionManager) { return new TransactionTemplate(platformTransactionManager); } @Bean @DependsOn("dbMigrations") public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean x = new LocalContainerEntityManagerFactoryBean(); x.setPersistenceUnitName("org.jbpm.persistence.jpa"); return x; } @Bean public JPAAuditLogService jpaAuditLogService(EntityManagerFactory entityManagerFactory) { return new JPAAuditLogService(entityManagerFactory); } }