[jboss-svn-commits] JBL Code SVN: r25261 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools/testframework and 24 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Feb 13 23:52:53 EST 2009


Author: mark.proctor at jboss.com
Date: 2009-02-13 23:52:53 -0500 (Fri, 13 Feb 2009)
New Revision: 25261

Added:
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/EnvironmentName.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/FireAllRulesCommand.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/SetGlobalCommand.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPASessionMashallingHelper.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SessionInfo.java
Removed:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/ByteArraySnapshotter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/DroolsXid.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/Persister.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/Transaction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/memory/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/session/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/TransactionInterceptor.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/persistence/memory/
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/transaction/
   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/session/JPAPersisterManager.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/PersistenceConfig.java
Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
   labs/jbossrules/trunk/drools-core/.classpath
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/SessionConfiguration.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/KnowledgeBaseImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/DefaultMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfigurationImpl.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-decisiontables/.classpath
   labs/jbossrules/trunk/drools-jsr94/.classpath
   labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/admin/RuleExecutionSetImpl.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/.classpath
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/pom.xml
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManager.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPASignalManager.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessInstanceEventInfo.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.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/main/resources/META-INF/persistence.xml
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/resources/jndi.properties
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/jpa/JPAPersisterTest.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
   labs/jbossrules/trunk/drools-templates/.classpath
   labs/jbossrules/trunk/drools-templates/src/test/java/org/drools/template/parser/ExternalSheetListenerTest.java
Log:
JBRULES-1971 JPA Cleanups and Corrections

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/EnvironmentName.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -0,0 +1,7 @@
+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 PLACEHOLDER_RESOLVER_STRATEGY_FACTORY = "drools.placeholderResolverStrategyFactory";
+}

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-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -43,6 +43,7 @@
 import org.drools.reteoo.PartitionTaskManager;
 import org.drools.rule.Rule;
 import org.drools.rule.TimeMachine;
+import org.drools.runtime.Environment;
 import org.drools.runtime.ExitPoint;
 import org.drools.runtime.KnowledgeRuntime;
 import org.drools.spi.Activation;
@@ -508,4 +509,9 @@
 		return null;
 	}
 
+    public Environment getEnvironment() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-core/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-core/.classpath	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-core/.classpath	2009-02-14 04:52:53 UTC (rev 25261)
@@ -13,7 +13,7 @@
   <classpathentry kind="var" path="M2_REPO/org/jmock/jmock-legacy/2.5.1/jmock-legacy-2.5.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/joda-time/joda-time/1.5.2/joda-time-1.5.2.jar"/>
   <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.6/mvel2-2.0.6.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.7-SNAPSHOT/mvel2-2.0.7-SNAPSHOT.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar"/>
   <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.jar"/>

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-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/SessionConfiguration.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -28,6 +28,7 @@
 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.process.WorkItemHandler;
 import org.drools.util.ChainedProperties;
@@ -339,15 +340,15 @@
         }
     }
     
-    public CommandService getCommandService(RuleBase ruleBase) {
+    public CommandService getCommandService(RuleBase ruleBase, Environment environment) {
         if ( this.commandService == null ) {
-            initCommandService(ruleBase);
+            initCommandService(ruleBase, environment);
         }
         return this.commandService;
     }
 
     @SuppressWarnings("unchecked")
-    private void initCommandService(RuleBase ruleBase) {
+    private void initCommandService(RuleBase ruleBase, Environment environment) {
         String className = this.chainedProperties.getProperty( "drools.commandService", null );
         if (className == null) {
         	return;
@@ -368,7 +369,7 @@
 
         if ( clazz != null ) {
             try {
-                this.commandService = clazz.getConstructor(RuleBase.class, SessionConfiguration.class).newInstance(ruleBase, this);
+                this.commandService = clazz.getConstructor(RuleBase.class, SessionConfiguration.class, Environment.class).newInstance(ruleBase, this, environment);
             } catch ( Exception e ) {
                 throw new IllegalArgumentException( "Unable to instantiate command service '" + className + "'",
                                                     e );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -24,6 +24,7 @@
 import org.drools.process.instance.WorkItemManager;
 import org.drools.process.instance.event.SignalManager;
 import org.drools.process.instance.timer.TimerManager;
+import org.drools.runtime.Environment;
 import org.drools.spi.AgendaFilter;
 import org.drools.spi.AsyncExceptionHandler;
 import org.drools.spi.GlobalResolver;
@@ -66,6 +67,7 @@
      */
     Object getGlobal(String identifier);
 
+    Environment getEnvironment(); 
 
     /**
      * Sets the GlobalResolver instance to be used when resolving globals, replaces the current GlobalResolver.

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-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -534,6 +534,10 @@
             this.lock.unlock();
         }
     }
+    
+    public Environment getEnvironment() {
+        return this.environment;
+    }
 
     public Agenda getAgenda() {
         return this.agenda;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/KnowledgeBaseImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/KnowledgeBaseImpl.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/KnowledgeBaseImpl.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -144,7 +144,7 @@
             environment = EnvironmentFactory.newEnvironment();
         }
         
-    	CommandService commandService = ((SessionConfiguration) conf).getCommandService(this.ruleBase);
+    	CommandService commandService = ((SessionConfiguration) conf).getCommandService(this.ruleBase, environment);
     	if (commandService != null) {
 			return new CommandBasedStatefulKnowledgeSession(commandService);
     	} else {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/DefaultMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/DefaultMarshaller.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/DefaultMarshaller.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -26,7 +26,7 @@
 
     public DefaultMarshaller(RuleBaseConfiguration config) {
         this( config,
-              null );
+              new MarshallingConfigurationImpl() );
     }
 
     public DefaultMarshaller(RuleBaseConfiguration ruleBaseConfig,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -130,11 +130,17 @@
             readTruthMaintenanceSystem( context );
         }
 
-        readProcessInstances( context );
+        if ( context.marshalProcessInstances ) {
+            readProcessInstances( context );
+        }
 
-        readWorkItems( context );
+        if ( context.marshalWorkItems ) {
+            readWorkItems( context );
+        }
 
-        readTimers( context );
+        if ( context.marshalTimers ) {
+            readTimers( context );
+        }
         
         if( multithread ) {
             session.startPartitionManagers();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfigurationImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfigurationImpl.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfigurationImpl.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -1,23 +1,28 @@
 package org.drools.marshalling;
 
-public class MarshallingConfigurationImpl implements  MarshallingConfiguration {
+public class MarshallingConfigurationImpl
+    implements
+    MarshallingConfiguration {
     private PlaceholderResolverStrategyFactory placeholderResolverStrategyFactory;
-    private boolean marshallProcessInstances;
-    private boolean marshallWorkItems;
-    private boolean marshallTimers;        
-    
+    private boolean                            marshallProcessInstances;
+    private boolean                            marshallWorkItems;
+    private boolean                            marshallTimers;
+
     public MarshallingConfigurationImpl() {
-        
+        this( null,
+              true,
+              true,
+              true );
     }
-    
+
     public MarshallingConfigurationImpl(PlaceholderResolverStrategyFactory placeholderResolverStrategyFactory,
                                         boolean marshallProcessInstances,
                                         boolean marshallWorkItems,
                                         boolean marshallTimers) {
+        this.placeholderResolverStrategyFactory = placeholderResolverStrategyFactory;
         this.marshallProcessInstances = marshallProcessInstances;
         this.marshallWorkItems = marshallWorkItems;
         this.marshallTimers = marshallTimers;
-        this.placeholderResolverStrategyFactory = placeholderResolverStrategyFactory;
     }
 
     public boolean isMarshallProcessInstances() {
@@ -51,5 +56,5 @@
     public void setPlaceholderResolverStrategyFactory(PlaceholderResolverStrategyFactory placeholderResolverStrategyFactory) {
         this.placeholderResolverStrategyFactory = placeholderResolverStrategyFactory;
     }
-    
-} 
+
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/ByteArraySnapshotter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/ByteArraySnapshotter.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/ByteArraySnapshotter.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -1,14 +0,0 @@
-/**
- * 
- */
-package org.drools.persistence;
-
-public interface ByteArraySnapshotter<T> {
-	
-    byte[] getSnapshot();
-
-    void loadSnapshot(byte[] bytes);
-    
-    T getObject();
-    
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/DroolsXid.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/DroolsXid.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/DroolsXid.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -1,62 +0,0 @@
-package org.drools.persistence;
-
-import javax.transaction.xa.Xid;
-
-public class DroolsXid
-    implements
-    Xid {
-    protected int  formatId;
-    protected byte gtrid[];
-    protected byte bqual[];
-
-    public DroolsXid() {
-    }
-
-    public DroolsXid(int formatId,
-                     byte gtrid[],
-                     byte bqual[]) {
-        this.formatId = formatId;
-        this.gtrid = gtrid;
-        this.bqual = bqual;
-    }
-
-    public int getFormatId() {
-        return formatId;
-    }
-
-    public byte[] getBranchQualifier() {
-        return bqual;
-    }
-
-    public byte[] getGlobalTransactionId() {
-        return gtrid;
-    }
-
-    public String toString() {
-        int hexVal;
-        StringBuffer sb = new StringBuffer( 512 );
-        sb.append( "formatId=" + formatId );
-        sb.append( " gtrid(" + gtrid.length + ")={0x" );
-        for ( int i = 0; i < gtrid.length; i++ ) {
-            hexVal = gtrid[i] & 0xFF;
-            if ( hexVal < 0x10 ) {
-                sb.append( "0" + Integer.toHexString( gtrid[i] & 0xFF ) );
-            } else {
-                sb.append( Integer.toHexString( gtrid[i] & 0xFF ) );
-            }
-        }
-
-        sb.append( "} bqual(" + bqual.length + ")={0x" );
-        for ( int i = 0; i < bqual.length; i++ ) {
-            hexVal = bqual[i] & 0xFF;
-            if ( hexVal < 0x10 ) {
-                sb.append( "0" + Integer.toHexString( bqual[i] & 0xFF ) );
-            } else {
-                sb.append( Integer.toHexString( bqual[i] & 0xFF ) );
-            }
-        }
-
-        sb.append( "}" );
-        return sb.toString();
-    }
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/Persister.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/Persister.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/Persister.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -1,21 +0,0 @@
-package org.drools.persistence;
-
-import javax.transaction.xa.XAResource;
-
-public interface Persister<T> {
-
-    XAResource getXAResource();
-
-    Transaction getTransaction();
-
-    void save();
-
-    void load();
-    
-    String getUniqueId();
-    
-    void setUniqueId(String id);
-    
-    T getObject();
-    
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/Transaction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/Transaction.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/Transaction.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -1,51 +0,0 @@
-package org.drools.persistence;
-
-import javax.transaction.xa.XAException;
-import javax.transaction.xa.XAResource;
-import javax.transaction.xa.Xid;
-
-public class Transaction {
-    private Xid xid;
-
-    XAResource  xaResource;
-
-    public Transaction(Xid xid,
-                       XAResource xaResource) {
-        this.xid = xid;
-        this.xaResource = xaResource;
-    }
-
-    public Xid getXid() {
-        return xid;
-    }
-
-    public void start() throws XAException {
-        this.xaResource.start( xid,
-                               XAResource.TMNOFLAGS );
-    }
-
-    public void rollback() throws XAException {
-        this.xaResource.rollback( xid );
-    }
-
-    public void commit() throws XAException {
-        this.xaResource.commit( xid,
-                                true );
-    }
-
-    public int hashCode() {
-        return xid.hashCode();
-    }
-
-    public boolean equals(Object obj) {
-        if ( this == obj ) return true;
-        if ( obj == null ) return false;
-        if ( getClass() != obj.getClass() ) return false;
-        Transaction other = (Transaction) obj;
-        if ( xid == null ) {
-            if ( other.xid != null ) return false;
-        } else if ( !xid.equals( other.xid ) ) return false;
-        return true;
-    }
-
-}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/FireAllRulesCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/FireAllRulesCommand.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/FireAllRulesCommand.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -0,0 +1,20 @@
+package org.drools.process.command;
+
+import org.drools.StatefulSession;
+
+public class FireAllRulesCommand
+    implements
+    Command<Integer> {
+
+    public FireAllRulesCommand() {
+    }
+
+    public Integer execute(StatefulSession session) {
+        return session.fireAllRules();
+    }
+
+    public String toString() {
+        return "session.fireAllRules();";
+    }
+
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/SetGlobalCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/SetGlobalCommand.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/SetGlobalCommand.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -0,0 +1,28 @@
+package org.drools.process.command;
+
+import org.drools.StatefulSession;
+
+public class SetGlobalCommand
+    implements
+    Command<Void> {
+
+    private String identifier;
+    private Object object;
+
+    public SetGlobalCommand(String identifier,
+                            Object object) {
+        this.identifier = identifier;
+        this.object = object;
+    }
+
+    public Void execute(StatefulSession session) {
+        session.setGlobal( identifier,
+                           object );
+        return null;
+    }
+
+    public String toString() {
+        return "session.setGlobal(" + identifier + ", " + object + ");";
+    }
+
+}

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-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/CommandBasedStatefulKnowledgeSession.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -12,10 +12,12 @@
 import org.drools.process.command.AbortWorkItemCommand;
 import org.drools.process.command.CommandService;
 import org.drools.process.command.CompleteWorkItemCommand;
+import org.drools.process.command.FireAllRulesCommand;
 import org.drools.process.command.GetObjectsCommand;
 import org.drools.process.command.GetProcessInstanceCommand;
 import org.drools.process.command.InsertObjectCommand;
 import org.drools.process.command.RegisterWorkItemHandlerCommand;
+import org.drools.process.command.SetGlobalCommand;
 import org.drools.process.command.SignalEventCommand;
 import org.drools.process.command.StartProcessCommand;
 import org.drools.runtime.Environment;
@@ -103,8 +105,8 @@
 		commandService.dispose();
 	}
 
-	public int fireAllRules() {
-		throw new UnsupportedOperationException();
+	public int fireAllRules() {	    
+		return this.commandService.execute( new FireAllRulesCommand() ); 
 	}
 
 	public int fireAllRules(int max) {
@@ -132,7 +134,7 @@
 	}
 
 	public void setGlobal(String identifier, Object object) {
-		throw new UnsupportedOperationException();
+	    this.commandService.execute( new SetGlobalCommand(identifier, object) );
 	}
 
 	public void setGlobalResolver(GlobalResolver globalResolver) {

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/TransactionInterceptor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/TransactionInterceptor.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/TransactionInterceptor.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -1,34 +0,0 @@
-package org.drools.process.command.impl;
-
-import javax.transaction.xa.XAException;
-
-import org.drools.StatefulSession;
-import org.drools.persistence.Persister;
-import org.drools.persistence.Transaction;
-import org.drools.persistence.memory.MemoryPersister;
-import org.drools.persistence.session.StatefulSessionSnapshotter;
-import org.drools.process.command.Command;
-
-public class TransactionInterceptor extends AbstractInterceptor {
-
-	public <T> T execute(Command<T> command) {
-		Persister<StatefulSession> persister =
-			new MemoryPersister<StatefulSession>(new StatefulSessionSnapshotter(getSession()));
-		persister.save();
-		Transaction transaction = persister.getTransaction();
-		try {
-			transaction.start();
-			T result = super.executeNext(command);
-			transaction.commit();
-			return result;
-		} catch (Throwable t) {
-			try {
-				transaction.rollback();
-				throw new RuntimeException("Could not execute command", t);
-			} catch (XAException e) {
-				throw new RuntimeException("Could not rollback transaction", e);
-			}
-		}
-	}
-
-}

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-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -243,8 +243,11 @@
         return newStatefulSession( config, EnvironmentFactory.newEnvironment() );
     }
     
+    public synchronized StatefulSession newStatefulSession(final SessionConfiguration sessionConfig, final Environment environment) {
+        return newStatefulSession( nextWorkingMemoryCounter(), sessionConfig, environment );
+    }
     
-    public synchronized StatefulSession newStatefulSession(final SessionConfiguration sessionConfig, final Environment environment) {
+    public synchronized StatefulSession newStatefulSession(int id, final SessionConfiguration sessionConfig, final Environment environment) {
         if ( this.config.isSequential() ) {
             throw new RuntimeException( "Cannot have a stateful rule session, with sequential configuration set to true" );
         }
@@ -252,7 +255,7 @@
 
         synchronized ( this.pkgs ) {
             ExecutorService executor = ExecutorServiceFactory.createExecutorService( this.config.getExecutorService() );;
-            session = new ReteooStatefulSession( nextWorkingMemoryCounter(),
+            session = new ReteooStatefulSession( id,
                                                  this,
                                                  executor,
                                                  sessionConfig,

Modified: labs/jbossrules/trunk/drools-decisiontables/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/.classpath	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-decisiontables/.classpath	2009-02-14 04:52:53 UTC (rev 25261)
@@ -20,6 +20,6 @@
   <classpathentry kind="var" path="M2_REPO/joda-time/joda-time/1.5.2/joda-time-1.5.2.jar"/>
   <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/jexcelapi/jxl/2.4.2/jxl-2.4.2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.6/mvel2-2.0.6.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.7-SNAPSHOT/mvel2-2.0.7-SNAPSHOT.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0.jar"/>
 </classpath>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-jsr94/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-jsr94/.classpath	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-jsr94/.classpath	2009-02-14 04:52:53 UTC (rev 25261)
@@ -24,6 +24,6 @@
   <classpathentry kind="var" path="M2_REPO/jsr94/jsr94-tck/1.0.3/jsr94-tck-1.0.3.jar"/>
   <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/jexcelapi/jxl/2.4.2/jxl-2.4.2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.6/mvel2-2.0.6.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.7-SNAPSHOT/mvel2-2.0.7-SNAPSHOT.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0.jar"/>
 </classpath>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/admin/RuleExecutionSetImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/admin/RuleExecutionSetImpl.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/admin/RuleExecutionSetImpl.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -170,7 +170,7 @@
      * @return A new WorkingMemory object.
      */
     public StatefulSession newStatefulSession(SessionConfiguration conf) {
-        return this.ruleBase.newStatefulSession(conf);
+        return this.ruleBase.newStatefulSession(conf, null);
     }
     
     /**

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/.classpath	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/.classpath	2009-02-14 04:52:53 UTC (rev 25261)
@@ -7,6 +7,7 @@
   <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
   <classpathentry kind="var" path="M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.1.1/antlr-runtime-3.1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/codehaus/btm/btm/1.3.2/btm-1.3.2.jar"/>
   <classpathentry kind="var" path="M2_REPO/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar"/>
   <classpathentry kind="var" path="M2_REPO/commons-collections/commons-collections/3.2/commons-collections-3.2.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.4.2.v_883_R34x/core-3.4.2.v_883_R34x.jar"/>
@@ -15,6 +16,8 @@
   <classpathentry kind="src" path="/drools-compiler"/>
   <classpathentry kind="src" path="/drools-core"/>
   <classpathentry kind="var" path="M2_REPO/org/hibernate/ejb3-persistence/1.0.2.GA/ejb3-persistence-1.0.2.GA.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/geronimo/specs/geronimo-jms_1.1_spec/1.0.1/geronimo-jms_1.1_spec-1.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/geronimo/specs/geronimo-jta_1.0.1B_spec/1.0.1/geronimo-jta_1.0.1B_spec-1.0.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/com/h2database/h2/1.0.77/h2-1.0.77.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
@@ -29,7 +32,7 @@
   <classpathentry kind="var" path="M2_REPO/joda-time/joda-time/1.5.2/joda-time-1.5.2.jar"/>
   <classpathentry kind="var" path="M2_REPO/javax/transaction/jta/1.0.1B/jta-1.0.1B.jar"/>
   <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.6/mvel2-2.0.6.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.7-SNAPSHOT/mvel2-2.0.7-SNAPSHOT.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/javax/persistence/persistence-api/1.0/persistence-api-1.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.5.2/slf4j-api-1.5.2.jar"/>

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/pom.xml	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/pom.xml	2009-02-14 04:52:53 UTC (rev 25261)
@@ -101,6 +101,13 @@
     		<artifactId>jta</artifactId>
     		<version>1.0.1B</version>
     	</dependency>
+    	
+    	<dependency>
+		    <groupId>org.codehaus.btm</groupId>
+		    <artifactId>btm</artifactId>
+		    <version>1.3.2</version>    	
+		    <scope>test</scope>
+    	</dependency>    	
 
       </dependencies>              
                   

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManager.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManager.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManager.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -12,58 +12,60 @@
 import org.drools.process.instance.ProcessInstance;
 import org.drools.process.instance.ProcessInstanceManager;
 import org.drools.process.instance.impl.ProcessInstanceImpl;
+import org.drools.runtime.EnvironmentName;
 
-public class JPAProcessInstanceManager implements ProcessInstanceManager {
+public class JPAProcessInstanceManager
+    implements
+    ProcessInstanceManager {
 
-    private EntityManager manager;
     private WorkingMemory workingMemory;
-    
-    public void setEntityManager(EntityManager manager) {
-        this.manager = manager;
-    }
-    
+
     public void setWorkingMemory(WorkingMemory workingMemory) {
         this.workingMemory = workingMemory;
     }
-    
+
     public void addProcessInstance(ProcessInstance processInstance) {
-        ProcessInstanceInfo processInstanceInfo = new ProcessInstanceInfo(processInstance);
-        manager.persist(processInstanceInfo);
-        ((ProcessInstance) processInstance).setId(processInstanceInfo.getId());
+        ProcessInstanceInfo processInstanceInfo = new ProcessInstanceInfo( processInstance );
+        EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
+        em.persist( processInstanceInfo );
+        ((ProcessInstance) processInstance).setId( processInstanceInfo.getId() );
         processInstanceInfo.updateLastReadDate();
     }
-    
+
     public void internalAddProcessInstance(ProcessInstance processInstance) {
     }
 
     public ProcessInstance getProcessInstance(long id) {
-        ProcessInstanceInfo processInstanceInfo = manager.find(ProcessInstanceInfo.class, id);
-        if (processInstanceInfo == null) {
+        EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
+        ProcessInstanceInfo processInstanceInfo = em.find( ProcessInstanceInfo.class,
+                                                           id );
+        if ( processInstanceInfo == null ) {
             return null;
         }
         processInstanceInfo.updateLastReadDate();
         ProcessInstance processInstance = (ProcessInstance) processInstanceInfo.getProcessInstance();
-        Process process = ((InternalRuleBase) workingMemory.getRuleBase()).getProcess(processInstance.getProcessId());
-        if (process == null) {
-        	throw new IllegalArgumentException(
-    			"Could not find process " + processInstance.getProcessId());
+        Process process = ((InternalRuleBase) workingMemory.getRuleBase()).getProcess( processInstance.getProcessId() );
+        if ( process == null ) {
+            throw new IllegalArgumentException( "Could not find process " + processInstance.getProcessId() );
         }
-        processInstance.setProcess(process);
-        if (processInstance.getWorkingMemory() == null) {
-            processInstance.setWorkingMemory((InternalWorkingMemory) workingMemory);
+        processInstance.setProcess( process );
+        if ( processInstance.getWorkingMemory() == null ) {
+            processInstance.setWorkingMemory( (InternalWorkingMemory) workingMemory );
             ((ProcessInstanceImpl) processInstance).reconnect();
         }
         return processInstance;
     }
 
-	public Collection<ProcessInstance> getProcessInstances() {
+    public Collection<ProcessInstance> getProcessInstances() {
         return new ArrayList<ProcessInstance>();
     }
 
     public void removeProcessInstance(ProcessInstance processInstance) {
-        ProcessInstanceInfo processInstanceInfo = manager.find(ProcessInstanceInfo.class, processInstance.getId());
-        if (processInstanceInfo != null) {
-            manager.remove(processInstanceInfo);
+        EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
+        ProcessInstanceInfo processInstanceInfo = em.find( ProcessInstanceInfo.class,
+                                                           processInstance.getId() );
+        if ( processInstanceInfo != null ) {
+            em.remove( processInstanceInfo );
         }
     }
 

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPASignalManager.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPASignalManager.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPASignalManager.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -4,63 +4,57 @@
 
 import javax.persistence.EntityManager;
 import javax.persistence.Query;
-import javax.transaction.xa.XAException;
 
-import org.drools.StatefulSession;
 import org.drools.WorkingMemory;
-import org.drools.persistence.Persister;
-import org.drools.persistence.Transaction;
 import org.drools.process.instance.event.DefaultSignalManager;
+import org.drools.runtime.EnvironmentName;
 import org.drools.runtime.process.ProcessInstance;
 
 public class JPASignalManager extends DefaultSignalManager {
 
-    private EntityManager manager;
-    private Persister<StatefulSession> persister;
     private WorkingMemory workingMemory;
-    
+
     public JPASignalManager(WorkingMemory workingMemory) {
-    	this.workingMemory = workingMemory;
+        this.workingMemory = workingMemory;
     }
     
-    public void setEntityManager(EntityManager manager) {
-        this.manager = manager;
+    public void signalEvent(String type,
+                            Object event) {
+        for ( long id : getProcessInstancesForEvent( type ) ) {
+            workingMemory.getProcessInstance( id );
+        }
+        super.signalEvent( type,
+                           event );
     }
-    
-    public void setPersister(Persister<StatefulSession> persister) {
-    	this.persister = persister;
+
+    public void signalEvent(ProcessInstance processInstance,
+                            String type,
+                            Object event) {
+        //		Transaction transaction = persister.getTransaction();
+        //		try {
+        //			transaction.start();
+        //	    	super.signalEvent(processInstance, type, event);
+        //			transaction.commit();
+        //		} catch (Throwable t) {
+        //			t.printStackTrace();
+        //			try {
+        //				transaction.rollback();
+        //				throw new RuntimeException("Could not execute command", t);
+        //			} catch (XAException e) {
+        //				throw new RuntimeException("Could not rollback transaction", e);
+        //			}
+        //		}
     }
-    
-    public void signalEvent(String type, Object event) {
-    	for (long id: getProcessInstancesForEvent(type)) {
-    		workingMemory.getProcessInstance(id);
-    	}
-    	super.signalEvent(type, event);
-    }
-    
-    public void signalEvent(ProcessInstance processInstance, String type, Object event) {
-		Transaction transaction = persister.getTransaction();
-		try {
-			transaction.start();
-	    	super.signalEvent(processInstance, type, event);
-			transaction.commit();
-		} catch (Throwable t) {
-			t.printStackTrace();
-			try {
-				transaction.rollback();
-				throw new RuntimeException("Could not execute command", t);
-			} catch (XAException e) {
-				throw new RuntimeException("Could not rollback transaction", e);
-			}
-		}
-    }
-    
+
     @SuppressWarnings("unchecked")
-	private List<Long> getProcessInstancesForEvent(String type) {
-    	Query processInstancesForEvent = manager.createNamedQuery("ProcessInstancesWaitingForEvent");
-		processInstancesForEvent.setParameter("type", type);
-		List<Long> list = (List<Long>) processInstancesForEvent.getResultList();
-		return list;
+    private List<Long> getProcessInstancesForEvent(String type) {
+        EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
+        
+        Query processInstancesForEvent = em.createNamedQuery( "ProcessInstancesWaitingForEvent" );
+        processInstancesForEvent.setParameter( "type",
+                                               type );
+        List<Long> list = (List<Long>) processInstancesForEvent.getResultList();
+        return list;
     }
-    
+
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -12,11 +12,11 @@
 import org.drools.process.instance.WorkItem;
 import org.drools.process.instance.WorkItemManager;
 import org.drools.process.instance.impl.WorkItemImpl;
+import org.drools.runtime.EnvironmentName;
 import org.drools.runtime.process.WorkItemHandler;
 
 public class JPAWorkItemManager implements WorkItemManager {
 
-    private EntityManager manager;
     private WorkingMemory workingMemory;
 	private Map<String, WorkItemHandler> workItemHandlers = new HashMap<String, WorkItemHandler>();
     
@@ -24,13 +24,12 @@
     	this.workingMemory = workingMemory;
     }
     
-    public void setEntityManager(EntityManager manager) {
-        this.manager = manager;
-    }
 
 	public void internalExecuteWorkItem(WorkItem workItem) {
+	    EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
+	    
 		WorkItemInfo workItemInfo = new WorkItemInfo(workItem);
-        manager.persist(workItemInfo);
+        em.persist(workItemInfo);
         ((WorkItemImpl) workItem).setId(workItemInfo.getId());
         workItemInfo.update();
         WorkItemHandler handler = (WorkItemHandler) this.workItemHandlers.get(workItem.getName());
@@ -42,7 +41,9 @@
 	}
 
 	public void internalAbortWorkItem(long id) {
-        WorkItemInfo workItemInfo = manager.find(WorkItemInfo.class, id);
+	    EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
+	    
+        WorkItemInfo workItemInfo = em.find(WorkItemInfo.class, id);
         // work item may have been aborted
         if (workItemInfo != null) {
         	WorkItemImpl workItem = (WorkItemImpl) workItemInfo.getWorkItem();
@@ -52,7 +53,7 @@
             } else {
                 System.err.println("Could not find work item handler for " + workItem.getName());
             }
-            manager.remove(workItemInfo);
+            em.remove(workItemInfo);
         }
 	}
 
@@ -60,7 +61,9 @@
 	}
 
     public void completeWorkItem(long id, Map<String, Object> results) {
-        WorkItemInfo workItemInfo = manager.find(WorkItemInfo.class, id);
+        EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
+        
+        WorkItemInfo workItemInfo = em.find(WorkItemInfo.class, id);
         // work item may have been aborted
         if (workItemInfo != null) {
         	WorkItemImpl workItem = (WorkItemImpl) workItemInfo.getWorkItem();
@@ -71,13 +74,15 @@
             if (processInstance != null) {
                 processInstance.signalEvent("workItemCompleted", workItem);
             }
-            manager.remove(workItemInfo);
+            em.remove(workItemInfo);
             workingMemory.fireAllRules();
     	}
     }
 
     public void abortWorkItem(long id) {
-        WorkItemInfo workItemInfo = manager.find(WorkItemInfo.class, id);
+        EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
+        
+        WorkItemInfo workItemInfo = em.find(WorkItemInfo.class, id);
         // work item may have been aborted
         if (workItemInfo != null) {
         	WorkItemImpl workItem = (WorkItemImpl) workItemInfo.getWorkItem();
@@ -87,13 +92,15 @@
             if (processInstance != null) {
                 processInstance.signalEvent("workItemAborted", workItem);
             }
-            manager.remove(workItemInfo);
+            em.remove(workItemInfo);
             workingMemory.fireAllRules();
         }
     }
 
 	public WorkItem getWorkItem(long id) {
-		WorkItemInfo workItemInfo = manager.find(WorkItemInfo.class, id);
+	    EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
+	    
+		WorkItemInfo workItemInfo = em.find(WorkItemInfo.class, id);
         if (workItemInfo == null) {
             return null;
         }

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessInstanceEventInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessInstanceEventInfo.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessInstanceEventInfo.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -1,33 +1,51 @@
 package org.drools.persistence.processinstance;
 
+import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
+import javax.persistence.Version;
 
 @Entity
 public class ProcessInstanceEventInfo {
 
-	private @Id @GeneratedValue(strategy=GenerationType.AUTO) Long id;
-	private String eventType;
-	private long processInstanceId;
-	
-	ProcessInstanceEventInfo() {
-	}
-	
-	public ProcessInstanceEventInfo(long processInstanceId, String eventType) {
-		this.processInstanceId = processInstanceId;
-		this.eventType = eventType;
-	}
-	
-	public long getProcessInstanceId() {
-		return processInstanceId;
-	}
-	
-	public String getEventType() {
-		return eventType;
-	}
-	
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private long   id;
+
+    @Version
+    @Column(name = "OPTLOCK")
+    private int    version;
+
+    private String eventType;
+    private long   processInstanceId;
+
+    ProcessInstanceEventInfo() {
+    }
+    
+    public long getId() {
+        return this.id;
+    }
+    
+    public int getVersion() {
+        return this.version;
+    }    
+
+    public ProcessInstanceEventInfo(long processInstanceId,
+                                    String eventType) {
+        this.processInstanceId = processInstanceId;
+        this.eventType = eventType;
+    }
+
+    public long getProcessInstanceId() {
+        return processInstanceId;
+    }
+
+    public String getEventType() {
+        return eventType;
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -10,50 +10,52 @@
 import java.util.HashSet;
 import java.util.Set;
 
+import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Lob;
-import javax.persistence.PostLoad;
-import javax.persistence.PostPersist;
-import javax.persistence.PostUpdate;
-import javax.persistence.PrePersist;
 import javax.persistence.PreUpdate;
 import javax.persistence.Transient;
+import javax.persistence.Version;
 
 import org.drools.marshalling.MarshallerReaderContext;
 import org.drools.marshalling.MarshallerWriteContext;
 import org.drools.marshalling.ProcessInstanceMarshaller;
 import org.drools.marshalling.ProcessMarshallerRegistry;
+import org.drools.marshalling.RuleFlowProcessInstanceMarshaller;
 import org.drools.process.instance.impl.ProcessInstanceImpl;
+import org.drools.ruleflow.instance.RuleFlowProcessInstance;
 import org.drools.runtime.process.ProcessInstance;
+import org.drools.workflow.instance.impl.WorkflowProcessInstanceImpl;
 import org.hibernate.annotations.CollectionOfElements;
 
 @Entity
 public class ProcessInstanceInfo {
 
-    private @Id
+    @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
-    Long                processInstanceId;
-    private String      processId;
-    private Date        startDate;
-    private Date        lastReadDate;
-    private Date        lastModificationDate;
-    private int         state;
-
+    private  Long processInstanceId;
+    
+    @Version
+    @Column(name = "OPTLOCK")
+    private int         version;
+    
+    private String processId;
+    private Date startDate;
+    private Date lastReadDate;
+    private Date lastModificationDate;
+    private int state;
+    // TODO How do I mark a process instance info as dirty when the process
+    // instance
+    // has changed (so that byte array is regenerated and saved) ?
     private @Lob
-    byte[]              processInstanceByteArray;
-
-    private @Transient
-    @Lob
-    byte[]              processInstanceByteArrayShadow;
-
+    byte[] processInstanceByteArray;
     @CollectionOfElements
     private Set<String> eventTypes = new HashSet<String>();
-
     private @Transient
-    ProcessInstance     processInstance;
+    ProcessInstance processInstance;
 
     ProcessInstanceInfo() {
     }
@@ -93,103 +95,68 @@
     }
 
     public ProcessInstance getProcessInstance() {
+        if (processInstance == null) {
+            try {
+                ByteArrayInputStream bais = new ByteArrayInputStream(
+                        processInstanceByteArray);
+                MarshallerReaderContext context = new MarshallerReaderContext(
+                        bais, null, null, null);
+                ProcessInstanceMarshaller marshaller = getMarshallerFromContext(context);
+                processInstance = marshaller.readProcessInstance(context);
+                context.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+                throw new IllegalArgumentException(
+                        "IOException while loading process instance: "
+                                + e.getMessage());
+            }
+        }
         return processInstance;
     }
 
-    private ProcessInstanceMarshaller getMarshallerFromContext(MarshallerReaderContext context) throws IOException {
+    private ProcessInstanceMarshaller getMarshallerFromContext(
+            MarshallerReaderContext context) throws IOException {
         ObjectInputStream stream = context.stream;
         String processInstanceType = stream.readUTF();
-        return ProcessMarshallerRegistry.INSTANCE.getMarshaller( processInstanceType );
+        return ProcessMarshallerRegistry.INSTANCE
+                .getMarshaller(processInstanceType);
     }
 
     private void saveProcessInstanceType(MarshallerWriteContext context,
-                                         ProcessInstance processInstance,
-                                         String processInstanceType) throws IOException {
+            ProcessInstance processInstance, String processInstanceType)
+            throws IOException {
         ObjectOutputStream stream = context.stream;
         // saves the processInstance type first
-        stream.writeUTF( processInstanceType );
+        stream.writeUTF(processInstanceType);
     }
 
-    @PostLoad
-    public void postLoad() {
-        if ( processInstance == null ) {
-            try {
-                ByteArrayInputStream bais = new ByteArrayInputStream( processInstanceByteArray );
-                MarshallerReaderContext context = new MarshallerReaderContext( bais,
-                                                                               null,
-                                                                               null,
-                                                                               null );
-                ProcessInstanceMarshaller marshaller = getMarshallerFromContext( context );
-                processInstance = marshaller.readProcessInstance( context );
-                context.close();
-            } catch ( IOException e ) {
-                e.printStackTrace();
-                throw new IllegalArgumentException( "IOException while loading process instance: " + e.getMessage() );
-            }
-        }
-        // reference it as a shadow field, this can be used to check for changes and do rollbacks without hitting the DB.
-        this.processInstanceByteArrayShadow = this.processInstanceByteArray;
-        this.processInstanceByteArray = null; // setting this to null will force an update
-    }
-
     @PreUpdate
-    // executes before update
-    @PrePersist
-    // executes before insert
     public void update() {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         try {
-            MarshallerWriteContext context = new MarshallerWriteContext( baos,
-                                                                         null,
-                                                                         null,
-                                                                         null,
-                                                                         null );
-            String processType = ((ProcessInstanceImpl) processInstance).getProcess().getType();
-            saveProcessInstanceType( context,
-                                     processInstance,
-                                     processType );
-            ProcessInstanceMarshaller marshaller = ProcessMarshallerRegistry.INSTANCE.getMarshaller( processType );
-            marshaller.writeProcessInstance( context,
-                                             processInstance );
+            MarshallerWriteContext context = new MarshallerWriteContext(baos,
+                    null, null, null, null);
+            String processType = ((ProcessInstanceImpl) processInstance).getProcess()
+                    .getType();
+            saveProcessInstanceType(context, processInstance, processType);
+            ProcessInstanceMarshaller marshaller = ProcessMarshallerRegistry.INSTANCE.getMarshaller(processType);
+            marshaller.writeProcessInstance(
+                    context, processInstance);
             context.close();
-        } catch ( IOException e ) {
-            throw new IllegalArgumentException( "IOException while storing process instance " + processInstance.getId() + ": " + e.getMessage() );
+        } catch (IOException e) {
+            throw new IllegalArgumentException(
+                    "IOException while storing process instance "
+                            + processInstance.getId() + ": " + e.getMessage());
         }
         byte[] newByteArray = baos.toByteArray();
-        if ( !Arrays.equals( newByteArray,
-                             processInstanceByteArrayShadow ) ) {
+        if (!Arrays.equals(newByteArray, processInstanceByteArray)) {
             this.state = processInstance.getState();
             this.lastModificationDate = new Date();
             this.processInstanceByteArray = newByteArray;
-            this.processInstanceByteArrayShadow = newByteArray;
             this.eventTypes.clear();
-            for ( String type : processInstance.getEventTypes() ) {
-                eventTypes.add( type );
+            for (String type : processInstance.getEventTypes()) {
+                eventTypes.add(type);
             }
-        } else {
-            // there was no change so restore for the perist process
-            this.processInstanceByteArray = this.processInstanceByteArrayShadow;
         }
     }
-
-    @PostUpdate
-    // executes after update
-    @PostPersist
-    // executes after insert
-    public void postUpdate() {
-        // we need to null this to force an update check
-        this.processInstanceByteArray = null;
-    }
-
-    public void rollback() {
-        // restore the processInstanceByteArray
-        this.processInstanceByteArray = this.processInstanceByteArrayShadow;
-
-        //Simulate load which forces rebuilding of the process from the shadow
-        postLoad();
-    }
-
-    public void commit() {
-        this.processInstanceByteArrayShadow = processInstanceByteArray;
-    }
 }

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -5,6 +5,7 @@
 import java.io.IOException;
 import java.util.Date;
 
+import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
@@ -12,6 +13,7 @@
 import javax.persistence.Lob;
 import javax.persistence.PreUpdate;
 import javax.persistence.Transient;
+import javax.persistence.Version;
 
 import org.drools.marshalling.InputMarshaller;
 import org.drools.marshalling.MarshallerReaderContext;
@@ -22,73 +24,92 @@
 @Entity
 public class WorkItemInfo {
 
-	private @Id @GeneratedValue(strategy=GenerationType.AUTO) long workItemId;
-	private String name;
-	private Date creationDate;
-    private long processInstanceId;
-    private long state;
-	private @Lob byte[] workItemByteArray;
-    private @Transient WorkItem workItem;
-    
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private long   workItemId;
+
+    @Version
+    @Column(name = "OPTLOCK")
+    private int    version;
+
+    private String name;
+    private Date   creationDate;
+    private long   processInstanceId;
+    private long   state;
+    private @Lob
+    byte[]         workItemByteArray;
+    private @Transient
+    WorkItem       workItem;
+
     WorkItemInfo() {
     }
-    
+
     public WorkItemInfo(WorkItem workItem) {
-    	this.workItem = workItem;
-    	this.name = workItem.getName();
-    	this.creationDate = new Date();
-    	this.processInstanceId = workItem.getProcessInstanceId();
+        this.workItem = workItem;
+        this.name = workItem.getName();
+        this.creationDate = new Date();
+        this.processInstanceId = workItem.getProcessInstanceId();
     }
+
+    public long getId() {
+        return workItemId;
+    }
     
-	public long getId() {
-		return workItemId;
-	}
-	
-	public String getName() {
-		return name;
-	}
-	
-	public Date getCreationDate() {
-		return creationDate;
-	}
-	
-	public long getProcessInstanceId() {
-		return processInstanceId;
-	}
-	
-	public long getState() {
-		return state;
-	}
-	
-	public WorkItem getWorkItem() {
-		if (workItem == null) {
-			try {
-				ByteArrayInputStream bais = new ByteArrayInputStream(workItemByteArray);
-				MarshallerReaderContext context = new MarshallerReaderContext(bais, null, null, null);
-				workItem = InputMarshaller.readWorkItem(context);
-				context.close();
-			} catch (IOException e) {
-				e.printStackTrace();
-				throw new IllegalArgumentException(
-					"IOException while loading process instance: " + e.getMessage());
-			}
-		}
-		return workItem;
-	}
-	
-	@PreUpdate
-	public void update() {
-		this.state = workItem.getState();
-		ByteArrayOutputStream baos = new ByteArrayOutputStream();
-		try {
-			MarshallerWriteContext context = new MarshallerWriteContext(baos, null, null, null, null);
-			OutputMarshaller.writeWorkItem(context, workItem);
-			context.close();
-			this.workItemByteArray = baos.toByteArray();
-		} catch (IOException e) {
-			throw new IllegalArgumentException(
-				"IOException while storing workItem " + workItem.getId() + ": " + e.getMessage());
-		}
-	}
-	
+    public int getVersion() {
+        return this.version;
+    }    
+
+    public String getName() {
+        return name;
+    }
+
+    public Date getCreationDate() {
+        return creationDate;
+    }
+
+    public long getProcessInstanceId() {
+        return processInstanceId;
+    }
+
+    public long getState() {
+        return state;
+    }
+
+    public WorkItem getWorkItem() {
+        if ( workItem == null ) {
+            try {
+                ByteArrayInputStream bais = new ByteArrayInputStream( workItemByteArray );
+                MarshallerReaderContext context = new MarshallerReaderContext( bais,
+                                                                               null,
+                                                                               null,
+                                                                               null );
+                workItem = InputMarshaller.readWorkItem( context );
+                context.close();
+            } catch ( IOException e ) {
+                e.printStackTrace();
+                throw new IllegalArgumentException( "IOException while loading process instance: " + e.getMessage() );
+            }
+        }
+        return workItem;
+    }
+
+    @PreUpdate
+    public void update() {
+        this.state = workItem.getState();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try {
+            MarshallerWriteContext context = new MarshallerWriteContext( baos,
+                                                                         null,
+                                                                         null,
+                                                                         null,
+                                                                         null );
+            OutputMarshaller.writeWorkItem( context,
+                                            workItem );
+            context.close();
+            this.workItemByteArray = baos.toByteArray();
+        } catch ( IOException e ) {
+            throw new IllegalArgumentException( "IOException while storing workItem " + workItem.getId() + ": " + e.getMessage() );
+        }
+    }
+
 }

Deleted: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPAPersisterManager.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPAPersisterManager.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPAPersisterManager.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -1,59 +0,0 @@
-package org.drools.persistence.session;
-
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.Persistence;
-
-import org.drools.RuleBase;
-import org.drools.SessionConfiguration;
-import org.drools.StatefulSession;
-import org.drools.marshalling.PlaceholderResolverStrategyFactory;
-import org.drools.persistence.Persister;
-import org.drools.persistence.jpa.JPAPersister;
-
-public class JPAPersisterManager {
-
-	private EntityManagerFactory emf;
-	private PlaceholderResolverStrategyFactory factory;
-	
-	public JPAPersisterManager(PlaceholderResolverStrategyFactory factory, EntityManagerFactory emf) {
-		if (emf == null) {
-			this.emf = Persistence.createEntityManagerFactory("org.drools.persistence.jpa");
-		} else {
-			this.emf = emf;
-		}
-		this.factory = factory;
-	}
-	
-	public JPAPersisterManager(PlaceholderResolverStrategyFactory factory) {
-		this(factory, null);
-	}
-	
-	public void dispose() {
-		emf.close();
-	}
-	
-	public Persister<StatefulSession> getSessionPersister(StatefulSession session) {
-		return new JPAPersister<StatefulSession>(emf, new StatefulSessionSnapshotter(session, factory));
-	}
-	
-	public Persister<StatefulSession> getSessionPersister(RuleBase ruleBase) {
-		return new JPAPersister<StatefulSession>(emf, new StatefulSessionSnapshotter(ruleBase.newStatefulSession(), factory));
-	}
-	
-	public Persister<StatefulSession> getSessionPersister(RuleBase ruleBase, SessionConfiguration conf) {
-		return new JPAPersister<StatefulSession>(emf, new StatefulSessionSnapshotter(ruleBase.newStatefulSession(conf), factory));
-	}
-	
-	public Persister<StatefulSession> getSessionPersister(String uniqueId, RuleBase ruleBase) {
-		return getSessionPersister(uniqueId, ruleBase, null);
-	}
-	
-	public Persister<StatefulSession> getSessionPersister(String uniqueId, RuleBase ruleBase, SessionConfiguration conf) {
-		Persister<StatefulSession> persister = new JPAPersister<StatefulSession>(
-			emf, new StatefulSessionSnapshotter(ruleBase, conf, factory));
-		persister.setUniqueId(uniqueId);
-		persister.load();
-		return persister;
-	}
-	
-}

Copied: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPASessionMashallingHelper.java (from rev 25237, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/session/StatefulSessionSnapshotter.java)
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPASessionMashallingHelper.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPASessionMashallingHelper.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -0,0 +1,108 @@
+package org.drools.persistence.session;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import org.drools.RuleBase;
+import org.drools.SessionConfiguration;
+import org.drools.StatefulSession;
+import org.drools.common.InternalRuleBase;
+import org.drools.marshalling.DefaultMarshaller;
+import org.drools.marshalling.Marshaller;
+import org.drools.marshalling.MarshallingConfiguration;
+
+public class JPASessionMashallingHelper {
+
+    private RuleBase             ruleBase;
+    private SessionConfiguration conf;
+    private StatefulSession      session;
+    private Marshaller           marshaller;
+    
+    /**
+     * Exist Info, so load session from here
+     * @param info
+     * @param ruleBase
+     * @param conf
+     * @param marshallingConfiguration
+     */
+    public JPASessionMashallingHelper(SessionInfo info,
+                                      RuleBase    ruleBase,
+                                      SessionConfiguration conf,
+                                      MarshallingConfiguration marshallingConfiguration) {   
+        this.ruleBase = session.getRuleBase();
+        this.conf = conf;
+        this.marshaller = new DefaultMarshaller( ((InternalRuleBase) ruleBase).getConfiguration(),
+                                                 marshallingConfiguration );
+        loadSnapshot( info.getData() );       
+        info.setJPASessionMashallingHelper( this );         
+    }    
+
+    /** 
+     * new session, don't write now as info will request it on update callback
+     * @param info
+     * @param session
+     * @param conf
+     * @param marshallingConfiguration
+     */
+    public JPASessionMashallingHelper(StatefulSession session,
+                                      SessionConfiguration conf,
+                                      MarshallingConfiguration marshallingConfiguration) {   
+        this.session = session;     
+        this.ruleBase = session.getRuleBase();
+        this.conf = conf;
+        this.marshaller = new DefaultMarshaller( ((InternalRuleBase) ruleBase).getConfiguration(),
+                                                 marshallingConfiguration );   
+    }
+
+    public byte[] getSnapshot() {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try {
+            marshaller.write( baos,
+                              (InternalRuleBase) ruleBase,
+                              session );
+        } catch ( IOException e ) {
+            throw new RuntimeException( "Unable to get session snapshot",
+                                        e );
+        }
+
+        return baos.toByteArray();
+    }
+
+    public StatefulSession loadSnapshot(byte[] bytes,
+                                        StatefulSession session) {
+        this.session = session;
+        ByteArrayInputStream bais = new ByteArrayInputStream( bytes );
+        try {
+            marshaller.read( bais,
+                             (InternalRuleBase) ruleBase,
+                             session );
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to load session snapshot",
+                                        e );
+        }
+        return this.session;
+    }
+
+    public StatefulSession loadSnapshot(byte[] bytes) {
+        try {
+            ByteArrayInputStream bais = new ByteArrayInputStream( bytes );
+            if ( this.session == null ) {
+                this.session = this.ruleBase.readStatefulSession( bais,
+                                                                  marshaller );
+            } else {
+                loadSnapshot( bytes,
+                              this.session );
+            }
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to load session snapshot",
+                                        e );
+        }
+        return this.session;
+    }
+
+    public StatefulSession getObject() {
+        return session;
+    }
+
+}

Deleted: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/PersistenceConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/PersistenceConfig.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/PersistenceConfig.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -1,38 +0,0 @@
-package org.drools.persistence.session;
-
-import javax.persistence.EntityManagerFactory;
-
-import org.drools.marshalling.PlaceholderResolverStrategyFactory;
-
-public class PersistenceConfig {
-	
-	private String sessionId;
-	private PlaceholderResolverStrategyFactory placeholderResolverStrategyFactory;
-	private EntityManagerFactory entityManagerFactory;
-	
-	public String getSessionId() {
-		return sessionId;
-	}
-	
-	public void setSessionId(String sessionId) {
-		this.sessionId = sessionId;
-	}
-	
-	public PlaceholderResolverStrategyFactory getPlaceholderResolverStrategyFactory() {
-		return placeholderResolverStrategyFactory;
-	}
-	
-	public void setPlaceholderResolverStrategy(
-			PlaceholderResolverStrategyFactory placeholderResolverStrategyFactory) {
-		this.placeholderResolverStrategyFactory = placeholderResolverStrategyFactory;
-	}
-	
-	public EntityManagerFactory getEntityManagerFactory() {
-		return entityManagerFactory;
-	}
-	
-	public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
-		this.entityManagerFactory = entityManagerFactory;
-	}
-
-}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SessionInfo.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -0,0 +1,110 @@
+package org.drools.persistence.session;
+
+import java.util.Arrays;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.PostLoad;
+import javax.persistence.PrePersist;
+import javax.persistence.PreUpdate;
+import javax.persistence.Transient;
+import javax.persistence.Version;
+
+import org.drools.marshalling.MarshallingConfiguration;
+
+ at Entity
+public class SessionInfo {
+    private @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    int                        id;
+
+//    @Version
+//    @Column(name = "OPTLOCK")     
+//    private int                version;
+
+    private Date               startDate;
+    private Date               lastModificationDate;    
+    private boolean            dirty;         
+    @Lob
+    private byte[]             rulesByteArray;
+
+    @Transient
+    private int                versionShadow;
+    @Transient
+    private Date               lastModificationDateShadow;  
+    @Transient
+    private byte[]             rulesByteArrayShadow;
+
+    @Transient
+    MarshallingConfiguration   marshallingConfiguration;
+
+    @Transient
+    JPASessionMashallingHelper helper;
+    
+    public SessionInfo() {
+        this.startDate = new Date();
+    }
+
+    public int getId() {
+        return this.id;
+    }
+    
+//    public int getVersion() {
+//        return this.version;
+//    }
+
+    public void setJPASessionMashallingHelper(JPASessionMashallingHelper helper) {
+        this.helper = helper;
+    }
+
+    public byte[] getData() {
+        return this.rulesByteArray;
+    }
+    
+    public Date getStartDate() {
+        return this.startDate;
+    }
+
+    public Date getLastModificationDate() {
+        return this.lastModificationDate;
+    }
+
+    public void setDirty() {
+        this.dirty = true;
+    }
+    
+    @PostLoad
+    public void postLoad() {
+        this.lastModificationDateShadow = this.lastModificationDate;       
+        this.rulesByteArrayShadow = this.rulesByteArray;
+//        this.versionShadow = this.version;
+    }
+    
+    @PrePersist 
+    @PreUpdate 
+    public void update() {
+        // we always increase the last modification date for each action, so we know there will be an update
+        System.out.println( "pre persist/update event" );
+        byte[] newByteArray = this.helper.getSnapshot();
+        if ( !Arrays.equals( newByteArray,
+                             this.rulesByteArray ) ) {
+            this.lastModificationDate = new Date();
+            this.rulesByteArray = newByteArray;
+        }
+        this.lastModificationDateShadow = this.lastModificationDate;       
+        this.rulesByteArrayShadow = this.rulesByteArray;
+        this.dirty = false;
+    }
+    
+    public void rollback() {
+        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-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -1,117 +1,295 @@
 package org.drools.persistence.session;
 
-import javax.transaction.xa.XAException;
+import java.util.Map;
 
+import javax.naming.InitialContext;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.transaction.RollbackException;
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+import javax.transaction.UserTransaction;
+
+import org.apache.commons.collections.map.IdentityMap;
 import org.drools.KnowledgeBase;
 import org.drools.RuleBase;
 import org.drools.SessionConfiguration;
 import org.drools.StatefulSession;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.impl.EnvironmentFactory;
 import org.drools.impl.KnowledgeBaseImpl;
-import org.drools.persistence.Persister;
-import org.drools.persistence.Transaction;
-import org.drools.persistence.jpa.JPAPersister;
-import org.drools.persistence.processinstance.JPAProcessInstanceManager;
-import org.drools.persistence.processinstance.JPASignalManager;
-import org.drools.persistence.processinstance.JPAWorkItemManager;
+import org.drools.marshalling.MarshallingConfiguration;
+import org.drools.marshalling.MarshallingConfigurationImpl;
+import org.drools.marshalling.PlaceholderResolverStrategyFactory;
 import org.drools.process.command.Command;
 import org.drools.process.command.CommandService;
+import org.drools.reteoo.ReteooRuleBase;
 import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
 import org.drools.runtime.KnowledgeSessionConfiguration;
+import org.hibernate.ejb.EntityManagerImpl;
 
-public class SingleSessionCommandService implements CommandService {
+public class SingleSessionCommandService
+    implements
+    CommandService {
 
-	private Persister<StatefulSession> persister;
-	private PersistenceConfig pconfig;
-	
-	public SingleSessionCommandService(RuleBase ruleBase) {
-		this(ruleBase, null);
-	}
-	
-	public SingleSessionCommandService(RuleBase ruleBase, SessionConfiguration conf) {
-		if (conf == null) {
-			conf = new SessionConfiguration();
-		}
-		PersistenceConfig pconfig = getPersistenceConfig();
-		if (pconfig.getSessionId() != null) { 
-			persister = new JPAPersisterManager(
-				pconfig.getPlaceholderResolverStrategyFactory(),
-				pconfig.getEntityManagerFactory())
-					.getSessionPersister(pconfig.getSessionId(), ruleBase, conf);
-		} else {
-			persister = new JPAPersisterManager(
-				pconfig.getPlaceholderResolverStrategyFactory(),
-				pconfig.getEntityManagerFactory())
-					.getSessionPersister(ruleBase, conf);
-		}
-		init();
-	}
-	
-	public SingleSessionCommandService(KnowledgeBase kbase) {
-		this(((KnowledgeBaseImpl) kbase).getRuleBase());
-	}
-	
-	public SingleSessionCommandService(KnowledgeBase kbase, KnowledgeSessionConfiguration conf) {
-		this(((KnowledgeBaseImpl) kbase).getRuleBase(), (SessionConfiguration) conf);
-	}
-	
-	private void init() {
-		StatefulSession session = persister.getObject();
-		((JPAProcessInstanceManager) ((InternalWorkingMemory) session).getProcessInstanceManager())
-			.setEntityManager(((JPAPersister<StatefulSession>) persister).getEntityManager());
-		((JPAWorkItemManager) ((InternalWorkingMemory) session).getWorkItemManager())
-			.setEntityManager(((JPAPersister<StatefulSession>) persister).getEntityManager());
-		((JPASignalManager) ((InternalWorkingMemory) session).getSignalManager())
-			.setEntityManager(((JPAPersister<StatefulSession>) persister).getEntityManager());
-		((JPASignalManager) ((InternalWorkingMemory) session).getSignalManager())
-			.setPersister(persister);
-	}
-	
-	public StatefulSession getSession() {
-		return persister.getObject();
-	}
-	
-	public <T> T execute(Command<T> command) {
-		StatefulSession session = persister.getObject();
-		Transaction transaction = persister.getTransaction();
-		try {
-			transaction.start();
-			T result = command.execute(session);
-			transaction.commit();
-			if (pconfig.getSessionId() == null) {
-				pconfig.setSessionId(getSessionId());
-			}
-			return result;
-		} catch (Throwable t) {
-			t.printStackTrace();
-			try {
-				transaction.rollback();
-				throw new RuntimeException("Could not execute command", t);
-			} catch (XAException e) {
-				throw new RuntimeException("Could not rollback transaction", e);
-			}
-		}
-	}
-	
-	public void dispose() {
-		StatefulSession session = persister.getObject();
-		if (session != null) {
-			session.dispose();
-		}
-	}
-	
-	public String getSessionId() {
-		return persister.getUniqueId(); 
-	}
-	
-	public PersistenceConfig getPersistenceConfig() {
-		Environment environment = EnvironmentFactory.newEnvironment();
-		pconfig = (PersistenceConfig) environment.get(PersistenceConfig.class.getName());
-		if (pconfig == null) {
-			pconfig = new PersistenceConfig();
-			environment.set(PersistenceConfig.class.getName(), pconfig);
-		}
-		return pconfig;
-	}
+    private EntityManagerFactory       emf;
+    private EntityManager              em;
+    private SessionInfo                sessionInfo;
+    private JPASessionMashallingHelper marshallingHelper;
+    private StatefulSession            session;
+    private Environment                env;
+
+    public SingleSessionCommandService(KnowledgeBase kbase,
+                                       KnowledgeSessionConfiguration conf,
+                                       Environment environment) {
+        this( ((KnowledgeBaseImpl) kbase).getRuleBase(),
+              (SessionConfiguration) conf,
+              environment );
+    }
+
+    public SingleSessionCommandService(RuleBase ruleBase,
+                                       SessionConfiguration conf,
+                                       Environment env) {
+        if ( conf == null ) {
+            conf = new SessionConfiguration();
+        }
+        
+        this.env = env;
+
+        this.sessionInfo = new SessionInfo();
+
+        this.session = ((ReteooRuleBase) ruleBase).newStatefulSession( this.sessionInfo.getId(),
+                                                                       conf,
+                                                                       env );
+
+        MarshallingConfiguration marshallingConf = new MarshallingConfigurationImpl( (PlaceholderResolverStrategyFactory) env.get( EnvironmentName.PLACEHOLDER_RESOLVER_STRATEGY_FACTORY ),
+                                                                                     false,
+                                                                                     false,
+                                                                                     false );
+
+        this.marshallingHelper = new JPASessionMashallingHelper( this.session,
+                                                                 conf,
+                                                                 marshallingConf );
+        
+        this.sessionInfo.setJPASessionMashallingHelper( this.marshallingHelper );        
+
+        this.emf = (EntityManagerFactory) env.get( EnvironmentName.ENTITY_MANAGER_FACTORY );
+        this.em = emf.createEntityManager(); // how can I ensure this is an extended entity?
+        System.out.println( ((EntityManagerImpl) this.em).getFlushMode() );
+        UserTransaction ut = null;
+        try {
+            InitialContext ctx = new InitialContext();
+            ut = (UserTransaction) ctx.lookup( "java:comp/UserTransaction" );
+            ut.begin();
+            registerRollbackSync( );
+            this.em.joinTransaction();
+            
+            this.em.persist( this.sessionInfo );
+
+            System.out.println( "committing" );
+            ut.commit();
+            System.out.println( "commit complete" );
+        } catch ( Throwable t1 ) {
+            try {
+                if ( ut != null ) {
+                    ut.rollback();
+                }
+                throw new RuntimeException( "Could insert session data",
+                                            t1 );
+            } catch ( Throwable t2 ) {
+                throw new RuntimeException( "Could not rollback transaction",
+                                            t2 );
+            }
+        }
+        
+        EntityManager localEm = this.emf.createEntityManager();
+       // System.out.println( "1) version " + localEm.find( SessionInfo.class, sessionInfo.getId() ).getVersion() );
+        localEm.close();
+    }
+    
+    
+    public void init() {
+        
+    }
+
+    public StatefulSession getSession() {
+        return this.session;
+    }
+
+    public <T> T execute(Command<T> command) {
+        boolean localTransaction = false;
+        UserTransaction ut = null;
+        try {
+            ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
+
+            if ( ut.getStatus() == Status.STATUS_NO_TRANSACTION ) {
+                // If there is no transaction then start one, we will commit within the same Command
+                ut.begin();
+                localTransaction = true;
+                
+                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 );
+            } 
+
+            this.em.joinTransaction();
+            //System.out.println( "1) exec ver : " + this.sessionInfo.getVersion() );
+            this.sessionInfo.setDirty();
+            //System.out.println( "2) exec ver : " + this.sessionInfo.getVersion() );
+            
+            registerRollbackSync();
+
+            T result = command.execute( session );
+            //System.out.println( "3) exec ver : " + this.sessionInfo.getVersion() );
+
+            if ( localTransaction ) {
+                // it's a locally created transaction so commit
+                ut.commit();
+            }
+
+            EntityManager localEm = this.emf.createEntityManager();
+            //System.out.println( "2) version " + localEm.find( SessionInfo.class, sessionInfo.getId() ).getVersion() );
+            localEm.close();
+            
+            //System.out.println( "4) exec ver : " + this.sessionInfo.getVersion() );
+            //            System.out.println( "exec" + this.sessionInfo.getVersion() );
+
+            return result;
+
+        } catch ( Throwable t1 ) {
+            if ( localTransaction ) {
+                try {
+                    if ( ut != null ) {
+                        ut.rollback();
+                    }
+                    throw new RuntimeException( "Could not execute command",
+                                                t1 );
+                } catch ( Throwable t2 ) {
+                    throw new RuntimeException( "Could not rollback transaction",
+                                                t2 );
+                }
+            } else {
+                throw new RuntimeException( "Could not execute command",
+                                            t1 );
+            }
+        }
+    }
+
+    public void dispose() {
+        if ( session != null ) {
+            session.dispose();
+        }
+    }
+
+    public long getSessionId() {
+        return sessionInfo.getId();
+    }
+    
+    public void registerRollbackSync() throws IllegalStateException,
+                                                             RollbackException,
+                                                             SystemException {
+        TransactionManager txm = (TransactionManager) env.get( "drools.TransactionManager" );
+        if ( txm == null ) {
+            return;
+        }
+
+        Map map = (Map) env.get( "synchronizations" );
+        if ( map == null ) {
+            map = new IdentityMap();
+            env.set( "synchronizations",
+                     map );
+        }
+
+        if (  map.get( this ) == null ) {
+            txm.getTransaction().registerSynchronization( new SynchronizationImpl( env,
+                                                                                   this ) );
+            map.put( this,
+                     this );
+        }
+
+        //        // lazy registration that ensures we registration the rollback just once
+        //        if ( !rollbackRegistered.get() ) {
+        //            TransactionManagerServices.getTransactionManager().getTransaction().registerSynchronization( new SynchronizationImpl( rollbackRegistered,
+        //                                                                                                                                  ks ) );  
+        //            rollbackRegistered.set( true );
+        //            System.out.println( "registered rollback sychronisation" );
+        //        }
+    }
+
+    public static class SynchronizationImpl
+        implements
+        Synchronization {
+        private Environment env;
+        private SingleSessionCommandService cmdService;
+
+        public SynchronizationImpl(Environment env,
+                                   SingleSessionCommandService cmdService) {
+            this.env = env;
+            this.cmdService = cmdService;
+        }
+
+        public void afterCompletion(int status) {
+            if ( status != Status.STATUS_COMMITTED ) {
+                cmdService.rollback();
+                System.out.println( "after with local rollback: " + status );
+            }
+
+            // always cleanup thread local whatever the result
+            //rollbackRegistered.remove();
+            System.out.println( "cleanedup rollback sychronisation" );
+            Map map = (Map) env.get( "synchronizations" );
+            map.remove( cmdService );
+            
+            // cleanup local resource entity manager, normally an EntityManager should be closed with the transaction it was bound to,
+            // if it was created inside the scope of the transaction, but adding this anyway just in case.
+            EntityManager localEm = ( EntityManager ) this.env.get( EnvironmentName.ENTITY_MANAGER );
+            if ( localEm != null && localEm.isOpen() ) {
+                localEm.close();
+            }
+            
+        }
+
+        public void beforeCompletion() {
+
+        }
+
+    }
+
+    //    public static class SynchronizationImpl
+    //    implements
+    //    Synchronization {
+    //    KnowledgeStore       ks;
+    //    ThreadLocal<Boolean> rollbackRegistered;
+    //
+    //    SynchronizationImpl(ThreadLocal<Boolean> rollbackRegistered,
+    //                        KnowledgeStore ks) {
+    //        this.ks = ks;
+    //        this.rollbackRegistered = rollbackRegistered;
+    //    }
+    //
+    //    public void afterCompletion(int status) {
+    //        if ( status == Status.STATUS_COMMITTED) {
+    //            ks.commit();
+    //            System.out.println( "after with local commit: " + status );
+    //        } else {
+    //            ks.rollback();
+    //            System.out.println( "after with local rollacbk: " + status );
+    //        }
+    //        
+    //        // always cleanup thread local whatever the result
+    //        rollbackRegistered.remove();
+    //        System.out.println( "cleanedup rollback sychronisation" );
+    //    }
+    //
+    //    public void beforeCompletion() {
+    //        System.out.println( "before " );
+    //    }
+    //}     
+    
+    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.session );
+    }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/resources/META-INF/persistence.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/resources/META-INF/persistence.xml	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/resources/META-INF/persistence.xml	2009-02-14 04:52:53 UTC (rev 25261)
@@ -17,26 +17,17 @@
   </properties>
  </persistence-unit-->
 
-    <persistence-unit name="org.drools.persistence.jpa">
+    <persistence-unit name="org.drools.persistence.jpa" transaction-type="JTA">
         <provider>org.hibernate.ejb.HibernatePersistence</provider>
-        <class>org.drools.persistence.jpa.ByteArrayObject</class>
+        <jta-data-source>jdbc/testDS1</jta-data-source>        
+        <class>org.drools.persistence.session.SessionInfo</class>
 
 	    <properties>
-	        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
-	        <property name="hibernate.connection.driver_class" value="org.h2.Driver"/>	        
-	        <property name="hibernate.connection.url" value="jdbc:h2:mem:mydb" />
-	        <!--property name="hibernate.connection.url" value="jdbc:h2:file:/home/kverlaen/NotBackedUp/development/drools/drools-process/drools-process-enterprise/bin/mydb" /-->
-	        
-<!--			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>-->
-<!--	        <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>	  	        -->
-<!--	        <property name="hibernate.connection.url" value="jdbc:postgresql://localhost/postgres"/>-->
-	        
-	        <property name="hibernate.connection.username" value="sa"/>
-	        <property name="hibernate.connection.password" value="sasa"/>	
-	        <property name="hibernate.connection.autocommit" value="false" /> 	               
+	        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>	        
 	        <property name="hibernate.max_fetch_depth" value="3"/>
 		    <property name="hibernate.hbm2ddl.auto" value="update" />
-            <property name="hibernate.show_sql" value="false" />		    
+            <property name="hibernate.show_sql" value="true" />	
+            <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.BTMTransactionManagerLookup" />
 	    </properties>        
     </persistence-unit>
     

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/resources/jndi.properties
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/resources/jndi.properties	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/resources/jndi.properties	2009-02-14 04:52:53 UTC (rev 25261)
@@ -1,3 +1 @@
-java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
-java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
-java.naming.provider.url=localhost:1099
\ No newline at end of file
+java.naming.factory.initial=bitronix.tm.jndi.BitronixInitialContextFactory
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/jpa/JPAPersisterTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/jpa/JPAPersisterTest.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/jpa/JPAPersisterTest.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -9,7 +9,7 @@
 import org.drools.RuleBaseFactory;
 import org.drools.StatefulSession;
 import org.drools.WorkingMemory;
-import org.drools.persistence.session.StatefulSessionSnapshotter;
+import org.drools.persistence.session.JPASessionMashallingHelper;
 import org.drools.process.core.Work;
 import org.drools.process.core.impl.WorkImpl;
 import org.drools.rule.Package;
@@ -34,79 +34,85 @@
 	private EntityManagerFactory emf;
 	private WorkItem workItem;
 	
-	protected void setUp() {
-		emf = Persistence.createEntityManagerFactory("org.drools.persistence.jpa");
+//	protected void setUp() {
+//		emf = Persistence.createEntityManagerFactory("org.drools.persistence.jpa");
+//	}
+//	
+//	protected void tearDown() {
+//        emf.close();
+//    }
+	
+	public void testDummy() {
+	    
 	}
 	
-	protected void tearDown() {
-        emf.close();
-    }
-	
-	public void testPersistence() {
-        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-        Package pkg = new Package("org.drools.test");
-        pkg.addProcess(getProcess());
-        ruleBase.addPackage(pkg);
-
-        StatefulSession session = ruleBase.newStatefulSession();
-		JPAPersister<StatefulSession> persister = new JPAPersister<StatefulSession>(
-			emf, new StatefulSessionSnapshotter(session));
-		
-		session.getWorkItemManager().registerWorkItemHandler("MyWork", new WorkItemHandler() {
-			public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
-				JPAPersisterTest.this.workItem = workItem;
-			}
-			public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
-			}
-        });
-        ProcessInstance processInstance = session.startProcess("org.drools.test.TestProcess");
-        assertNotNull(workItem);
-        persister.save();
-        
-        persister.load();
-        processInstance = session.getProcessInstance(processInstance.getId());
-        assertNotNull(processInstance);
-        assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
-        
-        session.getWorkItemManager().completeWorkItem(workItem.getId(), null);
-        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
-    }
-
-    private RuleFlowProcess getProcess() {
-    	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.setMetaData("Action", new Action() {
-            public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ProcessContext context) throws Exception {
-            	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("WorkItem");
-    	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);
-    	EndNode end = new EndNode();
-    	end.setId(4);
-    	end.setName("End");
-    	process.addNode(end);
-    	new ConnectionImpl(workItemNode, Node.CONNECTION_DEFAULT_TYPE, end, Node.CONNECTION_DEFAULT_TYPE);
-        return process;
-    }
+//	public void testPersistence() {
+//        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+//        Package pkg = new Package("org.drools.test");
+//        pkg.addProcess(getProcess());
+//        ruleBase.addPackage(pkg);
+//
+//        StatefulSession session = ruleBase.newStatefulSession();
+//		JPAPersister<StatefulSession> persister = new JPAPersister<StatefulSession>(
+//			emf, new JPASessionMashallingHelper(session));
+//		
+//		session.getWorkItemManager().registerWorkItemHandler("MyWork", new WorkItemHandler() {
+//			public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
+//				JPAPersisterTest.this.workItem = workItem;
+//			}
+//			public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
+//			}
+//        });
+//		
+//		
+//        ProcessInstance processInstance = session.startProcess("org.drools.test.TestProcess");
+//        assertNotNull(workItem);
+//        persister.save();
+//        
+//        persister.load();
+//        processInstance = session.getProcessInstance(processInstance.getId());
+//        assertNotNull(processInstance);
+//        assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+//        
+//        session.getWorkItemManager().completeWorkItem(workItem.getId(), null);
+//        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+//    }
+//
+//    private RuleFlowProcess getProcess() {
+//    	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.setMetaData("Action", new Action() {
+//            public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ProcessContext context) throws Exception {
+//            	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("WorkItem");
+//    	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);
+//    	EndNode end = new EndNode();
+//    	end.setId(4);
+//    	end.setName("End");
+//    	process.addNode(end);
+//    	new ConnectionImpl(workItemNode, Node.CONNECTION_DEFAULT_TYPE, end, Node.CONNECTION_DEFAULT_TYPE);
+//        return process;
+//    }
     
 }

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-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/PersistentStatefulSessionTest.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -1,7 +1,16 @@
 package org.drools.persistence.session;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Properties;
 
+import javax.naming.InitialContext;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+import javax.transaction.SystemException;
+import javax.transaction.UserTransaction;
+
 import junit.framework.TestCase;
 
 import org.drools.KnowledgeBase;
@@ -10,128 +19,348 @@
 import org.drools.builder.KnowledgeBuilderFactory;
 import org.drools.builder.ResourceType;
 import org.drools.impl.EnvironmentFactory;
+import org.drools.impl.EnvironmentImpl;
+import org.drools.io.ResourceFactory;
 import org.drools.io.impl.ClassPathResource;
+import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
 import org.drools.runtime.KnowledgeSessionConfiguration;
 import org.drools.runtime.StatefulKnowledgeSession;
 import org.drools.runtime.process.ProcessInstance;
 import org.drools.runtime.process.WorkItem;
 
+import bitronix.tm.TransactionManagerServices;
+import bitronix.tm.resource.jdbc.PoolingDataSource;
+
 public class PersistentStatefulSessionTest extends TestCase {
-	
-	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);
+
+    PoolingDataSource ds1;
+
+    @Override
+    protected void setUp() throws Exception {
+        ds1 = new PoolingDataSource();
+        ds1.setUniqueName( "jdbc/testDS1" );
+        ds1.setClassName( "org.h2.jdbcx.JdbcDataSource" );
+        ds1.setMaxPoolSize( 3 );
+        ds1.setAllowLocalTransactions( true );
+        ds1.getDriverProperties().put( "user",
+                                       "sa" );
+        ds1.getDriverProperties().put( "password",
+                                       "sasa" );
+        ds1.getDriverProperties().put( "URL",
+                                       "jdbc:h2:mem:mydb" );
+        ds1.init();
+
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        ds1.close();
+    }
+
+    public void testLocalTransactionPerStatement() {
+
+        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";
+        str += "rule rule1\n";
+        str += "when\n";
+        str += "  Integer(intValue > 0)\n";
+        str += "then\n";
+        str += "  list.add( 1 );\n";
+        str += "end\n";
+        str += "\n";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
-        
-        StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession(config);
-        ProcessInstance processInstance = session.startProcess("org.drools.test.TestProcess");
-        session.insert("TestString");
-        System.out.println("Started process instance " + processInstance.getId());
-        
+
+        if ( kbuilder.hasErrors() ) {
+            fail( kbuilder.getErrors().toString() );
+        }
+
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+        Environment env = KnowledgeBaseFactory.newEnvironment();
+        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
+                 emf );
+
+        env.set( "drools.TransactionManager",
+                 TransactionManagerServices.getTransactionManager() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( config,
+                                                                               env );
+        List list = new ArrayList();
+
+        ksession.setGlobal( "list",
+                            list );
+
+        ksession.insert( 1 );
+        ksession.insert( 2 );
+        ksession.insert( 3 );
+
+        ksession.fireAllRules();
+
+        assertEquals( 3,
+                      list.size() );
+
+    }
+
+    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";
+        str += "rule rule1\n";
+        str += "when\n";
+        str += "  Integer(intValue > 0)\n";
+        str += "then\n";
+        str += "  list.add( 1 );\n";
+        str += "end\n";
+        str += "\n";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+
+        if ( kbuilder.hasErrors() ) {
+            fail( kbuilder.getErrors().toString() );
+        }
+
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+        Environment env = KnowledgeBaseFactory.newEnvironment();
+        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
+                 emf );
+        env.set( "drools.TransactionManager",
+                 TransactionManagerServices.getTransactionManager() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( config,
+                                                                               env );
+
+        //      EntityManager em = emf.createEntityManager();
+        //      SessionInfo sInfo = em.find( SessionInfo.class, 1 );
+        //      assertNotNull( sInfo );
+        //      //System.out.println( "session creation : " + sInfo.getVersion() );
+        //      em.close();
+
+        List list = new ArrayList();
+
+        // insert and commit
+        UserTransaction ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
+        ut.begin();
+        ksession.setGlobal( "list",
+                            list );
+        ksession.insert( 1 );
+        ksession.insert( 2 );
+        ut.commit();
+
+        // insert and rollback
+        ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
+        ut.begin();
+        ksession.insert( 3 );
+        ut.rollback();
+
+        // check we rolled back the state changes from the 3rd insert
+        ksession.fireAllRules();
+        assertEquals( 2,
+                      list.size() );
+
+        // insert and commit
+        ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
+        ut.begin();
+        ksession.insert( 3 );
+        ksession.insert( 4 );
+        ut.commit();
+
+        // rollback again, this is testing that we can do consequetive rollbacks and commits without issue
+        ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
+        ut.begin();
+        ksession.insert( 5 );
+        ksession.insert( 6 );
+        ut.rollback();
+
+        ksession.fireAllRules();
+
+        assertEquals( 4,
+                      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 );
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+        Environment env = KnowledgeBaseFactory.newEnvironment();
+        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
+                 emf );
+
+        StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession( config,
+                                                                              env );
+        ProcessInstance processInstance = session.startProcess( "org.drools.test.TestProcess" );
+        session.insert( "TestString" );
+        System.out.println( "Started process instance " + processInstance.getId() );
+
         TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
         WorkItem workItem = handler.getWorkItem();
-        assertNotNull(workItem);
-        
-        session = kbase.newStatefulKnowledgeSession(config);
-        processInstance = session.getProcessInstance(processInstance.getId());
-        assertNotNull(processInstance);
-        
-        session = kbase.newStatefulKnowledgeSession(config);
-        session.getWorkItemManager().completeWorkItem(workItem.getId(), null);
-        
+        assertNotNull( workItem );
+
+        session = kbase.newStatefulKnowledgeSession( config,
+                                                     null );
+        processInstance = session.getProcessInstance( processInstance.getId() );
+        assertNotNull( processInstance );
+
+        session = kbase.newStatefulKnowledgeSession( config,
+                                                     null );
+        session.getWorkItemManager().completeWorkItem( workItem.getId(),
+                                                       null );
+
         workItem = handler.getWorkItem();
-        assertNotNull(workItem);
-        
-        session = kbase.newStatefulKnowledgeSession(config);
-        processInstance = session.getProcessInstance(processInstance.getId());
-        assertNotNull(processInstance);
-        
-        session = kbase.newStatefulKnowledgeSession(config);
-        session.getWorkItemManager().completeWorkItem(workItem.getId(), null);
-        
+        assertNotNull( workItem );
+
+        session = kbase.newStatefulKnowledgeSession( config,
+                                                     null );
+        processInstance = session.getProcessInstance( processInstance.getId() );
+        assertNotNull( processInstance );
+
+        session = kbase.newStatefulKnowledgeSession( config,
+                                                     null );
+        session.getWorkItemManager().completeWorkItem( workItem.getId(),
+                                                       null );
+
         workItem = handler.getWorkItem();
-        assertNotNull(workItem);
-        
-        session = kbase.newStatefulKnowledgeSession(config);
-        processInstance = session.getProcessInstance(processInstance.getId());
-        assertNotNull(processInstance);
-        
-        session = kbase.newStatefulKnowledgeSession(config);
-        session.getWorkItemManager().completeWorkItem(workItem.getId(), null);
-        
+        assertNotNull( workItem );
+
+        session = kbase.newStatefulKnowledgeSession( config,
+                                                     null );
+        processInstance = session.getProcessInstance( processInstance.getId() );
+        assertNotNull( processInstance );
+
+        session = kbase.newStatefulKnowledgeSession( config,
+                                                     null );
+        session.getWorkItemManager().completeWorkItem( workItem.getId(),
+                                                       null );
+
         workItem = handler.getWorkItem();
-        assertNull(workItem);
-        
-        session = kbase.newStatefulKnowledgeSession(config);
-        processInstance = session.getProcessInstance(processInstance.getId());
-        assertEquals(1, session.getObjects().size());
-        for (Object o: session.getObjects()) {
-        	System.out.println(o);
+        assertNull( workItem );
+
+        session = kbase.newStatefulKnowledgeSession( config,
+                                                     null );
+        processInstance = session.getProcessInstance( processInstance.getId() );
+        assertEquals( 1,
+                      session.getObjects().size() );
+        for ( Object o : session.getObjects() ) {
+            System.out.println( o );
         }
-        assertNull(processInstance);
-        
-        PersistenceConfig pconfig = (PersistenceConfig)
-        	EnvironmentFactory.newEnvironment().get(PersistenceConfig.class.getName());
-        pconfig.setSessionId(null);
-	}
-    
-	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);
-        kbuilder.add(new ClassPathResource("SubProcess.rf"), ResourceType.DRF);
+        assertNull( processInstance );
+
+    }
+
+    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 );
+        kbuilder.add( new ClassPathResource( "SubProcess.rf" ),
+                      ResourceType.DRF );
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
-        
-        StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession(config);
-        ProcessInstance processInstance = session.startProcess("com.sample.SuperProcess");
-        System.out.println("Started process instance " + processInstance.getId());
-        
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+        Environment env = KnowledgeBaseFactory.newEnvironment();
+        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
+                 emf );
+
+        StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession( config,
+                                                                              env );
+        ProcessInstance processInstance = session.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);
-        processInstance = session.getProcessInstance(processInstance.getId());
-        assertNotNull(processInstance);
-        
-        session = kbase.newStatefulKnowledgeSession(config);
-        session.getWorkItemManager().completeWorkItem(workItem.getId(), null);
-        
+        assertNotNull( workItem );
+
+        session = kbase.newStatefulKnowledgeSession( config,
+                                                     null );
+        processInstance = session.getProcessInstance( processInstance.getId() );
+        assertNotNull( processInstance );
+
+        session = kbase.newStatefulKnowledgeSession( config,
+                                                     null );
+        session.getWorkItemManager().completeWorkItem( workItem.getId(),
+                                                       null );
+
         workItem = handler.getWorkItem();
-        assertNotNull(workItem);
-        
-        session = kbase.newStatefulKnowledgeSession(config);
-        processInstance = session.getProcessInstance(processInstance.getId());
-        assertNotNull(processInstance);
-        
-        session = kbase.newStatefulKnowledgeSession(config);
-        session.getWorkItemManager().completeWorkItem(workItem.getId(), null);
-        
+        assertNotNull( workItem );
+
+        session = kbase.newStatefulKnowledgeSession( config,
+                                                     null );
+        processInstance = session.getProcessInstance( processInstance.getId() );
+        assertNotNull( processInstance );
+
+        session = kbase.newStatefulKnowledgeSession( config,
+                                                     null );
+        session.getWorkItemManager().completeWorkItem( workItem.getId(),
+                                                       null );
+
         workItem = handler.getWorkItem();
-        assertNull(workItem);
-        
-        session = kbase.newStatefulKnowledgeSession(config);
-        processInstance = session.getProcessInstance(processInstance.getId());
-        assertNull(processInstance);
-        
-        PersistenceConfig pconfig = (PersistenceConfig)
-        	EnvironmentFactory.newEnvironment().get(PersistenceConfig.class.getName());
-        pconfig.setSessionId(null);
-	}
-    
+        assertNull( workItem );
+
+        session = kbase.newStatefulKnowledgeSession( config,
+                                                     null );
+        processInstance = session.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-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -24,6 +24,8 @@
 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.KnowledgeSessionConfiguration;
 import org.drools.runtime.process.NodeInstance;
 import org.drools.runtime.process.ProcessInstance;
@@ -39,19 +41,44 @@
 import org.drools.workflow.core.node.WorkItemNode;
 import org.drools.workflow.instance.node.SubProcessNodeInstance;
 
+import bitronix.tm.TransactionManagerServices;
+import bitronix.tm.resource.jdbc.PoolingDataSource;
+
 public class SingleSessionCommandServiceTest extends TestCase {
 	
+    PoolingDataSource ds1;
 	private EntityManagerFactory emf;
 	
-	protected void setUp() {
-		emf = Persistence.createEntityManagerFactory("org.drools.persistence.jpa");
+	protected void setUp() {		
+        ds1 = new PoolingDataSource();
+        ds1.setUniqueName( "jdbc/testDS1" );
+        ds1.setClassName( "org.h2.jdbcx.JdbcDataSource" );
+        ds1.setMaxPoolSize( 3 );
+        ds1.setAllowLocalTransactions( true );
+        ds1.getDriverProperties().put( "user",
+                                       "sa" );
+        ds1.getDriverProperties().put( "password",
+                                       "sasa" );
+        ds1.getDriverProperties().put( "URL",
+                                       "jdbc:h2:mem:mydb" );
+        ds1.init();		
+        
+        emf = Persistence.createEntityManagerFactory("org.drools.persistence.jpa");
 	}
 	
 	protected void tearDown() {
         emf.close();
+        ds1.close();
+        
     }
 	
 	public void testPersistenceWorkItems() {
+        Environment env = KnowledgeBaseFactory.newEnvironment();
+        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
+                 emf );
+        env.set( "drools.TransactionManager",
+                 TransactionManagerServices.getTransactionManager() );
+        
         RuleBase ruleBase = RuleBaseFactory.newRuleBase();
         Package pkg = getProcessWorkItems();
         ruleBase.addPackage(pkg);
@@ -63,7 +90,7 @@
 		properties.setProperty("drools.processSignalManagerFactory", "org.drools.persistence.processinstance.JPASignalManagerFactory");
 		SessionConfiguration config = new SessionConfiguration(properties);
 
-		SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config);
+		SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config, env);
         StartProcessCommand startProcessCommand = new StartProcessCommand();
         startProcessCommand.setProcessId("org.drools.test.TestProcess");
         ProcessInstance processInstance = (ProcessInstance) service.execute(startProcessCommand);
@@ -73,13 +100,13 @@
         WorkItem workItem = handler.getWorkItem();
         assertNotNull(workItem);
         
-        service = new SingleSessionCommandService(ruleBase, config);
+        service = new SingleSessionCommandService(ruleBase, config, env);
         GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
         processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
         assertNotNull(processInstance);
         
-        service = new SingleSessionCommandService(ruleBase, config);
+        service = new SingleSessionCommandService(ruleBase, config, env);
         CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
         completeWorkItemCommand.setWorkItemId(workItem.getId());
         service.execute(completeWorkItemCommand);
@@ -87,13 +114,13 @@
         workItem = handler.getWorkItem();
         assertNotNull(workItem);
         
-        service = new SingleSessionCommandService(ruleBase, config);
+        service = new SingleSessionCommandService(ruleBase, config, env);
         getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
         processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
         assertNotNull(processInstance);
         
-        service = new SingleSessionCommandService(ruleBase, config);
+        service = new SingleSessionCommandService(ruleBase, config, env);
         completeWorkItemCommand = new CompleteWorkItemCommand();
         completeWorkItemCommand.setWorkItemId(workItem.getId());
         service.execute(completeWorkItemCommand);
@@ -101,13 +128,13 @@
         workItem = handler.getWorkItem();
         assertNotNull(workItem);
         
-        service = new SingleSessionCommandService(ruleBase, config);
+        service = new SingleSessionCommandService(ruleBase, config, env);
         getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
         processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
         assertNotNull(processInstance);
         
-        service = new SingleSessionCommandService(ruleBase, config);
+        service = new SingleSessionCommandService(ruleBase, config, env);
         completeWorkItemCommand = new CompleteWorkItemCommand();
         completeWorkItemCommand.setWorkItemId(workItem.getId());
         service.execute(completeWorkItemCommand);
@@ -115,7 +142,7 @@
         workItem = handler.getWorkItem();
         assertNull(workItem);
         
-        service = new SingleSessionCommandService(ruleBase, config);
+        service = new SingleSessionCommandService(ruleBase, config, env);
         getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
         processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
@@ -177,6 +204,12 @@
     }
     
 	public void testPersistenceSubProcess() {
+        Environment env = KnowledgeBaseFactory.newEnvironment();
+        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
+                 emf );
+        env.set( "drools.TransactionManager",
+                 TransactionManagerServices.getTransactionManager() );
+        
 		Properties properties = new Properties();
 		properties.setProperty("drools.commandService", "org.drools.persistence.session.SingleSessionCommandService");
 		properties.setProperty("drools.processInstanceManagerFactory", "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory");
@@ -188,7 +221,7 @@
         Package pkg = getProcessSubProcess();
         ruleBase.addPackage(pkg);
 
-        SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config);
+        SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config, env);
         StartProcessCommand startProcessCommand = new StartProcessCommand();
         startProcessCommand.setProcessId("org.drools.test.TestProcess");
         RuleFlowProcessInstance processInstance = (RuleFlowProcessInstance) service.execute(startProcessCommand);
@@ -199,7 +232,7 @@
         WorkItem workItem = handler.getWorkItem();
         assertNotNull(workItem);
         
-        service = new SingleSessionCommandService(ruleBase, config);
+        service = new SingleSessionCommandService(ruleBase, config, env);
         GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(processInstanceId);
         processInstance = (RuleFlowProcessInstance) service.execute(getProcessInstanceCommand);
@@ -214,12 +247,12 @@
         RuleFlowProcessInstance subProcessInstance = (RuleFlowProcessInstance) service.execute(getProcessInstanceCommand);
         assertNotNull(subProcessInstance);
 
-        service = new SingleSessionCommandService(ruleBase, config);
+        service = new SingleSessionCommandService(ruleBase, config, env);
         CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
         completeWorkItemCommand.setWorkItemId(workItem.getId());
         service.execute(completeWorkItemCommand);
 
-        service = new SingleSessionCommandService(ruleBase, config);
+        service = new SingleSessionCommandService(ruleBase, config, env);
         getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(subProcessInstanceId);
         subProcessInstance = (RuleFlowProcessInstance) service.execute(getProcessInstanceCommand);
@@ -301,6 +334,12 @@
     }
     
 	public void FIXMEtestPersistenceTimer() throws Exception {
+        Environment env = KnowledgeBaseFactory.newEnvironment();
+        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
+                 emf );
+        env.set( "drools.TransactionManager",
+                 TransactionManagerServices.getTransactionManager() );
+        
 		Properties properties = new Properties();
 		properties.setProperty("drools.commandService", "org.drools.persistence.session.SingleSessionCommandService");
 		properties.setProperty("drools.processInstanceManagerFactory", "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory");
@@ -312,19 +351,19 @@
         Package pkg = getProcessTimer();
         ruleBase.addPackage(pkg);
 
-        SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config);
+        SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config, env);
         StartProcessCommand startProcessCommand = new StartProcessCommand();
         startProcessCommand.setProcessId("org.drools.test.TestProcess");
         ProcessInstance processInstance = (ProcessInstance) service.execute(startProcessCommand);
         System.out.println("Started process instance " + processInstance.getId());
         
-        service = new SingleSessionCommandService(ruleBase, config);
+        service = new SingleSessionCommandService(ruleBase, config, env);
         GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
         processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
         assertNotNull(processInstance);
 
-        service = new SingleSessionCommandService(ruleBase, config);
+        service = new SingleSessionCommandService(ruleBase, config, env);
         Thread.sleep(2000);
         getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
@@ -372,6 +411,12 @@
     
     // @FIXME krisv this fails due to nested transactions
 	public void FIXMEtestPersistenceTimer2() throws Exception {
+        Environment env = KnowledgeBaseFactory.newEnvironment();
+        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
+                 emf );
+        env.set( "drools.TransactionManager",
+                 TransactionManagerServices.getTransactionManager() );
+        
 		Properties properties = new Properties();
 		properties.setProperty("drools.commandService", "org.drools.persistence.session.SingleSessionCommandService");
 		properties.setProperty("drools.processInstanceManagerFactory", "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory");
@@ -383,19 +428,19 @@
         Package pkg = getProcessTimer2();
         ruleBase.addPackage(pkg);
 
-        SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config);
+        SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config, env);
         StartProcessCommand startProcessCommand = new StartProcessCommand();
         startProcessCommand.setProcessId("org.drools.test.TestProcess");
         ProcessInstance processInstance = (ProcessInstance) service.execute(startProcessCommand);
         System.out.println("Started process instance " + processInstance.getId());
         
-        service = new SingleSessionCommandService(ruleBase, config);
+        service = new SingleSessionCommandService(ruleBase, config, env);
         GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
         processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
         assertNotNull(processInstance);
 
-        service = new SingleSessionCommandService(ruleBase, config);
+        service = new SingleSessionCommandService(ruleBase, config, env);
         Thread.sleep(2000);
         getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());

Modified: labs/jbossrules/trunk/drools-templates/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-templates/.classpath	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-templates/.classpath	2009-02-14 04:52:53 UTC (rev 25261)
@@ -18,6 +18,6 @@
   <classpathentry kind="var" path="M2_REPO/org/jmock/jmock-legacy/2.5.1/jmock-legacy-2.5.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/joda-time/joda-time/1.5.2/joda-time-1.5.2.jar"/>
   <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.6/mvel2-2.0.6.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.7-SNAPSHOT/mvel2-2.0.7-SNAPSHOT.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0.jar"/>
 </classpath>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-templates/src/test/java/org/drools/template/parser/ExternalSheetListenerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-templates/src/test/java/org/drools/template/parser/ExternalSheetListenerTest.java	2009-02-13 21:18:58 UTC (rev 25260)
+++ labs/jbossrules/trunk/drools-templates/src/test/java/org/drools/template/parser/ExternalSheetListenerTest.java	2009-02-14 04:52:53 UTC (rev 25261)
@@ -25,6 +25,7 @@
 import org.drools.process.instance.WorkItemManager;
 import org.drools.process.instance.event.SignalManager;
 import org.drools.process.instance.timer.TimerManager;
+import org.drools.runtime.Environment;
 import org.drools.runtime.ObjectFilter;
 import org.drools.spi.AgendaFilter;
 import org.drools.spi.AgendaGroup;
@@ -430,6 +431,11 @@
                     // TODO Auto-generated method stub
                     return null;
                 }
+
+                public Environment getEnvironment() {
+                    // TODO Auto-generated method stub
+                    return null;
+                }
 			};
 		}
 	}




More information about the jboss-svn-commits mailing list