[jboss-svn-commits] JBL Code SVN: r22779 - in labs/jbossrules/trunk: drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java and 11 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Sep 15 12:14:18 EDT 2008


Author: tirelli
Date: 2008-09-15 12:14:18 -0400 (Mon, 15 Sep 2008)
New Revision: 22779

Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaDialect.java
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaRule.mvel
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/reteoo/MockRightTupleSink.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/AccumulateFunction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/AverageAccumulateFunction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/CountAccumulateFunction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/JavaAccumulatorFunctionExecutor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MVELAccumulatorFunctionExecutor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MaxAccumulateFunction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MinAccumulateFunction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/SumAccumulateFunction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/BooleanFieldImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/DoubleFieldImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/LongFieldImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/ObjectFieldImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAccumulator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EventFactHandle.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightTupleSink.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Accumulate.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Accumulator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/RuleComponent.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockAccumulator.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSink.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockRightTupleSink.java
Log:
Fixing accumulate marshalling

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaDialect.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaDialect.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaDialect.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -379,14 +379,6 @@
                            dumpDir );
         }
 
-//        for ( String clazz : classes ) {
-//            System.out.println( "---" + clazz + "----" );
-//            for ( byte b : src.getBytes( clazz ) ) {
-//                System.out.print( (char) b );
-//            }
-//            System.out.println( "--- END: " + clazz + "----" );
-//        }
-
         final CompilationResult result = this.compiler.compile( classes,
                                                                 this.src,
                                                                 this.packageStoreWrapper,
@@ -396,11 +388,7 @@
         if ( result.getErrors().length > 0 ) {
             for ( int i = 0; i < result.getErrors().length; i++ ) {
                 final CompilationProblem err = result.getErrors()[i];
-
-                //                System.out.println("Line: "+err.getStartLine());
-                //                LineMappings maps = this.pkg.getPackageCompilationData().getLineMappings( err.getFileName().replace( '/', '.' ).substring( 0, err.getFileName().length() - 5 ) );
-                //                int line = err.getStartLine() + maps.getStartLine() - maps.getOffset() -1;
-                //                System.out.println("Map:  "+line);
+                System.out.println(err);
                 final ErrorHandler handler = (ErrorHandler) this.errorHandlers.get( err.getFileName() );
                 if ( handler instanceof RuleErrorHandler ) {
                     final RuleErrorHandler rh = (RuleErrorHandler) handler;

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel	2008-09-15 16:14:18 UTC (rev 22779)
@@ -189,7 +189,7 @@
 {
     private static final long serialVersionUID  = 400L;
 
-    public Object createContext() {
+    public java.io.Serializable createContext() {
         return new @{ruleClassName}.@{className}();
     }
 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaRule.mvel
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaRule.mvel	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaRule.mvel	2008-09-15 16:14:18 UTC (rev 22779)
@@ -27,7 +27,7 @@
     private static final long    serialVersionUID = 400L;
 
     @if{supportsReverse == "true"}
-    private java.util.Map reverseMap = new java.util.HashMap<org.drools.common.InternalFactHandle, ReverseSnapshot>(); 
+    private java.util.Map reverseMap = new java.util.HashMap<Integer, ReverseSnapshot>(); 
     @end{}
     
     @foreach{type : attributesTypes, attr : attributes} private @{type} @{attr};
@@ -51,7 +51,7 @@
                            @foreach{declr : innerDeclarations}@{declr.extractor.extractToClassName} @{declr.identifier}@end{","}
                            ) throws Exception {
         @if{supportsReverse == "true"}
-        this.reverseMap.put( handle,
+        this.reverseMap.put( Integer.valueOf( handle.getId() ),
                              new ReverseSnapshot(
                                @foreach{declr : declarations}@{declr.identifier}@end{","}@if{innerDeclarations != empty && declarations != empty}, at end{}
                                @foreach{declr : innerDeclarations}@{declr.identifier}@end{","}
@@ -66,7 +66,7 @@
                            @foreach{type : globalTypes, identifier : globals} @{type} @{identifier} @end{","}
                            ) throws Exception {
         @if{supportsReverse == "true"}
-        ReverseSnapshot snapshot = (ReverseSnapshot) this.reverseMap.remove( handle );
+        ReverseSnapshot snapshot = (ReverseSnapshot) this.reverseMap.remove( Integer.valueOf( handle.getId() ) );
         @foreach{type : declarationTypes, declr : declarations}@{type} @{declr.identifier} = snapshot.@{declr.identifier};@end{}
         @foreach{declr : innerDeclarations}@{declr.extractor.extractToClassName} @{declr.identifier} = snapshot.@{declr.identifier};@end{}
         @end{}

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-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -39,7 +39,6 @@
 import org.drools.marshalling.DefaultMarshaller;
 import org.drools.marshalling.Marshaller;
 import org.drools.marshalling.RuleBaseNodes;
-import org.drools.process.instance.ProcessInstance;
 import org.drools.reteoo.ObjectTypeNode;
 import org.drools.reteoo.RuleTerminalNode;
 import org.drools.rule.MapBackedClassLoader;
@@ -137,10 +136,11 @@
         ruleBase = (RuleBase) map.get( "x" );
 
         ruleBase.addPackage( pkg );
-        
-        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );  
+
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
         ruleBase = SerializationHelper.serializeObject( ruleBase );
-              
+
         session.setGlobal( "list",
                            new ArrayList() );
 
@@ -210,12 +210,13 @@
         StatefulSession session = ruleBase.newStatefulSession();
 
         // serialise the working memory before population
-        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
 
         ruleBase.addPackage( pkg );
 
         session.setGlobal( "list",
-                                 new ArrayList() );
+                           new ArrayList() );
 
         final Person bob = new Person( "bob" );
         session.insert( bob );
@@ -276,7 +277,7 @@
         ruleBase.addPackage( pkg );
 
         session.setGlobal( "list",
-                                 new ArrayList() );
+                           new ArrayList() );
 
         final Person bob = new Person( "bob" );
         session.insert( bob );
@@ -289,7 +290,8 @@
         ruleBase = (RuleBase) map.get( "x" );
 
         // now try serialising with a fully populated wm from a serialised rulebase
-        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
 
         final Rule[] rules = ruleBase.getPackages()[0].getRules();
 
@@ -313,7 +315,8 @@
         assertEquals( 2,
                       session.getAgenda().agendaSize() );
 
-        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
         session.fireAllRules();
 
         final List list = (List) session.getGlobal( "list" );
@@ -357,7 +360,8 @@
                       list.get( 0 ) );
 
         // now recreate the rulebase, deserialize the session and test it
-        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
         list = (List) session.getGlobal( "list" );
 
         assertNotNull( list );
@@ -415,7 +419,7 @@
         StatefulSession session = ruleBase.newStatefulSession();
 
         session.setGlobal( "list",
-                                 new ArrayList() );
+                           new ArrayList() );
 
         final Primitives p = new Primitives();
         p.setBytePrimitive( (byte) 1 );
@@ -423,7 +427,8 @@
         p.setIntPrimitive( (int) 3 );
         session.insert( p );
 
-        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
 
         assertEquals( 1,
                       IteratorToList.convert( session.iterateObjects() ).size() );
@@ -433,7 +438,8 @@
         assertEquals( 3,
                       session.getAgenda().agendaSize() );
 
-        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
         session.fireAllRules();
 
         final List list = (List) session.getGlobal( "list" );
@@ -488,14 +494,17 @@
         // serialize session and rulebase out
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         Marshaller marshaller = new DefaultMarshaller();
-        ruleBase.writeStatefulSession( session, baos, 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.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ), marshaller );
+        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ),
+                                                marshaller );
         session.setGlobalResolver( resolver );
 
         // dynamically add a new package
@@ -524,7 +533,8 @@
 
         serializedRulebase = null;
 
-        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
         serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         // dispose session
@@ -562,8 +572,10 @@
 
         GlobalResolver resolver = session.getGlobalResolver();
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Marshaller marshaller = new DefaultMarshaller();        
-        ruleBase.writeStatefulSession( session, baos, marshaller );
+        Marshaller marshaller = new DefaultMarshaller();
+        ruleBase.writeStatefulSession( session,
+                                       baos,
+                                       marshaller );
         byte[] serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         session.dispose();
@@ -575,7 +587,8 @@
 
         // now recreate the rulebase, deserialize the session and test it
         ruleBase = (RuleBase) DroolsStreamUtils.streamIn( serializedRulebase );
-        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ), marshaller );
+        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ),
+                                                marshaller );
         session.setGlobalResolver( resolver );
         results = (List) session.getGlobal( "results" );
 
@@ -604,7 +617,8 @@
 
         serializedRulebase = null;
 
-        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
         serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         session.dispose();
@@ -634,8 +648,10 @@
 
         GlobalResolver resolver = session.getGlobalResolver();
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Marshaller marshaller = new DefaultMarshaller();          
-        ruleBase.writeStatefulSession( session, baos, marshaller );
+        Marshaller marshaller = new DefaultMarshaller();
+        ruleBase.writeStatefulSession( session,
+                                       baos,
+                                       marshaller );
         byte[] serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         session.dispose();
@@ -647,7 +663,8 @@
 
         // now recreate the rulebase, deserialize the session and test it
         ruleBase = (RuleBase) DroolsStreamUtils.streamIn( serializedRulebase );
-        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ), marshaller );
+        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ),
+                                                marshaller );
         session.setGlobalResolver( resolver );
         results = (List) session.getGlobal( "results" );
 
@@ -681,14 +698,17 @@
         resolver = session.getGlobalResolver();
         baos = new ByteArrayOutputStream();
         marshaller = new DefaultMarshaller();
-        ruleBase.writeStatefulSession( session, baos, 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.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ), marshaller );
+        ruleBase = (RuleBase) DroolsStreamUtils.streamIn( serializedRulebase );
+        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ),
+                                                marshaller );
         session.setGlobalResolver( resolver );
         results = (List) session.getGlobal( "results" );
 
@@ -728,13 +748,16 @@
         resolver = session.getGlobalResolver();
         baos = new ByteArrayOutputStream();
         marshaller = new DefaultMarshaller();
-        ruleBase.writeStatefulSession( session, baos, 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.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ), marshaller );
+        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ),
+                                                marshaller );
         session.setGlobalResolver( resolver );
         results = (List) session.getGlobal( "results" );
 
@@ -766,12 +789,13 @@
 
         serializedRulebase = null;
 
-        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
         serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         session.dispose();
     }
-    
+
     /*
      * I have tried both the scenarios
      * 1. Remove a rule from a pkg.
@@ -784,7 +808,7 @@
     public void testSerializeAddRemove_NoClassDefFoundError() 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() );
@@ -803,7 +827,9 @@
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         Marshaller marshaller = new DefaultMarshaller();
-        ruleBase.writeStatefulSession( session, baos, marshaller );
+        ruleBase.writeStatefulSession( session,
+                                       baos,
+                                       marshaller );
         byte[] serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         session.dispose();
@@ -815,9 +841,11 @@
 
         // now recreate the rulebase, deserialize the session and test it
         ruleBase = (RuleBase) DroolsStreamUtils.streamIn( serializedRulebase );
-        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ), marshaller );
+        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ),
+                                                marshaller );
         results.clear();
-        session.setGlobal( "results", results );
+        session.setGlobal( "results",
+                           results );
 
         builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_Dynamic3_0.drl" ) ) );
@@ -825,10 +853,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( 3,
@@ -844,24 +876,33 @@
 
         baos = new ByteArrayOutputStream();
         marshaller = new DefaultMarshaller();
-        ruleBase.writeStatefulSession( session, baos, 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.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ), marshaller );
+        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ),
+                                                marshaller );
         results.clear();
-        session.setGlobal( "results", results );
+        session.setGlobal( "results",
+                           results );
 
         // CASE 1: remove rule
-        ruleBase.removeRule("org.drools.test", "like stilton");
+        ruleBase.removeRule( "org.drools.test",
+                             "like stilton" );
 
-        InternalFactHandle stilton3 = (InternalFactHandle) session.insert( new Cheese( "stilton", 20 ) );
-        InternalFactHandle brie3 = (InternalFactHandle) session.insert( new Cheese( "brie", 20 ) );
-        InternalFactHandle bob3 = (InternalFactHandle) session.insert( new Person( "bob", 20 ) );
-        InternalFactHandle bob4 = (InternalFactHandle) session.insert( new Person( "bob", 30 ) );
+        InternalFactHandle stilton3 = (InternalFactHandle) session.insert( new Cheese( "stilton",
+                                                                                       20 ) );
+        InternalFactHandle brie3 = (InternalFactHandle) session.insert( new Cheese( "brie",
+                                                                                    20 ) );
+        InternalFactHandle bob3 = (InternalFactHandle) session.insert( new Person( "bob",
+                                                                                   20 ) );
+        InternalFactHandle bob4 = (InternalFactHandle) session.insert( new Person( "bob",
+                                                                                   30 ) );
         session.fireAllRules();
 
         assertEquals( 2,
@@ -871,20 +912,25 @@
         assertEquals( bob3.getObject(),
                       results.get( 1 ) );
 
-
         // now recreate the rulebase, deserialize the session and test it
         ruleBase = (RuleBase) DroolsStreamUtils.streamIn( serializedRulebase );
-        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ), marshaller );
+        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ),
+                                                marshaller );
         results.clear();
-        session.setGlobal( "results", results );
+        session.setGlobal( "results",
+                           results );
 
         // CASE 2: remove pkg
-        ruleBase.removePackage("org.drools.test");
+        ruleBase.removePackage( "org.drools.test" );
 
-        InternalFactHandle stilton4 = (InternalFactHandle) session.insert( new Cheese( "stilton", 20 ) );
-        InternalFactHandle brie4 = (InternalFactHandle) session.insert( new Cheese( "brie", 20 ) );
-        InternalFactHandle bob5 = (InternalFactHandle) session.insert( new Person( "bob", 20 ) );
-        InternalFactHandle bob6 = (InternalFactHandle) session.insert( new Person( "bob", 30 ) );
+        InternalFactHandle stilton4 = (InternalFactHandle) session.insert( new Cheese( "stilton",
+                                                                                       20 ) );
+        InternalFactHandle brie4 = (InternalFactHandle) session.insert( new Cheese( "brie",
+                                                                                    20 ) );
+        InternalFactHandle bob5 = (InternalFactHandle) session.insert( new Person( "bob",
+                                                                                   20 ) );
+        InternalFactHandle bob6 = (InternalFactHandle) session.insert( new Person( "bob",
+                                                                                   30 ) );
         session.fireAllRules();
 
         assertEquals( 2,
@@ -898,39 +944,48 @@
         serializedRulebase = null;
         baos = new ByteArrayOutputStream();
         marshaller = new DefaultMarshaller();
-        ruleBase.writeStatefulSession( session, baos,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.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ), marshaller );    //  throws java.lang.ClassNotFoundException Exception
+        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 ) );
-        InternalFactHandle bob7 = (InternalFactHandle) session.insert( new Person( "bob", 30 ) );
-        InternalFactHandle bob8 = (InternalFactHandle) session.insert( new Person( "bob", 40 ) );
+        session.setGlobal( "results",
+                           results );
+
+        InternalFactHandle stilton5 = (InternalFactHandle) session.insert( new Cheese( "stilton",
+                                                                                       30 ) );
+        InternalFactHandle brie5 = (InternalFactHandle) session.insert( new Cheese( "brie",
+                                                                                    30 ) );
+        InternalFactHandle bob7 = (InternalFactHandle) session.insert( new Person( "bob",
+                                                                                   30 ) );
+        InternalFactHandle bob8 = (InternalFactHandle) session.insert( new Person( "bob",
+                                                                                   40 ) );
         session.fireAllRules();
- 
+
         assertEquals( 2,
                       results.size() );
         assertEquals( bob8.getObject(),
                       results.get( 0 ) );
         assertEquals( bob7.getObject(),
                       results.get( 1 ) );
-       
+
         serializedSession = null;
         serializedRulebase = null;
-       
-        session = SerializationHelper.getSerialisedStatefulSession( session, ruleBase );
+
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
         serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
-       
-        session.dispose();        
-       
-    }    
 
+        session.dispose();
+
+    }
+
     /**
      * In this case we are dealing with facts which are not on the systems classpath.
      *
@@ -1369,7 +1424,7 @@
         rule1 += "    not Cheese( price >= 5 )\n";
         rule1 += "then\n";
         rule1 += "    list.add( new Integer( 5 ) );\n";
-        rule1 += "end\n";     
+        rule1 += "end\n";
 
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new StringReader( header + rule1 ) );
@@ -1438,22 +1493,22 @@
         session.fireAllRules();
         assertEquals( 4,
                       list.size() );
-        
+
         // now remove a person, should be no change
         session.retract( session.getFactHandle( bobba ) );
         session = getSerialisedStatefulSession( session );
         session.fireAllRules();
         assertEquals( 4,
-                      list.size() );     
-        
+                      list.size() );
+
         //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() );        
+                      list.size() );
     }
-    
+
     public void testExists() throws Exception {
         String header = "package org.drools.test;\n";
         header += "import java.util.List;\n";
@@ -1468,7 +1523,7 @@
         rule1 += "    exists Cheese( price >= 5 )\n";
         rule1 += "then\n";
         rule1 += "    list.add( new Integer( 5 ) );\n";
-        rule1 += "end\n";     
+        rule1 += "end\n";
 
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new StringReader( header + rule1 ) );
@@ -1537,28 +1592,28 @@
         session.fireAllRules();
         assertEquals( 4,
                       list.size() );
-        
+
         // now remove a person, should be no change
         session.retract( session.getFactHandle( bobba ) );
         session = getSerialisedStatefulSession( session );
         session.fireAllRules();
         assertEquals( 4,
-                      list.size() );     
-        
+                      list.size() );
+
         //removal remaining cheese, no
         session.retract( session.getFactHandle( brie ) );
         session = getSerialisedStatefulSession( session );
         session.fireAllRules();
         assertEquals( 4,
-                      list.size() );    
-        
+                      list.size() );
+
         // put one cheese back in, with one person should increase by one
         session = getSerialisedStatefulSession( session );
         session.insert( stilton );
         session.fireAllRules();
         assertEquals( 5,
-                      list.size() );        
-    }    
+                      list.size() );
+    }
 
     public void testTruthMaintenance() throws Exception {
         String header = "package org.drools.test;\n";
@@ -1907,68 +1962,67 @@
         assertEquals( "rule1",
                       list.get( 2 ) );
     }
-    
-	public void testAccumulate() throws Exception {
-		PackageBuilder builder = new PackageBuilder();
-		Reader source = new StringReader(
-			"package org.drools\n" +
-			"\n" +
-			"import org.drools.Message\n" +
-			"\n" +
-			"rule MyRule\n" +
-			"  when\n" +
-			"    Number( intValue >= 5 ) from accumulate ( m: Message( ), count( m ) )\n" +
-			"  then\n" +
-			"    System.out.println(\"Found messages\");\n" +
-			"end");
-		builder.addPackageFromDrl(source);
-		Package pkg = builder.getPackage();
-		RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-		ruleBase.addPackage( pkg );
-		StatefulSession session = ruleBase.newStatefulSession();
-        
-		session.insert(new Message());
-		session = getSerialisedStatefulSession( session );
-		session.insert(new Message());
-		session.insert(new Message());
-		session.insert(new Message());
-		session.insert(new Message());
-		
-        assertEquals(1, session.getAgenda().getActivations().length);
-	}
 
-	public void testAccumulate2() throws Exception {
-		PackageBuilder builder = new PackageBuilder();
-		Reader source = new StringReader(
-			"package org.drools\n" +
-			"\n" +
-			"import org.drools.Message\n" +
-			"\n" +
-			"rule MyRule\n" +
-			"  when\n" +
-			"    Number( intValue >= 5 ) from accumulate ( m: Message( ), count( m ) )\n" +
-			"  then\n" +
-			"    System.out.println(\"Found messages\");\n" +
-			"end");
-		builder.addPackageFromDrl(source);
-		Package pkg = builder.getPackage();
-		RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-		ruleBase.addPackage( pkg );
-		StatefulSession session = ruleBase.newStatefulSession();
+    public void testAccumulate() throws Exception {
+        PackageBuilder builder = new PackageBuilder();
+        Reader source = new StringReader( "package org.drools\n" + "\n" + "import org.drools.Message\n" + "global java.util.List results\n" + "\n" + "rule MyRule\n" + "  when\n"
+                                          + "    $n : Number( intValue >= 2 ) from accumulate ( m: Message( ), count( m ) )\n" + "  then\n" + "    results.add($n);\n" + "end" );
+        builder.addPackageFromDrl( source );
+        Package pkg = builder.getPackage();
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        StatefulSession session = ruleBase.newStatefulSession();
+        session.setGlobal( "results",
+                           new ArrayList() );
+
+        session = getSerialisedStatefulSession( session );
+        session.insert( new Message() );
+        session = getSerialisedStatefulSession( session );
+        List results = (List) session.getGlobal( "results" );
+
+        session.insert( new Message() );
+        session.insert( new Message() );
         session.fireAllRules();
-        
+        assertEquals( 3,
+                      ((Number) results.get( 0 )).intValue() );
+
         session = getSerialisedStatefulSession( session );
-		session.insert(new Message());
-		session.insert(new Message());
-		session.insert(new Message());
-		session.insert(new Message());
-		session.insert(new Message());
-		
-        assertEquals(1, session.getAgenda().getActivations().length);
-	}
 
-	protected RuleBase getRuleBase() throws Exception {
+        session.insert( new Message() );
+        session.insert( new Message() );
+        session = getSerialisedStatefulSession( session );
 
+        assertEquals( 1,
+                      session.getAgenda().getActivations().length );
+        session.fireAllRules();
+        assertEquals( 5,
+                      ((Number) results.get( 1 )).intValue() );
+    }
+
+    public void testAccumulate2() throws Exception {
+        PackageBuilder builder = new PackageBuilder();
+        Reader source = new StringReader( "package org.drools\n" + "\n" + "import org.drools.Message\n" + "\n" + "rule MyRule\n" + "  when\n" + "    Number( intValue >= 5 ) from accumulate ( m: Message( ), count( m ) )\n" + "  then\n"
+                                          + "    System.out.println(\"Found messages\");\n" + "end" );
+        builder.addPackageFromDrl( source );
+        Package pkg = builder.getPackage();
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        StatefulSession session = ruleBase.newStatefulSession();
+        session.fireAllRules();
+
+        session = getSerialisedStatefulSession( session );
+        session.insert( new Message() );
+        session.insert( new Message() );
+        session.insert( new Message() );
+        session.insert( new Message() );
+        session.insert( new Message() );
+
+        assertEquals( 1,
+                      session.getAgenda().getActivations().length );
+    }
+
+    protected RuleBase getRuleBase() throws Exception {
+
         return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
                                             null );
     }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/reteoo/MockRightTupleSink.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/reteoo/MockRightTupleSink.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/reteoo/MockRightTupleSink.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -42,4 +42,9 @@
     public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException {
         //To change body of implemented methods use File | Settings | File Templates.
     }
+
+    public short getType() {
+        // TODO Auto-generated method stub
+        return NodeTypeEnums.JoinNode;
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/AccumulateFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/AccumulateFunction.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/AccumulateFunction.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -18,6 +18,7 @@
 package org.drools.base.accumulators;
 
 import java.io.Externalizable;
+import java.io.Serializable;
 
 /**
  * An interface for accumulate external function implementations
@@ -31,21 +32,21 @@
      * Creates and returns a new context object
      * @return
      */
-    public Object createContext();
+    public Serializable createContext();
 
     /**
      * Initializes the accumulator
      * @param context
      * @throws Exception
      */
-    public void init(Object context) throws Exception;
+    public void init(Serializable context) throws Exception;
 
     /**
      * Executes the accumulation action
      * @param context
      * @param value
      */
-    public void accumulate(Object context,
+    public void accumulate(Serializable context,
                            Object value);
 
     /**
@@ -54,7 +55,7 @@
      * @param value
      * @throws Exception
      */
-    public void reverse(Object context,
+    public void reverse(Serializable context,
                         Object value) throws Exception;
 
     /**
@@ -64,7 +65,7 @@
      * @return
      * @throws Exception
      */
-    public Object getResult(Object context) throws Exception;
+    public Object getResult(Serializable context) throws Exception;
 
     /**
      * True if the function supports reverse. False otherwise.

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/AverageAccumulateFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/AverageAccumulateFunction.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/AverageAccumulateFunction.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -21,6 +21,7 @@
 import java.io.ObjectInput;
 import java.io.IOException;
 import java.io.Externalizable;
+import java.io.Serializable;
 
 /**
  * An implementation of an accumulator capable of calculating average values
@@ -41,6 +42,8 @@
     public static class AverageData implements Externalizable {
         public int    count = 0;
         public double total = 0;
+        
+        public AverageData() {}
 
         public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
             count   = in.readInt();
@@ -57,14 +60,14 @@
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#createContext()
      */
-    public Object createContext() {
+    public Serializable createContext() {
         return new AverageData();
     }
 
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#init(java.lang.Object)
      */
-    public void init(Object context) throws Exception {
+    public void init(Serializable context) throws Exception {
         AverageData data = (AverageData) context;
         data.count = 0;
         data.total = 0;
@@ -73,7 +76,7 @@
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#accumulate(java.lang.Object, java.lang.Object)
      */
-    public void accumulate(Object context,
+    public void accumulate(Serializable context,
                            Object value) {
         AverageData data = (AverageData) context;
         data.count++;
@@ -83,7 +86,7 @@
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#reverse(java.lang.Object, java.lang.Object)
      */
-    public void reverse(Object context,
+    public void reverse(Serializable context,
                         Object value) throws Exception {
         AverageData data = (AverageData) context;
         data.count--;
@@ -93,7 +96,7 @@
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#getResult(java.lang.Object)
      */
-    public Object getResult(Object context) throws Exception {
+    public Object getResult(Serializable context) throws Exception {
         AverageData data = (AverageData) context;
         return new Double( data.count == 0 ? 0 : data.total / data.count );
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/CountAccumulateFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/CountAccumulateFunction.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/CountAccumulateFunction.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -21,6 +21,7 @@
 import java.io.ObjectInput;
 import java.io.IOException;
 import java.io.Externalizable;
+import java.io.Serializable;
 
 /**
  * An implementation of an accumulator capable of counting occurences
@@ -41,6 +42,8 @@
     protected static class CountData implements Externalizable {
         public long   count = 0;
 
+        public CountData() {}
+        
         public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
             count   = in.readLong();
         }
@@ -54,14 +57,14 @@
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#createContext()
      */
-    public Object createContext() {
+    public Serializable createContext() {
         return new CountData();
     }
 
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#init(java.lang.Object)
      */
-    public void init(Object context) throws Exception {
+    public void init(Serializable context) throws Exception {
         CountData data = (CountData) context;
         data.count = 0;
     }
@@ -69,7 +72,7 @@
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#accumulate(java.lang.Object, java.lang.Object)
      */
-    public void accumulate(Object context,
+    public void accumulate(Serializable context,
                            Object value) {
         CountData data = (CountData) context;
         data.count++;
@@ -78,7 +81,7 @@
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#reverse(java.lang.Object, java.lang.Object)
      */
-    public void reverse(Object context,
+    public void reverse(Serializable context,
                         Object value) throws Exception {
         CountData data = (CountData) context;
         data.count--;
@@ -87,7 +90,7 @@
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#getResult(java.lang.Object)
      */
-    public Object getResult(Object context) throws Exception {
+    public Object getResult(Serializable context) throws Exception {
         CountData data = (CountData) context;
         return new Long( data.count );
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/JavaAccumulatorFunctionExecutor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/JavaAccumulatorFunctionExecutor.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/JavaAccumulatorFunctionExecutor.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -21,16 +21,13 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.util.Collections;
+import java.io.Serializable;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
-import org.drools.FactHandle;
 import org.drools.WorkingMemory;
 import org.drools.common.InternalFactHandle;
 import org.drools.rule.Declaration;
-import org.drools.rule.PredicateConstraint;
 import org.drools.spi.Accumulator;
 import org.drools.spi.CompiledInvoker;
 import org.drools.spi.ReturnValueExpression;
@@ -51,7 +48,7 @@
     private static final long     serialVersionUID = 400L;
 
     private ReturnValueExpression expression;
-    private AccumulateFunction    function;    
+    private AccumulateFunction    function;
 
     public JavaAccumulatorFunctionExecutor() {
 
@@ -70,9 +67,9 @@
 
     public void writeExternal(ObjectOutput out) throws IOException {
         if ( this.expression instanceof CompiledInvoker ) {
-            out.writeObject(  null );
+            out.writeObject( null );
         } else {
-            out.writeObject(this.expression);   
+            out.writeObject( this.expression );
         }
         out.writeObject( function );
     }
@@ -80,11 +77,11 @@
     /* (non-Javadoc)
      * @see org.drools.spi.Accumulator#createContext()
      */
-    public Object createContext() {
+    public Serializable createContext() {
         JavaAccumulatorFunctionContext context = new JavaAccumulatorFunctionContext();
         context.context = this.function.createContext();
         if ( this.function.supportsReverse() ) {
-            context.reverseSupport = new HashMap<FactHandle, Object>();
+            context.reverseSupport = new HashMap<Integer, Serializable>();
         }
         return context;
     }
@@ -110,14 +107,14 @@
                            Declaration[] declarations,
                            Declaration[] innerDeclarations,
                            WorkingMemory workingMemory) throws Exception {
-        final Object value = this.expression.evaluate( handle.getObject(),
-                                                       leftTuple,
-                                                       declarations,
-                                                       innerDeclarations,
-                                                       workingMemory,
-                                                       workingMemoryContext ).getValue();
+        final Serializable value = (Serializable) this.expression.evaluate( handle.getObject(),
+                                                                            leftTuple,
+                                                                            declarations,
+                                                                            innerDeclarations,
+                                                                            workingMemory,
+                                                                            workingMemoryContext ).getValue();
         if ( this.function.supportsReverse() ) {
-            ((JavaAccumulatorFunctionContext) context).reverseSupport.put( handle,
+            ((JavaAccumulatorFunctionContext) context).reverseSupport.put( Integer.valueOf( handle.getId() ),
                                                                            value );
         }
         this.function.accumulate( ((JavaAccumulatorFunctionContext) context).context,
@@ -155,9 +152,9 @@
     public ReturnValueExpression getExpression() {
         return expression;
     }
-    
+
     public void wire(Object object) {
-        setExpression( (ReturnValueExpression) object);
+        setExpression( (ReturnValueExpression) object );
     }
 
     public void setExpression(ReturnValueExpression expression) {
@@ -169,9 +166,25 @@
         return null;
     }
 
-    private static class JavaAccumulatorFunctionContext {
-        public Object                  context;
-        public Map<FactHandle, Object> reverseSupport;
+    private static class JavaAccumulatorFunctionContext
+        implements
+        Externalizable {
+        public Serializable               context;
+        public Map<Integer, Serializable> reverseSupport;
+
+        public JavaAccumulatorFunctionContext() {
+        }
+
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
+            context = (Externalizable) in.readObject();
+            reverseSupport = (Map<Integer, Serializable>) in.readObject();
+        }
+
+        public void writeExternal(ObjectOutput out) throws IOException {
+            out.writeObject( context );
+            out.writeObject( reverseSupport );
+        }
     }
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MVELAccumulatorFunctionExecutor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MVELAccumulatorFunctionExecutor.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MVELAccumulatorFunctionExecutor.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -25,7 +25,6 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.drools.FactHandle;
 import org.drools.WorkingMemory;
 import org.drools.base.mvel.DroolsMVELFactory;
 import org.drools.base.mvel.MVELCompilationUnit;
@@ -47,17 +46,16 @@
     Externalizable,
     Accumulator {
 
-    private static final long  serialVersionUID = 400L;
+    private static final long   serialVersionUID = 400L;
 
-    private final Object       dummy            = new Object();
-    
+    private final Object        dummy            = new Object();
+
     private MVELCompilationUnit unit;
-    private AccumulateFunction function;
-    
-    private DroolsMVELFactory  model;
-    private Serializable       expression;
-    
+    private AccumulateFunction  function;
 
+    private DroolsMVELFactory   model;
+    private Serializable        expression;
+
     public MVELAccumulatorFunctionExecutor() {
 
     }
@@ -79,20 +77,20 @@
         out.writeObject( unit );
         out.writeObject( function );
     }
-    
+
     public void compile(ClassLoader classLoader) {
         expression = unit.getCompiledExpression( classLoader );
-        model = unit.getFactory( );
-    }     
+        model = unit.getFactory();
+    }
 
     /* (non-Javadoc)
      * @see org.drools.spi.Accumulator#createContext()
      */
-    public Object createContext() {
+    public Serializable createContext() {
         MVELAccumulatorFunctionContext context = new MVELAccumulatorFunctionContext();
         context.context = this.function.createContext();
         if ( this.function.supportsReverse() ) {
-            context.reverseSupport = new HashMap<FactHandle, Object>();
+            context.reverseSupport = new HashMap<Integer, Serializable>();
         }
         return context;
     }
@@ -124,11 +122,11 @@
                             handle.getObject(),
                             workingMemory,
                             null );
-        final Object value = MVEL.executeExpression( this.expression,
-                                                     this.dummy,
-                                                     factory );
+        final Serializable value = (Serializable) MVEL.executeExpression( this.expression,
+                                                                          this.dummy,
+                                                                          factory );
         if ( this.function.supportsReverse() ) {
-            ((MVELAccumulatorFunctionContext) context).reverseSupport.put( handle,
+            ((MVELAccumulatorFunctionContext) context).reverseSupport.put( Integer.valueOf( handle.getId() ),
                                                                            value );
         }
         this.function.accumulate( ((MVELAccumulatorFunctionContext) context).context,
@@ -142,7 +140,7 @@
                         Declaration[] declarations,
                         Declaration[] innerDeclarations,
                         WorkingMemory workingMemory) throws Exception {
-        final Object value = ((MVELAccumulatorFunctionContext) context).reverseSupport.remove( handle );
+        final Object value = ((MVELAccumulatorFunctionContext) context).reverseSupport.remove( Integer.valueOf( handle.getId() ) );
         this.function.reverse( ((MVELAccumulatorFunctionContext) context).context,
                                value );
     }
@@ -166,9 +164,22 @@
         return this.model.clone();
     }
 
-    private static class MVELAccumulatorFunctionContext {
-        public Object                         context;
-        public Map<FactHandle, Object>        reverseSupport;
+    private static class MVELAccumulatorFunctionContext
+        implements
+        Externalizable {
+        public Serializable               context;
+        public Map<Integer, Serializable> reverseSupport;
+
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
+            context = (Serializable) in.readObject();
+            reverseSupport = (Map<Integer, Serializable>) in.readObject();
+        }
+
+        public void writeExternal(ObjectOutput out) throws IOException {
+            out.writeObject( context );
+            out.writeObject( reverseSupport );
+        }
     }
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MaxAccumulateFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MaxAccumulateFunction.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MaxAccumulateFunction.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -17,9 +17,11 @@
  */
 package org.drools.base.accumulators;
 
+import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.io.Serializable;
 
 /**
  * An implementation of an accumulator capable of calculating maximum values
@@ -29,8 +31,18 @@
  */
 public class MaxAccumulateFunction implements AccumulateFunction {
 
-    protected static class MaxData {
+    protected static class MaxData implements Externalizable {
         public double max = Double.MIN_VALUE;
+        
+        public MaxData() {}
+
+        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+            max   = in.readDouble();
+        }
+
+        public void writeExternal(ObjectOutput out) throws IOException {
+            out.writeDouble(max);
+        }
     }
 
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
@@ -43,14 +55,14 @@
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#createContext()
      */
-    public Object createContext() {
+    public Serializable createContext() {
         return new MaxData();
     }
 
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#init(java.lang.Object)
      */
-    public void init(Object context) throws Exception {
+    public void init(Serializable context) throws Exception {
         MaxData data = (MaxData) context;
         data.max = Double.MIN_VALUE;
     }
@@ -58,7 +70,7 @@
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#accumulate(java.lang.Object, java.lang.Object)
      */
-    public void accumulate(Object context,
+    public void accumulate(Serializable context,
                            Object value) {
         MaxData data = (MaxData) context;
         data.max = Math.max( data.max, ((Number)value).doubleValue() );
@@ -67,14 +79,14 @@
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#reverse(java.lang.Object, java.lang.Object)
      */
-    public void reverse(Object context,
+    public void reverse(Serializable context,
                         Object value) throws Exception {
     }
 
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#getResult(java.lang.Object)
      */
-    public Object getResult(Object context) throws Exception {
+    public Object getResult(Serializable context) throws Exception {
         MaxData data = (MaxData) context;
         return new Double( data.max );
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MinAccumulateFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MinAccumulateFunction.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MinAccumulateFunction.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -17,9 +17,11 @@
  */
 package org.drools.base.accumulators;
 
+import java.io.Externalizable;
 import java.io.ObjectOutput;
 import java.io.ObjectInput;
 import java.io.IOException;
+import java.io.Serializable;
 
 /**
  * An implementation of an accumulator capable of calculating minimun values
@@ -37,46 +39,56 @@
 
     }
 
-    protected static class MaxData {
+    protected static class MinData implements Externalizable {
         public double min = Double.MAX_VALUE;
+        
+        public MinData() {}
+
+        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+            min   = in.readDouble();
+        }
+
+        public void writeExternal(ObjectOutput out) throws IOException {
+            out.writeDouble(min);
+        }
     }
 
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#createContext()
      */
-    public Object createContext() {
-        return new MaxData();
+    public Serializable createContext() {
+        return new MinData();
     }
 
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#init(java.lang.Object)
      */
-    public void init(Object context) throws Exception {
-        MaxData data = (MaxData) context;
+    public void init(Serializable context) throws Exception {
+        MinData data = (MinData) context;
         data.min = Double.MAX_VALUE;
     }
 
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#accumulate(java.lang.Object, java.lang.Object)
      */
-    public void accumulate(Object context,
+    public void accumulate(Serializable context,
                            Object value) {
-        MaxData data = (MaxData) context;
+        MinData data = (MinData) context;
         data.min = Math.min( data.min, ((Number)value).doubleValue() );
     }
 
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#reverse(java.lang.Object, java.lang.Object)
      */
-    public void reverse(Object context,
+    public void reverse(Serializable context,
                         Object value) throws Exception {
     }
 
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#getResult(java.lang.Object)
      */
-    public Object getResult(Object context) throws Exception {
-        MaxData data = (MaxData) context;
+    public Object getResult(Serializable context) throws Exception {
+        MinData data = (MinData) context;
         return new Double( data.min );
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/SumAccumulateFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/SumAccumulateFunction.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/SumAccumulateFunction.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -21,6 +21,7 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.Externalizable;
+import java.io.Serializable;
 
 /**
  * An implementation of an accumulator capable of calculating sum of values
@@ -41,6 +42,8 @@
     protected static class SumData implements Externalizable {
         public double total = 0;
 
+        public SumData() {}
+
         public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
             total   = in.readDouble();
         }
@@ -54,14 +57,14 @@
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#createContext()
      */
-    public Object createContext() {
+    public Serializable createContext() {
         return new SumData();
     }
 
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#init(java.lang.Object)
      */
-    public void init(Object context) throws Exception {
+    public void init(Serializable context) throws Exception {
         SumData data = (SumData) context;
         data.total = 0;
     }
@@ -69,7 +72,7 @@
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#accumulate(java.lang.Object, java.lang.Object)
      */
-    public void accumulate(Object context,
+    public void accumulate(Serializable context,
                            Object value) {
         SumData data = (SumData) context;
         data.total += ((Number) value).doubleValue();
@@ -78,7 +81,7 @@
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#reverse(java.lang.Object, java.lang.Object)
      */
-    public void reverse(Object context,
+    public void reverse(Serializable context,
                         Object value) throws Exception {
         SumData data = (SumData) context;
         data.total -= ((Number) value).doubleValue();
@@ -87,7 +90,7 @@
     /* (non-Javadoc)
      * @see org.drools.base.accumulators.AccumulateFunction#getResult(java.lang.Object)
      */
-    public Object getResult(Object context) throws Exception {
+    public Object getResult(Serializable context) throws Exception {
         SumData data = (SumData) context;
         return new Double( data.total );
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/BooleanFieldImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/BooleanFieldImpl.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/BooleanFieldImpl.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -26,6 +26,7 @@
 import java.io.ObjectInput;
 import java.io.IOException;
 import java.io.ObjectOutput;
+import java.io.Serializable;
 
 /**
  * @author etirelli
@@ -54,7 +55,7 @@
         out.writeBoolean(value);
     }
 
-    public Object getValue() {
+    public Serializable getValue() {
         return this.value ? Boolean.TRUE : Boolean.FALSE;
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/DoubleFieldImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/DoubleFieldImpl.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/DoubleFieldImpl.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -10,6 +10,7 @@
 import java.io.ObjectInput;
 import java.io.IOException;
 import java.io.ObjectOutput;
+import java.io.Serializable;
 
 public class DoubleFieldImpl
     implements
@@ -33,7 +34,7 @@
         out.writeDouble(value);
     }
 
-    public Object getValue() {
+    public Serializable getValue() {
         return new Double( this.value );
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/LongFieldImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/LongFieldImpl.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/LongFieldImpl.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -10,6 +10,7 @@
 import java.io.ObjectInput;
 import java.io.IOException;
 import java.io.ObjectOutput;
+import java.io.Serializable;
 
 public class LongFieldImpl
     implements
@@ -34,7 +35,7 @@
         out.writeLong(value);
     }
 
-    public Object getValue() {
+    public Serializable getValue() {
         return new Long( this.value );
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/ObjectFieldImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/ObjectFieldImpl.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/ObjectFieldImpl.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -20,6 +20,7 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.Collection;
@@ -64,7 +65,7 @@
         enumName = (String) in.readObject();
         fieldName = (String) in.readObject();
         if ( !isEnum || enumName == null || fieldName == null ) {
-            value = in.readObject();
+            value = (Serializable) in.readObject();
         } else {
             resolveEnumValue();
         }
@@ -83,7 +84,7 @@
     private void resolveEnumValue() {
         try {
             final Class<?> staticClass = Class.forName( enumName );
-            value = staticClass.getField( fieldName ).get( null );
+            value = (Serializable) staticClass.getField( fieldName ).get( null );
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException("Error deserializing enum value "+enumName+"."+fieldName+" : "+e.getMessage());
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAccumulator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAccumulator.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAccumulator.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -43,15 +43,15 @@
     implements
     MVELCompileable,
     Accumulator,
-    Externalizable  {
+    Externalizable {
 
     private static final long serialVersionUID = 400L;
 
-    MVELCompilationUnit initUnit;
-    MVELCompilationUnit actionUnit;
-    MVELCompilationUnit reverseUnit;
-    MVELCompilationUnit resultUnit;
-    
+    MVELCompilationUnit       initUnit;
+    MVELCompilationUnit       actionUnit;
+    MVELCompilationUnit       reverseUnit;
+    MVELCompilationUnit       resultUnit;
+
     private DroolsMVELFactory prototype;
     private Serializable      init;
     private Serializable      action;
@@ -86,7 +86,7 @@
         out.writeObject( reverseUnit );
         out.writeObject( resultUnit );
     }
-    
+
     public void compile(ClassLoader classLoader) {
         init = initUnit.getCompiledExpression( classLoader );
         action = actionUnit.getCompiledExpression( classLoader );
@@ -96,16 +96,16 @@
             prototype = reverseUnit.getFactory();
         } else {
             prototype = resultUnit.getFactory();
-        }      
-    }        
+        }
+    }
 
     /* (non-Javadoc)
      * @see org.drools.spi.Accumulator#createContext()
      */
-    public Object createContext() {
-        Map<InternalFactHandle, Map<String, Object>> shadow = null;
+    public Serializable createContext() {
+        Map<Integer, Map<String, Object>> shadow = null;
         if ( this.reverse != null ) {
-            shadow = new HashMap<InternalFactHandle, Map<String, Object>>();
+            shadow = new HashMap<Integer, Map<String, Object>>();
         }
         return new MVELAccumulatorContext( new HashMap(),
                                            shadow );
@@ -168,15 +168,15 @@
                               DroolsMVELFactory factory,
                               InternalFactHandle handle) {
         DroolsMVELShadowFactory shad = (DroolsMVELShadowFactory) factory;
-        Map<String, Object> varsMap = ((MVELAccumulatorContext) context).shadow.get( handle );
+        Map<String, Object> varsMap = ((MVELAccumulatorContext) context).shadow.get( Integer.valueOf( handle.getId() ) );
         if ( varsMap == null ) {
             varsMap = new HashMap<String, Object>();
-            ((MVELAccumulatorContext) context).shadow.put( handle,
+            ((MVELAccumulatorContext) context).shadow.put( Integer.valueOf( handle.getId() ),
                                                            varsMap );
         }
         for ( String var : shad.getShadowVariables() ) {
             varsMap.put( var,
-                      shad.getVariableResolver( var ).getValue() );
+                         shad.getVariableResolver( var ).getValue() );
         }
     }
 
@@ -196,7 +196,7 @@
 
         // set shadow values overriding actual values
         // ALSO, since reverse() is called, we know the factory is a shadow factory
-        ((DroolsMVELShadowFactory) factory).setShadowValues( ((MVELAccumulatorContext) context).shadow.get( handle ) );
+        ((DroolsMVELShadowFactory) factory).setShadowValues( ((MVELAccumulatorContext) context).shadow.get( Integer.valueOf( handle.getId() ) ) );
 
         MVEL.executeExpression( this.reverse,
                                 null,
@@ -204,7 +204,7 @@
 
         // cleaning up shadow values map
         ((DroolsMVELShadowFactory) factory).setShadowValues( null );
-        ((MVELAccumulatorContext) context).shadow.remove( handle );
+        ((MVELAccumulatorContext) context).shadow.remove( Integer.valueOf( handle.getId() ) );
     }
 
     /* (non-Javadoc)
@@ -240,13 +240,13 @@
         implements
         Serializable {
 
-        private static final long                                 serialVersionUID = -308602705153011537L;
+        private static final long                      serialVersionUID = -308602705153011537L;
 
-        public final Map                                          variables;
-        public final Map<InternalFactHandle, Map<String, Object>> shadow;
+        public final Map                               variables;
+        public final Map<Integer, Map<String, Object>> shadow;
 
         public MVELAccumulatorContext(final Map variables,
-                                      final Map<InternalFactHandle, Map<String, Object>> shadow) {
+                                      final Map<Integer, Map<String, Object>> shadow) {
             this.variables = variables;
             this.shadow = shadow;
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EventFactHandle.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EventFactHandle.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EventFactHandle.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -2,10 +2,6 @@
 
 import org.drools.FactHandle;
 
-import java.io.ObjectOutput;
-import java.io.ObjectInput;
-import java.io.IOException;
-
 public class EventFactHandle extends DefaultFactHandle {
 
     private static final long serialVersionUID = 5997141759543399455L;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -2,11 +2,13 @@
 
 import java.io.IOException;
 import java.io.ObjectInputStream;
+import java.io.Serializable;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Queue;
 
+import org.drools.RuntimeDroolsException;
 import org.drools.SessionConfiguration;
 import org.drools.base.ClassObjectType;
 import org.drools.common.AgendaItem;
@@ -48,6 +50,8 @@
 import org.drools.reteoo.RightTuple;
 import org.drools.reteoo.RightTupleSink;
 import org.drools.reteoo.RuleTerminalNode;
+import org.drools.reteoo.AccumulateNode.AccumulateContext;
+import org.drools.reteoo.AccumulateNode.AccumulateMemory;
 import org.drools.reteoo.EvalConditionNode.EvalMemory;
 import org.drools.reteoo.RuleTerminalNode.TerminalNodeMemory;
 import org.drools.rule.EntryPoint;
@@ -89,23 +93,25 @@
      */
     public static ReteooStatefulSession readSession(ReteooStatefulSession session,
                                                     MarshallerReaderContext context) throws IOException,
-                                                                             ClassNotFoundException {
+                                                                                    ClassNotFoundException {
         int handleId = context.readInt();
         long handleCounter = context.readLong();
-        long propagationCounter = context.readLong();                
-        
+        long propagationCounter = context.readLong();
+
         // these are for the InitialFactHandle, on a reset we just ignore
         context.readInt();
-        context.readLong();           
-        
-        session.reset(handleId, handleCounter, propagationCounter);
-        DefaultAgenda agenda = ( DefaultAgenda ) session.getAgenda();
-        
+        context.readLong();
+
+        session.reset( handleId,
+                       handleCounter,
+                       propagationCounter );
+        DefaultAgenda agenda = (DefaultAgenda) session.getAgenda();
+
         readAgenda( context,
-                    agenda );   
-        
-        context.wm = session;   
-        
+                    agenda );
+
+        context.wm = session;
+
         readFactHandles( context );
 
         readActionQueue( context );
@@ -117,12 +123,12 @@
         readProcessInstances( context );
 
         readWorkItems( context );
-        
+
         readTimers( context );
-        
+
         return session;
     }
-    
+
     /**
      * Create a new session into which to read the stream data
      * @param context
@@ -177,7 +183,7 @@
         readProcessInstances( context );
 
         readWorkItems( context );
-        
+
         readTimers( context );
 
         return session;
@@ -264,24 +270,14 @@
         // load the handles
         InternalFactHandle[] handles = new InternalFactHandle[size];
         for ( int i = 0; i < size; i++ ) {
-            int id = stream.readInt();
-            long recency = stream.readLong();
+            InternalFactHandle handle = readFactHandle( context );
 
-            int strategyIndex = stream.readInt();
-            PlaceholderResolverStrategy strategy = resolverStrategyFactory.getStrategy( strategyIndex );
-            ObjectPlaceholder placeHolder = strategy.read( stream );
-
-            Object object = placeHolder.resolveObject();
-
-            InternalFactHandle handle = new DefaultFactHandle( id,
-                                                               object,
-                                                               recency );
-            context.handles.put( id,
+            context.handles.put( handle.getId(),
                                  handle );
             handles[i] = handle;
 
             context.wm.getObjectStore().addHandle( handle,
-                                                   object );
+                                                   handle.getObject() );
 
             readRightTuples( handle,
                              context );
@@ -317,6 +313,24 @@
         readActivations( context );
     }
 
+    public static InternalFactHandle readFactHandle(MarshallerReaderContext context) throws IOException,
+                                                                                    ClassNotFoundException {
+        int id = context.stream.readInt();
+        long recency = context.stream.readLong();
+
+        int strategyIndex = context.stream.readInt();
+        PlaceholderResolverStrategy strategy = context.resolverStrategyFactory.getStrategy( strategyIndex );
+        ObjectPlaceholder placeHolder = strategy.read( context.stream );
+
+        Object object = placeHolder.resolveObject();
+
+        InternalFactHandle handle = new DefaultFactHandle( id,
+                                                           object,
+                                                           recency );
+        return handle;
+
+    }
+
     public static void readRightTuples(InternalFactHandle factHandle,
                                        MarshallerReaderContext context) throws IOException {
         ObjectInputStream stream = context.stream;
@@ -332,18 +346,28 @@
 
         RightTupleSink sink = (RightTupleSink) context.sinks.get( stream.readInt() );
 
-        BetaMemory memory = (BetaMemory) context.wm.getNodeMemory( (BetaNode) sink );
-
         RightTuple rightTuple = new RightTuple( factHandle,
                                                 sink );
         context.rightTuples.put( new RightTupleKey( factHandle.getId(),
                                                     sink ),
                                  rightTuple );
 
+        BetaMemory memory = null;
+        switch ( sink.getType() ) {
+            case NodeTypeEnums.AccumulateNode : {
+                memory = ((AccumulateMemory) context.wm.getNodeMemory( (BetaNode) sink )).betaMemory;
+                break;
+            }
+            default : {
+                memory = (BetaMemory) context.wm.getNodeMemory( (BetaNode) sink );
+                break;
+            }
+        }
         memory.getRightTupleMemory().add( rightTuple );
     }
 
-    public static void readLeftTuples(MarshallerReaderContext context) throws IOException {
+    public static void readLeftTuples(MarshallerReaderContext context) throws IOException,
+                                                                      ClassNotFoundException {
         ObjectInputStream stream = context.stream;
 
         while ( stream.readShort() == PersisterEnums.LEFT_TUPLE ) {
@@ -358,7 +382,8 @@
     }
 
     public static void readLeftTuple(LeftTuple parentLeftTuple,
-                                     MarshallerReaderContext context) throws IOException {
+                                     MarshallerReaderContext context) throws IOException,
+                                                                     ClassNotFoundException {
         ObjectInputStream stream = context.stream;
         InternalWorkingMemory wm = context.wm;
         Map<Integer, BaseNode> sinks = context.sinks;
@@ -450,6 +475,58 @@
                 }
                 break;
             }
+            case NodeTypeEnums.AccumulateNode : {
+                // accumulate nodes generate new facts on-demand and need special procedures when de-serializing from persistent storage
+                AccumulateMemory memory = (AccumulateMemory) context.wm.getNodeMemory( (BetaNode) sink );
+                memory.betaMemory.getLeftTupleMemory().add( parentLeftTuple );
+
+                AccumulateContext accctx = new AccumulateContext();
+                memory.betaMemory.getCreatedHandles().put( parentLeftTuple,
+                                                           accctx,
+                                                           false );
+                // first we de-serialize the generated fact handle
+                InternalFactHandle handle = readFactHandle( context );
+                accctx.result = new RightTuple( handle,
+                                                (RightTupleSink) sink );
+
+                // then we de-serialize the associated accumulation context
+                accctx.context = (Serializable) stream.readObject();
+                // then we de-serialize the boolean propagated flag
+                accctx.propagated = stream.readBoolean();
+
+                // then we de-serialize all the propagated tuples
+                short head = -1;
+                while ( (head = stream.readShort()) != PersisterEnums.END ) {
+                    switch ( head ) {
+                        case PersisterEnums.RIGHT_TUPLE : {
+                            int factHandleId = stream.readInt();
+                            RightTupleKey key = new RightTupleKey( factHandleId,
+                                                                   sink );
+                            RightTuple rightTuple = context.rightTuples.get( key );
+                            // just wiring up the match record
+                            new LeftTuple( parentLeftTuple,
+                                           rightTuple,
+                                           sink,
+                                           true );
+                            break;
+                        }
+                        case PersisterEnums.LEFT_TUPLE : {
+                            LeftTupleSink childSink = (LeftTupleSink) sinks.get( stream.readInt() );
+                            LeftTuple childLeftTuple = new LeftTuple( parentLeftTuple,
+                                                                      accctx.result,
+                                                                      childSink,
+                                                                      true );
+                            readLeftTuple( childLeftTuple,
+                                           context );
+                            break;
+                        }
+                        default : {
+                            throw new RuntimeDroolsException( "Marshalling error. This is a bug. Please contact the development team." );
+                        }
+                    }
+                }
+                break;
+            }
             case NodeTypeEnums.RuleTerminalNode : {
                 RuleTerminalNode ruleTerminalNode = (RuleTerminalNode) sink;
                 TerminalNodeMemory memory = (TerminalNodeMemory) wm.getNodeMemory( ruleTerminalNode );
@@ -505,7 +582,7 @@
 
         if ( stream.readBoolean() ) {
             String activationGroupName = stream.readUTF();
-            ((DefaultAgenda)wm.getAgenda()).getActivationGroup( activationGroupName ).addActivation( activation );
+            ((DefaultAgenda) wm.getAgenda()).getActivationGroup( activationGroupName ).addActivation( activation );
         }
 
         boolean activated = stream.readBoolean();
@@ -515,11 +592,11 @@
         if ( rule.getAgendaGroup() == null || rule.getAgendaGroup().equals( "" ) || rule.getAgendaGroup().equals( AgendaGroup.MAIN ) ) {
             // Is the Rule AgendaGroup undefined? If it is use MAIN,
             // which is added to the Agenda by default
-            agendaGroup = (InternalAgendaGroup) ((DefaultAgenda)wm.getAgenda()).getAgendaGroup( AgendaGroup.MAIN );
+            agendaGroup = (InternalAgendaGroup) ((DefaultAgenda) wm.getAgenda()).getAgendaGroup( AgendaGroup.MAIN );
         } else {
             // AgendaGroup is defined, so try and get the AgendaGroup
             // from the Agenda
-            agendaGroup = (InternalAgendaGroup) ((DefaultAgenda)wm.getAgenda()).getAgendaGroup( rule.getAgendaGroup() );
+            agendaGroup = (InternalAgendaGroup) ((DefaultAgenda) wm.getAgenda()).getAgendaGroup( rule.getAgendaGroup() );
         }
 
         activation.setAgendaGroup( agendaGroup );
@@ -528,7 +605,7 @@
             if ( rule.getRuleFlowGroup() == null ) {
                 agendaGroup.add( activation );
             } else {
-                InternalRuleFlowGroup rfg = (InternalRuleFlowGroup) ((DefaultAgenda)wm.getAgenda()).getRuleFlowGroup( rule.getRuleFlowGroup() );
+                InternalRuleFlowGroup rfg = (InternalRuleFlowGroup) ((DefaultAgenda) wm.getAgenda()).getRuleFlowGroup( rule.getRuleFlowGroup() );
                 rfg.addActivation( activation );
             }
         }
@@ -619,8 +696,8 @@
         processInstance.setId( stream.readLong() );
         String processId = stream.readUTF();
         processInstance.setProcessId( processId );
-        if (ruleBase != null) {
-        	processInstance.setProcess( ruleBase.getProcess( processId ) );
+        if ( ruleBase != null ) {
+            processInstance.setProcess( ruleBase.getProcess( processId ) );
         }
         processInstance.setState( stream.readInt() );
         long nodeInstanceCounter = stream.readLong();
@@ -647,25 +724,26 @@
             for ( int i = 0; i < nbSwimlanes; i++ ) {
                 String name = stream.readUTF();
                 String value = stream.readUTF();
-                swimlaneContextInstance.setActorId( name, value );
+                swimlaneContextInstance.setActorId( name,
+                                                    value );
             }
         }
 
         while ( stream.readShort() == PersisterEnums.NODE_INSTANCE ) {
             readNodeInstance( context,
-            		          processInstance,
+                              processInstance,
                               processInstance );
         }
 
         processInstance.internalSetNodeInstanceCounter( nodeInstanceCounter );
-        if (wm != null) {
-        	processInstance.reconnect();
+        if ( wm != null ) {
+            processInstance.reconnect();
         }
         return processInstance;
     }
 
     public static NodeInstance readNodeInstance(MarshallerReaderContext context,
-    											NodeInstanceContainer nodeInstanceContainer,
+                                                NodeInstanceContainer nodeInstanceContainer,
                                                 RuleFlowProcessInstance processInstance) throws IOException {
         ObjectInputStream stream = context.stream;
         NodeInstanceImpl nodeInstance = null;
@@ -723,46 +801,43 @@
         nodeInstance.setProcessInstance( processInstance );
         nodeInstance.setId( id );
         switch ( nodeType ) {
-	        case PersisterEnums.COMPOSITE_NODE_INSTANCE :
-	            int nbVariables = stream.readInt();
-	            if ( nbVariables > 0 ) {
-	            	VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
-	                	((CompositeContextNodeInstance) nodeInstance).getContextInstance(VariableScope.VARIABLE_SCOPE);
-	                for ( int i = 0; i < nbVariables; i++ ) {
-	                    String name = stream.readUTF();
-	                    try {
-	                        Object value = stream.readObject();
-	                        variableScopeInstance.setVariable( name, value );
-	                    } catch ( ClassNotFoundException e ) {
-	                        throw new IllegalArgumentException(
-	                    		"Could not reload variable " + name );
-	                    }
-	                }
-	            }
-	            while ( stream.readShort() == PersisterEnums.NODE_INSTANCE ) {
-	                readNodeInstance( 
-	            		context, 
-	            		(CompositeContextNodeInstance) nodeInstance, 
-	            		processInstance );
-	            }
-	            break;
-	        case PersisterEnums.FOR_EACH_NODE_INSTANCE :
-	            while ( stream.readShort() == PersisterEnums.NODE_INSTANCE ) {
-	                readNodeInstance( 
-	            		context, 
-	            		(ForEachNodeInstance) nodeInstance, 
-	            		processInstance );
-	            }
-	            break;
-	        default :
-	            // do nothing
-	        }
+            case PersisterEnums.COMPOSITE_NODE_INSTANCE :
+                int nbVariables = stream.readInt();
+                if ( nbVariables > 0 ) {
+                    VariableScopeInstance variableScopeInstance = (VariableScopeInstance) ((CompositeContextNodeInstance) nodeInstance).getContextInstance( VariableScope.VARIABLE_SCOPE );
+                    for ( int i = 0; i < nbVariables; i++ ) {
+                        String name = stream.readUTF();
+                        try {
+                            Object value = stream.readObject();
+                            variableScopeInstance.setVariable( name,
+                                                               value );
+                        } catch ( ClassNotFoundException e ) {
+                            throw new IllegalArgumentException( "Could not reload variable " + name );
+                        }
+                    }
+                }
+                while ( stream.readShort() == PersisterEnums.NODE_INSTANCE ) {
+                    readNodeInstance( context,
+                                      (CompositeContextNodeInstance) nodeInstance,
+                                      processInstance );
+                }
+                break;
+            case PersisterEnums.FOR_EACH_NODE_INSTANCE :
+                while ( stream.readShort() == PersisterEnums.NODE_INSTANCE ) {
+                    readNodeInstance( context,
+                                      (ForEachNodeInstance) nodeInstance,
+                                      processInstance );
+                }
+                break;
+            default :
+                // do nothing
+        }
         return nodeInstance;
     }
 
     public static void readWorkItems(MarshallerReaderContext context) throws IOException {
-    	InternalWorkingMemory wm = context.wm;
-    	ObjectInputStream stream = context.stream;
+        InternalWorkingMemory wm = context.wm;
+        ObjectInputStream stream = context.stream;
         while ( stream.readShort() == PersisterEnums.WORK_ITEM ) {
             WorkItem workItem = readWorkItem( context );
             wm.getWorkItemManager().internalAddWorkItem( workItem );
@@ -771,35 +846,36 @@
 
     public static WorkItem readWorkItem(MarshallerReaderContext context) throws IOException {
         ObjectInputStream stream = context.stream;
-        
+
         WorkItemImpl workItem = new WorkItemImpl();
         workItem.setId( stream.readLong() );
         workItem.setProcessInstanceId( stream.readLong() );
         workItem.setName( stream.readUTF() );
         workItem.setState( stream.readInt() );
-        
+
         int nbParameters = stream.readInt();
-        
+
         for ( int i = 0; i < nbParameters; i++ ) {
-        	String name = stream.readUTF();
-        	try {
-        		Object value = stream.readObject();
-            	workItem.setParameter(name, value);
-        	} catch (ClassNotFoundException e) {
-        		throw new IllegalArgumentException( "Could not reload parameter " + name );
-        	}
+            String name = stream.readUTF();
+            try {
+                Object value = stream.readObject();
+                workItem.setParameter( name,
+                                       value );
+            } catch ( ClassNotFoundException e ) {
+                throw new IllegalArgumentException( "Could not reload parameter " + name );
+            }
         }
 
         return workItem;
     }
 
     public static void readTimers(MarshallerReaderContext context) throws IOException {
-    	InternalWorkingMemory wm = context.wm;
-    	ObjectInputStream stream = context.stream;
-    	
-    	TimerManager timerManager = wm.getTimerManager();
-    	timerManager.internalSetTimerId( stream.readLong() );
-    	
+        InternalWorkingMemory wm = context.wm;
+        ObjectInputStream stream = context.stream;
+
+        TimerManager timerManager = wm.getTimerManager();
+        timerManager.internalSetTimerId( stream.readLong() );
+
         while ( stream.readShort() == PersisterEnums.TIMER ) {
             Timer timer = readTimer( context );
             timerManager.internalAddTimer( timer );
@@ -808,15 +884,15 @@
 
     public static Timer readTimer(MarshallerReaderContext context) throws IOException {
         ObjectInputStream stream = context.stream;
-        
+
         Timer timer = new Timer();
         timer.setId( stream.readLong() );
         timer.setDelay( stream.readLong() );
         timer.setPeriod( stream.readLong() );
         timer.setProcessInstanceId( stream.readLong() );
-        timer.setActivated( new Date(stream.readLong()) );
-        if (stream.readBoolean()) {
-        	timer.setLastTriggered( new Date(stream.readLong()) );
+        timer.setActivated( new Date( stream.readLong() ) );
+        if ( stream.readBoolean() ) {
+            timer.setLastTriggered( new Date( stream.readLong() ) );
         }
         return timer;
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -36,6 +36,7 @@
 import org.drools.process.instance.context.swimlane.SwimlaneContextInstance;
 import org.drools.process.instance.context.variable.VariableScopeInstance;
 import org.drools.process.instance.timer.TimerManager;
+import org.drools.reteoo.BetaNode;
 import org.drools.reteoo.LeftTuple;
 import org.drools.reteoo.LeftTupleSink;
 import org.drools.reteoo.NodeTypeEnums;
@@ -43,6 +44,8 @@
 import org.drools.reteoo.ReteooWorkingMemory;
 import org.drools.reteoo.RightTuple;
 import org.drools.reteoo.RuleTerminalNode;
+import org.drools.reteoo.AccumulateNode.AccumulateContext;
+import org.drools.reteoo.AccumulateNode.AccumulateMemory;
 import org.drools.rule.EntryPoint;
 import org.drools.rule.Rule;
 import org.drools.ruleflow.instance.RuleFlowProcessInstance;
@@ -97,7 +100,7 @@
         writeProcessInstances( context );
 
         writeWorkItems( context );
-        
+
         writeTimers( context );
     }
 
@@ -232,21 +235,11 @@
         for ( InternalFactHandle handle : orderFacts( wm.getObjectStore() ) ) {
             //stream.writeShort( PersisterEnums.FACT_HANDLE );
             //InternalFactHandle handle = (InternalFactHandle) it.next();
-            stream.writeInt( handle.getId() );
-            stream.writeLong( handle.getRecency() );
+            writeFactHandle( context,
+                             stream,
+                             resolverStrategyFactory,
+                             handle );
 
-            context.out.println( "Object : int:" + handle.getId() + " long:" + handle.getRecency() );
-            context.out.println( handle.getObject() );
-
-            Object object = handle.getObject();
-
-            PlaceholderResolverStrategy strategy = resolverStrategyFactory.getStrategy( handle.getObject() );
-
-            stream.writeInt( strategy.getIndex() );
-
-            strategy.write( stream,
-                            object );
-
             writeRightTuples( handle,
                               context );
         }
@@ -260,6 +253,26 @@
         writeActivations( context );
     }
 
+    private static void writeFactHandle(MarshallerWriteContext context,
+                                        ObjectOutputStream stream,
+                                        PlaceholderResolverStrategyFactory resolverStrategyFactory,
+                                        InternalFactHandle handle) throws IOException {
+        stream.writeInt( handle.getId() );
+        stream.writeLong( handle.getRecency() );
+
+        context.out.println( "Object : int:" + handle.getId() + " long:" + handle.getRecency() );
+        context.out.println( handle.getObject() );
+
+        Object object = handle.getObject();
+
+        PlaceholderResolverStrategy strategy = resolverStrategyFactory.getStrategy( object );
+
+        stream.writeInt( strategy.getIndex() );
+
+        strategy.write( stream,
+                        object );
+    }
+
     public static InternalFactHandle[] orderFacts(ObjectStore objectStore) {
         // this method is just needed for testing purposes, to allow round tripping
         int size = objectStore.size();
@@ -355,11 +368,6 @@
         context.out.println( "RightTuple int:" + rightTuple.getRightTupleSink().getId() );
     }
 
-    public void xxx(RightTuple rightTuple,
-                    MarshallerWriteContext context) {
-
-    }
-
     public static void writeLeftTuples(MarshallerWriteContext context) throws IOException {
         ObjectOutputStream stream = context.stream;
         InternalWorkingMemory wm = context.wm;
@@ -460,6 +468,42 @@
                 }
                 break;
             }
+            case NodeTypeEnums.AccumulateNode : {
+                context.out.println( "AccumulateNode" );
+                // accumulate nodes generate new facts on-demand and need special procedures when serializing to persistent storage
+                AccumulateMemory memory = (AccumulateMemory) context.wm.getNodeMemory( (BetaNode) leftTuple.getLeftTupleSink() );
+                AccumulateContext accctx = (AccumulateContext) memory.betaMemory.getCreatedHandles().get( leftTuple );
+                // first we serialize the generated fact handle
+                writeFactHandle( context,
+                                 stream,
+                                 context.resolverStrategyFactory,
+                                 accctx.result.getFactHandle() );
+                // then we serialize the associated accumulation context
+                stream.writeObject( accctx.context );
+                // then we serialize the boolean propagated flag
+                stream.writeBoolean( accctx.propagated );
+
+                // then we serialize all the propagated tuples
+                for ( LeftTuple childLeftTuple = getLeftTuple( leftTuple.getBetaChildren() ); childLeftTuple != null; childLeftTuple = (LeftTuple) childLeftTuple.getLeftParentPrevious() ) {
+                    if( leftTuple.getLeftTupleSink().getId() == childLeftTuple.getLeftTupleSink().getId()) {
+                        // this is a matching record, so, associate the right tuples
+                        context.out.println( "RightTuple(match) int:" + childLeftTuple.getLeftTupleSink().getId() + " int:" + childLeftTuple.getRightParent().getFactHandle().getId() );
+                        stream.writeShort( PersisterEnums.RIGHT_TUPLE );
+                        stream.writeInt( childLeftTuple.getRightParent().getFactHandle().getId() );
+                    } else {
+                        // this is a propagation record
+                        context.out.println( "RightTuple(propagation) int:" + childLeftTuple.getLeftTupleSink().getId() + " int:" + childLeftTuple.getRightParent().getFactHandle().getId() );
+                        stream.writeShort( PersisterEnums.LEFT_TUPLE );
+                        stream.writeInt( childLeftTuple.getLeftTupleSink().getId() );
+                        writeLeftTuple( childLeftTuple,
+                                        context,
+                                        recurse );
+                    }
+                }
+                stream.writeShort( PersisterEnums.END );
+                context.out.println( "AccumulateNode   ---   END" );
+                break;
+            }
             case NodeTypeEnums.RuleTerminalNode : {
                 context.out.println( "RuleTerminalNode" );
                 int pos = context.terminalTupleMap.size();
@@ -619,12 +663,14 @@
 
     public static void writeProcessInstances(MarshallerWriteContext context) throws IOException {
         ObjectOutputStream stream = context.stream;
-        List<ProcessInstance> processInstances = new ArrayList<ProcessInstance>(context.wm.getProcessInstances());
-        Collections.sort(processInstances, new Comparator<ProcessInstance>() {
-			public int compare(ProcessInstance o1, ProcessInstance o2) {
-				return (int) (o1.getId() - o2.getId());
-			}
-        });
+        List<ProcessInstance> processInstances = new ArrayList<ProcessInstance>( context.wm.getProcessInstances() );
+        Collections.sort( processInstances,
+                          new Comparator<ProcessInstance>() {
+                              public int compare(ProcessInstance o1,
+                                                 ProcessInstance o2) {
+                                  return (int) (o1.getId() - o2.getId());
+                              }
+                          } );
         for ( ProcessInstance processInstance : processInstances ) {
             stream.writeShort( PersisterEnums.PROCESS_INSTANCE );
             writeProcessInstance( context,
@@ -643,18 +689,20 @@
 
         VariableScopeInstance variableScopeInstance = (VariableScopeInstance) processInstance.getContextInstance( VariableScope.VARIABLE_SCOPE );
         Map<String, Object> variables = variableScopeInstance.getVariables();
-        List<String> keys = new ArrayList<String>(variables.keySet());
-        Collections.sort(keys, new Comparator<String>() {
-			public int compare(String o1, String o2) {
-				return o1.compareTo(o2);
-			}
-        });
+        List<String> keys = new ArrayList<String>( variables.keySet() );
+        Collections.sort( keys,
+                          new Comparator<String>() {
+                              public int compare(String o1,
+                                                 String o2) {
+                                  return o1.compareTo( o2 );
+                              }
+                          } );
         stream.writeInt( keys.size() );
         for ( String key : keys ) {
             stream.writeUTF( key );
-            stream.writeObject( variables.get(key) );
+            stream.writeObject( variables.get( key ) );
         }
-        
+
         SwimlaneContextInstance swimlaneContextInstance = (SwimlaneContextInstance) processInstance.getContextInstance( SwimlaneContext.SWIMLANE_SCOPE );
         Map<String, String> swimlaneActors = swimlaneContextInstance.getSwimlaneActors();
         stream.writeInt( swimlaneActors.size() );
@@ -663,12 +711,14 @@
             stream.writeUTF( entry.getValue() );
         }
 
-        List<NodeInstance> nodeInstances = new ArrayList<NodeInstance>(processInstance.getNodeInstances());
-        Collections.sort(nodeInstances, new Comparator<NodeInstance>() {
-			public int compare(NodeInstance o1, NodeInstance o2) {
-				return (int) (o1.getId() - o2.getId());
-			}
-        });
+        List<NodeInstance> nodeInstances = new ArrayList<NodeInstance>( processInstance.getNodeInstances() );
+        Collections.sort( nodeInstances,
+                          new Comparator<NodeInstance>() {
+                              public int compare(NodeInstance o1,
+                                                 NodeInstance o2) {
+                                  return (int) (o1.getId() - o2.getId());
+                              }
+                          } );
         for ( NodeInstance nodeInstance : nodeInstances ) {
             stream.writeShort( PersisterEnums.NODE_INSTANCE );
             writeNodeInstance( context,
@@ -702,64 +752,72 @@
             stream.writeShort( PersisterEnums.JOIN_NODE_INSTANCE );
             Map<Long, Integer> triggers = ((JoinInstance) nodeInstance).getTriggers();
             stream.writeInt( triggers.size() );
-            List<Long> keys = new ArrayList<Long>(triggers.keySet());
-            Collections.sort(keys, new Comparator<Long>(){
-				public int compare(Long o1, Long o2) {
-					return o1.compareTo(o2);
-				}
-            });
+            List<Long> keys = new ArrayList<Long>( triggers.keySet() );
+            Collections.sort( keys,
+                              new Comparator<Long>() {
+                                  public int compare(Long o1,
+                                                     Long o2) {
+                                      return o1.compareTo( o2 );
+                                  }
+                              } );
             for ( Long key : keys ) {
                 stream.writeLong( key );
-                stream.writeInt( triggers.get(key) );
+                stream.writeInt( triggers.get( key ) );
             }
         } else if ( nodeInstance instanceof CompositeContextNodeInstance ) {
             stream.writeShort( PersisterEnums.COMPOSITE_NODE_INSTANCE );
-            CompositeContextNodeInstance compositeNodeInstance = 
-            	(CompositeContextNodeInstance) nodeInstance;
-            VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
-            	compositeNodeInstance.getContextInstance( VariableScope.VARIABLE_SCOPE );
+            CompositeContextNodeInstance compositeNodeInstance = (CompositeContextNodeInstance) nodeInstance;
+            VariableScopeInstance variableScopeInstance = (VariableScopeInstance) compositeNodeInstance.getContextInstance( VariableScope.VARIABLE_SCOPE );
             Map<String, Object> variables = variableScopeInstance.getVariables();
-            List<String> keys = new ArrayList<String>(variables.keySet());
-            Collections.sort(keys, new Comparator<String>() {
-    			public int compare(String o1, String o2) {
-    				return o1.compareTo(o2);
-    			}
-            });
+            List<String> keys = new ArrayList<String>( variables.keySet() );
+            Collections.sort( keys,
+                              new Comparator<String>() {
+                                  public int compare(String o1,
+                                                     String o2) {
+                                      return o1.compareTo( o2 );
+                                  }
+                              } );
             stream.writeInt( keys.size() );
             for ( String key : keys ) {
                 stream.writeUTF( key );
-                stream.writeObject( variables.get(key) );
+                stream.writeObject( variables.get( key ) );
             }
-            List<NodeInstance> nodeInstances = new ArrayList<NodeInstance>(compositeNodeInstance.getNodeInstances());
-            Collections.sort(nodeInstances, new Comparator<NodeInstance>() {
-    			public int compare(NodeInstance o1, NodeInstance o2) {
-    				return (int) (o1.getId() - o2.getId());
-    			}
-            });
+            List<NodeInstance> nodeInstances = new ArrayList<NodeInstance>( compositeNodeInstance.getNodeInstances() );
+            Collections.sort( nodeInstances,
+                              new Comparator<NodeInstance>() {
+                                  public int compare(NodeInstance o1,
+                                                     NodeInstance o2) {
+                                      return (int) (o1.getId() - o2.getId());
+                                  }
+                              } );
             for ( NodeInstance subNodeInstance : nodeInstances ) {
                 stream.writeShort( PersisterEnums.NODE_INSTANCE );
-                writeNodeInstance( context, subNodeInstance );
+                writeNodeInstance( context,
+                                   subNodeInstance );
             }
             stream.writeShort( PersisterEnums.END );
         } else if ( nodeInstance instanceof ForEachNodeInstance ) {
             stream.writeShort( PersisterEnums.FOR_EACH_NODE_INSTANCE );
             ForEachNodeInstance forEachNodeInstance = (ForEachNodeInstance) nodeInstance;
-            List<NodeInstance> nodeInstances = new ArrayList<NodeInstance>(forEachNodeInstance.getNodeInstances());
-            Collections.sort(nodeInstances, new Comparator<NodeInstance>() {
-    			public int compare(NodeInstance o1, NodeInstance o2) {
-    				return (int) (o1.getId() - o2.getId());
-    			}
-            });
+            List<NodeInstance> nodeInstances = new ArrayList<NodeInstance>( forEachNodeInstance.getNodeInstances() );
+            Collections.sort( nodeInstances,
+                              new Comparator<NodeInstance>() {
+                                  public int compare(NodeInstance o1,
+                                                     NodeInstance o2) {
+                                      return (int) (o1.getId() - o2.getId());
+                                  }
+                              } );
             for ( NodeInstance subNodeInstance : nodeInstances ) {
-            	if (subNodeInstance instanceof CompositeContextNodeInstance) {
-            		stream.writeShort( PersisterEnums.NODE_INSTANCE );
-            		writeNodeInstance( context, subNodeInstance );
-            	}
+                if ( subNodeInstance instanceof CompositeContextNodeInstance ) {
+                    stream.writeShort( PersisterEnums.NODE_INSTANCE );
+                    writeNodeInstance( context,
+                                       subNodeInstance );
+                }
             }
             stream.writeShort( PersisterEnums.END );
         } else {
-        	// TODO ForEachNodeInstance
-        	// TODO timer manager
+            // TODO ForEachNodeInstance
+            // TODO timer manager
             throw new IllegalArgumentException( "Unknown node instance type: " + nodeInstance );
         }
     }
@@ -767,12 +825,14 @@
     public static void writeWorkItems(MarshallerWriteContext context) throws IOException {
         ObjectOutputStream stream = context.stream;
 
-        List<WorkItem> workItems = new ArrayList<WorkItem>(context.wm.getWorkItemManager().getWorkItems());
-        Collections.sort(workItems, new Comparator<WorkItem>() {
-			public int compare(WorkItem o1, WorkItem o2) {
-				return (int) (o2.getId() - o1.getId());
-			}
-        });
+        List<WorkItem> workItems = new ArrayList<WorkItem>( context.wm.getWorkItemManager().getWorkItems() );
+        Collections.sort( workItems,
+                          new Comparator<WorkItem>() {
+                              public int compare(WorkItem o1,
+                                                 WorkItem o2) {
+                                  return (int) (o2.getId() - o1.getId());
+                              }
+                          } );
         for ( WorkItem workItem : workItems ) {
             stream.writeShort( PersisterEnums.WORK_ITEM );
             writeWorkItem( context,
@@ -789,10 +849,10 @@
         stream.writeUTF( workItem.getName() );
         stream.writeInt( workItem.getState() );
         Map<String, Object> parameters = workItem.getParameters();
-        stream.writeInt(parameters.size());
-        for (Map.Entry<String, Object> entry: parameters.entrySet()) {
-        	stream.writeUTF(entry.getKey());
-        	stream.writeObject(entry.getValue());
+        stream.writeInt( parameters.size() );
+        for ( Map.Entry<String, Object> entry : parameters.entrySet() ) {
+            stream.writeUTF( entry.getKey() );
+            stream.writeObject( entry.getValue() );
         }
     }
 
@@ -802,33 +862,37 @@
         TimerManager timerManager = context.wm.getTimerManager();
         stream.writeLong( timerManager.internalGetTimerId() );
 
-        List<Timer> timers = new ArrayList<Timer>(timerManager.getTimers());
-        Collections.sort(timers, new Comparator<Timer>() {
-			public int compare(Timer o1, Timer o2) {
-				return (int) (o2.getId() - o1.getId());
-			}
-        });
-        for ( Timer timer: timers ) {
+        List<Timer> timers = new ArrayList<Timer>( timerManager.getTimers() );
+        Collections.sort( timers,
+                          new Comparator<Timer>() {
+                              public int compare(Timer o1,
+                                                 Timer o2) {
+                                  return (int) (o2.getId() - o1.getId());
+                              }
+                          } );
+        for ( Timer timer : timers ) {
             stream.writeShort( PersisterEnums.TIMER );
-            writeTimer( context, timer );
+            writeTimer( context,
+                        timer );
         }
         stream.writeShort( PersisterEnums.END );
     }
 
-    public static void writeTimer(MarshallerWriteContext context, Timer timer) throws IOException {
-    	ObjectOutputStream stream = context.stream;
-    	stream.writeLong( timer.getId() );
-    	stream.writeLong( timer.getDelay() );
-    	stream.writeLong( timer.getPeriod() );
-    	stream.writeLong( timer.getProcessInstanceId() );
-    	stream.writeLong( timer.getActivated().getTime() );
-    	Date lastTriggered = timer.getLastTriggered();
-    	if (lastTriggered != null) {
-    		stream.writeBoolean(true);
-    		stream.writeLong( timer.getLastTriggered().getTime() );
-    	} else {
-    		stream.writeBoolean(false);
-    	}
+    public static void writeTimer(MarshallerWriteContext context,
+                                  Timer timer) throws IOException {
+        ObjectOutputStream stream = context.stream;
+        stream.writeLong( timer.getId() );
+        stream.writeLong( timer.getDelay() );
+        stream.writeLong( timer.getPeriod() );
+        stream.writeLong( timer.getProcessInstanceId() );
+        stream.writeLong( timer.getActivated().getTime() );
+        Date lastTriggered = timer.getLastTriggered();
+        if ( lastTriggered != null ) {
+            stream.writeBoolean( true );
+            stream.writeLong( timer.getLastTriggered().getTime() );
+        } else {
+            stream.writeBoolean( false );
+        }
     }
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -20,6 +20,7 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.io.Serializable;
 import java.util.Arrays;
 
 import org.drools.RuleBaseConfiguration;
@@ -632,13 +633,13 @@
     public static class AccumulateContext
         implements
         Externalizable {
-        public Object     context;
-        public RightTuple result;
-        public boolean    propagated;
+        public Serializable context;
+        public RightTuple   result;
+        public boolean      propagated;
 
         public void readExternal(ObjectInput in) throws IOException,
                                                 ClassNotFoundException {
-            context = in.readObject();
+            context = (Serializable) in.readObject();
             result = (RightTuple) in.readObject();
             propagated = in.readBoolean();
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightTupleSink.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightTupleSink.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightTupleSink.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -4,6 +4,9 @@
 import org.drools.spi.PropagationContext;
 
 public interface RightTupleSink extends Sink {
+
+    public short getType();
+
     public void retractRightTuple(final RightTuple rightTuple,
                                   final PropagationContext context,
                                   final InternalWorkingMemory workingMemory);

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Accumulate.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Accumulate.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Accumulate.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -23,6 +23,7 @@
 import java.io.ObjectOutput;
 import java.io.IOException;
 import java.io.ObjectInput;
+import java.io.Serializable;
 
 import org.drools.RuntimeDroolsException;
 import org.drools.WorkingMemory;
@@ -117,7 +118,7 @@
         this.accumulator = accumulator;
     }
 
-    public Object createContext() {
+    public Serializable createContext() {
         return this.accumulator.createContext();
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Accumulator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Accumulator.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Accumulator.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -16,6 +16,8 @@
 
 package org.drools.spi;
 
+import java.io.Serializable;
+
 import org.drools.WorkingMemory;
 import org.drools.common.InternalFactHandle;
 import org.drools.rule.Declaration;
@@ -46,7 +48,7 @@
      * 
      * @return
      */
-    public Object createContext();
+    public Serializable createContext();
 
     /**
      * Executes the initialization block of code

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/RuleComponent.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/RuleComponent.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/RuleComponent.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -16,7 +16,6 @@
  * limitations under the License.
  */
 
-import java.io.Externalizable;
 
 /**
  * Semantic component marker.

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockAccumulator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockAccumulator.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockAccumulator.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -15,12 +15,13 @@
  */
 package org.drools.reteoo;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.io.ObjectOutput;
-import java.io.ObjectInput;
-import java.io.IOException;
 
 import org.drools.WorkingMemory;
 import org.drools.common.InternalFactHandle;
@@ -36,7 +37,7 @@
  */
 public class MockAccumulator
     implements
-    Accumulator {
+    Accumulator, Serializable {
 
     private static final long serialVersionUID = 400L;
 
@@ -67,7 +68,7 @@
         return this.workingMemory;
     }
 
-    public Object createContext() {
+    public Serializable createContext() {
         return this;
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSink.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSink.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSink.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -120,4 +120,9 @@
     public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException {
         //To change body of implemented methods use File | Settings | File Templates.
     }
+
+    public short getType() {
+        // TODO Auto-generated method stub
+        return NodeTypeEnums.JoinNode;
+    }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockRightTupleSink.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockRightTupleSink.java	2008-09-15 13:20:33 UTC (rev 22778)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockRightTupleSink.java	2008-09-15 16:14:18 UTC (rev 22779)
@@ -42,4 +42,8 @@
     public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException {
         //To change body of implemented methods use File | Settings | File Templates.
     }
+
+    public short getType() {
+        return NodeTypeEnums.JoinNode;
+    }
 }




More information about the jboss-svn-commits mailing list