package io.trygvis.engine; 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.bpmn2.handler.ServiceTaskHandler; import org.jbpm.process.audit.AuditLoggerFactory; import org.kie.api.KieBase; import org.kie.api.runtime.Environment; import org.kie.api.runtime.EnvironmentName; import org.kie.api.runtime.process.ProcessInstance; import org.kie.internal.KnowledgeBaseFactory; import org.kie.internal.io.ResourceFactory; import org.kie.internal.persistence.jpa.JPAKnowledgeService; import org.kie.internal.runtime.StatefulKnowledgeSession; import org.kie.internal.utils.KieHelper; import org.slf4j.Logger; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.sql.DataSource; import java.util.Date; import static java.lang.String.format; import static org.slf4j.LoggerFactory.getLogger; public class CalamusJbpm { private final Logger log = getLogger(getClass()); private final EntityManagerFactory emf; private final StatefulKnowledgeSession session; public static enum CalamusProcess { DEPLOY("io.trygvis.bpm.Deploy"); private String name; CalamusProcess(String name) { this.name = name; } } public CalamusJbpm() { 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(); runFlyway(log, ds, "", "public"); emf = Persistence.createEntityManagerFactory("org.jbpm.persistence.jpa"); Environment env = KnowledgeBaseFactory.newEnvironment(); env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf); env.set(EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager()); KieBase kieBase = new KieHelper() .addResource(ResourceFactory.newClassPathResource("Deploy.bpmn2")) .build(); session = JPAKnowledgeService.newStatefulKnowledgeSession(kieBase, null, env); session.addEventListener(AuditLoggerFactory.newJPAInstance(env)); session.getWorkItemManager().registerWorkItemHandler("Service Task", new ServiceTaskHandler()); session.getWorkItemManager().registerWorkItemHandler("Upgrade App", new UpgradeAppWorkItemHandler()); session.getWorkItemManager().registerWorkItemHandler("Restart App", new RestartAppWorkItemHandler()); } public StatefulKnowledgeSession getSession() { return session; } public EntityManagerFactory getEntityManagerFactory() { return emf; } public void startProcess(CalamusProcess process) { ProcessInstance processInstance = session.startProcess(process.name); } 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(); } }