[jboss-svn-commits] JBL Code SVN: r25445 - in labs/jbossrules/trunk: drools-api/src/main/java/org/drools/persistence and 13 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Thu Feb 26 19:28:36 EST 2009
Author: mark.proctor at jboss.com
Date: 2009-02-26 19:28:35 -0500 (Thu, 26 Feb 2009)
New Revision: 25445
Added:
labs/jbossrules/trunk/drools-api/src/main/java/org/drools/persistence/
labs/jbossrules/trunk/drools-api/src/main/java/org/drools/persistence/jpa/
labs/jbossrules/trunk/drools-api/src/main/java/org/drools/persistence/jpa/JPAKnowledgeService.java
labs/jbossrules/trunk/drools-api/src/main/java/org/drools/persistence/jpa/JPAKnowledgeServiceProvider.java
labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/jpa/
labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/jpa/impl/
labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/jpa/impl/JPAKnowledgeServiceProviderImpl.java
Modified:
labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/EnvironmentName.java
labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/StatefulKnowledgeSession.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/SessionConfiguration.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/CommandBasedStatefulKnowledgeSession.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SessionInfo.java
labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java
labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/PersistentStatefulSessionTest.java
labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java
Log:
JBRULES-1958 Improve JPA persistence
Added: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/persistence/jpa/JPAKnowledgeService.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/persistence/jpa/JPAKnowledgeService.java (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/persistence/jpa/JPAKnowledgeService.java 2009-02-27 00:28:35 UTC (rev 25445)
@@ -0,0 +1,56 @@
+package org.drools.persistence.jpa;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.KnowledgeBaseProvider;
+import org.drools.ProviderInitializationException;
+import org.drools.runtime.Environment;
+import org.drools.runtime.KnowledgeSessionConfiguration;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.util.ProviderLocator;
+
+public class JPAKnowledgeService extends ProviderLocator {
+ private static JPAKnowledgeServiceProvider provider;
+
+ public static StatefulKnowledgeSession newStatefulKnowledgeSession(KnowledgeBase kbase,
+ KnowledgeSessionConfiguration configuration,
+ Environment environment) {
+ return getJPAKnowledgeServiceProvider().newStatefulKnowledgeSession( kbase,
+ configuration,
+ environment );
+ }
+
+ public static StatefulKnowledgeSession loadStatefulKnowledgeSession(int id,
+ KnowledgeBase kbase,
+ KnowledgeSessionConfiguration configuration,
+ Environment environment) {
+ return getJPAKnowledgeServiceProvider().loadStatefulKnowledgeSession( id,
+ kbase,
+ configuration,
+ environment );
+ }
+
+ private static synchronized void setJPAKnowledgeServiceProvider(JPAKnowledgeServiceProvider provider) {
+ JPAKnowledgeService.provider = provider;
+ }
+
+ private static synchronized JPAKnowledgeServiceProvider getJPAKnowledgeServiceProvider() {
+ if ( provider == null ) {
+ loadProvider();
+ }
+ return provider;
+ }
+
+ @SuppressWarnings("unchecked")
+ private static void loadProvider() {
+ try {
+ // we didn't find anything in properties so lets try and us reflection
+ Class<JPAKnowledgeServiceProvider> cls = (Class<JPAKnowledgeServiceProvider>) Class.forName( "org.drools.persistence.jpa.impl.JPAKnowledgeServiceProviderImpl" );
+ setJPAKnowledgeServiceProvider( cls.newInstance() );
+ } catch ( Exception e ) {
+ throw new ProviderInitializationException( "Provider org.drools.persistence.jpa.impl.JPAKnowledgeServiceProviderImpl could not be set.",
+ e );
+ }
+ }
+
+}
Added: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/persistence/jpa/JPAKnowledgeServiceProvider.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/persistence/jpa/JPAKnowledgeServiceProvider.java (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/persistence/jpa/JPAKnowledgeServiceProvider.java 2009-02-27 00:28:35 UTC (rev 25445)
@@ -0,0 +1,19 @@
+package org.drools.persistence.jpa;
+
+import org.drools.KnowledgeBase;
+import org.drools.runtime.Environment;
+import org.drools.runtime.KnowledgeSessionConfiguration;
+import org.drools.runtime.StatefulKnowledgeSession;
+
+public interface JPAKnowledgeServiceProvider {
+
+ StatefulKnowledgeSession newStatefulKnowledgeSession(KnowledgeBase kbase,
+ KnowledgeSessionConfiguration configuration,
+ Environment environment);
+
+ StatefulKnowledgeSession loadStatefulKnowledgeSession(int id,
+ KnowledgeBase kbase,
+ KnowledgeSessionConfiguration configuration,
+ Environment environment);
+
+}
Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/EnvironmentName.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/EnvironmentName.java 2009-02-26 23:47:51 UTC (rev 25444)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/EnvironmentName.java 2009-02-27 00:28:35 UTC (rev 25445)
@@ -1,7 +1,9 @@
package org.drools.runtime;
public class EnvironmentName {
- public static final String ENTITY_MANAGER_FACTORY = "drools.emf";
- public static final String ENTITY_MANAGER = "drools.em";
- public static final String OBJECT_MARSHALLING_STRATEGIES = "drools.objectMarshallingStrategies";
+ public static final String ENTITY_MANAGER_FACTORY = "drools.persistence.jpa.EntityManagerFactory";
+ public static final String ENTITY_MANAGER = "drools.persistence.jpa.EntityManager";
+ public static final String TRANSACTION_MANAGER = "drools.persistence.jpa.TransactionManager";
+ public static final String OBJECT_MARSHALLING_STRATEGIES = "drools.marshalling.ObjectMarshallingStrategies";
+ public static final String GLOBALS = "drools.Globals";
}
Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/StatefulKnowledgeSession.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/StatefulKnowledgeSession.java 2009-02-26 23:47:51 UTC (rev 25444)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/StatefulKnowledgeSession.java 2009-02-27 00:28:35 UTC (rev 25445)
@@ -63,6 +63,8 @@
StatefulProcessSession,
KnowledgeRuntime {
+ int getId();
+
/**
* Releases all the current session resources, setting up the session for garbage collection.
* This method <b>must</b> always be called after finishing using the session, or the engine
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java 2009-02-26 23:47:51 UTC (rev 25444)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java 2009-02-27 00:28:35 UTC (rev 25445)
@@ -124,7 +124,7 @@
return null;
}
- public long getId() {
+ public int getId() {
// TODO Auto-generated method stub
return 0;
}
@@ -224,7 +224,7 @@
}
- public void setId(long id) {
+ public void setId(int id) {
// TODO Auto-generated method stub
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/SessionConfiguration.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/SessionConfiguration.java 2009-02-26 23:47:51 UTC (rev 25444)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/SessionConfiguration.java 2009-02-27 00:28:35 UTC (rev 25445)
@@ -122,6 +122,12 @@
"realtime" ) ) );
}
+ public void addProperties(Properties properties) {
+ if ( properties != null ) {
+ this.chainedProperties.addProperties( properties );
+ }
+ }
+
public void setProperty(String name,
String value) {
name = name.trim();
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java 2009-02-26 23:47:51 UTC (rev 25444)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java 2009-02-27 00:28:35 UTC (rev 25445)
@@ -85,7 +85,9 @@
import org.drools.rule.TimeMachine;
import org.drools.ruleflow.core.RuleFlowProcess;
import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
import org.drools.runtime.ExitPoint;
+import org.drools.runtime.Globals;
import org.drools.runtime.KnowledgeRuntime;
import org.drools.runtime.process.EventListener;
import org.drools.runtime.process.WorkItemHandler;
@@ -123,7 +125,7 @@
// ------------------------------------------------------------
// Instance members
// ------------------------------------------------------------
- protected long id;
+ protected int id;
/** The arguments used when adding/removing a property change listener. */
protected Object[] addRemovePropertyChangeListenerArgs;
@@ -250,8 +252,18 @@
this.config = config;
this.ruleBase = ruleBase;
this.handleFactory = handleFactory;
- this.globalResolver = new MapGlobalResolver();
this.environment = environment;
+
+ Globals globals = ( Globals ) this.environment.get( EnvironmentName.GLOBALS );
+ if ( globals != null ) {
+ if ( !(globals instanceof GlobalResolver )) {
+ this.globalResolver = new GlobalsAdapter( globals );
+ } else {
+ this.globalResolver = ( GlobalResolver ) globals;
+ }
+ } else {
+ this.globalResolver = new MapGlobalResolver();
+ }
final RuleBaseConfiguration conf = this.ruleBase.getConfiguration();
@@ -313,7 +325,26 @@
initPartitionManagers();
initTransient();
}
+
+ public static class GlobalsAdapter implements GlobalResolver {
+ private Globals globals;
+
+ public GlobalsAdapter(Globals globals) {
+ this.globals = globals;
+ }
+
+
+ public Object resolveGlobal(String identifier) {
+ return this.globals.get( identifier );
+ }
+ public void setGlobal(String identifier,
+ Object value) {
+ this.globals.set( identifier, value );
+ }
+
+ }
+
// ------------------------------------------------------------
// Instance methods
// ------------------------------------------------------------
@@ -537,11 +568,11 @@
return this.globalResolver;
}
- public long getId() {
+ public int getId() {
return this.id;
}
- public void setId(long id) {
+ public void setId(int id) {
this.id = id;
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java 2009-02-26 23:47:51 UTC (rev 25444)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java 2009-02-27 00:28:35 UTC (rev 25445)
@@ -28,9 +28,9 @@
public interface InternalWorkingMemory
extends
WorkingMemory {
- public long getId();
+ public int getId();
- public void setId(long id);
+ public void setId(int id);
void setRuleBase(final InternalRuleBase ruleBase);
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java 2009-02-26 23:47:51 UTC (rev 25444)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java 2009-02-27 00:28:35 UTC (rev 25445)
@@ -89,6 +89,10 @@
this.mappedAgendaListeners = new IdentityHashMap<AgendaEventListener, AgendaEventListenerWrapper>();
this.mappedProcessListeners = new IdentityHashMap<ProcessEventListener, ProcessEventListenerWrapper>();
}
+
+ public int getId() {
+ return this.session.getId();
+ }
public WorkingMemoryEntryPoint getWorkingMemoryEntryPoint(String name) {
return session.getWorkingMemoryEntryPoint( name );
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/CommandBasedStatefulKnowledgeSession.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/CommandBasedStatefulKnowledgeSession.java 2009-02-26 23:47:51 UTC (rev 25444)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/CommandBasedStatefulKnowledgeSession.java 2009-02-27 00:28:35 UTC (rev 25445)
@@ -46,6 +46,7 @@
import org.drools.process.command.StartProcessCommand;
import org.drools.process.command.UnregisterExitPointCommand;
import org.drools.process.command.UpdateCommand;
+import org.drools.reteoo.ReteooWorkingMemory;
import org.drools.runtime.Environment;
import org.drools.runtime.ExitPoint;
import org.drools.runtime.Globals;
@@ -74,6 +75,10 @@
public CommandBasedStatefulKnowledgeSession(CommandService commandService) {
this.commandService = commandService;
}
+
+ public int getId() {
+ return ((ReteooWorkingMemory)this.commandService.getSession()).getId();
+ }
public ProcessInstance getProcessInstance(long id) {
GetProcessInstanceCommand command = new GetProcessInstanceCommand();
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java 2009-02-26 23:47:51 UTC (rev 25444)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java 2009-02-27 00:28:35 UTC (rev 25445)
@@ -31,6 +31,7 @@
import java.util.List;
import org.drools.FactException;
+import org.drools.KnowledgeBaseFactory;
import org.drools.RuleBaseConfiguration;
import org.drools.SessionConfiguration;
import org.drools.StatefulSession;
@@ -296,8 +297,14 @@
return session;
}
- public synchronized StatefulSession newStatefulSession(final SessionConfiguration sessionConfig,
- final Environment environment) {
+ public synchronized StatefulSession newStatefulSession(SessionConfiguration sessionConfig,
+ Environment environment) {
+ if ( sessionConfig == null ) {
+ sessionConfig = ( SessionConfiguration ) KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
+ }
+ if ( environment == null ) {
+ environment = EnvironmentFactory.newEnvironment();
+ }
return newStatefulSession( nextWorkingMemoryCounter(),
sessionConfig,
environment );
Added: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/jpa/impl/JPAKnowledgeServiceProviderImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/jpa/impl/JPAKnowledgeServiceProviderImpl.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/jpa/impl/JPAKnowledgeServiceProviderImpl.java 2009-02-27 00:28:35 UTC (rev 25445)
@@ -0,0 +1,92 @@
+package org.drools.persistence.jpa.impl;
+
+import java.util.Properties;
+
+import org.drools.KnowledgeBase;
+import org.drools.SessionConfiguration;
+import org.drools.persistence.jpa.JPAKnowledgeServiceProvider;
+import org.drools.persistence.session.SingleSessionCommandService;
+import org.drools.process.command.CommandService;
+import org.drools.process.command.impl.CommandBasedStatefulKnowledgeSession;
+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 {
+
+ 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 );
+
+ CommandService commandService = new SingleSessionCommandService( kbase,
+ configuration,
+ environment );
+ return new CommandBasedStatefulKnowledgeSession( commandService );
+ }
+
+ 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" );
+ }
+ }
+
+
+}
Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SessionInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SessionInfo.java 2009-02-26 23:47:51 UTC (rev 25444)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SessionInfo.java 2009-02-27 00:28:35 UTC (rev 25445)
@@ -99,6 +99,7 @@
}
public void rollback() {
+ this.dirty = false;
this.lastModificationDate = this.lastModificationDateShadow;
this.rulesByteArray = this.rulesByteArrayShadow;
// this.version = this.versionShadow;
Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java 2009-02-26 23:47:51 UTC (rev 25444)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java 2009-02-27 00:28:35 UTC (rev 25445)
@@ -22,6 +22,7 @@
import org.drools.persistence.processinstance.JPASignalManager;
import org.drools.process.command.Command;
import org.drools.process.command.CommandService;
+import org.drools.reteoo.ReteooStatefulSession;
import org.drools.reteoo.ReteooWorkingMemory;
import org.drools.runtime.Environment;
import org.drools.runtime.EnvironmentName;
@@ -40,6 +41,17 @@
private StatefulKnowledgeSession ksession;
private Environment env;
+ public void checkEnvironment(Environment env) {
+ if ( env.get( EnvironmentName.ENTITY_MANAGER_FACTORY ) == null ) {
+ throw new IllegalArgumentException( "Environment must have an EntityManagerFactory" );
+ }
+
+ // @TODO log a warning that all transactions will be locally scoped using the EntityTransaction
+// if ( env.get( EnvironmentName.TRANSACTION_MANAGER ) == null ) {
+// throw new IllegalArgumentException( "Environment must have an EntityManagerFactory" );
+// }
+ }
+
public SingleSessionCommandService(RuleBase ruleBase,
SessionConfiguration conf,
Environment env) {
@@ -59,6 +71,7 @@
this.session = ((KnowledgeBaseImpl) kbase).ruleBase.newStatefulSession( (SessionConfiguration) conf,
this.env );
+
this.ksession = new StatefulKnowledgeSessionImpl( (ReteooWorkingMemory) session );
((JPASignalManager) this.session.getSignalManager()).setCommandService( this );
@@ -96,6 +109,9 @@
t2 );
}
}
+
+ // update the session id to be the same as the session info id
+ ((ReteooStatefulSession) this.session).setId( this.sessionInfo.getId() );
new Thread( new Runnable() {
public void run() {
@@ -104,10 +120,10 @@
} );
}
- public SingleSessionCommandService(KnowledgeBase kbase,
+ public SingleSessionCommandService(int sessionId,
+ KnowledgeBase kbase,
KnowledgeSessionConfiguration conf,
- Environment env,
- int sessionId) {
+ Environment env) {
if ( conf == null ) {
conf = new SessionConfiguration();
}
@@ -144,11 +160,21 @@
}
}
+ this.session = ((KnowledgeBaseImpl) kbase).ruleBase.newStatefulSession( (SessionConfiguration) conf,
+ this.env );
+
+ // update the session id to be the same as the session info id
+ ((ReteooStatefulSession) this.session).setId( sessionId );
+
+ this.ksession = new StatefulKnowledgeSessionImpl( (ReteooWorkingMemory) session );
+ ((JPASignalManager) this.session.getSignalManager()).setCommandService( this );
+
this.marshallingHelper = new JPASessionMarshallingHelper( this.sessionInfo,
kbase,
conf,
env );
+
this.sessionInfo.setJPASessionMashallingHelper( this.marshallingHelper );
this.ksession = this.marshallingHelper.getObject();
this.session = (StatefulSession) ((StatefulKnowledgeSessionImpl) ksession).session;
@@ -182,6 +208,18 @@
EntityManager localEm = this.emf.createEntityManager(); // no need to call joinTransaction as it will do so if one already exists
this.env.set( EnvironmentName.ENTITY_MANAGER,
localEm );
+
+ if ( this.em == null ) {
+ // there must have been a rollback to lazily re-initialise the state
+ this.em = this.emf.createEntityManager();
+ this.sessionInfo = this.em.find( SessionInfo.class, this.sessionInfo.getId() );
+ this.sessionInfo.setJPASessionMashallingHelper( this.marshallingHelper );
+ // have to create a new localEM as an EM part of a transaction cannot do a find.
+ // this.sessionInfo.rollback();
+ this.marshallingHelper.loadSnapshot( this.sessionInfo.getData(),
+ this.ksession );
+ this.session = (StatefulSession) ((StatefulKnowledgeSessionImpl) this.ksession).session;
+ }
this.em.joinTransaction();
//System.out.println( "1) exec ver : " + this.sessionInfo.getVersion() );
@@ -239,7 +277,7 @@
public void registerRollbackSync() throws IllegalStateException,
RollbackException,
SystemException {
- TransactionManager txm = (TransactionManager) env.get( "drools.TransactionManager" );
+ TransactionManager txm = (TransactionManager) env.get( EnvironmentName.TRANSACTION_MANAGER );
if ( txm == null ) {
return;
}
@@ -338,10 +376,8 @@
//}
public void rollback() {
- // have to create a new localEM as an EM part of a transaction cannot do a find.
- this.sessionInfo.rollback();
- this.marshallingHelper.loadSnapshot( this.sessionInfo.getData(),
- this.ksession );
- this.session = (StatefulSession) ((StatefulKnowledgeSessionImpl) this.ksession).session;
+ // with em null, if someone tries to use this session it'll first restore it's state
+ this.em.close();
+ this.em = null;
}
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/PersistentStatefulSessionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/PersistentStatefulSessionTest.java 2009-02-26 23:47:51 UTC (rev 25444)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/PersistentStatefulSessionTest.java 2009-02-27 00:28:35 UTC (rev 25445)
@@ -15,6 +15,7 @@
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
+import org.drools.base.MapGlobalResolver;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
@@ -22,6 +23,7 @@
import org.drools.impl.EnvironmentImpl;
import org.drools.io.ResourceFactory;
import org.drools.io.impl.ClassPathResource;
+import org.drools.persistence.jpa.JPAKnowledgeService;
import org.drools.runtime.Environment;
import org.drools.runtime.EnvironmentName;
import org.drools.runtime.KnowledgeSessionConfiguration;
@@ -120,18 +122,6 @@
}
public void testUserTransactions() throws Exception {
-
- Properties properties = new Properties();
- properties.setProperty( "drools.commandService",
- "org.drools.persistence.session.SingleSessionCommandService" );
- properties.setProperty( "drools.processInstanceManagerFactory",
- "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory" );
- properties.setProperty( "drools.workItemManagerFactory",
- "org.drools.persistence.processinstance.JPAWorkItemManagerFactory" );
- properties.setProperty( "drools.processSignalManagerFactory",
- "org.drools.persistence.processinstance.JPASignalManagerFactory" );
- KnowledgeSessionConfiguration config = KnowledgeBaseFactory.newKnowledgeSessionConfiguration( properties );
-
String str = "";
str += "package org.drools.test\n";
str += "global java.util.List list\n";
@@ -158,11 +148,11 @@
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
emf );
- env.set( "drools.TransactionManager",
+ env.set( EnvironmentName.TRANSACTION_MANAGER,
TransactionManagerServices.getTransactionManager() );
+ env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
- StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( config,
- env );
+ StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
// EntityManager em = emf.createEntityManager();
// SessionInfo sInfo = em.find( SessionInfo.class, 1 );
@@ -210,21 +200,23 @@
assertEquals( 4,
list.size() );
+
+ // now load the ksession
+ ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( ksession.getId(), kbase, null, env );
+
+ ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
+ ut.begin();
+ ksession.insert( 7 );
+ ksession.insert( 8 );
+ ut.commit();
+ ksession.fireAllRules();
+
+ assertEquals( 6,
+ list.size() );
}
public void testPersistenceWorkItems() {
- Properties properties = new Properties();
- properties.setProperty( "drools.commandService",
- "org.drools.persistence.session.SingleSessionCommandService" );
- properties.setProperty( "drools.processInstanceManagerFactory",
- "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory" );
- properties.setProperty( "drools.workItemManagerFactory",
- "org.drools.persistence.processinstance.JPAWorkItemManagerFactory" );
- properties.setProperty( "drools.processSignalManagerFactory",
- "org.drools.persistence.processinstance.JPASignalManagerFactory" );
- KnowledgeSessionConfiguration config = KnowledgeBaseFactory.newKnowledgeSessionConfiguration( properties );
-
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( new ClassPathResource( "WorkItemsProcess.rf" ),
ResourceType.DRF );
@@ -236,61 +228,57 @@
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
emf );
- StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession( config,
- env );
- ProcessInstance processInstance = session.startProcess( "org.drools.test.TestProcess" );
- session.insert( "TestString" );
+ env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
+
+ StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
+ int id = ksession.getId();
+
+ ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
+ ksession.insert( "TestString" );
System.out.println( "Started process instance " + processInstance.getId() );
TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
WorkItem workItem = handler.getWorkItem();
assertNotNull( workItem );
- session = kbase.newStatefulKnowledgeSession( config,
- null );
- processInstance = session.getProcessInstance( processInstance.getId() );
+ ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+ processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNotNull( processInstance );
- session = kbase.newStatefulKnowledgeSession( config,
- null );
- session.getWorkItemManager().completeWorkItem( workItem.getId(),
+ ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+ ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
null );
workItem = handler.getWorkItem();
assertNotNull( workItem );
- session = kbase.newStatefulKnowledgeSession( config,
- null );
- processInstance = session.getProcessInstance( processInstance.getId() );
+ ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+ processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNotNull( processInstance );
- session = kbase.newStatefulKnowledgeSession( config,
- null );
- session.getWorkItemManager().completeWorkItem( workItem.getId(),
+ ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+ ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
null );
workItem = handler.getWorkItem();
assertNotNull( workItem );
- session = kbase.newStatefulKnowledgeSession( config,
- null );
- processInstance = session.getProcessInstance( processInstance.getId() );
+ ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+ processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNotNull( processInstance );
- session = kbase.newStatefulKnowledgeSession( config,
- null );
- session.getWorkItemManager().completeWorkItem( workItem.getId(),
+ ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+ ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
null );
workItem = handler.getWorkItem();
assertNull( workItem );
- session = kbase.newStatefulKnowledgeSession( config,
- null );
- processInstance = session.getProcessInstance( processInstance.getId() );
+ ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+ processInstance = ksession.getProcessInstance( processInstance.getId() );
assertEquals( 1,
- session.getObjects().size() );
- for ( Object o : session.getObjects() ) {
+ ksession.getObjects().size() );
+ for ( Object o : ksession.getObjects() ) {
System.out.println( o );
}
assertNull( processInstance );
@@ -298,17 +286,6 @@
}
public void testPersistenceSubProcess() {
- Properties properties = new Properties();
- properties.setProperty( "drools.commandService",
- "org.drools.persistence.session.SingleSessionCommandService" );
- properties.setProperty( "drools.processInstanceManagerFactory",
- "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory" );
- properties.setProperty( "drools.workItemManagerFactory",
- "org.drools.persistence.processinstance.JPAWorkItemManagerFactory" );
- properties.setProperty( "drools.processSignalManagerFactory",
- "org.drools.persistence.processinstance.JPASignalManagerFactory" );
- KnowledgeSessionConfiguration config = KnowledgeBaseFactory.newKnowledgeSessionConfiguration( properties );
-
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( new ClassPathResource( "SuperProcess.rf" ),
ResourceType.DRF );
@@ -322,44 +299,40 @@
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
emf );
- StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession( config,
- env );
- ProcessInstance processInstance = session.startProcess( "com.sample.SuperProcess" );
+ StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
+ int id = ksession.getId();
+
+ ProcessInstance processInstance = ksession.startProcess( "com.sample.SuperProcess" );
System.out.println( "Started process instance " + processInstance.getId() );
TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
WorkItem workItem = handler.getWorkItem();
assertNotNull( workItem );
- session = kbase.newStatefulKnowledgeSession( config,
- null );
- processInstance = session.getProcessInstance( processInstance.getId() );
+ ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+ processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNotNull( processInstance );
- session = kbase.newStatefulKnowledgeSession( config,
- null );
- session.getWorkItemManager().completeWorkItem( workItem.getId(),
+ ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+ ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
null );
workItem = handler.getWorkItem();
assertNotNull( workItem );
- session = kbase.newStatefulKnowledgeSession( config,
- null );
- processInstance = session.getProcessInstance( processInstance.getId() );
+ ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+ processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNotNull( processInstance );
- session = kbase.newStatefulKnowledgeSession( config,
- null );
- session.getWorkItemManager().completeWorkItem( workItem.getId(),
+ ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+ ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
null );
workItem = handler.getWorkItem();
assertNull( workItem );
- session = kbase.newStatefulKnowledgeSession( config,
- null );
- processInstance = session.getProcessInstance( processInstance.getId() );
+ ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+ processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNull( processInstance );
}
Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java 2009-02-26 23:47:51 UTC (rev 25444)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java 2009-02-27 00:28:35 UTC (rev 25445)
@@ -114,20 +114,20 @@
assertNotNull( workItem );
service.dispose();
- service = new SingleSessionCommandService( kbase,
+ service = new SingleSessionCommandService( sessionId,
+ kbase,
config,
- env,
- sessionId );
+ env );
GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
processInstance = (ProcessInstance) service.execute( getProcessInstanceCommand );
assertNotNull( processInstance );
service.dispose();
- service = new SingleSessionCommandService( kbase,
+ service = new SingleSessionCommandService( sessionId,
+ kbase,
config,
- env,
- sessionId );
+ env );
CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
completeWorkItemCommand.setWorkItemId( workItem.getId() );
service.execute( completeWorkItemCommand );
@@ -136,20 +136,20 @@
assertNotNull( workItem );
service.dispose();
- service = new SingleSessionCommandService( kbase,
+ service = new SingleSessionCommandService( sessionId,
+ kbase,
config,
- env,
- sessionId );
+ env );
getProcessInstanceCommand = new GetProcessInstanceCommand();
getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
processInstance = (ProcessInstance) service.execute( getProcessInstanceCommand );
assertNotNull( processInstance );
service.dispose();
- service = new SingleSessionCommandService( kbase,
+ service = new SingleSessionCommandService( sessionId,
+ kbase,
config,
- env,
- sessionId );
+ env );
completeWorkItemCommand = new CompleteWorkItemCommand();
completeWorkItemCommand.setWorkItemId( workItem.getId() );
service.execute( completeWorkItemCommand );
@@ -158,20 +158,20 @@
assertNotNull( workItem );
service.dispose();
- service = new SingleSessionCommandService( kbase,
+ service = new SingleSessionCommandService( sessionId,
+ kbase,
config,
- env,
- sessionId );
+ env );
getProcessInstanceCommand = new GetProcessInstanceCommand();
getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
processInstance = (ProcessInstance) service.execute( getProcessInstanceCommand );
assertNotNull( processInstance );
service.dispose();
- service = new SingleSessionCommandService( kbase,
+ service = new SingleSessionCommandService( sessionId,
+ kbase,
config,
- env,
- sessionId );
+ env );
completeWorkItemCommand = new CompleteWorkItemCommand();
completeWorkItemCommand.setWorkItemId( workItem.getId() );
service.execute( completeWorkItemCommand );
@@ -180,10 +180,10 @@
assertNull( workItem );
service.dispose();
- service = new SingleSessionCommandService( kbase,
+ service = new SingleSessionCommandService( sessionId,
+ kbase,
config,
- env,
- sessionId );
+ env );
getProcessInstanceCommand = new GetProcessInstanceCommand();
getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
processInstance = (ProcessInstance) service.execute( getProcessInstanceCommand );
@@ -231,10 +231,10 @@
assertNotNull( workItem );
service.dispose();
- service = new SingleSessionCommandService( kbase,
+ service = new SingleSessionCommandService( sessionId,
+ kbase,
config,
- env,
- sessionId );
+ env );
ut.begin();
GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
@@ -243,10 +243,10 @@
ut.commit();
service.dispose();
- service = new SingleSessionCommandService( kbase,
+ service = new SingleSessionCommandService( sessionId,
+ kbase,
config,
- env,
- sessionId );
+ env );
ut.begin();
CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
completeWorkItemCommand.setWorkItemId( workItem.getId() );
@@ -257,10 +257,10 @@
assertNotNull( workItem );
service.dispose();
- service = new SingleSessionCommandService( kbase,
+ service = new SingleSessionCommandService( sessionId,
+ kbase,
config,
- env,
- sessionId );
+ env );
ut.begin();
getProcessInstanceCommand = new GetProcessInstanceCommand();
getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
@@ -269,10 +269,10 @@
assertNotNull( processInstance );
service.dispose();
- service = new SingleSessionCommandService( kbase,
+ service = new SingleSessionCommandService( sessionId,
+ kbase,
config,
- env,
- sessionId );
+ env );
ut.begin();
completeWorkItemCommand = new CompleteWorkItemCommand();
completeWorkItemCommand.setWorkItemId( workItem.getId() );
@@ -283,10 +283,10 @@
assertNotNull( workItem );
service.dispose();
- service = new SingleSessionCommandService( kbase,
+ service = new SingleSessionCommandService( sessionId,
+ kbase,
config,
- env,
- sessionId );
+ env );
ut.begin();
getProcessInstanceCommand = new GetProcessInstanceCommand();
getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
@@ -295,10 +295,10 @@
assertNotNull( processInstance );
service.dispose();
- service = new SingleSessionCommandService( kbase,
+ service = new SingleSessionCommandService( sessionId,
+ kbase,
config,
- env,
- sessionId );
+ env );
ut.begin();
completeWorkItemCommand = new CompleteWorkItemCommand();
completeWorkItemCommand.setWorkItemId( workItem.getId() );
@@ -309,10 +309,10 @@
assertNull( workItem );
service.dispose();
- service = new SingleSessionCommandService( kbase,
+ service = new SingleSessionCommandService( sessionId,
+ kbase,
config,
- env,
- sessionId );
+ env );
ut.begin();
getProcessInstanceCommand = new GetProcessInstanceCommand();
getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
@@ -593,20 +593,20 @@
System.out.println( "Started process instance " + processInstance.getId() );
service.dispose();
- service = new SingleSessionCommandService( kbase,
+ service = new SingleSessionCommandService( sessionId,
+ kbase,
config,
- env,
- sessionId );
+ env );
GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
processInstance = (ProcessInstance) service.execute( getProcessInstanceCommand );
assertNotNull( processInstance );
service.dispose();
- service = new SingleSessionCommandService( kbase,
+ service = new SingleSessionCommandService( sessionId,
+ kbase,
config,
- env,
- sessionId );
+ env );
Thread.sleep( 3000 );
getProcessInstanceCommand = new GetProcessInstanceCommand();
getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
@@ -697,10 +697,10 @@
Thread.sleep( 2000 );
- service = new SingleSessionCommandService( kbase,
+ service = new SingleSessionCommandService( sessionId,
+ kbase,
config,
- env,
- sessionId );
+ env );
GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
processInstance = (ProcessInstance) service.execute( getProcessInstanceCommand );
More information about the jboss-svn-commits
mailing list