[jboss-svn-commits] JBL Code SVN: r30727 - in labs/jbossrules/trunk: drools-container/drools-spring/src/main/java/org/drools/container/spring/beans and 14 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed Dec 16 14:09:50 EST 2009
Author: baunax
Date: 2009-12-16 14:09:49 -0500 (Wed, 16 Dec 2009)
New Revision: 30727
Added:
labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/
labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/JPAKnowledgeServiceBean.java
labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandService.java
labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/
labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/
labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandServiceTest.java
labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/TestWorkItemHandler.java
labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/helper/
labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/helper/FileHelper.java
labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/
labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/MyWorkItemHandlers.conf
labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/drools.session.conf
labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/orm.xml
labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/persistence.xml
labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/log4j.xml
labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/org/drools/container/spring/beans/
labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/org/drools/container/spring/beans/persistence/
labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/org/drools/container/spring/beans/persistence/beans.xml
Modified:
labs/jbossrules/trunk/drools-container/drools-spring/pom.xml
labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/namespace/KnowledgeBaseDefinitionParser.java
labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/impl/JPAKnowledgeServiceProviderImpl.java
labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/session/SessionInfo.java
Log:
JBRULES-2332 Spring Transactions
- Created SpringSingleSessionCommandService to allow Drools participates in spring transactions.
- Created JPAKwonledgeServiceBean to easy drools config from spring.
Modified: labs/jbossrules/trunk/drools-container/drools-spring/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/pom.xml 2009-12-16 19:09:39 UTC (rev 30726)
+++ labs/jbossrules/trunk/drools-container/drools-spring/pom.xml 2009-12-16 19:09:49 UTC (rev 30727)
@@ -8,6 +8,10 @@
<version>5.1.0.SNAPSHOT</version>
</parent>
+ <properties>
+ <spring.version>2.5.6</spring.version>
+ </properties>
+
<artifactId>drools-spring</artifactId>
<packaging>jar</packaging>
<name>Drools :: Spring</name>
@@ -37,26 +41,74 @@
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-persistence-jpa</artifactId>
+ <optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
- <version>2.5.6</version>
+ <version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
- <version>2.5.6</version>
+ <version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
+ <artifactId>spring-orm</artifactId>
+ <version>${spring.version}</version>
+ <optional>true</optional>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-jdbc</artifactId>
+ <version>${spring.version}</version>
+ <optional>true</optional>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
- <version>2.5.6</version>
- </dependency>
+ <version>${spring.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.persistence</groupId>
+ <artifactId>persistence-api</artifactId>
+ <version>1.0</version>
+ <optional>true</optional>
+ </dependency>
+
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-entitymanager</artifactId>
+ <version>3.4.0.GA</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ <version>1.5.2</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>com.h2database</groupId>
+ <artifactId>h2</artifactId>
+ <version>1.1.117</version>
+ <scope>test</scope>
+ </dependency>
+
</dependencies>
</project>
Added: labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/JPAKnowledgeServiceBean.java
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/JPAKnowledgeServiceBean.java (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/JPAKnowledgeServiceBean.java 2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,141 @@
+package org.drools.container.spring.beans.persistence;
+
+import java.util.Collections;
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceException;
+
+import org.drools.KnowledgeBase;
+import org.drools.RuntimeDroolsException;
+import org.drools.base.MapGlobalResolver;
+import org.drools.persistence.jpa.JPAKnowledgeServiceProvider;
+import org.drools.persistence.jpa.impl.JPAKnowledgeServiceProviderImpl;
+import org.drools.persistence.processinstance.VariablePersistenceStrategyFactory;
+import org.drools.persistence.processinstance.persisters.VariablePersister;
+import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.vsm.ServiceManager;
+import org.drools.vsm.local.ServiceManagerLocalClient;
+import org.springframework.orm.jpa.JpaCallback;
+import org.springframework.orm.jpa.support.JpaDaoSupport;
+import org.springframework.transaction.TransactionStatus;
+import org.springframework.transaction.support.AbstractPlatformTransactionManager;
+import org.springframework.transaction.support.TransactionCallback;
+import org.springframework.transaction.support.TransactionTemplate;
+
+public class JPAKnowledgeServiceBean extends JpaDaoSupport {
+ private ServiceManager serviceManager;
+ private KnowledgeBase kbase;
+ private JPAKnowledgeServiceProvider jpaKnowledgeServiceProvider;
+ private Environment environment;
+ private AbstractPlatformTransactionManager transactionManager;
+ private Map<Class<?>, Class<? extends VariablePersister>> variablePersisters = Collections.emptyMap();
+
+ public StatefulKnowledgeSession newStatefulKnowledgeSession() {
+ TransactionTemplate txTemplate = new TransactionTemplate(transactionManager);
+ return (StatefulKnowledgeSession) txTemplate.execute(new TransactionCallback() {
+ public Object doInTransaction(TransactionStatus status) {
+ return getJpaTemplate().execute(new JpaCallback() {
+ public StatefulKnowledgeSession doInJpa(EntityManager em) throws PersistenceException {
+ return jpaKnowledgeServiceProvider.newStatefulKnowledgeSession(kbase, null, environment);
+ }
+ });
+ }
+ });
+ }
+
+ public StatefulKnowledgeSession loadStatefulKnowledgeSession(final int sessionId) {
+ TransactionTemplate txTemplate = new TransactionTemplate(transactionManager);
+ return (StatefulKnowledgeSession) txTemplate.execute(new TransactionCallback() {
+ public Object doInTransaction(TransactionStatus status) {
+ return getJpaTemplate().execute(new JpaCallback() {
+ public StatefulKnowledgeSession doInJpa(EntityManager em) throws PersistenceException {
+ return jpaKnowledgeServiceProvider.loadStatefulKnowledgeSession(sessionId, kbase, null, environment);
+ }
+ });
+ }
+ });
+ }
+
+ @Override
+ protected void initDao() {
+ if (kbase == null) {
+ throw new IllegalArgumentException("property kbase is mandatory");
+ }
+ if (serviceManager == null) {
+ serviceManager = new ServiceManagerLocalClient();
+ }
+ if (environment == null) {
+ environment = serviceManager.getKnowledgeBaseFactory().newEnvironment();
+ }
+
+ if (environment.get(EnvironmentName.ENTITY_MANAGER_FACTORY) != null) {
+ logger.debug("overwriting environment key: " + EnvironmentName.ENTITY_MANAGER_FACTORY);
+ }
+ environment.set(EnvironmentName.ENTITY_MANAGER_FACTORY, getJpaTemplate().getEntityManagerFactory());
+
+ if (environment.get(EnvironmentName.TRANSACTION_MANAGER) != null) {
+ logger.debug("overwriting environment key: " + EnvironmentName.TRANSACTION_MANAGER);
+ }
+ environment.set(EnvironmentName.TRANSACTION_MANAGER, getTransactionManager());
+ environment.set(EnvironmentName.GLOBALS, new MapGlobalResolver());
+ jpaKnowledgeServiceProvider = serviceManager.JPAKnowledgeService();
+ if (jpaKnowledgeServiceProvider instanceof JPAKnowledgeServiceProviderImpl) {
+ ((JPAKnowledgeServiceProviderImpl) jpaKnowledgeServiceProvider).setCommandServiceClass(SpringSingleSessionCommandService.class);
+ } else {
+ throw new RuntimeDroolsException("JPAKnowledgeService is not instance of: " + JPAKnowledgeServiceProviderImpl.class.getName());
+ }
+
+ if (variablePersisters != null && !variablePersisters.isEmpty()) {
+ for (Map.Entry<Class<?>, Class<? extends VariablePersister>> entry : variablePersisters.entrySet()) {
+ VariablePersistenceStrategyFactory.getVariablePersistenceStrategy().setPersister(entry.getKey().getName(), entry.getValue().getName());
+ }
+ }
+// serviceManager.JPAKnowledgeService().loadStatefulKnowledgeSession(0,
+// serviceManager.getKnowledgeBaseFactory().newKnowledgeBase(),
+// null,
+// environment);
+ }
+
+ public KnowledgeBase getKbase() {
+ return kbase;
+ }
+
+ public void setKbase(KnowledgeBase kbase) {
+ this.kbase = kbase;
+ }
+
+ public ServiceManager getServiceManager() {
+ return serviceManager;
+ }
+
+ public void setServiceManager(ServiceManager serviceManager) {
+ this.serviceManager = serviceManager;
+ }
+
+ public Environment getEnvironment() {
+ return environment;
+ }
+
+ public void setEnvironment(Environment environment) {
+ this.environment = environment;
+ }
+
+ public AbstractPlatformTransactionManager getTransactionManager() {
+ return transactionManager;
+ }
+
+ public void setTransactionManager(AbstractPlatformTransactionManager transactionManager) {
+ this.transactionManager = transactionManager;
+ }
+
+ public void setVariablePersisters(Map<Class<?>, Class<? extends VariablePersister>> variablePersisters) {
+ this.variablePersisters = variablePersisters;
+ }
+
+ public Map<Class<?>, Class<? extends VariablePersister>> getVariablePersisters() {
+ return variablePersisters;
+ }
+}
Property changes on: labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/JPAKnowledgeServiceBean.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandService.java
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandService.java (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandService.java 2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,202 @@
+package org.drools.container.spring.beans.persistence;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.PersistenceException;
+
+import org.drools.KnowledgeBase;
+import org.drools.RuleBase;
+import org.drools.SessionConfiguration;
+import org.drools.command.CommandService;
+import org.drools.command.Context;
+import org.drools.command.impl.ContextImpl;
+import org.drools.command.impl.GenericCommand;
+import org.drools.command.impl.KnowledgeCommandContext;
+import org.drools.impl.KnowledgeBaseImpl;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
+import org.drools.persistence.processinstance.JPAProcessInstanceManager;
+import org.drools.persistence.processinstance.JPASignalManager;
+import org.drools.persistence.processinstance.JPAWorkItemManager;
+import org.drools.persistence.session.JPASessionMarshallingHelper;
+import org.drools.persistence.session.SessionInfo;
+import org.drools.reteoo.ReteooStatefulSession;
+import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
+import org.drools.runtime.KnowledgeSessionConfiguration;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.springframework.orm.jpa.JpaCallback;
+import org.springframework.orm.jpa.JpaTemplate;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.TransactionStatus;
+import org.springframework.transaction.support.TransactionCallback;
+import org.springframework.transaction.support.TransactionTemplate;
+
+public class SpringSingleSessionCommandService implements CommandService {
+ private JpaTemplate jpaTemplate;
+ private SessionInfo sessionInfo;
+ private JPASessionMarshallingHelper marshallingHelper;
+ private StatefulKnowledgeSession ksession;
+ private Environment env;
+ private KnowledgeCommandContext kContext;
+ private PlatformTransactionManager transactionManager;
+
+ public void checkEnvironment(Environment env) {
+ if (env.get(EnvironmentName.ENTITY_MANAGER_FACTORY) == null) {
+ throw new IllegalArgumentException("Environment must have an EntityManagerFactory");
+ }
+ this.env = env;
+ transactionManager = (PlatformTransactionManager) env.get(EnvironmentName.TRANSACTION_MANAGER);
+ if (transactionManager == null) {
+ throw new IllegalArgumentException("Environment must have an TransactionManager");
+ }
+ }
+
+ public SpringSingleSessionCommandService(RuleBase ruleBase,
+ SessionConfiguration conf,
+ Environment env) {
+ this(new KnowledgeBaseImpl(ruleBase), conf, env);
+ }
+
+ public SpringSingleSessionCommandService(int sessionId,
+ RuleBase ruleBase,
+ SessionConfiguration conf,
+ Environment env) {
+ this(sessionId, new KnowledgeBaseImpl(ruleBase), conf, env);
+ }
+
+ public SpringSingleSessionCommandService(KnowledgeBase kbase,
+ KnowledgeSessionConfiguration conf,
+ Environment env) {
+ if (conf == null) {
+ conf = new SessionConfiguration();
+ }
+ checkEnvironment(env);
+ this.sessionInfo = new SessionInfo();
+
+ ReteooStatefulSession session = (ReteooStatefulSession)
+ ((KnowledgeBaseImpl) kbase).ruleBase.newStatefulSession((SessionConfiguration) conf, this.env);
+ this.ksession = new StatefulKnowledgeSessionImpl(session, kbase);
+
+ this.kContext = new KnowledgeCommandContext(new ContextImpl("ksession", null), null, null, this.ksession, null);
+ ((JPASignalManager) ((StatefulKnowledgeSessionImpl) ksession).session.getSignalManager())
+ .setCommandService(this);
+
+ this.marshallingHelper = new JPASessionMarshallingHelper(this.ksession, conf);
+
+ this.sessionInfo.setJPASessionMashallingHelper(this.marshallingHelper);
+
+ TransactionTemplate txTemplate = new TransactionTemplate(transactionManager);
+ jpaTemplate = new JpaTemplate((EntityManagerFactory) env.get(EnvironmentName.ENTITY_MANAGER_FACTORY));
+
+ txTemplate.execute(new TransactionCallback() {
+ public Object doInTransaction(TransactionStatus status) {
+ Object result = jpaTemplate.execute(new JpaCallback() {
+ public Object doInJpa(EntityManager em) throws PersistenceException {
+ SpringSingleSessionCommandService.this.env.set(EnvironmentName.ENTITY_MANAGER, em);
+ em.persist(sessionInfo);
+ // update the session id to be the same as the session info id
+ ((StatefulKnowledgeSessionImpl) ksession).session.setId(sessionInfo.getId());
+ em.flush();
+ SpringSingleSessionCommandService.this.env.set(EnvironmentName.ENTITY_MANAGER, null);
+ return null;
+ }
+ });
+ return result;
+ }
+ });
+ }
+
+ public SpringSingleSessionCommandService(final int sessionId,
+ final KnowledgeBase kbase,
+ KnowledgeSessionConfiguration conf,
+ Environment env) {
+ final KnowledgeSessionConfiguration localConf = conf == null ? new SessionConfiguration() : conf;
+ this.env = env;
+ checkEnvironment(env);
+ TransactionTemplate txTemplate = new TransactionTemplate(transactionManager);
+ jpaTemplate = new JpaTemplate((EntityManagerFactory) env.get(EnvironmentName.ENTITY_MANAGER_FACTORY));
+ txTemplate.execute(new TransactionCallback() {
+ public Object doInTransaction(TransactionStatus status) {
+ return jpaTemplate.execute(new JpaCallback() {
+
+ public Object doInJpa(EntityManager em) throws PersistenceException {
+ SpringSingleSessionCommandService.this.env.set(EnvironmentName.ENTITY_MANAGER, em);
+ sessionInfo = em.find(SessionInfo.class, sessionId);
+
+ if (sessionInfo == null) {
+ SpringSingleSessionCommandService.this.env.set(EnvironmentName.ENTITY_MANAGER, null);
+ throw new RuntimeException("Could not find session data for id " + sessionId);
+ }
+
+ marshallingHelper = new JPASessionMarshallingHelper(sessionInfo,
+ kbase,
+ localConf,
+ SpringSingleSessionCommandService.this.env);
+
+ sessionInfo.setJPASessionMashallingHelper(marshallingHelper);
+ ksession = marshallingHelper.getObject();
+ kContext = new KnowledgeCommandContext(new ContextImpl("ksession", null), null, null, ksession,
+ null);
+ ((JPASignalManager) ((StatefulKnowledgeSessionImpl) ksession).session.getSignalManager())
+ .setCommandService(SpringSingleSessionCommandService.this);
+
+ // update the session id to be the same as the session info id
+ ((StatefulKnowledgeSessionImpl) ksession).session.setId(sessionInfo.getId());
+ em.flush();
+ SpringSingleSessionCommandService.this.env.set(EnvironmentName.ENTITY_MANAGER, null);
+ return sessionInfo;
+ }
+ });
+ }
+ });
+ }
+
+ public Context getContext() {
+ return this.kContext;
+ }
+
+ @SuppressWarnings("unchecked")
+ public synchronized <T> T execute(final GenericCommand<T> command) {
+ ksession.halt();
+
+ TransactionTemplate txTemplate = new TransactionTemplate(transactionManager);
+ T result = (T) txTemplate.execute(new TransactionCallback() {
+ public Object doInTransaction(TransactionStatus status) {
+ T result = (T) jpaTemplate.execute(new JpaCallback() {
+ public Object doInJpa(EntityManager em) {
+ env.set(EnvironmentName.ENTITY_MANAGER, em);
+ SessionInfo sessionInfoMerged = em.merge(sessionInfo);
+ sessionInfoMerged.setJPASessionMashallingHelper(sessionInfo.getJPASessionMashallingHelper());
+ sessionInfo = sessionInfoMerged;
+ // sessionInfo = em.find(SessionInfo.class, sessionInfo.getId());
+ // sessionInfo.setJPASessionMashallingHelper(marshallingHelper);
+ // marshallingHelper.loadSnapshot(sessionInfo.getData(), ksession);
+ sessionInfo.setDirty();
+ T result = command.execute(kContext);
+ em.flush();
+ env.set(EnvironmentName.ENTITY_MANAGER, null);
+ return result;
+ }
+
+ });
+ // clean up cached process and work item instances
+ ((JPAProcessInstanceManager) ((StatefulKnowledgeSessionImpl) ksession).session
+ .getProcessInstanceManager()).clearProcessInstances();
+ ((JPAWorkItemManager) ((StatefulKnowledgeSessionImpl) ksession).session.getWorkItemManager())
+ .clearWorkItems();
+ return result;
+ }
+ });
+ return result;
+ }
+
+ public void dispose() {
+ if (ksession != null) {
+ ksession.dispose();
+ }
+ }
+
+ public int getSessionId() {
+ return sessionInfo.getId();
+ }
+}
Property changes on: labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandService.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Modified: labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/namespace/KnowledgeBaseDefinitionParser.java
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/namespace/KnowledgeBaseDefinitionParser.java 2009-12-16 19:09:39 UTC (rev 30726)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/namespace/KnowledgeBaseDefinitionParser.java 2009-12-16 19:09:49 UTC (rev 30727)
@@ -14,7 +14,6 @@
public class KnowledgeBaseDefinitionParser extends AbstractBeanDefinitionParser {
- private static final String RESOUCES_ATTRIBUTE = "resources";
private static final String SERVICE_MANAGER_ATTRIBUTE = "serviceManager";
@SuppressWarnings("unchecked")
Added: labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandServiceTest.java
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandServiceTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandServiceTest.java 2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,660 @@
+package org.drools.container.spring.beans.persistence;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Properties;
+
+import javax.persistence.EntityManagerFactory;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.SessionConfiguration;
+import org.drools.command.runtime.process.CompleteWorkItemCommand;
+import org.drools.command.runtime.process.GetProcessInstanceCommand;
+import org.drools.command.runtime.process.StartProcessCommand;
+import org.drools.compiler.PackageBuilder;
+import org.drools.compiler.ProcessBuilder;
+import org.drools.definition.KnowledgePackage;
+import org.drools.definitions.impl.KnowledgePackageImp;
+import org.drools.helper.FileHelper;
+import org.drools.impl.KnowledgeBaseImpl;
+import org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory;
+import org.drools.persistence.processinstance.JPASignalManagerFactory;
+import org.drools.persistence.processinstance.JPAWorkItemManagerFactory;
+import org.drools.process.core.Work;
+import org.drools.process.core.impl.WorkImpl;
+import org.drools.process.core.timer.Timer;
+import org.drools.rule.Package;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.drools.ruleflow.instance.RuleFlowProcessInstance;
+import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
+import org.drools.runtime.process.NodeInstance;
+import org.drools.runtime.process.ProcessInstance;
+import org.drools.runtime.process.WorkItem;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.ConnectionImpl;
+import org.drools.workflow.core.impl.DroolsConsequenceAction;
+import org.drools.workflow.core.node.ActionNode;
+import org.drools.workflow.core.node.EndNode;
+import org.drools.workflow.core.node.StartNode;
+import org.drools.workflow.core.node.SubProcessNode;
+import org.drools.workflow.core.node.TimerNode;
+import org.drools.workflow.core.node.WorkItemNode;
+import org.drools.workflow.instance.node.SubProcessNodeInstance;
+import org.h2.tools.Server;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.transaction.PlatformTransactionManager;
+
+public class SpringSingleSessionCommandServiceTest {
+ private static final Logger log = LoggerFactory.getLogger(SpringSingleSessionCommandServiceTest.class);
+ private static Server h2Server;
+
+ private ClassPathXmlApplicationContext ctx;
+ private EntityManagerFactory emf;
+ private PlatformTransactionManager txManager;
+
+ @BeforeClass
+ public static void startH2Database() throws Exception {
+ File dbDir = new File(System.getProperty("java.io.tmpdir") + "/_droolsFlowDB");
+ if (dbDir.exists()) {
+ log.info("database exists, deleting before run tests, db location: {}", dbDir.getAbsolutePath());
+ FileHelper.remove(dbDir);
+ }
+ dbDir.mkdirs();
+ log.info("creating database on: {}", dbDir );
+ h2Server = Server.createTcpServer(new String[] {"-baseDir " + dbDir.getAbsolutePath()});
+ h2Server.start();
+ }
+
+ @AfterClass
+ public static void stopH2Database() {
+ log.info("stoping database");
+ h2Server.stop();
+ File dbDir = new File(System.getProperty("java.io.tmpdir") + "/_droolsFlowDB");
+ log.info("deleting database: {}", dbDir.getAbsoluteFile());
+ FileHelper.remove(dbDir);
+ }
+
+ @Before
+ public void createSpringContext() {
+ log.info("creating spring context");
+ ctx = new ClassPathXmlApplicationContext("org/drools/container/spring/beans/persistence/beans.xml");
+ emf = (EntityManagerFactory) ctx.getBean("myEmf");
+ txManager = (PlatformTransactionManager) ctx.getBean("txManager");
+ }
+
+ @After
+ public void destrySpringContext() {
+ log.info("destroy spring context");
+ ctx.destroy();
+ }
+
+ private SpringSingleSessionCommandService buildCommandService(KnowledgeBase kbase) {
+ Environment env = KnowledgeBaseFactory.newEnvironment();
+ env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
+ env.set(EnvironmentName.TRANSACTION_MANAGER, txManager);
+ Properties properties = new Properties();
+ properties.setProperty( "drools.commandService",
+ SpringSingleSessionCommandService.class.getName() );
+ properties.setProperty( "drools.processInstanceManagerFactory",
+ JPAProcessInstanceManagerFactory.class.getName() );
+ properties.setProperty( "drools.workItemManagerFactory",
+ JPAWorkItemManagerFactory.class.getName() );
+ properties.setProperty( "drools.processSignalManagerFactory",
+ JPASignalManagerFactory.class.getName() );
+ SessionConfiguration config = new SessionConfiguration( properties );
+
+ return new SpringSingleSessionCommandService( kbase, config, env );
+ }
+
+ private SpringSingleSessionCommandService buildCommandService(int sessionId, KnowledgeBase kbase) {
+ Environment env = KnowledgeBaseFactory.newEnvironment();
+ env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
+ env.set(EnvironmentName.TRANSACTION_MANAGER, txManager);
+ Properties properties = new Properties();
+ properties.setProperty( "drools.commandService",
+ SpringSingleSessionCommandService.class.getName() );
+ properties.setProperty( "drools.processInstanceManagerFactory",
+ JPAProcessInstanceManagerFactory.class.getName() );
+ properties.setProperty( "drools.workItemManagerFactory",
+ JPAWorkItemManagerFactory.class.getName() );
+ properties.setProperty( "drools.processSignalManagerFactory",
+ JPASignalManagerFactory.class.getName() );
+ SessionConfiguration config = new SessionConfiguration( properties );
+
+ return new SpringSingleSessionCommandService(sessionId, kbase, config, env );
+ }
+
+ @Test
+ public void testPersistenceWorkItems() throws Exception {
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ Collection<KnowledgePackage> kpkgs = getProcessWorkItems();
+ kbase.addKnowledgePackages( kpkgs );
+
+ SpringSingleSessionCommandService service = buildCommandService(kbase);
+
+ int sessionId = service.getSessionId();
+
+ StartProcessCommand startProcessCommand = new StartProcessCommand();
+ startProcessCommand.setProcessId( "org.drools.test.TestProcess" );
+ ProcessInstance processInstance = service.execute( startProcessCommand );
+ log.info( "Started process instance {}", processInstance.getId() );
+
+ TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
+ WorkItem workItem = handler.getWorkItem();
+ Assert.assertNotNull( workItem );
+ service.dispose();
+
+ service = buildCommandService(sessionId, kbase);
+ GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
+ getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+ processInstance = service.execute( getProcessInstanceCommand );
+ Assert.assertNotNull( processInstance );
+ service.dispose();
+
+ service = buildCommandService(sessionId, kbase);
+ CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
+ completeWorkItemCommand.setWorkItemId( workItem.getId() );
+ service.execute( completeWorkItemCommand );
+
+ workItem = handler.getWorkItem();
+ Assert.assertNotNull( workItem );
+ service.dispose();
+
+ service = buildCommandService(sessionId, kbase);
+ getProcessInstanceCommand = new GetProcessInstanceCommand();
+ getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+ processInstance = service.execute( getProcessInstanceCommand );
+ Assert.assertNotNull( processInstance );
+ service.dispose();
+
+ service = buildCommandService(sessionId, kbase);
+ completeWorkItemCommand = new CompleteWorkItemCommand();
+ completeWorkItemCommand.setWorkItemId( workItem.getId() );
+ service.execute( completeWorkItemCommand );
+
+ workItem = handler.getWorkItem();
+ Assert.assertNotNull( workItem );
+ service.dispose();
+
+ service = buildCommandService(sessionId, kbase);
+ getProcessInstanceCommand = new GetProcessInstanceCommand();
+ getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+ processInstance = service.execute( getProcessInstanceCommand );
+ Assert.assertNotNull( processInstance );
+ service.dispose();
+
+ service = buildCommandService(sessionId, kbase);
+ completeWorkItemCommand = new CompleteWorkItemCommand();
+ completeWorkItemCommand.setWorkItemId( workItem.getId() );
+ service.execute( completeWorkItemCommand );
+
+ workItem = handler.getWorkItem();
+ Assert.assertNull( workItem );
+ service.dispose();
+
+ service = buildCommandService(sessionId, kbase);
+ getProcessInstanceCommand = new GetProcessInstanceCommand();
+ getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+ processInstance = service.execute( getProcessInstanceCommand );
+ Assert.assertNull( processInstance );
+ service.dispose();
+ }
+
+ @Test
+ public void testPersistenceWorkItemsUserTransaction() throws Exception {
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ Collection<KnowledgePackage> kpkgs = getProcessWorkItems();
+ kbase.addKnowledgePackages( kpkgs );
+
+ SpringSingleSessionCommandService service = buildCommandService(kbase);
+ int sessionId = service.getSessionId();
+
+ StartProcessCommand startProcessCommand = new StartProcessCommand();
+ startProcessCommand.setProcessId( "org.drools.test.TestProcess" );
+ ProcessInstance processInstance = service.execute( startProcessCommand );
+ log.info( "Started process instance {}", processInstance.getId() );
+
+ TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
+ WorkItem workItem = handler.getWorkItem();
+ Assert.assertNotNull( workItem );
+ service.dispose();
+
+ service = buildCommandService(sessionId, kbase);
+ GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
+ getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+ processInstance = service.execute( getProcessInstanceCommand );
+ Assert.assertNotNull( processInstance );
+ service.dispose();
+
+ service = buildCommandService(sessionId, kbase);
+ CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
+ completeWorkItemCommand.setWorkItemId( workItem.getId() );
+ service.execute( completeWorkItemCommand );
+
+ workItem = handler.getWorkItem();
+ Assert.assertNotNull( workItem );
+ service.dispose();
+
+ service =buildCommandService(sessionId, kbase);
+ getProcessInstanceCommand = new GetProcessInstanceCommand();
+ getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+ processInstance = service.execute( getProcessInstanceCommand );
+ Assert.assertNotNull( processInstance );
+ service.dispose();
+
+ service = buildCommandService(sessionId, kbase);
+ completeWorkItemCommand = new CompleteWorkItemCommand();
+ completeWorkItemCommand.setWorkItemId( workItem.getId() );
+ service.execute( completeWorkItemCommand );
+
+ workItem = handler.getWorkItem();
+ Assert.assertNotNull( workItem );
+ service.dispose();
+
+ service = buildCommandService(sessionId, kbase);
+ getProcessInstanceCommand = new GetProcessInstanceCommand();
+ getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+ processInstance = service.execute( getProcessInstanceCommand );
+ Assert.assertNotNull( processInstance );
+ service.dispose();
+
+ service = buildCommandService(sessionId, kbase);
+ completeWorkItemCommand = new CompleteWorkItemCommand();
+ completeWorkItemCommand.setWorkItemId( workItem.getId() );
+ service.execute( completeWorkItemCommand );
+
+ workItem = handler.getWorkItem();
+ Assert.assertNull( workItem );
+ service.dispose();
+
+ service = buildCommandService(sessionId, kbase);
+ getProcessInstanceCommand = new GetProcessInstanceCommand();
+ getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+ processInstance = service.execute( getProcessInstanceCommand );
+ Assert.assertNull( processInstance );
+ service.dispose();
+ }
+
+ private Collection<KnowledgePackage> getProcessWorkItems() {
+ RuleFlowProcess process = new RuleFlowProcess();
+ process.setId( "org.drools.test.TestProcess" );
+ process.setName( "TestProcess" );
+ process.setPackageName( "org.drools.test" );
+ StartNode start = new StartNode();
+ start.setId( 1 );
+ start.setName( "Start" );
+ process.addNode( start );
+ ActionNode actionNode = new ActionNode();
+ actionNode.setId( 2 );
+ actionNode.setName( "Action" );
+ DroolsConsequenceAction action = new DroolsConsequenceAction();
+ action.setDialect( "java" );
+ action.setConsequence( "System.out.println(\"Executed action\");" );
+ actionNode.setAction( action );
+ process.addNode( actionNode );
+ new ConnectionImpl( start,
+ Node.CONNECTION_DEFAULT_TYPE,
+ actionNode,
+ Node.CONNECTION_DEFAULT_TYPE );
+ WorkItemNode workItemNode = new WorkItemNode();
+ workItemNode.setId( 3 );
+ workItemNode.setName( "WorkItem1" );
+ Work work = new WorkImpl();
+ work.setName( "MyWork" );
+ workItemNode.setWork( work );
+ process.addNode( workItemNode );
+ new ConnectionImpl( actionNode,
+ Node.CONNECTION_DEFAULT_TYPE,
+ workItemNode,
+ Node.CONNECTION_DEFAULT_TYPE );
+ WorkItemNode workItemNode2 = new WorkItemNode();
+ workItemNode2.setId( 4 );
+ workItemNode2.setName( "WorkItem2" );
+ work = new WorkImpl();
+ work.setName( "MyWork" );
+ workItemNode2.setWork( work );
+ process.addNode( workItemNode2 );
+ new ConnectionImpl( workItemNode,
+ Node.CONNECTION_DEFAULT_TYPE,
+ workItemNode2,
+ Node.CONNECTION_DEFAULT_TYPE );
+ WorkItemNode workItemNode3 = new WorkItemNode();
+ workItemNode3.setId( 5 );
+ workItemNode3.setName( "WorkItem3" );
+ work = new WorkImpl();
+ work.setName( "MyWork" );
+ workItemNode3.setWork( work );
+ process.addNode( workItemNode3 );
+ new ConnectionImpl( workItemNode2,
+ Node.CONNECTION_DEFAULT_TYPE,
+ workItemNode3,
+ Node.CONNECTION_DEFAULT_TYPE );
+ EndNode end = new EndNode();
+ end.setId( 6 );
+ end.setName( "End" );
+ process.addNode( end );
+ new ConnectionImpl( workItemNode3,
+ Node.CONNECTION_DEFAULT_TYPE,
+ end,
+ Node.CONNECTION_DEFAULT_TYPE );
+
+ PackageBuilder packageBuilder = new PackageBuilder();
+ ProcessBuilder processBuilder = new ProcessBuilder( packageBuilder );
+ processBuilder.buildProcess( process,
+ null );
+ List<KnowledgePackage> list = new ArrayList<KnowledgePackage>();
+ list.add( new KnowledgePackageImp( packageBuilder.getPackage() ) );
+ return list;
+ }
+
+ @Test
+ public void testPersistenceSubProcess() {
+ RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ Package pkg = getProcessSubProcess();
+ ruleBase.addPackage( pkg );
+
+ SpringSingleSessionCommandService service = buildCommandService( new KnowledgeBaseImpl( ruleBase ));
+ int sessionId = service.getSessionId();
+ StartProcessCommand startProcessCommand = new StartProcessCommand();
+ startProcessCommand.setProcessId( "org.drools.test.TestProcess" );
+ RuleFlowProcessInstance processInstance = (RuleFlowProcessInstance) service.execute( startProcessCommand );
+ log.info( "Started process instance {}", processInstance.getId() );
+ long processInstanceId = processInstance.getId();
+
+ TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
+ WorkItem workItem = handler.getWorkItem();
+ Assert.assertNotNull( workItem );
+ service.dispose();
+
+ service = buildCommandService(sessionId, new KnowledgeBaseImpl( ruleBase ));
+ GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
+ getProcessInstanceCommand.setProcessInstanceId( processInstanceId );
+ processInstance = (RuleFlowProcessInstance) service.execute( getProcessInstanceCommand );
+ Assert.assertNotNull( processInstance );
+
+ Collection<NodeInstance> nodeInstances = processInstance.getNodeInstances();
+ Assert.assertEquals( 1,
+ nodeInstances.size() );
+ SubProcessNodeInstance subProcessNodeInstance = (SubProcessNodeInstance) nodeInstances.iterator().next();
+ long subProcessInstanceId = subProcessNodeInstance.getProcessInstanceId();
+ getProcessInstanceCommand = new GetProcessInstanceCommand();
+ getProcessInstanceCommand.setProcessInstanceId( subProcessInstanceId );
+ RuleFlowProcessInstance subProcessInstance = (RuleFlowProcessInstance) service.execute( getProcessInstanceCommand );
+ Assert.assertNotNull( subProcessInstance );
+ service.dispose();
+
+ service = buildCommandService(sessionId, new KnowledgeBaseImpl( ruleBase ));
+ CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
+ completeWorkItemCommand.setWorkItemId( workItem.getId() );
+ service.execute( completeWorkItemCommand );
+ service.dispose();
+
+ service = buildCommandService(sessionId, new KnowledgeBaseImpl( ruleBase ));
+ getProcessInstanceCommand = new GetProcessInstanceCommand();
+ getProcessInstanceCommand.setProcessInstanceId( subProcessInstanceId );
+ subProcessInstance = (RuleFlowProcessInstance) service.execute( getProcessInstanceCommand );
+ Assert.assertNull( subProcessInstance );
+
+ getProcessInstanceCommand = new GetProcessInstanceCommand();
+ getProcessInstanceCommand.setProcessInstanceId( processInstanceId );
+ processInstance = (RuleFlowProcessInstance) service.execute( getProcessInstanceCommand );
+ Assert.assertNull( processInstance );
+ service.dispose();
+ }
+
+ private Package getProcessSubProcess() {
+ RuleFlowProcess process = new RuleFlowProcess();
+ process.setId( "org.drools.test.TestProcess" );
+ process.setName( "TestProcess" );
+ process.setPackageName( "org.drools.test" );
+ StartNode start = new StartNode();
+ start.setId( 1 );
+ start.setName( "Start" );
+ process.addNode( start );
+ ActionNode actionNode = new ActionNode();
+ actionNode.setId( 2 );
+ actionNode.setName( "Action" );
+ DroolsConsequenceAction action = new DroolsConsequenceAction();
+ action.setDialect( "java" );
+ action.setConsequence( "System.out.println(\"Executed action\");" );
+ actionNode.setAction( action );
+ process.addNode( actionNode );
+ new ConnectionImpl( start,
+ Node.CONNECTION_DEFAULT_TYPE,
+ actionNode,
+ Node.CONNECTION_DEFAULT_TYPE );
+ SubProcessNode subProcessNode = new SubProcessNode();
+ subProcessNode.setId( 3 );
+ subProcessNode.setName( "SubProcess" );
+ subProcessNode.setProcessId( "org.drools.test.SubProcess" );
+ process.addNode( subProcessNode );
+ new ConnectionImpl( actionNode,
+ Node.CONNECTION_DEFAULT_TYPE,
+ subProcessNode,
+ Node.CONNECTION_DEFAULT_TYPE );
+ EndNode end = new EndNode();
+ end.setId( 4 );
+ end.setName( "End" );
+ process.addNode( end );
+ new ConnectionImpl( subProcessNode,
+ Node.CONNECTION_DEFAULT_TYPE,
+ end,
+ Node.CONNECTION_DEFAULT_TYPE );
+
+ PackageBuilder packageBuilder = new PackageBuilder();
+ ProcessBuilder processBuilder = new ProcessBuilder( packageBuilder );
+ processBuilder.buildProcess( process,
+ null );
+
+ process = new RuleFlowProcess();
+ process.setId( "org.drools.test.SubProcess" );
+ process.setName( "SubProcess" );
+ process.setPackageName( "org.drools.test" );
+ start = new StartNode();
+ start.setId( 1 );
+ start.setName( "Start" );
+ process.addNode( start );
+ actionNode = new ActionNode();
+ actionNode.setId( 2 );
+ actionNode.setName( "Action" );
+ action = new DroolsConsequenceAction();
+ action.setDialect( "java" );
+ action.setConsequence( "System.out.println(\"Executed action\");" );
+ actionNode.setAction( action );
+ process.addNode( actionNode );
+ new ConnectionImpl( start,
+ Node.CONNECTION_DEFAULT_TYPE,
+ actionNode,
+ Node.CONNECTION_DEFAULT_TYPE );
+ WorkItemNode workItemNode = new WorkItemNode();
+ workItemNode.setId( 3 );
+ workItemNode.setName( "WorkItem1" );
+ Work work = new WorkImpl();
+ work.setName( "MyWork" );
+ workItemNode.setWork( work );
+ process.addNode( workItemNode );
+ new ConnectionImpl( actionNode,
+ Node.CONNECTION_DEFAULT_TYPE,
+ workItemNode,
+ Node.CONNECTION_DEFAULT_TYPE );
+ end = new EndNode();
+ end.setId( 6 );
+ end.setName( "End" );
+ process.addNode( end );
+ new ConnectionImpl( workItemNode,
+ Node.CONNECTION_DEFAULT_TYPE,
+ end,
+ Node.CONNECTION_DEFAULT_TYPE );
+
+ processBuilder.buildProcess( process,
+ null );
+ return packageBuilder.getPackage();
+ }
+
+ @Test
+ public void testPersistenceTimer() throws Exception {
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ Collection<KnowledgePackage> kpkgs = getProcessTimer();
+ kbase.addKnowledgePackages( kpkgs );
+
+ SpringSingleSessionCommandService service = buildCommandService(kbase);
+ int sessionId = service.getSessionId();
+ StartProcessCommand startProcessCommand = new StartProcessCommand();
+ startProcessCommand.setProcessId( "org.drools.test.TestProcess" );
+ ProcessInstance processInstance = service.execute( startProcessCommand );
+ log.info( "Started process instance {}", processInstance.getId() );
+ service.dispose();
+
+ service = buildCommandService(sessionId, kbase);
+ GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
+ getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+ processInstance = service.execute( getProcessInstanceCommand );
+ Assert.assertNotNull( processInstance );
+ service.dispose();
+
+ service = buildCommandService(sessionId, kbase);
+ Thread.sleep( 3000 );
+ getProcessInstanceCommand = new GetProcessInstanceCommand();
+ getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+ processInstance = service.execute( getProcessInstanceCommand );
+ Assert.assertNull( processInstance );
+ }
+
+ private List<KnowledgePackage> getProcessTimer() {
+ RuleFlowProcess process = new RuleFlowProcess();
+ process.setId( "org.drools.test.TestProcess" );
+ process.setName( "TestProcess" );
+ process.setPackageName( "org.drools.test" );
+ StartNode start = new StartNode();
+ start.setId( 1 );
+ start.setName( "Start" );
+ process.addNode( start );
+ TimerNode timerNode = new TimerNode();
+ timerNode.setId( 2 );
+ timerNode.setName( "Timer" );
+ Timer timer = new Timer();
+ timer.setDelay( "2000" );
+ timerNode.setTimer( timer );
+ process.addNode( timerNode );
+ new ConnectionImpl( start,
+ Node.CONNECTION_DEFAULT_TYPE,
+ timerNode,
+ Node.CONNECTION_DEFAULT_TYPE );
+ ActionNode actionNode = new ActionNode();
+ actionNode.setId( 3 );
+ actionNode.setName( "Action" );
+ DroolsConsequenceAction action = new DroolsConsequenceAction();
+ action.setDialect( "java" );
+ action.setConsequence( "System.out.println(\"Executed action\");" );
+ actionNode.setAction( action );
+ process.addNode( actionNode );
+ new ConnectionImpl( timerNode,
+ Node.CONNECTION_DEFAULT_TYPE,
+ actionNode,
+ Node.CONNECTION_DEFAULT_TYPE );
+ EndNode end = new EndNode();
+ end.setId( 6 );
+ end.setName( "End" );
+ process.addNode( end );
+ new ConnectionImpl( actionNode,
+ Node.CONNECTION_DEFAULT_TYPE,
+ end,
+ Node.CONNECTION_DEFAULT_TYPE );
+
+ PackageBuilder packageBuilder = new PackageBuilder();
+ ProcessBuilder processBuilder = new ProcessBuilder( packageBuilder );
+ processBuilder.buildProcess( process,
+ null );
+ List<KnowledgePackage> list = new ArrayList<KnowledgePackage>();
+ list.add( new KnowledgePackageImp( packageBuilder.getPackage() ) );
+ return list;
+ }
+
+ @Test
+ public void testPersistenceTimer2() throws Exception {
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ Collection<KnowledgePackage> kpkgs = getProcessTimer2();
+ kbase.addKnowledgePackages( kpkgs );
+
+ SpringSingleSessionCommandService service = buildCommandService(kbase);
+ int sessionId = service.getSessionId();
+ StartProcessCommand startProcessCommand = new StartProcessCommand();
+ startProcessCommand.setProcessId( "org.drools.test.TestProcess" );
+ ProcessInstance processInstance = service.execute( startProcessCommand );
+ log.info( "Started process instance {}", processInstance.getId() );
+
+ Thread.sleep( 2000 );
+
+ service = buildCommandService(sessionId, kbase);
+ GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
+ getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+ processInstance = service.execute( getProcessInstanceCommand );
+ Assert.assertNull( processInstance );
+ }
+
+ private List<KnowledgePackage> getProcessTimer2() {
+ RuleFlowProcess process = new RuleFlowProcess();
+ process.setId( "org.drools.test.TestProcess" );
+ process.setName( "TestProcess" );
+ process.setPackageName( "org.drools.test" );
+ StartNode start = new StartNode();
+ start.setId( 1 );
+ start.setName( "Start" );
+ process.addNode( start );
+ TimerNode timerNode = new TimerNode();
+ timerNode.setId( 2 );
+ timerNode.setName( "Timer" );
+ Timer timer = new Timer();
+ timer.setDelay( "0" );
+ timerNode.setTimer( timer );
+ process.addNode( timerNode );
+ new ConnectionImpl( start,
+ Node.CONNECTION_DEFAULT_TYPE,
+ timerNode,
+ Node.CONNECTION_DEFAULT_TYPE );
+ ActionNode actionNode = new ActionNode();
+ actionNode.setId( 3 );
+ actionNode.setName( "Action" );
+ DroolsConsequenceAction action = new DroolsConsequenceAction();
+ action.setDialect( "java" );
+ action.setConsequence( "try { Thread.sleep(1000); } catch (Throwable t) {} System.out.println(\"Executed action\");" );
+ actionNode.setAction( action );
+ process.addNode( actionNode );
+ new ConnectionImpl( timerNode,
+ Node.CONNECTION_DEFAULT_TYPE,
+ actionNode,
+ Node.CONNECTION_DEFAULT_TYPE );
+ EndNode end = new EndNode();
+ end.setId( 6 );
+ end.setName( "End" );
+ process.addNode( end );
+ new ConnectionImpl( actionNode,
+ Node.CONNECTION_DEFAULT_TYPE,
+ end,
+ Node.CONNECTION_DEFAULT_TYPE );
+
+ PackageBuilder packageBuilder = new PackageBuilder();
+ ProcessBuilder processBuilder = new ProcessBuilder( packageBuilder );
+ processBuilder.buildProcess( process,
+ null );
+ List<KnowledgePackage> list = new ArrayList<KnowledgePackage>();
+ list.add( new KnowledgePackageImp( packageBuilder.getPackage() ) );
+ return list;
+ }
+}
Property changes on: labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandServiceTest.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/TestWorkItemHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/TestWorkItemHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/TestWorkItemHandler.java 2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,33 @@
+package org.drools.container.spring.beans.persistence;
+
+import org.drools.runtime.process.WorkItem;
+import org.drools.runtime.process.WorkItemHandler;
+import org.drools.runtime.process.WorkItemManager;
+
+public class TestWorkItemHandler implements WorkItemHandler {
+
+ private static TestWorkItemHandler INSTANCE = new TestWorkItemHandler();
+
+ private WorkItem workItem;
+
+ private TestWorkItemHandler() {
+ }
+
+ public static TestWorkItemHandler getInstance() {
+ return INSTANCE;
+ }
+
+ public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
+ this.workItem = workItem;
+ }
+
+ public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
+ }
+
+ public WorkItem getWorkItem() {
+ WorkItem result = workItem;
+ workItem = null;
+ return result;
+ }
+
+}
Property changes on: labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/TestWorkItemHandler.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/helper/FileHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/helper/FileHelper.java (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/helper/FileHelper.java 2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,15 @@
+package org.drools.helper;
+
+import java.io.File;
+
+public class FileHelper {
+ public static void remove(File file) {
+ if (file.isDirectory()) {
+ File[] files = file.listFiles();
+ for (File f : files) {
+ remove(f);
+ }
+ }
+ file.delete();
+ }
+}
Property changes on: labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/helper/FileHelper.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/MyWorkItemHandlers.conf
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/MyWorkItemHandlers.conf (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/MyWorkItemHandlers.conf 2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,12 @@
+// We use MVEL to return a List of work definitions
+// The properties of the work definitions are specified as a Map<String, Object>
+// The allowed properties are name, parameters, displayName, icon and customEditor
+// The returned result should thus be of type List<Map<String, Object>>
+import org.drools.container.spring.beans.persistence.TestWorkItemHandler;
+
+[
+
+ "MyWork" : TestWorkItemHandler.getInstance(),
+ "Human Task" : TestWorkItemHandler.getInstance()
+
+]
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/drools.session.conf
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/drools.session.conf (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/drools.session.conf 2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,5 @@
+drools.workItemHandlers = MyWorkItemHandlers.conf
+#drools.commandService = org.drools.persistence.session.SingleSessionCommandService
+#drools.processInstanceManagerFactory = org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory
+#drools.workItemManagerFactory = org.drools.persistence.processinstance.JPAWorkItemManagerFactory
+#drools.processSignalManagerFactory = org.drools.persistence.processinstance.JPASignalManagerFactory
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/orm.xml
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/orm.xml (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/orm.xml 2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
+ version="1.0">
+ <named-query name="ProcessInstancesWaitingForEvent">
+ <query>
+select
+ processInstanceInfo.processInstanceId
+from
+ ProcessInstanceInfo processInstanceInfo
+where
+ :type in elements(processInstanceInfo.eventTypes)
+ </query>
+ </named-query>
+</entity-mappings>
Property changes on: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/orm.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/persistence.xml
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/persistence.xml (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/persistence.xml 2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"
+ xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd
+ http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd">
+
+ <persistence-unit name="org.drools.persistence.jpa.local" transaction-type="RESOURCE_LOCAL">
+ <provider>org.hibernate.ejb.HibernatePersistence</provider>
+ <!--
+ <jta-data-source>jdbc/testDS1</jta-data-source>
+ -->
+ <class>org.drools.persistence.session.SessionInfo</class>
+ <class>org.drools.persistence.processinstance.ProcessInstanceInfo</class>
+ <class>org.drools.persistence.processinstance.WorkItemInfo</class>
+ <class>org.drools.persistence.processinstance.variabletypes.VariableInstanceInfo</class>
+ <class>org.drools.persistence.processinstance.variabletypes.JPAPersistedVariable</class>
+ <class>org.drools.persistence.processinstance.variabletypes.SerializablePersistedVariable</class>
+ <!--
+ <class>org.plugtree.labs.variablepersistence.StringPersistedVariable</class>
+ <class>org.plugtree.labs.variablepersistence.MyEntity</class>
+ <class>org.plugtree.labs.variablepersistence.MyVariableSerializable</class>
+ -->
+ <properties>
+ <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
+ <!--property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/-->
+ <!--property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/-->
+
+ <property name="hibernate.max_fetch_depth" value="3" />
+ <property name="hibernate.hbm2ddl.auto" value="create" />
+ <property name="hibernate.show_sql" value="false" />
+
+ <!--
+ <property name="hibernate.connection.autocommit" value="false" />
+ <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.BTMTransactionManagerLookup" />
+ -->
+ </properties>
+ </persistence-unit>
+</persistence>
Property changes on: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/persistence.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/log4j.xml
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/log4j.xml (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/log4j.xml 2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
+ <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+ <param name="Target" value="System.out"/>
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%-4r %d{dd/MM HH:mm:ss,SSS}[%t] %-5p %c{3}.%M %x - %m%n"/>
+ </layout>
+ </appender>
+ <!--
+ <logger name="org.drools">
+ <level value="DEBUG"/>
+ </logger>
+ -->
+
+ <logger name="org.hibernate">
+ <level value="DEBUG"/>
+ </logger>
+ <root>
+ <priority value="INFO"/>
+ <appender-ref ref="CONSOLE"/>
+ </root>
+</log4j:configuration>
Property changes on: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/log4j.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/org/drools/container/spring/beans/persistence/beans.xml
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/org/drools/container/spring/beans/persistence/beans.xml (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/org/drools/container/spring/beans/persistence/beans.xml 2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:drools="http://drools.org/schema/drools-spring"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
+ http://drools.org/schema/drools-spring http://drools.org/schema/drools-spring.xsd">
+
+ <bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
+ <!-- org.h2.jdbcx.JdbcDataSource -->
+ <property name="driverClassName" value="org.h2.Driver" />
+ <!-- jdbc:h2:mem:mydb
+ jdbc:h2:tcp://localhost/DroolsFlow-->
+ <property name="url" value="jdbc:h2:tcp://localhost/DroolsFlow" />
+ <property name="username" value="sa" />
+ <property name="password" value="" />
+ </bean>
+
+ <!--
+ <bean id="sm1" class="org.drools.vsm.local.ServiceManagerLocalClient" />
+ <drools:kbase id="kbase1" serviceManager="sm1">
+ <drools:resource type="DRF" source="classpath:rules/VariablePersistenceStrategyProcess.rf" />
+ </drools:kbase>
+ <drools:ksession id="ksession1" type="stateless" name="stateless1" kbase="kbase1" serviceManager="sm1" />
+ <drools:ksession id="ksession2" type="stateful" kbase="kbase1" serviceManager="sm1" />
+ -->
+ <bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
+ <property name="dataSource" ref="ds" />
+ <property name="persistenceUnitName" value="org.drools.persistence.jpa.local" />
+ </bean>
+
+ <bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
+ <property name="entityManagerFactory" ref="myEmf" />
+ </bean>
+
+ <!--
+ <bean id="jpaProcessKnowledgeProvider" class="org.drools.container.spring.beans.persistence.JPAKnowledgeServiceBean">
+ <property name="kbase" ref="kbase1" />
+ <property name="serviceManager" ref="sm1" />
+ <property name="entityManagerFactory" ref="myEmf" />
+ <property name="transactionManager" ref="txManager" />
+ <property name="variablePersisters">
+ <map>
+ <entry key="javax.persistence.Entity" value="org.drools.persistence.processinstance.persisters.JPAVariablePersister"/>
+ <entry key="java.lang.String" value="org.plugtree.labs.variablepersistence.StringVariablePersister"/>
+ <entry key="java.io.Serializable" value="org.drools.persistence.processinstance.persisters.SerializableVariablePersister"/>
+ </map>
+ </property>
+ </bean>
+ -->
+</beans>
\ No newline at end of file
Property changes on: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/org/drools/container/spring/beans/persistence/beans.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Modified: labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/impl/JPAKnowledgeServiceProviderImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/impl/JPAKnowledgeServiceProviderImpl.java 2009-12-16 19:09:39 UTC (rev 30726)
+++ labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/impl/JPAKnowledgeServiceProviderImpl.java 2009-12-16 19:09:49 UTC (rev 30727)
@@ -1,5 +1,7 @@
package org.drools.persistence.jpa.impl;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
import java.util.Properties;
import org.drools.KnowledgeBase;
@@ -7,86 +9,177 @@
import org.drools.command.CommandService;
import org.drools.command.impl.CommandBasedStatefulKnowledgeSession;
import org.drools.persistence.jpa.JPAKnowledgeServiceProvider;
+import org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory;
+import org.drools.persistence.processinstance.JPASignalManagerFactory;
+import org.drools.persistence.processinstance.JPAWorkItemManagerFactory;
import org.drools.persistence.session.SingleSessionCommandService;
+import org.drools.process.instance.ProcessInstanceManagerFactory;
+import org.drools.process.instance.WorkItemManagerFactory;
+import org.drools.process.instance.event.SignalManagerFactory;
import org.drools.runtime.Environment;
import org.drools.runtime.KnowledgeSessionConfiguration;
import org.drools.runtime.StatefulKnowledgeSession;
-import org.drools.runtime.process.ProcessInstance;
public class JPAKnowledgeServiceProviderImpl
- implements
- JPAKnowledgeServiceProvider {
+ implements
+ JPAKnowledgeServiceProvider {
- public StatefulKnowledgeSession newStatefulKnowledgeSession(KnowledgeBase kbase,
- KnowledgeSessionConfiguration configuration,
- Environment environment) {
- if ( configuration == null ) {
- configuration = new SessionConfiguration();
- }
-
- if ( environment == null ) {
- throw new IllegalArgumentException( "Environment cannot be null" );
- }
-
- Properties props = new Properties();
-
- props.setProperty( "drools.commandService",
- "org.drools.persistence.session.SingleSessionCommandService" );
- props.setProperty( "drools.processInstanceManagerFactory",
- "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory" );
- props.setProperty( "drools.workItemManagerFactory",
- "org.drools.persistence.processinstance.JPAWorkItemManagerFactory" );
- props.setProperty( "drools.processSignalManagerFactory",
- "org.drools.persistence.processinstance.JPASignalManagerFactory" );
-
- ((SessionConfiguration)configuration).addProperties( props );
+ private Class<? extends CommandService> commandServiceClass;
+ private Class<? extends ProcessInstanceManagerFactory> processInstanceManagerFactoryClass;
+ private Class<? extends WorkItemManagerFactory> workItemManagerFactoryClass;
+ private Class<? extends SignalManagerFactory> processSignalManagerFactoryClass;
- CommandService commandService = new SingleSessionCommandService( kbase,
- configuration,
- environment );
- return new CommandBasedStatefulKnowledgeSession( commandService );
- }
+ private Properties configProps = new Properties();
- public StatefulKnowledgeSession loadStatefulKnowledgeSession(int id,
- KnowledgeBase kbase,
- KnowledgeSessionConfiguration configuration,
- Environment environment) {
- if ( configuration == null ) {
- configuration = new SessionConfiguration();
- }
-
- if ( environment == null ) {
- throw new IllegalArgumentException( "Environment cannot be null" );
- }
-
- Properties props = new Properties();
-
- props.setProperty( "drools.commandService",
- "org.drools.persistence.session.SingleSessionCommandService" );
- props.setProperty( "drools.processInstanceManagerFactory",
- "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory" );
- props.setProperty( "drools.workItemManagerFactory",
- "org.drools.persistence.processinstance.JPAWorkItemManagerFactory" );
- props.setProperty( "drools.processSignalManagerFactory",
- "org.drools.persistence.processinstance.JPASignalManagerFactory" );
-
- ((SessionConfiguration)configuration).addProperties( props );
-
- CommandService commandService = new SingleSessionCommandService( id,
- kbase,
- configuration,
- environment );
- return new CommandBasedStatefulKnowledgeSession( commandService );
- }
-
- public int getStatefulKnowledgeSessionId(StatefulKnowledgeSession ksession) {
- if ( ksession instanceof CommandBasedStatefulKnowledgeSession) {
- SingleSessionCommandService commandService = ( SingleSessionCommandService ) ((CommandBasedStatefulKnowledgeSession)ksession).getCommandService();
- return commandService.getSessionId();
- } else {
- throw new IllegalArgumentException( "StatefulKnowledgeSession must be an a CommandBasedStatefulKnowledgeSession" );
- }
- }
-
+ public JPAKnowledgeServiceProviderImpl() {
+ setDefaultImplementations();
+ }
+ protected void setDefaultImplementations() {
+ setCommandServiceClass(SingleSessionCommandService.class);
+ setProcessInstanceManagerFactoryClass(JPAProcessInstanceManagerFactory.class);
+ setWorkItemManagerFactoryClass(JPAWorkItemManagerFactory.class);
+ setProcessSignalManagerFactoryClass(JPASignalManagerFactory.class);
+ }
+
+ public StatefulKnowledgeSession newStatefulKnowledgeSession(KnowledgeBase kbase,
+ KnowledgeSessionConfiguration configuration,
+ Environment environment) {
+ if (configuration == null) {
+ configuration = new SessionConfiguration();
+ }
+
+ if (environment == null) {
+ throw new IllegalArgumentException("Environment cannot be null");
+ }
+
+ return new CommandBasedStatefulKnowledgeSession(
+ buildCommanService(kbase, mergeConfig(configuration), environment));
+ }
+
+ public StatefulKnowledgeSession loadStatefulKnowledgeSession(int id,
+ KnowledgeBase kbase,
+ KnowledgeSessionConfiguration configuration,
+ Environment environment) {
+ if (configuration == null) {
+ configuration = new SessionConfiguration();
+ }
+
+ if (environment == null) {
+ throw new IllegalArgumentException("Environment cannot be null");
+ }
+
+ return new CommandBasedStatefulKnowledgeSession(
+ buildCommanService(id, kbase, mergeConfig(configuration), environment));
+ }
+
+ private CommandService buildCommanService(int sessionId,
+ KnowledgeBase kbase,
+ KnowledgeSessionConfiguration conf,
+ Environment env) {
+
+ try {
+ Class<? extends CommandService> serviceClass = getCommandServiceClass();
+ Constructor<? extends CommandService> constructor = serviceClass.getConstructor(int.class,
+ KnowledgeBase.class, KnowledgeSessionConfiguration.class, Environment.class);
+ return constructor.newInstance(sessionId, kbase, conf, env);
+ } catch (SecurityException e) {
+ throw new IllegalStateException(e);
+ } catch (NoSuchMethodException e) {
+ throw new IllegalStateException(e);
+ } catch (IllegalArgumentException e) {
+ throw new IllegalStateException(e);
+ } catch (InstantiationException e) {
+ throw new IllegalStateException(e);
+ } catch (IllegalAccessException e) {
+ throw new IllegalStateException(e);
+ } catch (InvocationTargetException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ private CommandService buildCommanService(KnowledgeBase kbase,
+ KnowledgeSessionConfiguration conf,
+ Environment env) {
+
+ Class<? extends CommandService> serviceClass = getCommandServiceClass();
+ try {
+ Constructor<? extends CommandService> constructor = serviceClass.getConstructor(KnowledgeBase.class,
+ KnowledgeSessionConfiguration.class, Environment.class);
+ return constructor.newInstance(kbase, conf, env);
+ } catch (SecurityException e) {
+ throw new IllegalStateException(e);
+ } catch (NoSuchMethodException e) {
+ throw new IllegalStateException(e);
+ } catch (IllegalArgumentException e) {
+ throw new IllegalStateException(e);
+ } catch (InstantiationException e) {
+ throw new IllegalStateException(e);
+ } catch (IllegalAccessException e) {
+ throw new IllegalStateException(e);
+ } catch (InvocationTargetException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ private KnowledgeSessionConfiguration mergeConfig(KnowledgeSessionConfiguration configuration) {
+ ((SessionConfiguration) configuration).addProperties(configProps);
+ return configuration;
+ }
+
+ public int getStatefulKnowledgeSessionId(StatefulKnowledgeSession ksession) {
+ if (ksession instanceof CommandBasedStatefulKnowledgeSession) {
+ SingleSessionCommandService commandService = (SingleSessionCommandService) ((CommandBasedStatefulKnowledgeSession) ksession)
+ .getCommandService();
+ return commandService.getSessionId();
+ }
+ throw new IllegalArgumentException("StatefulKnowledgeSession must be an a CommandBasedStatefulKnowledgeSession");
+ }
+
+ public void setCommandServiceClass(Class<? extends CommandService> commandServiceClass) {
+ if (commandServiceClass != null) {
+ this.commandServiceClass = commandServiceClass;
+ configProps.put("drools.commandService", commandServiceClass.getName());
+ }
+ }
+
+ public Class<? extends CommandService> getCommandServiceClass() {
+ return commandServiceClass;
+ }
+
+ public void setProcessInstanceManagerFactoryClass(
+ Class<? extends ProcessInstanceManagerFactory> processInstanceManagerFactoryClass) {
+ if (processInstanceManagerFactoryClass != null) {
+ this.processInstanceManagerFactoryClass = processInstanceManagerFactoryClass;
+ configProps.put("drools.processInstanceManagerFactory", processInstanceManagerFactoryClass.getName());
+ }
+ }
+
+ public Class<? extends ProcessInstanceManagerFactory> getProcessInstanceManagerFactoryClass() {
+ return processInstanceManagerFactoryClass;
+ }
+
+ public void setWorkItemManagerFactoryClass(Class<? extends WorkItemManagerFactory> workItemManagerFactoryClass) {
+ if (workItemManagerFactoryClass != null) {
+ this.workItemManagerFactoryClass = workItemManagerFactoryClass;
+ configProps.put("drools.workItemManagerFactory", workItemManagerFactoryClass.getName());
+ }
+ }
+
+ public Class<? extends WorkItemManagerFactory> getWorkItemManagerFactoryClass() {
+ return workItemManagerFactoryClass;
+ }
+
+ public void setProcessSignalManagerFactoryClass(
+ Class<? extends SignalManagerFactory> processSignalManagerFactoryClass) {
+ if (processSignalManagerFactoryClass != null) {
+ this.processSignalManagerFactoryClass = processSignalManagerFactoryClass;
+ configProps.put("drools.processSignalManagerFactory", processSignalManagerFactoryClass.getName());
+ }
+ }
+
+ public Class<? extends SignalManagerFactory> getProcessSignalManagerFactoryClass() {
+ return processSignalManagerFactoryClass;
+ }
+
}
Modified: labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/session/SessionInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/session/SessionInfo.java 2009-12-16 19:09:39 UTC (rev 30726)
+++ labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/session/SessionInfo.java 2009-12-16 19:09:49 UTC (rev 30727)
@@ -59,6 +59,10 @@
this.helper = helper;
}
+ public JPASessionMarshallingHelper getJPASessionMashallingHelper() {
+ return helper;
+ }
+
public byte[] getData() {
return this.rulesByteArray;
}
More information about the jboss-svn-commits
mailing list