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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Feb 18 21:05:40 EST 2009


Author: KrisVerlaenen
Date: 2009-02-18 21:05:36 -0500 (Wed, 18 Feb 2009)
New Revision: 25330

Added:
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPASessionMarshallingHelper.java
   labs/jbossrules/trunk/drools-process/drools-workitems/src/main/resources/icons/email.gif
Removed:
   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/process/
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/process/enterprise/
   labs/jbossrules/trunk/drools-process/drools-workitems/src/test/resources/icons/
Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessMarchallingTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessTimerTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/SerializationHelper.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultAgenda.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalAgenda.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/WorkingMemoryAction.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/Marshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallerReaderContext.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallerWriteContext.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfiguration.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfigurationImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterHelper.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/SignalEventCommand.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/StartProcessCommand.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/DefaultSignalManager.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/DefaultSignalManagerFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/SignalManager.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/TimerTest.java
   labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/.project
   labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/pom.xml
   labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/XStreamFactTest.java
   labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/XStreamGlobalTest.java
   labs/jbossrules/trunk/drools-process/drools-osworkflow/src/test/java/org/drools/osworkflow/test/persistence/ComplexProcessPersistenceTestCase.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/session/SessionInfo.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/jpa/JPAPersisterTest.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java
   labs/jbossrules/trunk/drools-process/drools-workitems/src/main/java/org/drools/process/workitem/email/EmailWorkItemHandler.java
Log:
JBRULES-1915: Improve process persistence usability
 - fixed persistence / transactions solution

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessMarchallingTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessMarchallingTest.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessMarchallingTest.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -15,8 +15,10 @@
 import org.drools.Person;
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
+import org.drools.SessionConfiguration;
 import org.drools.StatefulSession;
 import org.drools.compiler.PackageBuilder;
+import org.drools.impl.EnvironmentFactory;
 import org.drools.marshalling.DefaultMarshaller;
 import org.drools.marshalling.Marshaller;
 import org.drools.process.core.context.variable.VariableScope;
@@ -469,15 +471,32 @@
         final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
         ruleBase.addPackage(pkg);
 
-        StatefulSession session = ruleBase.newStatefulSession();
+        final StatefulSession session = ruleBase.newStatefulSession();
+
+        new Thread(new Runnable() {
+			public void run() {
+	        	session.fireUntilHalt();       	
+			}
+        }).start();
+		
         session.startProcess("com.sample.ruleflow", null);
 
         assertEquals(1, session.getProcessInstances().size());
+        session.halt();
         
-        session = getSerialisedStatefulSession( session );
+        final StatefulSession session2 = getSerialisedStatefulSession( session );
+        
+		new Thread(new Runnable() {
+			public void run() {
+	        	session2.fireUntilHalt();       	
+			}
+        }).start();
+		
         Thread.sleep(400);
 
-        assertEquals(0, session.getProcessInstances().size());
+        assertEquals(0, session2.getProcessInstances().size());
+        
+        session2.halt();
     }
     
     public void test6() throws Exception {
@@ -509,7 +528,14 @@
         final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
         ruleBase.addPackage(pkg);
 
-        StatefulSession session = ruleBase.newStatefulSession();
+        final StatefulSession session = ruleBase.newStatefulSession();
+        
+		new Thread(new Runnable() {
+			public void run() {
+	        	session.fireUntilHalt();       	
+			}
+        }).start();
+		
         session.startProcess("com.sample.ruleflow", null);
         assertEquals(1, session.getProcessInstances().size());
         
@@ -518,14 +544,23 @@
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         ruleBase.writeStatefulSession(session, baos, marshaller);
         byte[] b1 = baos.toByteArray();
+        session.halt();
         session.dispose();
         Thread.sleep(400);
         
         ByteArrayInputStream bais = new ByteArrayInputStream( b1 );
-        session = ruleBase.readStatefulSession(bais, true, marshaller);
+        final StatefulSession session2 = ruleBase.readStatefulSession(bais, true, marshaller, new SessionConfiguration(), EnvironmentFactory.newEnvironment());
+        
+		new Thread(new Runnable() {
+			public void run() {
+	        	session2.fireUntilHalt();       	
+			}
+        }).start();
+		
         Thread.sleep(100);
 
-        assertEquals(0, session.getProcessInstances().size());
+        assertEquals(0, session2.getProcessInstances().size());
+        session2.halt();
     }
     
     private static class TestWorkItemHandler implements WorkItemHandler {

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessTimerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessTimerTest.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessTimerTest.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -73,20 +73,33 @@
 		Package pkg = builder.getPackage();
 		RuleBase ruleBase = RuleBaseFactory.newRuleBase();
 		ruleBase.addPackage( pkg );
-		StatefulSession session = ruleBase.newStatefulSession();
+		final StatefulSession session = ruleBase.newStatefulSession();
 		List<Message> myList = new ArrayList<Message>();
 		session.setGlobal("myList", myList);
+		
+		new Thread(new Runnable() {
+			public void run() {
+	        	session.fireUntilHalt();       	
+			}
+        }).start();
+		
         ProcessInstance processInstance = ( ProcessInstance )
         	session.startProcess("org.drools.timer");
         assertEquals(0, myList.size());
         assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
         assertEquals(1, session.getTimerManager().getTimers().size());
+        session.halt();
         
-        session = getSerialisedStatefulSession( session );
-        myList = (List<Message>) session.getGlobal( "myList" );
-        processInstance = ( ProcessInstance ) session.getProcessInstance( processInstance.getId() );
+        final StatefulSession session2 = getSerialisedStatefulSession( session );
+        myList = (List<Message>) session2.getGlobal( "myList" );
+		new Thread(new Runnable() {
+			public void run() {
+	        	session2.fireUntilHalt();       	
+			}
+        }).start();
+        processInstance = ( ProcessInstance ) session2.getProcessInstance( processInstance.getId() );
         
-        assertEquals(1, session.getTimerManager().getTimers().size());
+        assertEquals(1, session2.getTimerManager().getTimers().size());
 
         // test that the delay works
         try {
@@ -102,9 +115,10 @@
         } catch (InterruptedException e) {
         	// do nothing
         }
-        session.fireAllRules();
         assertEquals(5, myList.size());
         assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+        
+        session2.halt();
 	}
 
 	@SuppressWarnings("unchecked")
@@ -147,20 +161,36 @@
 		Package pkg = builder.getPackage();
 		RuleBase ruleBase = RuleBaseFactory.newRuleBase();
 		ruleBase.addPackage( pkg );
-		StatefulSession session = ruleBase.newStatefulSession();
+		final StatefulSession session = ruleBase.newStatefulSession();
 		List<String> myList = new ArrayList<String>();
 		session.setGlobal("myList", myList);
+		
+		new Thread(new Runnable() {
+			public void run() {
+	        	session.fireUntilHalt();       	
+			}
+        }).start();
+		
         ProcessInstance processInstance = ( ProcessInstance )
         	session.startProcess("org.drools.timer");
         assertEquals(0, myList.size());
         assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
         assertEquals(1, session.getTimerManager().getTimers().size());
         
-        session = getSerialisedStatefulSession( session );
-        myList = (List<String>) session.getGlobal( "myList" );
-        processInstance = ( ProcessInstance ) session.getProcessInstance( processInstance.getId() );
+        session.halt();
         
-        assertEquals(1, session.getTimerManager().getTimers().size());
+        final StatefulSession session2 = getSerialisedStatefulSession( session );
+        myList = (List<String>) session2.getGlobal( "myList" );
+        
+		new Thread(new Runnable() {
+			public void run() {
+	        	session2.fireUntilHalt();       	
+			}
+        }).start();
+		
+        processInstance = ( ProcessInstance ) session2.getProcessInstance( processInstance.getId() );
+        
+        assertEquals(1, session2.getTimerManager().getTimers().size());
 
         try {
             Thread.sleep(400);
@@ -168,6 +198,8 @@
             // do nothing
         }
         assertEquals(1, myList.size());
+        
+        session2.halt();
 	}
 
 	@SuppressWarnings("unchecked")
@@ -210,27 +242,44 @@
 		Package pkg = builder.getPackage();
 		RuleBase ruleBase = RuleBaseFactory.newRuleBase();
 		ruleBase.addPackage( pkg );
-		StatefulSession session = ruleBase.newStatefulSession();
+		final StatefulSession session = ruleBase.newStatefulSession();
 		List<String> myList = new ArrayList<String>();
 		session.setGlobal("myList", myList);
+		
+		new Thread(new Runnable() {
+			public void run() {
+	        	session.fireUntilHalt();       	
+			}
+        }).start();
+
         ProcessInstance processInstance = ( ProcessInstance )
         	session.startProcess("org.drools.timer");
         assertEquals(0, myList.size());
         assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
         assertEquals(1, session.getTimerManager().getTimers().size());
+        session.halt();
         
-        session = getSerialisedStatefulSession( session );
-        myList = (List<String>) session.getGlobal( "myList" );
-        processInstance = ( ProcessInstance ) session.getProcessInstance( processInstance.getId() );
+        final StatefulSession session2 = getSerialisedStatefulSession( session );
+        myList = (List<String>) session2.getGlobal( "myList" );
         
-        assertEquals(1, session.getTimerManager().getTimers().size());
+		new Thread(new Runnable() {
+			public void run() {
+	        	session2.fireUntilHalt();       	
+			}
+        }).start();
 
+        processInstance = ( ProcessInstance ) session2.getProcessInstance( processInstance.getId() );
+        
+        assertEquals(1, session2.getTimerManager().getTimers().size());
+
         try {
             Thread.sleep(600);
         } catch (InterruptedException e) {
             // do nothing
         }
         assertEquals(2, myList.size());
+        
+        session2.halt();
 	}
 	
 	@SuppressWarnings("unchecked")
@@ -276,18 +325,32 @@
 		Package pkg = builder.getPackage();
 		RuleBase ruleBase = RuleBaseFactory.newRuleBase();
 		ruleBase.addPackage( pkg );
-		StatefulSession session = ruleBase.newStatefulSession();
+		final StatefulSession session = ruleBase.newStatefulSession();
 		List<String> myList = new ArrayList<String>();
 		session.setGlobal("myList", myList);
+		
+		new Thread(new Runnable() {
+			public void run() {
+	        	session.fireUntilHalt();       	
+			}
+        }).start();
+
         ProcessInstance processInstance = ( ProcessInstance )
         	session.startProcess("org.drools.timer");
         assertEquals(0, myList.size());
         assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
         assertEquals(2, session.getTimerManager().getTimers().size());
         
-        session = getSerialisedStatefulSession( session );
-        myList = (List<String>) session.getGlobal( "myList" );
-        assertEquals(2, session.getTimerManager().getTimers().size());
+        final StatefulSession session2 = getSerialisedStatefulSession( session );
+        myList = (List<String>) session2.getGlobal( "myList" );
+        
+		new Thread(new Runnable() {
+			public void run() {
+	        	session2.fireUntilHalt();       	
+			}
+        }).start();
+		
+        assertEquals(2, session2.getTimerManager().getTimers().size());
 
         try {
             Thread.sleep(300);
@@ -296,16 +359,25 @@
         }
         assertEquals(1, myList.size());
         assertEquals("Executing timer2", myList.get(0));
+        session2.halt();
         
-        session = getSerialisedStatefulSession( session );
+        final StatefulSession session3 = getSerialisedStatefulSession( session2 );
         myList = (List<String>) session.getGlobal( "myList" );
         
+		new Thread(new Runnable() {
+			public void run() {
+	        	session3.fireUntilHalt();       	
+			}
+        }).start();
+		
         try {
             Thread.sleep(400);
         } catch (InterruptedException e) {
             // do nothing
         }
         assertEquals(2, myList.size());
+        
+        session3.halt();
 	}
 	
 	@SuppressWarnings("unchecked")
@@ -348,20 +420,37 @@
 		Package pkg = builder.getPackage();
 		RuleBase ruleBase = RuleBaseFactory.newRuleBase();
 		ruleBase.addPackage( pkg );
-		StatefulSession session = ruleBase.newStatefulSession();
+		final StatefulSession session = ruleBase.newStatefulSession();
 		List<String> myList = new ArrayList<String>();
 		session.setGlobal("myList", myList);
+		
+		new Thread(new Runnable() {
+			public void run() {
+	        	session.fireUntilHalt();       	
+			}
+        }).start();
+		
         ProcessInstance processInstance = ( ProcessInstance )
         	session.startProcess("org.drools.timer");
         assertEquals(0, myList.size());
         assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
         assertEquals(1, session.getTimerManager().getTimers().size());
+        session.halt();
         
-        session = getSerialisedStatefulSession( session );
-        myList = (List<String>) session.getGlobal( "myList" );
-        session.insert(new Message());
+        final StatefulSession session2 = getSerialisedStatefulSession( session );
+        myList = (List<String>) session2.getGlobal( "myList" );
+        
+		new Thread(new Runnable() {
+			public void run() {
+	        	session2.fireUntilHalt();       	
+			}
+        }).start();
+		
+        session2.insert(new Message());
         assertEquals(0, myList.size());
-        assertEquals(0, session.getTimerManager().getTimers().size());
+        assertEquals(0, session2.getTimerManager().getTimers().size());
+        
+        session2.halt();
 	}
 	
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/SerializationHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/SerializationHelper.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/SerializationHelper.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -6,6 +6,7 @@
 
 import org.drools.RuleBase;
 import org.drools.StatefulSession;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.marshalling.DefaultMarshaller;
 import org.drools.marshalling.Marshaller;
 import org.drools.util.DroolsStreamUtils;
@@ -60,7 +61,9 @@
         ByteArrayInputStream bais = new ByteArrayInputStream( b1 );
         StatefulSession session2 = ruleBase.readStatefulSession( bais,
                                                                 true,
-                                                                marshaller );
+                                                                marshaller,
+                                                                ((InternalWorkingMemory) session).getSessionConfiguration(),
+                                                                session.getEnvironment());
 
         // write methods allways needs a new marshaller for Identity strategies
         marshaller = new DefaultMarshaller();        

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -144,7 +144,9 @@
 
     public StatefulSession readStatefulSession(InputStream stream,
                                                boolean keepReference,
-                                               Marshaller marshaller) throws IOException,
+                                               Marshaller marshaller,
+                                               SessionConfiguration config,
+                                               Environment environment) throws IOException,
                                                                      ClassNotFoundException {
         // TODO Auto-generated method stub
         return null;

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-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -16,6 +16,7 @@
 import org.drools.FactHandle;
 import org.drools.QueryResults;
 import org.drools.RuleBase;
+import org.drools.SessionConfiguration;
 import org.drools.WorkingMemoryEntryPoint;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalRuleBase;
@@ -513,5 +514,10 @@
         // TODO Auto-generated method stub
         return null;
     }
+    
+    public SessionConfiguration getSessionConfiguration() {
+        // TODO Auto-generated method stub
+    	return null;
+    }
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBase.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBase.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -104,7 +104,9 @@
      */
     StatefulSession readStatefulSession(InputStream stream,
                                         boolean keepReference,
-                                        Marshaller marshaller) throws IOException,
+                                        Marshaller marshaller,
+                                        SessionConfiguration sessionConfig,
+                                        Environment environment) throws IOException,
                                                               ClassNotFoundException;
 
     public void writeStatefulSession(StatefulSession session,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -349,7 +349,9 @@
                                                                      ClassNotFoundException {
         return readStatefulSession( stream,
                                     true,
-                                    marshaller );
+                                    marshaller,
+                                    new SessionConfiguration(),
+                                    EnvironmentFactory.newEnvironment() );
     }
 
     /**

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-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -381,6 +381,10 @@
         this.entryPointNode = this.ruleBase.getRete().getEntryPointNode( this.entryPoint );
         this.typeConfReg = new ObjectTypeConfigurationRegistry( this.ruleBase );
     }
+    
+    public SessionConfiguration getSessionConfiguration() {
+    	return this.config;
+    }
 
     public void reset(int handleId,
                       long handleCounter,
@@ -1421,6 +1425,7 @@
     public void queueWorkingMemoryAction(final WorkingMemoryAction action) {
         synchronized ( this.actionQueue ) {
             this.actionQueue.add( action );
+            this.agenda.notifyHalt();
         }
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultAgenda.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultAgenda.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultAgenda.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -1050,7 +1050,8 @@
     public void fireUntilHalt(final AgendaFilter agendaFilter) {
         this.halt.set( false );
         while ( continueFiring( -1 ) ) {
-            boolean fired = fireNextItem( agendaFilter );
+        	boolean fired = fireNextItem( agendaFilter );
+        	this.workingMemory.executeQueuedActions();
             if ( !fired ) {
                 try {
                     synchronized ( this.halt ) {
@@ -1088,14 +1089,18 @@
     private final int updateFireLimit(final int fireLimit) {
         return fireLimit > 0 ? fireLimit - 1 : fireLimit;
     }
-
-    public void halt() {
-        this.halt.set( true );
+    
+    public void notifyHalt() {
         synchronized ( this.halt ) {
             this.halt.notifyAll();
         }
     }
 
+    public void halt() {
+        this.halt.set( true );
+        notifyHalt();
+    }
+
     public ConsequenceExceptionHandler getConsequenceExceptionHandler() {
         return this.legacyConsequenceExceptionHandler;
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalAgenda.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalAgenda.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalAgenda.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -100,6 +100,8 @@
      * execution though.
      */
     public void halt();
+    
+    public void notifyHalt();
 
     /**
      * Keeps firing activations until a halt is called. If in a given moment, there is 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -5,6 +5,7 @@
 
 import org.drools.FactException;
 import org.drools.FactHandle;
+import org.drools.SessionConfiguration;
 import org.drools.WorkingMemory;
 import org.drools.concurrent.ExecutorService;
 import org.drools.event.AgendaEventSupport;
@@ -123,4 +124,6 @@
     public KnowledgeRuntime getKnowledgeRuntime();
     
     public Map<String, ExitPoint> getExitPoints();
+    
+    public SessionConfiguration getSessionConfiguration();
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/WorkingMemoryAction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/WorkingMemoryAction.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/WorkingMemoryAction.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -14,6 +14,7 @@
     public static final int PropagateAction = 3;
     public static final int LogicalRetractCallback = 4;
     public static final int WorkingMemoryReteExpireAction = 5;
+    public static final int SignalProcessInstanceAction = 6;
     
     
     public void execute(InternalWorkingMemory workingMemory);

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-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/DefaultMarshaller.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -5,11 +5,13 @@
 import java.io.OutputStream;
 
 import org.drools.RuleBaseConfiguration;
+import org.drools.SessionConfiguration;
 import org.drools.StatefulSession;
 import org.drools.common.InternalRuleBase;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.concurrent.ExecutorService;
 import org.drools.reteoo.ReteooStatefulSession;
+import org.drools.runtime.Environment;
 import org.drools.spi.GlobalResolver;
 
 public class DefaultMarshaller
@@ -51,19 +53,22 @@
     public ReteooStatefulSession read(final InputStream stream,
                                       final InternalRuleBase ruleBase,
                                       final int id,
-                                      final ExecutorService executor) throws IOException,
+                                      final ExecutorService executor,
+                                      final SessionConfiguration config,
+                                      final Environment environment) throws IOException,
                                                                      ClassNotFoundException {
         MarshallerReaderContext context = new MarshallerReaderContext( stream,
                                                                        ruleBase,
                                                                        RuleBaseNodes.getNodeMap( ruleBase ),
                                                                        factory,
                                                                        marshallingConfig.isMarshallProcessInstances(),
-                                                                       marshallingConfig.isMarshallWorkItems(),
-                                                                       marshallingConfig.isMarshallTimers() );
+                                                                       marshallingConfig.isMarshallWorkItems() );
 
         ReteooStatefulSession session = InputMarshaller.readSession( context,
                                                                      id,
-                                                                     executor );
+                                                                     executor,
+                                                                     environment,
+                                                                     config );
         context.close();
         return session;
 
@@ -78,8 +83,7 @@
                                                                        RuleBaseNodes.getNodeMap( ruleBase ),
                                                                        factory,
                                                                        marshallingConfig.isMarshallProcessInstances(),
-                                                                       marshallingConfig.isMarshallWorkItems(),
-                                                                       marshallingConfig.isMarshallTimers());
+                                                                       marshallingConfig.isMarshallWorkItems());
 
         session = InputMarshaller.readSession( (ReteooStatefulSession) session,
                                                context );
@@ -100,8 +104,7 @@
                                                                      RuleBaseNodes.getNodeMap( ruleBase ),
                                                                      this.factory,
                                                                      marshallingConfig.isMarshallProcessInstances(),
-                                                                     marshallingConfig.isMarshallWorkItems(),
-                                                                     marshallingConfig.isMarshallTimers() );
+                                                                     marshallingConfig.isMarshallWorkItems() );
         OutputMarshaller.writeSession( context );
         context.close();
     }

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-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -138,9 +138,7 @@
             readWorkItems( context );
         }
 
-        if ( context.marshalTimers ) {
-            readTimers( context );
-        }
+        readTimers( context );
         
         if( multithread ) {
             session.startPartitionManagers();
@@ -162,13 +160,14 @@
                                                     int id,
                                                     ExecutorService executor) throws IOException,
                                                                              ClassNotFoundException {
-        return readSession( context, id, executor, EnvironmentFactory.newEnvironment() );
+        return readSession( context, id, executor, EnvironmentFactory.newEnvironment(), new SessionConfiguration() );
     }
     
     public static ReteooStatefulSession readSession(MarshallerReaderContext context,
                                                     int id,
                                                     ExecutorService executor,
-                                                    Environment environment) throws IOException,
+                                                    Environment environment,
+                                                    SessionConfiguration config) throws IOException,
                                                                              ClassNotFoundException {
 
         boolean multithread = context.readBoolean();
@@ -194,7 +193,7 @@
                                                                    handleFactory,
                                                                    initialFactHandle,
                                                                    propagationCounter,
-                                                                   new SessionConfiguration(), // FIXME: must deserialize configuration  
+                                                                   config,  
                                                                    agenda,
                                                                    environment );
 
@@ -220,9 +219,7 @@
             readWorkItems( context );
         }
 
-        if ( context.marshalTimers ) {
-            readTimers( context );
-        }
+        readTimers( context );
 
         if( multithread ) {
             session.startPartitionManagers();
@@ -260,7 +257,7 @@
 
     }
 
-    public static void readActionQueue(MarshallerReaderContext context) throws IOException {
+    public static void readActionQueue(MarshallerReaderContext context) throws IOException, ClassNotFoundException {
         ReteooWorkingMemory wm = (ReteooWorkingMemory) context.wm;
         Queue actionQueue = wm.getActionQueue();
         while ( context.readShort() == PersisterEnums.WORKING_MEMORY_ACTION ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/Marshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/Marshaller.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/Marshaller.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -4,16 +4,20 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 
+import org.drools.SessionConfiguration;
 import org.drools.StatefulSession;
 import org.drools.common.InternalRuleBase;
 import org.drools.concurrent.ExecutorService;
+import org.drools.runtime.Environment;
 
 public interface Marshaller {
 
     public StatefulSession read(final InputStream stream,
                                 final InternalRuleBase ruleBase,
                                 final int id,
-                                final ExecutorService executor) throws IOException,
+                                final ExecutorService executor,
+                                final SessionConfiguration config,
+                                final Environment environment) throws IOException,
                                                                ClassNotFoundException;
 
     public StatefulSession read(final InputStream stream,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallerReaderContext.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallerReaderContext.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallerReaderContext.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -36,7 +36,6 @@
 
     public final boolean                            marshalProcessInstances;
     public final boolean                            marshalWorkItems;
-    public final boolean                            marshalTimers;
 
     public MarshallerReaderContext(InputStream stream,
                                    InternalRuleBase ruleBase,
@@ -47,7 +46,6 @@
               sinks,
               resolverStrategyFactory,
               true,
-              true,
               true );
     }
 
@@ -56,8 +54,7 @@
                                    Map<Integer, BaseNode> sinks,
                                    PlaceholderResolverStrategyFactory resolverStrategyFactory,
                                    boolean marshalProcessInstances,
-                                   boolean marshalWorkItems,
-                                   boolean marshalTimers) throws IOException {
+                                   boolean marshalWorkItems) throws IOException {
         super( stream );
         this.stream = this;
         this.ruleBase = ruleBase;
@@ -70,6 +67,5 @@
         this.resolverStrategyFactory = resolverStrategyFactory;
         this.marshalProcessInstances = marshalProcessInstances;
         this.marshalWorkItems = marshalWorkItems;
-        this.marshalTimers = marshalTimers;
     }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallerWriteContext.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallerWriteContext.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallerWriteContext.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -29,14 +29,13 @@
     
     public final boolean                            marshalProcessInstances;
     public final boolean                            marshalWorkItems;
-    public final boolean                            marshalTimers;    
     
     public MarshallerWriteContext(OutputStream stream,
                                   InternalRuleBase ruleBase,
                                   InternalWorkingMemory wm,
                                   Map<Integer, BaseNode> sinks,
                                   PlaceholderResolverStrategyFactory resolverStrategyFactory) throws IOException {
-        this(stream, ruleBase, wm, sinks, resolverStrategyFactory, true, true, true);
+        this(stream, ruleBase, wm, sinks, resolverStrategyFactory, true, true);
     }
 
     public MarshallerWriteContext(OutputStream stream,
@@ -45,8 +44,7 @@
                                      Map<Integer, BaseNode> sinks,
                                      PlaceholderResolverStrategyFactory resolverStrategyFactory,
                                      boolean marshalProcessInstances,
-                                     boolean marshalWorkItems,
-                                     boolean marshalTimers) throws IOException {
+                                     boolean marshalWorkItems) throws IOException {
         super( stream );
         this.stream = this;
         this.ruleBase = ruleBase;
@@ -59,6 +57,5 @@
         
         this.marshalProcessInstances = marshalProcessInstances;
         this.marshalWorkItems = marshalWorkItems;
-        this.marshalTimers = marshalTimers;        
     }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfiguration.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfiguration.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfiguration.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -4,5 +4,4 @@
     PlaceholderResolverStrategyFactory getPlaceholderResolverStrategyFactory();
     boolean isMarshallProcessInstances();
     boolean  isMarshallWorkItems();
-    boolean isMarshallTimers();
 } 

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-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfigurationImpl.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -6,23 +6,19 @@
     private PlaceholderResolverStrategyFactory placeholderResolverStrategyFactory;
     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) {
+                                        boolean marshallWorkItems) {
         this.placeholderResolverStrategyFactory = placeholderResolverStrategyFactory;
         this.marshallProcessInstances = marshallProcessInstances;
         this.marshallWorkItems = marshallWorkItems;
-        this.marshallTimers = marshallTimers;
     }
 
     public boolean isMarshallProcessInstances() {
@@ -41,14 +37,6 @@
         this.marshallWorkItems = marshallWorkItems;
     }
 
-    public boolean isMarshallTimers() {
-        return this.marshallTimers;
-    }
-
-    public void setMarshallTimers(boolean marshallTimers) {
-        this.marshallTimers = marshallTimers;
-    }
-
     public PlaceholderResolverStrategyFactory getPlaceholderResolverStrategyFactory() {
         return this.placeholderResolverStrategyFactory;
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -113,9 +113,7 @@
             writeWorkItems( context );
         }
 
-        if ( context.marshalTimers ) {
-            writeTimers( context );
-        }
+        writeTimers( context );
         
         if( multithread ) {
             wm.startPartitionManagers();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterHelper.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterHelper.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -5,11 +5,12 @@
 import org.drools.common.WorkingMemoryAction;
 import org.drools.common.RuleFlowGroupImpl.DeactivateCallback;
 import org.drools.common.TruthMaintenanceSystem.LogicalRetractCallback;
+import org.drools.process.instance.event.DefaultSignalManager.SignalProcessInstanceAction;
 import org.drools.reteoo.PropagationQueuingNode.PropagateAction;
 import org.drools.reteoo.ReteooWorkingMemory.WorkingMemoryReteAssertAction;
 
 public class PersisterHelper {
-    public static WorkingMemoryAction readWorkingMemoryAction(MarshallerReaderContext context) throws IOException {
+    public static WorkingMemoryAction readWorkingMemoryAction(MarshallerReaderContext context) throws IOException, ClassNotFoundException {
         int type = context.readInt();
         switch(type) {
             case WorkingMemoryAction.WorkingMemoryReteAssertAction : {
@@ -24,6 +25,10 @@
             case WorkingMemoryAction.LogicalRetractCallback : {
                 return new LogicalRetractCallback(context);
             }
+            
+            case WorkingMemoryAction.SignalProcessInstanceAction : {
+                return new SignalProcessInstanceAction(context);
+            }
         }    
         return null;
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/SignalEventCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/SignalEventCommand.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/SignalEventCommand.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -39,7 +39,7 @@
 		} else {
 			ProcessInstance processInstance = session.getProcessInstance(processInstanceId);
 			if (processInstance != null) {
-				processInstance.signalEvent(eventType, processInstance);
+				processInstance.signalEvent(eventType, event);
 			}
 		}
 		return null;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/StartProcessCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/StartProcessCommand.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/StartProcessCommand.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -44,7 +44,6 @@
 			}
 		}
 		ProcessInstance processInstance = (ProcessInstance) session.startProcess(processId, parameters);
-		session.fireAllRules();
 		return processInstance;
 	}
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/DefaultSignalManager.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/DefaultSignalManager.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/DefaultSignalManager.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -1,16 +1,33 @@
 package org.drools.process.instance.event;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CopyOnWriteArrayList;
 
+import org.drools.WorkingMemory;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.common.WorkingMemoryAction;
+import org.drools.marshalling.MarshallerReaderContext;
+import org.drools.marshalling.MarshallerWriteContext;
 import org.drools.runtime.process.EventListener;
 import org.drools.runtime.process.ProcessInstance;
 
 public class DefaultSignalManager implements SignalManager {
 	
 	private Map<String, List<EventListener>> processEventListeners;
+	private WorkingMemory workingMemory;
+	
+	public DefaultSignalManager(WorkingMemory workingMemory) {
+		this.workingMemory = workingMemory;
+	}
+	
+	public WorkingMemory getWorkingMemory() {
+		return workingMemory;
+	}
 
 	public void addEventListener(String type, EventListener eventListener) {
 		if (processEventListeners == null) {
@@ -44,8 +61,65 @@
 		}
 	}
 	
-	public void signalEvent(ProcessInstance processInstance, String type, Object event) {
-        processInstance.signalEvent(type, event);
+	public void signalEvent(long processInstanceId, String type, Object event) {
+		ProcessInstance processInstance = workingMemory.getProcessInstance(processInstanceId);
+		if (processInstance != null) {
+			((InternalWorkingMemory) workingMemory).queueWorkingMemoryAction(new SignalProcessInstanceAction(processInstanceId, type, event));
+		}
 	}
 	
+	public static class SignalProcessInstanceAction implements WorkingMemoryAction {
+
+		private long processInstanceId;
+		private String type;
+		private Object event;
+		
+		public SignalProcessInstanceAction(long processInstanceId, String type, Object event) {
+			this.processInstanceId = processInstanceId;
+			this.type = type;
+			this.event = event;
+			
+		}
+		
+		public SignalProcessInstanceAction(MarshallerReaderContext context) throws IOException, ClassNotFoundException {
+			processInstanceId = context.readLong();
+			type = context.readUTF();
+			if (context.readBoolean()) {
+				event = context.readObject();
+			}
+		}
+		
+		public void execute(InternalWorkingMemory workingMemory) {
+			workingMemory.getProcessInstance(processInstanceId).signalEvent(type, event);
+		}
+
+		public void write(MarshallerWriteContext context) throws IOException {
+			context.writeInt( WorkingMemoryAction.SignalProcessInstanceAction );
+			context.writeLong(processInstanceId);
+			context.writeUTF(type);
+			context.writeBoolean(event != null);
+			if (event != null) {
+				context.writeObject(event);
+			}
+		}
+
+		public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+			processInstanceId = in.readLong();
+			type = in.readUTF();
+			if (in.readBoolean()) {
+				event = in.readObject();
+			}
+		}
+
+		public void writeExternal(ObjectOutput out) throws IOException {
+			out.writeLong(processInstanceId);
+			out.writeUTF(type);
+			out.writeBoolean(event != null);
+			if (event != null) {
+				out.writeObject(event);
+			}
+		}
+		
+	}
+	
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/DefaultSignalManagerFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/DefaultSignalManagerFactory.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/DefaultSignalManagerFactory.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -5,7 +5,7 @@
 public class DefaultSignalManagerFactory implements SignalManagerFactory {
 
 	public SignalManager createSignalManager(WorkingMemory workingMemory) {
-		return new DefaultSignalManager();
+		return new DefaultSignalManager(workingMemory);
 	}
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/SignalManager.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/SignalManager.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/SignalManager.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -7,7 +7,7 @@
 	
 	void signalEvent(String type, Object event);
 	
-	void signalEvent(ProcessInstance processInstance, String type, Object event);
+	void signalEvent(long processInstanceId, String type, Object event);
 	
 	void addEventListener(String type, EventListener eventListener);
 	

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -129,11 +129,7 @@
             
             ctx.getTimer().setLastTriggered(new Date());
             
-            ProcessInstance processInstance = ( ProcessInstance ) workingMemory.getProcessInstance( processInstanceId );
-            // process instance may have finished already
-            if ( processInstance != null ) {
-                workingMemory.getSignalManager().signalEvent(processInstance, "timerTriggered", ctx.getTimer());
-            }
+            workingMemory.getSignalManager().signalEvent(processInstanceId, "timerTriggered", ctx.getTimer());
 
             if (ctx.getTimer().getPeriod() == 0) {
             	TimerManager.this.timers.remove(ctx.getTimer().getId());

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-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -284,7 +284,9 @@
 
     public StatefulSession readStatefulSession(final InputStream stream,
                                                final boolean keepReference,
-                                               Marshaller marshaller) throws IOException,
+                                               final Marshaller marshaller,
+                                               final SessionConfiguration sessionConfig,
+                                               Environment environment ) throws IOException,
                                                                           ClassNotFoundException {
 
         if ( this.config.isSequential() ) {
@@ -298,7 +300,7 @@
         synchronized ( this.pkgs ) {
             ExecutorService executor = ExecutorServiceFactory.createExecutorService( this.config.getExecutorService() );
             
-            session = marshaller.read( stream, this, nextWorkingMemoryCounter(), executor );
+            session = marshaller.read( stream, this, nextWorkingMemoryCounter(), executor, sessionConfig, environment );
 
 //            WMSerialisationInContext context = new WMSerialisationInContext( stream,
 //                                                                             this,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/TimerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/TimerTest.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/TimerTest.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -3,11 +3,15 @@
 import junit.framework.TestCase;
 
 import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
 import org.drools.common.AbstractRuleBase;
 import org.drools.common.InternalWorkingMemory;
+import org.drools.concurrent.CommandExecutor;
+import org.drools.concurrent.DefaultExecutorService;
+import org.drools.concurrent.ExecutorService;
 import org.drools.process.instance.timer.TimerInstance;
 import org.drools.process.instance.timer.TimerManager;
-import org.drools.reteoo.ReteooWorkingMemory;
+import org.drools.reteoo.ReteooStatefulSession;
 import org.drools.ruleflow.instance.RuleFlowProcessInstance;
 
 public class TimerTest extends TestCase {
@@ -16,7 +20,10 @@
 
 	public void testTimer() {
         AbstractRuleBase ruleBase = (AbstractRuleBase) RuleBaseFactory.newRuleBase();
-        InternalWorkingMemory workingMemory = new ReteooWorkingMemory(1, ruleBase);
+        ExecutorService executorService = new DefaultExecutorService();
+        final StatefulSession workingMemory = new ReteooStatefulSession(1, ruleBase, executorService);
+        executorService.setCommandExecutor( new CommandExecutor( workingMemory ) );
+
         RuleFlowProcessInstance processInstance = new RuleFlowProcessInstance() {
 			private static final long serialVersionUID = 4L;
 			public void signalEvent(String type, Object event) {
@@ -27,8 +34,17 @@
         		}
         	}
         };
+        processInstance.setWorkingMemory((InternalWorkingMemory) workingMemory);
         processInstance.setId(1234);
-        workingMemory.getProcessInstanceManager().internalAddProcessInstance(processInstance);
+        ((InternalWorkingMemory) workingMemory).getProcessInstanceManager()
+        	.internalAddProcessInstance(processInstance);
+
+        new Thread(new Runnable() {
+			public void run() {
+	        	workingMemory.fireUntilHalt();       	
+			}
+        }).start();
+
         TimerManager timerManager = workingMemory.getTimerManager();
         TimerInstance timer = new TimerInstance();
         timerManager.registerTimer(timer, processInstance);

Modified: labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/.project
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/.project	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/.project	2009-02-19 02:05:36 UTC (rev 25330)
@@ -1,17 +1,13 @@
-<projectDescription>
-  <name>drools-transformer-xstream</name>
-  <comment>A rule production system</comment>
-  <projects>
-    <project>drools-api</project>
-    <project>drools-compiler</project>
-    <project>drools-core</project>
-  </projects>
-  <buildSpec>
-    <buildCommand>
-      <name>org.eclipse.jdt.core.javabuilder</name>
-    </buildCommand>
-  </buildSpec>
-  <natures>
-    <nature>org.eclipse.jdt.core.javanature</nature>
-  </natures>
+<projectDescription>
+  <name>drools-transformer-xstream</name>
+  <comment>A rule production system</comment>
+  <projects/>
+  <buildSpec>
+    <buildCommand>
+      <name>org.eclipse.jdt.core.javabuilder</name>
+    </buildCommand>
+  </buildSpec>
+  <natures>
+    <nature>org.eclipse.jdt.core.javanature</nature>
+  </natures>
 </projectDescription>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/pom.xml	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/pom.xml	2009-02-19 02:05:36 UTC (rev 25330)
@@ -30,6 +30,13 @@
           <groupId>com.thoughtworks.xstream</groupId>
           <artifactId>xstream</artifactId>
         </dependency>         
+
+        <dependency>
+          <groupId>xmlunit</groupId>
+          <artifactId>xmlunit</artifactId>
+          <version>1.2</version>
+          <scope>test</scope>
+        </dependency>     
       </dependencies>     
 
     <repositories>

Modified: labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/XStreamFactTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/XStreamFactTest.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/XStreamFactTest.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -1,9 +1,10 @@
 package org.drools.runtime.pipeline.impl;
 
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Map;
 
+import junit.framework.TestCase;
+
+import org.custommonkey.xmlunit.Diff;
 import org.drools.KnowledgeBase;
 import org.drools.KnowledgeBaseFactory;
 import org.drools.builder.KnowledgeBuilder;
@@ -21,18 +22,16 @@
 
 import com.thoughtworks.xstream.XStream;
 
-import junit.framework.TestCase;
-
 public class XStreamFactTest extends TestCase {
     public void testFact() throws Exception {
         String xml = "";
-        xml += "<list>";
-        xml += "<example.OrderItem>";
-        xml += "    <price>8.9</price>";        
-        xml += "    <productId>111</productId>";
-        xml += "    <quantity>2</quantity>";        
-        xml += "</example.OrderItem>";
-        xml += "</list>";
+        xml += "<list>\n";
+        xml += "  <example.OrderItem>\n";
+        xml += "    <price>8.9</price>\n";        
+        xml += "    <productId>111</productId>\n";
+        xml += "    <quantity>2</quantity>\n";        
+        xml += "  </example.OrderItem>\n";
+        xml += "</list>\n";
 
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
 
@@ -86,7 +85,7 @@
         resultHandler = new ResultHandlerImpl();
         pipeline.insert( factHandle, resultHandler );  
         
-        assertEqualsIgnoreWhitespace( xml, (String) resultHandler.getObject() );
+        assertTrue( new Diff( xml, (String) resultHandler.getObject() ).similar() );
     }
     
     private static void assertEqualsIgnoreWhitespace(final String expected,

Modified: labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/XStreamGlobalTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/XStreamGlobalTest.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/XStreamGlobalTest.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -1,9 +1,8 @@
 package org.drools.runtime.pipeline.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import junit.framework.TestCase;
 
+import org.custommonkey.xmlunit.Diff;
 import org.drools.KnowledgeBase;
 import org.drools.KnowledgeBaseFactory;
 import org.drools.builder.KnowledgeBuilder;
@@ -17,21 +16,18 @@
 import org.drools.runtime.pipeline.PipelineFactory;
 import org.drools.runtime.pipeline.Transformer;
 import org.drools.runtime.pipeline.impl.XStreamStatefulSessionTest.ResultHandlerImpl;
-import org.drools.runtime.rule.FactHandle;
 
 import com.thoughtworks.xstream.XStream;
 
-import junit.framework.TestCase;
-
 public class XStreamGlobalTest extends TestCase {
     public void testGlobal() throws Exception {
         String xml = "";
-        xml += "<list>";
-        xml += "<example.OrderItem>";
-        xml += "    <price>8.9</price>";        
-        xml += "    <productId>111</productId>";
-        xml += "    <quantity>2</quantity>";        
-        xml += "</example.OrderItem>";
+        xml += "<list>\n";
+        xml += "  <example.OrderItem>\n";
+        xml += "    <price>8.9</price>\n";        
+        xml += "    <productId>111</productId>\n";
+        xml += "    <quantity>2</quantity>\n";        
+        xml += "  </example.OrderItem>\n";
         xml += "</list>";
 
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
@@ -81,7 +77,10 @@
         resultHandler = new ResultHandlerImpl();
         pipeline.insert( "list", resultHandler );  
         
-        assertEqualsIgnoreWhitespace( xml, (String) resultHandler.getObject() );
+        System.out.println(xml);
+        System.out.println(resultHandler.getObject());
+        System.out.println(new Diff( xml, (String) resultHandler.getObject() ));
+        assertTrue( new Diff( xml, (String) resultHandler.getObject() ).similar() );
     }
     
     private static void assertEqualsIgnoreWhitespace(final String expected,

Modified: labs/jbossrules/trunk/drools-process/drools-osworkflow/src/test/java/org/drools/osworkflow/test/persistence/ComplexProcessPersistenceTestCase.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-osworkflow/src/test/java/org/drools/osworkflow/test/persistence/ComplexProcessPersistenceTestCase.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-process/drools-osworkflow/src/test/java/org/drools/osworkflow/test/persistence/ComplexProcessPersistenceTestCase.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -5,10 +5,12 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseConfiguration;
 import org.drools.SessionConfiguration;
+import org.drools.impl.EnvironmentFactory;
 import org.drools.osworkflow.core.command.DoActionCommand;
 import org.drools.persistence.session.SingleSessionCommandService;
 import org.drools.process.command.GetProcessInstanceCommand;
 import org.drools.process.command.StartProcessCommand;
+import org.drools.runtime.Environment;
 import org.drools.runtime.process.ProcessInstance;
 
 public class ComplexProcessPersistenceTestCase extends AbstractJPAPersistenceTestCase {
@@ -20,27 +22,29 @@
 		RuleBase ruleBase = createKnowledgeBase(conf,"/entrevistarf.rf");
 		
 		SessionConfiguration config = new SessionConfiguration(properties);
+		Environment environment = EnvironmentFactory.newEnvironment();
 		
-		SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config);
+		SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config, environment);
+		int sessionId = service.getSessionId();
 		StartProcessCommand startProcessCommand = new StartProcessCommand();
 		startProcessCommand.setProcessId("entrevista");
 		ProcessInstance processInstance = (ProcessInstance) service.execute(startProcessCommand);
 		System.out.println("Started process instance " + processInstance.getId());
 
-		service = new SingleSessionCommandService(ruleBase, config);
+		service = new SingleSessionCommandService(ruleBase, config, environment, sessionId);
         GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
         processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
         assertNotNull(processInstance);
 		System.out.println("Now working with processInstance " + processInstance.getId());
 
-        service = new SingleSessionCommandService(ruleBase, config);
+        service = new SingleSessionCommandService(ruleBase, config, environment, sessionId);
         DoActionCommand doActionCmd = new DoActionCommand();
         doActionCmd.setProcessInstanceId(processInstance.getId());
         doActionCmd.setActionId(2); //Action to be executed at current step
         service.execute(doActionCmd);
         
-        service = new SingleSessionCommandService(ruleBase, config);
+        service = new SingleSessionCommandService(ruleBase, config, environment, sessionId);
         getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
         processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
@@ -48,13 +52,13 @@
 		System.out.println("Now working with processInstance " + processInstance.getId());
         
         
-        service = new SingleSessionCommandService(ruleBase, config);
+        service = new SingleSessionCommandService(ruleBase, config, environment, sessionId);
         doActionCmd = new DoActionCommand();
         doActionCmd.setProcessInstanceId(processInstance.getId());
         doActionCmd.setActionId(4); //Action to be executed at current step
         service.execute(doActionCmd);
         
-        service = new SingleSessionCommandService(ruleBase, config);
+        service = new SingleSessionCommandService(ruleBase, config, environment, sessionId);
         getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
         processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);

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-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPASignalManager.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -6,49 +6,46 @@
 import javax.persistence.Query;
 
 import org.drools.WorkingMemory;
+import org.drools.process.command.CommandService;
+import org.drools.process.command.SignalEventCommand;
 import org.drools.process.instance.event.DefaultSignalManager;
 import org.drools.runtime.EnvironmentName;
 import org.drools.runtime.process.ProcessInstance;
 
 public class JPASignalManager extends DefaultSignalManager {
 
-    private WorkingMemory workingMemory;
+	private CommandService commandService;
 
     public JPASignalManager(WorkingMemory workingMemory) {
-        this.workingMemory = workingMemory;
+        super(workingMemory);
     }
     
+    public void setCommandService(CommandService commandService) {
+    	this.commandService = commandService;
+    }
+    
     public void signalEvent(String type,
                             Object event) {
         for ( long id : getProcessInstancesForEvent( type ) ) {
-            workingMemory.getProcessInstance( id );
+            getWorkingMemory().getProcessInstance( id );
         }
         super.signalEvent( type,
                            event );
     }
 
-    public void signalEvent(ProcessInstance processInstance,
+    public void signalEvent(long processInstanceId,
                             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);
-        //			}
-        //		}
+    	SignalEventCommand command = new SignalEventCommand();
+    	command.setProcessInstanceId(processInstanceId);
+    	command.setEventType(type);
+    	command.setEvent(event);
+    	commandService.execute(command);
     }
 
     @SuppressWarnings("unchecked")
     private List<Long> getProcessInstancesForEvent(String type) {
-        EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
+        EntityManager em = (EntityManager) getWorkingMemory().getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
         
         Query processInstancesForEvent = em.createNamedQuery( "ProcessInstancesWaitingForEvent" );
         processInstancesForEvent.setParameter( "type",

Copied: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPASessionMarshallingHelper.java (from rev 25289, 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/JPASessionMarshallingHelper.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPASessionMarshallingHelper.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -0,0 +1,112 @@
+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;
+import org.drools.runtime.Environment;
+
+public class JPASessionMarshallingHelper {
+
+    private RuleBase             ruleBase;
+    private SessionConfiguration conf;
+    private StatefulSession      session;
+    private Marshaller           marshaller;
+    private Environment          environment;
+    
+    /**
+     * Exist Info, so load session from here
+     * @param info
+     * @param ruleBase
+     * @param conf
+     * @param marshallingConfiguration
+     */
+    public JPASessionMarshallingHelper(SessionInfo info,
+                                      RuleBase    ruleBase,
+                                      SessionConfiguration conf,
+                                      MarshallingConfiguration marshallingConfiguration,
+                                      Environment environment) {   
+        this.ruleBase = ruleBase;
+        this.conf = conf;
+        this.environment = environment;
+        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 JPASessionMarshallingHelper(StatefulSession session,
+                                      SessionConfiguration conf,
+                                      MarshallingConfiguration marshallingConfiguration) {   
+        this.session = session;     
+        this.ruleBase = session.getRuleBase();
+        this.environment = session.getEnvironment();
+        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, true, marshaller, conf, environment );
+            } 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/JPASessionMashallingHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPASessionMashallingHelper.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPASessionMashallingHelper.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -1,108 +0,0 @@
-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;
-    }
-
-}

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SessionInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SessionInfo.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SessionInfo.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -44,7 +44,7 @@
     MarshallingConfiguration   marshallingConfiguration;
 
     @Transient
-    JPASessionMashallingHelper helper;
+    JPASessionMarshallingHelper helper;
     
     public SessionInfo() {
         this.startDate = new Date();
@@ -58,7 +58,7 @@
 //        return this.version;
 //    }
 
-    public void setJPASessionMashallingHelper(JPASessionMashallingHelper helper) {
+    public void setJPASessionMashallingHelper(JPASessionMarshallingHelper helper) {
         this.helper = helper;
     }
 

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-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -9,7 +9,6 @@
 import javax.transaction.Status;
 import javax.transaction.Synchronization;
 import javax.transaction.SystemException;
-import javax.transaction.Transaction;
 import javax.transaction.TransactionManager;
 import javax.transaction.UserTransaction;
 
@@ -22,6 +21,7 @@
 import org.drools.marshalling.MarshallingConfiguration;
 import org.drools.marshalling.MarshallingConfigurationImpl;
 import org.drools.marshalling.PlaceholderResolverStrategyFactory;
+import org.drools.persistence.processinstance.JPASignalManager;
 import org.drools.process.command.Command;
 import org.drools.process.command.CommandService;
 import org.drools.reteoo.ReteooRuleBase;
@@ -37,7 +37,7 @@
     private EntityManagerFactory       emf;
     private EntityManager              em;
     private SessionInfo                sessionInfo;
-    private JPASessionMashallingHelper marshallingHelper;
+    private JPASessionMarshallingHelper marshallingHelper;
     private StatefulSession            session;
     private Environment                env;
 
@@ -52,32 +52,22 @@
     public SingleSessionCommandService(RuleBase ruleBase,
                                        SessionConfiguration conf,
                                        Environment env) {
-        if ( conf == null ) {
+        if (conf == null) {
             conf = new SessionConfiguration();
         }
-        
         this.env = env;
-
         this.sessionInfo = new SessionInfo();
+        this.session = ((ReteooRuleBase) ruleBase).newStatefulSession(this.sessionInfo.getId(), conf, env);
+        ((JPASignalManager) this.session.getSignalManager()).setCommandService(this);
+        MarshallingConfiguration marshallingConf = new MarshallingConfigurationImpl(
+    		(PlaceholderResolverStrategyFactory) env.get(EnvironmentName.PLACEHOLDER_RESOLVER_STRATEGY_FACTORY),
+            false, false);
+        this.marshallingHelper = new JPASessionMarshallingHelper(this.session, conf, marshallingConf);
+        this.sessionInfo.setJPASessionMashallingHelper(this.marshallingHelper);        
 
-        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() );
+//        System.out.println( ((EntityManagerImpl) this.em).getFlushMode() );
         UserTransaction ut = null;
         try {
             InitialContext ctx = new InitialContext();
@@ -88,15 +78,15 @@
             
             this.em.persist( this.sessionInfo );
 
-            System.out.println( "committing" );
+//            System.out.println( "committing" );
             ut.commit();
-            System.out.println( "commit complete" );
+//            System.out.println( "commit complete" );
         } catch ( Throwable t1 ) {
-            try {
+        	try {
                 if ( ut != null ) {
                     ut.rollback();
                 }
-                throw new RuntimeException( "Could insert session data",
+                throw new RuntimeException( "Could not insert session data",
                                             t1 );
             } catch ( Throwable t2 ) {
                 throw new RuntimeException( "Could not rollback transaction",
@@ -104,21 +94,70 @@
             }
         }
         
-        EntityManager localEm = this.emf.createEntityManager();
-       // System.out.println( "1) version " + localEm.find( SessionInfo.class, sessionInfo.getId() ).getVersion() );
-        localEm.close();
+        new Thread(new Runnable() {
+			public void run() {
+				session.fireUntilHalt();
+			}
+    	});
     }
     
+    public SingleSessionCommandService(RuleBase ruleBase, SessionConfiguration conf, Environment env, int sessionId) {
+		if (conf == null) {
+			conf = new SessionConfiguration();
+		}
+
+		this.env = env;
+
+		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();
+		
+			sessionInfo = this.em.find(SessionInfo.class, sessionId);
+		
+		//	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);
+			}
+		}
+		
+		MarshallingConfiguration marshallingConf = new MarshallingConfigurationImpl(
+			(PlaceholderResolverStrategyFactory) env.get(EnvironmentName.PLACEHOLDER_RESOLVER_STRATEGY_FACTORY),
+			false, false);
+		this.marshallingHelper = new JPASessionMarshallingHelper(sessionInfo, ruleBase, conf, marshallingConf, env);
+		this.sessionInfo.setJPASessionMashallingHelper(this.marshallingHelper);
+		this.session = this.marshallingHelper.getObject();
+		((JPASignalManager) this.session.getSignalManager()).setCommandService(this);
+
+		new Thread(new Runnable() {
+			public void run() {
+				session.fireUntilHalt();
+			}
+		});
+	}
+
     
-    public void init() {
-        
-    }
-
     public StatefulSession getSession() {
         return this.session;
     }
 
-    public <T> T execute(Command<T> command) {
+    public synchronized <T> T execute(Command<T> command) {
+    	session.halt();
+    	
         boolean localTransaction = false;
         UserTransaction ut = null;
         try {
@@ -128,11 +167,11 @@
                 // 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 );
             } 
 
+            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();
@@ -148,17 +187,11 @@
                 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 ) {
+        	t1.printStackTrace();
+        	if ( localTransaction ) {
                 try {
                     if ( ut != null ) {
                         ut.rollback();
@@ -173,6 +206,12 @@
                 throw new RuntimeException( "Could not execute command",
                                             t1 );
             }
+        } finally {
+        	new Thread(new Runnable() {
+				public void run() {
+					session.fireUntilHalt();
+				}
+        	});
         }
     }
 
@@ -182,7 +221,7 @@
         }
     }
 
-    public long getSessionId() {
+    public int getSessionId() {
         return sessionInfo.getId();
     }
     

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-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/jpa/JPAPersisterTest.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -9,7 +9,7 @@
 import org.drools.RuleBaseFactory;
 import org.drools.StatefulSession;
 import org.drools.WorkingMemory;
-import org.drools.persistence.session.JPASessionMashallingHelper;
+import org.drools.persistence.session.JPASessionMarshallingHelper;
 import org.drools.process.core.Work;
 import org.drools.process.core.impl.WorkImpl;
 import org.drools.rule.Package;

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-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -3,14 +3,16 @@
 import java.util.Collection;
 import java.util.Properties;
 
+import javax.naming.InitialContext;
+import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.Persistence;
+import javax.transaction.UserTransaction;
 
 import junit.framework.TestCase;
 
 import org.drools.KnowledgeBaseFactory;
 import org.drools.RuleBase;
-import org.drools.RuleBaseConfiguration;
 import org.drools.RuleBaseFactory;
 import org.drools.SessionConfiguration;
 import org.drools.compiler.PackageBuilder;
@@ -26,7 +28,6 @@
 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;
 import org.drools.runtime.process.WorkItem;
@@ -72,7 +73,7 @@
         
     }
 	
-	public void testPersistenceWorkItems() {
+	public void testPersistenceWorkItems() throws Exception {
         Environment env = KnowledgeBaseFactory.newEnvironment();
         env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
                  emf );
@@ -91,7 +92,9 @@
 		SessionConfiguration config = new SessionConfiguration(properties);
 
 		SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config, env);
-        StartProcessCommand startProcessCommand = new StartProcessCommand();
+		int sessionId = service.getSessionId();
+		
+		StartProcessCommand startProcessCommand = new StartProcessCommand();
         startProcessCommand.setProcessId("org.drools.test.TestProcess");
         ProcessInstance processInstance = (ProcessInstance) service.execute(startProcessCommand);
         System.out.println("Started process instance " + processInstance.getId());
@@ -99,56 +102,168 @@
         TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
         WorkItem workItem = handler.getWorkItem();
         assertNotNull(workItem);
+        service.dispose();
         
-        service = new SingleSessionCommandService(ruleBase, config, env);
+        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
         GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
         processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
         assertNotNull(processInstance);
+        service.dispose();
         
-        service = new SingleSessionCommandService(ruleBase, config, env);
+        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
         CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
         completeWorkItemCommand.setWorkItemId(workItem.getId());
         service.execute(completeWorkItemCommand);
 
         workItem = handler.getWorkItem();
         assertNotNull(workItem);
+        service.dispose();
         
-        service = new SingleSessionCommandService(ruleBase, config, env);
+        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
         getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
         processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
         assertNotNull(processInstance);
+        service.dispose();
         
-        service = new SingleSessionCommandService(ruleBase, config, env);
+        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
         completeWorkItemCommand = new CompleteWorkItemCommand();
         completeWorkItemCommand.setWorkItemId(workItem.getId());
         service.execute(completeWorkItemCommand);
         
         workItem = handler.getWorkItem();
         assertNotNull(workItem);
+        service.dispose();
         
-        service = new SingleSessionCommandService(ruleBase, config, env);
+        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
         getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
         processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
         assertNotNull(processInstance);
+        service.dispose();
         
-        service = new SingleSessionCommandService(ruleBase, config, env);
+        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
         completeWorkItemCommand = new CompleteWorkItemCommand();
         completeWorkItemCommand.setWorkItemId(workItem.getId());
         service.execute(completeWorkItemCommand);
 
         workItem = handler.getWorkItem();
         assertNull(workItem);
+        service.dispose();
         
-        service = new SingleSessionCommandService(ruleBase, config, env);
+        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
         getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
         processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
         assertNull(processInstance);
+        service.dispose();
 	}
+	
+	public void testPersistenceWorkItemsUserTransaction() throws Exception {
+        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);
 
+		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");
+		SessionConfiguration config = new SessionConfiguration(properties);
+
+		SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config, env);
+		int sessionId = service.getSessionId();
+		
+		UserTransaction ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
+        ut.begin();
+        StartProcessCommand startProcessCommand = new StartProcessCommand();
+        startProcessCommand.setProcessId("org.drools.test.TestProcess");
+        ProcessInstance processInstance = (ProcessInstance) service.execute(startProcessCommand);
+        System.out.println("Started process instance " + processInstance.getId());
+        ut.commit();
+        
+        TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
+        WorkItem workItem = handler.getWorkItem();
+        assertNotNull(workItem);
+        service.dispose();
+        
+        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+        ut.begin();
+        GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
+        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
+        assertNotNull(processInstance);
+        ut.commit();
+        service.dispose();
+        
+        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+        ut.begin();
+        CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
+        completeWorkItemCommand.setWorkItemId(workItem.getId());
+        service.execute(completeWorkItemCommand);
+        ut.commit();
+        
+        workItem = handler.getWorkItem();
+        assertNotNull(workItem);
+        service.dispose();
+        
+        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+        ut.begin();
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
+        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
+        ut.commit();
+        assertNotNull(processInstance);
+        service.dispose();
+        
+        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+        ut.begin();
+        completeWorkItemCommand = new CompleteWorkItemCommand();
+        completeWorkItemCommand.setWorkItemId(workItem.getId());
+        service.execute(completeWorkItemCommand);
+        ut.commit();
+        
+        workItem = handler.getWorkItem();
+        assertNotNull(workItem);
+        service.dispose();
+        
+        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+        ut.begin();
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
+        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
+        ut.commit();
+        assertNotNull(processInstance);
+        service.dispose();
+        
+        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+        ut.begin();
+        completeWorkItemCommand = new CompleteWorkItemCommand();
+        completeWorkItemCommand.setWorkItemId(workItem.getId());
+        service.execute(completeWorkItemCommand);
+        ut.commit();
+        
+        workItem = handler.getWorkItem();
+        assertNull(workItem);
+        service.dispose();
+        
+        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+        ut.begin();
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
+        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
+        ut.commit();
+        assertNull(processInstance);
+        service.dispose();
+	}
+
     private Package getProcessWorkItems() {
     	RuleFlowProcess process = new RuleFlowProcess();
     	process.setId("org.drools.test.TestProcess");
@@ -231,6 +346,7 @@
         TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
         WorkItem workItem = handler.getWorkItem();
         assertNotNull(workItem);
+        service.dispose();
         
         service = new SingleSessionCommandService(ruleBase, config, env);
         GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
@@ -246,11 +362,13 @@
         getProcessInstanceCommand.setProcessInstanceId(subProcessInstanceId);
         RuleFlowProcessInstance subProcessInstance = (RuleFlowProcessInstance) service.execute(getProcessInstanceCommand);
         assertNotNull(subProcessInstance);
+        service.dispose();
 
         service = new SingleSessionCommandService(ruleBase, config, env);
         CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
         completeWorkItemCommand.setWorkItemId(workItem.getId());
         service.execute(completeWorkItemCommand);
+        service.dispose();
 
         service = new SingleSessionCommandService(ruleBase, config, env);
         getProcessInstanceCommand = new GetProcessInstanceCommand();
@@ -262,6 +380,7 @@
         getProcessInstanceCommand.setProcessInstanceId(processInstanceId);
         processInstance = (RuleFlowProcessInstance) service.execute(getProcessInstanceCommand);
         assertNull(processInstance);
+        service.dispose();
 	}
 	
 	private Package getProcessSubProcess() {
@@ -333,7 +452,7 @@
     	return packageBuilder.getPackage();
     }
     
-	public void FIXMEtestPersistenceTimer() throws Exception {
+	public void testPersistenceTimer() throws Exception {
         Environment env = KnowledgeBaseFactory.newEnvironment();
         env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
                  emf );
@@ -352,19 +471,22 @@
         ruleBase.addPackage(pkg);
 
         SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config, env);
+		int sessionId = service.getSessionId();
         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.dispose();
         
-        service = new SingleSessionCommandService(ruleBase, config, env);
+        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
         GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
         processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
         assertNotNull(processInstance);
+        service.dispose();
 
-        service = new SingleSessionCommandService(ruleBase, config, env);
-        Thread.sleep(2000);
+        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+        Thread.sleep(3000);
         getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
         processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
@@ -384,7 +506,7 @@
     	timerNode.setId(2);
     	timerNode.setName("Timer");
     	Timer timer = new Timer();
-    	timer.setDelay(1000);
+    	timer.setDelay(2000);
     	timerNode.setTimer(timer);
     	process.addNode(timerNode);
     	new ConnectionImpl(start, Node.CONNECTION_DEFAULT_TYPE, timerNode, Node.CONNECTION_DEFAULT_TYPE);
@@ -409,8 +531,7 @@
     	return packageBuilder.getPackage();
     }
     
-    // @FIXME krisv this fails due to nested transactions
-	public void FIXMEtestPersistenceTimer2() throws Exception {
+	public void testPersistenceTimer2() throws Exception {
         Environment env = KnowledgeBaseFactory.newEnvironment();
         env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
                  emf );
@@ -429,22 +550,18 @@
         ruleBase.addPackage(pkg);
 
         SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config, env);
+        int sessionId = service.getSessionId();
         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, env);
+        Thread.sleep(2000);
+
+        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
         GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
         getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
         processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
-        assertNotNull(processInstance);
-
-        service = new SingleSessionCommandService(ruleBase, config, env);
-        Thread.sleep(2000);
-        getProcessInstanceCommand = new GetProcessInstanceCommand();
-        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
-        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
         assertNull(processInstance);
 	}
 

Modified: labs/jbossrules/trunk/drools-process/drools-workitems/src/main/java/org/drools/process/workitem/email/EmailWorkItemHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-workitems/src/main/java/org/drools/process/workitem/email/EmailWorkItemHandler.java	2009-02-19 01:22:57 UTC (rev 25329)
+++ labs/jbossrules/trunk/drools-process/drools-workitems/src/main/java/org/drools/process/workitem/email/EmailWorkItemHandler.java	2009-02-19 02:05:36 UTC (rev 25330)
@@ -31,6 +31,10 @@
 		connection.setPassword(password);
 	}
 	
+	public Connection getConnection() {
+		return connection;
+	}
+	
 	public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
 		if (connection == null) {
 			throw new IllegalArgumentException(

Added: labs/jbossrules/trunk/drools-process/drools-workitems/src/main/resources/icons/email.gif
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-process/drools-workitems/src/main/resources/icons/email.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream




More information about the jboss-svn-commits mailing list