/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jbpm.test; import java.io.File; import java.io.FilenameFilter; import java.util.HashMap; import java.util.Map; import java.util.Properties; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.h2.tools.Server; import org.jbpm.services.task.HumanTaskConfigurator; import org.jbpm.services.task.identity.JBossUserGroupCallbackImpl; import org.kie.api.runtime.EnvironmentName; import org.kie.api.runtime.manager.RuntimeEnvironmentBuilder; import org.kie.api.runtime.manager.RuntimeManager; import org.kie.api.runtime.manager.RuntimeManagerFactory; import org.kie.api.task.TaskService; import org.kie.api.task.UserGroupCallback; import org.kie.internal.KnowledgeBase; import org.kie.internal.runtime.StatefulKnowledgeSession; import org.kie.internal.runtime.manager.context.EmptyContext; import bitronix.tm.TransactionManagerServices; import bitronix.tm.resource.jdbc.PoolingDataSource; /** * Since version 6.0 this class is deprecated. Instead <code>RuntimeManager</code> should be used directly. * See documentation on how to use <code>RuntimeManager</code> */ public final class JBPMHelper { public static String[] processStateName = {"PENDING", "ACTIVE", "COMPLETED", "ABORTED", "SUSPENDED"}; public static String[] txStateName = {"ACTIVE", "MARKED_ROLLBACK", "PREPARED", "COMMITTED", "ROLLEDBACK", "UNKNOWN", "NO_TRANSACTION", "PREPARING", "COMMITTING", "ROLLING_BACK"}; private JBPMHelper() { } @Deprecated public static void startUp() { cleanupSingletonSessionId(); Properties properties = getProperties(); String driverClassName = properties.getProperty("persistence.datasource.driverClassName", "org.h2.Driver"); if (driverClassName.startsWith("org.h2")) { JBPMHelper.startH2Server(); } String persistenceEnabled = properties.getProperty("persistence.enabled", "false"); String humanTaskEnabled = properties.getProperty("taskservice.enabled", "false"); if ("true".equals(persistenceEnabled) || "true".equals(humanTaskEnabled)) { JBPMHelper.setupDataSource(); } if ("true".equals(humanTaskEnabled)) { JBPMHelper.startTaskService(); } } public static Server startH2Server() { try { // start h2 in memory database Server server = Server.createTcpServer(new String[0]); server.start(); return server; } catch (Throwable t) { throw new RuntimeException("Could not start H2 server", t); } } public static PoolingDataSource setupDataSource() { Properties properties = getProperties(); // create data source PoolingDataSource pds = new PoolingDataSource(); pds.setUniqueName(properties.getProperty("persistence.datasource.name", "jdbc/jbpm-ds")); pds.setClassName("bitronix.tm.resource.jdbc.lrc.LrcXADataSource"); pds.setMaxPoolSize(5); pds.setAllowLocalTransactions(true); pds.getDriverProperties().put("user", properties.getProperty("persistence.datasource.user", "sa")); pds.getDriverProperties().put("password", properties.getProperty("persistence.datasource.password", "")); pds.getDriverProperties().put("url", properties.getProperty("persistence.datasource.url", "jdbc:h2:tcp://localhost/~/jbpm-db;MVCC=TRUE")); pds.getDriverProperties().put("driverClassName", properties.getProperty("persistence.datasource.driverClassName", "org.h2.Driver")); pds.init(); return pds; } @Deprecated public static TaskService startTaskService() { Properties properties = getProperties(); String dialect = properties.getProperty("persistence.persistenceunit.dialect", "org.hibernate.dialect.H2Dialect"); Map<String, String> map = new HashMap<String, String>(); map.put("hibernate.dialect", dialect); EntityManagerFactory emf = Persistence.createEntityManagerFactory(properties.getProperty("taskservice.datasource.name", "org.jbpm.services.task"), map); System.setProperty("jbpm.user.group.mapping", properties.getProperty("taskservice.usergroupmapping", "classpath:/usergroups.properties")); TaskService taskService = new HumanTaskConfigurator() .entityManagerFactory(emf) .userGroupCallback(getUserGroupCallback()) .getTaskService(); return taskService; } @Deprecated public static void registerTaskService(StatefulKnowledgeSession ksession) { // no-op HT work item handler is already registered when using RuntimeManager } @Deprecated public static StatefulKnowledgeSession newStatefulKnowledgeSession(KnowledgeBase kbase) { return loadStatefulKnowledgeSession(kbase, -1); } @Deprecated public static StatefulKnowledgeSession loadStatefulKnowledgeSession(KnowledgeBase kbase, int sessionId) { Properties properties = getProperties(); String persistenceEnabled = properties.getProperty("persistence.enabled", "false"); RuntimeEnvironmentBuilder builder = null; if ("true".equals(persistenceEnabled)) { String dialect = properties.getProperty("persistence.persistenceunit.dialect", "org.hibernate.dialect.H2Dialect"); Map<String, String> map = new HashMap<String, String>(); map.put("hibernate.dialect", dialect); EntityManagerFactory emf = Persistence.createEntityManagerFactory(properties.getProperty("persistence.persistenceunit.name", "org.jbpm.persistence.jpa"), map); builder = RuntimeEnvironmentBuilder.Factory.get() .newDefaultBuilder() .entityManagerFactory(emf) .addEnvironmentEntry(EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager()); } else { builder = RuntimeEnvironmentBuilder.Factory.get() .newDefaultInMemoryBuilder(); } builder.knowledgeBase(kbase); RuntimeManager manager = RuntimeManagerFactory.Factory.get().newSingletonRuntimeManager(builder.get()); return (StatefulKnowledgeSession) manager.getRuntimeEngine(EmptyContext.get()).getKieSession(); } @Deprecated @SuppressWarnings("unchecked") public static UserGroupCallback getUserGroupCallback() { Properties properties = getProperties(); String className = properties.getProperty("taskservice.usergroupcallback"); if (className != null) { try { Class<UserGroupCallback> clazz = (Class<UserGroupCallback>) Class.forName(className); return clazz.newInstance(); } catch (Exception e) { throw new IllegalArgumentException("Cannot create instance of UserGroupCallback " + className, e); } } else { return new JBossUserGroupCallbackImpl("classpath:/usergroups.properties"); } } @Deprecated public static Properties getProperties() { Properties properties = new Properties(); try { properties.load(JBPMHelper.class.getResourceAsStream("/jBPM.properties")); } catch (Throwable t) { // do nothing, use defaults } return properties; } @Deprecated protected static void cleanupSingletonSessionId() { File tempDir = new File(System.getProperty("java.io.tmpdir")); if (tempDir.exists()) { String[] jbpmSerFiles = tempDir.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith("-jbpmSessionId.ser"); } }); for (String file : jbpmSerFiles) { new File(tempDir, file).delete(); } } } }