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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat May 17 23:08:36 EDT 2008


Author: mark.proctor at jboss.com
Date: 2008-05-17 23:08:35 -0400 (Sat, 17 May 2008)
New Revision: 19997

Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cell.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/FactA.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/FactB.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/FactC.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/SerializationHelper.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/persister/WorkingMemorySerialisationTest.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
Log:
JBRULES-1598 Efficient WorkingMemory serialization with binary protocol
-First working version, ready for the world to see :) Still needs Accumulate, Collect and From to be done.

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cell.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cell.java	2008-05-17 22:10:51 UTC (rev 19996)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cell.java	2008-05-18 03:08:35 UTC (rev 19997)
@@ -37,4 +37,22 @@
     public void setValue(final int value) {
         this.value = value;
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + value;
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( getClass() != obj.getClass() ) return false;
+        final Cell other = (Cell) obj;
+        if ( value != other.value ) return false;
+        return true;
+    }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/FactA.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/FactA.java	2008-05-17 22:10:51 UTC (rev 19996)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/FactA.java	2008-05-18 03:08:35 UTC (rev 19997)
@@ -13,6 +13,10 @@
     public FactA( String f1 ) {
         this.field1 = f1;
     }
+    
+    public FactA( final Integer f2 ) {
+        this.field2 = f2;
+    }    
 
     public FactA(final String f1,
                  final Integer f2,
@@ -46,4 +50,32 @@
         this.field3 = f;
     }
 
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((field1 == null) ? 0 : field1.hashCode());
+        result = prime * result + ((field2 == null) ? 0 : field2.hashCode());
+        result = prime * result + ((field3 == null) ? 0 : field3.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( getClass() != obj.getClass() ) return false;
+        final FactA other = (FactA) obj;
+        if ( field1 == null ) {
+            if ( other.field1 != null ) return false;
+        } else if ( !field1.equals( other.field1 ) ) return false;
+        if ( field2 == null ) {
+            if ( other.field2 != null ) return false;
+        } else if ( !field2.equals( other.field2 ) ) return false;
+        if ( field3 == null ) {
+            if ( other.field3 != null ) return false;
+        } else if ( !field3.equals( other.field3 ) ) return false;
+        return true;
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/FactB.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/FactB.java	2008-05-17 22:10:51 UTC (rev 19996)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/FactB.java	2008-05-18 03:08:35 UTC (rev 19997)
@@ -13,6 +13,10 @@
     public FactB( String f1 ) {
         this.f1 = f1;
     }
+    
+    public FactB( final Integer b ) {
+        this.f2 = b;
+    }    
 
     public FactB(final String a,
                  final Integer b,
@@ -46,4 +50,32 @@
         this.f3 = f;
     }
 
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((f1 == null) ? 0 : f1.hashCode());
+        result = prime * result + ((f2 == null) ? 0 : f2.hashCode());
+        result = prime * result + ((f3 == null) ? 0 : f3.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( getClass() != obj.getClass() ) return false;
+        final FactB other = (FactB) obj;
+        if ( f1 == null ) {
+            if ( other.f1 != null ) return false;
+        } else if ( !f1.equals( other.f1 ) ) return false;
+        if ( f2 == null ) {
+            if ( other.f2 != null ) return false;
+        } else if ( !f2.equals( other.f2 ) ) return false;
+        if ( f3 == null ) {
+            if ( other.f3 != null ) return false;
+        } else if ( !f3.equals( other.f3 ) ) return false;
+        return true;
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/FactC.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/FactC.java	2008-05-17 22:10:51 UTC (rev 19996)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/FactC.java	2008-05-18 03:08:35 UTC (rev 19997)
@@ -22,6 +22,10 @@
     public FactC( String f1 ) {
         this.f1 = f1;
     }
+    
+    public FactC( final Integer b ) {
+        this.f2 = b;
+    }    
 
     public String getF1() {
         return this.f1;
@@ -47,4 +51,32 @@
         this.f3 = f;
     }
 
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((f1 == null) ? 0 : f1.hashCode());
+        result = prime * result + ((f2 == null) ? 0 : f2.hashCode());
+        result = prime * result + ((f3 == null) ? 0 : f3.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( getClass() != obj.getClass() ) return false;
+        final FactC other = (FactC) obj;
+        if ( f1 == null ) {
+            if ( other.f1 != null ) return false;
+        } else if ( !f1.equals( other.f1 ) ) return false;
+        if ( f2 == null ) {
+            if ( other.f2 != null ) return false;
+        } else if ( !f2.equals( other.f2 ) ) return false;
+        if ( f3 == null ) {
+            if ( other.f3 != null ) return false;
+        } else if ( !f3.equals( other.f3 ) ) return false;
+        return true;
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java	2008-05-17 22:10:51 UTC (rev 19996)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java	2008-05-18 03:08:35 UTC (rev 19997)
@@ -14,6 +14,7 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseConfiguration;
 import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
 import org.drools.TemporalSession;
 import org.drools.StockTick;
 import org.drools.WorkingMemory;
@@ -66,11 +67,11 @@
         final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_CEP_SimpleEventAssertion.drl" ) );
         RuleBase ruleBase = loadRuleBase( reader );
 
-        WorkingMemory wm = ruleBase.newTemporalSession( ClockType.PSEUDO_CLOCK );
+        StatefulSession session = ruleBase.newTemporalSession( ClockType.PSEUDO_CLOCK );
         final List results = new ArrayList();
 
-        wm.setGlobal( "results",
-                      results );
+        session.setGlobal( "results",    
+                           results );
 
         StockTick tick1 = new StockTick( 1,
                                          "DROO",
@@ -89,10 +90,10 @@
                                          50,
                                          System.currentTimeMillis() );
 
-        InternalFactHandle handle1 = (InternalFactHandle) wm.insert( tick1 );
-        InternalFactHandle handle2 = (InternalFactHandle) wm.insert( tick2 );
-        InternalFactHandle handle3 = (InternalFactHandle) wm.insert( tick3 );
-        InternalFactHandle handle4 = (InternalFactHandle) wm.insert( tick4 );
+        InternalFactHandle handle1 = (InternalFactHandle) session.insert( tick1 );
+        InternalFactHandle handle2 = (InternalFactHandle) session.insert( tick2 );
+        InternalFactHandle handle3 = (InternalFactHandle) session.insert( tick3 );
+        InternalFactHandle handle4 = (InternalFactHandle) session.insert( tick4 );
 
         assertNotNull( handle1 );
         assertNotNull( handle2 );
@@ -104,11 +105,12 @@
         assertTrue( handle3.isEvent() );
         assertTrue( handle4.isEvent() );
 
-        wm = SerializationHelper.serializeObject( wm );
-        wm.fireAllRules();
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
 
         assertEquals( 2,
-                      ((List) wm.getGlobal( "results" )).size() );
+                      ((List) session.getGlobal( "results" )).size() );
 
     }
 

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java	2008-05-17 22:10:51 UTC (rev 19996)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java	2008-05-18 03:08:35 UTC (rev 19997)
@@ -339,20 +339,21 @@
         ruleBase.addPackage( SerializationHelper.serializeObject( builder.getPackage() ) );
         ruleBase = SerializationHelper.serializeObject( ruleBase );
 
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        StatefulSession session = ruleBase.newStatefulSession();
 
-        workingMemory.insert( new Precondition( "genericcode",
+        session.insert( new Precondition( "genericcode",
                                                 "genericvalue" ) );
-        workingMemory.fireAllRules();
+        session.fireAllRules();
 
-        RuleBase ruleBaseWM = workingMemory.getRuleBase();
+        RuleBase ruleBaseWM = session.getRuleBase();
         ruleBaseWM.removePackage( packageName );
         final PackageBuilder builder1 = new PackageBuilder();
         builder1.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_RemovePackage.drl" ) ) );
         ruleBaseWM.addPackage( SerializationHelper.serializeObject( builder1.getPackage() ) );
         ruleBaseWM = SerializationHelper.serializeObject( ruleBaseWM );
-        workingMemory = SerializationHelper.serializeObject( workingMemory );
-        workingMemory.fireAllRules();
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
 
         ruleBaseWM.removePackage( packageName );
         ruleBaseWM.addPackage( SerializationHelper.serializeObject( builder1.getPackage() ) );
@@ -363,30 +364,31 @@
 
     public void testDynamicRules() throws Exception {
         RuleBase ruleBase = getRuleBase();
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        StatefulSession session = ruleBase.newStatefulSession();
         final Cheese a = new Cheese( "stilton",
                                      10 );
         final Cheese b = new Cheese( "stilton",
                                      15 );
         final Cheese c = new Cheese( "stilton",
                                      20 );
-        workingMemory.insert( a );
-        workingMemory.insert( b );
-        workingMemory.insert( c );
+        session.insert( a );
+        session.insert( b );
+        session.insert( c );
 
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DynamicRules.drl" ) ) );
         final Package pkg = builder.getPackage();
         ruleBase.addPackage( SerializationHelper.serializeObject( pkg ) );
         ruleBase = SerializationHelper.serializeObject( ruleBase );
-        workingMemory = SerializationHelper.serializeObject( workingMemory );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
 
-        workingMemory.fireAllRules();
+        session.fireAllRules();
     }
 
     public void testDynamicRules2() throws Exception {
         RuleBase ruleBase = getRuleBase();
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        StatefulSession session = ruleBase.newStatefulSession();
 
         // Assert some simple facts
         final FactA a = new FactA( "hello",
@@ -395,17 +397,18 @@
         final FactB b = new FactB( "hello",
                                    new Integer( 2 ),
                                    new Float( 6.28 ) );
-        workingMemory.insert( a );
-        workingMemory.insert( b );
+        session.insert( a );
+        session.insert( b );
 
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DynamicRules2.drl" ) ) );
         final Package pkg = SerializationHelper.serializeObject( builder.getPackage() );
         ruleBase.addPackage( pkg );
         ruleBase = SerializationHelper.serializeObject( ruleBase );
-        workingMemory = SerializationHelper.serializeObject( workingMemory );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
 
-        workingMemory.fireAllRules();
+        session.fireAllRules();
     }
 
     public void testRuleBaseAddRemove() throws Exception {
@@ -562,9 +565,9 @@
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkgInit );
 
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        StatefulSession session = ruleBase.newStatefulSession();
         List results = new ArrayList();
-        workingMemory.setGlobal( "results",
+        session.setGlobal( "results",
                                  results );
 
         final Cheese a = new Cheese( "stilton",
@@ -573,35 +576,37 @@
                                      15 );
         final Cheese c = new Cheese( "stilton",
                                      20 );
-        workingMemory.insert( a );
-        FactHandle handle = workingMemory.insert( b );
-        workingMemory.insert( c );
-
+        session.insert( a );
+        session.insert( b );
+        session.insert( c );
+        
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DynamicNotNode.drl" ) ) );
         final Package pkg = builder.getPackage();
         ruleBase.addPackage( SerializationHelper.serializeObject( pkg ) );
         ruleBase = SerializationHelper.serializeObject( ruleBase );
-        workingMemory = SerializationHelper.serializeObject( workingMemory );
-        results = (List) workingMemory.getGlobal( "results" );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        results = (List) session.getGlobal( "results" );
 
-        workingMemory.fireAllRules();
+        session.fireAllRules();
 
         assertEquals( 0,
                       results.size() );
 
         ruleBase.removePackage( "org.drools" );
 
-        workingMemory.retract( handle );
+        session.retract( session.getFactHandle( b ) );
 
         final PackageBuilder builder1 = new PackageBuilder();
         builder1.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DynamicNotNode.drl" ) ) );
         final Package pkg1 = builder.getPackage();
         ruleBase.addPackage( SerializationHelper.serializeObject( pkg1 ) );
         ruleBase = SerializationHelper.serializeObject( ruleBase );
-        workingMemory = SerializationHelper.serializeObject( workingMemory );
-        results = (List) workingMemory.getGlobal( "results" );
-        workingMemory.fireAllRules();
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        results = (List) session.getGlobal( "results" );
+        session.fireAllRules();
 
         assertEquals( 1,
                       results.size() );
@@ -701,10 +706,10 @@
         builder2.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DynamicRulesWithSubnetwork2.drl" ) ) );
         ruleBase.addPackage( SerializationHelper.serializeObject( builder2.getPackage() ) );
 
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        final StatefulSession session = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
-        workingMemory.setGlobal( "results",
+        session.setGlobal( "results",
                                  list );
 
         Order order = new Order();
@@ -715,7 +720,7 @@
                                          OrderItem.TYPE_BOOK,
                                          24 );
         order.addItem( item1 );
-        workingMemory.insert( item1 );
+        session.insert( item1 );
 
         OrderItem item2 = new OrderItem( order,
                                          2,
@@ -723,7 +728,7 @@
                                          OrderItem.TYPE_BOOK,
                                          15 );
         order.addItem( item2 );
-        workingMemory.insert( item2 );
+        session.insert( item2 );
 
         OrderItem item3 = new OrderItem( order,
                                          3,
@@ -731,7 +736,7 @@
                                          OrderItem.TYPE_CD,
                                          9 );
         order.addItem( item3 );
-        workingMemory.insert( item3 );
+        session.insert( item3 );
 
         OrderItem item4 = new OrderItem( order,
                                          4,
@@ -739,17 +744,17 @@
                                          OrderItem.TYPE_CD,
                                          11 );
         order.addItem( item4 );
-        workingMemory.insert( item4 );
+        session.insert( item4 );
 
-        workingMemory.insert( order );
+        session.insert( order );
 
         assertEquals( 11,
-                      workingMemory.getAgenda().getActivations().length );
+                      session.getAgenda().getActivations().length );
 
         reteooRuleBase.removeRule( "org.drools",
                                    "Apply Discount on all books" );
         assertEquals( 10,
-                      workingMemory.getAgenda().getActivations().length );
+                      session.getAgenda().getActivations().length );
 
         reteooRuleBase.removeRule( "org.drools",
                                    "like book" );
@@ -760,17 +765,17 @@
                                                OrderItem.TYPE_CD,
                                                5 );
         assertEquals( 8,
-                      workingMemory.getAgenda().getActivations().length );
+                      session.getAgenda().getActivations().length );
 
-        workingMemory.insert( item5 );
+        session.insert( item5 );
 
         assertEquals( 10,
-                      workingMemory.getAgenda().getActivations().length );
+                      session.getAgenda().getActivations().length );
 
         reteooRuleBase.removePackage( "org.drools" );
 
         assertEquals( 0,
-                      workingMemory.getAgenda().getActivations().length );
+                      session.getAgenda().getActivations().length );
     }
 
     public void testDynamicRuleRemovalsUnusedWorkingMemorySubNetwork() throws Exception {

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java	2008-05-17 22:10:51 UTC (rev 19996)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java	2008-05-18 03:08:35 UTC (rev 19997)
@@ -45,15 +45,6 @@
                                             config );
     }
 
-    private StatefulSession serializeWorkingMemory(RuleBase ruleBase,
-                                                   StatefulSession wm) throws IOException,
-                                                                      ClassNotFoundException {
-        byte[] serializedSession = DroolsStreamUtils.streamOut( wm );
-        wm.dispose();
-        wm = ruleBase.newStatefulSession( new ByteArrayInputStream( serializedSession ) );
-        return wm;
-    }
-
     public void testCollect() throws Exception {
 
         // read in the source

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java	2008-05-17 22:10:51 UTC (rev 19996)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java	2008-05-18 03:08:35 UTC (rev 19997)
@@ -23,12 +23,15 @@
 import org.drools.RuleBaseFactory;
 import org.drools.StatefulSession;
 import org.drools.WorkingMemory;
+import org.drools.base.MapGlobalResolver;
 import org.drools.common.InternalFactHandle;
 import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
+import org.drools.marshalling.Marshaller;
 import org.drools.rule.MapBackedClassLoader;
 import org.drools.rule.Package;
 import org.drools.rule.Rule;
+import org.drools.spi.GlobalResolver;
 import org.drools.util.DroolsStreamUtils;
 
 public class MarshallingTest extends TestCase {
@@ -39,12 +42,12 @@
 
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( reader );
-        final Package pkg = SerializationHelper.serializeObject( builder.getPackage());
+        final Package pkg = SerializationHelper.serializeObject( builder.getPackage() );
 
         assertEquals( 0,
                       builder.getErrors().getErrors().length );
 
-        RuleBase ruleBase = getRuleBase(pkg);// RuleBaseFactory.newRuleBase();
+        RuleBase ruleBase = getRuleBase( pkg );// RuleBaseFactory.newRuleBase();
 
         Map map = new HashMap();
         map.put( "x",
@@ -64,29 +67,27 @@
         assertEquals( "match Integer",
                       rules[3].getName() );
 
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        StatefulSession session = ruleBase.newStatefulSession();
 
-        workingMemory.setGlobal( "list",
-                                 new ArrayList() );
+        session.setGlobal( "list",
+                           new ArrayList() );
 
         final Person bob = new Person( "bob" );
-        workingMemory.insert( bob );
+        session.insert( bob );
 
-        final byte[] wm = DroolsStreamUtils.streamOut( workingMemory );
+        session = SerializationHelper.getSerialisedStatefulSession( session );
 
-        workingMemory = ruleBase.newStatefulSession( new ByteArrayInputStream( wm ) );
-
         assertEquals( 1,
-                      IteratorToList.convert( workingMemory.iterateObjects() ).size() );
+                      IteratorToList.convert( session.iterateObjects() ).size() );
         assertEquals( bob,
-                      IteratorToList.convert( workingMemory.iterateObjects() ).get( 0 ) );
+                      IteratorToList.convert( session.iterateObjects() ).get( 0 ) );
 
         assertEquals( 2,
-                      workingMemory.getAgenda().agendaSize() );
+                      session.getAgenda().agendaSize() );
 
-        workingMemory.fireAllRules();
+        session.fireAllRules();
 
-        final List list = (List) workingMemory.getGlobal( "list" );
+        final List list = (List) session.getGlobal( "list" );
 
         assertEquals( 3,
                       list.size() );
@@ -95,9 +96,9 @@
                       list.get( 0 ) );
 
         assertEquals( 2,
-                      IteratorToList.convert( workingMemory.iterateObjects() ).size() );
-        assertTrue( IteratorToList.convert( workingMemory.iterateObjects() ).contains( bob ) );
-        assertTrue( IteratorToList.convert( workingMemory.iterateObjects() ).contains( new Person( "help" ) ) );
+                      IteratorToList.convert( session.iterateObjects() ).size() );
+        assertTrue( IteratorToList.convert( session.iterateObjects() ).contains( bob ) );
+        assertTrue( IteratorToList.convert( session.iterateObjects() ).contains( new Person( "help" ) ) );
     }
 
     public void testSerializeWorkingMemoryAndRuleBase1() throws Exception {
@@ -113,27 +114,24 @@
 
         RuleBase ruleBase = getRuleBase();// RuleBaseFactory.newRuleBase();
 
+        StatefulSession session = ruleBase.newStatefulSession();
 
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
-
         Map map = new HashMap();
         map.put( "x",
                  ruleBase );
-        map = SerializationHelper.serializeObject(map);
+        map = SerializationHelper.serializeObject( map );
         ruleBase = (RuleBase) map.get( "x" );
 
-        final byte[] wm = DroolsStreamUtils.streamOut( workingMemory );
-
-        workingMemory = ruleBase.newStatefulSession( new ByteArrayInputStream( wm ) );
-
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        
+        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );  
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+              
+        session.setGlobal( "list",
+                           new ArrayList() );
 
-        workingMemory.setGlobal( "list",
-                                 new ArrayList() );
-
         final Person bob = new Person( "bob" );
-        workingMemory.insert( bob );
+        session.insert( bob );
 
         final Rule[] rules = ruleBase.getPackages()[0].getRules();
 
@@ -150,17 +148,17 @@
                       rules[3].getName() );
 
         assertEquals( 1,
-                      IteratorToList.convert( workingMemory.iterateObjects() ).size() );
+                      IteratorToList.convert( session.iterateObjects() ).size() );
         assertEquals( bob,
-                      IteratorToList.convert( workingMemory.iterateObjects() ).get( 0 ) );
+                      IteratorToList.convert( session.iterateObjects() ).get( 0 ) );
 
         assertEquals( 2,
-                      workingMemory.getAgenda().agendaSize() );
+                      session.getAgenda().agendaSize() );
 
-        workingMemory = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+        session = SerializationHelper.getSerialisedStatefulSession( session );
+        session.fireAllRules();
 
-        final List list = (List) workingMemory.getGlobal( "list" );
+        final List list = (List) session.getGlobal( "list" );
 
         assertEquals( 3,
                       list.size() );
@@ -169,9 +167,9 @@
                       list.get( 0 ) );
 
         assertEquals( 2,
-                      IteratorToList.convert( workingMemory.iterateObjects() ).size() );
-        assertTrue( IteratorToList.convert( workingMemory.iterateObjects() ).contains( bob ) );
-        assertTrue( IteratorToList.convert( workingMemory.iterateObjects() ).contains( new Person( "help" ) ) );
+                      IteratorToList.convert( session.iterateObjects() ).size() );
+        assertTrue( IteratorToList.convert( session.iterateObjects() ).contains( bob ) );
+        assertTrue( IteratorToList.convert( session.iterateObjects() ).contains( new Person( "help" ) ) );
 
     }
 
@@ -195,19 +193,18 @@
         map = SerializationHelper.serializeObject( map );
         ruleBase = (RuleBase) map.get( "x" );
 
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        StatefulSession session = ruleBase.newStatefulSession();
 
         // serialise the working memory before population
-        final byte[] wm = DroolsStreamUtils.streamOut( workingMemory );
-        workingMemory = ruleBase.newStatefulSession( new ByteArrayInputStream( wm ) );
+        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
 
         ruleBase.addPackage( pkg );
 
-        workingMemory.setGlobal( "list",
+        session.setGlobal( "list",
                                  new ArrayList() );
 
         final Person bob = new Person( "bob" );
-        workingMemory.insert( bob );
+        session.insert( bob );
 
         final Rule[] rules = ruleBase.getPackages()[0].getRules();
 
@@ -224,17 +221,17 @@
                       rules[3].getName() );
 
         assertEquals( 1,
-                      IteratorToList.convert( workingMemory.iterateObjects() ).size() );
+                      IteratorToList.convert( session.iterateObjects() ).size() );
         assertEquals( bob,
-                      IteratorToList.convert( workingMemory.iterateObjects() ).get( 0 ) );
+                      IteratorToList.convert( session.iterateObjects() ).get( 0 ) );
 
         assertEquals( 2,
-                      workingMemory.getAgenda().agendaSize() );
+                      session.getAgenda().agendaSize() );
 
-        workingMemory = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+        session = SerializationHelper.getSerialisedStatefulSession( session );
+        session.fireAllRules();
 
-        final List list = (List) workingMemory.getGlobal( "list" );
+        final List list = (List) session.getGlobal( "list" );
 
         assertEquals( 3,
                       list.size() );
@@ -243,9 +240,9 @@
                       list.get( 0 ) );
 
         assertEquals( 2,
-                      IteratorToList.convert( workingMemory.iterateObjects() ).size() );
-        assertTrue( IteratorToList.convert( workingMemory.iterateObjects() ).contains( bob ) );
-        assertTrue( IteratorToList.convert( workingMemory.iterateObjects() ).contains( new Person( "help" ) ) );
+                      IteratorToList.convert( session.iterateObjects() ).size() );
+        assertTrue( IteratorToList.convert( session.iterateObjects() ).contains( bob ) );
+        assertTrue( IteratorToList.convert( session.iterateObjects() ).contains( new Person( "help" ) ) );
     }
 
     public void testSerializeWorkingMemoryAndRuleBase3() throws Exception {
@@ -254,21 +251,21 @@
 
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( reader );
-        final Package pkg = SerializationHelper.serializeObject( builder.getPackage());
+        final Package pkg = SerializationHelper.serializeObject( builder.getPackage() );
 
         assertEquals( 0,
                       builder.getErrors().getErrors().length );
 
         RuleBase ruleBase = getRuleBase();
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        StatefulSession session = ruleBase.newStatefulSession();
 
         ruleBase.addPackage( pkg );
 
-        workingMemory.setGlobal( "list",
+        session.setGlobal( "list",
                                  new ArrayList() );
 
         final Person bob = new Person( "bob" );
-        workingMemory.insert( bob );
+        session.insert( bob );
 
         // serialise a hashmap with the RuleBase as a key, after WM population
         Map map = new HashMap();
@@ -278,8 +275,7 @@
         ruleBase = (RuleBase) map.get( "x" );
 
         // now try serialising with a fully populated wm from a serialised rulebase
-        final byte[] wm = DroolsStreamUtils.streamOut( workingMemory );
-        workingMemory = ruleBase.newStatefulSession( new ByteArrayInputStream( wm ) );
+        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
 
         final Rule[] rules = ruleBase.getPackages()[0].getRules();
 
@@ -296,17 +292,17 @@
                       rules[3].getName() );
 
         assertEquals( 1,
-                      IteratorToList.convert( workingMemory.iterateObjects() ).size() );
+                      IteratorToList.convert( session.iterateObjects() ).size() );
         assertEquals( bob,
-                      IteratorToList.convert( workingMemory.iterateObjects() ).get( 0 ) );
+                      IteratorToList.convert( session.iterateObjects() ).get( 0 ) );
 
         assertEquals( 2,
-                      workingMemory.getAgenda().agendaSize() );
+                      session.getAgenda().agendaSize() );
 
-        workingMemory = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
+        session.fireAllRules();
 
-        final List list = (List) workingMemory.getGlobal( "list" );
+        final List list = (List) session.getGlobal( "list" );
 
         assertEquals( 3,
                       list.size() );
@@ -315,56 +311,66 @@
                       list.get( 0 ) );
 
         assertEquals( 2,
-                      IteratorToList.convert( workingMemory.iterateObjects() ).size() );
-        assertTrue( IteratorToList.convert( workingMemory.iterateObjects() ).contains( bob ) );
-        assertTrue( IteratorToList.convert( workingMemory.iterateObjects() ).contains( new Person( "help" ) ) );
+                      IteratorToList.convert( session.iterateObjects() ).size() );
+        assertTrue( IteratorToList.convert( session.iterateObjects() ).contains( bob ) );
+        assertTrue( IteratorToList.convert( session.iterateObjects() ).contains( new Person( "help" ) ) );
     }
 
     public void testSerializeAdd() throws Exception {
 
         //Create a rulebase, a session, and test it
-        RuleBase ruleBase = RuleBaseFactory.newRuleBase( );
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
         PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_Dynamic1.drl" ) ) );
-        Package pkg = SerializationHelper.serializeObject( builder.getPackage());
+        Package pkg = SerializationHelper.serializeObject( builder.getPackage() );
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
 
         StatefulSession session = ruleBase.newStatefulSession();
         List list = new ArrayList();
-        session.setGlobal( "list", list );
+        session.setGlobal( "list",
+                           list );
 
-        InternalFactHandle stilton = (InternalFactHandle) session.insert( new Cheese( "stilton", 10 ) );
-        InternalFactHandle brie = (InternalFactHandle) session.insert( new Cheese( "brie", 10 ) );
+        InternalFactHandle stilton = (InternalFactHandle) session.insert( new Cheese( "stilton",
+                                                                                      10 ) );
+        InternalFactHandle brie = (InternalFactHandle) session.insert( new Cheese( "brie",
+                                                                                   10 ) );
         session.fireAllRules();
 
-        assertEquals( list.size(), 1 );
-        assertEquals( "stilton", list.get( 0 ));
+        assertEquals( list.size(),
+                      1 );
+        assertEquals( "stilton",
+                      list.get( 0 ) );
 
-        byte[] serializedSession = DroolsStreamUtils.streamOut( session );
-        session.dispose();
-
         // now recreate the rulebase, deserialize the session and test it
-        session = ruleBase.newStatefulSession( new ByteArrayInputStream( serializedSession ) );
+        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
         list = (List) session.getGlobal( "list" );
 
         assertNotNull( list );
-        assertEquals( list.size(), 1 );
-        assertEquals( "stilton", list.get( 0 ));
+        assertEquals( list.size(),
+                      1 );
+        assertEquals( "stilton",
+                      list.get( 0 ) );
 
         builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_Dynamic3.drl" ) ) );
-        pkg = SerializationHelper.serializeObject( builder.getPackage());
+        pkg = SerializationHelper.serializeObject( builder.getPackage() );
         ruleBase.addPackage( pkg );
 
-        InternalFactHandle stilton2 = (InternalFactHandle) session.insert( new Cheese( "stilton", 10 ) );
-        InternalFactHandle brie2 = (InternalFactHandle) session.insert( new Cheese( "brie", 10 ) );
-        InternalFactHandle bob = (InternalFactHandle) session.insert( new Person( "bob", 30 ) );
+        InternalFactHandle stilton2 = (InternalFactHandle) session.insert( new Cheese( "stilton",
+                                                                                       10 ) );
+        InternalFactHandle brie2 = (InternalFactHandle) session.insert( new Cheese( "brie",
+                                                                                    10 ) );
+        InternalFactHandle bob = (InternalFactHandle) session.insert( new Person( "bob",
+                                                                                  30 ) );
         session.fireAllRules();
 
-        assertEquals( list.size(), 3 );
-        assertEquals( bob.getObject(), list.get( 1 ));
-        assertEquals( "stilton", list.get( 2 ));
+        assertEquals( list.size(),
+                      3 );
+        assertEquals( bob.getObject(),
+                      list.get( 1 ) );
+        assertEquals( "stilton",
+                      list.get( 2 ) );
 
         session.dispose();
 
@@ -381,7 +387,7 @@
                       0,
                       builder.getErrors().getErrors().length );
 
-        RuleBase ruleBase = getRuleBase(pkg);// RuleBaseFactory.newRuleBase();
+        RuleBase ruleBase = getRuleBase( pkg );// RuleBaseFactory.newRuleBase();
 
         Map map = new HashMap();
         map.put( "x",
@@ -392,33 +398,31 @@
         assertEquals( 3,
                       rules.length );
 
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        StatefulSession session = ruleBase.newStatefulSession();
 
-        workingMemory.setGlobal( "list",
+        session.setGlobal( "list",
                                  new ArrayList() );
 
-        final Primitives p = new Primitives( );
+        final Primitives p = new Primitives();
         p.setBytePrimitive( (byte) 1 );
         p.setShortPrimitive( (short) 2 );
         p.setIntPrimitive( (int) 3 );
-        workingMemory.insert( p );
+        session.insert( p );
 
-        final byte[] wm = DroolsStreamUtils.streamOut( workingMemory );
+        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
 
-        workingMemory = ruleBase.newStatefulSession( new ByteArrayInputStream( wm ) );
-
         assertEquals( 1,
-                      IteratorToList.convert( workingMemory.iterateObjects() ).size() );
+                      IteratorToList.convert( session.iterateObjects() ).size() );
         assertEquals( p,
-                      IteratorToList.convert( workingMemory.iterateObjects() ).get( 0 ) );
+                      IteratorToList.convert( session.iterateObjects() ).get( 0 ) );
 
         assertEquals( 3,
-                      workingMemory.getAgenda().agendaSize() );
+                      session.getAgenda().agendaSize() );
 
-        workingMemory = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
+        session.fireAllRules();
 
-        final List list = (List) workingMemory.getGlobal( "list" );
+        final List list = (List) session.getGlobal( "list" );
 
         assertEquals( 3,
                       list.size() );
@@ -468,13 +472,17 @@
                       results.get( 0 ) );
 
         // serialize session and rulebase out
-        byte[] serializedSession = DroolsStreamUtils.streamOut( session );
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Marshaller marshaller = new Marshaller();
+        ruleBase.writeStatefulSession( session, baos, marshaller );
+        GlobalResolver resolver = session.getGlobalResolver();
         byte[] serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
         session.dispose();
 
         // now deserialize the rulebase, deserialize the session and test it
         ruleBase = (RuleBase) DroolsStreamUtils.streamIn( serializedRulebase );
-        session = ruleBase.newStatefulSession( new ByteArrayInputStream( serializedSession ) );
+        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ), marshaller );
+        session.setGlobalResolver( resolver );
 
         // dynamically add a new package
         builder = new PackageBuilder();
@@ -500,10 +508,9 @@
         assertEquals( mark.getObject(),
                       results.get( 3 ) );
 
-        serializedSession = null;
         serializedRulebase = null;
 
-        serializedSession = DroolsStreamUtils.streamOut( session );
+        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
         serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         // dispose session
@@ -539,7 +546,10 @@
                                                                                     10 ) );
         session.fireAllRules();
 
-        byte[] serializedSession = DroolsStreamUtils.streamOut( session );
+        GlobalResolver resolver = session.getGlobalResolver();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Marshaller marshaller = new Marshaller();        
+        ruleBase.writeStatefulSession( session, baos, marshaller );
         byte[] serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         session.dispose();
@@ -551,7 +561,8 @@
 
         // now recreate the rulebase, deserialize the session and test it
         ruleBase = (RuleBase) DroolsStreamUtils.streamIn( serializedRulebase );
-        session = ruleBase.newStatefulSession( new ByteArrayInputStream( serializedSession ) );
+        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ), marshaller );
+        session.setGlobalResolver( resolver );
         results = (List) session.getGlobal( "results" );
 
         builder = new PackageBuilder();
@@ -560,11 +571,11 @@
         ruleBase.addPackage( pkg );
 
         InternalFactHandle stilton2 = (InternalFactHandle) session.insert( new Cheese( "stilton",
-                                    20 ) );
+                                                                                       20 ) );
         InternalFactHandle brie2 = (InternalFactHandle) session.insert( new Cheese( "brie",
-                                    20 ) );
+                                                                                    20 ) );
         InternalFactHandle brie3 = (InternalFactHandle) session.insert( new Cheese( "brie",
-                                    30 ) );
+                                                                                    30 ) );
         session.fireAllRules();
         assertEquals( 5,
                       results.size() );
@@ -577,10 +588,9 @@
         assertEquals( brie3.getObject(),
                       results.get( 3 ) );
 
-        serializedSession = null;
         serializedRulebase = null;
 
-        serializedSession = DroolsStreamUtils.streamOut( session );
+        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
         serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         session.dispose();
@@ -591,7 +601,7 @@
      */
     public void testSerializeAdd3() throws Exception {
         //Create a rulebase, a session, and test it
-        RuleBase ruleBase = RuleBaseFactory.newRuleBase( );
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
         PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_Dynamic1_0.drl" ) ) );
         Package pkg = SerializationHelper.serializeObject( builder.getPackage() );
@@ -608,7 +618,10 @@
                                                                                     10 ) );
         session.fireAllRules();
 
-        byte[] serializedSession = DroolsStreamUtils.streamOut( session );
+        GlobalResolver resolver = session.getGlobalResolver();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Marshaller marshaller = new Marshaller();          
+        ruleBase.writeStatefulSession( session, baos, marshaller );
         byte[] serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         session.dispose();
@@ -620,7 +633,8 @@
 
         // now recreate the rulebase, deserialize the session and test it
         ruleBase = (RuleBase) DroolsStreamUtils.streamIn( serializedRulebase );
-        session = ruleBase.newStatefulSession( new ByteArrayInputStream( serializedSession ) );
+        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ), marshaller );
+        session.setGlobalResolver( resolver );
         results = (List) session.getGlobal( "results" );
 
         builder = new PackageBuilder();
@@ -629,10 +643,14 @@
 
         ruleBase.addPackage( pkg );
 
-        InternalFactHandle stilton2 = (InternalFactHandle) session.insert( new Cheese( "stilton", 20 ) );
-        InternalFactHandle brie2 = (InternalFactHandle) session.insert( new Cheese( "brie", 20 ) );
-        InternalFactHandle bob1 = (InternalFactHandle) session.insert( new Person( "bob", 20 ) );
-        InternalFactHandle bob2 = (InternalFactHandle) session.insert( new Person( "bob", 30 ) );
+        InternalFactHandle stilton2 = (InternalFactHandle) session.insert( new Cheese( "stilton",
+                                                                                       20 ) );
+        InternalFactHandle brie2 = (InternalFactHandle) session.insert( new Cheese( "brie",
+                                                                                    20 ) );
+        InternalFactHandle bob1 = (InternalFactHandle) session.insert( new Person( "bob",
+                                                                                   20 ) );
+        InternalFactHandle bob2 = (InternalFactHandle) session.insert( new Person( "bob",
+                                                                                   30 ) );
         session.fireAllRules();
 
         assertEquals( 4,
@@ -644,17 +662,20 @@
         assertEquals( bob1.getObject(),
                       results.get( 3 ) );
 
-        serializedSession = null;
         serializedRulebase = null;
 
-        serializedSession = DroolsStreamUtils.streamOut( session );
+        resolver = session.getGlobalResolver();
+        baos = new ByteArrayOutputStream();
+        marshaller = new Marshaller();
+        ruleBase.writeStatefulSession( session, baos, marshaller );        
         serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         session.dispose();
 
         // now recreate the rulebase, deserialize the session and test it
-        ruleBase = (RuleBase) DroolsStreamUtils.streamIn( serializedRulebase );
-        session = ruleBase.newStatefulSession( new ByteArrayInputStream( serializedSession ) );
+        ruleBase = (RuleBase) DroolsStreamUtils.streamIn( serializedRulebase ); 
+        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ), marshaller );
+        session.setGlobalResolver( resolver );
         results = (List) session.getGlobal( "results" );
 
         builder = new PackageBuilder();
@@ -662,10 +683,14 @@
         pkg = SerializationHelper.serializeObject( builder.getPackage() );
         ruleBase.addPackage( pkg );
 
-        InternalFactHandle stilton3 = (InternalFactHandle) session.insert( new Cheese( "stilton", 40 ) );
-        InternalFactHandle brie3 = (InternalFactHandle) session.insert( new Cheese( "brie", 40 ) );
-        InternalFactHandle bob3 = (InternalFactHandle) session.insert( new Person( "bob", 40 ) );
-        InternalFactHandle bob4 = (InternalFactHandle) session.insert( new Person( "bob", 40 ) );
+        InternalFactHandle stilton3 = (InternalFactHandle) session.insert( new Cheese( "stilton",
+                                                                                       40 ) );
+        InternalFactHandle brie3 = (InternalFactHandle) session.insert( new Cheese( "brie",
+                                                                                    40 ) );
+        InternalFactHandle bob3 = (InternalFactHandle) session.insert( new Person( "bob",
+                                                                                   40 ) );
+        InternalFactHandle bob4 = (InternalFactHandle) session.insert( new Person( "bob",
+                                                                                   40 ) );
         InternalFactHandle addr1 = (InternalFactHandle) session.insert( new Address( "bangalore" ) );
         InternalFactHandle addr2 = (InternalFactHandle) session.insert( new Address( "India" ) );
 
@@ -684,23 +709,29 @@
         assertEquals( addr1.getObject(),
                       results.get( 8 ) );
 
-        serializedSession = null;
         serializedRulebase = null;
 
-        serializedSession = DroolsStreamUtils.streamOut( session );
+        resolver = session.getGlobalResolver();
+        baos = new ByteArrayOutputStream();
+        marshaller = new Marshaller();
+        ruleBase.writeStatefulSession( session, baos, marshaller );
         serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
-
         session.dispose();
 
         // now recreate the rulebase, deserialize the session and test it
         ruleBase = (RuleBase) DroolsStreamUtils.streamIn( serializedRulebase );
-        session = ruleBase.newStatefulSession( new ByteArrayInputStream( serializedSession ) );
+        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ), marshaller );
+        session.setGlobalResolver( resolver );
         results = (List) session.getGlobal( "results" );
 
-        InternalFactHandle stilton4 = (InternalFactHandle) session.insert( new Cheese( "stilton", 50 ) );
-        InternalFactHandle brie4 = (InternalFactHandle) session.insert( new Cheese( "brie", 50 ) );
-        InternalFactHandle bob5 = (InternalFactHandle) session.insert( new Person( "bob", 50 ) );
-        InternalFactHandle bob6 = (InternalFactHandle) session.insert( new Person( "bob", 50 ) );
+        InternalFactHandle stilton4 = (InternalFactHandle) session.insert( new Cheese( "stilton",
+                                                                                       50 ) );
+        InternalFactHandle brie4 = (InternalFactHandle) session.insert( new Cheese( "brie",
+                                                                                    50 ) );
+        InternalFactHandle bob5 = (InternalFactHandle) session.insert( new Person( "bob",
+                                                                                   50 ) );
+        InternalFactHandle bob6 = (InternalFactHandle) session.insert( new Person( "bob",
+                                                                                   50 ) );
         InternalFactHandle addr3 = (InternalFactHandle) session.insert( new Address( "Tripura" ) );
         InternalFactHandle addr4 = (InternalFactHandle) session.insert( new Address( "Agartala" ) );
 
@@ -719,16 +750,14 @@
         assertEquals( addr3.getObject(),
                       results.get( 13 ) );
 
-        serializedSession = null;
         serializedRulebase = null;
 
-        serializedSession = DroolsStreamUtils.streamOut( session );
+        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
         serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         session.dispose();
-
     }
-
+    
     /*
      * I have tried both the scenarios
      * 1. Remove a rule from a pkg.
@@ -758,7 +787,9 @@
                                                                                     10 ) );
         session.fireAllRules();
 
-        byte[] serializedSession = DroolsStreamUtils.streamOut( session );
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Marshaller marshaller = new Marshaller();
+        ruleBase.writeStatefulSession( session, baos, marshaller );
         byte[] serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         session.dispose();
@@ -770,8 +801,9 @@
 
         // now recreate the rulebase, deserialize the session and test it
         ruleBase = (RuleBase) DroolsStreamUtils.streamIn( serializedRulebase );
-        session = ruleBase.newStatefulSession( new ByteArrayInputStream( serializedSession ) );
-        results = (List) session.getGlobal( "results" );
+        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ), marshaller );
+        results.clear();
+        session.setGlobal( "results", results );
 
         builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_Dynamic3_0.drl" ) ) );
@@ -785,27 +817,29 @@
         InternalFactHandle bob2 = (InternalFactHandle) session.insert( new Person( "bob", 30 ) );
         session.fireAllRules();
 
-        assertEquals( 4,
+        assertEquals( 3,
                       results.size() );
         assertEquals( stilton2.getObject(),
+                      results.get( 0 ) );
+        assertEquals( bob2.getObject(),
                       results.get( 1 ) );
-        assertEquals( bob2.getObject(),
+        assertEquals( bob1.getObject(),
                       results.get( 2 ) );
-        assertEquals( bob1.getObject(),
-                      results.get( 3 ) );
 
-        serializedSession = null;
         serializedRulebase = null;
 
-        serializedSession = DroolsStreamUtils.streamOut( session );
+        baos = new ByteArrayOutputStream();
+        marshaller = new Marshaller();
+        ruleBase.writeStatefulSession( session, baos, marshaller );
         serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         session.dispose();
 
         // now recreate the rulebase, deserialize the session and test it
         ruleBase = (RuleBase) DroolsStreamUtils.streamIn( serializedRulebase );
-        session = ruleBase.newStatefulSession( new ByteArrayInputStream( serializedSession ) );
-        results = (List) session.getGlobal( "results" );
+        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ), marshaller );
+        results.clear();
+        session.setGlobal( "results", results );
 
         // CASE 1: remove rule
         ruleBase.removeRule("org.drools.test", "like stilton");
@@ -816,18 +850,19 @@
         InternalFactHandle bob4 = (InternalFactHandle) session.insert( new Person( "bob", 30 ) );
         session.fireAllRules();
 
-        assertEquals( 6,
+        assertEquals( 2,
                       results.size() );
         assertEquals( bob4.getObject(),
-                      results.get( 4 ) );
+                      results.get( 0 ) );
         assertEquals( bob3.getObject(),
-                      results.get( 5 ) );
+                      results.get( 1 ) );
 
 
         // now recreate the rulebase, deserialize the session and test it
         ruleBase = (RuleBase) DroolsStreamUtils.streamIn( serializedRulebase );
-        session = ruleBase.newStatefulSession( new ByteArrayInputStream( serializedSession ) );
-        results = (List) session.getGlobal( "results" );
+        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ), marshaller );
+        results.clear();
+        session.setGlobal( "results", results );
 
         // CASE 2: remove pkg
         ruleBase.removePackage("org.drools.test");
@@ -838,23 +873,26 @@
         InternalFactHandle bob6 = (InternalFactHandle) session.insert( new Person( "bob", 30 ) );
         session.fireAllRules();
 
-        assertEquals( 6,
+        assertEquals( 2,
                       results.size() );
         assertEquals( bob6.getObject(),
-                      results.get( 4 ) );
+                      results.get( 0 ) );
         assertEquals( bob5.getObject(),
-                      results.get( 5 ) );
+                      results.get( 1 ) );
 
-        serializedSession = null;
+        byte[] serializedSession = null;
         serializedRulebase = null;
-        serializedSession = DroolsStreamUtils.streamOut( session );
+        baos = new ByteArrayOutputStream();
+        marshaller = new Marshaller();
+        ruleBase.writeStatefulSession( session, baos,marshaller  );
         serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         session.dispose();
         // Deserialize the rulebase and the session 
         ruleBase = (RuleBase) DroolsStreamUtils.streamIn( serializedRulebase );
-        session = ruleBase.newStatefulSession( new ByteArrayInputStream( serializedSession ) );    //  throws java.lang.ClassNotFoundException Exception
-        results = (List) session.getGlobal( "results" );
+        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ), marshaller );    //  throws java.lang.ClassNotFoundException Exception
+        results.clear();
+        session.setGlobal( "results", results );
              
         InternalFactHandle stilton5 = (InternalFactHandle) session.insert( new Cheese( "stilton", 30 ) );
         InternalFactHandle brie5 = (InternalFactHandle) session.insert( new Cheese( "brie", 30 ) );
@@ -862,22 +900,22 @@
         InternalFactHandle bob8 = (InternalFactHandle) session.insert( new Person( "bob", 40 ) );
         session.fireAllRules();
  
-        assertEquals( 8,
+        assertEquals( 2,
                       results.size() );
         assertEquals( bob8.getObject(),
-                      results.get( 6 ) );
+                      results.get( 0 ) );
         assertEquals( bob7.getObject(),
-                      results.get( 7 ) );
+                      results.get( 1 ) );
        
         serializedSession = null;
         serializedRulebase = null;
        
-        serializedSession = DroolsStreamUtils.streamOut( session );
+        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
         serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
        
         session.dispose();        
        
-    }
+    }    
 
     /**
      * In this case we are dealing with facts which are not on the systems classpath.
@@ -886,7 +924,7 @@
     public void testSerializabilityWithJarFacts() throws Exception {
         MapBackedClassLoader loader = new MapBackedClassLoader( this.getClass().getClassLoader() );
 
-        JarInputStream jis = new JarInputStream(this.getClass().getResourceAsStream("/billasurf.jar"));
+        JarInputStream jis = new JarInputStream( this.getClass().getResourceAsStream( "/billasurf.jar" ) );
 
         JarEntry entry = null;
         byte[] buf = new byte[1024];
@@ -895,26 +933,28 @@
             if ( !entry.isDirectory() ) {
                 ByteArrayOutputStream out = new ByteArrayOutputStream();
                 while ( (len = jis.read( buf )) >= 0 ) {
-                    out.write( buf, 0, len );
+                    out.write( buf,
+                               0,
+                               len );
                 }
-                loader.addResource( entry.getName() , out.toByteArray() );
+                loader.addResource( entry.getName(),
+                                    out.toByteArray() );
             }
         }
 
-        String drl = "package foo.bar \n" +
-        			"import com.billasurf.Board\n" +
-        			"rule 'MyGoodRule' \n dialect 'mvel' \n when Board() then System.err.println(42); \n end\n";
+        String drl = "package foo.bar \n" + "import com.billasurf.Board\n" + "rule 'MyGoodRule' \n dialect 'mvel' \n when Board() then System.err.println(42); \n end\n";
 
-        PackageBuilder builder = new PackageBuilder(new PackageBuilderConfiguration(loader));
-        builder.addPackageFromDrl(new StringReader(drl));
-        assertFalse(builder.hasErrors());
+        PackageBuilder builder = new PackageBuilder( new PackageBuilderConfiguration( loader ) );
+        builder.addPackageFromDrl( new StringReader( drl ) );
+        assertFalse( builder.hasErrors() );
 
         Package p = builder.getPackage();
-        byte[] ser = DroolsStreamUtils.streamOut(p);
+        byte[] ser = DroolsStreamUtils.streamOut( p );
 
         //now read it back
-        Package p_ = (Package) DroolsStreamUtils.streamIn(ser, loader);
-        assertNotNull(p_);
+        Package p_ = (Package) DroolsStreamUtils.streamIn( ser,
+                                                           loader );
+        assertNotNull( p_ );
 
     }
 
@@ -925,10 +965,10 @@
     }
 
     protected RuleBase getRuleBase(Package pkg) throws Exception {
-        RuleBase    ruleBase    = getRuleBase();
+        RuleBase ruleBase = getRuleBase();
 
-        ruleBase.addPackage(pkg);
-        return SerializationHelper.serializeObject(ruleBase);
+        ruleBase.addPackage( pkg );
+        return SerializationHelper.serializeObject( ruleBase );
     }
 
     protected RuleBase getRuleBase(final RuleBaseConfiguration config) throws Exception {

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2008-05-17 22:10:51 UTC (rev 19996)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2008-05-18 03:08:35 UTC (rev 19997)
@@ -147,18 +147,19 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
         final Cheese cheese = new Cheese( "stilton",
                                           15 );
-        workingMemory.insert( cheese );
+        session.insert( cheese );
         List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-        workingMemory   = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+        session.setGlobal( "list",
+                           list );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
 
-        list    = (List)workingMemory.getGlobal("list");
+        list = (List) session.getGlobal( "list" );
         assertEquals( 4,
                       list.size() );
 
@@ -179,49 +180,40 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
 
         // will test serialisation of int and typesafe enums tests
-        workingMemory   = ruleBase.newStatefulSession( new ByteArrayInputStream( DroolsStreamUtils.streamOut(  workingMemory  )) );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
 
         List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
+        session.setGlobal( "list",
+                           list );
 
         final Cheesery cheesery1 = new Cheesery();
         cheesery1.setStatus( Cheesery.SELLING_CHEESE );
         cheesery1.setMaturity( Maturity.OLD );
-        workingMemory.insert( cheesery1 );
+        session.insert( cheesery1 );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
 
         final Cheesery cheesery2 = new Cheesery();
         cheesery2.setStatus( Cheesery.MAKING_CHEESE );
         cheesery2.setMaturity( Maturity.YOUNG );
-        workingMemory.insert( cheesery2 );
+        session.insert( cheesery2 );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
 
-        workingMemory.fireAllRules();
+        session.fireAllRules();
 
         assertEquals( 2,
                       list.size() );
 
-        assertSame( cheesery1, list.get( 0 ) );
         assertEquals( cheesery1,
                       list.get( 0 ) );
-        assertSame( cheesery2, list.get( 1 ) );
         assertEquals( cheesery2,
                       list.get( 1 ) );
-
-        // test list after serialising
-        workingMemory   = ruleBase.newStatefulSession( new ByteArrayInputStream( DroolsStreamUtils.streamOut(  workingMemory  )) );
-        list = (List) workingMemory.getGlobal( "list" );
-	    workingMemory.fireAllRules();
-
-		assertEquals(2, list.size());
-
-		assertNotSame( cheesery1, list.get( 0 ) );
-		assertEquals(cheesery1, list.get(0));
-		assertNotSame( cheesery2, list.get( 1 ) );
-		assertEquals(cheesery2, list.get(1));
     }
 
     public void testPrimitiveArray() throws Exception {
@@ -231,22 +223,23 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
         List result = new ArrayList();
-        workingMemory.setGlobal( "result",
-                                 result );
+        session.setGlobal( "result",
+                           result );
 
         final Primitives p1 = new Primitives();
         p1.setPrimitiveArrayAttribute( new int[]{1, 2, 3} );
         p1.setArrayAttribute( new String[]{"a", "b"} );
 
-        workingMemory.insert( p1 );
+        session.insert( p1 );
 
-        workingMemory   = SerializationHelper.serializeObject(workingMemory);
-        result = (List) workingMemory.getGlobal( "result" );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        result = (List) session.getGlobal( "result" );
 
-        workingMemory.fireAllRules();
+        session.fireAllRules();
         assertEquals( 3,
                       result.size() );
         assertEquals( 3,
@@ -264,15 +257,16 @@
         final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "MVEL_soundex.drl" ) );
         RuleBase ruleBase = loadRuleBase( reader );
 
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
 
-        workingMemory    = SerializationHelper.serializeObject(workingMemory);
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
         Cheese c = new Cheese( "fubar",
                                2 );
 
-        workingMemory.insert( c );
-        workingMemory.fireAllRules();
+        session.insert( c );
+        session.fireAllRules();
         assertEquals( 42,
                       c.getPrice() );
     }
@@ -285,25 +279,26 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
+        session.setGlobal( "list",
+                           list );
 
-        workingMemory.setGlobal( "string",
-                                 "stilton" );
+        session.setGlobal( "string",
+                           "stilton" );
 
         final Cheese stilton = new Cheese( "stilton",
                                            5 );
-        workingMemory.insert( stilton );
+        session.insert( stilton );
 
-        workingMemory    = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
 
         assertEquals( new Integer( 5 ),
-                      ((List)workingMemory.getGlobal("list")).get( 0 ) );
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
     }
 
     public void testGlobals2() throws Exception {
@@ -314,65 +309,53 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
 
         final List results = new ArrayList();
-        workingMemory.setGlobal( "results",
-                                 results );
+        session.setGlobal( "results",
+                           results );
 
         final List cheeseTypes = new ArrayList();
-        workingMemory.setGlobal( "cheeseTypes",
-                                 cheeseTypes );
+        session.setGlobal( "cheeseTypes",
+                           cheeseTypes );
         cheeseTypes.add( "stilton" );
         cheeseTypes.add( "muzzarela" );
 
         final Cheese stilton = new Cheese( "stilton",
                                            5 );
-        workingMemory.insert( stilton );
+        session.insert( stilton );
 
-        workingMemory    = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
 
         assertEquals( 1,
-                      ((List)workingMemory.getGlobal("results")).size() );
+                      ((List) session.getGlobal( "results" )).size() );
         assertEquals( "memberOf",
-                      ((List)workingMemory.getGlobal("results")).get( 0 ) );
+                      ((List) session.getGlobal( "results" )).get( 0 ) );
 
         final Cheese brie = new Cheese( "brie",
                                         5 );
-        workingMemory.insert( brie );
-        workingMemory    = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+        session.insert( brie );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
 
         assertEquals( 2,
-                      ((List)workingMemory.getGlobal("results")).size() );
+                      ((List) session.getGlobal( "results" )).size() );
         assertEquals( "not memberOf",
-                      ((List)workingMemory.getGlobal("results")).get( 1 ) );
+                      ((List) session.getGlobal( "results" )).get( 1 ) );
     }
 
     public void testGlobalMerge() throws Exception {
         // from JBRULES-1512
-        String rule1 = "package com.sample\n" +
-        "rule \"rule 1\"\n" +
-        "    salience 10\n"+
-        "    when\n" +
-        "    l : java.util.List()\n" +
-        "    then\n" +
-        "        l.add( \"rule 1 executed\" );\n" +
-        "end\n";
+        String rule1 = "package com.sample\n" + "rule \"rule 1\"\n" + "    salience 10\n" + "    when\n" + "    l : java.util.List()\n" + "    then\n" + "        l.add( \"rule 1 executed\" );\n" + "end\n";
 
-        String rule2 = "package com.sample\n" +
-        "global String str;\n" +
-        "rule \"rule 2\"\n" +
-        "    when\n" +
-        "    l : java.util.List()\n" +
-        "    then\n" +
-        "        l.add( \"rule 2 executed \" + str);\n" +
-        "end\n";
+        String rule2 = "package com.sample\n" + "global String str;\n" + "rule \"rule 2\"\n" + "    when\n" + "    l : java.util.List()\n" + "    then\n" + "        l.add( \"rule 2 executed \" + str);\n" + "end\n";
 
         PackageBuilder builder1 = new PackageBuilder();
-        builder1.addPackageFromDrl( new StringReader( rule1 ));
+        builder1.addPackageFromDrl( new StringReader( rule1 ) );
         Package pkg1 = builder1.getPackage();
         // build second package
         PackageBuilder builder2 = new PackageBuilder();
@@ -380,16 +363,19 @@
         Package pkg2 = builder2.getPackage();
         // create rule base and add both packages
         RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-        ruleBase.addPackage(pkg1);
-        ruleBase.addPackage(pkg2);
+        ruleBase.addPackage( pkg1 );
+        ruleBase.addPackage( pkg2 );
 
         WorkingMemory wm = ruleBase.newStatefulSession();
-        wm.setGlobal(  "str", "boo" );
+        wm.setGlobal( "str",
+                      "boo" );
         List list = new ArrayList();
-        wm.insert(  list );
+        wm.insert( list );
         wm.fireAllRules();
-        assertEquals( "rule 1 executed", list.get(  0 ) );
-        assertEquals( "rule 2 executed boo", list.get(  1 ));
+        assertEquals( "rule 1 executed",
+                      list.get( 0 ) );
+        assertEquals( "rule 2 executed boo",
+                      list.get( 1 ) );
     }
 
     public void testCustomGlobalResolver() throws Exception {
@@ -399,7 +385,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final Map map = new HashMap();
@@ -412,7 +398,8 @@
                  string );
 
         workingMemory.setGlobalResolver( new GlobalResolver() {
-            public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+            public void readExternal(ObjectInput in) throws IOException,
+                                                    ClassNotFoundException {
             }
 
             public void writeExternal(ObjectOutput out) throws IOException {
@@ -449,7 +436,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final Map map = new HashMap();
@@ -472,7 +459,8 @@
                          value );
             }
 
-            public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+            public void readExternal(ObjectInput in) throws IOException,
+                                                    ClassNotFoundException {
             }
 
             public void writeExternal(ObjectOutput out) throws IOException {
@@ -515,46 +503,50 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory wm = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
 
         List list = new ArrayList();
-        wm.setGlobal( "list",
-                      list );
+        session.setGlobal( "list",
+                           list );
 
         final TestParam tp1 = new TestParam();
         tp1.setValue2( "boo" );
-        wm.insert( tp1 );
+        session.insert( tp1 );
 
-        wm   = SerializationHelper.serializeObject(wm);
-        wm.fireAllRules();
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
 
-        assertEquals( 1, ((List)wm.getGlobal("list")).size() );
+        assertEquals( 1,
+                      ((List) session.getGlobal( "list" )).size() );
     }
 
     public void testGeneratedBeans() throws Exception {
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_GeneratedBeans.drl" ) ) );
-        assertFalse("" + builder.getErrors(), builder.hasErrors());
+        assertFalse( "" + builder.getErrors(),
+                     builder.hasErrors() );
 
         Package p = builder.getPackage();
-        assertEquals(2, p.getRules().length);
+        assertEquals( 2,
+                      p.getRules().length );
 
         //to test it we will generate another class that looks just like it
         ClassBuilder cb = new ClassBuilder();
-        ClassDefinition def = new ClassDefinition("org.drools.generatedbeans.Cheese");
-        def.addField(new FieldDefinition("type", "java.lang.String"));
-        byte[] classdata = cb.buildClass(def);
-        MapBackedClassLoader cl = new MapBackedClassLoader(this.getClass().getClassLoader());
-        cl.addClass("org.drools.generatedbeans.Cheese", classdata);
+        ClassDefinition def = new ClassDefinition( "org.drools.generatedbeans.Cheese" );
+        def.addField( new FieldDefinition( "type",
+                                           "java.lang.String" ) );
+        byte[] classdata = cb.buildClass( def );
+        MapBackedClassLoader cl = new MapBackedClassLoader( this.getClass().getClassLoader() );
+        cl.addClass( "org.drools.generatedbeans.Cheese",
+                     classdata );
 
-
         //this one doesn't work
-        RuleBase ruleBase = RuleBaseFactory.newRuleBase(new RuleBaseConfiguration(cl));
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase( new RuleBaseConfiguration( cl ) );
 
-
         //this one does work...
-        ruleBase = RuleBaseFactory.newRuleBase(new RuleBaseConfiguration(p.getDialectDatas().getClassLoader()));
+        ruleBase = RuleBaseFactory.newRuleBase( new RuleBaseConfiguration( p.getDialectDatas().getClassLoader() ) );
 
         ruleBase.addPackage( p );
 
@@ -562,24 +554,23 @@
         //Class cc = cl.loadClass("org.drools.generatedbeans.Cheese");
 
         //this one has an error with shadow proxies unless I use the same classloader as the package...
-        Class cc = p.getDialectDatas().getClassLoader().loadClass("org.drools.generatedbeans.Cheese");
+        Class cc = p.getDialectDatas().getClassLoader().loadClass( "org.drools.generatedbeans.Cheese" );
 
         Object cheese = cc.newInstance();
 
         WorkingMemory wm = ruleBase.newStatefulSession();
         List result = new ArrayList();
-        wm.setGlobal("list", result);
+        wm.setGlobal( "list",
+                      result );
 
-        wm.insert(cheese);
+        wm.insert( cheese );
         wm.fireAllRules();
-        assertEquals(1, result.size());
-        Integer r = (Integer) result.get(0);
-        assertEquals(new Integer(5), r);
+        assertEquals( 1,
+                      result.size() );
+        Integer r = (Integer) result.get( 0 );
+        assertEquals( new Integer( 5 ),
+                      r );
 
-
-
-
-
     }
 
     public void testNullHandling() throws Exception {
@@ -590,32 +581,33 @@
         // add the package to a rulebase
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
 
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        StatefulSession session = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
+        session.setGlobal( "list",
+                           list );
         final Cheese nullCheese = new Cheese( null,
                                               2 );
-        workingMemory.insert( nullCheese );
+        session.insert( nullCheese );
 
         final Person notNullPerson = new Person( "shoes butt back" );
         notNullPerson.setBigDecimal( new BigDecimal( "42.42" ) );
 
-        workingMemory.insert( notNullPerson );
+        session.insert( notNullPerson );
 
         final Person nullPerson = new Person( "whee" );
         nullPerson.setBigDecimal( null );
 
-        workingMemory.insert( nullPerson );
+        session.insert( nullPerson );
 
-        workingMemory   = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
-        System.out.println( ((List)workingMemory.getGlobal("list")).get( 0 ) );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
+        System.out.println( ((List) session.getGlobal( "list" )).get( 0 ) );
         assertEquals( 3,
-                      ((List)workingMemory.getGlobal("list")).size() );
+                      ((List) session.getGlobal( "list" )).size() );
 
     }
 
@@ -627,7 +619,7 @@
         // add the package to a rulebase
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
 
         WorkingMemory workingMemory = ruleBase.newStatefulSession();
         List list = new ArrayList();
@@ -636,13 +628,13 @@
 
         workingMemory.insert( new Attribute() );
         workingMemory.insert( new Message() );
-        workingMemory   = SerializationHelper.serializeObject(workingMemory);
+        workingMemory = SerializationHelper.serializeObject( workingMemory );
         workingMemory.fireAllRules();
 
         assertEquals( 1,
-                      ((List)workingMemory.getGlobal("list")).size() );
+                      ((List) workingMemory.getGlobal( "list" )).size() );
         assertEquals( "X",
-                      ((List)workingMemory.getGlobal("list")).get( 0 ) );
+                      ((List) workingMemory.getGlobal( "list" )).get( 0 ) );
 
     }
 
@@ -655,23 +647,24 @@
         // add the package to a rulebase
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
 
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        StatefulSession session = ruleBase.newStatefulSession();
 
         List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
+        session.setGlobal( "list",
+                           list );
 
         final Cheese stilton = new Cheese( "stilton",
                                            5 );
-        workingMemory.insert( stilton );
+        session.insert( stilton );
 
-        workingMemory   = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
 
         assertEquals( 5,
-                      ((List)workingMemory.getGlobal("list")).get( 0 ) );
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
     }
 
     private RuleBase loadRuleBase(final Reader reader) throws IOException,
@@ -691,7 +684,7 @@
         // add the package to a rulebase
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         // load up the rulebase
         return ruleBase;
     }
@@ -700,23 +693,24 @@
         final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_ExplicitAnd.drl" ) );
         final RuleBase ruleBase = loadRuleBase( reader );
 
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        StatefulSession session = ruleBase.newStatefulSession();
         final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-        workingMemory.insert( new Message( "hola" ) );
+        session.setGlobal( "list",
+                           list );
+        session.insert( new Message( "hola" ) );
 
-        workingMemory.fireAllRules();
+        session.fireAllRules();
         assertEquals( 0,
                       list.size() );
 
-        workingMemory.insert( new Cheese( "brie",
-                                          33 ) );
+        session.insert( new Cheese( "brie",
+                                    33 ) );
 
-        workingMemory    = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
         assertEquals( 1,
-                      ((List)workingMemory.getGlobal("list")).size() );
+                      ((List) session.getGlobal( "list" )).size() );
     }
 
     public void testHelloWorld() throws Exception {
@@ -738,11 +732,11 @@
 
         workingMemory.insert( message );
         workingMemory.insert( "boo" );
-//        workingMemory    = SerializationHelper.serializeObject(workingMemory);
+        //        workingMemory    = SerializationHelper.serializeObject(workingMemory);
         workingMemory.fireAllRules();
         assertTrue( message.isFired() );
         assertEquals( message,
-                      ((List)workingMemory.getGlobal("list")).get( 0 ) );
+                      ((List) workingMemory.getGlobal( "list" )).get( 0 ) );
 
     }
 
@@ -753,22 +747,23 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
+        session.setGlobal( "list",
+                           list );
 
         final Cheese stilton = new Cheese( "stilton",
                                            5 );
-        workingMemory.insert( stilton );
-        workingMemory    = SerializationHelper.serializeObject(workingMemory);
+        session.insert( stilton );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
 
-        workingMemory.fireAllRules();
+        session.fireAllRules();
 
         assertEquals( "stilton",
-                      ((List)workingMemory.getGlobal("list")).get( 0 ) );
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
     }
 
     public void testLiteralWithBoolean() throws Exception {
@@ -778,24 +773,25 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
+        session.setGlobal( "list",
+                           list );
 
         final PersonInterface bill = new Person( "bill",
                                                  null,
                                                  12 );
         bill.setAlive( true );
-        workingMemory.insert( bill );
-        workingMemory    = SerializationHelper.serializeObject(workingMemory);
+        session.insert( bill );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
 
-        workingMemory.fireAllRules();
+        session.fireAllRules();
 
         assertEquals( bill,
-                      ((List)workingMemory.getGlobal("list")).get( 0 ) );
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
     }
 
     public void testFactBindings() throws Exception {
@@ -806,7 +802,7 @@
         // add the package to a rulebase
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List events = new ArrayList();
@@ -851,7 +847,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -864,61 +860,62 @@
                                "stilton" );
         stilton.setFieldValue( "price",
                                new Integer( 100 ) );
-        InternalFactHandle stiltonHandle = ( InternalFactHandle ) workingMemory.insert( stilton );
+        InternalFactHandle stiltonHandle = (InternalFactHandle) workingMemory.insert( stilton );
         // TODO does not work for facts now. adding equals(object) to it.
-//        workingMemory    = SerializationHelper.serializeObject(workingMemory);
+        //        workingMemory    = SerializationHelper.serializeObject(workingMemory);
 
         workingMemory.fireAllRules();
 
         assertEquals( 1,
-                      ((List)workingMemory.getGlobal("list")).size() );
+                      ((List) workingMemory.getGlobal( "list" )).size() );
         assertEquals( stilton,
-                      ((List)workingMemory.getGlobal("list")).get( 0 ) );
-        final Fact fact = (Fact) ((List)workingMemory.getGlobal("list")).get( 0 );
+                      ((List) workingMemory.getGlobal( "list" )).get( 0 ) );
+        final Fact fact = (Fact) ((List) workingMemory.getGlobal( "list" )).get( 0 );
         assertEquals( stilton,
-                    fact );
+                      fact );
         assertEquals( new Integer( 200 ),
                       fact.getFieldValue( "price" ) );
-        assertEquals( -1, stiltonHandle.getId() );
+        assertEquals( -1,
+                      stiltonHandle.getId() );
     }
 
     public void testFactTemplateFieldBinding() throws Exception {
         // from JBRULES-1512
-        String rule1 = "package org.drools.entity\n" +
-        " global java.util.List list\n" +
-        "template Settlement\n" +
-        "    String InstrumentType\n" +
-        "    String InstrumentName\n" +
-        "end\n"  +
-        "rule TestEntity\n" +
+        String rule1 = "package org.drools.entity\n";
+        rule1 += " global java.util.List list\n";
+        rule1 += "template Settlement\n";
+        rule1 += "    String InstrumentType\n";
+        rule1 += "    String InstrumentName\n";
+        rule1 += "end\n" + "rule TestEntity\n";
+        rule1 += "    when\n";
+        rule1 += "        Settlement(InstrumentType == \"guitar\", name : InstrumentName)\n";
+        rule1 += "    then \n";
+        rule1 += "        list.add( name ) ;\n";
+        rule1 += "end\n";
 
-        "    when\n" +
-        "        Settlement(InstrumentType == \"guitar\", name : InstrumentName)\n" +
-        "    then \n" +
-        "        list.add( name ) ;\n" +
-        "end\n";
-
         PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new StringReader( rule1 ));
+        builder.addPackageFromDrl( new StringReader( rule1 ) );
         Package pkg = builder.getPackage();
 
         RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-        ruleBase.addPackage(pkg);
+        ruleBase.addPackage( pkg );
 
         WorkingMemory wm = ruleBase.newStatefulSession();
         List list = new ArrayList();
-        wm.setGlobal(  "list", list );
+        wm.setGlobal( "list",
+                      list );
 
         final FactTemplate cheese = pkg.getFactTemplate( "Settlement" );
         final Fact guitar = cheese.createFact( 0 );
         guitar.setFieldValue( "InstrumentType",
-                               "guitar" );
+                              "guitar" );
         guitar.setFieldValue( "InstrumentName",
-                               "gibson" );
+                              "gibson" );
         wm.insert( guitar );
 
         wm.fireAllRules();
-        assertEquals( "gibson", list.get(  0 ) );
+        assertEquals( "gibson",
+                      list.get( 0 ) );
     }
 
     public void testPropertyChangeSupport() throws Exception {
@@ -928,34 +925,36 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
+        session.setGlobal( "list",
+                           list );
 
         final State state = new State( "initial" );
-        workingMemory.insert( state,
-                              true );
-        workingMemory.fireAllRules();
+        session.insert( state,
+                        true );
+        session.fireAllRules();
 
         assertEquals( 1,
-                      ((List)workingMemory.getGlobal("list")).size() );
+                      ((List) session.getGlobal( "list" )).size() );
 
         state.setFlag( true );
         assertEquals( 1,
-                      ((List)workingMemory.getGlobal("list")).size() );
+                      ((List) session.getGlobal( "list" )).size() );
 
-        workingMemory.fireAllRules();
+        session.fireAllRules();
         assertEquals( 2,
-                      ((List)workingMemory.getGlobal("list")).size() );
+                      ((List) session.getGlobal( "list" )).size() );
 
         state.setState( "finished" );
-//        workingMemory    = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
         assertEquals( 3,
-                      ((List)workingMemory.getGlobal("list")).size() );
+                      ((List) session.getGlobal( "list" )).size() );
 
     }
 
@@ -967,11 +966,11 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
+        session.setGlobal( "list",
                                  list );
 
         final PersonInterface bill = new Person( "bill",
@@ -984,41 +983,45 @@
                                                 13 );
         ben.setBigDecimal( new BigDecimal( "43" ) );
 
-        workingMemory.insert( bill );
-        workingMemory.insert( ben );
-        workingMemory    = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+        session.insert( bill );
+        session.insert( ben );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
 
         assertEquals( 1,
-                      ((List)workingMemory.getGlobal("list")).size() );
+                      ((List) session.getGlobal( "list" )).size() );
     }
 
-	public void testBigDecimalIntegerLiteral() throws Exception {
+    public void testBigDecimalIntegerLiteral() throws Exception {
 
-		final PackageBuilder builder = new PackageBuilder();
-		builder.addPackageFromDrl(new InputStreamReader(getClass()
-				.getResourceAsStream("big_decimal_and_literal.drl")));
-		final Package pkg = builder.getPackage();
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "big_decimal_and_literal.drl" ) ) );
+        final Package pkg = builder.getPackage();
 
-		final RuleBase ruleBase = getRuleBase();
-		ruleBase.addPackage(pkg);
-		WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        StatefulSession session = ruleBase.newStatefulSession();
 
-		final List list = new ArrayList();
-		workingMemory.setGlobal("list", list);
+        final List list = new ArrayList();
+        session.setGlobal( "list",
+                                 list );
 
-		final PersonInterface bill = new Person("bill", null, 12);
-		bill.setBigDecimal(new BigDecimal("42"));
-		bill.setBigInteger(new BigInteger("42"));
+        final PersonInterface bill = new Person( "bill",
+                                                 null,
+                                                 12 );
+        bill.setBigDecimal( new BigDecimal( "42" ) );
+        bill.setBigInteger( new BigInteger( "42" ) );
 
-		workingMemory.insert(bill);
-        workingMemory    = SerializationHelper.serializeObject(workingMemory);
-		workingMemory.fireAllRules();
+        session.insert( bill );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
 
-		assertEquals(6, ((List)workingMemory.getGlobal("list")).size());
-	}
+        assertEquals( 6,
+                      ((List) session.getGlobal( "list" )).size() );
+    }
 
-
     // @FIXME
     public void FIXME_testBigDecimalWithFromAndEval() throws Exception {
         String rule = "package org.test;\n";
@@ -1069,13 +1072,14 @@
         List list = new ArrayList();
         session.setGlobal( "list",
                            list );
-        session = SerializationHelper.serializeObject(session);
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
         session.fireAllRules();
 
         assertEquals( 1,
-                      ((List)session.getGlobal("list")).size() );
+                      ((List) session.getGlobal( "list" )).size() );
         assertEquals( "first",
-                      ((List)session.getGlobal("list")).get( 0 ) );
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
     }
 
     public void testCell() throws Exception {
@@ -1087,14 +1091,15 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( builder.getPackage() );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
 
-        WorkingMemory memory = ruleBase.newStatefulSession();
-        memory.insert( cell1 );
-        memory.insert( cell );
-        // TODO org.drools.spi.ConsequenceException: org.drools.FactException: Update error: handle not found for object: org.drools.Cell at 1654. Is it in the working memory?
-//        memory    = SerializationHelper.serializeObject(memory);
-        memory.fireAllRules();
+        StatefulSession session = ruleBase.newStatefulSession();
+        session.insert( cell1 );
+        FactHandle cellHandle = session.insert( cell );
+
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
         assertEquals( 9,
                       cell.getValue() );
     }
@@ -1141,12 +1146,13 @@
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( builder.getPackage() );
 
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory memory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
 
-        memory.insert( p );
-        memory    = SerializationHelper.serializeObject(memory);
-        memory.fireAllRules();
+        session.insert( p );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
 
     }
 
@@ -1157,17 +1163,17 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
         final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
+        session.setGlobal( "list",
                                  list );
 
         final Cheese cheddar = new Cheese( "cheddar",
                                            5 );
-        final FactHandle h = workingMemory.insert( cheddar );
+        final FactHandle h = session.insert( cheddar );
 
-        workingMemory.fireAllRules();
+        session.fireAllRules();
 
         // just one added
         assertEquals( "got cheese",
@@ -1175,21 +1181,22 @@
         assertEquals( 1,
                       list.size() );
 
-        workingMemory.retract( h );
-        workingMemory.fireAllRules();
+        session.retract( h );
+        session.fireAllRules();
 
         // still just one
         assertEquals( 1,
                       list.size() );
 
-        workingMemory.insert( new Cheese( "stilton",
+        session.insert( new Cheese( "stilton",
                                           5 ) );
-        workingMemory    = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
 
         // now have one more
         assertEquals( 2,
-                      ((List)workingMemory.getGlobal("list")).size() );
+                      ((List) session.getGlobal( "list" )).size() );
 
     }
 
@@ -1200,14 +1207,15 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
 
         final Cheese stilton = new Cheese( "stinky",
                                            5 );
-        workingMemory.insert( stilton );
-        workingMemory    = SerializationHelper.serializeObject(workingMemory);
-        final QueryResults results = workingMemory.getQueryResults( "simple query" );
+        session.insert( stilton );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        final QueryResults results = session.getQueryResults( "simple query" );
         assertEquals( 1,
                       results.size() );
     }
@@ -1219,23 +1227,24 @@
 
         final RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        StatefulSession session = ruleBase.newStatefulSession();
 
-        workingMemory.setGlobal( "five",
+        session.setGlobal( "five",
                                  new Integer( 5 ) );
 
         final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
+        session.setGlobal( "list",
                                  list );
 
         final Cheese stilton = new Cheese( "stilton",
                                            5 );
-        workingMemory.insert( stilton );
-        workingMemory    = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+        session.insert( stilton );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
 
         assertEquals( stilton,
-                      ((List)workingMemory.getGlobal("list")).get( 0 ) );
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
     }
 
     public void testJaninoEval() throws Exception {
@@ -1249,24 +1258,25 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
 
-        workingMemory.setGlobal( "five",
+        session.setGlobal( "five",
                                  new Integer( 5 ) );
 
         final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
+        session.setGlobal( "list",
                                  list );
 
         final Cheese stilton = new Cheese( "stilton",
                                            5 );
-        workingMemory.insert( stilton );
-        workingMemory    = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+        session.insert( stilton );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
 
         assertEquals( stilton,
-                      ((List)workingMemory.getGlobal("list")).get( 0 ) );
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
     }
 
     public void testEvalMore() throws Exception {
@@ -1276,20 +1286,21 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
+        session.setGlobal( "list",
                                  list );
 
         final Person foo = new Person( "foo" );
-        workingMemory.insert( foo );
-        workingMemory    = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+        session.insert( foo );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
 
         assertEquals( foo,
-                      ((List)workingMemory.getGlobal("list")).get( 0 ) );
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
     }
 
     public void testReturnValue() throws Exception {
@@ -1299,32 +1310,33 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
 
-        workingMemory.setGlobal( "two",
+        session.setGlobal( "two",
                                  new Integer( 2 ) );
 
         final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
+        session.setGlobal( "list",
                                  list );
 
         final PersonInterface peter = new Person( "peter",
                                                   null,
                                                   12 );
-        workingMemory.insert( peter );
+        session.insert( peter );
         final PersonInterface jane = new Person( "jane",
                                                  null,
                                                  10 );
-        workingMemory.insert( jane );
+        session.insert( jane );
 
-        workingMemory    = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
-
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
+        
         assertEquals( jane,
-                      ((List)workingMemory.getGlobal("list")).get( 0 ) );
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
         assertEquals( peter,
-                      ((List)workingMemory.getGlobal("list")).get( 1 ) );
+                      ((List) session.getGlobal( "list" )).get( 1 ) );
     }
 
     public void testPredicate() throws Exception {
@@ -1334,32 +1346,33 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
 
-        workingMemory.setGlobal( "two",
+        session.setGlobal( "two",
                                  new Integer( 2 ) );
 
         final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
+        session.setGlobal( "list",
                                  list );
 
         final PersonInterface peter = new Person( "peter",
                                                   null,
                                                   12 );
-        workingMemory.insert( peter );
+        session.insert( peter );
         final PersonInterface jane = new Person( "jane",
                                                  null,
                                                  10 );
-        workingMemory.insert( jane );
+        session.insert( jane );
 
-        workingMemory   = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();        
 
         assertEquals( jane,
-                      ((List)workingMemory.getGlobal("list")).get( 0 ) );
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
         assertEquals( peter,
-                      ((List)workingMemory.getGlobal("list")).get( 1 ) );
+                      ((List) session.getGlobal( "list" )).get( 1 ) );
     }
 
     public void testNullBehaviour() throws Exception {
@@ -1369,8 +1382,8 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
 
         final PersonInterface p1 = new Person( "michael",
                                                "food",
@@ -1378,11 +1391,12 @@
         final PersonInterface p2 = new Person( null,
                                                "drink",
                                                30 );
-        workingMemory.insert( p1 );
-        workingMemory.insert( p2 );
+        session.insert( p1 );
+        session.insert( p2 );
 
-        workingMemory    = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
     }
 
     public void testNullConstraint() throws Exception {
@@ -1392,10 +1406,10 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
         final List foo = new ArrayList();
-        workingMemory.setGlobal( "messages",
+        session.setGlobal( "messages",
                                  foo );
 
         final PersonInterface p1 = new Person( null,
@@ -1404,13 +1418,14 @@
         final Primitives p2 = new Primitives();
         p2.setArrayAttribute( null );
 
-        workingMemory.insert( p1 );
-        workingMemory.insert( p2 );
+        session.insert( p1 );
+        session.insert( p2 );
 
-        workingMemory    = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
         assertEquals( 2,
-                      ((List)workingMemory.getGlobal("messages")).size() );
+                      ((List) session.getGlobal( "messages" )).size() );
 
     }
 
@@ -1421,7 +1436,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
 
         WorkingMemory workingMemory = ruleBase.newStatefulSession();
         final List list1 = new ArrayList();
@@ -1449,32 +1464,32 @@
         workingMemory.insert( p );
 
         // TODO - can not serializing rule with basic from: java.io.EOFException.
-//        workingMemory    = SerializationHelper.serializeObject(workingMemory);
+        //        workingMemory    = SerializationHelper.serializeObject(workingMemory);
         workingMemory.fireAllRules();
-//        workingMemory    = SerializationHelper.serializeObject(workingMemory);
+        //        workingMemory    = SerializationHelper.serializeObject(workingMemory);
         workingMemory.fireAllRules();
 
         // from using a global
         assertEquals( 2,
-                      ((List)workingMemory.getGlobal("list1")).size() );
+                      ((List) workingMemory.getGlobal( "list1" )).size() );
         assertEquals( cheddar,
-                      ((List)workingMemory.getGlobal("list1")).get( 0 ) );
+                      ((List) workingMemory.getGlobal( "list1" )).get( 0 ) );
         assertEquals( stilton,
-                      ((List)workingMemory.getGlobal("list1")).get( 1 ) );
+                      ((List) workingMemory.getGlobal( "list1" )).get( 1 ) );
 
         // from using a declaration
         assertEquals( 2,
-                      ((List)workingMemory.getGlobal("list2")).size() );
+                      ((List) workingMemory.getGlobal( "list2" )).size() );
         assertEquals( cheddar,
-                      ((List)workingMemory.getGlobal("list2")).get( 0 ) );
+                      ((List) workingMemory.getGlobal( "list2" )).get( 0 ) );
         assertEquals( stilton,
-                      ((List)workingMemory.getGlobal("list2")).get( 1 ) );
+                      ((List) workingMemory.getGlobal( "list2" )).get( 1 ) );
 
         // from using a declaration
         assertEquals( 1,
-                      ((List)workingMemory.getGlobal("list3")).size() );
+                      ((List) workingMemory.getGlobal( "list3" )).size() );
         assertEquals( stilton,
-                      ((List)workingMemory.getGlobal("list3")).get( 0 ) );
+                      ((List) workingMemory.getGlobal( "list3" )).get( 0 ) );
     }
 
     public void testFromWithParams() throws Exception {
@@ -1484,7 +1499,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
 
         WorkingMemory workingMemory = ruleBase.newStatefulSession();
         List list = new ArrayList();
@@ -1500,13 +1515,13 @@
         workingMemory.insert( bob );
 
         // TODO java.io.NotSerializableException: org.mvel.util.FastList
-//        workingMemory    = SerializationHelper.serializeObject(workingMemory);
+        //        workingMemory    = SerializationHelper.serializeObject(workingMemory);
         workingMemory.fireAllRules();
 
         assertEquals( 6,
-                      ((List)workingMemory.getGlobal("list")).size() );
+                      ((List) workingMemory.getGlobal( "list" )).size() );
 
-        final List array = (List) ((List)workingMemory.getGlobal("list")).get( 0 );
+        final List array = (List) ((List) workingMemory.getGlobal( "list" )).get( 0 );
         assertEquals( 3,
                       array.size() );
         final Person p = (Person) array.get( 0 );
@@ -1522,7 +1537,7 @@
         assertEquals( "y",
                       nested.get( 1 ) );
 
-        final Map map = (Map) ((List)workingMemory.getGlobal("list")).get( 1 );
+        final Map map = (Map) ((List) workingMemory.getGlobal( "list" )).get( 1 );
         assertEquals( 2,
                       map.keySet().size() );
 
@@ -1539,13 +1554,13 @@
                       nestedMap.get( "key2" ) );
 
         assertEquals( new Integer( 42 ),
-                      ((List)workingMemory.getGlobal("list")).get( 2 ) );
+                      ((List) workingMemory.getGlobal( "list" )).get( 2 ) );
         assertEquals( "literal",
-                      ((List)workingMemory.getGlobal("list")).get( 3 ) );
+                      ((List) workingMemory.getGlobal( "list" )).get( 3 ) );
         assertEquals( bob,
-                    ((List)workingMemory.getGlobal("list")).get( 4 ) );
+                      ((List) workingMemory.getGlobal( "list" )).get( 4 ) );
         assertEquals( globalObject,
-                    ((List)workingMemory.getGlobal("list")).get( 5 ) );
+                      ((List) workingMemory.getGlobal( "list" )).get( 5 ) );
     }
 
     public void testFromWithNewConstructor() throws Exception {
@@ -1555,7 +1570,7 @@
         builder.addPackage( descr );
         Package pkg = builder.getPackage();
         pkg.checkValidity();
-        pkg = SerializationHelper.serializeObject(pkg);
+        pkg = SerializationHelper.serializeObject( pkg );
     }
 
     /**
@@ -1575,29 +1590,33 @@
         rule += "end";
 
         final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new StringReader( rule ));
+        builder.addPackageFromDrl( new StringReader( rule ) );
         final Package pkg = builder.getPackage();
 
         final RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage(pkg);
+        ruleBase.addPackage( pkg );
         StatefulSession session = ruleBase.newStatefulSession();
 
         WorkingMemoryInMemoryLogger logger = new WorkingMemoryInMemoryLogger( session );
         List list = new ArrayList();
-        session.setGlobal( "list", list );
+        session.setGlobal( "list",
+                           list );
 
         Cheesery cheesery = new Cheesery();
-        cheesery.addCheese(  new Cheese("stilton", 22) );
+        cheesery.addCheese( new Cheese( "stilton",
+                                        22 ) );
 
         session.insert( cheesery );
 
         // TODO java.io.EOFException
-//        session = SerializationHelper.serializeObject(session);
+        //        session = SerializationHelper.serializeObject(session);
         session.fireAllRules();
 
-        assertEquals( 1, ((List)session.getGlobal("list")).size());
-        assertEquals( "stilton", ((List)session.getGlobal("list")).get(0));
-}
+        assertEquals( 1,
+                      ((List) session.getGlobal( "list" )).size() );
+        assertEquals( "stilton",
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
+    }
 
     public void testWithInvalidRule() throws Exception {
         final PackageBuilder builder = new PackageBuilder();
@@ -1617,7 +1636,7 @@
             assertNotNull( e.getMessage() );
             runtime = e;
         }
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         assertTrue( builder.getErrors().getErrors().length > 0 );
 
         final String pretty = builder.getErrors().toString();
@@ -1680,22 +1699,23 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
+        session.setGlobal( "list",
                                  list );
 
         final Cheese stilton = new Cheese( "stilton",
                                            5 );
-        workingMemory.insert( stilton );
+        session.insert( stilton );
 
-        workingMemory    = SerializationHelper.serializeObject(workingMemory);
-        workingMemory.fireAllRules();
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        session.fireAllRules();
 
         assertEquals( new Integer( 5 ),
-                      ((List)workingMemory.getGlobal("list")).get( 0 ) );
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
     }
 
     public void testAssertRetract() throws Exception {
@@ -1706,7 +1726,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -1719,16 +1739,16 @@
         workingMemory.insert( person );
 
         // TODO org.drools.spi.ConsequenceException: org.drools.FactException: Update error: handle not found for object:
-//        workingMemory    = SerializationHelper.serializeObject(workingMemory);
+        //        workingMemory    = SerializationHelper.serializeObject(workingMemory);
         workingMemory.fireAllRules();
 
         assertEquals( 5,
-                      ((List)workingMemory.getGlobal("list")).size() );
-        assertTrue( ((List)workingMemory.getGlobal("list")).contains( "first" ) );
-        assertTrue( ((List)workingMemory.getGlobal("list")).contains( "second" ) );
-        assertTrue( ((List)workingMemory.getGlobal("list")).contains( "third" ) );
-        assertTrue( ((List)workingMemory.getGlobal("list")).contains( "fourth" ) );
-        assertTrue( ((List)workingMemory.getGlobal("list")).contains( "fifth" ) );
+                      ((List) workingMemory.getGlobal( "list" )).size() );
+        assertTrue( ((List) workingMemory.getGlobal( "list" )).contains( "first" ) );
+        assertTrue( ((List) workingMemory.getGlobal( "list" )).contains( "second" ) );
+        assertTrue( ((List) workingMemory.getGlobal( "list" )).contains( "third" ) );
+        assertTrue( ((List) workingMemory.getGlobal( "list" )).contains( "fourth" ) );
+        assertTrue( ((List) workingMemory.getGlobal( "list" )).contains( "fifth" ) );
 
     }
 
@@ -1739,7 +1759,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final Cheese mussarela = new Cheese( "Mussarela",
@@ -1792,7 +1812,7 @@
 
         RuleBase ruleBase = getRuleBase( conf );
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final Cheese brie = new Cheese( "brie",
@@ -1801,7 +1821,7 @@
 
         workingMemory.fireAllRules();
 
-        assertTrue( ((CustomConsequenceExceptionHandler)((ReteooRuleBase)ruleBase).getConfiguration().getConsequenceExceptionHandler()).isCalled() );
+        assertTrue( ((CustomConsequenceExceptionHandler) ((ReteooRuleBase) ruleBase).getConfiguration().getConsequenceExceptionHandler()).isCalled() );
     }
 
     public static class CustomConsequenceExceptionHandler
@@ -1820,12 +1840,13 @@
             return this.called;
         }
 
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            called  = in.readBoolean();
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
+            called = in.readBoolean();
         }
 
         public void writeExternal(ObjectOutput out) throws IOException {
-            out.writeBoolean(called);
+            out.writeBoolean( called );
         }
     }
 
@@ -1836,7 +1857,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final Cheese brie = new Cheese( "brie",
@@ -1859,7 +1880,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final Cheese brie = new Cheese( "brie",
@@ -1882,7 +1903,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final Cheese brie = new Cheese( "brie",
@@ -1905,7 +1926,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final Cheese brie = new Cheese( "brie",
@@ -1927,7 +1948,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list1 = new ArrayList();
@@ -2004,7 +2025,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( builder.getPackage() );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         List list = new ArrayList();
@@ -2089,7 +2110,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -2124,7 +2145,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( builder.getPackage() );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
 
         builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DuplicateRuleName2.drl" ) ) );
@@ -2144,7 +2165,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg1 );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         // Adding person with null name and likes attributes
@@ -2175,7 +2196,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -2195,7 +2216,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -2216,7 +2237,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -2249,7 +2270,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg1 );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
         WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger( workingMemory );
         logger.setFileName( "log_20080401" );
@@ -2287,7 +2308,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( builder.getPackage() );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
 
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
         workingMemory.fireAllRules();
@@ -2305,7 +2326,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( builder.getPackage() );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
 
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
         workingMemory.fireAllRules();
@@ -2347,7 +2368,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final Cheese stilton = new Cheese( "stinky",
@@ -2489,7 +2510,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final Person p1 = new Person( "p1",
@@ -2575,7 +2596,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -2600,7 +2621,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List matchlist = new ArrayList();
@@ -2642,7 +2663,7 @@
 
         RuleBase ruleBase = getRuleBase( config );
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List sensors = new ArrayList();
@@ -2673,7 +2694,7 @@
 
             RuleBase ruleBase = getRuleBase();
             ruleBase.addPackage( pkg );
-            ruleBase    = SerializationHelper.serializeObject(ruleBase);
+            ruleBase = SerializationHelper.serializeObject( ruleBase );
 
             Assert.fail( "Should have thrown an InvalidRulePackage" );
         } catch ( final InvalidRulePackage e ) {
@@ -2692,7 +2713,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -2729,7 +2750,7 @@
 
             RuleBase ruleBase = getRuleBase();
             ruleBase.addPackage( pkg );
-            ruleBase    = SerializationHelper.serializeObject(ruleBase);
+            ruleBase = SerializationHelper.serializeObject( ruleBase );
 
             fail( "Should have trown an exception" );
         } catch ( final InvalidRulePackage e ) {
@@ -2747,7 +2768,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
 
         final WorkingMemory wm = ruleBase.newStatefulSession();
 
@@ -2777,7 +2798,7 @@
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_ImportConflict.drl" ) ) );
         final Package pkg = builder.getPackage();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
     }
 
     public void testEmptyIdentifier() throws Exception {
@@ -2787,7 +2808,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
         final List result = new ArrayList();
         workingMemory.setGlobal( "results",
@@ -2812,7 +2833,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
         final Map result = new HashMap();
         workingMemory.setGlobal( "results",
@@ -2870,7 +2891,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         workingMemory.insert( new Child( "gp" ) );
@@ -2885,7 +2906,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List results = new ArrayList();
@@ -2923,7 +2944,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -2981,7 +3002,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List results = new ArrayList();
@@ -3011,7 +3032,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory wm = ruleBase.newStatefulSession();
 
         final List agendaList = new ArrayList();
@@ -3101,7 +3122,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List results = new ArrayList();
@@ -3126,7 +3147,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         workingMemory.setGlobal( "value",
@@ -3142,7 +3163,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -3181,7 +3202,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -3210,7 +3231,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -3244,7 +3265,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -3271,7 +3292,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final AbstractWorkingMemory workingMemory = (AbstractWorkingMemory) ruleBase.newStatefulSession();
 
         final Cheese stilton = new Cheese( "stilton",
@@ -3303,7 +3324,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List results = new ArrayList();
@@ -3366,7 +3387,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -3424,7 +3445,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -3485,7 +3506,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -3515,7 +3536,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -3586,7 +3607,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -3618,7 +3639,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List results = new ArrayList();
@@ -3643,7 +3664,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List results = new ArrayList();
@@ -3695,7 +3716,7 @@
         conf.setAssertBehaviour( RuleBaseConfiguration.AssertBehaviour.EQUALITY );
         RuleBase ruleBase = getRuleBase( conf );
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List results = new ArrayList();
@@ -3724,7 +3745,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List results = new ArrayList();
@@ -3764,7 +3785,7 @@
         conf.setShareAlphaNodes( false );
         RuleBase ruleBase = getRuleBase( conf );
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List results = new ArrayList();
@@ -3797,7 +3818,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -3823,7 +3844,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -3846,7 +3867,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List results = new ArrayList();
@@ -3896,7 +3917,7 @@
             RuleBase ruleBase = getRuleBase();
             ruleBase.addPackage( pkg1 );
             ruleBase.addPackage( pkg2 );
-            ruleBase    = SerializationHelper.serializeObject(ruleBase);
+            ruleBase = SerializationHelper.serializeObject( ruleBase );
             final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
             final List results = new ArrayList();
@@ -3961,7 +3982,7 @@
 
             RuleBase ruleBase = getRuleBase();
             ruleBase.addPackage( pkg1 );
-            ruleBase    = SerializationHelper.serializeObject(ruleBase);
+            ruleBase = SerializationHelper.serializeObject( ruleBase );
             final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
             final List results = new ArrayList();
@@ -4004,7 +4025,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List results = new ArrayList();
@@ -4031,7 +4052,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List results = new ArrayList();
@@ -4064,7 +4085,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List results = new ArrayList();
@@ -4091,7 +4112,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List results = new ArrayList();
@@ -4205,7 +4226,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List results = new ArrayList();
@@ -4242,7 +4263,7 @@
         conf.setShadowProxy( true );
         RuleBase rb = RuleBaseFactory.newRuleBase( conf );
         rb.addPackage( builder.getPackage() );
-        rb    = SerializationHelper.serializeObject(rb);
+        rb = SerializationHelper.serializeObject( rb );
         StatefulSession session = rb.newStatefulSession();
 
         List list1 = new ArrayList();
@@ -4303,7 +4324,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List results = new ArrayList();
@@ -4333,7 +4354,7 @@
         conf.setSequential( true );
         RuleBase ruleBase = getRuleBase( conf );
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
 
         StatelessSession session = ruleBase.newStatelessSession();
         List list = new ArrayList();
@@ -4352,7 +4373,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
 
         StatefulSession session = ruleBase.newStatefulSession();
         List list = new ArrayList();
@@ -4386,7 +4407,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -4491,7 +4512,7 @@
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
         ruleBase.addPackage( pkg2 );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
 
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
@@ -4510,7 +4531,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List results = new ArrayList();
@@ -4534,7 +4555,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List results = new ArrayList();
@@ -4592,7 +4613,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( builder.getPackage() );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
 
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
         workingMemory.fireAllRules();
@@ -4614,7 +4635,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( builder.getPackage() );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
 
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
@@ -4673,7 +4694,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
 
         final WorkingMemory wm = ruleBase.newStatefulSession();
 
@@ -4704,7 +4725,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( builder.getPackage() );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
 
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
@@ -4770,7 +4791,7 @@
 
         try {
             ruleBase.addPackage( builder.getPackage() );
-            ruleBase    = SerializationHelper.serializeObject(ruleBase);
+            ruleBase = SerializationHelper.serializeObject( ruleBase );
         } catch ( Exception e ) {
             e.printStackTrace();
             fail( "Should not raise any exception!" );
@@ -4784,7 +4805,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( builder.getPackage() );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
 
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
@@ -4820,7 +4841,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -4862,7 +4883,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -4907,7 +4928,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -4966,7 +4987,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -4994,7 +5015,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -5073,7 +5094,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -5107,7 +5128,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -5132,7 +5153,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -5158,7 +5179,7 @@
         conf.setAssertBehaviour( RuleBaseConfiguration.AssertBehaviour.EQUALITY );
         RuleBase ruleBase = RuleBaseFactory.newRuleBase( conf );
 
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final StatefulSession session = ruleBase.newStatefulSession();
 
         CheeseEqual cheese = new CheeseEqual( "stilton",
@@ -5174,7 +5195,7 @@
         conf.setAssertBehaviour( RuleBaseConfiguration.AssertBehaviour.IDENTITY );
         RuleBase ruleBase = RuleBaseFactory.newRuleBase( conf );
 
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final StatefulSession session = ruleBase.newStatefulSession();
 
         CheeseEqual cheese = new CheeseEqual( "stilton",
@@ -5194,7 +5215,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();
@@ -5219,7 +5240,7 @@
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
         final StatefulSession session = ruleBase.newStatefulSession();
 
         final List list = new ArrayList();

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	2008-05-17 22:10:51 UTC (rev 19996)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/SerializationHelper.java	2008-05-18 03:08:35 UTC (rev 19997)
@@ -1,18 +1,102 @@
 package org.drools.integrationtests;
 
+import org.drools.RuleBase;
+import org.drools.StatefulSession;
+import org.drools.marshalling.Marshaller;
+import org.drools.reteoo.ReteooRuleBase;
 import org.drools.util.DroolsStreamUtils;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
 /**
  * Marshalling helper class to perform serialize/de-serialize a given object
  */
 public class SerializationHelper {
-    public static <T> T serializeObject(T obj) throws IOException, ClassNotFoundException {
-        return serializeObject(obj, null);
+    public static <T> T serializeObject(T obj) throws IOException,
+                                              ClassNotFoundException {
+        return serializeObject( obj,
+                                null );
     }
 
-    public static <T> T serializeObject(T obj, ClassLoader classLoader) throws IOException, ClassNotFoundException {
-        return (T)DroolsStreamUtils.streamIn(DroolsStreamUtils.streamOut(obj), classLoader);
+    public static <T> T serializeObject(T obj,
+                                        ClassLoader classLoader) throws IOException,
+                                                                ClassNotFoundException {
+        return (T) DroolsStreamUtils.streamIn( DroolsStreamUtils.streamOut( obj ),
+                                               classLoader );
     }
+
+    public static StatefulSession getSerialisedStatefulSession(StatefulSession session) throws Exception {
+        return getSerialisedStatefulSession( session,
+                                             true );
+    }
+
+    public static StatefulSession getSerialisedStatefulSession(StatefulSession session,
+                                                               RuleBase ruleBase) throws Exception {
+        return getSerialisedStatefulSession( session,
+                                             ruleBase,
+                                             true );
+    }
+
+    public static StatefulSession getSerialisedStatefulSession(StatefulSession session,
+                                                               boolean dispose) throws Exception {
+        return getSerialisedStatefulSession( session,
+                                             session.getRuleBase(),
+                                             dispose );
+    }
+
+    public static StatefulSession getSerialisedStatefulSession(StatefulSession session,
+                                                               RuleBase ruleBase,
+                                                               boolean dispose) throws Exception {
+        Marshaller marshaller = new Marshaller();
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ruleBase.writeStatefulSession( session,
+                                       baos,
+                                       marshaller );
+
+        byte[] b1 = baos.toByteArray();
+        ByteArrayInputStream bais = new ByteArrayInputStream( b1 );
+        StatefulSession session2 = ruleBase.readStatefulSession( bais,
+                                                                true,
+                                                                marshaller );
+
+        // write methods allways needs a new marshaller for Identity strategies
+        marshaller = new Marshaller();        
+        baos = new ByteArrayOutputStream();
+        ruleBase.writeStatefulSession( session2,
+                                       baos,
+                                       marshaller );
+
+        byte[] b2 = baos.toByteArray();
+        // bytes should be the same.
+        if ( !areByteArraysEqual( b1,
+                                  b2 ) ) {
+            assert false : "byte streams for serialisation test are not equal";
+        }
+
+        session2.setGlobalResolver( session.getGlobalResolver() );
+
+        if ( dispose ) {
+            session.dispose();
+        }
+
+        return session2;
+    }
+
+    public static boolean areByteArraysEqual(byte[] b1,
+                                             byte[] b2) {
+        if ( b1.length != b2.length ) {
+            return false;
+        }
+
+        for ( int i = 0, length = b1.length; i < length; i++ ) {
+            if ( b1[i] != b2[i] ) {
+                return false;
+            }
+        }
+
+        return true;
+    }
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/persister/WorkingMemorySerialisationTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/persister/WorkingMemorySerialisationTest.java	2008-05-17 22:10:51 UTC (rev 19996)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/persister/WorkingMemorySerialisationTest.java	2008-05-18 03:08:35 UTC (rev 19997)
@@ -2,6 +2,7 @@
 
 import java.io.ByteArrayOutputStream;
 import java.io.ByteArrayInputStream;
+import java.io.InputStreamReader;
 import java.io.ObjectOutputStream;
 import java.io.ObjectInputStream;
 import java.io.StringReader;
@@ -13,6 +14,12 @@
 
 import junit.framework.TestCase;
 
+import org.drools.Cell;
+import org.drools.Cheese;
+import org.drools.FactA;
+import org.drools.FactB;
+import org.drools.FactC;
+import org.drools.FactHandle;
 import org.drools.Person;
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
@@ -24,14 +31,130 @@
 import org.drools.common.InternalRuleBase;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.compiler.PackageBuilder;
+import org.drools.integrationtests.SerializationHelper;
+import org.drools.marshalling.Marshaller;
+import org.drools.marshalling.RuleBaseNodes;
 import org.drools.reteoo.ObjectTypeNode;
+import org.drools.reteoo.ReteooRuleBase;
 import org.drools.reteoo.RuleTerminalNode;
 import org.drools.rule.Package;
+import org.drools.spi.ActivationGroup;
+import org.drools.spi.AgendaGroup;
 
+import static org.drools.integrationtests.SerializationHelper.*;
+
 public class WorkingMemorySerialisationTest extends TestCase {
 
-    public void test1() throws Exception {
+    public void testEmptyRule() throws Exception {
         String rule = "package org.test;\n";
+        rule += "global java.util.List list\n";
+        rule += "rule \"Rule 1\"\n";
+        rule += "when\n";
+        rule += "then\n";
+        rule += "    list.add( \"fired\" );\n";
+        rule += "end";
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( rule ) );
+        assertTrue( builder.getErrors().isEmpty() );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+
+        // Make sure the rete node map is created correctly
+        Map<Integer, BaseNode> nodes = RuleBaseNodes.getNodeMap( (InternalRuleBase) ruleBase );
+        assertEquals( 2,
+                      nodes.size() );
+        assertEquals( "InitialFact",
+                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 3 )).getObjectType()).getClassType().getSimpleName() );
+        assertEquals( "Rule 1",
+                      ((RuleTerminalNode) nodes.get( 5 )).getRule().getName() );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+
+        List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+
+        session = getSerialisedStatefulSession( session );
+
+        session.fireAllRules();
+
+        session = getSerialisedStatefulSession( session );
+
+        assertEquals( 1,
+                      ((List) session.getGlobal( "list" )).size() );
+        assertEquals( "fired",
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
+    }
+
+    public void testDynamicEmptyRule() throws Exception {
+        String rule1 = "package org.test;\n";
+        rule1 += "global java.util.List list\n";
+        rule1 += "rule \"Rule 1\"\n";
+        rule1 += "when\n";
+        rule1 += "then\n";
+        rule1 += "    list.add( \"fired1\" );\n";
+        rule1 += "end";
+
+        String rule2 = "package org.test;\n";
+        rule2 += "global java.util.List list\n";
+        rule2 += "rule \"Rule 2\"\n";
+        rule2 += "when\n";
+        rule2 += "then\n";
+        rule2 += "    list.add( \"fired2\" );\n";
+        rule2 += "end";
+
+        PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( rule1 ) );
+        Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+
+        // Make sure the rete node map is created correctly
+        Map<Integer, BaseNode> nodes = RuleBaseNodes.getNodeMap( (InternalRuleBase) ruleBase );
+        assertEquals( 2,
+                      nodes.size() );
+        assertEquals( "InitialFact",
+                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 3 )).getObjectType()).getClassType().getSimpleName() );
+        assertEquals( "Rule 1",
+                      ((RuleTerminalNode) nodes.get( 5 )).getRule().getName() );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+
+        List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+        StatefulSession session1 = getSerialisedStatefulSession( session );
+        session1.fireAllRules();
+
+        assertEquals( 1,
+                      ((List) session1.getGlobal( "list" )).size() );
+
+        WorkingMemory session2 = getSerialisedStatefulSession( session1,
+                                                               true );
+
+        session.dispose();
+        session1.dispose();
+
+        builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( rule2 ) );
+        pkg = builder.getPackage();
+
+        ruleBase.addPackage( pkg );
+
+        assertEquals( 2,
+                      ((List) session2.getGlobal( "list" )).size() );
+        assertEquals( "fired1",
+                      ((List) session2.getGlobal( "list" )).get( 0 ) );
+        assertEquals( "fired2",
+                      ((List) session2.getGlobal( "list" )).get( 1 ) );
+    }
+
+    public void testSinglePattern() throws Exception {
+        String rule = "package org.test;\n";
         rule += "import org.drools.Person\n";
         rule += "global java.util.List list\n";
         rule += "rule \"Rule 1\"\n";
@@ -42,79 +165,878 @@
         rule += "end";
 
         final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new StringReader( rule ));
+        builder.addPackageFromDrl( new StringReader( rule ) );
         final Package pkg = builder.getPackage();
 
         final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-        ruleBase.addPackage(pkg);
+        ruleBase.addPackage( pkg );
 
         // Make sure the rete node map is created correctly
         Map<Integer, BaseNode> nodes = RuleBaseNodes.getNodeMap( (InternalRuleBase) ruleBase );
-        assertEquals( 2, nodes.size() );
-        assertEquals( "Person", ((ClassObjectType)((ObjectTypeNode)nodes.get(3)).getObjectType()).getClassType().getSimpleName() );
-        assertEquals( "Rule 1", ((RuleTerminalNode)nodes.get(5)).getRule().getName() );
-        
+        assertEquals( 2,
+                      nodes.size() );
+        assertEquals( "Person",
+                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 3 )).getObjectType()).getClassType().getSimpleName() );
+        assertEquals( "Rule 1",
+                      ((RuleTerminalNode) nodes.get( 5 )).getRule().getName() );
+
         StatefulSession session = ruleBase.newStatefulSession();
 
         List list = new ArrayList();
-        session.setGlobal( "list", list );
+        session.setGlobal( "list",
+                           list );
 
-        Person p = new Person( "bobba fet", 32);
+        Person p = new Person( "bobba fet",
+                               32 );
+        session.insert( p );
+
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+
+        assertEquals( 1,
+                      ((List) session.getGlobal( "list" )).size() );
+        assertEquals( p,
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
+    }
+
+    public void testSingleRuleSingleJoinNodePattern() throws Exception {
+        String rule = "package org.test;\n";
+        rule += "import org.drools.Person\n";
+        rule += "import org.drools.Cheese\n";
+        rule += "global java.util.List list\n";
+        rule += "rule \"Rule 1\"\n";
+        rule += "when\n";
+        rule += "    $c : Cheese( ) \n";
+        rule += "    $p : Person( cheese == $c ) \n";
+        rule += "then\n";
+        rule += "    list.add( $p );\n";
+        rule += "end";
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( rule ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+
+        // Make sure the rete node map is created correctly
+        Map<Integer, BaseNode> nodes = RuleBaseNodes.getNodeMap( (InternalRuleBase) ruleBase );
+        assertEquals( 4,
+                      nodes.size() );
+        assertEquals( "Cheese",
+                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 3 )).getObjectType()).getClassType().getSimpleName() );
+        assertEquals( "Person",
+                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 6 )).getObjectType()).getClassType().getSimpleName() );
+        assertEquals( "JoinNode",
+                      nodes.get( 7 ).getClass().getSimpleName() );
+        assertEquals( "Rule 1",
+                      ((RuleTerminalNode) nodes.get( 8 )).getRule().getName() );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+
+        List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+
+        Cheese stilton = new Cheese( "stilton",
+                                     25 );
+        Cheese brie = new Cheese( "brie",
+                                  49 );
+        Person bobba = new Person( "bobba fet",
+                                   32 );
+        bobba.setCheese( stilton );
+
+        Person vadar = new Person( "darth vadar",
+                                   32 );
+
+        session.insert( stilton );
+        session.insert( bobba );
+        session.insert( vadar );
+        session.insert( brie );
+
+        session = getSerialisedStatefulSession( session );
+
+        session.fireAllRules();
+
+        assertEquals( 1,
+                      ((List) session.getGlobal( "list" )).size() );
+        assertEquals( bobba,
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
+
+        Person c3po = new Person( "c3p0",
+                                  32 );
+        c3po.setCheese( stilton );
+        session.insert( c3po );
+
+        session = getSerialisedStatefulSession( session );
+
+        session.fireAllRules();
+
+        assertEquals( 2,
+                      ((List) session.getGlobal( "list" )).size() );
+        assertEquals( c3po,
+                      ((List) session.getGlobal( "list" )).get( 1 ) );
+
+        Person r2d2 = new Person( "r2d2",
+                                  32 );
+        r2d2.setCheese( brie );
+        session.insert( r2d2 );
+
+        System.out.println( "\n\njointpattern" );
+        session = getSerialisedStatefulSession( session );
+
+        session.fireAllRules();
+
+        assertEquals( 3,
+                      ((List) session.getGlobal( "list" )).size() );
+        assertEquals( r2d2,
+                      ((List) session.getGlobal( "list" )).get( 2 ) );
+    }
+
+    public void testMultiRuleMultiJoinNodePatternsWithHalt() throws Exception {
+        String rule1 = "package org.test;\n";
+        rule1 += "import org.drools.Person\n";
+        rule1 += "import org.drools.Cheese\n";
+        rule1 += "global java.util.List list\n";
+        rule1 += "rule \"Rule 1\"\n";
+        rule1 += "when\n";
+        rule1 += "    $c : Cheese( ) \n";
+        rule1 += "    $p : Person( cheese == $c ) \n";
+        rule1 += "then\n";
+        rule1 += "    list.add( $p );\n";
+        rule1 += "end";
+
+        String rule2 = "package org.test;\n";
+        rule2 += "import org.drools.Person\n";
+        rule2 += "import org.drools.Cheese\n";
+        rule2 += "import org.drools.Cell\n";
+        rule2 += "global java.util.List list\n";
+        rule2 += "rule \"Rule 2\"\n";
+        rule2 += "when\n";
+        rule2 += "    $c : Cheese( ) \n";
+        rule2 += "    $p : Person( cheese == $c ) \n";
+        rule2 += "    Cell( value == $p.age ) \n";
+        rule2 += "then\n";
+        rule2 += "    list.add( $p );\n";
+        rule2 += "end";
+
+        String rule3 = "package org.test;\n";
+        rule3 += "import org.drools.FactA\n";
+        rule3 += "import org.drools.FactB\n";
+        rule3 += "import org.drools.FactC\n";
+        rule3 += "import org.drools.Person\n";
+        rule3 += "global java.util.List list\n";
+        rule3 += "rule \"Rule 3\"\n";
+        rule3 += "when\n";
+        rule3 += "    $a : FactA( field2 > 10 ) \n";
+        rule3 += "    $b : FactB( f2 >= $a.field2 ) \n";
+        rule3 += "    $p : Person( name == \"darth vadar\" ) \n";
+        rule3 += "    $c : FactC( f2 >= $b.f2 ) \n";
+        rule3 += "then\n";
+        rule3 += "    list.add( $c );\n";
+        rule3 += "    drools.halt();\n";
+        rule3 += "end";
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( rule1 ) );
+        builder.addPackageFromDrl( new StringReader( rule2 ) );
+        builder.addPackageFromDrl( new StringReader( rule3 ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+
+        List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+
+        Cheese stilton = new Cheese( "stilton",
+                                     25 );
+        Cheese brie = new Cheese( "brie",
+                                  49 );
+        Person bobba = new Person( "bobba fet",
+                                   30 );
+        bobba.setCheese( stilton );
+        Person vadar = new Person( "darth vadar",
+                                   38 );
+        Person c3po = new Person( "c3p0",
+                                  17 );
+        c3po.setCheese( stilton );
+        Person r2d2 = new Person( "r2d2",
+                                  58 );
+        r2d2.setCheese( brie );
+
+        session.insert( stilton );
+        session.insert( bobba );
+        session.insert( vadar );
+        session.insert( brie );
+        session.insert( c3po );
+        session.insert( r2d2 );
+
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+
+        assertEquals( 3,
+                      ((List) session.getGlobal( "list" )).size() );
+        assertEquals( bobba,
+                      ((List) session.getGlobal( "list" )).get( 2 ) );
+        assertEquals( c3po,
+                      ((List) session.getGlobal( "list" )).get( 1 ) );
+        assertEquals( r2d2,
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
+
+        session = getSerialisedStatefulSession( session );
+
+        session.insert( new Cell( 30 ) );
+        session.insert( new Cell( 58 ) );
+
+        session = getSerialisedStatefulSession( session );
+
+        session.fireAllRules();
+
+        assertEquals( 5,
+                      ((List) session.getGlobal( "list" )).size() );
+        assertEquals( r2d2,
+                      ((List) session.getGlobal( "list" )).get( 3 ) );
+        assertEquals( bobba,
+                      ((List) session.getGlobal( "list" )).get( 4 ) );
+
+        session = getSerialisedStatefulSession( session );
+
+        session.insert( new FactA( 15 ) );
+        session.insert( new FactB( 20 ) );
+        session.insert( new FactC( 27 ) );
+        session.insert( new FactC( 52 ) );
+
+        session = getSerialisedStatefulSession( session );
+
+        session.fireAllRules();
+
+        assertEquals( 6,
+                      ((List) session.getGlobal( "list" )).size() );
+        assertEquals( new FactC( 52 ),
+                      ((List) session.getGlobal( "list" )).get( 5 ) );
+
+        session = getSerialisedStatefulSession( session );
+
+        session.fireAllRules();
+
+        assertEquals( 7,
+                      ((List) session.getGlobal( "list" )).size() );
+        assertEquals( new FactC( 27 ),
+                      ((List) session.getGlobal( "list" )).get( 6 ) );
+    }
+
+    public void testNot() throws Exception {
+        String header = "package org.drools.test;\n";
+        header += "import java.util.List;\n";
+        header += "import org.drools.Person\n";
+        header += "import org.drools.Cheese\n";
+        header += "global java.util.List list;\n";
+
+        String rule1 = "rule \"not rule test\"\n";
+        rule1 += "salience 10\n";
+        rule1 += "when\n";
+        rule1 += "    Person()\n";
+        rule1 += "    not Cheese( price >= 5 )\n";
+        rule1 += "then\n";
+        rule1 += "    list.add( new Integer( 5 ) );\n";
+        rule1 += "end\n";     
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( header + rule1 ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+        List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+
+        // add a person, no cheese
+        session = getSerialisedStatefulSession( session );
+        Person bobba = new Person( "bobba fet",
+                                   50 );
+        session.insert( bobba );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 1,
+                      list.size() );
+
+        // add another person, no cheese
+        session = getSerialisedStatefulSession( session );
+        Person darth = new Person( "darth vadar",
+                                   200 );
+        session.insert( darth );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 2,
+                      list.size() );
+
+        // add cheese 
+        session = getSerialisedStatefulSession( session );
+        Cheese stilton = new Cheese( "stilton",
+                                     5 );
+        session.insert( stilton );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 2,
+                      list.size() );
+
+        // remove cheese
+        session = getSerialisedStatefulSession( session );
+        session.retract( session.getFactHandle( stilton ) );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 4,
+                      list.size() );
+
+        // put 2 cheeses back in
+        session = getSerialisedStatefulSession( session );
+        session.insert( stilton );
+        session = getSerialisedStatefulSession( session );
+        Cheese brie = new Cheese( "brie",
+                                  18 );
+        session.insert( brie );
+        session.fireAllRules();
+        assertEquals( 4,
+                      list.size() );
+
+        // now remove a cheese, should be no change
+        session.retract( session.getFactHandle( stilton ) );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 4,
+                      list.size() );
         
-        session.insert( p );              
+        // now remove a person, should be no change
+        session.retract( session.getFactHandle( bobba ) );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 4,
+                      list.size() );     
         
-        WorkingMemory wm2 = getSerialisedWorkingMemory( session );
-        
-        wm2.fireAllRules();
-
-        assertEquals( 1, ((List)wm2.getGlobal("list")).size());
-        assertEquals( p, ((List)wm2.getGlobal("list")).get(0));
+        //removal remaining cheese, should increase by one, as one person left
+        session.retract( session.getFactHandle( brie ) );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 5,
+                      list.size() );        
     }
     
-    public WorkingMemory getSerialisedWorkingMemory(WorkingMemory wm) throws Exception {
-        RuleBase ruleBase = wm.getRuleBase();
+    public void testExists() throws Exception {
+        String header = "package org.drools.test;\n";
+        header += "import java.util.List;\n";
+        header += "import org.drools.Person\n";
+        header += "import org.drools.Cheese\n";
+        header += "global java.util.List list;\n";
+
+        String rule1 = "rule \"not rule test\"\n";
+        rule1 += "salience 10\n";
+        rule1 += "when\n";
+        rule1 += "    Person()\n";
+        rule1 += "    exists Cheese( price >= 5 )\n";
+        rule1 += "then\n";
+        rule1 += "    list.add( new Integer( 5 ) );\n";
+        rule1 += "end\n";     
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( header + rule1 ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+        List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+
+        // add a person, no cheese
+        session = getSerialisedStatefulSession( session );
+        Person bobba = new Person( "bobba fet",
+                                   50 );
+        session.insert( bobba );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 0,
+                      list.size() );
+
+        // add another person, no cheese
+        session = getSerialisedStatefulSession( session );
+        Person darth = new Person( "darth vadar",
+                                   200 );
+        session.insert( darth );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 0,
+                      list.size() );
+
+        // add cheese 
+        session = getSerialisedStatefulSession( session );
+        Cheese stilton = new Cheese( "stilton",
+                                     5 );
+        session.insert( stilton );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 2,
+                      list.size() );
+
+        // remove cheese
+        session = getSerialisedStatefulSession( session );
+        session.retract( session.getFactHandle( stilton ) );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 2,
+                      list.size() );
+
+        // put 2 cheeses back in
+        session = getSerialisedStatefulSession( session );
+        session.insert( stilton );
+        session = getSerialisedStatefulSession( session );
+        Cheese brie = new Cheese( "brie",
+                                  18 );
+        session.insert( brie );
+        session.fireAllRules();
+        assertEquals( 4,
+                      list.size() );
+
+        // now remove a cheese, should be no change
+        session.retract( session.getFactHandle( stilton ) );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 4,
+                      list.size() );
         
-        PlaceholderResolverStrategyFactory factory = new PlaceholderResolverStrategyFactory();
-        factory.addPlaceholderResolverStrategy( new SerializablePlaceholderResolverStrategy() );
+        // now remove a person, should be no change
+        session.retract( session.getFactHandle( bobba ) );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 4,
+                      list.size() );     
         
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        OutputPersister op = new OutputPersister( (InternalRuleBase) ruleBase, ( InternalWorkingMemory )wm, new ObjectOutputStream( baos ), factory);
-        op.write();
+        //removal remaining cheese, no
+        session.retract( session.getFactHandle( brie ) );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 4,
+                      list.size() );    
         
-        byte[] b1 = baos.toByteArray();
-        ByteArrayInputStream bais = new ByteArrayInputStream( b1 );
-        InputPersister ip = new InputPersister( (InternalRuleBase) ruleBase, new ObjectInputStream( bais ), factory);        
-        WorkingMemory wm2 = ip.read();
-        wm2.setGlobalResolver( wm.getGlobalResolver() );
-        
-        //this is to check round tripping
-        baos = new ByteArrayOutputStream();
-        op = new OutputPersister( (InternalRuleBase) ruleBase, ( InternalWorkingMemory )wm2, new ObjectOutputStream( baos ), factory);
-        op.write();
-        
-        byte[] b2 = baos.toByteArray();
-        // bytes should be the same.
-        assertTrue( areByteArraysEqual(b1, b2) );
-        
-        bais = new ByteArrayInputStream( b2 );
-        ip = new InputPersister( (InternalRuleBase) ruleBase, new ObjectInputStream( bais ), factory);        
-        wm2 = ip.read();                
-        wm2.setGlobalResolver( wm.getGlobalResolver() );
-        
-        return wm2;        
+        // put one cheese back in, with one person should increase by one
+        session = getSerialisedStatefulSession( session );
+        session.insert( stilton );
+        session.fireAllRules();
+        assertEquals( 5,
+                      list.size() );        
+    }    
+
+    public void testTruthMaintenance() throws Exception {
+        String header = "package org.drools.test;\n";
+        header += "import java.util.List;\n";
+        header += "import org.drools.Person\n";
+        header += "import org.drools.Cheese\n";
+        header += "global Cheese cheese;\n";
+        header += "global Person person;\n";
+        header += "global java.util.List list;\n";
+
+        String rule1 = "rule \"not person then cheese\"\n";
+        rule1 += "when \n";
+        rule1 += "    not Person() \n";
+        rule1 += "then \n";
+        rule1 += "    if (list.size() < 3) { \n";
+        rule1 += "        list.add(new Integer(0)); \n";
+        rule1 += "        insertLogical( cheese ); \n" + "    }\n";
+        rule1 += "    drools.halt();\n" + "end\n";
+
+        String rule2 = "rule \"if cheese then person\"\n";
+        rule2 += "when\n";
+        rule2 += "    Cheese()\n";
+        rule2 += "then\n";
+        rule2 += "    if (list.size() < 3) {\n";
+        rule2 += "        list.add(new Integer(0));\n";
+        rule2 += "        insertLogical( person );\n";
+        rule2 += "    }\n" + "    drools.halt();\n";
+        rule2 += "end\n";
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( header + rule1 ) );
+        builder.addPackageFromDrl( new StringReader( header + rule2 ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+
+        final List list = new ArrayList();
+
+        final Person person = new Person( "person" );
+        final Cheese cheese = new Cheese( "cheese",
+                                          0 );
+        session.setGlobal( "cheese",
+                           cheese );
+        session.setGlobal( "person",
+                           person );
+        session.setGlobal( "list",
+                           list );
+        session.fireAllRules();
+        assertEquals( 1,
+                      list.size() );
+
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 2,
+                      list.size() );
+
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 3,
+                      list.size() );
+
+        // should not grow any further
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 3,
+                      list.size() );
     }
-    
-    public static boolean areByteArraysEqual( byte[] b1, byte[] b2) {
+
+    public void testActivationGroups() throws Exception {
+        String rule1 = "package org.test;\n";
+        rule1 += "import org.drools.Cheese\n";
+        rule1 += "global java.util.List list\n";
+        rule1 += "rule \"Rule 1\"\n";
+        rule1 += "    activation-group \"activation-group-1\"\n";
+        rule1 += "when\n";
+        rule1 += "    $c : Cheese( ) \n";
+        rule1 += "then\n";
+        rule1 += "    list.add( \"rule1\" );\n";
+        rule1 += "    drools.halt();\n";
+        rule1 += "end";
+
+        String rule2 = "package org.test;\n";
+        rule2 += "import org.drools.Cheese\n";
+        rule2 += "global java.util.List list\n";
+        rule2 += "rule \"Rule 2\"\n";
+        rule2 += "    salience 10\n";
+        rule2 += "    activation-group \"activation-group-1\"\n";
+        rule2 += "when\n";
+        rule2 += "    $c : Cheese( ) \n";
+        rule2 += "then\n";
+        rule2 += "    list.add( \"rule2\" );\n";
+        rule2 += "    drools.halt();\n";
+        rule2 += "end";
+
+        String rule3 = "package org.test;\n";
+        rule3 += "import org.drools.Cheese\n";
+        rule3 += "global java.util.List list\n";
+        rule3 += "rule \"Rule 3\"\n";
+        rule3 += "    activation-group \"activation-group-1\"\n";
+        rule3 += "when\n";
+        rule3 += "    $c : Cheese( ) \n";
+        rule3 += "then\n";
+        rule3 += "    list.add( \"rule3\" );\n";
+        rule3 += "    drools.halt();\n";
+        rule3 += "end";
+
+        String rule4 = "package org.test;\n";
+        rule4 += "import org.drools.Cheese\n";
+        rule4 += "global java.util.List list\n";
+        rule4 += "rule \"Rule 4\"\n";
+        rule4 += "    activation-group \"activation-group-2\"\n";
+        rule4 += "when\n";
+        rule4 += "    $c : Cheese( ) \n";
+        rule4 += "then\n";
+        rule4 += "    list.add( \"rule4\" );\n";
+        rule4 += "    drools.halt();\n";
+        rule4 += "end";
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( rule1 ) );
+        builder.addPackageFromDrl( new StringReader( rule2 ) );
+        builder.addPackageFromDrl( new StringReader( rule3 ) );
+        builder.addPackageFromDrl( new StringReader( rule4 ) );
+
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
+        session = getSerialisedStatefulSession( session );
+
+        final List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+
+        final Cheese brie = new Cheese( "brie",
+                                        12 );
+        session.insert( brie );
+
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+
+        assertEquals( 2,
+                      list.size() );
+        assertEquals( "rule2",
+                      list.get( 0 ) );
+        assertEquals( "rule4",
+                      list.get( 1 ) );
+    }
+
+    public void testAgendaGroups() throws Exception {
+        String rule1 = "package org.test;\n";
+        rule1 += "import org.drools.Cheese\n";
+        rule1 += "global java.util.List list\n";
+        rule1 += "rule \"Rule 1\"\n";
+        rule1 += "    agenda-group \"agenda-group-1\"\n";
+        rule1 += "when\n";
+        rule1 += "    $c : Cheese( ) \n";
+        rule1 += "then\n";
+        rule1 += "    list.add( \"rule1\" );\n";
+        rule1 += "    drools.halt();\n";
+        rule1 += "end";
+
+        String rule2 = "package org.test;\n";
+        rule2 += "import org.drools.Cheese\n";
+        rule2 += "global java.util.List list\n";
+        rule2 += "rule \"Rule 2\"\n";
+        rule2 += "    salience 10\n";
+        rule2 += "    agenda-group \"agenda-group-1\"\n";
+        rule2 += "when\n";
+        rule2 += "    $c : Cheese( ) \n";
+        rule2 += "then\n";
+        rule2 += "    list.add( \"rule2\" );\n";
+        rule2 += "    drools.halt();\n";
+        rule2 += "end";
+
+        String rule3 = "package org.test;\n";
+        rule3 += "import org.drools.Cheese\n";
+        rule3 += "global java.util.List list\n";
+        rule3 += "rule \"Rule 3\"\n";
+        rule3 += "    salience 10\n";
+        rule3 += "    agenda-group \"agenda-group-2\"\n";
+        rule3 += "    activation-group \"activation-group-2\"\n";
+        rule3 += "when\n";
+        rule3 += "    $c : Cheese( ) \n";
+        rule3 += "then\n";
+        rule3 += "    list.add( \"rule3\" );\n";
+        rule3 += "    drools.halt();\n";
+        rule3 += "end";
+
+        String rule4 = "package org.test;\n";
+        rule4 += "import org.drools.Cheese\n";
+        rule4 += "global java.util.List list\n";
+        rule4 += "rule \"Rule 4\"\n";
+        rule4 += "    agenda-group \"agenda-group-2\"\n";
+        rule4 += "    activation-group \"activation-group-2\"\n";
+        rule4 += "when\n";
+        rule4 += "    $c : Cheese( ) \n";
+        rule4 += "then\n";
+        rule4 += "    list.add( \"rule4\" );\n";
+        rule4 += "    drools.halt();\n";
+        rule4 += "end";
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( rule1 ) );
+        builder.addPackageFromDrl( new StringReader( rule2 ) );
+        builder.addPackageFromDrl( new StringReader( rule3 ) );
+        builder.addPackageFromDrl( new StringReader( rule4 ) );
+
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
+
+        session = getSerialisedStatefulSession( session );
+
+        final List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+
+        final Cheese brie = new Cheese( "brie",
+                                        12 );
+        session.insert( brie );
+
+        session = getSerialisedStatefulSession( session );
+        session.setFocus( "agenda-group-1" );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( "rule2",
+                      list.get( 0 ) );
+
+        session = getSerialisedStatefulSession( session );
+        session.setFocus( "agenda-group-2" );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( "rule3",
+                      list.get( 1 ) );
+
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( "rule1",
+                      list.get( 2 ) );
+    }
+
+    public void testRuleFlowGroups() throws Exception {
+        String rule1 = "package org.test;\n";
+        rule1 += "import org.drools.Cheese\n";
+        rule1 += "global java.util.List list\n";
+        rule1 += "rule \"Rule 1\"\n";
+        rule1 += "    ruleflow-group \"ruleflow-group-1\"\n";
+        rule1 += "when\n";
+        rule1 += "    $c : Cheese( ) \n";
+        rule1 += "then\n";
+        rule1 += "    list.add( \"rule1\" );\n";
+        rule1 += "    drools.halt();\n";
+        rule1 += "end";
+
+        String rule2 = "package org.test;\n";
+        rule2 += "import org.drools.Cheese\n";
+        rule2 += "global java.util.List list\n";
+        rule2 += "rule \"Rule 2\"\n";
+        rule2 += "    salience 10\n";
+        rule2 += "    ruleflow-group \"ruleflow-group-1\"\n";
+        rule2 += "when\n";
+        rule2 += "    $c : Cheese( ) \n";
+        rule2 += "then\n";
+        rule2 += "    list.add( \"rule2\" );\n";
+        rule2 += "    drools.halt();\n";
+        rule2 += "end";
+
+        String rule3 = "package org.test;\n";
+        rule3 += "import org.drools.Cheese\n";
+        rule3 += "global java.util.List list\n";
+        rule3 += "rule \"Rule 3\"\n";
+        rule3 += "    salience 10\n";
+        rule3 += "    ruleflow-group \"ruleflow-group-2\"\n";
+        rule3 += "    activation-group \"activation-group-2\"\n";
+        rule3 += "when\n";
+        rule3 += "    $c : Cheese( ) \n";
+        rule3 += "then\n";
+        rule3 += "    list.add( \"rule3\" );\n";
+        rule3 += "    drools.halt();\n";
+        rule3 += "end";
+
+        String rule4 = "package org.test;\n";
+        rule4 += "import org.drools.Cheese\n";
+        rule4 += "global java.util.List list\n";
+        rule4 += "rule \"Rule 4\"\n";
+        rule4 += "    ruleflow-group \"ruleflow-group-2\"\n";
+        rule4 += "    activation-group \"activation-group-2\"\n";
+        rule4 += "when\n";
+        rule4 += "    $c : Cheese( ) \n";
+        rule4 += "then\n";
+        rule4 += "    list.add( \"rule4\" );\n";
+        rule4 += "    drools.halt();\n";
+        rule4 += "end";
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( rule1 ) );
+        builder.addPackageFromDrl( new StringReader( rule2 ) );
+        builder.addPackageFromDrl( new StringReader( rule3 ) );
+        builder.addPackageFromDrl( new StringReader( rule4 ) );
+
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
+
+        session = getSerialisedStatefulSession( session );
+
+        final List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+
+        final Cheese brie = new Cheese( "brie",
+                                        12 );
+        session.insert( brie );
+
+        session = getSerialisedStatefulSession( session );
+        session.getAgenda().activateRuleFlowGroup( "ruleflow-group-1" );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( "rule2",
+                      list.get( 0 ) );
+
+        session = getSerialisedStatefulSession( session );
+        session.getAgenda().activateRuleFlowGroup( "ruleflow-group-2" );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( "rule3",
+                      list.get( 1 ) );
+
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( "rule1",
+                      list.get( 2 ) );
+    }
+
+    //    public StatefulSession getSerialisedStatefulSession(StatefulSession session) throws Exception {
+    //        return getSerialisedStatefulSession( session,
+    //                                             true );
+    //    }
+    //
+    //    public StatefulSession getSerialisedStatefulSession(StatefulSession session,
+    //                                                        boolean dispose) throws Exception {
+    //        Marshaller marshaller = new Marshaller();
+    //
+    //        ReteooRuleBase ruleBase = (ReteooRuleBase) session.getRuleBase();
+    //
+    //        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    //        ruleBase.writeStatefulSession( session,
+    //                                       baos,
+    //                                       marshaller );
+    //
+    //        byte[] b1 = baos.toByteArray();
+    //        ByteArrayInputStream bais = new ByteArrayInputStream( b1 );
+    //        StatefulSession session2 = ruleBase.readStatefulSession( bais,
+    //                                                                 true,
+    //                                                                 marshaller );
+    //
+    //        // write methods allways needs a new marshaller for Identity strategies
+    //        marshaller = new Marshaller();
+    //        baos = new ByteArrayOutputStream();
+    //        ruleBase.writeStatefulSession( session2,
+    //                                       baos,
+    //                                       marshaller );
+    //
+    //        byte[] b2 = baos.toByteArray();
+    //        // bytes should be the same.
+    //        assertTrue( areByteArraysEqual( b1,
+    //                                        b2 ) );
+    //
+    //        session2.setGlobalResolver( session.getGlobalResolver() );
+    //
+    //        if ( dispose ) {
+    //            session.dispose();
+    //        }
+    //
+    //        return session2;
+    //    }
+
+    public static boolean areByteArraysEqual(byte[] b1,
+                                             byte[] b2) {
         if ( b1.length != b2.length ) {
             return false;
         }
-        
+
         for ( int i = 0, length = b1.length; i < length; i++ ) {
-            if ( b1[i] != b2[i]) {
+            if ( b1[i] != b2[i] ) {
                 return false;
             }
         }
-        
+
         return true;
     }
 

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	2008-05-17 22:10:51 UTC (rev 19996)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java	2008-05-18 03:08:35 UTC (rev 19997)
@@ -4,6 +4,7 @@
 import java.io.InputStream;
 import java.io.ObjectOutput;
 import java.io.ObjectInput;
+import java.io.OutputStream;
 import java.util.List;
 
 import org.drools.ClockType;
@@ -12,6 +13,7 @@
 import org.drools.StatelessSession;
 import org.drools.TemporalSession;
 import org.drools.event.RuleBaseEventListener;
+import org.drools.marshalling.Marshaller;
 import org.drools.rule.Package;
 
 public class MockRuleBase implements RuleBase {
@@ -62,7 +64,7 @@
 		return null;
 	}
 
-	public StatefulSession newStatefulSession(InputStream stream,
+	public StatefulSession readStatefulSession(InputStream stream,
 			boolean keepReference) throws IOException, ClassNotFoundException {
 		// TODO Auto-generated method stub
 		return null;
@@ -136,4 +138,32 @@
     public void writeExternal(ObjectOutput out) throws IOException {
 
     }
+
+    public void writeStatefulSession(StatefulSession session,
+                                     OutputStream stream) throws IOException {
+        // TODO Auto-generated method stub
+        
+    }
+
+    public StatefulSession readStatefulSession(InputStream stream,
+                                               Marshaller marshaller) throws IOException,
+                                                                     ClassNotFoundException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public StatefulSession readStatefulSession(InputStream stream,
+                                               boolean keepReference,
+                                               Marshaller marshaller) throws IOException,
+                                                                     ClassNotFoundException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public void writeStatefulSession(StatefulSession session,
+                                     OutputStream stream,
+                                     Marshaller marshaller) throws IOException {
+        // TODO Auto-generated method stub
+        
+    }
 }

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	2008-05-17 22:10:51 UTC (rev 19996)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java	2008-05-18 03:08:35 UTC (rev 19997)
@@ -18,6 +18,7 @@
 import org.drools.ObjectFilter;
 import org.drools.QueryResults;
 import org.drools.RuleBase;
+import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalRuleBase;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.NodeMemory;
@@ -522,4 +523,9 @@
         return null;
     }
 
+    public InternalFactHandle getInitialFactHandle() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
 }




More information about the jboss-svn-commits mailing list