[jboss-svn-commits] JBL Code SVN: r25427 - in labs/jbossrules/trunk: drools-api/src/main/java/org/drools/marshalling and 16 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Feb 25 23:49:09 EST 2009


Author: mark.proctor at jboss.com
Date: 2009-02-25 23:49:09 -0500 (Wed, 25 Feb 2009)
New Revision: 25427

Added:
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/Marshaller.java
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/MarshallerFactory.java
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/MarshallerProvider.java
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/ObjectMarshallingStrategy.java
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/ObjectMarshallingStrategyAcceptor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/AbstractProcessInstanceMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ClassObjectMarshallingStrategyAcceptor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/DefaultMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/IdentityPlaceholderResolverStrategy.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/InputMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallerProviderImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallerReaderContext.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallerWriteContext.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallingConfiguration.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallingConfigurationImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ObjectMarshallingStrategyStore.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/OutputMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterEnums.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterHelper.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterKey.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/Placeholders.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ProcessInstanceMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ProcessMarshallerRegistry.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/RightTupleKey.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/RuleBaseNodes.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/RuleFlowProcessInstanceMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/SerializablePlaceholderResolverStrategy.java
Removed:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/AbstractProcessInstanceMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/ClassPlaceholderResolverStrategyAcceptor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/DefaultMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/IdentityPlaceholderResolverStrategy.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/Marshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallerReaderContext.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallerWriteContext.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfiguration.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfigurationImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/ObjectPlaceholder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterEnums.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterHelper.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterKey.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PlaceholderResolverStrategy.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PlaceholderResolverStrategyAcceptor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PlaceholderResolverStrategyFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/Placeholders.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/ProcessInstanceMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/ProcessMarshallerRegistry.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/RightTupleKey.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/RuleBaseNodes.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/RuleFlowProcessInstanceMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/SerializablePlaceholder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/SerializablePlaceholderResolverStrategy.java
Modified:
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/EnvironmentName.java
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/KnowledgeRuntime.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessMarchallingTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/SerializationHelper.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java
   labs/jbossrules/trunk/drools-core/.classpath
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/SessionConfiguration.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/RuleFlowGroupImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TruthMaintenanceSystem.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/WorkingMemoryAction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/KnowledgeBaseImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/DefaultSignalManager.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatefulSession.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/SlidingTimeWindow.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ClassUtils.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPASessionMarshallingHelper.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SessionInfo.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java
Log:
JBRULES-1981 Update marshalling to use new drools api

Copied: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/Marshaller.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/Marshaller.java)
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/Marshaller.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/Marshaller.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,64 @@
+package org.drools.marshalling;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.drools.runtime.Environment;
+import org.drools.runtime.KnowledgeSessionConfiguration;
+import org.drools.runtime.StatefulKnowledgeSession;
+
+public interface Marshaller {
+
+    /**
+     * Marshalls the given StatefulKnowledgeSession into the provided OutputStream
+     * @param stream
+     * @param session
+     * @throws IOException
+     */
+    void marshall(OutputStream stream,
+                  StatefulKnowledgeSession ksession) throws IOException;
+    
+    /**
+     * Creates StatefulKnowledgeSession using default KnowledgeSessionConfiguration and 
+     * Environment. It will then unmarshall the stream into the session. Either KnowledgeSessionConfiguration or
+     * Environment may be null and it will use the default.
+     * 
+     * @param stream
+     * @return
+     * @throws IOException
+     * @throws ClassNotFoundException
+     */
+    public StatefulKnowledgeSession unmarshall(InputStream stream) throws IOException,
+                                                                      ClassNotFoundException;   
+
+    /**
+     * Creates StatefulKnowledgeSession using the given KnowledgeSessionConfiguration and 
+     * Environment. It will then unmarshall the stream into the session. Either KnowledgeSessionConfiguration or
+     * Environment may be null and it will use the default.
+     * 
+     * @param stream
+     * @param config
+     * @param environment
+     * @return
+     * @throws IOException
+     * @throws ClassNotFoundException
+     */
+    public StatefulKnowledgeSession unmarshall(InputStream stream,
+                                               KnowledgeSessionConfiguration config,
+                                               Environment environment) throws IOException,
+                                                                      ClassNotFoundException;
+
+    /**
+     * Unmarshall the stream into the StatefulKnowledgeSession. All existing state in the session will be lost.
+     *  
+     * @param stream
+     * @param session
+     * @throws IOException
+     * @throws ClassNotFoundException
+     */
+    void unmarshall(InputStream stream,
+                   StatefulKnowledgeSession ksession) throws IOException,
+                                                    ClassNotFoundException;
+
+}
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/Marshaller.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Added: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/MarshallerFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/MarshallerFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/MarshallerFactory.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,63 @@
+package org.drools.marshalling;
+
+import org.drools.KnowledgeBase;
+import org.drools.ProviderInitializationException;
+
+public class MarshallerFactory {
+    private static volatile MarshallerProvider provider;
+
+    public static ObjectMarshallingStrategyAcceptor newClassFilterAcceptor(String[] patterns) {
+        return getMarshallerProvider().newClassFilterAcceptor( patterns );
+    }
+
+    public static ObjectMarshallingStrategy newIdentityMarshallingStrategy() {
+        return getMarshallerProvider().newIdentityMarshallingStrategy();
+    }
+
+    public static ObjectMarshallingStrategy newIdentityMarshallingStrategy(ObjectMarshallingStrategyAcceptor acceptor) {
+        return getMarshallerProvider().newIdentityMarshallingStrategy( acceptor );
+    }
+
+    public static ObjectMarshallingStrategy newSerializeMarshallingStrategy() {
+        return getMarshallerProvider().newSerializeMarshallingStrategy();
+    }
+
+    public static ObjectMarshallingStrategy newSerializeMarshallingStrategy(ObjectMarshallingStrategyAcceptor acceptor) {
+        return getMarshallerProvider().newSerializeMarshallingStrategy( acceptor );
+    }
+
+    /**
+     * Default uses the serialise marshalling strategy.
+     * @return
+     */
+    public static Marshaller newMarshaller(KnowledgeBase kbase) {
+        return getMarshallerProvider().newMarshaller( kbase );
+    }
+
+    public static Marshaller newMarshaller(KnowledgeBase kbase,
+                                           ObjectMarshallingStrategy[] strategies) {
+        return getMarshallerProvider().newMarshaller( kbase,
+                                                      strategies );
+    }
+
+    private static synchronized void setMarshallerProvider(MarshallerProvider provider) {
+        MarshallerFactory.provider = provider;
+    }
+
+    private static synchronized MarshallerProvider getMarshallerProvider() {
+        if ( provider == null ) {
+            loadProvider();
+        }
+        return provider;
+    }
+
+    private static void loadProvider() {
+        try {
+            Class<MarshallerProvider> cls = (Class<MarshallerProvider>) Class.forName( "org.drools.marshalling.impl.MarshallerProviderImpl" );
+            setMarshallerProvider( cls.newInstance() );
+        } catch ( Exception e2 ) {
+            throw new ProviderInitializationException( "Provider org.drools.marshalling.impl.MarshallerProviderImpl could not be set.",
+                                                       e2 );
+        }
+    }
+}

Added: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/MarshallerProvider.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/MarshallerProvider.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/MarshallerProvider.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,20 @@
+package org.drools.marshalling;
+
+import org.drools.KnowledgeBase;
+
+public interface MarshallerProvider {
+    ObjectMarshallingStrategyAcceptor newClassFilterAcceptor(String[] patterns);
+
+    ObjectMarshallingStrategy newIdentityMarshallingStrategy();
+
+    ObjectMarshallingStrategy newIdentityMarshallingStrategy(ObjectMarshallingStrategyAcceptor acceptor);
+
+    ObjectMarshallingStrategy newSerializeMarshallingStrategy();
+
+    ObjectMarshallingStrategy newSerializeMarshallingStrategy(ObjectMarshallingStrategyAcceptor acceptor);
+
+    Marshaller newMarshaller(KnowledgeBase kbase);
+
+    Marshaller newMarshaller(KnowledgeBase kbase,
+                             ObjectMarshallingStrategy[] strategies);
+}

Copied: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/ObjectMarshallingStrategy.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PlaceholderResolverStrategy.java)
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/ObjectMarshallingStrategy.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/ObjectMarshallingStrategy.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,15 @@
+package org.drools.marshalling;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+public interface ObjectMarshallingStrategy {
+    
+    public boolean accept(Object object);
+
+    public void write(ObjectOutputStream os,
+                      Object object) throws IOException;
+
+    public Object read(ObjectInputStream os) throws IOException, ClassNotFoundException;
+}


Property changes on: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/ObjectMarshallingStrategy.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/ObjectMarshallingStrategyAcceptor.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PlaceholderResolverStrategyAcceptor.java)
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/ObjectMarshallingStrategyAcceptor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/ObjectMarshallingStrategyAcceptor.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,5 @@
+package org.drools.marshalling;
+
+public interface ObjectMarshallingStrategyAcceptor {
+    public boolean accept(Object object);
+}


Property changes on: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/marshalling/ObjectMarshallingStrategyAcceptor.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/EnvironmentName.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/EnvironmentName.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/EnvironmentName.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -3,5 +3,5 @@
 public class EnvironmentName {
     public static final String ENTITY_MANAGER_FACTORY = "drools.emf";
     public static final String ENTITY_MANAGER = "drools.em";
-    public static final String PLACEHOLDER_RESOLVER_STRATEGY_FACTORY = "drools.placeholderResolverStrategyFactory";
+    public static final String OBJECT_MARSHALLING_STRATEGIES = "drools.objectMarshallingStrategies";
 }

Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/KnowledgeRuntime.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/KnowledgeRuntime.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/KnowledgeRuntime.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -22,6 +22,8 @@
     Object getGlobal(String identifier);
     
     Globals getGlobals();
+    
+    Environment getEnvironment();
 
     /**
      * Returns the KnowledgeBase reference from which this stateful session was created.

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -5,6 +5,7 @@
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import junit.framework.Assert;
@@ -13,6 +14,8 @@
 import org.drools.Cheese;
 import org.drools.FactA;
 import org.drools.FactB;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
 import org.drools.Order;
 import org.drools.OrderItem;
 import org.drools.Person;
@@ -23,10 +26,19 @@
 import org.drools.RuleBaseFactory;
 import org.drools.StatefulSession;
 import org.drools.WorkingMemory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
 import org.drools.common.InternalFactHandle;
 import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
+import org.drools.definition.KnowledgePackage;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
+import org.drools.io.ResourceFactory;
+import org.drools.marshalling.MarshallerFactory;
+import org.drools.reteoo.ReteooWorkingMemory;
 import org.drools.rule.Package;
+import org.drools.runtime.StatefulKnowledgeSession;
 
 public class DynamicRulesTest extends TestCase {
     protected RuleBase getRuleBase() throws Exception {
@@ -557,17 +569,20 @@
     }
 
     public void testDynamicNotNode() throws Exception {
-        final PackageBuilder builderInit = new PackageBuilder();
-        builderInit.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_CollectDynamicRules1.drl" ) ) );
-        final Package pkgInit = builderInit.getPackage();
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();        
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_CollectDynamicRules1.drl", getClass() ), ResourceType.DRL );        
+        if ( kbuilder.hasErrors() ) {
+            fail ( kbuilder.getErrors().toString() );
+        }        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        Collection<KnowledgePackage> kpkgs = SerializationHelper.serializeObject( kbuilder.getKnowledgePackages() );        
+        kbase.addKnowledgePackages( kpkgs );
+        kbase = SerializationHelper.serializeObject( kbase );
 
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkgInit );
-
-        StatefulSession session = ruleBase.newStatefulSession();
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
         List results = new ArrayList();
-        session.setGlobal( "results",
-                                 results );
+        ksession.setGlobal( "results",
+                            results );
 
         final Cheese a = new Cheese( "stilton",
                                      10 );
@@ -575,38 +590,46 @@
                                      15 );
         final Cheese c = new Cheese( "stilton",
                                      20 );
-        session.insert( a );
-        session.insert( b );
-        session.insert( c );
+        ksession.insert( a );
+        ksession.insert( b );
+        ksession.insert( c );
         
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DynamicNotNode.drl" ) ) );
-        final Package pkg = builder.getPackage();
-        ruleBase.addPackage( SerializationHelper.serializeObject( pkg ) );
-        ruleBase = SerializationHelper.serializeObject( ruleBase );
-        session = SerializationHelper.getSerialisedStatefulSession( session,
-                                                                    ruleBase );
-        results = (List) session.getGlobal( "results" );
+        kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();        
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_DynamicNotNode.drl", getClass() ), ResourceType.DRL );        
+        if ( kbuilder.hasErrors() ) {
+            fail ( kbuilder.getErrors().toString() );
+        }                        
+        kpkgs = SerializationHelper.serializeObject( kbuilder.getKnowledgePackages() );        
+        kbase.addKnowledgePackages( kpkgs );
+        kbase = SerializationHelper.serializeObject( kbase );    
+        
+        ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), false );
+        
+        results = (List) ksession.getGlobal( "results" );
 
-        session.fireAllRules();
+        ksession.fireAllRules();
 
         assertEquals( 0,
                       results.size() );
 
-        ruleBase.removePackage( "org.drools" );
+        kbase.removeKnowledgePackage( "org.drools" );
 
-        session.retract( session.getFactHandle( b ) );
+        ksession.retract( ksession.getFactHandle( b ) );
+        
+        kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();        
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_DynamicNotNode.drl", getClass() ), ResourceType.DRL );        
+        if ( kbuilder.hasErrors() ) {
+            fail ( kbuilder.getErrors().toString() );
+        }                        
+        kpkgs = SerializationHelper.serializeObject( kbuilder.getKnowledgePackages() );        
+        kbase.addKnowledgePackages( kpkgs );
+        kbase = SerializationHelper.serializeObject( kbase );
+        
+        ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), false );
+        
+        results = (List) ksession.getGlobal( "results" );
+        ksession.fireAllRules();
 
-        final PackageBuilder builder1 = new PackageBuilder();
-        builder1.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DynamicNotNode.drl" ) ) );
-        final Package pkg1 = builder.getPackage();
-        ruleBase.addPackage( SerializationHelper.serializeObject( pkg1 ) );
-        ruleBase = SerializationHelper.serializeObject( ruleBase );
-        session = SerializationHelper.getSerialisedStatefulSession( session,
-                                                                    ruleBase );
-        results = (List) session.getGlobal( "results" );
-        session.fireAllRules();
-
         assertEquals( 1,
                       results.size() );
     }

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	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,10 +1,14 @@
 package org.drools.integrationtests;
 
 import static org.drools.integrationtests.SerializationHelper.getSerialisedStatefulSession;
+import static org.drools.integrationtests.SerializationHelper.getSerialisedStatefulKnowledgeSession;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.io.InputStreamReader;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
 import java.io.Reader;
 import java.io.StringReader;
 import java.util.ArrayList;
@@ -22,6 +26,8 @@
 import org.drools.FactA;
 import org.drools.FactB;
 import org.drools.FactC;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
 import org.drools.Message;
 import org.drools.Person;
 import org.drools.Primitives;
@@ -31,24 +37,34 @@
 import org.drools.StatefulSession;
 import org.drools.WorkingMemory;
 import org.drools.base.ClassObjectType;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
 import org.drools.common.BaseNode;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalRuleBase;
 import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
-import org.drools.marshalling.DefaultMarshaller;
+import org.drools.impl.EnvironmentFactory;
+import org.drools.impl.KnowledgeBaseImpl;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
+import org.drools.io.ResourceFactory;
 import org.drools.marshalling.Marshaller;
-import org.drools.marshalling.RuleBaseNodes;
+import org.drools.marshalling.MarshallerFactory;
+import org.drools.marshalling.impl.DefaultMarshaller;
+import org.drools.marshalling.impl.RuleBaseNodes;
 import org.drools.reteoo.ObjectTypeNode;
+import org.drools.reteoo.ReteooStatefulSession;
 import org.drools.reteoo.RuleTerminalNode;
 import org.drools.rule.MapBackedClassLoader;
 import org.drools.rule.Package;
 import org.drools.rule.Rule;
+import org.drools.runtime.StatefulKnowledgeSession;
 import org.drools.spi.GlobalResolver;
 import org.drools.util.DroolsStreamUtils;
 
 public class MarshallingTest extends TestCase {
-
+    
     public void testSerializable() throws Exception {
 
         final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_Serializable.drl" ) );
@@ -493,18 +509,21 @@
 
         // serialize session and rulebase out
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Marshaller marshaller = new DefaultMarshaller();
-        ruleBase.writeStatefulSession( session,
-                                       baos,
-                                       marshaller );
+        StatefulKnowledgeSessionImpl ksession = new StatefulKnowledgeSessionImpl( (ReteooStatefulSession ) session );
+        Marshaller marshaller = MarshallerFactory.newMarshaller( ksession.getKnowledgeBase() );
+        marshaller.marshall( baos, ksession );
+        baos.close();
+
         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 );
+        
+        marshaller = MarshallerFactory.newMarshaller( new KnowledgeBaseImpl( ruleBase ) );
+        ksession = ( StatefulKnowledgeSessionImpl ) marshaller.unmarshall( new ByteArrayInputStream( baos.toByteArray() ), KnowledgeBaseFactory.newKnowledgeSessionConfiguration(), EnvironmentFactory.newEnvironment() );
+        session =  (ReteooStatefulSession ) ksession.session;
         session.setGlobalResolver( resolver );
 
         // dynamically add a new package
@@ -524,17 +543,23 @@
         results = (List) session.getGlobal( "results" );
         assertEquals( 4,
                       results.size() );
-        assertEquals( bob.getObject(),
+        
+        assertEquals( stilton2.getObject(),
                       results.get( 1 ) );
-        assertEquals( stilton2.getObject(),
+        
+
+        assertEquals( mark.getObject(),
                       results.get( 2 ) );
-        assertEquals( mark.getObject(),
+        
+        assertEquals( bob.getObject(),
                       results.get( 3 ) );
 
+
         serializedRulebase = null;
 
         session = SerializationHelper.getSerialisedStatefulSession( session,
                                                                     ruleBase );
+        
         serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         // dispose session
@@ -571,11 +596,14 @@
         session.fireAllRules();
 
         GlobalResolver resolver = session.getGlobalResolver();
+        
+        // serialize session and rulebase out
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Marshaller marshaller = new DefaultMarshaller();
-        ruleBase.writeStatefulSession( session,
-                                       baos,
-                                       marshaller );
+        StatefulKnowledgeSessionImpl ksession = new StatefulKnowledgeSessionImpl( (ReteooStatefulSession ) session );
+        Marshaller marshaller = MarshallerFactory.newMarshaller( ksession.getKnowledgeBase() );
+        marshaller.marshall( baos, ksession );
+        baos.close();
+        
         byte[] serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         session.dispose();
@@ -587,9 +615,11 @@
 
         // now recreate the rulebase, deserialize the session and test it
         ruleBase = (RuleBase) DroolsStreamUtils.streamIn( serializedRulebase );
-        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ),
-                                                marshaller );
+        marshaller = MarshallerFactory.newMarshaller( new KnowledgeBaseImpl( ruleBase ) );
+        ksession = ( StatefulKnowledgeSessionImpl ) marshaller.unmarshall( new ByteArrayInputStream( baos.toByteArray() ), KnowledgeBaseFactory.newKnowledgeSessionConfiguration(), EnvironmentFactory.newEnvironment() );
+        session =  (ReteooStatefulSession ) ksession.session;
         session.setGlobalResolver( resolver );
+
         results = (List) session.getGlobal( "results" );
 
         builder = new PackageBuilder();
@@ -606,14 +636,17 @@
         session.fireAllRules();
         assertEquals( 5,
                       results.size() );
-        assertEquals( brie1.getObject(),
+        
+        assertEquals( stilton2.getObject(),
                       results.get( 1 ) );
-        assertEquals( stilton2.getObject(),
+   
+        assertEquals( brie3.getObject(),
                       results.get( 2 ) );
         assertEquals( brie2.getObject(),
+                      results.get( 3 ) );
+        
+        assertEquals( brie1.getObject(),
                       results.get( 4 ) );
-        assertEquals( brie3.getObject(),
-                      results.get( 3 ) );
 
         serializedRulebase = null;
 
@@ -645,13 +678,14 @@
         InternalFactHandle brie1 = (InternalFactHandle) session.insert( new Cheese( "brie",
                                                                                     10 ) );
         session.fireAllRules();
-
+        
         GlobalResolver resolver = session.getGlobalResolver();
+        
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Marshaller marshaller = new DefaultMarshaller();
-        ruleBase.writeStatefulSession( session,
-                                       baos,
-                                       marshaller );
+        StatefulKnowledgeSessionImpl ksession = new StatefulKnowledgeSessionImpl( (ReteooStatefulSession ) session );
+        Marshaller marshaller = MarshallerFactory.newMarshaller( ksession.getKnowledgeBase() );
+        marshaller.marshall( baos, ksession );
+        baos.close();
         byte[] serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         session.dispose();
@@ -663,8 +697,9 @@
 
         // now recreate the rulebase, deserialize the session and test it
         ruleBase = (RuleBase) DroolsStreamUtils.streamIn( serializedRulebase );
-        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ),
-                                                marshaller );
+        marshaller = MarshallerFactory.newMarshaller( new KnowledgeBaseImpl( ruleBase ) );
+        ksession = ( StatefulKnowledgeSessionImpl ) marshaller.unmarshall( new ByteArrayInputStream( baos.toByteArray() ), KnowledgeBaseFactory.newKnowledgeSessionConfiguration(), EnvironmentFactory.newEnvironment() );
+        session =  (ReteooStatefulSession ) ksession.session;
         session.setGlobalResolver( resolver );
         results = (List) session.getGlobal( "results" );
 
@@ -697,18 +732,19 @@
 
         resolver = session.getGlobalResolver();
         baos = new ByteArrayOutputStream();
-        marshaller = new DefaultMarshaller();
-        ruleBase.writeStatefulSession( session,
-                                       baos,
-                                       marshaller );
+        ksession = new StatefulKnowledgeSessionImpl( (ReteooStatefulSession ) session );
+        marshaller = MarshallerFactory.newMarshaller( ksession.getKnowledgeBase() );
+        marshaller.marshall( baos, ksession );
+        baos.close();
         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 );
+        marshaller = MarshallerFactory.newMarshaller( new KnowledgeBaseImpl( ruleBase ) );
+        ksession = ( StatefulKnowledgeSessionImpl ) marshaller.unmarshall( new ByteArrayInputStream( baos.toByteArray() ), KnowledgeBaseFactory.newKnowledgeSessionConfiguration(), EnvironmentFactory.newEnvironment() );
+        session =  (ReteooStatefulSession ) ksession.session;
         session.setGlobalResolver( resolver );
         results = (List) session.getGlobal( "results" );
 
@@ -747,17 +783,18 @@
 
         resolver = session.getGlobalResolver();
         baos = new ByteArrayOutputStream();
-        marshaller = new DefaultMarshaller();
-        ruleBase.writeStatefulSession( session,
-                                       baos,
-                                       marshaller );
+        ksession = new StatefulKnowledgeSessionImpl( (ReteooStatefulSession ) session );
+        marshaller = MarshallerFactory.newMarshaller( ksession.getKnowledgeBase() );
+        marshaller.marshall( baos, ksession );
+        baos.close();
         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 );
+        marshaller = MarshallerFactory.newMarshaller( new KnowledgeBaseImpl( ruleBase ) );
+        ksession = ( StatefulKnowledgeSessionImpl ) marshaller.unmarshall( new ByteArrayInputStream( baos.toByteArray() ), KnowledgeBaseFactory.newKnowledgeSessionConfiguration(), EnvironmentFactory.newEnvironment() );
+        session =  (ReteooStatefulSession ) ksession.session;
         session.setGlobalResolver( resolver );
         results = (List) session.getGlobal( "results" );
 
@@ -791,6 +828,7 @@
 
         session = SerializationHelper.getSerialisedStatefulSession( session,
                                                                     ruleBase );
+
         serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         session.dispose();
@@ -825,11 +863,13 @@
                                                                                     10 ) );
         session.fireAllRules();
 
+        GlobalResolver resolver = session.getGlobalResolver();
+        
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Marshaller marshaller = new DefaultMarshaller();
-        ruleBase.writeStatefulSession( session,
-                                       baos,
-                                       marshaller );
+        StatefulKnowledgeSessionImpl ksession = new StatefulKnowledgeSessionImpl( (ReteooStatefulSession ) session );
+        Marshaller marshaller = MarshallerFactory.newMarshaller( ksession.getKnowledgeBase() );
+        marshaller.marshall( baos, ksession );
+        baos.close();
         byte[] serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         session.dispose();
@@ -841,8 +881,9 @@
 
         // now recreate the rulebase, deserialize the session and test it
         ruleBase = (RuleBase) DroolsStreamUtils.streamIn( serializedRulebase );
-        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ),
-                                                marshaller );
+        marshaller = MarshallerFactory.newMarshaller( new KnowledgeBaseImpl( ruleBase ) );
+        ksession = ( StatefulKnowledgeSessionImpl ) marshaller.unmarshall( new ByteArrayInputStream( baos.toByteArray() ), KnowledgeBaseFactory.newKnowledgeSessionConfiguration(), EnvironmentFactory.newEnvironment() );
+        session =  (ReteooStatefulSession ) ksession.session;
         results.clear();
         session.setGlobal( "results",
                            results );
@@ -875,18 +916,19 @@
         serializedRulebase = null;
 
         baos = new ByteArrayOutputStream();
-        marshaller = new DefaultMarshaller();
-        ruleBase.writeStatefulSession( session,
-                                       baos,
-                                       marshaller );
+        ksession = new StatefulKnowledgeSessionImpl( (ReteooStatefulSession ) session );
+        marshaller = MarshallerFactory.newMarshaller( ksession.getKnowledgeBase() );
+        marshaller.marshall( baos, ksession );
+        baos.close();
         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 );
+        marshaller = MarshallerFactory.newMarshaller( new KnowledgeBaseImpl( ruleBase ) );
+        ksession = ( StatefulKnowledgeSessionImpl ) marshaller.unmarshall( new ByteArrayInputStream( baos.toByteArray() ), KnowledgeBaseFactory.newKnowledgeSessionConfiguration(), EnvironmentFactory.newEnvironment() );
+        session =  (ReteooStatefulSession ) ksession.session;
         results.clear();
         session.setGlobal( "results",
                            results );
@@ -914,8 +956,9 @@
 
         // now recreate the rulebase, deserialize the session and test it
         ruleBase = (RuleBase) DroolsStreamUtils.streamIn( serializedRulebase );
-        session = ruleBase.readStatefulSession( new ByteArrayInputStream( baos.toByteArray() ),
-                                                marshaller );
+        marshaller = MarshallerFactory.newMarshaller( new KnowledgeBaseImpl( ruleBase ) );
+        ksession = ( StatefulKnowledgeSessionImpl ) marshaller.unmarshall( new ByteArrayInputStream( baos.toByteArray() ), KnowledgeBaseFactory.newKnowledgeSessionConfiguration(), EnvironmentFactory.newEnvironment() );
+        session =  (ReteooStatefulSession ) ksession.session;
         results.clear();
         session.setGlobal( "results",
                            results );
@@ -943,17 +986,18 @@
         byte[] serializedSession = null;
         serializedRulebase = null;
         baos = new ByteArrayOutputStream();
-        marshaller = new DefaultMarshaller();
-        ruleBase.writeStatefulSession( session,
-                                       baos,
-                                       marshaller );
+        ksession = new StatefulKnowledgeSessionImpl( (ReteooStatefulSession ) session );
+        marshaller = MarshallerFactory.newMarshaller( ksession.getKnowledgeBase() );
+        marshaller.marshall( baos, ksession );
+        baos.close();
         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
+        marshaller = MarshallerFactory.newMarshaller( new KnowledgeBaseImpl( ruleBase ) );
+        ksession = ( StatefulKnowledgeSessionImpl ) marshaller.unmarshall( new ByteArrayInputStream( baos.toByteArray() ), KnowledgeBaseFactory.newKnowledgeSessionConfiguration(), EnvironmentFactory.newEnvironment() );
+        session =  (ReteooStatefulSession ) ksession.session;
         results.clear();
         session.setGlobal( "results",
                            results );
@@ -980,6 +1024,7 @@
 
         session = SerializationHelper.getSerialisedStatefulSession( session,
                                                                     ruleBase );
+        
         serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
         session.dispose();
@@ -1426,85 +1471,89 @@
         rule1 += "    list.add( new Integer( 5 ) );\n";
         rule1 += "end\n";
 
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new StringReader( header + rule1 ) );
-        final Package pkg = builder.getPackage();
+        final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( (header + rule1 ).getBytes() ), ResourceType.DRL ) ;
+        
+        if ( kbuilder.hasErrors() ) {
+            fail( kbuilder.getErrors().toString() );
+        }
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
 
-        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-        ruleBase.addPackage( pkg );
 
-        StatefulSession session = ruleBase.newStatefulSession();
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
         List list = new ArrayList();
-        session.setGlobal( "list",
+        ksession.setGlobal( "list",
                            list );
 
         // add a person, no cheese
-        session = getSerialisedStatefulSession( session );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
         Person bobba = new Person( "bobba fet",
                                    50 );
-        session.insert( bobba );
-        session = getSerialisedStatefulSession( session );
-        session.fireAllRules();
+        ksession.insert( bobba );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
+        ksession.fireAllRules();
         assertEquals( 1,
                       list.size() );
 
         // add another person, no cheese
-        session = getSerialisedStatefulSession( session );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
         Person darth = new Person( "darth vadar",
                                    200 );
-        session.insert( darth );
-        session = getSerialisedStatefulSession( session );
-        session.fireAllRules();
+        ksession.insert( darth );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
+        ksession.fireAllRules();
         assertEquals( 2,
                       list.size() );
 
         // add cheese 
-        session = getSerialisedStatefulSession( session );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
         Cheese stilton = new Cheese( "stilton",
                                      5 );
-        session.insert( stilton );
-        session = getSerialisedStatefulSession( session );
-        session.fireAllRules();
+        ksession.insert( stilton );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
+        ksession.fireAllRules();
         assertEquals( 2,
                       list.size() );
 
         // remove cheese
-        session = getSerialisedStatefulSession( session );
-        session.retract( session.getFactHandle( stilton ) );
-        session = getSerialisedStatefulSession( session );
-        session.fireAllRules();
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
+        ksession.retract( ksession.getFactHandle( stilton ) );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
+        ksession.fireAllRules();
         assertEquals( 4,
                       list.size() );
 
         // put 2 cheeses back in
-        session = getSerialisedStatefulSession( session );
-        session.insert( stilton );
-        session = getSerialisedStatefulSession( session );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
+        ksession.insert( stilton );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
         Cheese brie = new Cheese( "brie",
                                   18 );
-        session.insert( brie );
-        session.fireAllRules();
+        ksession.insert( brie );
+        ksession.fireAllRules();
         assertEquals( 4,
                       list.size() );
 
         // now remove a cheese, should be no change
-        session.retract( session.getFactHandle( stilton ) );
-        session = getSerialisedStatefulSession( session );
-        session.fireAllRules();
+        ksession.retract( ksession.getFactHandle( stilton ) );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
+        ksession.fireAllRules();
         assertEquals( 4,
                       list.size() );
 
         // now remove a person, should be no change
-        session.retract( session.getFactHandle( bobba ) );
-        session = getSerialisedStatefulSession( session );
-        session.fireAllRules();
+        ksession.retract( ksession.getFactHandle( bobba ) );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
+        ksession.fireAllRules();
         assertEquals( 4,
                       list.size() );
 
         //removal remaining cheese, should increase by one, as one person left
-        session.retract( session.getFactHandle( brie ) );
-        session = getSerialisedStatefulSession( session );
-        session.fireAllRules();
+        ksession.retract( ksession.getFactHandle( brie ) );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
+        ksession.fireAllRules();
         assertEquals( 5,
                       list.size() );
     }
@@ -1525,92 +1574,96 @@
         rule1 += "    list.add( new Integer( 5 ) );\n";
         rule1 += "end\n";
 
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new StringReader( header + rule1 ) );
-        final Package pkg = builder.getPackage();
+        final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( (header + rule1 ).getBytes() ), ResourceType.DRL ) ;
+        
+        if ( kbuilder.hasErrors() ) {
+            fail( kbuilder.getErrors().toString() );
+        }
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
 
-        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-        ruleBase.addPackage( pkg );
 
-        StatefulSession session = ruleBase.newStatefulSession();
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
         List list = new ArrayList();
-        session.setGlobal( "list",
+        ksession.setGlobal( "list",
                            list );
 
         // add a person, no cheese
-        session = getSerialisedStatefulSession( session );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
         Person bobba = new Person( "bobba fet",
                                    50 );
-        session.insert( bobba );
-        session = getSerialisedStatefulSession( session );
-        session.fireAllRules();
+        ksession.insert( bobba );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
+        ksession.fireAllRules();
         assertEquals( 0,
                       list.size() );
 
         // add another person, no cheese
-        session = getSerialisedStatefulSession( session );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
         Person darth = new Person( "darth vadar",
                                    200 );
-        session.insert( darth );
-        session = getSerialisedStatefulSession( session );
-        session.fireAllRules();
+        ksession.insert( darth );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
+        ksession.fireAllRules();
         assertEquals( 0,
                       list.size() );
 
         // add cheese 
-        session = getSerialisedStatefulSession( session );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
         Cheese stilton = new Cheese( "stilton",
                                      5 );
-        session.insert( stilton );
-        session = getSerialisedStatefulSession( session );
-        session.fireAllRules();
+        ksession.insert( stilton );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
+        ksession.fireAllRules();
         assertEquals( 2,
                       list.size() );
 
         // remove cheese
-        session = getSerialisedStatefulSession( session );
-        session.retract( session.getFactHandle( stilton ) );
-        session = getSerialisedStatefulSession( session );
-        session.fireAllRules();
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
+        ksession.retract( ksession.getFactHandle( stilton ) );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
+        ksession.fireAllRules();
         assertEquals( 2,
                       list.size() );
 
         // put 2 cheeses back in
-        session = getSerialisedStatefulSession( session );
-        session.insert( stilton );
-        session = getSerialisedStatefulSession( session );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
+        ksession.insert( stilton );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
         Cheese brie = new Cheese( "brie",
                                   18 );
-        session.insert( brie );
-        session.fireAllRules();
+        ksession.insert( brie );
+        ksession.fireAllRules();
         assertEquals( 4,
                       list.size() );
 
         // now remove a cheese, should be no change
-        session.retract( session.getFactHandle( stilton ) );
-        session = getSerialisedStatefulSession( session );
-        session.fireAllRules();
+        ksession.retract( ksession.getFactHandle( stilton ) );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
+        ksession.fireAllRules();
         assertEquals( 4,
                       list.size() );
 
         // now remove a person, should be no change
-        session.retract( session.getFactHandle( bobba ) );
-        session = getSerialisedStatefulSession( session );
-        session.fireAllRules();
+        ksession.retract( ksession.getFactHandle( bobba ) );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
+        ksession.fireAllRules();
         assertEquals( 4,
                       list.size() );
 
         //removal remaining cheese, no
-        session.retract( session.getFactHandle( brie ) );
-        session = getSerialisedStatefulSession( session );
-        session.fireAllRules();
+        ksession.retract( ksession.getFactHandle( brie ) );
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
+        ksession.fireAllRules();
         assertEquals( 4,
                       list.size() );
 
         // put one cheese back in, with one person should increase by one
-        session = getSerialisedStatefulSession( session );
-        session.insert( stilton );
-        session.fireAllRules();
+        ksession = getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), true );
+        ksession.insert( stilton );
+        ksession.fireAllRules();
         assertEquals( 5,
                       list.size() );
     }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -117,11 +117,14 @@
 import org.drools.event.WorkingMemoryEventListener;
 import org.drools.facttemplates.Fact;
 import org.drools.facttemplates.FactTemplate;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
 import org.drools.io.ResourceFactory;
 import org.drools.lang.DrlDumper;
 import org.drools.lang.descr.AttributeDescr;
 import org.drools.lang.descr.PackageDescr;
 import org.drools.lang.descr.RuleDescr;
+import org.drools.marshalling.MarshallerFactory;
+import org.drools.reteoo.ReteooWorkingMemory;
 import org.drools.rule.InvalidRulePackage;
 import org.drools.rule.Package;
 import org.drools.rule.builder.dialect.java.JavaDialectConfiguration;
@@ -131,6 +134,8 @@
 import org.drools.spi.GlobalResolver;
 import org.drools.xml.XmlDumper;
 
+import com.thoughtworks.xstream.MarshallingStrategy;
+
 /** Run all the tests with the ReteOO engine implementation */
 public class MiscTest extends TestCase {
 
@@ -1506,10 +1511,11 @@
                       ((List) session.getGlobal( "list" )).size() );
 
         state.setState( "finished" );
+        
+        
+        StatefulKnowledgeSession ksesion = SerializationHelper.getSerialisedStatefulKnowledgeSession( new StatefulKnowledgeSessionImpl( (ReteooWorkingMemory) session), MarshallerFactory.newIdentityMarshallingStrategy(), false );
 
-        session = SerializationHelper.getSerialisedStatefulSession( session,
-                                                                    ruleBase );
-        session.fireAllRules();
+        ksesion.fireAllRules();
         assertEquals( 3,
                       ((List) session.getGlobal( "list" )).size() );
 
@@ -1682,18 +1688,23 @@
 
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "evalmodify.drl" ) ) );
+        
+        if ( builder.hasErrors() ) {
+            fail( builder.getErrors().toString() );
+        }
 
         RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( builder.getPackage() );
+        Package pkg = builder.getPackage();
+        ruleBase.addPackage( pkg );
         ruleBase = SerializationHelper.serializeObject( ruleBase );
 
         StatefulSession session = ruleBase.newStatefulSession();
         session.insert( cell1 );
         FactHandle cellHandle = session.insert( cell );
 
-        session = SerializationHelper.getSerialisedStatefulSession( session,
-                                                                    ruleBase );
-        session.fireAllRules();
+        StatefulKnowledgeSession ksesion = SerializationHelper.getSerialisedStatefulKnowledgeSession( new StatefulKnowledgeSessionImpl( (ReteooWorkingMemory) session), MarshallerFactory.newIdentityMarshallingStrategy(), false );
+        
+        ksesion.fireAllRules();
         assertEquals( 9,
                       cell.getValue() );
     }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessMarchallingTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessMarchallingTest.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessMarchallingTest.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -19,12 +19,16 @@
 import org.drools.StatefulSession;
 import org.drools.compiler.PackageBuilder;
 import org.drools.impl.EnvironmentFactory;
-import org.drools.marshalling.DefaultMarshaller;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
 import org.drools.marshalling.Marshaller;
+import org.drools.marshalling.MarshallerFactory;
+import org.drools.marshalling.impl.DefaultMarshaller;
 import org.drools.process.core.context.variable.VariableScope;
 import org.drools.process.instance.ProcessInstance;
 import org.drools.process.instance.context.variable.VariableScopeInstance;
+import org.drools.reteoo.ReteooWorkingMemory;
 import org.drools.rule.Package;
+import org.drools.runtime.StatefulKnowledgeSession;
 import org.drools.runtime.process.WorkItem;
 import org.drools.runtime.process.WorkItemHandler;
 import org.drools.runtime.process.WorkItemManager;
@@ -539,17 +543,19 @@
         session.startProcess("com.sample.ruleflow", null);
         assertEquals(1, session.getProcessInstances().size());
         
-        Marshaller marshaller = new DefaultMarshaller();
+        StatefulKnowledgeSession ksession = new StatefulKnowledgeSessionImpl( (ReteooWorkingMemory) session );
+        Marshaller marshaller = MarshallerFactory.newMarshaller( ksession.getKnowledgeBase() );
+     
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        ruleBase.writeStatefulSession(session, baos, marshaller);
+        marshaller.marshall( baos, ksession );
         byte[] b1 = baos.toByteArray();
         session.halt();
         session.dispose();
         Thread.sleep(400);
         
-        ByteArrayInputStream bais = new ByteArrayInputStream( b1 );
-        final StatefulSession session2 = ruleBase.readStatefulSession(bais, true, marshaller, new SessionConfiguration(), EnvironmentFactory.newEnvironment());
+        ByteArrayInputStream bais = new ByteArrayInputStream( b1 );        
+        final StatefulSession session2 = ( StatefulSession ) (( StatefulKnowledgeSessionImpl) marshaller.unmarshall( bais ) ).session;
         
 		new Thread(new Runnable() {
 			public void run() {

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/SerializationHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/SerializationHelper.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/SerializationHelper.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -3,12 +3,23 @@
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
 
+import org.drools.KnowledgeBase;
 import org.drools.RuleBase;
+import org.drools.SessionConfiguration;
 import org.drools.StatefulSession;
 import org.drools.common.InternalWorkingMemory;
-import org.drools.marshalling.DefaultMarshaller;
+import org.drools.impl.EnvironmentFactory;
+import org.drools.impl.KnowledgeBaseImpl;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
 import org.drools.marshalling.Marshaller;
+import org.drools.marshalling.MarshallerFactory;
+import org.drools.marshalling.ObjectMarshallingStrategy;
+import org.drools.marshalling.impl.DefaultMarshaller;
+import org.drools.reteoo.ReteooStatefulSession;
+import org.drools.runtime.StatefulKnowledgeSession;
 import org.drools.util.DroolsStreamUtils;
 
 /**
@@ -50,33 +61,32 @@
     public static StatefulSession getSerialisedStatefulSession(StatefulSession session,
                                                                RuleBase ruleBase,
                                                                boolean dispose) throws Exception {
-        Marshaller marshaller = new DefaultMarshaller();
+        // Serialize to a byte array
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        ObjectOutput out = new ObjectOutputStream( bos );
+        out.writeObject( session );
+        out.close();
+        bos.close();
 
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        ruleBase.writeStatefulSession( session,
-                                       baos,
-                                       marshaller );
+        // Get the bytes of the serialized object
+        final byte[] b1 = bos.toByteArray();
 
-        byte[] b1 = baos.toByteArray();
         ByteArrayInputStream bais = new ByteArrayInputStream( b1 );
-        StatefulSession session2 = ruleBase.readStatefulSession( bais,
-                                                                true,
-                                                                marshaller,
-                                                                ((InternalWorkingMemory) session).getSessionConfiguration(),
-                                                                session.getEnvironment());
+        StatefulSession session2 = ruleBase.newStatefulSession( bais );
+        bais.close();
 
-        // write methods allways needs a new marshaller for Identity strategies
-        marshaller = new DefaultMarshaller();        
-        baos = new ByteArrayOutputStream();
-        ruleBase.writeStatefulSession( session2,
-                                       baos,
-                                       marshaller );
+        bos = new ByteArrayOutputStream();
+        out = new ObjectOutputStream( bos );
+        out.writeObject( session2 );
+        out.close();
+        bos.close();
 
-        byte[] b2 = baos.toByteArray();
+        final byte[] b2 = bos.toByteArray();
+
         // bytes should be the same.
         if ( !areByteArraysEqual( b1,
                                   b2 ) ) {
-            throw new IllegalArgumentException("byte streams for serialisation test are not equal");
+            throw new IllegalArgumentException( "byte streams for serialisation test are not equal" );
         }
 
         session2.setGlobalResolver( session.getGlobalResolver() );
@@ -88,6 +98,51 @@
         return session2;
     }
 
+    public static StatefulKnowledgeSession getSerialisedStatefulKnowledgeSession(StatefulKnowledgeSession ksession,
+                                                                        boolean dispose) throws Exception {
+        
+        return getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newSerializeMarshallingStrategy(), dispose);
+    }
+    
+    public static StatefulKnowledgeSession getSerialisedStatefulKnowledgeSession(StatefulKnowledgeSession ksession,
+                                                                         ObjectMarshallingStrategy strategy,
+                                                                        boolean dispose) throws Exception {
+        
+        Marshaller marshaller = MarshallerFactory.newMarshaller( ksession.getKnowledgeBase(), new ObjectMarshallingStrategy[]{ strategy } );
+
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        marshaller.marshall( bos,
+                             ksession );
+        final byte[] b1 = bos.toByteArray();
+        bos.close();
+
+        ByteArrayInputStream bais = new ByteArrayInputStream( b1 );
+        StatefulKnowledgeSession ksession2 = marshaller.unmarshall( bais,
+                                                                    new SessionConfiguration(),
+                                                                    EnvironmentFactory.newEnvironment() );
+        bais.close();
+
+        bos = new ByteArrayOutputStream();
+        marshaller.marshall( bos,
+                             ksession2 );
+        final byte[] b2 = bos.toByteArray();
+        bos.close();
+
+        // bytes should be the same.
+        if ( !areByteArraysEqual( b1,
+                                  b2 ) ) {
+            throw new IllegalArgumentException( "byte streams for serialisation test are not equal" );
+        }
+
+        ((StatefulKnowledgeSessionImpl) ksession2).session.setGlobalResolver( ((StatefulKnowledgeSessionImpl) ksession).session.getGlobalResolver() );
+
+        if ( dispose ) {
+            ksession.dispose();
+        }
+
+        return ksession2;
+    }    
+
     public static boolean areByteArraysEqual(byte[] b1,
                                              byte[] b2) {
         if ( b1.length != b2.length ) {

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -59,12 +59,6 @@
 		return null;
 	}
 
-	public StatefulSession newStatefulSession(InputStream stream)
-			throws IOException, ClassNotFoundException {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
 	public StatefulSession readStatefulSession(InputStream stream,
 			boolean keepReference) throws IOException, ClassNotFoundException {
 		// TODO Auto-generated method stub
@@ -173,4 +167,15 @@
         // TODO Auto-generated method stub
         return null;
     }
+
+    public StatefulSession newStatefulSession(InputStream stream,
+                                              boolean keepReference) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public StatefulSession newStatefulSession(InputStream stream) {
+        // TODO Auto-generated method stub
+        return null;
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-core/.classpath	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/.classpath	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,21 +1,20 @@
-<?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="src" path="src/main/java"/>
-	<classpathentry excluding="**/*.java" kind="src" path="src/main/resources"/>
-	<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
-	<classpathentry excluding="**/*.java" including="**" kind="src" output="target/test-classes" path="src/test/resources"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="var" path="M2_REPO/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar"/>
-	<classpathentry kind="src" path="/drools-api"/>
-	<classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
-	<classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
-	<classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.1/jmock-2.5.1.jar"/>
-	<classpathentry kind="var" path="M2_REPO/org/jmock/jmock-legacy/2.5.1/jmock-legacy-2.5.1.jar"/>
-	<classpathentry kind="var" path="M2_REPO/joda-time/joda-time/1.5.2/joda-time-1.5.2.jar"/>
-	<classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
-	<classpathentry kind="var" path="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0.jar"/>
-	<classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar"/>
-	<classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.jar"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/mvel"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+  <classpathentry kind="src" path="src/main/java"/>
+  <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+  <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+  <classpathentry kind="src" path="src/test/resources" output="target/test-classes" including="**" excluding="**/*.java"/>
+  <classpathentry kind="output" path="target/classes"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="var" path="M2_REPO/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar"/>
+  <classpathentry kind="src" path="/drools-api"/>
+  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.1/jmock-2.5.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock-legacy/2.5.1/jmock-legacy-2.5.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/joda-time/joda-time/1.5.2/joda-time-1.5.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.7-SNAPSHOT/mvel2-2.0.7-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar"/>
+  <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.jar"/>
+</classpath>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBase.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBase.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -22,6 +22,7 @@
 import java.io.OutputStream;
 
 import org.drools.definition.type.FactType;
+import org.drools.impl.EnvironmentFactory;
 import org.drools.marshalling.Marshaller;
 import org.drools.rule.Package;
 import org.drools.runtime.Environment;
@@ -67,6 +68,11 @@
     StatefulSession newStatefulSession();
 
     StatefulSession newStatefulSession(boolean keepReference);
+
+    StatefulSession newStatefulSession(java.io.InputStream stream);
+
+    StatefulSession newStatefulSession(java.io.InputStream stream,
+                                                           boolean keepReference);    
     
     /**
      * Create a new <code>WorkingMemory</code> session for this
@@ -82,37 +88,6 @@
      */
     StatefulSession newStatefulSession(SessionConfiguration config, Environment environment);
 
-    StatefulSession readStatefulSession(InputStream stream,
-                                        Marshaller marshaller) throws IOException,
-                                                              ClassNotFoundException;
-
-    /**
-     * RuleBases handle the returning of a Serialized WorkingMemory
-     * pass as an InputStream. If the reference is a byte[] then
-     * wrap with new ByteArrayInputStream. Optionally the RuleBase retains a
-     * weak reference to returned WorkingMemory.
-     *
-     * <p>
-     * The created <code>WorkingMemory</code> uses the default conflict
-     * resolution strategy.
-     * </p>
-     *
-     * @see WorkingMemory
-     * @see org.drools.conflict.DefaultConflictResolver
-     *
-     * @return A serialised initialized <code>WorkingMemory</code>.
-     */
-    StatefulSession readStatefulSession(InputStream stream,
-                                        boolean keepReference,
-                                        Marshaller marshaller,
-                                        SessionConfiguration sessionConfig,
-                                        Environment environment) throws IOException,
-                                                              ClassNotFoundException;
-
-    public void writeStatefulSession(StatefulSession session,
-                                     OutputStream stream,
-                                     Marshaller marshaller) throws IOException;
-
     Package[] getPackages();
 
     Package getPackage(String name);

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/SessionConfiguration.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/SessionConfiguration.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/SessionConfiguration.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -340,15 +340,15 @@
         }
     }
     
-    public CommandService getCommandService(RuleBase ruleBase, Environment environment) {
+    public CommandService getCommandService(KnowledgeBase kbase, Environment environment) {
         if ( this.commandService == null ) {
-            initCommandService(ruleBase, environment);
+            initCommandService(kbase, environment);
         }
         return this.commandService;
     }
 
     @SuppressWarnings("unchecked")
-    private void initCommandService(RuleBase ruleBase, Environment environment) {
+    private void initCommandService(KnowledgeBase kbase, Environment environment) {
         String className = this.chainedProperties.getProperty( "drools.commandService", null );
         if (className == null) {
         	return;
@@ -369,7 +369,7 @@
 
         if ( clazz != null ) {
             try {
-                this.commandService = clazz.getConstructor(RuleBase.class, SessionConfiguration.class, Environment.class).newInstance(ruleBase, this, environment);
+                this.commandService = clazz.getConstructor(KnowledgeBase.class, KnowledgeSessionConfiguration.class, Environment.class).newInstance(kbase, this, environment);
             } catch ( Exception e ) {
                 throw new IllegalArgumentException( "Unable to instantiate command service '" + className + "'",
                                                     e );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -344,15 +344,6 @@
         }
     }
 
-    public StatefulSession readStatefulSession(final InputStream stream,
-                                               Marshaller marshaller) throws IOException,
-                                                                     ClassNotFoundException {
-        return readStatefulSession( stream,
-                                    true,
-                                    marshaller,
-                                    new SessionConfiguration(),
-                                    EnvironmentFactory.newEnvironment() );
-    }
 
     /**
      * @see RuleBase
@@ -804,7 +795,7 @@
         return process;
     }
 
-    protected synchronized void addStatefulSession(final StatefulSession statefulSession) {
+    public synchronized void addStatefulSession(final StatefulSession statefulSession) {
         this.statefulSessions.add( statefulSession );
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/RuleFlowGroupImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/RuleFlowGroupImpl.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/RuleFlowGroupImpl.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -22,8 +22,8 @@
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
-import org.drools.marshalling.MarshallerReaderContext;
-import org.drools.marshalling.MarshallerWriteContext;
+import org.drools.marshalling.impl.MarshallerReaderContext;
+import org.drools.marshalling.impl.MarshallerWriteContext;
 import org.drools.spi.Activation;
 import org.drools.util.Iterator;
 import org.drools.util.LinkedList;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TruthMaintenanceSystem.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TruthMaintenanceSystem.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TruthMaintenanceSystem.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -24,8 +24,8 @@
 import java.util.Set;
 
 import org.drools.FactException;
-import org.drools.marshalling.MarshallerReaderContext;
-import org.drools.marshalling.MarshallerWriteContext;
+import org.drools.marshalling.impl.MarshallerReaderContext;
+import org.drools.marshalling.impl.MarshallerWriteContext;
 import org.drools.rule.Rule;
 import org.drools.spi.Activation;
 import org.drools.spi.PropagationContext;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/WorkingMemoryAction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/WorkingMemoryAction.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/WorkingMemoryAction.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -6,7 +6,7 @@
 import java.io.Externalizable;
 import java.io.IOException;
 
-import org.drools.marshalling.MarshallerWriteContext;
+import org.drools.marshalling.impl.MarshallerWriteContext;
 
 public interface WorkingMemoryAction extends Externalizable {
     public static final int WorkingMemoryReteAssertAction = 1;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/KnowledgeBaseImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/KnowledgeBaseImpl.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/KnowledgeBaseImpl.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -144,7 +144,7 @@
             environment = EnvironmentFactory.newEnvironment();
         }
         
-    	CommandService commandService = ((SessionConfiguration) conf).getCommandService(this.ruleBase, environment);
+    	CommandService commandService = ((SessionConfiguration) conf).getCommandService(this, environment);
     	if (commandService != null) {
 			return new CommandBasedStatefulKnowledgeSession(commandService);
     	} else {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -50,6 +50,7 @@
 import org.drools.event.rule.impl.ObjectRetractedEventImpl;
 import org.drools.event.rule.impl.ObjectUpdatedEventImpl;
 import org.drools.reteoo.ReteooWorkingMemory;
+import org.drools.runtime.Environment;
 import org.drools.runtime.ExitPoint;
 import org.drools.runtime.Globals;
 import org.drools.runtime.StatefulKnowledgeSession;
@@ -76,14 +77,14 @@
 
     public StatefulKnowledgeSessionImpl(ReteooWorkingMemory session) {
         this( session,
-              null );
+              new KnowledgeBaseImpl( session.getRuleBase() ) );
     }
 
     public StatefulKnowledgeSessionImpl(ReteooWorkingMemory session,
-                                        KnowledgeBaseImpl kbase) {
+                                        KnowledgeBase kbase) {
         this.session = session;
         this.session.setKnowledgeRuntime( this );
-        this.kbase = kbase;
+        this.kbase = ( KnowledgeBaseImpl ) kbase;
         this.mappedWorkingMemoryListeners = new IdentityHashMap<WorkingMemoryEventListener, WorkingMemoryEventListenerWrapper>();
         this.mappedAgendaListeners = new IdentityHashMap<AgendaEventListener, AgendaEventListenerWrapper>();
         this.mappedProcessListeners = new IdentityHashMap<ProcessEventListener, ProcessEventListenerWrapper>();
@@ -251,6 +252,10 @@
     public Globals getGlobals() {
         return (Globals) this.session.getGlobalResolver();
     }
+    
+    public Environment getEnvironment() {
+        return this.session.getEnvironment();
+    }
 
     //    public Future<Object> asyncInsert(Object object) {
     //        return new FutureAdapter( this.session.asyncInsert( object ) );

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/AbstractProcessInstanceMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/AbstractProcessInstanceMarshaller.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/AbstractProcessInstanceMarshaller.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,344 +0,0 @@
-package org.drools.marshalling;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.drools.common.InternalRuleBase;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.process.core.context.swimlane.SwimlaneContext;
-import org.drools.process.core.context.variable.VariableScope;
-import org.drools.process.instance.context.swimlane.SwimlaneContextInstance;
-import org.drools.process.instance.context.variable.VariableScopeInstance;
-import org.drools.process.instance.impl.ProcessInstanceImpl;
-import org.drools.ruleflow.instance.RuleFlowProcessInstance;
-import org.drools.runtime.process.NodeInstance;
-import org.drools.runtime.process.NodeInstanceContainer;
-import org.drools.runtime.process.ProcessInstance;
-import org.drools.workflow.instance.WorkflowProcessInstance;
-import org.drools.workflow.instance.impl.NodeInstanceImpl;
-import org.drools.workflow.instance.impl.WorkflowProcessInstanceImpl;
-import org.drools.workflow.instance.node.CompositeContextNodeInstance;
-import org.drools.workflow.instance.node.ForEachNodeInstance;
-import org.drools.workflow.instance.node.HumanTaskNodeInstance;
-import org.drools.workflow.instance.node.JoinInstance;
-import org.drools.workflow.instance.node.MilestoneNodeInstance;
-import org.drools.workflow.instance.node.RuleSetNodeInstance;
-import org.drools.workflow.instance.node.SubProcessNodeInstance;
-import org.drools.workflow.instance.node.TimerNodeInstance;
-import org.drools.workflow.instance.node.WorkItemNodeInstance;
-
-/* Author: mfossati, salaboy */
-public abstract class AbstractProcessInstanceMarshaller implements
-		ProcessInstanceMarshaller {
-
-	// Output methods
-
-	public void writeProcessInstance(MarshallerWriteContext context,
-			ProcessInstance processInstance) throws IOException {
-
-		WorkflowProcessInstanceImpl workFlow = (WorkflowProcessInstanceImpl) processInstance;
-		ObjectOutputStream stream = context.stream;
-		stream.writeLong(workFlow.getId());
-		stream.writeUTF(workFlow.getProcessId());
-		stream.writeInt(workFlow.getState());
-		stream.writeLong(workFlow.getNodeInstanceCounter());
-		
-		VariableScopeInstance variableScopeInstance = (VariableScopeInstance) workFlow.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 );
-                              }
-                          } );
-        stream.writeInt( keys.size() );
-        for ( String key : keys ) {
-            stream.writeUTF( key );
-            stream.writeObject( variables.get( key ) );
-        }
-
-        SwimlaneContextInstance swimlaneContextInstance = (SwimlaneContextInstance) workFlow.getContextInstance( SwimlaneContext.SWIMLANE_SCOPE );
-        
-        if (swimlaneContextInstance!=null) {
-			Map<String, String> swimlaneActors = swimlaneContextInstance
-					.getSwimlaneActors();
-			stream.writeInt(swimlaneActors.size());
-			for (Map.Entry<String, String> entry : swimlaneActors.entrySet()) {
-				stream.writeUTF(entry.getKey());
-				stream.writeUTF(entry.getValue());
-			}
-		}
-		List<NodeInstance> nodeInstances = new ArrayList<NodeInstance>( workFlow.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,
-                               nodeInstance );
-        }
-        stream.writeShort( PersisterEnums.END );
-	}
-
-	public void writeNodeInstance(MarshallerWriteContext context,
-			NodeInstance nodeInstance) throws IOException {
-		ObjectOutputStream stream = context.stream;
-		stream.writeLong(nodeInstance.getId());
-		stream.writeLong(nodeInstance.getNodeId());
-		writeNodeInstanceContent(stream, nodeInstance, context);
-	}
-
-	protected void writeNodeInstanceContent(ObjectOutputStream stream,
-			NodeInstance nodeInstance, MarshallerWriteContext context)
-			throws IOException {
-		 if ( nodeInstance instanceof RuleSetNodeInstance ) {
-	            stream.writeShort( PersisterEnums.RULE_SET_NODE_INSTANCE );
-	        } else if ( nodeInstance instanceof HumanTaskNodeInstance ) {
-	            stream.writeShort( PersisterEnums.HUMAN_TASK_NODE_INSTANCE );
-	            stream.writeLong( ((HumanTaskNodeInstance) nodeInstance).getWorkItem().getId() );
-	        } else if ( nodeInstance instanceof WorkItemNodeInstance ) {
-	            stream.writeShort( PersisterEnums.WORK_ITEM_NODE_INSTANCE );
-	            stream.writeLong( ((WorkItemNodeInstance) nodeInstance).getWorkItem().getId() );
-	        } else if ( nodeInstance instanceof SubProcessNodeInstance ) {
-	            stream.writeShort( PersisterEnums.SUB_PROCESS_NODE_INSTANCE );
-	            stream.writeLong( ((SubProcessNodeInstance) nodeInstance).getProcessInstanceId() );
-	        } else if ( nodeInstance instanceof MilestoneNodeInstance ) {
-	            stream.writeShort( PersisterEnums.MILESTONE_NODE_INSTANCE );
-	            List<Long> timerInstances = 
-	            	((MilestoneNodeInstance) nodeInstance).getTimerInstances();
-	            if (timerInstances != null) {
-	            	stream.writeInt(timerInstances.size());
-	            	for (Long id: timerInstances) {
-	            		stream.writeLong(id);
-	            	}
-	            } else {
-	            	stream.writeInt(0);
-	            }
-	        } else if ( nodeInstance instanceof TimerNodeInstance ) {
-	            stream.writeShort( PersisterEnums.TIMER_NODE_INSTANCE );
-	            stream.writeLong( ((TimerNodeInstance) nodeInstance).getTimerId() );
-	        } else if ( nodeInstance instanceof JoinInstance ) {
-	            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 );
-	                                  }
-	                              } );
-	            for ( Long key : keys ) {
-	                stream.writeLong( 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 );
-	            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 );
-	                                  }
-	                              } );
-	            stream.writeInt( keys.size() );
-	            for ( String key : keys ) {
-	                stream.writeUTF( 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());
-	                                  }
-	                              } );
-	            for ( NodeInstance subNodeInstance : nodeInstances ) {
-	                stream.writeShort( PersisterEnums.NODE_INSTANCE );
-	                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());
-	                                  }
-	                              } );
-	            for ( NodeInstance subNodeInstance : nodeInstances ) {
-	                if ( subNodeInstance instanceof CompositeContextNodeInstance ) {
-	                    stream.writeShort( PersisterEnums.NODE_INSTANCE );
-	                    writeNodeInstance( context,
-	                                       subNodeInstance );
-	                }
-	            }
-	            stream.writeShort( PersisterEnums.END );
-	        } else {
-	            // TODO ForEachNodeInstance
-	            // TODO timer manager
-	            throw new IllegalArgumentException( "Unknown node instance type: " + nodeInstance );
-	        }
-	}
-
-	// Input methods
-
-	public ProcessInstance readProcessInstance(MarshallerReaderContext context)
-			throws IOException {
-		ObjectInputStream stream = context.stream;
-        InternalRuleBase ruleBase = context.ruleBase;
-        InternalWorkingMemory wm = context.wm;
-
-        RuleFlowProcessInstance processInstance = new RuleFlowProcessInstance();
-        processInstance.setId( stream.readLong() );
-        String processId = stream.readUTF();
-        processInstance.setProcessId( processId );
-        if ( ruleBase != null ) {
-            processInstance.setProcess( ruleBase.getProcess( processId ) );
-        }
-        processInstance.setState( stream.readInt() );
-        long nodeInstanceCounter = stream.readLong();
-        processInstance.setWorkingMemory( wm );
-
-        int nbVariables = stream.readInt();
-        if ( nbVariables > 0 ) {
-            VariableScopeInstance variableScopeInstance = (VariableScopeInstance) processInstance.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 );
-                }
-            }
-        }
-
-        int nbSwimlanes = stream.readInt();
-        if ( nbSwimlanes > 0 ) {
-            SwimlaneContextInstance swimlaneContextInstance = (SwimlaneContextInstance) processInstance.getContextInstance( SwimlaneContext.SWIMLANE_SCOPE );
-            for ( int i = 0; i < nbSwimlanes; i++ ) {
-                String name = stream.readUTF();
-                String value = stream.readUTF();
-                swimlaneContextInstance.setActorId( name,
-                                                    value );
-            }
-        }
-
-        while ( stream.readShort() == PersisterEnums.NODE_INSTANCE ) {
-            readNodeInstance( context,
-                              processInstance,
-                              processInstance );
-        }
-
-        processInstance.internalSetNodeInstanceCounter( nodeInstanceCounter );
-        if ( wm != null ) {
-            processInstance.reconnect();
-        }
-        return processInstance;
-	}
-
-	public NodeInstance readNodeInstance(MarshallerReaderContext context,
-			NodeInstanceContainer nodeInstanceContainer,
-			WorkflowProcessInstance processInstance) throws IOException {
-		ObjectInputStream stream = context.stream;
-		long id = stream.readLong();
-		long nodeId = stream.readLong();
-		int nodeType = stream.readShort();
-		NodeInstanceImpl nodeInstance = readNodeInstanceContent(nodeType,
-				stream, context, processInstance);
-
-		nodeInstance.setNodeId(nodeId);
-		nodeInstance.setNodeInstanceContainer(nodeInstanceContainer);
-		nodeInstance.setProcessInstance(processInstance);
-		nodeInstance.setId(id);
-
-		return nodeInstance;
-	}
-
-	protected NodeInstanceImpl readNodeInstanceContent(int nodeType,
-			ObjectInputStream stream, MarshallerReaderContext context,
-			WorkflowProcessInstance processInstance) throws IOException {
-		NodeInstanceImpl nodeInstance = null;
-		switch ( nodeType ) {
-        case PersisterEnums.RULE_SET_NODE_INSTANCE :
-            nodeInstance = new RuleSetNodeInstance();
-            break;
-        case PersisterEnums.HUMAN_TASK_NODE_INSTANCE :
-            nodeInstance = new HumanTaskNodeInstance();
-            ((HumanTaskNodeInstance) nodeInstance).internalSetWorkItemId( stream.readLong() );
-            break;
-        case PersisterEnums.WORK_ITEM_NODE_INSTANCE :
-            nodeInstance = new WorkItemNodeInstance();
-            ((WorkItemNodeInstance) nodeInstance).internalSetWorkItemId( stream.readLong() );
-            break;
-        case PersisterEnums.SUB_PROCESS_NODE_INSTANCE :
-            nodeInstance = new SubProcessNodeInstance();
-            ((SubProcessNodeInstance) nodeInstance).internalSetProcessInstanceId( stream.readLong() );
-            break;
-        case PersisterEnums.MILESTONE_NODE_INSTANCE :
-            nodeInstance = new MilestoneNodeInstance();
-            int nbTimerInstances = stream.readInt();
-            if (nbTimerInstances > 0) {
-            	List<Long> timerInstances = new ArrayList<Long>();
-            	for (int i = 0; i < nbTimerInstances; i++) {
-            		timerInstances.add(stream.readLong());
-            	}
-            	((MilestoneNodeInstance) nodeInstance).internalSetTimerInstances(timerInstances);
-            }
-            break;
-        case PersisterEnums.TIMER_NODE_INSTANCE :
-            nodeInstance = new TimerNodeInstance();
-            ((TimerNodeInstance) nodeInstance).internalSetTimerId( stream.readLong() );
-            break;
-        case PersisterEnums.JOIN_NODE_INSTANCE :
-            nodeInstance = new JoinInstance();
-            int number = stream.readInt();
-            if ( number > 0 ) {
-                Map<Long, Integer> triggers = new HashMap<Long, Integer>();
-                for ( int i = 0; i < number; i++ ) {
-                    long l = stream.readLong();
-                    int count = stream.readInt();
-                    triggers.put( l,
-                                  count );
-                }
-                ((JoinInstance) nodeInstance).internalSetTriggers( triggers );
-            }
-            break;
-        case PersisterEnums.COMPOSITE_NODE_INSTANCE :
-            nodeInstance = new CompositeContextNodeInstance();
-            break;
-        case PersisterEnums.FOR_EACH_NODE_INSTANCE :
-            nodeInstance = new ForEachNodeInstance();
-            break;
-        default :
-            throw new IllegalArgumentException( "Unknown node type: " + nodeType );
-		}
-		return nodeInstance;
-
-	}
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/ClassPlaceholderResolverStrategyAcceptor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/ClassPlaceholderResolverStrategyAcceptor.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/ClassPlaceholderResolverStrategyAcceptor.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,29 +0,0 @@
-package org.drools.marshalling;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.drools.util.ClassUtils;
-
-public class ClassPlaceholderResolverStrategyAcceptor implements PlaceholderResolverStrategyAcceptor {
-    private final Map<String, Object> patterns;
-    
-    public ClassPlaceholderResolverStrategyAcceptor(String str) {
-        this.patterns = new HashMap<String, Object>();
-        addPatterns(str);
-    }
-    
-    public ClassPlaceholderResolverStrategyAcceptor() {
-        this.patterns = new HashMap<String, Object>();
-    }
-    
-    public void addPatterns(String str) {
-        
-        ClassUtils.addImportStylePatterns( this.patterns, str );
-    }
-
-    public boolean accept(Object object) {
-        return ClassUtils.isMatched( this.patterns, object.getClass().getName() );
-    }
-
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/DefaultMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/DefaultMarshaller.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/DefaultMarshaller.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,112 +0,0 @@
-package org.drools.marshalling;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import org.drools.RuleBaseConfiguration;
-import org.drools.SessionConfiguration;
-import org.drools.StatefulSession;
-import org.drools.common.InternalRuleBase;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.concurrent.ExecutorService;
-import org.drools.reteoo.ReteooStatefulSession;
-import org.drools.runtime.Environment;
-import org.drools.spi.GlobalResolver;
-
-public class DefaultMarshaller
-    implements
-    Marshaller {
-    GlobalResolver                     globalResolver;
-    RuleBaseConfiguration              ruleBaseConfig;
-    MarshallingConfiguration           marshallingConfig;
-    PlaceholderResolverStrategyFactory factory;
-
-    public DefaultMarshaller() {
-        this( null );
-    }
-
-    public DefaultMarshaller(RuleBaseConfiguration config) {
-        this( config,
-              new MarshallingConfigurationImpl() );
-    }
-
-    public DefaultMarshaller(RuleBaseConfiguration ruleBaseConfig,
-                             MarshallingConfiguration marshallingConfig) {
-        this.ruleBaseConfig = (ruleBaseConfig != null) ? ruleBaseConfig : new RuleBaseConfiguration();
-        this.marshallingConfig = marshallingConfig;
-        
-        if ( marshallingConfig.getPlaceholderResolverStrategyFactory() == null ) {
-            this.factory = new PlaceholderResolverStrategyFactory();
-            ClassPlaceholderResolverStrategyAcceptor acceptor = new ClassPlaceholderResolverStrategyAcceptor( "*.*" );
-            IdentityPlaceholderResolverStrategy strategy = new IdentityPlaceholderResolverStrategy( acceptor );
-            this.factory.addStrategy( strategy );
-        } else {
-            this.factory = marshallingConfig.getPlaceholderResolverStrategyFactory();
-        }
-        
-    }
-
-    /* (non-Javadoc)
-     * @see org.drools.marshalling.Marshaller#read(java.io.InputStream, org.drools.common.InternalRuleBase, int, org.drools.concurrent.ExecutorService)
-     */
-    public ReteooStatefulSession read(final InputStream stream,
-                                      final InternalRuleBase ruleBase,
-                                      final int id,
-                                      final ExecutorService executor,
-                                      final SessionConfiguration config,
-                                      final Environment environment) throws IOException,
-                                                                     ClassNotFoundException {
-        MarshallerReaderContext context = new MarshallerReaderContext( stream,
-                                                                       ruleBase,
-                                                                       RuleBaseNodes.getNodeMap( ruleBase ),
-                                                                       factory,
-                                                                       marshallingConfig.isMarshallProcessInstances(),
-                                                                       marshallingConfig.isMarshallWorkItems() );
-
-        ReteooStatefulSession session = InputMarshaller.readSession( context,
-                                                                     id,
-                                                                     executor,
-                                                                     environment,
-                                                                     config );
-        context.close();
-        return session;
-
-    }
-
-    public StatefulSession read(final InputStream stream,
-                                final InternalRuleBase ruleBase,
-                                StatefulSession session) throws IOException,
-                                                        ClassNotFoundException {
-        MarshallerReaderContext context = new MarshallerReaderContext( stream,
-                                                                       ruleBase,
-                                                                       RuleBaseNodes.getNodeMap( ruleBase ),
-                                                                       factory,
-                                                                       marshallingConfig.isMarshallProcessInstances(),
-                                                                       marshallingConfig.isMarshallWorkItems());
-
-        session = InputMarshaller.readSession( (ReteooStatefulSession) session,
-                                               context );
-        context.close();
-        return session;
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.drools.marshalling.Marshaller#write(java.io.OutputStream, org.drools.common.InternalRuleBase, org.drools.StatefulSession)
-     */
-    public void write(final OutputStream stream,
-                      final InternalRuleBase ruleBase,
-                      final StatefulSession session) throws IOException {
-        MarshallerWriteContext context = new MarshallerWriteContext( stream,
-                                                                     ruleBase,
-                                                                     (InternalWorkingMemory) session,
-                                                                     RuleBaseNodes.getNodeMap( ruleBase ),
-                                                                     this.factory,
-                                                                     marshallingConfig.isMarshallProcessInstances(),
-                                                                     marshallingConfig.isMarshallWorkItems() );
-        OutputMarshaller.writeSession( context );
-        context.close();
-    }
-
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/IdentityPlaceholderResolverStrategy.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/IdentityPlaceholderResolverStrategy.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/IdentityPlaceholderResolverStrategy.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,48 +0,0 @@
-package org.drools.marshalling;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.IdentityHashMap;
-import java.util.Map;
-
-public class IdentityPlaceholderResolverStrategy
-    implements
-    PlaceholderResolverStrategy {
-    
-    private int index;
-    
-    private Map<Integer, Object> map;
-
-    private PlaceholderResolverStrategyAcceptor acceptor;
-    
-    public IdentityPlaceholderResolverStrategy(PlaceholderResolverStrategyAcceptor acceptor) {
-        this.acceptor = acceptor;
-        this.map = new IdentityHashMap<Integer, Object>();
-    }
-    
-    public int getIndex() {
-        return this.index;
-    }
-
-    public void setIndex(int index) {
-        this.index = index;
-    }    
-
-    public ObjectPlaceholder read(ObjectInputStream os) throws IOException,
-                                                       ClassNotFoundException {
-        int id = os.readInt();
-        return new SerializablePlaceholder( map.get( id ));
-    }
-
-    public void write(ObjectOutputStream os,
-                      Object object) throws IOException {
-        Integer id = map.size();
-        map.put( id, object );
-        os.writeInt( id );
-    }
-
-    public boolean accept(Object object) {
-        return this.acceptor.accept( object );
-    }
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,1022 +0,0 @@
-package org.drools.marshalling;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-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;
-import org.drools.common.BaseNode;
-import org.drools.common.BinaryHeapQueueAgendaGroup;
-import org.drools.common.DefaultAgenda;
-import org.drools.common.DefaultFactHandle;
-import org.drools.common.EqualityKey;
-import org.drools.common.InternalAgendaGroup;
-import org.drools.common.InternalFactHandle;
-import org.drools.common.InternalRuleBase;
-import org.drools.common.InternalRuleFlowGroup;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.common.NodeMemory;
-import org.drools.common.PropagationContextImpl;
-import org.drools.common.RuleFlowGroupImpl;
-import org.drools.common.TruthMaintenanceSystem;
-import org.drools.concurrent.ExecutorService;
-import org.drools.impl.EnvironmentFactory;
-import org.drools.process.core.context.swimlane.SwimlaneContext;
-import org.drools.process.core.context.variable.VariableScope;
-import org.drools.process.instance.ProcessInstance;
-import org.drools.process.instance.WorkItem;
-import org.drools.process.instance.WorkItemManager;
-import org.drools.process.instance.context.swimlane.SwimlaneContextInstance;
-import org.drools.process.instance.context.variable.VariableScopeInstance;
-import org.drools.process.instance.impl.WorkItemImpl;
-import org.drools.process.instance.timer.TimerInstance;
-import org.drools.process.instance.timer.TimerManager;
-import org.drools.reteoo.BetaMemory;
-import org.drools.reteoo.BetaNode;
-import org.drools.reteoo.EntryPointNode;
-import org.drools.reteoo.EvalConditionNode;
-import org.drools.reteoo.InitialFactHandle;
-import org.drools.reteoo.InitialFactHandleDummyObject;
-import org.drools.reteoo.LeftTuple;
-import org.drools.reteoo.LeftTupleSink;
-import org.drools.reteoo.NodeTypeEnums;
-import org.drools.reteoo.ObjectTypeNode;
-import org.drools.reteoo.ReteooStatefulSession;
-import org.drools.reteoo.ReteooWorkingMemory;
-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.CollectNode.CollectContext;
-import org.drools.reteoo.CollectNode.CollectMemory;
-import org.drools.reteoo.EvalConditionNode.EvalMemory;
-import org.drools.reteoo.RuleTerminalNode.TerminalNodeMemory;
-import org.drools.rule.EntryPoint;
-import org.drools.rule.GroupElement;
-import org.drools.rule.Package;
-import org.drools.rule.Rule;
-import org.drools.ruleflow.instance.RuleFlowProcessInstance;
-import org.drools.runtime.Environment;
-import org.drools.runtime.process.NodeInstance;
-import org.drools.runtime.process.NodeInstanceContainer;
-import org.drools.spi.Activation;
-import org.drools.spi.AgendaGroup;
-import org.drools.spi.FactHandleFactory;
-import org.drools.spi.ObjectType;
-import org.drools.spi.PropagationContext;
-import org.drools.spi.RuleFlowGroup;
-import org.drools.util.ObjectHashMap;
-import org.drools.util.ObjectHashSet;
-import org.drools.workflow.instance.impl.NodeInstanceImpl;
-import org.drools.workflow.instance.node.CompositeContextNodeInstance;
-import org.drools.workflow.instance.node.ForEachNodeInstance;
-import org.drools.workflow.instance.node.HumanTaskNodeInstance;
-import org.drools.workflow.instance.node.JoinInstance;
-import org.drools.workflow.instance.node.MilestoneNodeInstance;
-import org.drools.workflow.instance.node.RuleSetNodeInstance;
-import org.drools.workflow.instance.node.SubProcessNodeInstance;
-import org.drools.workflow.instance.node.TimerNodeInstance;
-import org.drools.workflow.instance.node.WorkItemNodeInstance;
-
-public class InputMarshaller {
-    /**
-     * Stream the data into an existing session
-     * 
-     * @param session
-     * @param context
-     * @param id
-     * @param executor
-     * @return
-     * @throws IOException
-     * @throws ClassNotFoundException
-     */
-    public static ReteooStatefulSession readSession(ReteooStatefulSession session,
-                                                    MarshallerReaderContext context) throws IOException,
-                                                                                    ClassNotFoundException {
-        boolean multithread = context.readBoolean();
-        int handleId = context.readInt();
-        long handleCounter = 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();
-
-        readAgenda( context,
-                    agenda );
-
-        context.wm = session;
-
-        readFactHandles( context );
-
-        readActionQueue( context );
-
-        if ( context.readBoolean() ) {
-            readTruthMaintenanceSystem( context );
-        }
-
-        if ( context.marshalProcessInstances ) {
-            readProcessInstances( context );
-        }
-
-        if ( context.marshalWorkItems ) {
-            readWorkItems( context );
-        }
-
-        readTimers( context );
-        
-        if( multithread ) {
-            session.startPartitionManagers();
-        }
-
-        return session;
-    }
-
-    /**
-     * Create a new session into which to read the stream data
-     * @param context
-     * @param id
-     * @param executor
-     * @return
-     * @throws IOException
-     * @throws ClassNotFoundException
-     */
-    public static ReteooStatefulSession readSession(MarshallerReaderContext context,
-                                                    int id,
-                                                    ExecutorService executor) throws IOException,
-                                                                             ClassNotFoundException {
-        return readSession( context, id, executor, EnvironmentFactory.newEnvironment(), new SessionConfiguration() );
-    }
-    
-    public static ReteooStatefulSession readSession(MarshallerReaderContext context,
-                                                    int id,
-                                                    ExecutorService executor,
-                                                    Environment environment,
-                                                    SessionConfiguration config) throws IOException,
-                                                                             ClassNotFoundException {
-
-        boolean multithread = context.readBoolean();
-        
-        FactHandleFactory handleFactory = context.ruleBase.newFactHandleFactory( context.readInt(),
-                                                                                 context.readLong() );
-
-        InitialFactHandle initialFactHandle = new InitialFactHandle( new DefaultFactHandle( context.readInt(), //id
-                                                                                            new InitialFactHandleDummyObject(),
-                                                                                            context.readLong() ) ); //recency        
-        context.handles.put( initialFactHandle.getId(),
-                             initialFactHandle );
-
-        long propagationCounter = context.readLong();
-
-        DefaultAgenda agenda = new DefaultAgenda( context.ruleBase,
-                                                  false );
-        readAgenda( context,
-                    agenda );
-        ReteooStatefulSession session = new ReteooStatefulSession( id,
-                                                                   context.ruleBase,
-                                                                   executor,
-                                                                   handleFactory,
-                                                                   initialFactHandle,
-                                                                   propagationCounter,
-                                                                   config,  
-                                                                   agenda,
-                                                                   environment );
-
-        // RuleFlowGroups need to reference the session
-        for ( RuleFlowGroup group : agenda.getRuleFlowGroupsMap().values() ) {
-            ((RuleFlowGroupImpl) group).setWorkingMemory( session );
-        }
-        context.wm = session;
-
-        readFactHandles( context );
-
-        readActionQueue( context );
-
-        if ( context.readBoolean() ) {
-            readTruthMaintenanceSystem( context );
-        }
-
-        if ( context.marshalProcessInstances ) {
-            readProcessInstances( context );
-        }
-
-        if ( context.marshalWorkItems ) {
-            readWorkItems( context );
-        }
-
-        readTimers( context );
-
-        if( multithread ) {
-            session.startPartitionManagers();
-        }
-
-        return session;
-    }    
-
-    public static void readAgenda(MarshallerReaderContext context,
-                                  DefaultAgenda agenda) throws IOException {
-        ObjectInputStream stream = context.stream;
-        while ( stream.readShort() == PersisterEnums.AGENDA_GROUP ) {
-            BinaryHeapQueueAgendaGroup group = new BinaryHeapQueueAgendaGroup( stream.readUTF(),
-                                                                               context.ruleBase );
-            group.setActive( stream.readBoolean() );
-            agenda.getAgendaGroupsMap().put( group.getName(),
-                                             group );
-        }
-
-        while ( stream.readShort() == PersisterEnums.AGENDA_GROUP ) {
-            String agendaGroupName = stream.readUTF();
-            agenda.getStackList().add( agenda.getAgendaGroup( agendaGroupName ) );
-        }
-
-        while ( stream.readShort() == PersisterEnums.RULE_FLOW_GROUP ) {
-            String rfgName = stream.readUTF();
-            boolean active = stream.readBoolean();
-            boolean autoDeactivate = stream.readBoolean();
-            RuleFlowGroup rfg = new RuleFlowGroupImpl( rfgName,
-                                                       active,
-                                                       autoDeactivate );
-            agenda.getRuleFlowGroupsMap().put( rfgName,
-                                               rfg );
-        }
-
-    }
-
-    public static void readActionQueue(MarshallerReaderContext context) throws IOException, ClassNotFoundException {
-        ReteooWorkingMemory wm = (ReteooWorkingMemory) context.wm;
-        Queue actionQueue = wm.getActionQueue();
-        while ( context.readShort() == PersisterEnums.WORKING_MEMORY_ACTION ) {
-            actionQueue.offer( PersisterHelper.readWorkingMemoryAction( context ) );
-        }
-    }
-
-    public static void readTruthMaintenanceSystem(MarshallerReaderContext context) throws IOException {
-        ObjectInputStream stream = context.stream;
-
-        TruthMaintenanceSystem tms = context.wm.getTruthMaintenanceSystem();
-        while ( stream.readShort() == PersisterEnums.EQUALITY_KEY ) {
-            int status = stream.readInt();
-            int factHandleId = stream.readInt();
-            InternalFactHandle handle = (InternalFactHandle) context.handles.get( factHandleId );
-            EqualityKey key = new EqualityKey( handle,
-                                               status );
-            handle.setEqualityKey( key );
-            while ( stream.readShort() == PersisterEnums.FACT_HANDLE ) {
-                factHandleId = stream.readInt();
-                handle = (InternalFactHandle) context.handles.get( factHandleId );
-                key.addFactHandle( handle );
-                handle.setEqualityKey( key );
-            }
-            tms.put( key );
-        }
-    }
-
-    public static void readFactHandles(MarshallerReaderContext context) throws IOException,
-                                                                       ClassNotFoundException {
-        ObjectInputStream stream = context.stream;
-        InternalRuleBase ruleBase = context.ruleBase;
-        PlaceholderResolverStrategyFactory resolverStrategyFactory = context.resolverStrategyFactory;
-        InternalWorkingMemory wm = context.wm;
-
-        if ( stream.readBoolean() ) {
-            InternalFactHandle initialFactHandle = wm.getInitialFactHandle();
-            int sinkId = stream.readInt();
-            ObjectTypeNode initialFactNode = (ObjectTypeNode) context.sinks.get( sinkId );
-            ObjectHashSet initialFactMemory = (ObjectHashSet) context.wm.getNodeMemory( initialFactNode );
-
-            initialFactMemory.add( initialFactHandle );
-            readRightTuples( initialFactHandle,
-                             context );
-        }
-
-        int size = stream.readInt();
-
-        // load the handles
-        InternalFactHandle[] handles = new InternalFactHandle[size];
-        for ( int i = 0; i < size; i++ ) {
-            InternalFactHandle handle = readFactHandle( context );
-
-            context.handles.put( handle.getId(),
-                                 handle );
-            handles[i] = handle;
-
-            context.wm.getObjectStore().addHandle( handle,
-                                                   handle.getObject() );
-
-            readRightTuples( handle,
-                             context );
-        }
-
-        EntryPointNode node = ruleBase.getRete().getEntryPointNode( EntryPoint.DEFAULT );
-        Map<ObjectType, ObjectTypeNode> objectTypeNodes = node.getObjectTypeNodes();
-
-        // add handles to object type nodes
-        for ( InternalFactHandle handle : handles ) {
-            Object object = handle.getObject();
-            ClassObjectType objectType = new ClassObjectType( object.getClass() );
-            ObjectTypeNode objectTypeNode = objectTypeNodes.get( objectType );
-            ObjectHashSet set = (ObjectHashSet) context.wm.getNodeMemory( objectTypeNode );
-            set.add( handle,
-                     false );
-        }
-
-        InternalFactHandle handle = wm.getInitialFactHandle();
-        while ( stream.readShort() == PersisterEnums.LEFT_TUPLE ) {
-            LeftTupleSink sink = (LeftTupleSink) context.sinks.get( stream.readInt() );
-            LeftTuple leftTuple = new LeftTuple( handle,
-                                                 sink,
-                                                 true );
-            readLeftTuple( leftTuple,
-                           context );
-        }
-
-        readLeftTuples( context );
- 
-        readPropagationContexts( context );
-
-        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;
-        while ( stream.readShort() == PersisterEnums.RIGHT_TUPLE ) {
-            readRightTuple( context,
-                            factHandle );
-        }
-    }
-
-    public static void readRightTuple(MarshallerReaderContext context,
-                                      InternalFactHandle factHandle) throws IOException {
-        ObjectInputStream stream = context.stream;
-
-        RightTupleSink sink = (RightTupleSink) context.sinks.get( stream.readInt() );
-
-        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;
-            }
-            case NodeTypeEnums.CollectNode : {
-                memory = ((CollectMemory) 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,
-                                                                      ClassNotFoundException {
-        ObjectInputStream stream = context.stream;
-
-        while ( stream.readShort() == PersisterEnums.LEFT_TUPLE ) {
-            LeftTupleSink sink = (LeftTupleSink) context.sinks.get( stream.readInt() );
-            int factHandleId = stream.readInt();
-            LeftTuple leftTuple = new LeftTuple( context.handles.get( factHandleId ),
-                                                 sink,
-                                                 true );
-            readLeftTuple( leftTuple,
-                           context );
-        }
-    }
-
-    public static void readLeftTuple(LeftTuple parentLeftTuple,
-                                     MarshallerReaderContext context) throws IOException,
-                                                                     ClassNotFoundException {
-        ObjectInputStream stream = context.stream;
-        InternalWorkingMemory wm = context.wm;
-        Map<Integer, BaseNode> sinks = context.sinks;
-
-        LeftTupleSink sink = parentLeftTuple.getLeftTupleSink();
-
-        switch ( sink.getType() ) {
-            case NodeTypeEnums.JoinNode : {
-                BetaMemory memory = (BetaMemory) context.wm.getNodeMemory( (BetaNode) sink );
-                memory.getLeftTupleMemory().add( parentLeftTuple );
-
-                while ( stream.readShort() == PersisterEnums.RIGHT_TUPLE ) {
-                    LeftTupleSink childSink = (LeftTupleSink) sinks.get( stream.readInt() );
-                    int factHandleId = stream.readInt();
-                    RightTupleKey key = new RightTupleKey( factHandleId,
-                                                           sink );
-                    RightTuple rightTuple = context.rightTuples.get( key );
-                    LeftTuple childLeftTuple = new LeftTuple( parentLeftTuple,
-                                                              rightTuple,
-                                                              childSink,
-                                                              true );
-                    readLeftTuple( childLeftTuple,
-                                   context );
-                }
-                break;
-
-            }
-            case NodeTypeEnums.EvalConditionNode : {
-                final EvalMemory memory = (EvalMemory) context.wm.getNodeMemory( (EvalConditionNode) sink );
-                memory.tupleMemory.add( parentLeftTuple );
-                while ( stream.readShort() == PersisterEnums.LEFT_TUPLE ) {
-                    LeftTupleSink childSink = (LeftTupleSink) sinks.get( stream.readInt() );
-                    LeftTuple childLeftTuple = new LeftTuple( parentLeftTuple,
-                                                              childSink,
-                                                              true );
-                    readLeftTuple( childLeftTuple,
-                                   context );
-                }
-                break;
-            }
-            case NodeTypeEnums.NotNode : {
-                BetaMemory memory = (BetaMemory) context.wm.getNodeMemory( (BetaNode) sink );
-                int type = stream.readShort();
-                if ( type == PersisterEnums.LEFT_TUPLE_NOT_BLOCKED ) {
-                    memory.getLeftTupleMemory().add( parentLeftTuple );
-
-                    while ( stream.readShort() == PersisterEnums.LEFT_TUPLE ) {
-                        LeftTupleSink childSink = (LeftTupleSink) sinks.get( stream.readInt() );
-                        LeftTuple childLeftTuple = new LeftTuple( parentLeftTuple,
-                                                                  childSink,
-                                                                  true );
-                        readLeftTuple( childLeftTuple,
-                                       context );
-                    }
-
-                } else {
-                    int factHandleId = stream.readInt();
-                    RightTupleKey key = new RightTupleKey( factHandleId,
-                                                           sink );
-                    RightTuple rightTuple = context.rightTuples.get( key );
-
-                    parentLeftTuple.setBlocker( rightTuple );
-                    rightTuple.setBlocked( parentLeftTuple );
-                }
-                break;
-            }
-            case NodeTypeEnums.ExistsNode : {
-                BetaMemory memory = (BetaMemory) context.wm.getNodeMemory( (BetaNode) sink );
-                int type = stream.readShort();
-                if ( type == PersisterEnums.LEFT_TUPLE_NOT_BLOCKED ) {
-                    memory.getLeftTupleMemory().add( parentLeftTuple );
-                } else {
-                    int factHandleId = stream.readInt();
-                    RightTupleKey key = new RightTupleKey( factHandleId,
-                                                           sink );
-                    RightTuple rightTuple = context.rightTuples.get( key );
-
-                    parentLeftTuple.setBlocker( rightTuple );
-                    rightTuple.setBlocked( parentLeftTuple );
-
-                    while ( stream.readShort() == PersisterEnums.LEFT_TUPLE ) {
-                        LeftTupleSink childSink = (LeftTupleSink) sinks.get( stream.readInt() );
-                        LeftTuple childLeftTuple = new LeftTuple( parentLeftTuple,
-                                                                  childSink,
-                                                                  true );
-                        readLeftTuple( childLeftTuple,
-                                       context );
-                    }
-                }
-                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.CollectNode : {
-                // accumulate nodes generate new facts on-demand and need special procedures when de-serializing from persistent storage
-                CollectMemory memory = (CollectMemory) context.wm.getNodeMemory( (BetaNode) sink );
-                memory.betaMemory.getLeftTupleMemory().add( parentLeftTuple );
-
-                CollectContext colctx = new CollectContext();
-                memory.betaMemory.getCreatedHandles().put( parentLeftTuple,
-                                                           colctx,
-                                                           false );
-                // first we de-serialize the generated fact handle
-                InternalFactHandle handle = readFactHandle( context );
-                colctx.resultTuple = new RightTuple( handle,
-                                                     (RightTupleSink) sink );
-
-                // then we de-serialize the boolean propagated flag
-                colctx.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,
-                                                                      colctx.resultTuple,
-                                                                      childSink,
-                                                                      true );
-                            readLeftTuple( childLeftTuple,
-                                           context );
-                            break;
-                        }
-                        default : {
-                            throw new RuntimeDroolsException( "Marshalling error. This is a bug. Please contact the development team." );
-                        }
-                    }
-                }
-                break;
-            }
-            case NodeTypeEnums.RightInputAdaterNode : {
-                // RIANs generate new fact handles on-demand to wrap tuples and need special procedures when de-serializing from persistent storage
-                ObjectHashMap memory = (ObjectHashMap) context.wm.getNodeMemory( (NodeMemory) sink );
-                // create fact handle
-                int id = stream.readInt();
-                long recency = stream.readLong();
-                InternalFactHandle handle = new DefaultFactHandle( id,
-                                                                   parentLeftTuple,
-                                                                   recency );
-                memory.put( parentLeftTuple, handle );
-                
-                readRightTuples( handle, context );
-                
-                stream.readShort(); // Persistence.END
-                break;
-            }
-            case NodeTypeEnums.RuleTerminalNode : {
-                RuleTerminalNode ruleTerminalNode = (RuleTerminalNode) sink;
-                TerminalNodeMemory memory = (TerminalNodeMemory) wm.getNodeMemory( ruleTerminalNode );
-                memory.getTupleMemory().add( parentLeftTuple );
-
-                int pos = context.terminalTupleMap.size();
-                context.terminalTupleMap.put( pos,
-                                              parentLeftTuple );
-                break;
-            }
-        }
-    }
-
-    public static void readActivations(MarshallerReaderContext context) throws IOException {
-        ObjectInputStream stream = context.stream;
-
-        while ( stream.readShort() == PersisterEnums.ACTIVATION ) {
-            readActivation( context );
-        }
-    }
-
-    public static Activation readActivation(MarshallerReaderContext context) throws IOException {
-        ObjectInputStream stream = context.stream;
-        InternalRuleBase ruleBase = context.ruleBase;
-        InternalWorkingMemory wm = context.wm;
-
-        long activationNumber = stream.readLong();
-
-        int pos = stream.readInt();
-        LeftTuple leftTuple = context.terminalTupleMap.get( pos );
-
-        int salience = stream.readInt();
-
-        //PropagationContext context,
-        String pkgName = stream.readUTF();
-        String ruleName = stream.readUTF();
-        Package pkg = ruleBase.getPackage( pkgName );
-        Rule rule = pkg.getRule( ruleName );
-
-        RuleTerminalNode ruleTerminalNode = (RuleTerminalNode) leftTuple.getLeftTupleSink();
-        GroupElement subRule = ruleTerminalNode.getSubRule();
-
-        PropagationContext pc = context.propagationContexts.get( stream.readLong() );
-
-        AgendaItem activation = new AgendaItem( activationNumber,
-                                                leftTuple,
-                                                salience,
-                                                pc,
-                                                rule,
-                                                subRule );
-
-        leftTuple.setActivation( activation );
-
-        if ( stream.readBoolean() ) {
-            String activationGroupName = stream.readUTF();
-            ((DefaultAgenda) wm.getAgenda()).getActivationGroup( activationGroupName ).addActivation( activation );
-        }
-
-        boolean activated = stream.readBoolean();
-        activation.setActivated( activated );
-
-        InternalAgendaGroup agendaGroup;
-        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 );
-        } else {
-            // AgendaGroup is defined, so try and get the AgendaGroup
-            // from the Agenda
-            agendaGroup = (InternalAgendaGroup) ((DefaultAgenda) wm.getAgenda()).getAgendaGroup( rule.getAgendaGroup() );
-        }
-
-        activation.setAgendaGroup( agendaGroup );
-
-        if ( activated ) {
-            if ( rule.getRuleFlowGroup() == null ) {
-                agendaGroup.add( activation );
-            } else {
-                InternalRuleFlowGroup rfg = (InternalRuleFlowGroup) ((DefaultAgenda) wm.getAgenda()).getRuleFlowGroup( rule.getRuleFlowGroup() );
-                rfg.addActivation( activation );
-            }
-        }
-
-        TruthMaintenanceSystem tms = context.wm.getTruthMaintenanceSystem();
-        while ( stream.readShort() == PersisterEnums.LOGICAL_DEPENDENCY ) {
-            int factHandleId = stream.readInt();
-            InternalFactHandle handle = (InternalFactHandle) context.handles.get( factHandleId );
-            tms.addLogicalDependency( handle,
-                                      activation,
-                                      pc,
-                                      rule );
-        }
-
-        return activation;
-    }
-
-    public static void readPropagationContexts(MarshallerReaderContext context) throws IOException {
-        ObjectInputStream stream = context.stream;
-
-        while ( stream.readShort() == PersisterEnums.PROPAGATION_CONTEXT ) {
-            readPropagationContext( context );
-        }
-
-    }
-
-    public static void readPropagationContext(MarshallerReaderContext context) throws IOException {
-        ObjectInputStream stream = context.stream;
-        InternalRuleBase ruleBase = context.ruleBase;
-
-        int type = stream.readInt();
-
-        Rule rule = null;
-        if ( stream.readBoolean() ) {
-            String pkgName = stream.readUTF();
-            String ruleName = stream.readUTF();
-            Package pkg = ruleBase.getPackage( pkgName );
-            rule = pkg.getRule( ruleName );
-        }
-
-        LeftTuple leftTuple = null;
-        if ( stream.readBoolean() ) {
-            int tuplePos = stream.readInt();
-            leftTuple = (LeftTuple) context.terminalTupleMap.get( tuplePos );
-        }
-
-        long propagationNumber = stream.readLong();
-
-        int factHandleId = stream.readInt();
-        InternalFactHandle factHandle = context.handles.get( factHandleId );
-
-        int activeActivations = stream.readInt();
-        int dormantActivations = stream.readInt();
-        String entryPointId = stream.readUTF();
-
-        EntryPoint entryPoint = context.entryPoints.get( entryPointId );
-        if ( entryPoint == null ) {
-            entryPoint = new EntryPoint( entryPointId );
-            context.entryPoints.put( entryPointId,
-                                     entryPoint );
-        }
-
-        PropagationContext pc = new PropagationContextImpl( propagationNumber,
-                                                            type,
-                                                            rule,
-                                                            leftTuple,
-                                                            factHandle,
-                                                            activeActivations,
-                                                            dormantActivations,
-                                                            entryPoint );
-        context.propagationContexts.put( propagationNumber,
-                                         pc );
-    }
-
-    public static void readProcessInstances(MarshallerReaderContext context) throws IOException {
-        ObjectInputStream stream = context.stream;
-        while ( stream.readShort() == PersisterEnums.PROCESS_INSTANCE ) {
-            readProcessInstance( context );
-        }
-    }
-
-    public static ProcessInstance readProcessInstance(MarshallerReaderContext context) throws IOException {
-        ObjectInputStream stream = context.stream;
-        InternalRuleBase ruleBase = context.ruleBase;
-        InternalWorkingMemory wm = context.wm;
-
-        RuleFlowProcessInstance processInstance = new RuleFlowProcessInstance();
-        processInstance.setId( stream.readLong() );
-        String processId = stream.readUTF();
-        processInstance.setProcessId( processId );
-        if ( ruleBase != null ) {
-            processInstance.setProcess( ruleBase.getProcess( processId ) );
-        }
-        processInstance.setState( stream.readInt() );
-        long nodeInstanceCounter = stream.readLong();
-        processInstance.setWorkingMemory( wm );
-
-        int nbVariables = stream.readInt();
-        if ( nbVariables > 0 ) {
-            VariableScopeInstance variableScopeInstance = (VariableScopeInstance) processInstance.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 );
-                }
-            }
-        }
-
-        int nbSwimlanes = stream.readInt();
-        if ( nbSwimlanes > 0 ) {
-            SwimlaneContextInstance swimlaneContextInstance = (SwimlaneContextInstance) processInstance.getContextInstance( SwimlaneContext.SWIMLANE_SCOPE );
-            for ( int i = 0; i < nbSwimlanes; i++ ) {
-                String name = stream.readUTF();
-                String value = stream.readUTF();
-                swimlaneContextInstance.setActorId( name,
-                                                    value );
-            }
-        }
-
-        while ( stream.readShort() == PersisterEnums.NODE_INSTANCE ) {
-            readNodeInstance( context,
-                              processInstance,
-                              processInstance );
-        }
-
-        processInstance.internalSetNodeInstanceCounter( nodeInstanceCounter );
-        if ( wm != null ) {
-            processInstance.reconnect();
-        }
-        return processInstance;
-    }
-
-    public static NodeInstance readNodeInstance(MarshallerReaderContext context,
-                                                NodeInstanceContainer nodeInstanceContainer,
-                                                RuleFlowProcessInstance processInstance) throws IOException {
-        ObjectInputStream stream = context.stream;
-        NodeInstanceImpl nodeInstance = null;
-        long id = stream.readLong();
-        long nodeId = stream.readLong();
-        int nodeType = stream.readShort();
-        switch ( nodeType ) {
-            case PersisterEnums.RULE_SET_NODE_INSTANCE :
-                nodeInstance = new RuleSetNodeInstance();
-                break;
-            case PersisterEnums.HUMAN_TASK_NODE_INSTANCE :
-                nodeInstance = new HumanTaskNodeInstance();
-                ((HumanTaskNodeInstance) nodeInstance).internalSetWorkItemId( stream.readLong() );
-                break;
-            case PersisterEnums.WORK_ITEM_NODE_INSTANCE :
-                nodeInstance = new WorkItemNodeInstance();
-                ((WorkItemNodeInstance) nodeInstance).internalSetWorkItemId( stream.readLong() );
-                break;
-            case PersisterEnums.SUB_PROCESS_NODE_INSTANCE :
-                nodeInstance = new SubProcessNodeInstance();
-                ((SubProcessNodeInstance) nodeInstance).internalSetProcessInstanceId( stream.readLong() );
-                break;
-            case PersisterEnums.MILESTONE_NODE_INSTANCE :
-                nodeInstance = new MilestoneNodeInstance();
-                int nbTimerInstances = stream.readInt();
-                if (nbTimerInstances > 0) {
-                	List<Long> timerInstances = new ArrayList<Long>();
-                	for (int i = 0; i < nbTimerInstances; i++) {
-                		timerInstances.add(stream.readLong());
-                	}
-                	((MilestoneNodeInstance) nodeInstance).internalSetTimerInstances(timerInstances);
-                }
-                break;
-            case PersisterEnums.TIMER_NODE_INSTANCE :
-                nodeInstance = new TimerNodeInstance();
-                ((TimerNodeInstance) nodeInstance).internalSetTimerId( stream.readLong() );
-                break;
-            case PersisterEnums.JOIN_NODE_INSTANCE :
-                nodeInstance = new JoinInstance();
-                int number = stream.readInt();
-                if ( number > 0 ) {
-                    Map<Long, Integer> triggers = new HashMap<Long, Integer>();
-                    for ( int i = 0; i < number; i++ ) {
-                        long l = stream.readLong();
-                        int count = stream.readInt();
-                        triggers.put( l,
-                                      count );
-                    }
-                    ((JoinInstance) nodeInstance).internalSetTriggers( triggers );
-                }
-                break;
-            case PersisterEnums.COMPOSITE_NODE_INSTANCE :
-                nodeInstance = new CompositeContextNodeInstance();
-                break;
-            case PersisterEnums.FOR_EACH_NODE_INSTANCE :
-                nodeInstance = new ForEachNodeInstance();
-                break;
-            default :
-                throw new IllegalArgumentException( "Unknown node type: " + nodeType );
-        }
-        nodeInstance.setNodeId( nodeId );
-        nodeInstance.setNodeInstanceContainer( nodeInstanceContainer );
-        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
-        }
-        return nodeInstance;
-    }
-
-    public static void readWorkItems(MarshallerReaderContext context) throws IOException {
-        InternalWorkingMemory wm = context.wm;
-        ObjectInputStream stream = context.stream;
-        while ( stream.readShort() == PersisterEnums.WORK_ITEM ) {
-            WorkItem workItem = readWorkItem( context );
-            ((WorkItemManager) wm.getWorkItemManager()).internalAddWorkItem( workItem );
-        }
-    }
-
-    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 );
-            }
-        }
-
-        return workItem;
-    }
-
-    public static void readTimers(MarshallerReaderContext context) throws IOException, ClassNotFoundException {
-        InternalWorkingMemory wm = context.wm;
-        ObjectInputStream stream = context.stream;
-
-        TimerManager timerManager = wm.getTimerManager();
-        timerManager.internalSetTimerId( stream.readLong() );
-        
-        // still need to think on how to fix this.
-//        TimerService service = (TimerService) stream.readObject();
-//        timerManager.setTimerService( service );
-
-        while ( stream.readShort() == PersisterEnums.TIMER ) {
-            TimerInstance timer = readTimer( context );
-            timerManager.internalAddTimer( timer );
-        }
-    }
-
-    public static TimerInstance readTimer(MarshallerReaderContext context) throws IOException {
-        ObjectInputStream stream = context.stream;
-
-        TimerInstance timer = new TimerInstance();
-        timer.setId( stream.readLong() );
-        timer.setTimerId( 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() ) );
-        }
-        return timer;
-    }
-
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/Marshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/Marshaller.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/Marshaller.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,32 +0,0 @@
-package org.drools.marshalling;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import org.drools.SessionConfiguration;
-import org.drools.StatefulSession;
-import org.drools.common.InternalRuleBase;
-import org.drools.concurrent.ExecutorService;
-import org.drools.runtime.Environment;
-
-public interface Marshaller {
-
-    public StatefulSession read(final InputStream stream,
-                                final InternalRuleBase ruleBase,
-                                final int id,
-                                final ExecutorService executor,
-                                final SessionConfiguration config,
-                                final Environment environment) throws IOException,
-                                                               ClassNotFoundException;
-
-    public StatefulSession read(final InputStream stream,
-                                final InternalRuleBase ruleBase,
-                                final StatefulSession session) throws IOException,
-                                                              ClassNotFoundException;
-
-    public abstract void write(final OutputStream stream,
-                               final InternalRuleBase ruleBase,
-                               final StatefulSession session) throws IOException;
-
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallerReaderContext.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallerReaderContext.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallerReaderContext.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,71 +0,0 @@
-/**
- * 
- */
-package org.drools.marshalling;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.drools.common.BaseNode;
-import org.drools.common.InternalFactHandle;
-import org.drools.common.InternalRuleBase;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.reteoo.LeftTuple;
-import org.drools.reteoo.RightTuple;
-import org.drools.rule.EntryPoint;
-import org.drools.spi.PropagationContext;
-
-public class MarshallerReaderContext extends ObjectInputStream {
-    public final MarshallerReaderContext            stream;
-    public final InternalRuleBase                   ruleBase;
-    public InternalWorkingMemory                    wm;
-    public final Map<Integer, BaseNode>             sinks;
-
-    public Map<Integer, InternalFactHandle>         handles;
-
-    public final Map<RightTupleKey, RightTuple>     rightTuples;
-    public final Map<Integer, LeftTuple>            terminalTupleMap;
-
-    public final PlaceholderResolverStrategyFactory resolverStrategyFactory;
-    public final Map<String, EntryPoint>            entryPoints;
-
-    public final Map<Long, PropagationContext>      propagationContexts;
-
-    public final boolean                            marshalProcessInstances;
-    public final boolean                            marshalWorkItems;
-
-    public MarshallerReaderContext(InputStream stream,
-                                   InternalRuleBase ruleBase,
-                                   Map<Integer, BaseNode> sinks,
-                                   PlaceholderResolverStrategyFactory resolverStrategyFactory) throws IOException {
-        this( stream,
-              ruleBase,
-              sinks,
-              resolverStrategyFactory,
-              true,
-              true );
-    }
-
-    public MarshallerReaderContext(InputStream stream,
-                                   InternalRuleBase ruleBase,
-                                   Map<Integer, BaseNode> sinks,
-                                   PlaceholderResolverStrategyFactory resolverStrategyFactory,
-                                   boolean marshalProcessInstances,
-                                   boolean marshalWorkItems) throws IOException {
-        super( stream );
-        this.stream = this;
-        this.ruleBase = ruleBase;
-        this.sinks = sinks;
-        this.handles = new HashMap<Integer, InternalFactHandle>();
-        this.rightTuples = new HashMap<RightTupleKey, RightTuple>();
-        this.terminalTupleMap = new HashMap<Integer, LeftTuple>();
-        this.entryPoints = new HashMap<String, EntryPoint>();
-        this.propagationContexts = new HashMap<Long, PropagationContext>();
-        this.resolverStrategyFactory = resolverStrategyFactory;
-        this.marshalProcessInstances = marshalProcessInstances;
-        this.marshalWorkItems = marshalWorkItems;
-    }
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallerWriteContext.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallerWriteContext.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallerWriteContext.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,61 +0,0 @@
-/**
- * 
- */
-package org.drools.marshalling;
-
-import java.io.IOException;
-import java.io.ObjectOutputStream;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.util.IdentityHashMap;
-import java.util.Map;
-
-import org.drools.common.BaseNode;
-import org.drools.common.InternalRuleBase;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.reteoo.LeftTuple;
-
-public class MarshallerWriteContext extends ObjectOutputStream {
-    public final MarshallerWriteContext        stream;
-    public final InternalRuleBase                 ruleBase;
-    public final InternalWorkingMemory            wm;
-    public final Map<Integer, BaseNode>           sinks;
-
-    public final PrintStream                      out = System.out;
-    
-    public final PlaceholderResolverStrategyFactory resolverStrategyFactory;
-
-    public final Map<LeftTuple, Integer>            terminalTupleMap;
-    
-    public final boolean                            marshalProcessInstances;
-    public final boolean                            marshalWorkItems;
-    
-    public MarshallerWriteContext(OutputStream stream,
-                                  InternalRuleBase ruleBase,
-                                  InternalWorkingMemory wm,
-                                  Map<Integer, BaseNode> sinks,
-                                  PlaceholderResolverStrategyFactory resolverStrategyFactory) throws IOException {
-        this(stream, ruleBase, wm, sinks, resolverStrategyFactory, true, true);
-    }
-
-    public MarshallerWriteContext(OutputStream stream,
-                                     InternalRuleBase ruleBase,
-                                     InternalWorkingMemory wm,
-                                     Map<Integer, BaseNode> sinks,
-                                     PlaceholderResolverStrategyFactory resolverStrategyFactory,
-                                     boolean marshalProcessInstances,
-                                     boolean marshalWorkItems) throws IOException {
-        super( stream );
-        this.stream = this;
-        this.ruleBase = ruleBase;
-        this.wm = wm;
-        this.sinks = sinks;        
-
-        this.resolverStrategyFactory = resolverStrategyFactory;
-        
-        this.terminalTupleMap = new IdentityHashMap<LeftTuple, Integer>();
-        
-        this.marshalProcessInstances = marshalProcessInstances;
-        this.marshalWorkItems = marshalWorkItems;
-    }
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfiguration.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfiguration.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfiguration.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,7 +0,0 @@
-package org.drools.marshalling;
-
-public interface MarshallingConfiguration {
-    PlaceholderResolverStrategyFactory getPlaceholderResolverStrategyFactory();
-    boolean isMarshallProcessInstances();
-    boolean  isMarshallWorkItems();
-} 

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfigurationImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfigurationImpl.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfigurationImpl.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,48 +0,0 @@
-package org.drools.marshalling;
-
-public class MarshallingConfigurationImpl
-    implements
-    MarshallingConfiguration {
-    private PlaceholderResolverStrategyFactory placeholderResolverStrategyFactory;
-    private boolean                            marshallProcessInstances;
-    private boolean                            marshallWorkItems;
-
-    public MarshallingConfigurationImpl() {
-        this( null,
-              true,
-              true );
-    }
-
-    public MarshallingConfigurationImpl(PlaceholderResolverStrategyFactory placeholderResolverStrategyFactory,
-                                        boolean marshallProcessInstances,
-                                        boolean marshallWorkItems) {
-        this.placeholderResolverStrategyFactory = placeholderResolverStrategyFactory;
-        this.marshallProcessInstances = marshallProcessInstances;
-        this.marshallWorkItems = marshallWorkItems;
-    }
-
-    public boolean isMarshallProcessInstances() {
-        return this.marshallProcessInstances;
-    }
-
-    public void setMarshallProcessInstances(boolean marshallProcessInstances) {
-        this.marshallProcessInstances = marshallProcessInstances;
-    }
-
-    public boolean isMarshallWorkItems() {
-        return this.marshallWorkItems;
-    }
-
-    public void setMarshallWorkItems(boolean marshallWorkItems) {
-        this.marshallWorkItems = marshallWorkItems;
-    }
-
-    public PlaceholderResolverStrategyFactory getPlaceholderResolverStrategyFactory() {
-        return this.placeholderResolverStrategyFactory;
-    }
-
-    public void setPlaceholderResolverStrategyFactory(PlaceholderResolverStrategyFactory placeholderResolverStrategyFactory) {
-        this.placeholderResolverStrategyFactory = placeholderResolverStrategyFactory;
-    }
-
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/ObjectPlaceholder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/ObjectPlaceholder.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/ObjectPlaceholder.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,8 +0,0 @@
-package org.drools.marshalling;
-
-public interface ObjectPlaceholder {
-    
-    public Object resolveObject();
-    
-    
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,983 +0,0 @@
-package org.drools.marshalling;
-
-import java.io.IOException;
-import java.io.ObjectOutputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.drools.InitialFact;
-import org.drools.base.ClassObjectType;
-import org.drools.common.AgendaItem;
-import org.drools.common.DefaultAgenda;
-import org.drools.common.EqualityKey;
-import org.drools.common.InternalFactHandle;
-import org.drools.common.InternalRuleBase;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.common.LogicalDependency;
-import org.drools.common.NodeMemory;
-import org.drools.common.ObjectStore;
-import org.drools.common.RuleFlowGroupImpl;
-import org.drools.common.WorkingMemoryAction;
-import org.drools.process.core.context.swimlane.SwimlaneContext;
-import org.drools.process.core.context.variable.VariableScope;
-import org.drools.process.instance.WorkItemManager;
-import org.drools.process.instance.context.swimlane.SwimlaneContextInstance;
-import org.drools.process.instance.context.variable.VariableScopeInstance;
-import org.drools.process.instance.timer.TimerInstance;
-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;
-import org.drools.reteoo.ObjectTypeNode;
-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.reteoo.CollectNode.CollectContext;
-import org.drools.reteoo.CollectNode.CollectMemory;
-import org.drools.rule.EntryPoint;
-import org.drools.rule.Rule;
-import org.drools.ruleflow.instance.RuleFlowProcessInstance;
-import org.drools.runtime.process.NodeInstance;
-import org.drools.runtime.process.WorkItem;
-import org.drools.spi.ActivationGroup;
-import org.drools.spi.AgendaGroup;
-import org.drools.spi.PropagationContext;
-import org.drools.spi.RuleFlowGroup;
-import org.drools.util.ObjectHashMap;
-import org.drools.util.ObjectHashSet;
-import org.drools.workflow.instance.node.CompositeContextNodeInstance;
-import org.drools.workflow.instance.node.ForEachNodeInstance;
-import org.drools.workflow.instance.node.HumanTaskNodeInstance;
-import org.drools.workflow.instance.node.JoinInstance;
-import org.drools.workflow.instance.node.MilestoneNodeInstance;
-import org.drools.workflow.instance.node.RuleSetNodeInstance;
-import org.drools.workflow.instance.node.SubProcessNodeInstance;
-import org.drools.workflow.instance.node.TimerNodeInstance;
-import org.drools.workflow.instance.node.WorkItemNodeInstance;
-
-public class OutputMarshaller {
-    public static void writeSession(MarshallerWriteContext context) throws IOException {
-        ReteooWorkingMemory wm = (ReteooWorkingMemory) context.wm;
-        
-        final boolean multithread = wm.isPartitionManagersActive(); 
-        // is multi-thread active?
-        if( multithread ) {
-            context.writeBoolean( true );
-            wm.stopPartitionManagers();
-        } else {
-            context.writeBoolean( false );
-        }
-
-        context.writeInt( wm.getFactHandleFactory().getId() );
-        context.writeLong( wm.getFactHandleFactory().getRecency() );
-//        context.out.println( "FactHandleFactory int:" + wm.getFactHandleFactory().getId() + " long:" + wm.getFactHandleFactory().getRecency() );
-
-        InternalFactHandle handle = context.wm.getInitialFactHandle();
-        context.writeInt( handle.getId() );
-        context.writeLong( handle.getRecency() );
-//        context.out.println( "InitialFact int:" + handle.getId() + " long:" + handle.getRecency() );
-
-        context.writeLong( wm.getPropagationIdCounter() );
-//        context.out.println( "PropagationCounter long:" + wm.getPropagationIdCounter() );
-
-        writeAgenda( context );
-
-        writeFactHandles( context );
-
-        writeActionQueue( context );
-
-        if ( wm.getTruthMaintenanceSystem() != null ) {
-            context.writeBoolean( true );
-            writeTruthMaintenanceSystem( context );
-        } else {
-            context.writeBoolean( false );
-        }
-
-        if ( context.marshalProcessInstances ) {
-            writeProcessInstances( context );
-        }
-
-        if ( context.marshalWorkItems ) {
-            writeWorkItems( context );
-        }
-
-        writeTimers( context );
-        
-        if( multithread ) {
-            wm.startPartitionManagers();
-        }
-    }
-
-    public static void writeAgenda(MarshallerWriteContext context) throws IOException {
-        InternalWorkingMemory wm = context.wm;
-        DefaultAgenda agenda = (DefaultAgenda) wm.getAgenda();
-
-        Map<String, ActivationGroup> activationGroups = agenda.getActivationGroupsMap();
-
-        AgendaGroup[] agendaGroups = (AgendaGroup[]) agenda.getAgendaGroupsMap().values().toArray( new AgendaGroup[agenda.getAgendaGroupsMap().size()] );
-        Arrays.sort( agendaGroups,
-                     AgendaGroupSorter.instance );
-
-        for ( AgendaGroup group : agendaGroups ) {
-            context.writeShort( PersisterEnums.AGENDA_GROUP );
-            context.writeUTF( group.getName() );
-            context.writeBoolean( group.isActive() );
-        }
-        context.writeShort( PersisterEnums.END );
-
-        LinkedList<AgendaGroup> focusStack = agenda.getStackList();
-        for ( Iterator<AgendaGroup> it = focusStack.iterator(); it.hasNext(); ) {
-            AgendaGroup group = it.next();
-            context.writeShort( PersisterEnums.AGENDA_GROUP );
-            context.writeUTF( group.getName() );
-        }
-        context.writeShort( PersisterEnums.END );
-
-        RuleFlowGroupImpl[] ruleFlowGroups = (RuleFlowGroupImpl[]) agenda.getRuleFlowGroupsMap().values().toArray( new RuleFlowGroupImpl[agenda.getRuleFlowGroupsMap().size()] );
-        Arrays.sort( ruleFlowGroups,
-                     RuleFlowGroupSorter.instance );
-
-        for ( RuleFlowGroupImpl group : ruleFlowGroups ) {
-            context.writeShort( PersisterEnums.RULE_FLOW_GROUP );
-            //group.write( context );
-            context.writeUTF( group.getName() );
-            context.writeBoolean( group.isActive() );
-            context.writeBoolean( group.isAutoDeactivate() );
-        }
-        context.writeShort( PersisterEnums.END );
-    }
-
-    public static class AgendaGroupSorter
-        implements
-        Comparator<AgendaGroup> {
-        public static final AgendaGroupSorter instance = new AgendaGroupSorter();
-
-        public int compare(AgendaGroup group1,
-                           AgendaGroup group2) {
-            return group1.getName().compareTo( group2.getName() );
-        }
-    }
-
-    public static class RuleFlowGroupSorter
-        implements
-        Comparator<RuleFlowGroup> {
-        public static final RuleFlowGroupSorter instance = new RuleFlowGroupSorter();
-
-        public int compare(RuleFlowGroup group1,
-                           RuleFlowGroup group2) {
-            return group1.getName().compareTo( group2.getName() );
-        }
-    }
-
-    public static void writeActionQueue(MarshallerWriteContext context) throws IOException {
-        ReteooWorkingMemory wm = (ReteooWorkingMemory) context.wm;
-
-        WorkingMemoryAction[] queue = wm.getActionQueue().toArray( new WorkingMemoryAction[wm.getActionQueue().size()] );
-        for ( int i = queue.length - 1; i >= 0; i-- ) {
-            context.writeShort( PersisterEnums.WORKING_MEMORY_ACTION );
-            queue[i].write( context );
-        }
-        context.writeShort( PersisterEnums.END );
-    }
-
-    public static void writeTruthMaintenanceSystem(MarshallerWriteContext context) throws IOException {
-        ObjectOutputStream stream = context.stream;
-
-        ObjectHashMap assertMap = context.wm.getTruthMaintenanceSystem().getAssertMap();
-
-        EqualityKey[] keys = new EqualityKey[assertMap.size()];
-        org.drools.util.Iterator it = assertMap.iterator();
-        int i = 0;
-        for ( org.drools.util.ObjectHashMap.ObjectEntry entry = (org.drools.util.ObjectHashMap.ObjectEntry) it.next(); entry != null; entry = (org.drools.util.ObjectHashMap.ObjectEntry) it.next() ) {
-            EqualityKey key = (EqualityKey) entry.getKey();
-            keys[i++] = key;
-        }
-
-        Arrays.sort( keys,
-                     EqualityKeySorter.instance );
-
-        // write the assert map of Equality keys
-        for ( EqualityKey key : keys ) {
-            stream.writeShort( PersisterEnums.EQUALITY_KEY );
-            stream.writeInt( key.getStatus() );
-            InternalFactHandle handle = key.getFactHandle();
-            stream.writeInt( handle.getId() );
-//            context.out.println( "EqualityKey int:" + key.getStatus() + " int:" + handle.getId() );
-            if ( key.getOtherFactHandle() != null && !key.getOtherFactHandle().isEmpty() ) {
-                for ( InternalFactHandle handle2 : key.getOtherFactHandle() ) {
-                    stream.writeShort( PersisterEnums.FACT_HANDLE );
-                    stream.writeInt( handle2.getId() );
-//                    context.out.println( "OtherHandle int:" + handle2.getId() );
-                }
-            }
-            stream.writeShort( PersisterEnums.END );
-        }
-        stream.writeShort( PersisterEnums.END );
-    }
-
-    public static class EqualityKeySorter
-        implements
-        Comparator<EqualityKey> {
-        public static final EqualityKeySorter instance = new EqualityKeySorter();
-
-        public int compare(EqualityKey key1,
-                           EqualityKey key2) {
-            return key1.getFactHandle().getId() - key2.getFactHandle().getId();
-        }
-    }
-
-    public static void writeFactHandles(MarshallerWriteContext context) throws IOException {
-        ObjectOutputStream stream = context.stream;
-        InternalWorkingMemory wm = context.wm;
-        PlaceholderResolverStrategyFactory resolverStrategyFactory = context.resolverStrategyFactory;
-
-        writeInitialFactHandleRightTuples( context );
-
-        stream.writeInt( wm.getObjectStore().size() );
-
-        // Write out FactHandles
-        for ( InternalFactHandle handle : orderFacts( wm.getObjectStore() ) ) {
-            //stream.writeShort( PersisterEnums.FACT_HANDLE );
-            //InternalFactHandle handle = (InternalFactHandle) it.next();
-            writeFactHandle( context,
-                             stream,
-                             resolverStrategyFactory,
-                             handle );
-
-            writeRightTuples( handle,
-                              context );
-        }
-
-        writeInitialFactHandleLeftTuples( context );
-
-        writeLeftTuples( context );
-
-        writePropagationContexts( context );
-
-        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();
-        InternalFactHandle[] handles = new InternalFactHandle[size];
-        int i = 0;
-        for ( Iterator it = objectStore.iterateFactHandles(); it.hasNext(); ) {
-            handles[i++] = (InternalFactHandle) it.next();
-        }
-
-        Arrays.sort( handles,
-                     new HandleSorter() );
-
-        return handles;
-    }
-
-    public static class HandleSorter
-        implements
-        Comparator<InternalFactHandle> {
-        public int compare(InternalFactHandle h1,
-                           InternalFactHandle h2) {
-            return h1.getId() - h2.getId();
-        }
-    }
-
-    public static void writeInitialFactHandleRightTuples(MarshallerWriteContext context) throws IOException {
-        ObjectOutputStream stream = context.stream;
-        InternalRuleBase ruleBase = context.ruleBase;
-
-        ObjectTypeNode initialFactNode = ruleBase.getRete().getEntryPointNode( EntryPoint.DEFAULT ).getObjectTypeNodes().get( new ClassObjectType( InitialFact.class ) );
-
-        // do we write the fact to the objecttypenode memory
-        if ( initialFactNode != null ) {
-            ObjectHashSet initialFactMemory = (ObjectHashSet) context.wm.getNodeMemory( initialFactNode );
-            if ( initialFactMemory != null && !initialFactMemory.isEmpty() ) {
-//                context.out.println( "InitialFactMemory true int:" + initialFactNode.getId() );
-                stream.writeBoolean( true );
-                stream.writeInt( initialFactNode.getId() );
-
-//                context.out.println( "InitialFact RightTuples" );
-                writeRightTuples( context.wm.getInitialFactHandle(),
-                                  context );
-            } else {
-//                context.out.println( "InitialFactMemory false " );
-                stream.writeBoolean( false );
-            }
-        } else {
-//            context.out.println( "InitialFactMemory false " );
-            stream.writeBoolean( false );
-        }
-    }
-
-    public static void writeInitialFactHandleLeftTuples(MarshallerWriteContext context) throws IOException {
-        ObjectOutputStream stream = context.stream;
-
-//        context.out.println( "InitialFact LeftTuples Start" );
-        InternalFactHandle handle = context.wm.getInitialFactHandle();
-        for ( LeftTuple leftTuple = getLeftTuple( handle.getLeftTuple() ); leftTuple != null; leftTuple = (LeftTuple) leftTuple.getLeftParentPrevious() ) {
-            stream.writeShort( PersisterEnums.LEFT_TUPLE );
-
-            stream.writeInt( leftTuple.getLeftTupleSink().getId() );
-//            context.out.println( "LeftTuple sinkId:" + leftTuple.getLeftTupleSink().getId() );
-            writeLeftTuple( leftTuple,
-                            context,
-                            true );
-        }
-        stream.writeShort( PersisterEnums.END );
-//        context.out.println( "InitialFact LeftTuples End" );
-    }
-
-    public static void writeRightTuples(InternalFactHandle handle,
-                                        MarshallerWriteContext context) throws IOException {
-        ObjectOutputStream stream = context.stream;
-//        context.out.println( "RightTuples Start" );
-
-        RightTuple rightTuple = handle.getRightTuple();
-        for ( RightTuple tempRightTuple = rightTuple; tempRightTuple != null; tempRightTuple = (RightTuple) tempRightTuple.getHandleNext() ) {
-            rightTuple = tempRightTuple;
-        }
-        for ( ; rightTuple != null; rightTuple = (RightTuple) rightTuple.getHandlePrevious() ) {
-            stream.writeShort( PersisterEnums.RIGHT_TUPLE );
-            writeRightTuple( rightTuple,
-                             context );
-        }
-        stream.writeShort( PersisterEnums.END );
-//        context.out.println( "RightTuples END" );
-    }
-
-    public static void writeRightTuple(RightTuple rightTuple,
-                                       MarshallerWriteContext context) throws IOException {
-        ObjectOutputStream stream = context.stream;
-        InternalWorkingMemory wm = context.wm;
-        stream.writeInt( rightTuple.getRightTupleSink().getId() );
-//        context.out.println( "RightTuple sinkId:" + rightTuple.getRightTupleSink().getId() );
-    }
-
-    public static void writeLeftTuples(MarshallerWriteContext context) throws IOException {
-        ObjectOutputStream stream = context.stream;
-        InternalWorkingMemory wm = context.wm;
-
-        // Write out LeftTuples
-//        context.out.println( "LeftTuples Start" );
-        for ( InternalFactHandle handle : orderFacts( wm.getObjectStore() ) ) {
-            //InternalFactHandle handle = (InternalFactHandle) it.next();
-
-            for ( LeftTuple leftTuple = getLeftTuple( handle.getLeftTuple() ); leftTuple != null; leftTuple = (LeftTuple) leftTuple.getLeftParentPrevious() ) {
-                stream.writeShort( PersisterEnums.LEFT_TUPLE );
-
-                stream.writeInt( leftTuple.getLeftTupleSink().getId() );
-                stream.writeInt( handle.getId() );
-
-//                context.out.println( "LeftTuple sinkId:" + leftTuple.getLeftTupleSink().getId() + " handleId:" + handle.getId() );
-                writeLeftTuple( leftTuple,
-                                context,
-                                true );
-            }
-        }
-        stream.writeShort( PersisterEnums.END );
-//        context.out.println( "LeftTuples End" );
-    }
-
-    public static void writeLeftTuple(LeftTuple leftTuple,
-                                      MarshallerWriteContext context,
-                                      boolean recurse) throws IOException {
-        ObjectOutputStream stream = context.stream;
-        InternalRuleBase ruleBase = context.ruleBase;
-        InternalWorkingMemory wm = context.wm;
-
-        LeftTupleSink sink = leftTuple.getLeftTupleSink();
-
-        switch ( sink.getType() ) {
-            case NodeTypeEnums.JoinNode : {
-//                context.out.println( "JoinNode" );
-                for ( LeftTuple childLeftTuple = getLeftTuple( leftTuple.getBetaChildren() ); childLeftTuple != null; childLeftTuple = (LeftTuple) childLeftTuple.getLeftParentPrevious() ) {
-                    stream.writeShort( PersisterEnums.RIGHT_TUPLE );
-                    stream.writeInt( childLeftTuple.getLeftTupleSink().getId() );
-                    stream.writeInt( childLeftTuple.getRightParent().getFactHandle().getId() );
-//                    context.out.println( "RightTuple int:" + childLeftTuple.getLeftTupleSink().getId() + " int:" + childLeftTuple.getRightParent().getFactHandle().getId() );
-                    writeLeftTuple( childLeftTuple,
-                                    context,
-                                    recurse );
-                }
-                stream.writeShort( PersisterEnums.END );
-//                context.out.println( "JoinNode   ---   END" );
-                break;
-            }
-            case NodeTypeEnums.EvalConditionNode : {
-//                context.out.println( "EvalConditionNode" );
-                for ( LeftTuple childLeftTuple = getLeftTuple( leftTuple.getBetaChildren() ); childLeftTuple != null; childLeftTuple = (LeftTuple) childLeftTuple.getLeftParentPrevious() ) {
-                    stream.writeShort( PersisterEnums.LEFT_TUPLE );
-                    stream.writeInt( childLeftTuple.getLeftTupleSink().getId() );
-                    writeLeftTuple( childLeftTuple,
-                                    context,
-                                    recurse );
-                }
-                stream.writeShort( PersisterEnums.END );
-                break;
-            }
-            case NodeTypeEnums.NotNode : {
-                if ( leftTuple.getBlocker() == null ) {
-                    // is not blocked so has children
-                    stream.writeShort( PersisterEnums.LEFT_TUPLE_NOT_BLOCKED );
-
-                    for ( LeftTuple childLeftTuple = getLeftTuple( leftTuple.getBetaChildren() ); childLeftTuple != null; childLeftTuple = (LeftTuple) leftTuple.getLeftParentPrevious() ) {
-                        stream.writeShort( PersisterEnums.LEFT_TUPLE );
-                        stream.writeInt( childLeftTuple.getLeftTupleSink().getId() );
-                        writeLeftTuple( childLeftTuple,
-                                        context,
-                                        recurse );
-                    }
-                    stream.writeShort( PersisterEnums.END );
-
-                } else {
-                    stream.writeShort( PersisterEnums.LEFT_TUPLE_BLOCKED );
-                    stream.writeInt( leftTuple.getBlocker().getFactHandle().getId() );
-                }
-                break;
-            }
-            case NodeTypeEnums.ExistsNode : {
-                if ( leftTuple.getBlocker() == null ) {
-                    // is blocked so has children
-                    stream.writeShort( PersisterEnums.LEFT_TUPLE_NOT_BLOCKED );
-                } else {
-                    stream.writeShort( PersisterEnums.LEFT_TUPLE_BLOCKED );
-                    stream.writeInt( leftTuple.getBlocker().getFactHandle().getId() );
-
-                    for ( LeftTuple childLeftTuple = getLeftTuple( leftTuple.getBetaChildren() ); childLeftTuple != null; childLeftTuple = (LeftTuple) leftTuple.getLeftParentPrevious() ) {
-                        stream.writeShort( PersisterEnums.LEFT_TUPLE );
-                        stream.writeInt( childLeftTuple.getLeftTupleSink().getId() );
-                        writeLeftTuple( childLeftTuple,
-                                        context,
-                                        recurse );
-                    }
-                    stream.writeShort( PersisterEnums.END );
-                }
-                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) sink );
-                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.CollectNode : {
-//                context.out.println( "CollectNode" );
-                // collect nodes generate new facts on-demand and need special procedures when serializing to persistent storage
-                CollectMemory memory = (CollectMemory) context.wm.getNodeMemory( (BetaNode) sink );
-                CollectContext colctx = (CollectContext) memory.betaMemory.getCreatedHandles().get( leftTuple );
-                // first we serialize the generated fact handle
-                writeFactHandle( context,
-                                 stream,
-                                 context.resolverStrategyFactory,
-                                 colctx.resultTuple.getFactHandle() );
-                // then we serialize the boolean propagated flag
-                stream.writeBoolean( colctx.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( "CollectNode   ---   END" );
-                break;
-            }
-            case NodeTypeEnums.RightInputAdaterNode : {
-//                context.out.println( "RightInputAdapterNode" );
-                // RIANs generate new fact handles on-demand to wrap tuples and need special procedures when serializing to persistent storage
-                ObjectHashMap memory = (ObjectHashMap) context.wm.getNodeMemory( (NodeMemory) sink );
-                InternalFactHandle ifh = (InternalFactHandle) memory.get( leftTuple );
-                // first we serialize the generated fact handle ID
-//                context.out.println( "FactHandle id:"+ifh.getId() );
-                stream.writeInt( ifh.getId() );
-                stream.writeLong( ifh.getRecency() );
-                
-                writeRightTuples( ifh, context );
-
-                stream.writeShort( PersisterEnums.END );
-//                context.out.println( "RightInputAdapterNode   ---   END" );
-                break;
-            }
-            case NodeTypeEnums.RuleTerminalNode : {
-//                context.out.println( "RuleTerminalNode" );
-                int pos = context.terminalTupleMap.size();
-                context.terminalTupleMap.put( leftTuple,
-                                              pos );
-                break;
-            }
-        }
-    }
-
-    public static LeftTuple getLeftTuple(LeftTuple leftTuple) {
-        for ( LeftTuple tempLeftTuple = leftTuple; tempLeftTuple != null; tempLeftTuple = (LeftTuple) tempLeftTuple.getLeftParentNext() ) {
-            leftTuple = tempLeftTuple;
-        }
-        return leftTuple;
-    }
-
-    public static void writeActivations(MarshallerWriteContext context) throws IOException {
-        ObjectOutputStream stream = context.stream;
-
-        Entry<LeftTuple, Integer>[] entries = context.terminalTupleMap.entrySet().toArray( new Entry[context.terminalTupleMap.size()] );
-        Arrays.sort( entries,
-                     TupleSorter.instance );
-
-        //Map<LeftTuple, Integer> tuples = context.terminalTupleMap;
-        if ( entries.length != 0 ) {
-            for ( Entry<LeftTuple, Integer> entry : entries ) {
-                if (entry.getKey().getActivation() != null) {
-					LeftTuple leftTuple = entry.getKey();
-					stream.writeShort(PersisterEnums.ACTIVATION);
-					writeActivation(context, leftTuple, (AgendaItem) leftTuple
-							.getActivation(), (RuleTerminalNode) leftTuple
-							.getLeftTupleSink());
-				}
-            }
-        }
-        stream.writeShort( PersisterEnums.END );
-    }
-
-    public static class TupleSorter
-        implements
-        Comparator<Entry<LeftTuple, Integer>> {
-        public static final TupleSorter instance = new TupleSorter();
-
-        public int compare(Entry<LeftTuple, Integer> e1,
-                           Entry<LeftTuple, Integer> e2) {
-            return e1.getValue() - e2.getValue();
-        }
-    }
-
-    public static void writeActivation(MarshallerWriteContext context,
-                                       LeftTuple leftTuple,
-                                       AgendaItem agendaItem,
-                                       RuleTerminalNode ruleTerminalNode) throws IOException {
-        ObjectOutputStream stream = context.stream;
-
-        stream.writeLong( agendaItem.getActivationNumber() );
-
-        stream.writeInt( context.terminalTupleMap.get( leftTuple ) );
-
-        stream.writeInt( agendaItem.getSalience() );
-
-        Rule rule = agendaItem.getRule();
-        stream.writeUTF( rule.getPackage() );
-        stream.writeUTF( rule.getName() );
-
-//        context.out.println( "Rule " + rule.getPackage() + "." + rule.getName() );
-
-//        context.out.println( "AgendaItem long:" + agendaItem.getPropagationContext().getPropagationNumber() );
-        stream.writeLong( agendaItem.getPropagationContext().getPropagationNumber() );
-
-        if ( agendaItem.getActivationGroupNode() != null ) {
-            stream.writeBoolean( true );
-//            context.out.println( "ActivationGroup bool:" + true );
-            stream.writeUTF( agendaItem.getActivationGroupNode().getActivationGroup().getName() );
-//            context.out.println( "ActivationGroup string:" + agendaItem.getActivationGroupNode().getActivationGroup().getName() );
-        } else {
-            stream.writeBoolean( false );
-//            context.out.println( "ActivationGroup bool:" + false );
-        }
-
-        stream.writeBoolean( agendaItem.isActivated() );
-//        context.out.println( "AgendaItem bool:" + agendaItem.isActivated() );
-
-        org.drools.util.LinkedList list = agendaItem.getLogicalDependencies();
-        if ( list != null && !list.isEmpty() ) {
-            for ( LogicalDependency node = (LogicalDependency) list.getFirst(); node != null; node = (LogicalDependency) node.getNext() ) {
-                stream.writeShort( PersisterEnums.LOGICAL_DEPENDENCY );
-                stream.writeInt( ((InternalFactHandle) node.getFactHandle()).getId() );
-//                context.out.println( "Logical Depenency : int " + ((InternalFactHandle) node.getFactHandle()).getId() );
-            }
-        }
-        stream.writeShort( PersisterEnums.END );
-    }
-
-    public static void writePropagationContexts(MarshallerWriteContext context) throws IOException {
-        ObjectOutputStream stream = context.stream;
-
-        Entry<LeftTuple, Integer>[] entries = context.terminalTupleMap.entrySet().toArray( new Entry[context.terminalTupleMap.size()] );
-        Arrays.sort( entries,
-                     TupleSorter.instance );
-
-        //Map<LeftTuple, Integer> tuples = context.terminalTupleMap;
-        if ( entries.length != 0 ) {
-            Map<Long, PropagationContext> pcMap = new HashMap<Long, PropagationContext>();
-            for ( Entry<LeftTuple, Integer> entry : entries ) {
-                LeftTuple leftTuple = entry.getKey();
-                if (leftTuple.getActivation() != null) {
-					PropagationContext pc = leftTuple.getActivation()
-							.getPropagationContext();
-					if (!pcMap.containsKey(pc.getPropagationNumber())) {
-						stream.writeShort(PersisterEnums.PROPAGATION_CONTEXT);
-						writePropagationContext(context, pc);
-						pcMap.put(pc.getPropagationNumber(), pc);
-					}
-				}
-            }
-        }
-
-        stream.writeShort( PersisterEnums.END );
-    }
-
-    public static void writePropagationContext(MarshallerWriteContext context,
-                                               PropagationContext pc) throws IOException {
-        ObjectOutputStream stream = context.stream;
-        Map<LeftTuple, Integer> tuples = context.terminalTupleMap;
-
-        stream.writeInt( pc.getType() );
-
-        Rule ruleOrigin = pc.getRuleOrigin();
-        if ( ruleOrigin != null ) {
-            stream.writeBoolean( true );
-            stream.writeUTF( ruleOrigin.getPackage() );
-            stream.writeUTF( ruleOrigin.getName() );
-        } else {
-            stream.writeBoolean( false );
-        }
-
-        LeftTuple tupleOrigin = pc.getLeftTupleOrigin();
-        if ( tupleOrigin != null && tuples.containsKey( tupleOrigin )) {
-            stream.writeBoolean( true );
-            stream.writeInt( tuples.get( tupleOrigin ) );
-        } else {
-            stream.writeBoolean( false );
-        }
-
-        stream.writeLong( pc.getPropagationNumber() );
-        if ( pc.getFactHandleOrigin() != null ) {
-            stream.writeInt( ((InternalFactHandle)pc.getFactHandleOrigin()).getId() );
-        } else {
-            stream.writeInt( -1 );
-        }
-
-        stream.writeInt( pc.getActiveActivations() );
-        stream.writeInt( pc.getDormantActivations() );
-
-        stream.writeUTF( pc.getEntryPoint().getEntryPointId() );
-    }
-
-    public static void writeProcessInstances(MarshallerWriteContext context) throws IOException {
-        ObjectOutputStream stream = context.stream;
-        List<org.drools.runtime.process.ProcessInstance> processInstances = new ArrayList<org.drools.runtime.process.ProcessInstance>( context.wm.getProcessInstances() );
-        Collections.sort( processInstances,
-                          new Comparator<org.drools.runtime.process.ProcessInstance>() {
-                              public int compare(org.drools.runtime.process.ProcessInstance o1,
-                            		  org.drools.runtime.process.ProcessInstance o2) {
-                                  return (int) (o1.getId() - o2.getId());
-                              }
-                          } );
-        for ( org.drools.runtime.process.ProcessInstance processInstance : processInstances ) {
-            stream.writeShort( PersisterEnums.PROCESS_INSTANCE );
-            writeProcessInstance( context,
-                                  (RuleFlowProcessInstance) processInstance );
-        }
-        stream.writeShort( PersisterEnums.END );
-    }
-
-    public static void writeProcessInstance(MarshallerWriteContext context,
-                                            RuleFlowProcessInstance processInstance) throws IOException {
-        ObjectOutputStream stream = context.stream;
-        stream.writeLong( processInstance.getId() );
-        stream.writeUTF( processInstance.getProcessId() );
-        stream.writeInt( processInstance.getState() );
-        stream.writeLong( processInstance.getNodeInstanceCounter() );
-
-        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 );
-                              }
-                          } );
-        stream.writeInt( keys.size() );
-        for ( String key : keys ) {
-            stream.writeUTF( key );
-            stream.writeObject( variables.get( key ) );
-        }
-
-        SwimlaneContextInstance swimlaneContextInstance = (SwimlaneContextInstance) processInstance.getContextInstance( SwimlaneContext.SWIMLANE_SCOPE );
-        Map<String, String> swimlaneActors = swimlaneContextInstance.getSwimlaneActors();
-        stream.writeInt( swimlaneActors.size() );
-        for ( Map.Entry<String, String> entry : swimlaneActors.entrySet() ) {
-            stream.writeUTF( entry.getKey() );
-            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());
-                              }
-                          } );
-        for ( NodeInstance nodeInstance : nodeInstances ) {
-            stream.writeShort( PersisterEnums.NODE_INSTANCE );
-            writeNodeInstance( context,
-                               nodeInstance );
-        }
-        stream.writeShort( PersisterEnums.END );
-    }
-
-    public static void writeNodeInstance(MarshallerWriteContext context,
-                                         NodeInstance nodeInstance) throws IOException {
-        ObjectOutputStream stream = context.stream;
-        stream.writeLong( nodeInstance.getId() );
-        stream.writeLong( nodeInstance.getNodeId() );
-        if ( nodeInstance instanceof RuleSetNodeInstance ) {
-            stream.writeShort( PersisterEnums.RULE_SET_NODE_INSTANCE );
-        } else if ( nodeInstance instanceof HumanTaskNodeInstance ) {
-            stream.writeShort( PersisterEnums.HUMAN_TASK_NODE_INSTANCE );
-            stream.writeLong( ((HumanTaskNodeInstance) nodeInstance).getWorkItem().getId() );
-        } else if ( nodeInstance instanceof WorkItemNodeInstance ) {
-            stream.writeShort( PersisterEnums.WORK_ITEM_NODE_INSTANCE );
-            stream.writeLong( ((WorkItemNodeInstance) nodeInstance).getWorkItem().getId() );
-        } else if ( nodeInstance instanceof SubProcessNodeInstance ) {
-            stream.writeShort( PersisterEnums.SUB_PROCESS_NODE_INSTANCE );
-            stream.writeLong( ((SubProcessNodeInstance) nodeInstance).getProcessInstanceId() );
-        } else if ( nodeInstance instanceof MilestoneNodeInstance ) {
-            stream.writeShort( PersisterEnums.MILESTONE_NODE_INSTANCE );
-            List<Long> timerInstances = 
-            	((MilestoneNodeInstance) nodeInstance).getTimerInstances();
-            if (timerInstances != null) {
-            	stream.writeInt(timerInstances.size());
-            	for (Long id: timerInstances) {
-            		stream.writeLong(id);
-            	}
-            } else {
-            	stream.writeInt(0);
-            }
-        } else if ( nodeInstance instanceof TimerNodeInstance ) {
-            stream.writeShort( PersisterEnums.TIMER_NODE_INSTANCE );
-            stream.writeLong( ((TimerNodeInstance) nodeInstance).getTimerId() );
-        } else if ( nodeInstance instanceof JoinInstance ) {
-            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 );
-                                  }
-                              } );
-            for ( Long key : keys ) {
-                stream.writeLong( 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 );
-            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 );
-                                  }
-                              } );
-            stream.writeInt( keys.size() );
-            for ( String key : keys ) {
-                stream.writeUTF( 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());
-                                  }
-                              } );
-            for ( NodeInstance subNodeInstance : nodeInstances ) {
-                stream.writeShort( PersisterEnums.NODE_INSTANCE );
-                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());
-                                  }
-                              } );
-            for ( NodeInstance subNodeInstance : nodeInstances ) {
-                if ( subNodeInstance instanceof CompositeContextNodeInstance ) {
-                    stream.writeShort( PersisterEnums.NODE_INSTANCE );
-                    writeNodeInstance( context,
-                                       subNodeInstance );
-                }
-            }
-            stream.writeShort( PersisterEnums.END );
-        } else {
-            // TODO ForEachNodeInstance
-            // TODO timer manager
-            throw new IllegalArgumentException( "Unknown node instance type: " + nodeInstance );
-        }
-    }
-
-    public static void writeWorkItems(MarshallerWriteContext context) throws IOException {
-        ObjectOutputStream stream = context.stream;
-
-        List<WorkItem> workItems = new ArrayList<WorkItem>(
-    		((WorkItemManager) 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,
-                           workItem );
-        }
-        stream.writeShort( PersisterEnums.END );
-    }
-
-    public static void writeWorkItem(MarshallerWriteContext context,
-                                     WorkItem workItem) throws IOException {
-        ObjectOutputStream stream = context.stream;
-        stream.writeLong( workItem.getId() );
-        stream.writeLong( workItem.getProcessInstanceId() );
-        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() );
-        }
-    }
-
-    public static void writeTimers(MarshallerWriteContext context) throws IOException {
-        ObjectOutputStream stream = context.stream;
-
-        TimerManager timerManager = context.wm.getTimerManager();
-        long timerId = timerManager.internalGetTimerId();
-        stream.writeLong( timerId );
-        
-        // need to think on how to fix this
-        // stream.writeObject( timerManager.getTimerService() );
-        
-        List<TimerInstance> timers = new ArrayList<TimerInstance>( timerManager.getTimers() );
-        Collections.sort( timers,
-                          new Comparator<TimerInstance>() {
-                              public int compare(TimerInstance o1,
-                                                 TimerInstance o2) {
-                                  return (int) (o2.getId() - o1.getId());
-                              }
-                          } );
-        for ( TimerInstance timer : timers ) {
-            stream.writeShort( PersisterEnums.TIMER );
-            writeTimer( context,
-                        timer );
-        }
-        stream.writeShort( PersisterEnums.END );
-    }
-
-    public static void writeTimer(MarshallerWriteContext context,
-                                  TimerInstance timer) throws IOException {
-        ObjectOutputStream stream = context.stream;
-        stream.writeLong( timer.getId() );
-        stream.writeLong( timer.getTimerId() );
-        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 );
-        }
-    }
-
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterEnums.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterEnums.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterEnums.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,43 +0,0 @@
-package org.drools.marshalling;
-
-public class PersisterEnums {
-    public static final short REPEAT                 = 0;
-    public static final short END                    = 1;
-    public static final short FACT_HANDLE            = 2;
-    public static final short LEFT_TUPLE             = 3;
-    public static final short RIGHT_TUPLE            = 4;
-
-    public static final short INITIAL_FACT_NODE      = 5;
-    
-    public static final short LEFT_TUPLE_BLOCKED     = 6;
-    public static final short LEFT_TUPLE_NOT_BLOCKED = 7;
-
-    public static final short ACTIVATION             = 8;
-    public static final short PROPAGATION_CONTEXT    = 9;
-    
-    public static final short WORKING_MEMORY_ACTION  = 10;
-    
-    public static final short EQUALITY_KEY           = 11;
-    public static final short LOGICAL_DEPENDENCY     = 12; 
-    
-    public static final short AGENDA_GROUP           = 13;
-    public static final short ACTIVATION_GROUP       = 14;
-    
-    public static final short RULE_FLOW_GROUP        = 15;
-    public static final short RULE_FLOW_NODE         = 16;
-    
-    public static final short PROCESS_INSTANCE          = 17;
-    public static final short NODE_INSTANCE             = 18;
-    public static final short WORK_ITEM                 = 19;
-    public static final short RULE_SET_NODE_INSTANCE    = 20;
-    public static final short WORK_ITEM_NODE_INSTANCE   = 21;
-    public static final short SUB_PROCESS_NODE_INSTANCE = 22;
-    public static final short MILESTONE_NODE_INSTANCE   = 23;
-    public static final short TIMER_NODE_INSTANCE       = 24;
-    public static final short JOIN_NODE_INSTANCE        = 25;
-    public static final short COMPOSITE_NODE_INSTANCE   = 26;
-    public static final short HUMAN_TASK_NODE_INSTANCE  = 27;
-    public static final short FOR_EACH_NODE_INSTANCE    = 28;
-    public static final short TIMER                     = 29;
-
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterHelper.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterHelper.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,39 +0,0 @@
-package org.drools.marshalling;
-
-import java.io.IOException;
-
-import org.drools.common.WorkingMemoryAction;
-import org.drools.common.RuleFlowGroupImpl.DeactivateCallback;
-import org.drools.common.TruthMaintenanceSystem.LogicalRetractCallback;
-import org.drools.process.instance.event.DefaultSignalManager.SignalProcessInstanceAction;
-import org.drools.reteoo.PropagationQueuingNode.PropagateAction;
-import org.drools.reteoo.ReteooWorkingMemory.WorkingMemoryReteAssertAction;
-
-public class PersisterHelper {
-    public static WorkingMemoryAction readWorkingMemoryAction(MarshallerReaderContext context) throws IOException, ClassNotFoundException {
-        int type = context.readInt();
-        switch(type) {
-            case WorkingMemoryAction.WorkingMemoryReteAssertAction : {
-                return new WorkingMemoryReteAssertAction(context);
-            }
-            case WorkingMemoryAction.DeactivateCallback : {
-                return new DeactivateCallback(context);
-            }
-            case WorkingMemoryAction.PropagateAction : {
-                return new PropagateAction(context);
-            }
-            case WorkingMemoryAction.LogicalRetractCallback : {
-                return new LogicalRetractCallback(context);
-            }
-            
-            case WorkingMemoryAction.SignalProcessInstanceAction : {
-                return new SignalProcessInstanceAction(context);
-            }
-        }    
-        return null;
-    }
-    
-    public void write(MarshallerWriteContext context) throws IOException {
-        
-    }
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterKey.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterKey.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterKey.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,7 +0,0 @@
-package org.drools.marshalling;
-
-public interface PersisterKey {
-   public boolean equal(Object object1, Object object2);
-   
-   public int hashCode(Object object);
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PlaceholderResolverStrategy.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PlaceholderResolverStrategy.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PlaceholderResolverStrategy.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,19 +0,0 @@
-package org.drools.marshalling;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-
-public interface PlaceholderResolverStrategy {
-    
-    public void setIndex(int id);
-    
-    public int getIndex();
-    
-    public boolean accept(Object object);
-
-    public void write(ObjectOutputStream os,
-                      Object object) throws IOException;
-
-    public ObjectPlaceholder read(ObjectInputStream os) throws IOException, ClassNotFoundException;
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PlaceholderResolverStrategyAcceptor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PlaceholderResolverStrategyAcceptor.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PlaceholderResolverStrategyAcceptor.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,5 +0,0 @@
-package org.drools.marshalling;
-
-public interface PlaceholderResolverStrategyAcceptor {
-    public boolean accept(Object object);
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PlaceholderResolverStrategyFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PlaceholderResolverStrategyFactory.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PlaceholderResolverStrategyFactory.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,30 +0,0 @@
-package org.drools.marshalling;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class PlaceholderResolverStrategyFactory {
-    List<PlaceholderResolverStrategy> strategiesList;
-    
-    public PlaceholderResolverStrategyFactory() {
-        this.strategiesList = new ArrayList<PlaceholderResolverStrategy>();
-    }
-    
-    public void addStrategy(PlaceholderResolverStrategy strategy) {
-        strategy.setIndex( this.strategiesList.size() );
-        this.strategiesList.add( strategy );
-    }    
-    
-    public PlaceholderResolverStrategy getStrategy(int index) {
-        return this.strategiesList.get( index );        
-    }
-    
-    public PlaceholderResolverStrategy getStrategy(Object object) {
-        for ( PlaceholderResolverStrategy strategy: strategiesList ) {
-            if ( strategy.accept( object ) ) {
-                return strategy;
-            }
-        }
-        throw new RuntimeException( "Unable to info PlaceholderResolverStrategy for class : " + object.getClass() + " object : " + object );
-    }
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/Placeholders.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/Placeholders.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/Placeholders.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,129 +0,0 @@
-package org.drools.marshalling;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.drools.util.AbstractHashTable;
-import org.drools.util.Entry;
-
-public class Placeholders extends AbstractHashTable {
-    private List<Object> ids;
-
-    public Placeholders() {
-        super();
-        this.ids = new ArrayList<Object>();
-    }
-    
-    public PlaceholderEntry lookupPlaceholder(Object object, PersisterKey key) {
-        final int hashCode = key.hashCode( object );
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-        
-        PlaceholderEntry current = (PlaceholderEntry) this.table[index];
-        while ( current != null ) {
-            if ( hashCode == current.hashCode && current.key == key && key.equal( object,
-                                                                                  current.object ) ) {
-                return current;
-            }
-            current = (PlaceholderEntry) current.getNext();
-        }
-        return null;
-    }
-
-    public PlaceholderEntry assignPlaceholder(Object object,
-                                              PersisterKey key) {
-        final int hashCode = key.hashCode( object );
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-
-        int id = ids.size();
-        this.ids.add( object );
-        PlaceholderEntry entry = new PlaceholderEntry( object,
-                                                       id,
-                                                       key );
-
-        entry.next = this.table[index];
-        this.table[index] = entry;
-
-        if ( this.size++ >= this.threshold ) {
-            resize( 2 * this.table.length );
-        }
-
-        return entry;
-    }
-
-    public Object lookupObject(int id) {
-        return this.ids.get( id );
-    }
-
-    public static class PlaceholderEntry
-        implements
-        Entry {
-
-        private static final long serialVersionUID = 400L;
-
-        public Object             object;
-
-        public int                id;
-
-        public PersisterKey       key;
-
-        public int                hashCode;
-
-        public Entry              next;
-
-        //        private LinkedList              list;
-
-        public PlaceholderEntry(final Object object,
-                                final int id,
-                                final PersisterKey key) {
-            this.object = object;
-            this.id = id;
-            this.key = key;
-            this.hashCode = key.hashCode( object );
-        }
-
-        //    public PlaceholderEntry(final InternalFactHandle handle,
-        //                            final int hashCode) {
-        //        this.handle = handle;
-        //        this.hashCode = hashCode;
-        //        //            this.list = new LinkedList();
-        //    }
-
-        public Entry getNext() {
-            return this.next;
-        }
-
-        public void setNext(final Entry next) {
-            this.next = next;
-        }
-
-        public int hashCode() {
-            return this.hashCode;
-        }
-
-        public String toString() {
-            return "Placeholder( object=" + this.object + " id = " + this.id + " hashcode=" + this.hashCode + " next=" + this.next + " )";
-        }
-
-        public Object getObject() {
-            return object;
-        }
-
-        public int getId() {
-            return id;
-        }
-
-        public PersisterKey getKey() {
-            return key;
-        }
-
-    }
-
-    @Override
-    public Entry getBucket(Object object) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/ProcessInstanceMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/ProcessInstanceMarshaller.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/ProcessInstanceMarshaller.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,39 +0,0 @@
-package org.drools.marshalling;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-
-import org.drools.runtime.process.NodeInstance;
-import org.drools.runtime.process.NodeInstanceContainer;
-import org.drools.runtime.process.ProcessInstance;
-import org.drools.workflow.instance.WorkflowProcessInstance;
-import org.drools.workflow.instance.impl.NodeInstanceImpl;
-
-/**
- * A ProcessInstanceMarshaller must contain all the write/read logic for nodes
- * of a specific ProcessInstance. It colaborates with OutputMarshaller and
- * InputMarshaller, that delegates in a ProcessInstanceMarshaller to stream in/out runtime
- * information.
- * 
- * @see OutPutMarshaller
- * @see InputMarshaller
- * @see ProcessMarshallerRegistry
- * 
- * @author mfossati, salaboy
- */
-
-public interface ProcessInstanceMarshaller {
-
-	public void writeProcessInstance(MarshallerWriteContext context,
-			ProcessInstance processInstance) throws IOException;
-
-	public void writeNodeInstance(MarshallerWriteContext context,
-			NodeInstance nodeInstance) throws IOException;
-
-	public ProcessInstance readProcessInstance(MarshallerReaderContext context)
-			throws IOException;
-
-	public NodeInstance readNodeInstance(MarshallerReaderContext context,
-			NodeInstanceContainer nodeInstanceContainer,
-			WorkflowProcessInstance processInstance) throws IOException;
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/ProcessMarshallerRegistry.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/ProcessMarshallerRegistry.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/ProcessMarshallerRegistry.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,38 +0,0 @@
-package org.drools.marshalling;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.drools.process.instance.impl.ProcessInstanceImpl;
-import org.drools.ruleflow.core.RuleFlowProcess;
-import org.drools.ruleflow.instance.RuleFlowProcessInstance;
-
-/**
-* Registry for Process/ProcessMarshaller
-*/
-public class ProcessMarshallerRegistry {
-
-	public static ProcessMarshallerRegistry INSTANCE = new ProcessMarshallerRegistry();
-
-	private Map<String , ProcessInstanceMarshaller> registry;
-
-	private ProcessMarshallerRegistry() {
-		 this.registry = new HashMap<String, ProcessInstanceMarshaller >();
-
-	        // default logic that used to be in OutPutMarshaller:
-	        register( RuleFlowProcess.RULEFLOW_TYPE,
-	                  RuleFlowProcessInstanceMarshaller.INSTANCE );
-	}
-
-	public void register(String cls,
-			ProcessInstanceMarshaller marchaller) {
-		this.registry.put(cls, marchaller);
-	}
-	
-	@SuppressWarnings("unchecked")
-	public ProcessInstanceMarshaller getMarshaller(String type) {
-		return this.registry.get(type);
-	}
-	
-
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/RightTupleKey.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/RightTupleKey.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/RightTupleKey.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,48 +0,0 @@
-/**
- * 
- */
-package org.drools.marshalling;
-
-import org.drools.reteoo.Sink;
-
-public class RightTupleKey {
-    private final int  id;
-    private final Sink sink;
-
-    public RightTupleKey(int id,
-                         Sink sink) {
-        super();
-        this.id = id;
-        this.sink = sink;
-    }
-
-    public int getId() {
-        return id;
-    }
-
-    public Sink getSink() {
-        return sink;
-    }
-
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + id;
-        result = prime * result + sink.getId();
-        return result;
-    }
-
-    public boolean equals(Object obj) {
-        if ( this == obj ) return true;
-        if ( obj == null ) return false;
-        if ( getClass() != obj.getClass() ) return false;
-        
-        final RightTupleKey other = (RightTupleKey) obj;
-        if ( id != other.id ) return false;
-        if ( sink == null ) {
-            if ( other.sink != null ) return false;
-        } else if ( sink.getId() != other.sink.getId() ) return false;
-        return true;
-    }
-
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/RuleBaseNodes.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/RuleBaseNodes.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/RuleBaseNodes.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,79 +0,0 @@
-package org.drools.marshalling;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.drools.common.BaseNode;
-import org.drools.common.InternalRuleBase;
-import org.drools.reteoo.LeftTupleSink;
-import org.drools.reteoo.LeftTupleSource;
-import org.drools.reteoo.ObjectSink;
-import org.drools.reteoo.ObjectSource;
-import org.drools.reteoo.ObjectTypeNode;
-import org.drools.reteoo.RuleTerminalNode;
-
-public class RuleBaseNodes {
-    public static Map<Integer, BaseNode> getNodeMap(InternalRuleBase ruleBase) {        
-        Map<Integer, BaseNode> nodes = new HashMap<Integer, BaseNode>();
-        buildNodeMap( ruleBase, nodes );
-        return nodes;
-    }
-    
-    private static void buildNodeMap(InternalRuleBase ruleBase,
-                                     Map<Integer, BaseNode> nodes) {
-        for ( ObjectTypeNode sink : ruleBase.getRete().getObjectTypeNodes() ) {
-            nodes.put( sink.getId(),
-                       sink );
-            addObjectSink( ruleBase,
-                           sink,
-                           nodes );
-        }
-    }
-
-    private static void addObjectSink(InternalRuleBase ruleBase,
-                                     ObjectSink sink,
-                                     Map<Integer, BaseNode> nodes) {
-        // we don't need to store alpha nodes, as they have no state to serialise
-        if ( sink instanceof LeftTupleSource ) {
-            LeftTupleSource node = (LeftTupleSource) sink;
-            for ( LeftTupleSink leftTupleSink : node.getSinkPropagator().getSinks() ) {
-                addLeftTupleSink( ruleBase,
-                                  leftTupleSink,
-                                  nodes );
-            }
-        } else {
-            ObjectSource node = ( ObjectSource ) sink;
-            for ( ObjectSink objectSink : node.getSinkPropagator().getSinks() ) {
-                addObjectSink( ruleBase,
-                               objectSink,
-                               nodes );
-            }
-        }
-    }
-
-    private static void addLeftTupleSink(InternalRuleBase ruleBase,
-                                        LeftTupleSink sink,
-                                        Map<Integer, BaseNode> nodes) {
-        if ( sink instanceof LeftTupleSource ) {
-            nodes.put( sink.getId(),
-                       (LeftTupleSource) sink );            
-            for ( LeftTupleSink leftTupleSink : ((LeftTupleSource) sink).getSinkPropagator().getSinks() ) {                
-                addLeftTupleSink( ruleBase,
-                                  leftTupleSink,
-                                  nodes );
-            }
-        } else if ( sink instanceof ObjectSource ) { 
-            // it may be a RIAN
-            nodes.put( sink.getId(), 
-                       (ObjectSource) sink );
-            for ( ObjectSink objectSink : ((ObjectSource)sink).getSinkPropagator().getSinks() ) {
-                addObjectSink( ruleBase,
-                               objectSink,
-                               nodes );
-            }
-        } else if ( sink instanceof RuleTerminalNode ) {
-            nodes.put( sink.getId(),
-                       (RuleTerminalNode) sink );
-        }
-    }
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/RuleFlowProcessInstanceMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/RuleFlowProcessInstanceMarshaller.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/RuleFlowProcessInstanceMarshaller.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,85 +0,0 @@
-package org.drools.marshalling;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-
-import org.drools.common.InternalRuleBase;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.process.core.context.swimlane.SwimlaneContext;
-import org.drools.process.core.context.variable.VariableScope;
-import org.drools.process.instance.context.swimlane.SwimlaneContextInstance;
-import org.drools.process.instance.context.variable.VariableScopeInstance;
-import org.drools.ruleflow.instance.RuleFlowProcessInstance;
-import org.drools.runtime.process.NodeInstance;
-import org.drools.runtime.process.ProcessInstance;
-import org.drools.workflow.instance.impl.NodeInstanceImpl;
-
-/**
- * Marshaller class for RuleFlowProcessInstances
- * 
- * @author mfossati
- */
-
-public class RuleFlowProcessInstanceMarshaller extends
-		AbstractProcessInstanceMarshaller {
-
-	public static RuleFlowProcessInstanceMarshaller INSTANCE = new RuleFlowProcessInstanceMarshaller();
-
-	private RuleFlowProcessInstanceMarshaller() {
-	}
-
-	public ProcessInstance readProcessInstance(MarshallerReaderContext context)
-			throws IOException {
-		ObjectInputStream stream = context.stream;
-		InternalRuleBase ruleBase = context.ruleBase;
-		InternalWorkingMemory wm = context.wm;
-
-		RuleFlowProcessInstance processInstance = new RuleFlowProcessInstance();
-		processInstance.setId(stream.readLong());
-		String processId = stream.readUTF();
-		processInstance.setProcessId(processId);
-		if (ruleBase != null) {
-			processInstance.setProcess(ruleBase.getProcess(processId));
-		}
-		processInstance.setState(stream.readInt());
-		long nodeInstanceCounter = stream.readLong();
-		processInstance.setWorkingMemory(wm);
-
-		int nbVariables = stream.readInt();
-		if (nbVariables > 0) {
-			VariableScopeInstance variableScopeInstance = (VariableScopeInstance) processInstance
-					.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);
-				}
-			}
-		}
-
-		int nbSwimlanes = stream.readInt();
-		if (nbSwimlanes > 0) {
-			SwimlaneContextInstance swimlaneContextInstance = (SwimlaneContextInstance) processInstance
-					.getContextInstance(SwimlaneContext.SWIMLANE_SCOPE);
-			for (int i = 0; i < nbSwimlanes; i++) {
-				String name = stream.readUTF();
-				String value = stream.readUTF();
-				swimlaneContextInstance.setActorId(name, value);
-			}
-		}
-
-		while (stream.readShort() == PersisterEnums.NODE_INSTANCE) {
-			readNodeInstance(context, processInstance, processInstance);
-		}
-
-		processInstance.internalSetNodeInstanceCounter(nodeInstanceCounter);
-		if (wm != null) {
-			processInstance.reconnect();
-		}
-		return processInstance;
-	}
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/SerializablePlaceholder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/SerializablePlaceholder.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/SerializablePlaceholder.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,14 +0,0 @@
-package org.drools.marshalling;
-
-public class SerializablePlaceholder implements ObjectPlaceholder {
-    private final Object object;
-    
-    public SerializablePlaceholder(Object object) {
-        this.object = object;
-    }
-    
-    public Object resolveObject() {
-        return object;
-    }
-
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/SerializablePlaceholderResolverStrategy.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/SerializablePlaceholderResolverStrategy.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/SerializablePlaceholderResolverStrategy.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,41 +0,0 @@
-package org.drools.marshalling;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-
-public class SerializablePlaceholderResolverStrategy
-    implements
-    PlaceholderResolverStrategy {
-
-    private int index;
-    
-    private PlaceholderResolverStrategyAcceptor acceptor;
-    
-    public SerializablePlaceholderResolverStrategy(PlaceholderResolverStrategyAcceptor acceptor) {
-        this.acceptor = acceptor;
-    }
-    
-    public int getIndex() {
-        return this.index;
-    }
-
-    public void setIndex(int index) {
-        this.index = index;
-    }    
-
-    public ObjectPlaceholder read(ObjectInputStream os) throws IOException,
-                                                       ClassNotFoundException {
-        return new SerializablePlaceholder( os.readObject() );
-    }
-
-    public void write(ObjectOutputStream os,
-                      Object object) throws IOException {
-        os.writeObject( object );
-    }
-
-    public boolean accept(Object object) {
-        return acceptor.accept( object );
-    }
-
-}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/AbstractProcessInstanceMarshaller.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/AbstractProcessInstanceMarshaller.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/AbstractProcessInstanceMarshaller.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/AbstractProcessInstanceMarshaller.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,344 @@
+package org.drools.marshalling.impl;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.common.InternalRuleBase;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.process.core.context.swimlane.SwimlaneContext;
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.instance.context.swimlane.SwimlaneContextInstance;
+import org.drools.process.instance.context.variable.VariableScopeInstance;
+import org.drools.process.instance.impl.ProcessInstanceImpl;
+import org.drools.ruleflow.instance.RuleFlowProcessInstance;
+import org.drools.runtime.process.NodeInstance;
+import org.drools.runtime.process.NodeInstanceContainer;
+import org.drools.runtime.process.ProcessInstance;
+import org.drools.workflow.instance.WorkflowProcessInstance;
+import org.drools.workflow.instance.impl.NodeInstanceImpl;
+import org.drools.workflow.instance.impl.WorkflowProcessInstanceImpl;
+import org.drools.workflow.instance.node.CompositeContextNodeInstance;
+import org.drools.workflow.instance.node.ForEachNodeInstance;
+import org.drools.workflow.instance.node.HumanTaskNodeInstance;
+import org.drools.workflow.instance.node.JoinInstance;
+import org.drools.workflow.instance.node.MilestoneNodeInstance;
+import org.drools.workflow.instance.node.RuleSetNodeInstance;
+import org.drools.workflow.instance.node.SubProcessNodeInstance;
+import org.drools.workflow.instance.node.TimerNodeInstance;
+import org.drools.workflow.instance.node.WorkItemNodeInstance;
+
+/* Author: mfossati, salaboy */
+public abstract class AbstractProcessInstanceMarshaller implements
+		ProcessInstanceMarshaller {
+
+	// Output methods
+
+	public void writeProcessInstance(MarshallerWriteContext context,
+			ProcessInstance processInstance) throws IOException {
+
+		WorkflowProcessInstanceImpl workFlow = (WorkflowProcessInstanceImpl) processInstance;
+		ObjectOutputStream stream = context.stream;
+		stream.writeLong(workFlow.getId());
+		stream.writeUTF(workFlow.getProcessId());
+		stream.writeInt(workFlow.getState());
+		stream.writeLong(workFlow.getNodeInstanceCounter());
+		
+		VariableScopeInstance variableScopeInstance = (VariableScopeInstance) workFlow.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 );
+                              }
+                          } );
+        stream.writeInt( keys.size() );
+        for ( String key : keys ) {
+            stream.writeUTF( key );
+            stream.writeObject( variables.get( key ) );
+        }
+
+        SwimlaneContextInstance swimlaneContextInstance = (SwimlaneContextInstance) workFlow.getContextInstance( SwimlaneContext.SWIMLANE_SCOPE );
+        
+        if (swimlaneContextInstance!=null) {
+			Map<String, String> swimlaneActors = swimlaneContextInstance
+					.getSwimlaneActors();
+			stream.writeInt(swimlaneActors.size());
+			for (Map.Entry<String, String> entry : swimlaneActors.entrySet()) {
+				stream.writeUTF(entry.getKey());
+				stream.writeUTF(entry.getValue());
+			}
+		}
+		List<NodeInstance> nodeInstances = new ArrayList<NodeInstance>( workFlow.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,
+                               nodeInstance );
+        }
+        stream.writeShort( PersisterEnums.END );
+	}
+
+	public void writeNodeInstance(MarshallerWriteContext context,
+			NodeInstance nodeInstance) throws IOException {
+		ObjectOutputStream stream = context.stream;
+		stream.writeLong(nodeInstance.getId());
+		stream.writeLong(nodeInstance.getNodeId());
+		writeNodeInstanceContent(stream, nodeInstance, context);
+	}
+
+	protected void writeNodeInstanceContent(ObjectOutputStream stream,
+			NodeInstance nodeInstance, MarshallerWriteContext context)
+			throws IOException {
+		 if ( nodeInstance instanceof RuleSetNodeInstance ) {
+	            stream.writeShort( PersisterEnums.RULE_SET_NODE_INSTANCE );
+	        } else if ( nodeInstance instanceof HumanTaskNodeInstance ) {
+	            stream.writeShort( PersisterEnums.HUMAN_TASK_NODE_INSTANCE );
+	            stream.writeLong( ((HumanTaskNodeInstance) nodeInstance).getWorkItem().getId() );
+	        } else if ( nodeInstance instanceof WorkItemNodeInstance ) {
+	            stream.writeShort( PersisterEnums.WORK_ITEM_NODE_INSTANCE );
+	            stream.writeLong( ((WorkItemNodeInstance) nodeInstance).getWorkItem().getId() );
+	        } else if ( nodeInstance instanceof SubProcessNodeInstance ) {
+	            stream.writeShort( PersisterEnums.SUB_PROCESS_NODE_INSTANCE );
+	            stream.writeLong( ((SubProcessNodeInstance) nodeInstance).getProcessInstanceId() );
+	        } else if ( nodeInstance instanceof MilestoneNodeInstance ) {
+	            stream.writeShort( PersisterEnums.MILESTONE_NODE_INSTANCE );
+	            List<Long> timerInstances = 
+	            	((MilestoneNodeInstance) nodeInstance).getTimerInstances();
+	            if (timerInstances != null) {
+	            	stream.writeInt(timerInstances.size());
+	            	for (Long id: timerInstances) {
+	            		stream.writeLong(id);
+	            	}
+	            } else {
+	            	stream.writeInt(0);
+	            }
+	        } else if ( nodeInstance instanceof TimerNodeInstance ) {
+	            stream.writeShort( PersisterEnums.TIMER_NODE_INSTANCE );
+	            stream.writeLong( ((TimerNodeInstance) nodeInstance).getTimerId() );
+	        } else if ( nodeInstance instanceof JoinInstance ) {
+	            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 );
+	                                  }
+	                              } );
+	            for ( Long key : keys ) {
+	                stream.writeLong( 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 );
+	            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 );
+	                                  }
+	                              } );
+	            stream.writeInt( keys.size() );
+	            for ( String key : keys ) {
+	                stream.writeUTF( 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());
+	                                  }
+	                              } );
+	            for ( NodeInstance subNodeInstance : nodeInstances ) {
+	                stream.writeShort( PersisterEnums.NODE_INSTANCE );
+	                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());
+	                                  }
+	                              } );
+	            for ( NodeInstance subNodeInstance : nodeInstances ) {
+	                if ( subNodeInstance instanceof CompositeContextNodeInstance ) {
+	                    stream.writeShort( PersisterEnums.NODE_INSTANCE );
+	                    writeNodeInstance( context,
+	                                       subNodeInstance );
+	                }
+	            }
+	            stream.writeShort( PersisterEnums.END );
+	        } else {
+	            // TODO ForEachNodeInstance
+	            // TODO timer manager
+	            throw new IllegalArgumentException( "Unknown node instance type: " + nodeInstance );
+	        }
+	}
+
+	// Input methods
+
+	public ProcessInstance readProcessInstance(MarshallerReaderContext context)
+			throws IOException {
+		ObjectInputStream stream = context.stream;
+        InternalRuleBase ruleBase = context.ruleBase;
+        InternalWorkingMemory wm = context.wm;
+
+        RuleFlowProcessInstance processInstance = new RuleFlowProcessInstance();
+        processInstance.setId( stream.readLong() );
+        String processId = stream.readUTF();
+        processInstance.setProcessId( processId );
+        if ( ruleBase != null ) {
+            processInstance.setProcess( ruleBase.getProcess( processId ) );
+        }
+        processInstance.setState( stream.readInt() );
+        long nodeInstanceCounter = stream.readLong();
+        processInstance.setWorkingMemory( wm );
+
+        int nbVariables = stream.readInt();
+        if ( nbVariables > 0 ) {
+            VariableScopeInstance variableScopeInstance = (VariableScopeInstance) processInstance.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 );
+                }
+            }
+        }
+
+        int nbSwimlanes = stream.readInt();
+        if ( nbSwimlanes > 0 ) {
+            SwimlaneContextInstance swimlaneContextInstance = (SwimlaneContextInstance) processInstance.getContextInstance( SwimlaneContext.SWIMLANE_SCOPE );
+            for ( int i = 0; i < nbSwimlanes; i++ ) {
+                String name = stream.readUTF();
+                String value = stream.readUTF();
+                swimlaneContextInstance.setActorId( name,
+                                                    value );
+            }
+        }
+
+        while ( stream.readShort() == PersisterEnums.NODE_INSTANCE ) {
+            readNodeInstance( context,
+                              processInstance,
+                              processInstance );
+        }
+
+        processInstance.internalSetNodeInstanceCounter( nodeInstanceCounter );
+        if ( wm != null ) {
+            processInstance.reconnect();
+        }
+        return processInstance;
+	}
+
+	public NodeInstance readNodeInstance(MarshallerReaderContext context,
+			NodeInstanceContainer nodeInstanceContainer,
+			WorkflowProcessInstance processInstance) throws IOException {
+		ObjectInputStream stream = context.stream;
+		long id = stream.readLong();
+		long nodeId = stream.readLong();
+		int nodeType = stream.readShort();
+		NodeInstanceImpl nodeInstance = readNodeInstanceContent(nodeType,
+				stream, context, processInstance);
+
+		nodeInstance.setNodeId(nodeId);
+		nodeInstance.setNodeInstanceContainer(nodeInstanceContainer);
+		nodeInstance.setProcessInstance(processInstance);
+		nodeInstance.setId(id);
+
+		return nodeInstance;
+	}
+
+	protected NodeInstanceImpl readNodeInstanceContent(int nodeType,
+			ObjectInputStream stream, MarshallerReaderContext context,
+			WorkflowProcessInstance processInstance) throws IOException {
+		NodeInstanceImpl nodeInstance = null;
+		switch ( nodeType ) {
+        case PersisterEnums.RULE_SET_NODE_INSTANCE :
+            nodeInstance = new RuleSetNodeInstance();
+            break;
+        case PersisterEnums.HUMAN_TASK_NODE_INSTANCE :
+            nodeInstance = new HumanTaskNodeInstance();
+            ((HumanTaskNodeInstance) nodeInstance).internalSetWorkItemId( stream.readLong() );
+            break;
+        case PersisterEnums.WORK_ITEM_NODE_INSTANCE :
+            nodeInstance = new WorkItemNodeInstance();
+            ((WorkItemNodeInstance) nodeInstance).internalSetWorkItemId( stream.readLong() );
+            break;
+        case PersisterEnums.SUB_PROCESS_NODE_INSTANCE :
+            nodeInstance = new SubProcessNodeInstance();
+            ((SubProcessNodeInstance) nodeInstance).internalSetProcessInstanceId( stream.readLong() );
+            break;
+        case PersisterEnums.MILESTONE_NODE_INSTANCE :
+            nodeInstance = new MilestoneNodeInstance();
+            int nbTimerInstances = stream.readInt();
+            if (nbTimerInstances > 0) {
+            	List<Long> timerInstances = new ArrayList<Long>();
+            	for (int i = 0; i < nbTimerInstances; i++) {
+            		timerInstances.add(stream.readLong());
+            	}
+            	((MilestoneNodeInstance) nodeInstance).internalSetTimerInstances(timerInstances);
+            }
+            break;
+        case PersisterEnums.TIMER_NODE_INSTANCE :
+            nodeInstance = new TimerNodeInstance();
+            ((TimerNodeInstance) nodeInstance).internalSetTimerId( stream.readLong() );
+            break;
+        case PersisterEnums.JOIN_NODE_INSTANCE :
+            nodeInstance = new JoinInstance();
+            int number = stream.readInt();
+            if ( number > 0 ) {
+                Map<Long, Integer> triggers = new HashMap<Long, Integer>();
+                for ( int i = 0; i < number; i++ ) {
+                    long l = stream.readLong();
+                    int count = stream.readInt();
+                    triggers.put( l,
+                                  count );
+                }
+                ((JoinInstance) nodeInstance).internalSetTriggers( triggers );
+            }
+            break;
+        case PersisterEnums.COMPOSITE_NODE_INSTANCE :
+            nodeInstance = new CompositeContextNodeInstance();
+            break;
+        case PersisterEnums.FOR_EACH_NODE_INSTANCE :
+            nodeInstance = new ForEachNodeInstance();
+            break;
+        default :
+            throw new IllegalArgumentException( "Unknown node type: " + nodeType );
+		}
+		return nodeInstance;
+
+	}
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/AbstractProcessInstanceMarshaller.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ClassObjectMarshallingStrategyAcceptor.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/ClassPlaceholderResolverStrategyAcceptor.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ClassObjectMarshallingStrategyAcceptor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ClassObjectMarshallingStrategyAcceptor.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,34 @@
+package org.drools.marshalling.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.marshalling.ObjectMarshallingStrategyAcceptor;
+import org.drools.util.ClassUtils;
+
+public class ClassObjectMarshallingStrategyAcceptor implements ObjectMarshallingStrategyAcceptor {
+    public static final ClassObjectMarshallingStrategyAcceptor DEFAULT = new ClassObjectMarshallingStrategyAcceptor(new String[] { "*.*" } );
+    
+    private final Map<String, Object> patterns;
+    
+    public ClassObjectMarshallingStrategyAcceptor(String[] patterns) {
+        this.patterns = new HashMap<String, Object>();
+        for (String pattern : patterns ) {
+            addPattern( pattern );
+        }
+    }
+    
+    public ClassObjectMarshallingStrategyAcceptor() {
+        this.patterns = new HashMap<String, Object>();
+    }
+    
+    private void addPattern(String pattern) {
+        
+        ClassUtils.addImportStylePatterns( this.patterns, pattern );
+    }
+
+    public boolean accept(Object object) {
+        return ClassUtils.isMatched( this.patterns, object.getClass().getName() );
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ClassObjectMarshallingStrategyAcceptor.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/DefaultMarshaller.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/DefaultMarshaller.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/DefaultMarshaller.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/DefaultMarshaller.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,121 @@
+package org.drools.marshalling.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.RuleBaseConfiguration;
+import org.drools.SessionConfiguration;
+import org.drools.StatefulSession;
+import org.drools.common.InternalRuleBase;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.concurrent.CommandExecutor;
+import org.drools.concurrent.ExecutorService;
+import org.drools.impl.KnowledgeBaseImpl;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
+import org.drools.marshalling.Marshaller;
+import org.drools.reteoo.ReteooRuleBase;
+import org.drools.reteoo.ReteooStatefulSession;
+import org.drools.runtime.Environment;
+import org.drools.runtime.KnowledgeSessionConfiguration;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.spi.ExecutorServiceFactory;
+import org.drools.spi.GlobalResolver;
+
+public class DefaultMarshaller
+    implements
+    Marshaller {
+    KnowledgeBase                  kbase;
+    GlobalResolver                 globalResolver;
+    RuleBaseConfiguration          ruleBaseConfig;
+    MarshallingConfiguration       marshallingConfig;
+    ObjectMarshallingStrategyStore strategyStore;
+
+    public DefaultMarshaller(KnowledgeBase kbase,
+                             MarshallingConfiguration marshallingConfig) {
+        this.kbase = kbase;
+        this.ruleBaseConfig = (ruleBaseConfig != null) ? ruleBaseConfig : new RuleBaseConfiguration();
+        this.marshallingConfig = marshallingConfig;
+        this.strategyStore = this.marshallingConfig.getObjectMarshallingStrategyStore();
+    }
+
+    
+    public StatefulKnowledgeSession unmarshall(final InputStream stream) throws IOException,
+                                                                             ClassNotFoundException {
+        return unmarshall( stream, null, null );
+    }
+    /* (non-Javadoc)
+     * @see org.drools.marshalling.Marshaller#read(java.io.InputStream, org.drools.common.InternalRuleBase, int, org.drools.concurrent.ExecutorService)
+     */
+    public StatefulKnowledgeSession unmarshall(final InputStream stream,
+                                               KnowledgeSessionConfiguration config,
+                                               Environment environment) throws IOException,
+                                                                             ClassNotFoundException {
+        if ( config == null ) {
+            config = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
+        }
+        
+        if ( environment == null ) {
+            environment = KnowledgeBaseFactory.newEnvironment();
+        }
+        
+        MarshallerReaderContext context = new MarshallerReaderContext( stream,
+                                                                       (InternalRuleBase) ((KnowledgeBaseImpl) kbase).ruleBase,
+                                                                       RuleBaseNodes.getNodeMap( (InternalRuleBase) ((KnowledgeBaseImpl) kbase).ruleBase ),
+                                                                       this.strategyStore,
+                                                                       this.marshallingConfig.isMarshallProcessInstances(),
+                                                                       this.marshallingConfig.isMarshallWorkItems() );
+
+        int id = ((ReteooRuleBase) ((KnowledgeBaseImpl) this.kbase).ruleBase).nextWorkingMemoryCounter();
+        RuleBaseConfiguration conf = ((ReteooRuleBase) ((KnowledgeBaseImpl) this.kbase).ruleBase).getConfiguration();
+        ExecutorService executor = ExecutorServiceFactory.createExecutorService( conf.getExecutorService() );
+
+        ReteooStatefulSession session = InputMarshaller.readSession( context,
+                                                                     id,
+                                                                     executor,
+                                                                     environment,
+                                                                     (SessionConfiguration) config );
+        executor.setCommandExecutor( new CommandExecutor( session ) );
+        context.close();
+        if ( ((SessionConfiguration) config).isKeepReference() ) {
+            ((ReteooRuleBase)((KnowledgeBaseImpl)this.kbase).ruleBase).addStatefulSession( session );
+        }
+        return new StatefulKnowledgeSessionImpl( session );
+
+    }
+
+    public void unmarshall(final InputStream stream,
+                           final StatefulKnowledgeSession ksession) throws IOException,
+                                                                  ClassNotFoundException {
+        MarshallerReaderContext context = new MarshallerReaderContext( stream,
+                                                                       (InternalRuleBase) ((KnowledgeBaseImpl) kbase).ruleBase,
+                                                                       RuleBaseNodes.getNodeMap( (InternalRuleBase) ((KnowledgeBaseImpl) kbase).ruleBase ),
+                                                                       this.strategyStore,
+                                                                       this.marshallingConfig.isMarshallProcessInstances(),
+                                                                       marshallingConfig.isMarshallWorkItems() );
+
+        InputMarshaller.readSession( (ReteooStatefulSession) ((StatefulKnowledgeSessionImpl)ksession).session,
+                                     context );
+        context.close();
+
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.marshalling.Marshaller#write(java.io.OutputStream, org.drools.common.InternalRuleBase, org.drools.StatefulSession)
+     */
+    public void marshall(final OutputStream stream,
+                         final StatefulKnowledgeSession session) throws IOException {
+        MarshallerWriteContext context = new MarshallerWriteContext( stream,
+                                                                     (InternalRuleBase) ((KnowledgeBaseImpl) kbase).ruleBase,
+                                                                     (InternalWorkingMemory) ((StatefulKnowledgeSessionImpl) session).session,
+                                                                     RuleBaseNodes.getNodeMap( (InternalRuleBase) ((KnowledgeBaseImpl) kbase).ruleBase ),
+                                                                     this.strategyStore,
+                                                                     this.marshallingConfig.isMarshallProcessInstances(),
+                                                                     this.marshallingConfig.isMarshallWorkItems() );
+        OutputMarshaller.writeSession( context );
+        context.close();
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/DefaultMarshaller.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/IdentityPlaceholderResolverStrategy.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/IdentityPlaceholderResolverStrategy.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/IdentityPlaceholderResolverStrategy.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/IdentityPlaceholderResolverStrategy.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,48 @@
+package org.drools.marshalling.impl;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.HashMap;
+import java.util.IdentityHashMap;
+import java.util.Map;
+
+import org.drools.marshalling.ObjectMarshallingStrategy;
+import org.drools.marshalling.ObjectMarshallingStrategyAcceptor;
+
+public class IdentityPlaceholderResolverStrategy
+    implements
+    ObjectMarshallingStrategy {
+    
+    private Map<Integer, Object> ids;
+    private Map<Object, Integer> objects;
+
+    private ObjectMarshallingStrategyAcceptor acceptor;
+    
+    public IdentityPlaceholderResolverStrategy(ObjectMarshallingStrategyAcceptor acceptor) {
+        this.acceptor = acceptor;
+        this.ids = new HashMap<Integer, Object>();
+        this.objects = new IdentityHashMap<Object, Integer>();
+    }  
+
+    public Object read(ObjectInputStream os) throws IOException,
+                                                       ClassNotFoundException {
+        int id = os.readInt();
+        return  ids.get( id );
+    }
+
+    public void write(ObjectOutputStream os,
+                      Object object) throws IOException {
+        Integer id = ( Integer ) objects.get( object );
+        if ( id == null ) {
+            id = ids.size();
+            ids.put( id, object );
+            objects.put(  object, id );
+        }
+        os.writeInt( id );
+    }
+
+    public boolean accept(Object object) {
+        return this.acceptor.accept( object );
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/IdentityPlaceholderResolverStrategy.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/InputMarshaller.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/InputMarshaller.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/InputMarshaller.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,1020 @@
+package org.drools.marshalling.impl;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+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;
+import org.drools.common.BaseNode;
+import org.drools.common.BinaryHeapQueueAgendaGroup;
+import org.drools.common.DefaultAgenda;
+import org.drools.common.DefaultFactHandle;
+import org.drools.common.EqualityKey;
+import org.drools.common.InternalAgendaGroup;
+import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalRuleBase;
+import org.drools.common.InternalRuleFlowGroup;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.common.NodeMemory;
+import org.drools.common.PropagationContextImpl;
+import org.drools.common.RuleFlowGroupImpl;
+import org.drools.common.TruthMaintenanceSystem;
+import org.drools.concurrent.ExecutorService;
+import org.drools.impl.EnvironmentFactory;
+import org.drools.marshalling.ObjectMarshallingStrategy;
+import org.drools.process.core.context.swimlane.SwimlaneContext;
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.instance.ProcessInstance;
+import org.drools.process.instance.WorkItem;
+import org.drools.process.instance.WorkItemManager;
+import org.drools.process.instance.context.swimlane.SwimlaneContextInstance;
+import org.drools.process.instance.context.variable.VariableScopeInstance;
+import org.drools.process.instance.impl.WorkItemImpl;
+import org.drools.process.instance.timer.TimerInstance;
+import org.drools.process.instance.timer.TimerManager;
+import org.drools.reteoo.BetaMemory;
+import org.drools.reteoo.BetaNode;
+import org.drools.reteoo.EntryPointNode;
+import org.drools.reteoo.EvalConditionNode;
+import org.drools.reteoo.InitialFactHandle;
+import org.drools.reteoo.InitialFactHandleDummyObject;
+import org.drools.reteoo.LeftTuple;
+import org.drools.reteoo.LeftTupleSink;
+import org.drools.reteoo.NodeTypeEnums;
+import org.drools.reteoo.ObjectTypeNode;
+import org.drools.reteoo.ReteooStatefulSession;
+import org.drools.reteoo.ReteooWorkingMemory;
+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.CollectNode.CollectContext;
+import org.drools.reteoo.CollectNode.CollectMemory;
+import org.drools.reteoo.EvalConditionNode.EvalMemory;
+import org.drools.reteoo.RuleTerminalNode.TerminalNodeMemory;
+import org.drools.rule.EntryPoint;
+import org.drools.rule.GroupElement;
+import org.drools.rule.Package;
+import org.drools.rule.Rule;
+import org.drools.ruleflow.instance.RuleFlowProcessInstance;
+import org.drools.runtime.Environment;
+import org.drools.runtime.process.NodeInstance;
+import org.drools.runtime.process.NodeInstanceContainer;
+import org.drools.spi.Activation;
+import org.drools.spi.AgendaGroup;
+import org.drools.spi.FactHandleFactory;
+import org.drools.spi.ObjectType;
+import org.drools.spi.PropagationContext;
+import org.drools.spi.RuleFlowGroup;
+import org.drools.util.ObjectHashMap;
+import org.drools.util.ObjectHashSet;
+import org.drools.workflow.instance.impl.NodeInstanceImpl;
+import org.drools.workflow.instance.node.CompositeContextNodeInstance;
+import org.drools.workflow.instance.node.ForEachNodeInstance;
+import org.drools.workflow.instance.node.HumanTaskNodeInstance;
+import org.drools.workflow.instance.node.JoinInstance;
+import org.drools.workflow.instance.node.MilestoneNodeInstance;
+import org.drools.workflow.instance.node.RuleSetNodeInstance;
+import org.drools.workflow.instance.node.SubProcessNodeInstance;
+import org.drools.workflow.instance.node.TimerNodeInstance;
+import org.drools.workflow.instance.node.WorkItemNodeInstance;
+
+public class InputMarshaller {
+    /**
+     * Stream the data into an existing session
+     * 
+     * @param session
+     * @param context
+     * @param id
+     * @param executor
+     * @return
+     * @throws IOException
+     * @throws ClassNotFoundException
+     */
+    public static ReteooStatefulSession readSession(ReteooStatefulSession session,
+                                                    MarshallerReaderContext context) throws IOException,
+                                                                                    ClassNotFoundException {
+        boolean multithread = context.readBoolean();
+        int handleId = context.readInt();
+        long handleCounter = 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();
+
+        readAgenda( context,
+                    agenda );
+
+        context.wm = session;
+
+        readFactHandles( context );
+
+        readActionQueue( context );
+
+        if ( context.readBoolean() ) {
+            readTruthMaintenanceSystem( context );
+        }
+
+        if ( context.marshalProcessInstances ) {
+            readProcessInstances( context );
+        }
+
+        if ( context.marshalWorkItems ) {
+            readWorkItems( context );
+        }
+
+        readTimers( context );
+        
+        if( multithread ) {
+            session.startPartitionManagers();
+        }
+
+        return session;
+    }
+
+    /**
+     * Create a new session into which to read the stream data
+     * @param context
+     * @param id
+     * @param executor
+     * @return
+     * @throws IOException
+     * @throws ClassNotFoundException
+     */
+    public static ReteooStatefulSession readSession(MarshallerReaderContext context,
+                                                    int id,
+                                                    ExecutorService executor) throws IOException,
+                                                                             ClassNotFoundException {
+        return readSession( context, id, executor, EnvironmentFactory.newEnvironment(), new SessionConfiguration() );
+    }
+    
+    public static ReteooStatefulSession readSession(MarshallerReaderContext context,
+                                                    int id,
+                                                    ExecutorService executor,
+                                                    Environment environment,
+                                                    SessionConfiguration config) throws IOException,
+                                                                             ClassNotFoundException {
+
+        boolean multithread = context.readBoolean();
+        
+        FactHandleFactory handleFactory = context.ruleBase.newFactHandleFactory( context.readInt(),
+                                                                                 context.readLong() );
+
+        InitialFactHandle initialFactHandle = new InitialFactHandle( new DefaultFactHandle( context.readInt(), //id
+                                                                                            new InitialFactHandleDummyObject(),
+                                                                                            context.readLong() ) ); //recency        
+        context.handles.put( initialFactHandle.getId(),
+                             initialFactHandle );
+
+        long propagationCounter = context.readLong();
+
+        DefaultAgenda agenda = new DefaultAgenda( context.ruleBase,
+                                                  false );
+        readAgenda( context,
+                    agenda );
+        ReteooStatefulSession session = new ReteooStatefulSession( id,
+                                                                   context.ruleBase,
+                                                                   executor,
+                                                                   handleFactory,
+                                                                   initialFactHandle,
+                                                                   propagationCounter,
+                                                                   config,  
+                                                                   agenda,
+                                                                   environment );
+
+        // RuleFlowGroups need to reference the session
+        for ( RuleFlowGroup group : agenda.getRuleFlowGroupsMap().values() ) {
+            ((RuleFlowGroupImpl) group).setWorkingMemory( session );
+        }
+        context.wm = session;
+
+        readFactHandles( context );
+
+        readActionQueue( context );
+
+        if ( context.readBoolean() ) {
+            readTruthMaintenanceSystem( context );
+        }
+
+        if ( context.marshalProcessInstances ) {
+            readProcessInstances( context );
+        }
+
+        if ( context.marshalWorkItems ) {
+            readWorkItems( context );
+        }
+
+        readTimers( context );
+
+        if( multithread ) {
+            session.startPartitionManagers();
+        }
+
+        return session;
+    }    
+
+    public static void readAgenda(MarshallerReaderContext context,
+                                  DefaultAgenda agenda) throws IOException {
+        ObjectInputStream stream = context.stream;
+        while ( stream.readShort() == PersisterEnums.AGENDA_GROUP ) {
+            BinaryHeapQueueAgendaGroup group = new BinaryHeapQueueAgendaGroup( stream.readUTF(),
+                                                                               context.ruleBase );
+            group.setActive( stream.readBoolean() );
+            agenda.getAgendaGroupsMap().put( group.getName(),
+                                             group );
+        }
+
+        while ( stream.readShort() == PersisterEnums.AGENDA_GROUP ) {
+            String agendaGroupName = stream.readUTF();
+            agenda.getStackList().add( agenda.getAgendaGroup( agendaGroupName ) );
+        }
+
+        while ( stream.readShort() == PersisterEnums.RULE_FLOW_GROUP ) {
+            String rfgName = stream.readUTF();
+            boolean active = stream.readBoolean();
+            boolean autoDeactivate = stream.readBoolean();
+            RuleFlowGroup rfg = new RuleFlowGroupImpl( rfgName,
+                                                       active,
+                                                       autoDeactivate );
+            agenda.getRuleFlowGroupsMap().put( rfgName,
+                                               rfg );
+        }
+
+    }
+
+    public static void readActionQueue(MarshallerReaderContext context) throws IOException, ClassNotFoundException {
+        ReteooWorkingMemory wm = (ReteooWorkingMemory) context.wm;
+        Queue actionQueue = wm.getActionQueue();
+        while ( context.readShort() == PersisterEnums.WORKING_MEMORY_ACTION ) {
+            actionQueue.offer( PersisterHelper.readWorkingMemoryAction( context ) );
+        }
+    }
+
+    public static void readTruthMaintenanceSystem(MarshallerReaderContext context) throws IOException {
+        ObjectInputStream stream = context.stream;
+
+        TruthMaintenanceSystem tms = context.wm.getTruthMaintenanceSystem();
+        while ( stream.readShort() == PersisterEnums.EQUALITY_KEY ) {
+            int status = stream.readInt();
+            int factHandleId = stream.readInt();
+            InternalFactHandle handle = (InternalFactHandle) context.handles.get( factHandleId );
+            EqualityKey key = new EqualityKey( handle,
+                                               status );
+            handle.setEqualityKey( key );
+            while ( stream.readShort() == PersisterEnums.FACT_HANDLE ) {
+                factHandleId = stream.readInt();
+                handle = (InternalFactHandle) context.handles.get( factHandleId );
+                key.addFactHandle( handle );
+                handle.setEqualityKey( key );
+            }
+            tms.put( key );
+        }
+    }
+
+    public static void readFactHandles(MarshallerReaderContext context) throws IOException,
+                                                                       ClassNotFoundException {
+        ObjectInputStream stream = context.stream;
+        InternalRuleBase ruleBase = context.ruleBase;
+        ObjectMarshallingStrategyStore resolverStrategyFactory = context.resolverStrategyFactory;
+        InternalWorkingMemory wm = context.wm;
+
+        if ( stream.readBoolean() ) {
+            InternalFactHandle initialFactHandle = wm.getInitialFactHandle();
+            int sinkId = stream.readInt();
+            ObjectTypeNode initialFactNode = (ObjectTypeNode) context.sinks.get( sinkId );
+            ObjectHashSet initialFactMemory = (ObjectHashSet) context.wm.getNodeMemory( initialFactNode );
+
+            initialFactMemory.add( initialFactHandle );
+            readRightTuples( initialFactHandle,
+                             context );
+        }
+
+        int size = stream.readInt();
+
+        // load the handles
+        InternalFactHandle[] handles = new InternalFactHandle[size];
+        for ( int i = 0; i < size; i++ ) {
+            InternalFactHandle handle = readFactHandle( context );
+
+            context.handles.put( handle.getId(),
+                                 handle );
+            handles[i] = handle;
+
+            context.wm.getObjectStore().addHandle( handle,
+                                                   handle.getObject() );
+
+            readRightTuples( handle,
+                             context );
+        }
+
+        EntryPointNode node = ruleBase.getRete().getEntryPointNode( EntryPoint.DEFAULT );
+        Map<ObjectType, ObjectTypeNode> objectTypeNodes = node.getObjectTypeNodes();
+
+        // add handles to object type nodes
+        for ( InternalFactHandle handle : handles ) {
+            Object object = handle.getObject();
+            ClassObjectType objectType = new ClassObjectType( object.getClass() );
+            ObjectTypeNode objectTypeNode = objectTypeNodes.get( objectType );
+            ObjectHashSet set = (ObjectHashSet) context.wm.getNodeMemory( objectTypeNode );
+            set.add( handle,
+                     false );
+        }
+
+        InternalFactHandle handle = wm.getInitialFactHandle();
+        while ( stream.readShort() == PersisterEnums.LEFT_TUPLE ) {
+            LeftTupleSink sink = (LeftTupleSink) context.sinks.get( stream.readInt() );
+            LeftTuple leftTuple = new LeftTuple( handle,
+                                                 sink,
+                                                 true );
+            readLeftTuple( leftTuple,
+                           context );
+        }
+
+        readLeftTuples( context );
+ 
+        readPropagationContexts( context );
+
+        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();
+        ObjectMarshallingStrategy strategy = context.resolverStrategyFactory.getStrategy( strategyIndex );
+        Object object = strategy.read( context.stream );
+
+        InternalFactHandle handle = new DefaultFactHandle( id,
+                                                           object,
+                                                           recency );
+        return handle;
+    }
+
+    public static void readRightTuples(InternalFactHandle factHandle,
+                                       MarshallerReaderContext context) throws IOException {
+        ObjectInputStream stream = context.stream;
+        while ( stream.readShort() == PersisterEnums.RIGHT_TUPLE ) {
+            readRightTuple( context,
+                            factHandle );
+        }
+    }
+
+    public static void readRightTuple(MarshallerReaderContext context,
+                                      InternalFactHandle factHandle) throws IOException {
+        ObjectInputStream stream = context.stream;
+
+        RightTupleSink sink = (RightTupleSink) context.sinks.get( stream.readInt() );
+
+        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;
+            }
+            case NodeTypeEnums.CollectNode : {
+                memory = ((CollectMemory) 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,
+                                                                      ClassNotFoundException {
+        ObjectInputStream stream = context.stream;
+
+        while ( stream.readShort() == PersisterEnums.LEFT_TUPLE ) {
+            LeftTupleSink sink = (LeftTupleSink) context.sinks.get( stream.readInt() );
+            int factHandleId = stream.readInt();
+            LeftTuple leftTuple = new LeftTuple( context.handles.get( factHandleId ),
+                                                 sink,
+                                                 true );
+            readLeftTuple( leftTuple,
+                           context );
+        }
+    }
+
+    public static void readLeftTuple(LeftTuple parentLeftTuple,
+                                     MarshallerReaderContext context) throws IOException,
+                                                                     ClassNotFoundException {
+        ObjectInputStream stream = context.stream;
+        InternalWorkingMemory wm = context.wm;
+        Map<Integer, BaseNode> sinks = context.sinks;
+
+        LeftTupleSink sink = parentLeftTuple.getLeftTupleSink();
+
+        switch ( sink.getType() ) {
+            case NodeTypeEnums.JoinNode : {
+                BetaMemory memory = (BetaMemory) context.wm.getNodeMemory( (BetaNode) sink );
+                memory.getLeftTupleMemory().add( parentLeftTuple );
+
+                while ( stream.readShort() == PersisterEnums.RIGHT_TUPLE ) {
+                    LeftTupleSink childSink = (LeftTupleSink) sinks.get( stream.readInt() );
+                    int factHandleId = stream.readInt();
+                    RightTupleKey key = new RightTupleKey( factHandleId,
+                                                           sink );
+                    RightTuple rightTuple = context.rightTuples.get( key );
+                    LeftTuple childLeftTuple = new LeftTuple( parentLeftTuple,
+                                                              rightTuple,
+                                                              childSink,
+                                                              true );
+                    readLeftTuple( childLeftTuple,
+                                   context );
+                }
+                break;
+
+            }
+            case NodeTypeEnums.EvalConditionNode : {
+                final EvalMemory memory = (EvalMemory) context.wm.getNodeMemory( (EvalConditionNode) sink );
+                memory.tupleMemory.add( parentLeftTuple );
+                while ( stream.readShort() == PersisterEnums.LEFT_TUPLE ) {
+                    LeftTupleSink childSink = (LeftTupleSink) sinks.get( stream.readInt() );
+                    LeftTuple childLeftTuple = new LeftTuple( parentLeftTuple,
+                                                              childSink,
+                                                              true );
+                    readLeftTuple( childLeftTuple,
+                                   context );
+                }
+                break;
+            }
+            case NodeTypeEnums.NotNode : {
+                BetaMemory memory = (BetaMemory) context.wm.getNodeMemory( (BetaNode) sink );
+                int type = stream.readShort();
+                if ( type == PersisterEnums.LEFT_TUPLE_NOT_BLOCKED ) {
+                    memory.getLeftTupleMemory().add( parentLeftTuple );
+
+                    while ( stream.readShort() == PersisterEnums.LEFT_TUPLE ) {
+                        LeftTupleSink childSink = (LeftTupleSink) sinks.get( stream.readInt() );
+                        LeftTuple childLeftTuple = new LeftTuple( parentLeftTuple,
+                                                                  childSink,
+                                                                  true );
+                        readLeftTuple( childLeftTuple,
+                                       context );
+                    }
+
+                } else {
+                    int factHandleId = stream.readInt();
+                    RightTupleKey key = new RightTupleKey( factHandleId,
+                                                           sink );
+                    RightTuple rightTuple = context.rightTuples.get( key );
+
+                    parentLeftTuple.setBlocker( rightTuple );
+                    rightTuple.setBlocked( parentLeftTuple );
+                }
+                break;
+            }
+            case NodeTypeEnums.ExistsNode : {
+                BetaMemory memory = (BetaMemory) context.wm.getNodeMemory( (BetaNode) sink );
+                int type = stream.readShort();
+                if ( type == PersisterEnums.LEFT_TUPLE_NOT_BLOCKED ) {
+                    memory.getLeftTupleMemory().add( parentLeftTuple );
+                } else {
+                    int factHandleId = stream.readInt();
+                    RightTupleKey key = new RightTupleKey( factHandleId,
+                                                           sink );
+                    RightTuple rightTuple = context.rightTuples.get( key );
+
+                    parentLeftTuple.setBlocker( rightTuple );
+                    rightTuple.setBlocked( parentLeftTuple );
+
+                    while ( stream.readShort() == PersisterEnums.LEFT_TUPLE ) {
+                        LeftTupleSink childSink = (LeftTupleSink) sinks.get( stream.readInt() );
+                        LeftTuple childLeftTuple = new LeftTuple( parentLeftTuple,
+                                                                  childSink,
+                                                                  true );
+                        readLeftTuple( childLeftTuple,
+                                       context );
+                    }
+                }
+                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.CollectNode : {
+                // accumulate nodes generate new facts on-demand and need special procedures when de-serializing from persistent storage
+                CollectMemory memory = (CollectMemory) context.wm.getNodeMemory( (BetaNode) sink );
+                memory.betaMemory.getLeftTupleMemory().add( parentLeftTuple );
+
+                CollectContext colctx = new CollectContext();
+                memory.betaMemory.getCreatedHandles().put( parentLeftTuple,
+                                                           colctx,
+                                                           false );
+                // first we de-serialize the generated fact handle
+                InternalFactHandle handle = readFactHandle( context );
+                colctx.resultTuple = new RightTuple( handle,
+                                                     (RightTupleSink) sink );
+
+                // then we de-serialize the boolean propagated flag
+                colctx.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,
+                                                                      colctx.resultTuple,
+                                                                      childSink,
+                                                                      true );
+                            readLeftTuple( childLeftTuple,
+                                           context );
+                            break;
+                        }
+                        default : {
+                            throw new RuntimeDroolsException( "Marshalling error. This is a bug. Please contact the development team." );
+                        }
+                    }
+                }
+                break;
+            }
+            case NodeTypeEnums.RightInputAdaterNode : {
+                // RIANs generate new fact handles on-demand to wrap tuples and need special procedures when de-serializing from persistent storage
+                ObjectHashMap memory = (ObjectHashMap) context.wm.getNodeMemory( (NodeMemory) sink );
+                // create fact handle
+                int id = stream.readInt();
+                long recency = stream.readLong();
+                InternalFactHandle handle = new DefaultFactHandle( id,
+                                                                   parentLeftTuple,
+                                                                   recency );
+                memory.put( parentLeftTuple, handle );
+                
+                readRightTuples( handle, context );
+                
+                stream.readShort(); // Persistence.END
+                break;
+            }
+            case NodeTypeEnums.RuleTerminalNode : {
+                RuleTerminalNode ruleTerminalNode = (RuleTerminalNode) sink;
+                TerminalNodeMemory memory = (TerminalNodeMemory) wm.getNodeMemory( ruleTerminalNode );
+                memory.getTupleMemory().add( parentLeftTuple );
+
+                int pos = context.terminalTupleMap.size();
+                context.terminalTupleMap.put( pos,
+                                              parentLeftTuple );
+                break;
+            }
+        }
+    }
+
+    public static void readActivations(MarshallerReaderContext context) throws IOException {
+        ObjectInputStream stream = context.stream;
+
+        while ( stream.readShort() == PersisterEnums.ACTIVATION ) {
+            readActivation( context );
+        }
+    }
+
+    public static Activation readActivation(MarshallerReaderContext context) throws IOException {
+        ObjectInputStream stream = context.stream;
+        InternalRuleBase ruleBase = context.ruleBase;
+        InternalWorkingMemory wm = context.wm;
+
+        long activationNumber = stream.readLong();
+
+        int pos = stream.readInt();
+        LeftTuple leftTuple = context.terminalTupleMap.get( pos );
+
+        int salience = stream.readInt();
+
+        //PropagationContext context,
+        String pkgName = stream.readUTF();
+        String ruleName = stream.readUTF();
+        Package pkg = ruleBase.getPackage( pkgName );
+        Rule rule = pkg.getRule( ruleName );
+
+        RuleTerminalNode ruleTerminalNode = (RuleTerminalNode) leftTuple.getLeftTupleSink();
+        GroupElement subRule = ruleTerminalNode.getSubRule();
+
+        PropagationContext pc = context.propagationContexts.get( stream.readLong() );
+
+        AgendaItem activation = new AgendaItem( activationNumber,
+                                                leftTuple,
+                                                salience,
+                                                pc,
+                                                rule,
+                                                subRule );
+
+        leftTuple.setActivation( activation );
+
+        if ( stream.readBoolean() ) {
+            String activationGroupName = stream.readUTF();
+            ((DefaultAgenda) wm.getAgenda()).getActivationGroup( activationGroupName ).addActivation( activation );
+        }
+
+        boolean activated = stream.readBoolean();
+        activation.setActivated( activated );
+
+        InternalAgendaGroup agendaGroup;
+        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 );
+        } else {
+            // AgendaGroup is defined, so try and get the AgendaGroup
+            // from the Agenda
+            agendaGroup = (InternalAgendaGroup) ((DefaultAgenda) wm.getAgenda()).getAgendaGroup( rule.getAgendaGroup() );
+        }
+
+        activation.setAgendaGroup( agendaGroup );
+
+        if ( activated ) {
+            if ( rule.getRuleFlowGroup() == null ) {
+                agendaGroup.add( activation );
+            } else {
+                InternalRuleFlowGroup rfg = (InternalRuleFlowGroup) ((DefaultAgenda) wm.getAgenda()).getRuleFlowGroup( rule.getRuleFlowGroup() );
+                rfg.addActivation( activation );
+            }
+        }
+
+        TruthMaintenanceSystem tms = context.wm.getTruthMaintenanceSystem();
+        while ( stream.readShort() == PersisterEnums.LOGICAL_DEPENDENCY ) {
+            int factHandleId = stream.readInt();
+            InternalFactHandle handle = (InternalFactHandle) context.handles.get( factHandleId );
+            tms.addLogicalDependency( handle,
+                                      activation,
+                                      pc,
+                                      rule );
+        }
+
+        return activation;
+    }
+
+    public static void readPropagationContexts(MarshallerReaderContext context) throws IOException {
+        ObjectInputStream stream = context.stream;
+
+        while ( stream.readShort() == PersisterEnums.PROPAGATION_CONTEXT ) {
+            readPropagationContext( context );
+        }
+
+    }
+
+    public static void readPropagationContext(MarshallerReaderContext context) throws IOException {
+        ObjectInputStream stream = context.stream;
+        InternalRuleBase ruleBase = context.ruleBase;
+
+        int type = stream.readInt();
+
+        Rule rule = null;
+        if ( stream.readBoolean() ) {
+            String pkgName = stream.readUTF();
+            String ruleName = stream.readUTF();
+            Package pkg = ruleBase.getPackage( pkgName );
+            rule = pkg.getRule( ruleName );
+        }
+
+        LeftTuple leftTuple = null;
+        if ( stream.readBoolean() ) {
+            int tuplePos = stream.readInt();
+            leftTuple = (LeftTuple) context.terminalTupleMap.get( tuplePos );
+        }
+
+        long propagationNumber = stream.readLong();
+
+        int factHandleId = stream.readInt();
+        InternalFactHandle factHandle = context.handles.get( factHandleId );
+
+        int activeActivations = stream.readInt();
+        int dormantActivations = stream.readInt();
+        String entryPointId = stream.readUTF();
+
+        EntryPoint entryPoint = context.entryPoints.get( entryPointId );
+        if ( entryPoint == null ) {
+            entryPoint = new EntryPoint( entryPointId );
+            context.entryPoints.put( entryPointId,
+                                     entryPoint );
+        }
+
+        PropagationContext pc = new PropagationContextImpl( propagationNumber,
+                                                            type,
+                                                            rule,
+                                                            leftTuple,
+                                                            factHandle,
+                                                            activeActivations,
+                                                            dormantActivations,
+                                                            entryPoint );
+        context.propagationContexts.put( propagationNumber,
+                                         pc );
+    }
+
+    public static void readProcessInstances(MarshallerReaderContext context) throws IOException {
+        ObjectInputStream stream = context.stream;
+        while ( stream.readShort() == PersisterEnums.PROCESS_INSTANCE ) {
+            readProcessInstance( context );
+        }
+    }
+
+    public static ProcessInstance readProcessInstance(MarshallerReaderContext context) throws IOException {
+        ObjectInputStream stream = context.stream;
+        InternalRuleBase ruleBase = context.ruleBase;
+        InternalWorkingMemory wm = context.wm;
+
+        RuleFlowProcessInstance processInstance = new RuleFlowProcessInstance();
+        processInstance.setId( stream.readLong() );
+        String processId = stream.readUTF();
+        processInstance.setProcessId( processId );
+        if ( ruleBase != null ) {
+            processInstance.setProcess( ruleBase.getProcess( processId ) );
+        }
+        processInstance.setState( stream.readInt() );
+        long nodeInstanceCounter = stream.readLong();
+        processInstance.setWorkingMemory( wm );
+
+        int nbVariables = stream.readInt();
+        if ( nbVariables > 0 ) {
+            VariableScopeInstance variableScopeInstance = (VariableScopeInstance) processInstance.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 );
+                }
+            }
+        }
+
+        int nbSwimlanes = stream.readInt();
+        if ( nbSwimlanes > 0 ) {
+            SwimlaneContextInstance swimlaneContextInstance = (SwimlaneContextInstance) processInstance.getContextInstance( SwimlaneContext.SWIMLANE_SCOPE );
+            for ( int i = 0; i < nbSwimlanes; i++ ) {
+                String name = stream.readUTF();
+                String value = stream.readUTF();
+                swimlaneContextInstance.setActorId( name,
+                                                    value );
+            }
+        }
+
+        while ( stream.readShort() == PersisterEnums.NODE_INSTANCE ) {
+            readNodeInstance( context,
+                              processInstance,
+                              processInstance );
+        }
+
+        processInstance.internalSetNodeInstanceCounter( nodeInstanceCounter );
+        if ( wm != null ) {
+            processInstance.reconnect();
+        }
+        return processInstance;
+    }
+
+    public static NodeInstance readNodeInstance(MarshallerReaderContext context,
+                                                NodeInstanceContainer nodeInstanceContainer,
+                                                RuleFlowProcessInstance processInstance) throws IOException {
+        ObjectInputStream stream = context.stream;
+        NodeInstanceImpl nodeInstance = null;
+        long id = stream.readLong();
+        long nodeId = stream.readLong();
+        int nodeType = stream.readShort();
+        switch ( nodeType ) {
+            case PersisterEnums.RULE_SET_NODE_INSTANCE :
+                nodeInstance = new RuleSetNodeInstance();
+                break;
+            case PersisterEnums.HUMAN_TASK_NODE_INSTANCE :
+                nodeInstance = new HumanTaskNodeInstance();
+                ((HumanTaskNodeInstance) nodeInstance).internalSetWorkItemId( stream.readLong() );
+                break;
+            case PersisterEnums.WORK_ITEM_NODE_INSTANCE :
+                nodeInstance = new WorkItemNodeInstance();
+                ((WorkItemNodeInstance) nodeInstance).internalSetWorkItemId( stream.readLong() );
+                break;
+            case PersisterEnums.SUB_PROCESS_NODE_INSTANCE :
+                nodeInstance = new SubProcessNodeInstance();
+                ((SubProcessNodeInstance) nodeInstance).internalSetProcessInstanceId( stream.readLong() );
+                break;
+            case PersisterEnums.MILESTONE_NODE_INSTANCE :
+                nodeInstance = new MilestoneNodeInstance();
+                int nbTimerInstances = stream.readInt();
+                if (nbTimerInstances > 0) {
+                	List<Long> timerInstances = new ArrayList<Long>();
+                	for (int i = 0; i < nbTimerInstances; i++) {
+                		timerInstances.add(stream.readLong());
+                	}
+                	((MilestoneNodeInstance) nodeInstance).internalSetTimerInstances(timerInstances);
+                }
+                break;
+            case PersisterEnums.TIMER_NODE_INSTANCE :
+                nodeInstance = new TimerNodeInstance();
+                ((TimerNodeInstance) nodeInstance).internalSetTimerId( stream.readLong() );
+                break;
+            case PersisterEnums.JOIN_NODE_INSTANCE :
+                nodeInstance = new JoinInstance();
+                int number = stream.readInt();
+                if ( number > 0 ) {
+                    Map<Long, Integer> triggers = new HashMap<Long, Integer>();
+                    for ( int i = 0; i < number; i++ ) {
+                        long l = stream.readLong();
+                        int count = stream.readInt();
+                        triggers.put( l,
+                                      count );
+                    }
+                    ((JoinInstance) nodeInstance).internalSetTriggers( triggers );
+                }
+                break;
+            case PersisterEnums.COMPOSITE_NODE_INSTANCE :
+                nodeInstance = new CompositeContextNodeInstance();
+                break;
+            case PersisterEnums.FOR_EACH_NODE_INSTANCE :
+                nodeInstance = new ForEachNodeInstance();
+                break;
+            default :
+                throw new IllegalArgumentException( "Unknown node type: " + nodeType );
+        }
+        nodeInstance.setNodeId( nodeId );
+        nodeInstance.setNodeInstanceContainer( nodeInstanceContainer );
+        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
+        }
+        return nodeInstance;
+    }
+
+    public static void readWorkItems(MarshallerReaderContext context) throws IOException {
+        InternalWorkingMemory wm = context.wm;
+        ObjectInputStream stream = context.stream;
+        while ( stream.readShort() == PersisterEnums.WORK_ITEM ) {
+            WorkItem workItem = readWorkItem( context );
+            ((WorkItemManager) wm.getWorkItemManager()).internalAddWorkItem( workItem );
+        }
+    }
+
+    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 );
+            }
+        }
+
+        return workItem;
+    }
+
+    public static void readTimers(MarshallerReaderContext context) throws IOException, ClassNotFoundException {
+        InternalWorkingMemory wm = context.wm;
+        ObjectInputStream stream = context.stream;
+
+        TimerManager timerManager = wm.getTimerManager();
+        timerManager.internalSetTimerId( stream.readLong() );
+        
+        // still need to think on how to fix this.
+//        TimerService service = (TimerService) stream.readObject();
+//        timerManager.setTimerService( service );
+
+        while ( stream.readShort() == PersisterEnums.TIMER ) {
+            TimerInstance timer = readTimer( context );
+            timerManager.internalAddTimer( timer );
+        }
+    }
+
+    public static TimerInstance readTimer(MarshallerReaderContext context) throws IOException {
+        ObjectInputStream stream = context.stream;
+
+        TimerInstance timer = new TimerInstance();
+        timer.setId( stream.readLong() );
+        timer.setTimerId( 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() ) );
+        }
+        return timer;
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/InputMarshaller.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallerProviderImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallerProviderImpl.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallerProviderImpl.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,44 @@
+package org.drools.marshalling.impl;
+
+import org.drools.KnowledgeBase;
+import org.drools.marshalling.Marshaller;
+import org.drools.marshalling.MarshallerProvider;
+import org.drools.marshalling.ObjectMarshallingStrategy;
+import org.drools.marshalling.ObjectMarshallingStrategyAcceptor;
+
+public class MarshallerProviderImpl implements MarshallerProvider {
+
+    public ObjectMarshallingStrategyAcceptor newClassFilterAcceptor(String[] patterns) {
+        return new ClassObjectMarshallingStrategyAcceptor( patterns );
+    }
+
+    public ObjectMarshallingStrategy newIdentityMarshallingStrategy() {
+        return new IdentityPlaceholderResolverStrategy( ClassObjectMarshallingStrategyAcceptor.DEFAULT );
+    }
+
+    public ObjectMarshallingStrategy newIdentityMarshallingStrategy(ObjectMarshallingStrategyAcceptor acceptor) {
+        return new IdentityPlaceholderResolverStrategy( acceptor );
+    }
+
+
+
+    public ObjectMarshallingStrategy newSerializeMarshallingStrategy() {
+        return new SerializablePlaceholderResolverStrategy( ClassObjectMarshallingStrategyAcceptor.DEFAULT  );
+    }
+
+    public ObjectMarshallingStrategy newSerializeMarshallingStrategy(ObjectMarshallingStrategyAcceptor acceptor) {
+        return new SerializablePlaceholderResolverStrategy( acceptor );
+    }
+    
+    public Marshaller newMarshaller(KnowledgeBase kbase) {
+        return newMarshaller(kbase, new ObjectMarshallingStrategy[] { newSerializeMarshallingStrategy() } );
+    }    
+    
+    public Marshaller newMarshaller(KnowledgeBase kbase, ObjectMarshallingStrategy[] strategies) {   
+        if ( strategies == null ) {
+            throw new IllegalArgumentException( "Strategies should not be null" );
+        }
+        return new DefaultMarshaller( kbase , new MarshallingConfigurationImpl( strategies, true, true ) );
+    }
+    
+}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallerReaderContext.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallerReaderContext.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallerReaderContext.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallerReaderContext.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,71 @@
+/**
+ * 
+ */
+package org.drools.marshalling.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.common.BaseNode;
+import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalRuleBase;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.reteoo.LeftTuple;
+import org.drools.reteoo.RightTuple;
+import org.drools.rule.EntryPoint;
+import org.drools.spi.PropagationContext;
+
+public class MarshallerReaderContext extends ObjectInputStream {
+    public final MarshallerReaderContext            stream;
+    public final InternalRuleBase                   ruleBase;
+    public InternalWorkingMemory                    wm;
+    public final Map<Integer, BaseNode>             sinks;
+
+    public Map<Integer, InternalFactHandle>         handles;
+
+    public final Map<RightTupleKey, RightTuple>     rightTuples;
+    public final Map<Integer, LeftTuple>            terminalTupleMap;
+
+    public final ObjectMarshallingStrategyStore resolverStrategyFactory;
+    public final Map<String, EntryPoint>            entryPoints;
+
+    public final Map<Long, PropagationContext>      propagationContexts;
+
+    public final boolean                            marshalProcessInstances;
+    public final boolean                            marshalWorkItems;
+
+    public MarshallerReaderContext(InputStream stream,
+                                   InternalRuleBase ruleBase,
+                                   Map<Integer, BaseNode> sinks,
+                                   ObjectMarshallingStrategyStore resolverStrategyFactory) throws IOException {
+        this( stream,
+              ruleBase,
+              sinks,
+              resolverStrategyFactory,
+              true,
+              true );
+    }
+
+    public MarshallerReaderContext(InputStream stream,
+                                   InternalRuleBase ruleBase,
+                                   Map<Integer, BaseNode> sinks,
+                                   ObjectMarshallingStrategyStore resolverStrategyFactory,
+                                   boolean marshalProcessInstances,
+                                   boolean marshalWorkItems) throws IOException {
+        super( stream );
+        this.stream = this;
+        this.ruleBase = ruleBase;
+        this.sinks = sinks;
+        this.handles = new HashMap<Integer, InternalFactHandle>();
+        this.rightTuples = new HashMap<RightTupleKey, RightTuple>();
+        this.terminalTupleMap = new HashMap<Integer, LeftTuple>();
+        this.entryPoints = new HashMap<String, EntryPoint>();
+        this.propagationContexts = new HashMap<Long, PropagationContext>();
+        this.resolverStrategyFactory = resolverStrategyFactory;
+        this.marshalProcessInstances = marshalProcessInstances;
+        this.marshalWorkItems = marshalWorkItems;
+    }
+}
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallerReaderContext.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallerWriteContext.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallerWriteContext.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallerWriteContext.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallerWriteContext.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,67 @@
+/**
+ * 
+ */
+package org.drools.marshalling.impl;
+
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.IdentityHashMap;
+import java.util.Map;
+
+import org.drools.common.BaseNode;
+import org.drools.common.InternalRuleBase;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.reteoo.LeftTuple;
+
+public class MarshallerWriteContext extends ObjectOutputStream {
+    public final MarshallerWriteContext         stream;
+    public final InternalRuleBase               ruleBase;
+    public final InternalWorkingMemory          wm;
+    public final Map<Integer, BaseNode>         sinks;
+
+    public final PrintStream                    out = System.out;
+
+    public final ObjectMarshallingStrategyStore objectMarshallingStrategyStore;
+
+    public final Map<LeftTuple, Integer>        terminalTupleMap;
+
+    public final boolean                        marshalProcessInstances;
+    public final boolean                        marshalWorkItems;
+
+    public MarshallerWriteContext(OutputStream stream,
+                                  InternalRuleBase ruleBase,
+                                  InternalWorkingMemory wm,
+                                  Map<Integer, BaseNode> sinks,
+                                  ObjectMarshallingStrategyStore resolverStrategyFactory) throws IOException {
+        this( stream,
+              ruleBase,
+              wm,
+              sinks,
+              resolverStrategyFactory,
+              true,
+              true );
+    }
+
+    public MarshallerWriteContext(OutputStream stream,
+                                  InternalRuleBase ruleBase,
+                                  InternalWorkingMemory wm,
+                                  Map<Integer, BaseNode> sinks,
+                                  ObjectMarshallingStrategyStore resolverStrategyFactory,
+                                  boolean marshalProcessInstances,
+                                  boolean marshalWorkItems) throws IOException {
+        super( stream );
+        this.stream = this;
+        this.ruleBase = ruleBase;
+        this.wm = wm;
+        this.sinks = sinks;
+
+        this.objectMarshallingStrategyStore = resolverStrategyFactory;
+
+        this.terminalTupleMap = new IdentityHashMap<LeftTuple, Integer>();
+
+        this.marshalProcessInstances = marshalProcessInstances;
+        this.marshalWorkItems = marshalWorkItems;
+    }
+}
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallerWriteContext.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallingConfiguration.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfiguration.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallingConfiguration.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallingConfiguration.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,9 @@
+package org.drools.marshalling.impl;
+
+public interface MarshallingConfiguration {
+    ObjectMarshallingStrategyStore getObjectMarshallingStrategyStore();
+
+    boolean isMarshallProcessInstances();
+
+    boolean isMarshallWorkItems();
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallingConfiguration.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallingConfigurationImpl.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/MarshallingConfigurationImpl.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallingConfigurationImpl.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallingConfigurationImpl.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,50 @@
+package org.drools.marshalling.impl;
+
+import org.drools.marshalling.ObjectMarshallingStrategy;
+
+public class MarshallingConfigurationImpl
+    implements
+    MarshallingConfiguration {
+    private ObjectMarshallingStrategyStore objectMarshallingStrategyStore;
+    private boolean                            marshallProcessInstances;
+    private boolean                            marshallWorkItems;
+
+    public MarshallingConfigurationImpl() {
+        this( null,
+              true,
+              true );
+    }
+
+    public MarshallingConfigurationImpl(ObjectMarshallingStrategy[] strategies,
+                                        boolean marshallProcessInstances,
+                                        boolean marshallWorkItems) {
+        this.objectMarshallingStrategyStore = new ObjectMarshallingStrategyStore( strategies );
+        this.marshallProcessInstances = marshallProcessInstances;
+        this.marshallWorkItems = marshallWorkItems;
+    }
+
+    public boolean isMarshallProcessInstances() {
+        return this.marshallProcessInstances;
+    }
+
+    public void setMarshallProcessInstances(boolean marshallProcessInstances) {
+        this.marshallProcessInstances = marshallProcessInstances;
+    }
+
+    public boolean isMarshallWorkItems() {
+        return this.marshallWorkItems;
+    }
+
+    public void setMarshallWorkItems(boolean marshallWorkItems) {
+        this.marshallWorkItems = marshallWorkItems;
+    }
+
+    public ObjectMarshallingStrategyStore getObjectMarshallingStrategyStore() {
+        return this.objectMarshallingStrategyStore;
+    }
+
+    public void setPlaceholderResolverStrategyFactory(ObjectMarshallingStrategyStore placeholderResolverStrategyFactory) {
+        this.objectMarshallingStrategyStore = placeholderResolverStrategyFactory;
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/MarshallingConfigurationImpl.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ObjectMarshallingStrategyStore.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PlaceholderResolverStrategyFactory.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ObjectMarshallingStrategyStore.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ObjectMarshallingStrategyStore.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,28 @@
+package org.drools.marshalling.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.marshalling.ObjectMarshallingStrategy;
+
+public class ObjectMarshallingStrategyStore {
+    private ObjectMarshallingStrategy[] strategiesList;
+    
+    ObjectMarshallingStrategyStore(ObjectMarshallingStrategy[] strategiesList) {
+        this.strategiesList = strategiesList;
+    } 
+    
+    public ObjectMarshallingStrategy getStrategy(int index) {
+        return this.strategiesList[ index ];        
+    }
+    
+    public int getStrategy(Object object) {
+        for ( int i = 0, length = this.strategiesList.length; i < length; i++ ) {
+            if ( strategiesList[i].accept( object ) ) {
+                return i;
+            }            
+        }
+        throw new RuntimeException( "Unable to find PlaceholderResolverStrategy for class : " + object.getClass() + " object : " + object );
+    }    
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ObjectMarshallingStrategyStore.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/OutputMarshaller.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/OutputMarshaller.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/OutputMarshaller.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,986 @@
+package org.drools.marshalling.impl;
+
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.drools.InitialFact;
+import org.drools.base.ClassObjectType;
+import org.drools.common.AgendaItem;
+import org.drools.common.DefaultAgenda;
+import org.drools.common.EqualityKey;
+import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalRuleBase;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.common.LogicalDependency;
+import org.drools.common.NodeMemory;
+import org.drools.common.ObjectStore;
+import org.drools.common.RuleFlowGroupImpl;
+import org.drools.common.WorkingMemoryAction;
+import org.drools.marshalling.ObjectMarshallingStrategy;
+import org.drools.process.core.context.swimlane.SwimlaneContext;
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.instance.WorkItemManager;
+import org.drools.process.instance.context.swimlane.SwimlaneContextInstance;
+import org.drools.process.instance.context.variable.VariableScopeInstance;
+import org.drools.process.instance.timer.TimerInstance;
+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;
+import org.drools.reteoo.ObjectTypeNode;
+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.reteoo.CollectNode.CollectContext;
+import org.drools.reteoo.CollectNode.CollectMemory;
+import org.drools.rule.EntryPoint;
+import org.drools.rule.Rule;
+import org.drools.ruleflow.instance.RuleFlowProcessInstance;
+import org.drools.runtime.process.NodeInstance;
+import org.drools.runtime.process.WorkItem;
+import org.drools.spi.ActivationGroup;
+import org.drools.spi.AgendaGroup;
+import org.drools.spi.PropagationContext;
+import org.drools.spi.RuleFlowGroup;
+import org.drools.util.ObjectHashMap;
+import org.drools.util.ObjectHashSet;
+import org.drools.workflow.instance.node.CompositeContextNodeInstance;
+import org.drools.workflow.instance.node.ForEachNodeInstance;
+import org.drools.workflow.instance.node.HumanTaskNodeInstance;
+import org.drools.workflow.instance.node.JoinInstance;
+import org.drools.workflow.instance.node.MilestoneNodeInstance;
+import org.drools.workflow.instance.node.RuleSetNodeInstance;
+import org.drools.workflow.instance.node.SubProcessNodeInstance;
+import org.drools.workflow.instance.node.TimerNodeInstance;
+import org.drools.workflow.instance.node.WorkItemNodeInstance;
+
+public class OutputMarshaller {
+    public static void writeSession(MarshallerWriteContext context) throws IOException {
+        ReteooWorkingMemory wm = (ReteooWorkingMemory) context.wm;
+        
+        final boolean multithread = wm.isPartitionManagersActive(); 
+        // is multi-thread active?
+        if( multithread ) {
+            context.writeBoolean( true );
+            wm.stopPartitionManagers();
+        } else {
+            context.writeBoolean( false );
+        }
+
+        context.writeInt( wm.getFactHandleFactory().getId() );
+        context.writeLong( wm.getFactHandleFactory().getRecency() );
+//        context.out.println( "FactHandleFactory int:" + wm.getFactHandleFactory().getId() + " long:" + wm.getFactHandleFactory().getRecency() );
+
+        InternalFactHandle handle = context.wm.getInitialFactHandle();
+        context.writeInt( handle.getId() );
+        context.writeLong( handle.getRecency() );
+//        context.out.println( "InitialFact int:" + handle.getId() + " long:" + handle.getRecency() );
+
+        context.writeLong( wm.getPropagationIdCounter() );
+//        context.out.println( "PropagationCounter long:" + wm.getPropagationIdCounter() );
+
+        writeAgenda( context );
+
+        writeFactHandles( context );
+
+        writeActionQueue( context );
+
+        if ( wm.getTruthMaintenanceSystem() != null ) {
+            context.writeBoolean( true );
+            writeTruthMaintenanceSystem( context );
+        } else {
+            context.writeBoolean( false );
+        }
+
+        if ( context.marshalProcessInstances ) {
+            writeProcessInstances( context );
+        }
+
+        if ( context.marshalWorkItems ) {
+            writeWorkItems( context );
+        }
+
+        writeTimers( context );
+        
+        if( multithread ) {
+            wm.startPartitionManagers();
+        }
+    }
+
+    public static void writeAgenda(MarshallerWriteContext context) throws IOException {
+        InternalWorkingMemory wm = context.wm;
+        DefaultAgenda agenda = (DefaultAgenda) wm.getAgenda();
+
+        Map<String, ActivationGroup> activationGroups = agenda.getActivationGroupsMap();
+
+        AgendaGroup[] agendaGroups = (AgendaGroup[]) agenda.getAgendaGroupsMap().values().toArray( new AgendaGroup[agenda.getAgendaGroupsMap().size()] );
+        Arrays.sort( agendaGroups,
+                     AgendaGroupSorter.instance );
+
+        for ( AgendaGroup group : agendaGroups ) {
+            context.writeShort( PersisterEnums.AGENDA_GROUP );
+            context.writeUTF( group.getName() );
+            context.writeBoolean( group.isActive() );
+        }
+        context.writeShort( PersisterEnums.END );
+
+        LinkedList<AgendaGroup> focusStack = agenda.getStackList();
+        for ( Iterator<AgendaGroup> it = focusStack.iterator(); it.hasNext(); ) {
+            AgendaGroup group = it.next();
+            context.writeShort( PersisterEnums.AGENDA_GROUP );
+            context.writeUTF( group.getName() );
+        }
+        context.writeShort( PersisterEnums.END );
+
+        RuleFlowGroupImpl[] ruleFlowGroups = (RuleFlowGroupImpl[]) agenda.getRuleFlowGroupsMap().values().toArray( new RuleFlowGroupImpl[agenda.getRuleFlowGroupsMap().size()] );
+        Arrays.sort( ruleFlowGroups,
+                     RuleFlowGroupSorter.instance );
+
+        for ( RuleFlowGroupImpl group : ruleFlowGroups ) {
+            context.writeShort( PersisterEnums.RULE_FLOW_GROUP );
+            //group.write( context );
+            context.writeUTF( group.getName() );
+            context.writeBoolean( group.isActive() );
+            context.writeBoolean( group.isAutoDeactivate() );
+        }
+        context.writeShort( PersisterEnums.END );
+    }
+
+    public static class AgendaGroupSorter
+        implements
+        Comparator<AgendaGroup> {
+        public static final AgendaGroupSorter instance = new AgendaGroupSorter();
+
+        public int compare(AgendaGroup group1,
+                           AgendaGroup group2) {
+            return group1.getName().compareTo( group2.getName() );
+        }
+    }
+
+    public static class RuleFlowGroupSorter
+        implements
+        Comparator<RuleFlowGroup> {
+        public static final RuleFlowGroupSorter instance = new RuleFlowGroupSorter();
+
+        public int compare(RuleFlowGroup group1,
+                           RuleFlowGroup group2) {
+            return group1.getName().compareTo( group2.getName() );
+        }
+    }
+
+    public static void writeActionQueue(MarshallerWriteContext context) throws IOException {
+        ReteooWorkingMemory wm = (ReteooWorkingMemory) context.wm;
+
+        WorkingMemoryAction[] queue = wm.getActionQueue().toArray( new WorkingMemoryAction[wm.getActionQueue().size()] );
+        for ( int i = queue.length - 1; i >= 0; i-- ) {
+            context.writeShort( PersisterEnums.WORKING_MEMORY_ACTION );
+            queue[i].write( context );
+        }
+        context.writeShort( PersisterEnums.END );
+    }
+
+    public static void writeTruthMaintenanceSystem(MarshallerWriteContext context) throws IOException {
+        ObjectOutputStream stream = context.stream;
+
+        ObjectHashMap assertMap = context.wm.getTruthMaintenanceSystem().getAssertMap();
+
+        EqualityKey[] keys = new EqualityKey[assertMap.size()];
+        org.drools.util.Iterator it = assertMap.iterator();
+        int i = 0;
+        for ( org.drools.util.ObjectHashMap.ObjectEntry entry = (org.drools.util.ObjectHashMap.ObjectEntry) it.next(); entry != null; entry = (org.drools.util.ObjectHashMap.ObjectEntry) it.next() ) {
+            EqualityKey key = (EqualityKey) entry.getKey();
+            keys[i++] = key;
+        }
+
+        Arrays.sort( keys,
+                     EqualityKeySorter.instance );
+
+        // write the assert map of Equality keys
+        for ( EqualityKey key : keys ) {
+            stream.writeShort( PersisterEnums.EQUALITY_KEY );
+            stream.writeInt( key.getStatus() );
+            InternalFactHandle handle = key.getFactHandle();
+            stream.writeInt( handle.getId() );
+//            context.out.println( "EqualityKey int:" + key.getStatus() + " int:" + handle.getId() );
+            if ( key.getOtherFactHandle() != null && !key.getOtherFactHandle().isEmpty() ) {
+                for ( InternalFactHandle handle2 : key.getOtherFactHandle() ) {
+                    stream.writeShort( PersisterEnums.FACT_HANDLE );
+                    stream.writeInt( handle2.getId() );
+//                    context.out.println( "OtherHandle int:" + handle2.getId() );
+                }
+            }
+            stream.writeShort( PersisterEnums.END );
+        }
+        stream.writeShort( PersisterEnums.END );
+    }
+
+    public static class EqualityKeySorter
+        implements
+        Comparator<EqualityKey> {
+        public static final EqualityKeySorter instance = new EqualityKeySorter();
+
+        public int compare(EqualityKey key1,
+                           EqualityKey key2) {
+            return key1.getFactHandle().getId() - key2.getFactHandle().getId();
+        }
+    }
+
+    public static void writeFactHandles(MarshallerWriteContext context) throws IOException {
+        ObjectOutputStream stream = context.stream;
+        InternalWorkingMemory wm = context.wm;
+        ObjectMarshallingStrategyStore objectMarshallingStrategyStore = context.objectMarshallingStrategyStore;
+
+        writeInitialFactHandleRightTuples( context );
+
+        stream.writeInt( wm.getObjectStore().size() );
+
+        // Write out FactHandles
+        for ( InternalFactHandle handle : orderFacts( wm.getObjectStore() ) ) {
+            //stream.writeShort( PersisterEnums.FACT_HANDLE );
+            //InternalFactHandle handle = (InternalFactHandle) it.next();
+            writeFactHandle( context,
+                             stream,
+                             objectMarshallingStrategyStore,
+                             handle );
+
+            writeRightTuples( handle,
+                              context );
+        }
+
+        writeInitialFactHandleLeftTuples( context );
+
+        writeLeftTuples( context );
+
+        writePropagationContexts( context );
+
+        writeActivations( context );
+    }
+
+    private static void writeFactHandle(MarshallerWriteContext context,
+                                        ObjectOutputStream stream,
+                                        ObjectMarshallingStrategyStore objectMarshallingStrategyStore,
+                                        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();
+
+        int index = objectMarshallingStrategyStore.getStrategy( object );
+        
+        ObjectMarshallingStrategy strategy = objectMarshallingStrategyStore.getStrategy( index );
+
+        stream.writeInt( index );
+
+        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();
+        InternalFactHandle[] handles = new InternalFactHandle[size];
+        int i = 0;
+        for ( Iterator it = objectStore.iterateFactHandles(); it.hasNext(); ) {
+            handles[i++] = (InternalFactHandle) it.next();
+        }
+
+        Arrays.sort( handles,
+                     new HandleSorter() );
+
+        return handles;
+    }
+
+    public static class HandleSorter
+        implements
+        Comparator<InternalFactHandle> {
+        public int compare(InternalFactHandle h1,
+                           InternalFactHandle h2) {
+            return h1.getId() - h2.getId();
+        }
+    }
+
+    public static void writeInitialFactHandleRightTuples(MarshallerWriteContext context) throws IOException {
+        ObjectOutputStream stream = context.stream;
+        InternalRuleBase ruleBase = context.ruleBase;
+
+        ObjectTypeNode initialFactNode = ruleBase.getRete().getEntryPointNode( EntryPoint.DEFAULT ).getObjectTypeNodes().get( new ClassObjectType( InitialFact.class ) );
+
+        // do we write the fact to the objecttypenode memory
+        if ( initialFactNode != null ) {
+            ObjectHashSet initialFactMemory = (ObjectHashSet) context.wm.getNodeMemory( initialFactNode );
+            if ( initialFactMemory != null && !initialFactMemory.isEmpty() ) {
+//                context.out.println( "InitialFactMemory true int:" + initialFactNode.getId() );
+                stream.writeBoolean( true );
+                stream.writeInt( initialFactNode.getId() );
+
+//                context.out.println( "InitialFact RightTuples" );
+                writeRightTuples( context.wm.getInitialFactHandle(),
+                                  context );
+            } else {
+//                context.out.println( "InitialFactMemory false " );
+                stream.writeBoolean( false );
+            }
+        } else {
+//            context.out.println( "InitialFactMemory false " );
+            stream.writeBoolean( false );
+        }
+    }
+
+    public static void writeInitialFactHandleLeftTuples(MarshallerWriteContext context) throws IOException {
+        ObjectOutputStream stream = context.stream;
+
+//        context.out.println( "InitialFact LeftTuples Start" );
+        InternalFactHandle handle = context.wm.getInitialFactHandle();
+        for ( LeftTuple leftTuple = getLeftTuple( handle.getLeftTuple() ); leftTuple != null; leftTuple = (LeftTuple) leftTuple.getLeftParentPrevious() ) {
+            stream.writeShort( PersisterEnums.LEFT_TUPLE );
+
+            stream.writeInt( leftTuple.getLeftTupleSink().getId() );
+//            context.out.println( "LeftTuple sinkId:" + leftTuple.getLeftTupleSink().getId() );
+            writeLeftTuple( leftTuple,
+                            context,
+                            true );
+        }
+        stream.writeShort( PersisterEnums.END );
+//        context.out.println( "InitialFact LeftTuples End" );
+    }
+
+    public static void writeRightTuples(InternalFactHandle handle,
+                                        MarshallerWriteContext context) throws IOException {
+        ObjectOutputStream stream = context.stream;
+//        context.out.println( "RightTuples Start" );
+
+        RightTuple rightTuple = handle.getRightTuple();
+        for ( RightTuple tempRightTuple = rightTuple; tempRightTuple != null; tempRightTuple = (RightTuple) tempRightTuple.getHandleNext() ) {
+            rightTuple = tempRightTuple;
+        }
+        for ( ; rightTuple != null; rightTuple = (RightTuple) rightTuple.getHandlePrevious() ) {
+            stream.writeShort( PersisterEnums.RIGHT_TUPLE );
+            writeRightTuple( rightTuple,
+                             context );
+        }
+        stream.writeShort( PersisterEnums.END );
+//        context.out.println( "RightTuples END" );
+    }
+
+    public static void writeRightTuple(RightTuple rightTuple,
+                                       MarshallerWriteContext context) throws IOException {
+        ObjectOutputStream stream = context.stream;
+        InternalWorkingMemory wm = context.wm;
+        stream.writeInt( rightTuple.getRightTupleSink().getId() );
+//        context.out.println( "RightTuple sinkId:" + rightTuple.getRightTupleSink().getId() );
+    }
+
+    public static void writeLeftTuples(MarshallerWriteContext context) throws IOException {
+        ObjectOutputStream stream = context.stream;
+        InternalWorkingMemory wm = context.wm;
+
+        // Write out LeftTuples
+//        context.out.println( "LeftTuples Start" );
+        for ( InternalFactHandle handle : orderFacts( wm.getObjectStore() ) ) {
+            //InternalFactHandle handle = (InternalFactHandle) it.next();
+
+            for ( LeftTuple leftTuple = getLeftTuple( handle.getLeftTuple() ); leftTuple != null; leftTuple = (LeftTuple) leftTuple.getLeftParentPrevious() ) {
+                stream.writeShort( PersisterEnums.LEFT_TUPLE );
+
+                stream.writeInt( leftTuple.getLeftTupleSink().getId() );
+                stream.writeInt( handle.getId() );
+
+//                context.out.println( "LeftTuple sinkId:" + leftTuple.getLeftTupleSink().getId() + " handleId:" + handle.getId() );
+                writeLeftTuple( leftTuple,
+                                context,
+                                true );
+            }
+        }
+        stream.writeShort( PersisterEnums.END );
+//        context.out.println( "LeftTuples End" );
+    }
+
+    public static void writeLeftTuple(LeftTuple leftTuple,
+                                      MarshallerWriteContext context,
+                                      boolean recurse) throws IOException {
+        ObjectOutputStream stream = context.stream;
+        InternalRuleBase ruleBase = context.ruleBase;
+        InternalWorkingMemory wm = context.wm;
+
+        LeftTupleSink sink = leftTuple.getLeftTupleSink();
+
+        switch ( sink.getType() ) {
+            case NodeTypeEnums.JoinNode : {
+//                context.out.println( "JoinNode" );
+                for ( LeftTuple childLeftTuple = getLeftTuple( leftTuple.getBetaChildren() ); childLeftTuple != null; childLeftTuple = (LeftTuple) childLeftTuple.getLeftParentPrevious() ) {
+                    stream.writeShort( PersisterEnums.RIGHT_TUPLE );
+                    stream.writeInt( childLeftTuple.getLeftTupleSink().getId() );
+                    stream.writeInt( childLeftTuple.getRightParent().getFactHandle().getId() );
+//                    context.out.println( "RightTuple int:" + childLeftTuple.getLeftTupleSink().getId() + " int:" + childLeftTuple.getRightParent().getFactHandle().getId() );
+                    writeLeftTuple( childLeftTuple,
+                                    context,
+                                    recurse );
+                }
+                stream.writeShort( PersisterEnums.END );
+//                context.out.println( "JoinNode   ---   END" );
+                break;
+            }
+            case NodeTypeEnums.EvalConditionNode : {
+//                context.out.println( "EvalConditionNode" );
+                for ( LeftTuple childLeftTuple = getLeftTuple( leftTuple.getBetaChildren() ); childLeftTuple != null; childLeftTuple = (LeftTuple) childLeftTuple.getLeftParentPrevious() ) {
+                    stream.writeShort( PersisterEnums.LEFT_TUPLE );
+                    stream.writeInt( childLeftTuple.getLeftTupleSink().getId() );
+                    writeLeftTuple( childLeftTuple,
+                                    context,
+                                    recurse );
+                }
+                stream.writeShort( PersisterEnums.END );
+                break;
+            }
+            case NodeTypeEnums.NotNode : {
+                if ( leftTuple.getBlocker() == null ) {
+                    // is not blocked so has children
+                    stream.writeShort( PersisterEnums.LEFT_TUPLE_NOT_BLOCKED );
+
+                    for ( LeftTuple childLeftTuple = getLeftTuple( leftTuple.getBetaChildren() ); childLeftTuple != null; childLeftTuple = (LeftTuple) leftTuple.getLeftParentPrevious() ) {
+                        stream.writeShort( PersisterEnums.LEFT_TUPLE );
+                        stream.writeInt( childLeftTuple.getLeftTupleSink().getId() );
+                        writeLeftTuple( childLeftTuple,
+                                        context,
+                                        recurse );
+                    }
+                    stream.writeShort( PersisterEnums.END );
+
+                } else {
+                    stream.writeShort( PersisterEnums.LEFT_TUPLE_BLOCKED );
+                    stream.writeInt( leftTuple.getBlocker().getFactHandle().getId() );
+                }
+                break;
+            }
+            case NodeTypeEnums.ExistsNode : {
+                if ( leftTuple.getBlocker() == null ) {
+                    // is blocked so has children
+                    stream.writeShort( PersisterEnums.LEFT_TUPLE_NOT_BLOCKED );
+                } else {
+                    stream.writeShort( PersisterEnums.LEFT_TUPLE_BLOCKED );
+                    stream.writeInt( leftTuple.getBlocker().getFactHandle().getId() );
+
+                    for ( LeftTuple childLeftTuple = getLeftTuple( leftTuple.getBetaChildren() ); childLeftTuple != null; childLeftTuple = (LeftTuple) leftTuple.getLeftParentPrevious() ) {
+                        stream.writeShort( PersisterEnums.LEFT_TUPLE );
+                        stream.writeInt( childLeftTuple.getLeftTupleSink().getId() );
+                        writeLeftTuple( childLeftTuple,
+                                        context,
+                                        recurse );
+                    }
+                    stream.writeShort( PersisterEnums.END );
+                }
+                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) sink );
+                AccumulateContext accctx = (AccumulateContext) memory.betaMemory.getCreatedHandles().get( leftTuple );
+                // first we serialize the generated fact handle
+                writeFactHandle( context,
+                                 stream,
+                                 context.objectMarshallingStrategyStore,
+                                 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.CollectNode : {
+//                context.out.println( "CollectNode" );
+                // collect nodes generate new facts on-demand and need special procedures when serializing to persistent storage
+                CollectMemory memory = (CollectMemory) context.wm.getNodeMemory( (BetaNode) sink );
+                CollectContext colctx = (CollectContext) memory.betaMemory.getCreatedHandles().get( leftTuple );
+                // first we serialize the generated fact handle
+                writeFactHandle( context,
+                                 stream,
+                                 context.objectMarshallingStrategyStore,
+                                 colctx.resultTuple.getFactHandle() );
+                // then we serialize the boolean propagated flag
+                stream.writeBoolean( colctx.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( "CollectNode   ---   END" );
+                break;
+            }
+            case NodeTypeEnums.RightInputAdaterNode : {
+//                context.out.println( "RightInputAdapterNode" );
+                // RIANs generate new fact handles on-demand to wrap tuples and need special procedures when serializing to persistent storage
+                ObjectHashMap memory = (ObjectHashMap) context.wm.getNodeMemory( (NodeMemory) sink );
+                InternalFactHandle ifh = (InternalFactHandle) memory.get( leftTuple );
+                // first we serialize the generated fact handle ID
+//                context.out.println( "FactHandle id:"+ifh.getId() );
+                stream.writeInt( ifh.getId() );
+                stream.writeLong( ifh.getRecency() );
+                
+                writeRightTuples( ifh, context );
+
+                stream.writeShort( PersisterEnums.END );
+//                context.out.println( "RightInputAdapterNode   ---   END" );
+                break;
+            }
+            case NodeTypeEnums.RuleTerminalNode : {
+//                context.out.println( "RuleTerminalNode" );
+                int pos = context.terminalTupleMap.size();
+                context.terminalTupleMap.put( leftTuple,
+                                              pos );
+                break;
+            }
+        }
+    }
+
+    public static LeftTuple getLeftTuple(LeftTuple leftTuple) {
+        for ( LeftTuple tempLeftTuple = leftTuple; tempLeftTuple != null; tempLeftTuple = (LeftTuple) tempLeftTuple.getLeftParentNext() ) {
+            leftTuple = tempLeftTuple;
+        }
+        return leftTuple;
+    }
+
+    public static void writeActivations(MarshallerWriteContext context) throws IOException {
+        ObjectOutputStream stream = context.stream;
+
+        Entry<LeftTuple, Integer>[] entries = context.terminalTupleMap.entrySet().toArray( new Entry[context.terminalTupleMap.size()] );
+        Arrays.sort( entries,
+                     TupleSorter.instance );
+
+        //Map<LeftTuple, Integer> tuples = context.terminalTupleMap;
+        if ( entries.length != 0 ) {
+            for ( Entry<LeftTuple, Integer> entry : entries ) {
+                if (entry.getKey().getActivation() != null) {
+					LeftTuple leftTuple = entry.getKey();
+					stream.writeShort(PersisterEnums.ACTIVATION);
+					writeActivation(context, leftTuple, (AgendaItem) leftTuple
+							.getActivation(), (RuleTerminalNode) leftTuple
+							.getLeftTupleSink());
+				}
+            }
+        }
+        stream.writeShort( PersisterEnums.END );
+    }
+
+    public static class TupleSorter
+        implements
+        Comparator<Entry<LeftTuple, Integer>> {
+        public static final TupleSorter instance = new TupleSorter();
+
+        public int compare(Entry<LeftTuple, Integer> e1,
+                           Entry<LeftTuple, Integer> e2) {
+            return e1.getValue() - e2.getValue();
+        }
+    }
+
+    public static void writeActivation(MarshallerWriteContext context,
+                                       LeftTuple leftTuple,
+                                       AgendaItem agendaItem,
+                                       RuleTerminalNode ruleTerminalNode) throws IOException {
+        ObjectOutputStream stream = context.stream;
+
+        stream.writeLong( agendaItem.getActivationNumber() );
+
+        stream.writeInt( context.terminalTupleMap.get( leftTuple ) );
+
+        stream.writeInt( agendaItem.getSalience() );
+
+        Rule rule = agendaItem.getRule();
+        stream.writeUTF( rule.getPackage() );
+        stream.writeUTF( rule.getName() );
+
+//        context.out.println( "Rule " + rule.getPackage() + "." + rule.getName() );
+
+//        context.out.println( "AgendaItem long:" + agendaItem.getPropagationContext().getPropagationNumber() );
+        stream.writeLong( agendaItem.getPropagationContext().getPropagationNumber() );
+
+        if ( agendaItem.getActivationGroupNode() != null ) {
+            stream.writeBoolean( true );
+//            context.out.println( "ActivationGroup bool:" + true );
+            stream.writeUTF( agendaItem.getActivationGroupNode().getActivationGroup().getName() );
+//            context.out.println( "ActivationGroup string:" + agendaItem.getActivationGroupNode().getActivationGroup().getName() );
+        } else {
+            stream.writeBoolean( false );
+//            context.out.println( "ActivationGroup bool:" + false );
+        }
+
+        stream.writeBoolean( agendaItem.isActivated() );
+//        context.out.println( "AgendaItem bool:" + agendaItem.isActivated() );
+
+        org.drools.util.LinkedList list = agendaItem.getLogicalDependencies();
+        if ( list != null && !list.isEmpty() ) {
+            for ( LogicalDependency node = (LogicalDependency) list.getFirst(); node != null; node = (LogicalDependency) node.getNext() ) {
+                stream.writeShort( PersisterEnums.LOGICAL_DEPENDENCY );
+                stream.writeInt( ((InternalFactHandle) node.getFactHandle()).getId() );
+//                context.out.println( "Logical Depenency : int " + ((InternalFactHandle) node.getFactHandle()).getId() );
+            }
+        }
+        stream.writeShort( PersisterEnums.END );
+    }
+
+    public static void writePropagationContexts(MarshallerWriteContext context) throws IOException {
+        ObjectOutputStream stream = context.stream;
+
+        Entry<LeftTuple, Integer>[] entries = context.terminalTupleMap.entrySet().toArray( new Entry[context.terminalTupleMap.size()] );
+        Arrays.sort( entries,
+                     TupleSorter.instance );
+
+        //Map<LeftTuple, Integer> tuples = context.terminalTupleMap;
+        if ( entries.length != 0 ) {
+            Map<Long, PropagationContext> pcMap = new HashMap<Long, PropagationContext>();
+            for ( Entry<LeftTuple, Integer> entry : entries ) {
+                LeftTuple leftTuple = entry.getKey();
+                if (leftTuple.getActivation() != null) {
+					PropagationContext pc = leftTuple.getActivation()
+							.getPropagationContext();
+					if (!pcMap.containsKey(pc.getPropagationNumber())) {
+						stream.writeShort(PersisterEnums.PROPAGATION_CONTEXT);
+						writePropagationContext(context, pc);
+						pcMap.put(pc.getPropagationNumber(), pc);
+					}
+				}
+            }
+        }
+
+        stream.writeShort( PersisterEnums.END );
+    }
+
+    public static void writePropagationContext(MarshallerWriteContext context,
+                                               PropagationContext pc) throws IOException {
+        ObjectOutputStream stream = context.stream;
+        Map<LeftTuple, Integer> tuples = context.terminalTupleMap;
+
+        stream.writeInt( pc.getType() );
+
+        Rule ruleOrigin = pc.getRuleOrigin();
+        if ( ruleOrigin != null ) {
+            stream.writeBoolean( true );
+            stream.writeUTF( ruleOrigin.getPackage() );
+            stream.writeUTF( ruleOrigin.getName() );
+        } else {
+            stream.writeBoolean( false );
+        }
+
+        LeftTuple tupleOrigin = pc.getLeftTupleOrigin();
+        if ( tupleOrigin != null && tuples.containsKey( tupleOrigin )) {
+            stream.writeBoolean( true );
+            stream.writeInt( tuples.get( tupleOrigin ) );
+        } else {
+            stream.writeBoolean( false );
+        }
+
+        stream.writeLong( pc.getPropagationNumber() );
+        if ( pc.getFactHandleOrigin() != null ) {
+            stream.writeInt( ((InternalFactHandle)pc.getFactHandleOrigin()).getId() );
+        } else {
+            stream.writeInt( -1 );
+        }
+
+        stream.writeInt( pc.getActiveActivations() );
+        stream.writeInt( pc.getDormantActivations() );
+
+        stream.writeUTF( pc.getEntryPoint().getEntryPointId() );
+    }
+
+    public static void writeProcessInstances(MarshallerWriteContext context) throws IOException {
+        ObjectOutputStream stream = context.stream;
+        List<org.drools.runtime.process.ProcessInstance> processInstances = new ArrayList<org.drools.runtime.process.ProcessInstance>( context.wm.getProcessInstances() );
+        Collections.sort( processInstances,
+                          new Comparator<org.drools.runtime.process.ProcessInstance>() {
+                              public int compare(org.drools.runtime.process.ProcessInstance o1,
+                            		  org.drools.runtime.process.ProcessInstance o2) {
+                                  return (int) (o1.getId() - o2.getId());
+                              }
+                          } );
+        for ( org.drools.runtime.process.ProcessInstance processInstance : processInstances ) {
+            stream.writeShort( PersisterEnums.PROCESS_INSTANCE );
+            writeProcessInstance( context,
+                                  (RuleFlowProcessInstance) processInstance );
+        }
+        stream.writeShort( PersisterEnums.END );
+    }
+
+    public static void writeProcessInstance(MarshallerWriteContext context,
+                                            RuleFlowProcessInstance processInstance) throws IOException {
+        ObjectOutputStream stream = context.stream;
+        stream.writeLong( processInstance.getId() );
+        stream.writeUTF( processInstance.getProcessId() );
+        stream.writeInt( processInstance.getState() );
+        stream.writeLong( processInstance.getNodeInstanceCounter() );
+
+        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 );
+                              }
+                          } );
+        stream.writeInt( keys.size() );
+        for ( String key : keys ) {
+            stream.writeUTF( key );
+            stream.writeObject( variables.get( key ) );
+        }
+
+        SwimlaneContextInstance swimlaneContextInstance = (SwimlaneContextInstance) processInstance.getContextInstance( SwimlaneContext.SWIMLANE_SCOPE );
+        Map<String, String> swimlaneActors = swimlaneContextInstance.getSwimlaneActors();
+        stream.writeInt( swimlaneActors.size() );
+        for ( Map.Entry<String, String> entry : swimlaneActors.entrySet() ) {
+            stream.writeUTF( entry.getKey() );
+            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());
+                              }
+                          } );
+        for ( NodeInstance nodeInstance : nodeInstances ) {
+            stream.writeShort( PersisterEnums.NODE_INSTANCE );
+            writeNodeInstance( context,
+                               nodeInstance );
+        }
+        stream.writeShort( PersisterEnums.END );
+    }
+
+    public static void writeNodeInstance(MarshallerWriteContext context,
+                                         NodeInstance nodeInstance) throws IOException {
+        ObjectOutputStream stream = context.stream;
+        stream.writeLong( nodeInstance.getId() );
+        stream.writeLong( nodeInstance.getNodeId() );
+        if ( nodeInstance instanceof RuleSetNodeInstance ) {
+            stream.writeShort( PersisterEnums.RULE_SET_NODE_INSTANCE );
+        } else if ( nodeInstance instanceof HumanTaskNodeInstance ) {
+            stream.writeShort( PersisterEnums.HUMAN_TASK_NODE_INSTANCE );
+            stream.writeLong( ((HumanTaskNodeInstance) nodeInstance).getWorkItem().getId() );
+        } else if ( nodeInstance instanceof WorkItemNodeInstance ) {
+            stream.writeShort( PersisterEnums.WORK_ITEM_NODE_INSTANCE );
+            stream.writeLong( ((WorkItemNodeInstance) nodeInstance).getWorkItem().getId() );
+        } else if ( nodeInstance instanceof SubProcessNodeInstance ) {
+            stream.writeShort( PersisterEnums.SUB_PROCESS_NODE_INSTANCE );
+            stream.writeLong( ((SubProcessNodeInstance) nodeInstance).getProcessInstanceId() );
+        } else if ( nodeInstance instanceof MilestoneNodeInstance ) {
+            stream.writeShort( PersisterEnums.MILESTONE_NODE_INSTANCE );
+            List<Long> timerInstances = 
+            	((MilestoneNodeInstance) nodeInstance).getTimerInstances();
+            if (timerInstances != null) {
+            	stream.writeInt(timerInstances.size());
+            	for (Long id: timerInstances) {
+            		stream.writeLong(id);
+            	}
+            } else {
+            	stream.writeInt(0);
+            }
+        } else if ( nodeInstance instanceof TimerNodeInstance ) {
+            stream.writeShort( PersisterEnums.TIMER_NODE_INSTANCE );
+            stream.writeLong( ((TimerNodeInstance) nodeInstance).getTimerId() );
+        } else if ( nodeInstance instanceof JoinInstance ) {
+            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 );
+                                  }
+                              } );
+            for ( Long key : keys ) {
+                stream.writeLong( 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 );
+            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 );
+                                  }
+                              } );
+            stream.writeInt( keys.size() );
+            for ( String key : keys ) {
+                stream.writeUTF( 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());
+                                  }
+                              } );
+            for ( NodeInstance subNodeInstance : nodeInstances ) {
+                stream.writeShort( PersisterEnums.NODE_INSTANCE );
+                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());
+                                  }
+                              } );
+            for ( NodeInstance subNodeInstance : nodeInstances ) {
+                if ( subNodeInstance instanceof CompositeContextNodeInstance ) {
+                    stream.writeShort( PersisterEnums.NODE_INSTANCE );
+                    writeNodeInstance( context,
+                                       subNodeInstance );
+                }
+            }
+            stream.writeShort( PersisterEnums.END );
+        } else {
+            // TODO ForEachNodeInstance
+            // TODO timer manager
+            throw new IllegalArgumentException( "Unknown node instance type: " + nodeInstance );
+        }
+    }
+
+    public static void writeWorkItems(MarshallerWriteContext context) throws IOException {
+        ObjectOutputStream stream = context.stream;
+
+        List<WorkItem> workItems = new ArrayList<WorkItem>(
+    		((WorkItemManager) 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,
+                           workItem );
+        }
+        stream.writeShort( PersisterEnums.END );
+    }
+
+    public static void writeWorkItem(MarshallerWriteContext context,
+                                     WorkItem workItem) throws IOException {
+        ObjectOutputStream stream = context.stream;
+        stream.writeLong( workItem.getId() );
+        stream.writeLong( workItem.getProcessInstanceId() );
+        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() );
+        }
+    }
+
+    public static void writeTimers(MarshallerWriteContext context) throws IOException {
+        ObjectOutputStream stream = context.stream;
+
+        TimerManager timerManager = context.wm.getTimerManager();
+        long timerId = timerManager.internalGetTimerId();
+        stream.writeLong( timerId );
+        
+        // need to think on how to fix this
+        // stream.writeObject( timerManager.getTimerService() );
+        
+        List<TimerInstance> timers = new ArrayList<TimerInstance>( timerManager.getTimers() );
+        Collections.sort( timers,
+                          new Comparator<TimerInstance>() {
+                              public int compare(TimerInstance o1,
+                                                 TimerInstance o2) {
+                                  return (int) (o2.getId() - o1.getId());
+                              }
+                          } );
+        for ( TimerInstance timer : timers ) {
+            stream.writeShort( PersisterEnums.TIMER );
+            writeTimer( context,
+                        timer );
+        }
+        stream.writeShort( PersisterEnums.END );
+    }
+
+    public static void writeTimer(MarshallerWriteContext context,
+                                  TimerInstance timer) throws IOException {
+        ObjectOutputStream stream = context.stream;
+        stream.writeLong( timer.getId() );
+        stream.writeLong( timer.getTimerId() );
+        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 );
+        }
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/OutputMarshaller.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterEnums.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterEnums.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterEnums.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterEnums.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,43 @@
+package org.drools.marshalling.impl;
+
+public class PersisterEnums {
+    public static final short REPEAT                 = 0;
+    public static final short END                    = 1;
+    public static final short FACT_HANDLE            = 2;
+    public static final short LEFT_TUPLE             = 3;
+    public static final short RIGHT_TUPLE            = 4;
+
+    public static final short INITIAL_FACT_NODE      = 5;
+    
+    public static final short LEFT_TUPLE_BLOCKED     = 6;
+    public static final short LEFT_TUPLE_NOT_BLOCKED = 7;
+
+    public static final short ACTIVATION             = 8;
+    public static final short PROPAGATION_CONTEXT    = 9;
+    
+    public static final short WORKING_MEMORY_ACTION  = 10;
+    
+    public static final short EQUALITY_KEY           = 11;
+    public static final short LOGICAL_DEPENDENCY     = 12; 
+    
+    public static final short AGENDA_GROUP           = 13;
+    public static final short ACTIVATION_GROUP       = 14;
+    
+    public static final short RULE_FLOW_GROUP        = 15;
+    public static final short RULE_FLOW_NODE         = 16;
+    
+    public static final short PROCESS_INSTANCE          = 17;
+    public static final short NODE_INSTANCE             = 18;
+    public static final short WORK_ITEM                 = 19;
+    public static final short RULE_SET_NODE_INSTANCE    = 20;
+    public static final short WORK_ITEM_NODE_INSTANCE   = 21;
+    public static final short SUB_PROCESS_NODE_INSTANCE = 22;
+    public static final short MILESTONE_NODE_INSTANCE   = 23;
+    public static final short TIMER_NODE_INSTANCE       = 24;
+    public static final short JOIN_NODE_INSTANCE        = 25;
+    public static final short COMPOSITE_NODE_INSTANCE   = 26;
+    public static final short HUMAN_TASK_NODE_INSTANCE  = 27;
+    public static final short FOR_EACH_NODE_INSTANCE    = 28;
+    public static final short TIMER                     = 29;
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterEnums.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterHelper.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterHelper.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterHelper.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterHelper.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,39 @@
+package org.drools.marshalling.impl;
+
+import java.io.IOException;
+
+import org.drools.common.WorkingMemoryAction;
+import org.drools.common.RuleFlowGroupImpl.DeactivateCallback;
+import org.drools.common.TruthMaintenanceSystem.LogicalRetractCallback;
+import org.drools.process.instance.event.DefaultSignalManager.SignalProcessInstanceAction;
+import org.drools.reteoo.PropagationQueuingNode.PropagateAction;
+import org.drools.reteoo.ReteooWorkingMemory.WorkingMemoryReteAssertAction;
+
+public class PersisterHelper {
+    public static WorkingMemoryAction readWorkingMemoryAction(MarshallerReaderContext context) throws IOException, ClassNotFoundException {
+        int type = context.readInt();
+        switch(type) {
+            case WorkingMemoryAction.WorkingMemoryReteAssertAction : {
+                return new WorkingMemoryReteAssertAction(context);
+            }
+            case WorkingMemoryAction.DeactivateCallback : {
+                return new DeactivateCallback(context);
+            }
+            case WorkingMemoryAction.PropagateAction : {
+                return new PropagateAction(context);
+            }
+            case WorkingMemoryAction.LogicalRetractCallback : {
+                return new LogicalRetractCallback(context);
+            }
+            
+            case WorkingMemoryAction.SignalProcessInstanceAction : {
+                return new SignalProcessInstanceAction(context);
+            }
+        }    
+        return null;
+    }
+    
+    public void write(MarshallerWriteContext context) throws IOException {
+        
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterHelper.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterKey.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterKey.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterKey.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterKey.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,7 @@
+package org.drools.marshalling.impl;
+
+public interface PersisterKey {
+   public boolean equal(Object object1, Object object2);
+   
+   public int hashCode(Object object);
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterKey.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/Placeholders.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/Placeholders.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/Placeholders.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/Placeholders.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,129 @@
+package org.drools.marshalling.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.util.AbstractHashTable;
+import org.drools.util.Entry;
+
+public class Placeholders extends AbstractHashTable {
+    private List<Object> ids;
+
+    public Placeholders() {
+        super();
+        this.ids = new ArrayList<Object>();
+    }
+    
+    public PlaceholderEntry lookupPlaceholder(Object object, PersisterKey key) {
+        final int hashCode = key.hashCode( object );
+        final int index = indexOf( hashCode,
+                                   this.table.length );
+        
+        PlaceholderEntry current = (PlaceholderEntry) this.table[index];
+        while ( current != null ) {
+            if ( hashCode == current.hashCode && current.key == key && key.equal( object,
+                                                                                  current.object ) ) {
+                return current;
+            }
+            current = (PlaceholderEntry) current.getNext();
+        }
+        return null;
+    }
+
+    public PlaceholderEntry assignPlaceholder(Object object,
+                                              PersisterKey key) {
+        final int hashCode = key.hashCode( object );
+        final int index = indexOf( hashCode,
+                                   this.table.length );
+
+        int id = ids.size();
+        this.ids.add( object );
+        PlaceholderEntry entry = new PlaceholderEntry( object,
+                                                       id,
+                                                       key );
+
+        entry.next = this.table[index];
+        this.table[index] = entry;
+
+        if ( this.size++ >= this.threshold ) {
+            resize( 2 * this.table.length );
+        }
+
+        return entry;
+    }
+
+    public Object lookupObject(int id) {
+        return this.ids.get( id );
+    }
+
+    public static class PlaceholderEntry
+        implements
+        Entry {
+
+        private static final long serialVersionUID = 400L;
+
+        public Object             object;
+
+        public int                id;
+
+        public PersisterKey       key;
+
+        public int                hashCode;
+
+        public Entry              next;
+
+        //        private LinkedList              list;
+
+        public PlaceholderEntry(final Object object,
+                                final int id,
+                                final PersisterKey key) {
+            this.object = object;
+            this.id = id;
+            this.key = key;
+            this.hashCode = key.hashCode( object );
+        }
+
+        //    public PlaceholderEntry(final InternalFactHandle handle,
+        //                            final int hashCode) {
+        //        this.handle = handle;
+        //        this.hashCode = hashCode;
+        //        //            this.list = new LinkedList();
+        //    }
+
+        public Entry getNext() {
+            return this.next;
+        }
+
+        public void setNext(final Entry next) {
+            this.next = next;
+        }
+
+        public int hashCode() {
+            return this.hashCode;
+        }
+
+        public String toString() {
+            return "Placeholder( object=" + this.object + " id = " + this.id + " hashcode=" + this.hashCode + " next=" + this.next + " )";
+        }
+
+        public Object getObject() {
+            return object;
+        }
+
+        public int getId() {
+            return id;
+        }
+
+        public PersisterKey getKey() {
+            return key;
+        }
+
+    }
+
+    @Override
+    public Entry getBucket(Object object) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/Placeholders.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ProcessInstanceMarshaller.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/ProcessInstanceMarshaller.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ProcessInstanceMarshaller.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ProcessInstanceMarshaller.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,39 @@
+package org.drools.marshalling.impl;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+
+import org.drools.runtime.process.NodeInstance;
+import org.drools.runtime.process.NodeInstanceContainer;
+import org.drools.runtime.process.ProcessInstance;
+import org.drools.workflow.instance.WorkflowProcessInstance;
+import org.drools.workflow.instance.impl.NodeInstanceImpl;
+
+/**
+ * A ProcessInstanceMarshaller must contain all the write/read logic for nodes
+ * of a specific ProcessInstance. It colaborates with OutputMarshaller and
+ * InputMarshaller, that delegates in a ProcessInstanceMarshaller to stream in/out runtime
+ * information.
+ * 
+ * @see OutPutMarshaller
+ * @see InputMarshaller
+ * @see ProcessMarshallerRegistry
+ * 
+ * @author mfossati, salaboy
+ */
+
+public interface ProcessInstanceMarshaller {
+
+	public void writeProcessInstance(MarshallerWriteContext context,
+			ProcessInstance processInstance) throws IOException;
+
+	public void writeNodeInstance(MarshallerWriteContext context,
+			NodeInstance nodeInstance) throws IOException;
+
+	public ProcessInstance readProcessInstance(MarshallerReaderContext context)
+			throws IOException;
+
+	public NodeInstance readNodeInstance(MarshallerReaderContext context,
+			NodeInstanceContainer nodeInstanceContainer,
+			WorkflowProcessInstance processInstance) throws IOException;
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ProcessInstanceMarshaller.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ProcessMarshallerRegistry.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/ProcessMarshallerRegistry.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ProcessMarshallerRegistry.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ProcessMarshallerRegistry.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,38 @@
+package org.drools.marshalling.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.process.instance.impl.ProcessInstanceImpl;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.drools.ruleflow.instance.RuleFlowProcessInstance;
+
+/**
+* Registry for Process/ProcessMarshaller
+*/
+public class ProcessMarshallerRegistry {
+
+	public static ProcessMarshallerRegistry INSTANCE = new ProcessMarshallerRegistry();
+
+	private Map<String , ProcessInstanceMarshaller> registry;
+
+	private ProcessMarshallerRegistry() {
+		 this.registry = new HashMap<String, ProcessInstanceMarshaller >();
+
+	        // default logic that used to be in OutPutMarshaller:
+	        register( RuleFlowProcess.RULEFLOW_TYPE,
+	                  RuleFlowProcessInstanceMarshaller.INSTANCE );
+	}
+
+	public void register(String cls,
+			ProcessInstanceMarshaller marchaller) {
+		this.registry.put(cls, marchaller);
+	}
+	
+	@SuppressWarnings("unchecked")
+	public ProcessInstanceMarshaller getMarshaller(String type) {
+		return this.registry.get(type);
+	}
+	
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ProcessMarshallerRegistry.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/RightTupleKey.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/RightTupleKey.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/RightTupleKey.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/RightTupleKey.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,48 @@
+/**
+ * 
+ */
+package org.drools.marshalling.impl;
+
+import org.drools.reteoo.Sink;
+
+public class RightTupleKey {
+    private final int  id;
+    private final Sink sink;
+
+    public RightTupleKey(int id,
+                         Sink sink) {
+        super();
+        this.id = id;
+        this.sink = sink;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public Sink getSink() {
+        return sink;
+    }
+
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + id;
+        result = prime * result + sink.getId();
+        return result;
+    }
+
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( getClass() != obj.getClass() ) return false;
+        
+        final RightTupleKey other = (RightTupleKey) obj;
+        if ( id != other.id ) return false;
+        if ( sink == null ) {
+            if ( other.sink != null ) return false;
+        } else if ( sink.getId() != other.sink.getId() ) return false;
+        return true;
+    }
+
+}
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/RightTupleKey.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/RuleBaseNodes.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/RuleBaseNodes.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/RuleBaseNodes.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/RuleBaseNodes.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,79 @@
+package org.drools.marshalling.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.common.BaseNode;
+import org.drools.common.InternalRuleBase;
+import org.drools.reteoo.LeftTupleSink;
+import org.drools.reteoo.LeftTupleSource;
+import org.drools.reteoo.ObjectSink;
+import org.drools.reteoo.ObjectSource;
+import org.drools.reteoo.ObjectTypeNode;
+import org.drools.reteoo.RuleTerminalNode;
+
+public class RuleBaseNodes {
+    public static Map<Integer, BaseNode> getNodeMap(InternalRuleBase ruleBase) {        
+        Map<Integer, BaseNode> nodes = new HashMap<Integer, BaseNode>();
+        buildNodeMap( ruleBase, nodes );
+        return nodes;
+    }
+    
+    private static void buildNodeMap(InternalRuleBase ruleBase,
+                                     Map<Integer, BaseNode> nodes) {
+        for ( ObjectTypeNode sink : ruleBase.getRete().getObjectTypeNodes() ) {
+            nodes.put( sink.getId(),
+                       sink );
+            addObjectSink( ruleBase,
+                           sink,
+                           nodes );
+        }
+    }
+
+    private static void addObjectSink(InternalRuleBase ruleBase,
+                                     ObjectSink sink,
+                                     Map<Integer, BaseNode> nodes) {
+        // we don't need to store alpha nodes, as they have no state to serialise
+        if ( sink instanceof LeftTupleSource ) {
+            LeftTupleSource node = (LeftTupleSource) sink;
+            for ( LeftTupleSink leftTupleSink : node.getSinkPropagator().getSinks() ) {
+                addLeftTupleSink( ruleBase,
+                                  leftTupleSink,
+                                  nodes );
+            }
+        } else {
+            ObjectSource node = ( ObjectSource ) sink;
+            for ( ObjectSink objectSink : node.getSinkPropagator().getSinks() ) {
+                addObjectSink( ruleBase,
+                               objectSink,
+                               nodes );
+            }
+        }
+    }
+
+    private static void addLeftTupleSink(InternalRuleBase ruleBase,
+                                        LeftTupleSink sink,
+                                        Map<Integer, BaseNode> nodes) {
+        if ( sink instanceof LeftTupleSource ) {
+            nodes.put( sink.getId(),
+                       (LeftTupleSource) sink );            
+            for ( LeftTupleSink leftTupleSink : ((LeftTupleSource) sink).getSinkPropagator().getSinks() ) {                
+                addLeftTupleSink( ruleBase,
+                                  leftTupleSink,
+                                  nodes );
+            }
+        } else if ( sink instanceof ObjectSource ) { 
+            // it may be a RIAN
+            nodes.put( sink.getId(), 
+                       (ObjectSource) sink );
+            for ( ObjectSink objectSink : ((ObjectSource)sink).getSinkPropagator().getSinks() ) {
+                addObjectSink( ruleBase,
+                               objectSink,
+                               nodes );
+            }
+        } else if ( sink instanceof RuleTerminalNode ) {
+            nodes.put( sink.getId(),
+                       (RuleTerminalNode) sink );
+        }
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/RuleBaseNodes.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/RuleFlowProcessInstanceMarshaller.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/RuleFlowProcessInstanceMarshaller.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/RuleFlowProcessInstanceMarshaller.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/RuleFlowProcessInstanceMarshaller.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,85 @@
+package org.drools.marshalling.impl;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+
+import org.drools.common.InternalRuleBase;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.process.core.context.swimlane.SwimlaneContext;
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.instance.context.swimlane.SwimlaneContextInstance;
+import org.drools.process.instance.context.variable.VariableScopeInstance;
+import org.drools.ruleflow.instance.RuleFlowProcessInstance;
+import org.drools.runtime.process.NodeInstance;
+import org.drools.runtime.process.ProcessInstance;
+import org.drools.workflow.instance.impl.NodeInstanceImpl;
+
+/**
+ * Marshaller class for RuleFlowProcessInstances
+ * 
+ * @author mfossati
+ */
+
+public class RuleFlowProcessInstanceMarshaller extends
+		AbstractProcessInstanceMarshaller {
+
+	public static RuleFlowProcessInstanceMarshaller INSTANCE = new RuleFlowProcessInstanceMarshaller();
+
+	private RuleFlowProcessInstanceMarshaller() {
+	}
+
+	public ProcessInstance readProcessInstance(MarshallerReaderContext context)
+			throws IOException {
+		ObjectInputStream stream = context.stream;
+		InternalRuleBase ruleBase = context.ruleBase;
+		InternalWorkingMemory wm = context.wm;
+
+		RuleFlowProcessInstance processInstance = new RuleFlowProcessInstance();
+		processInstance.setId(stream.readLong());
+		String processId = stream.readUTF();
+		processInstance.setProcessId(processId);
+		if (ruleBase != null) {
+			processInstance.setProcess(ruleBase.getProcess(processId));
+		}
+		processInstance.setState(stream.readInt());
+		long nodeInstanceCounter = stream.readLong();
+		processInstance.setWorkingMemory(wm);
+
+		int nbVariables = stream.readInt();
+		if (nbVariables > 0) {
+			VariableScopeInstance variableScopeInstance = (VariableScopeInstance) processInstance
+					.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);
+				}
+			}
+		}
+
+		int nbSwimlanes = stream.readInt();
+		if (nbSwimlanes > 0) {
+			SwimlaneContextInstance swimlaneContextInstance = (SwimlaneContextInstance) processInstance
+					.getContextInstance(SwimlaneContext.SWIMLANE_SCOPE);
+			for (int i = 0; i < nbSwimlanes; i++) {
+				String name = stream.readUTF();
+				String value = stream.readUTF();
+				swimlaneContextInstance.setActorId(name, value);
+			}
+		}
+
+		while (stream.readShort() == PersisterEnums.NODE_INSTANCE) {
+			readNodeInstance(context, processInstance, processInstance);
+		}
+
+		processInstance.internalSetNodeInstanceCounter(nodeInstanceCounter);
+		if (wm != null) {
+			processInstance.reconnect();
+		}
+		return processInstance;
+	}
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/RuleFlowProcessInstanceMarshaller.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/SerializablePlaceholderResolverStrategy.java (from rev 25382, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/SerializablePlaceholderResolverStrategy.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/SerializablePlaceholderResolverStrategy.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/SerializablePlaceholderResolverStrategy.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -0,0 +1,44 @@
+package org.drools.marshalling.impl;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.drools.marshalling.ObjectMarshallingStrategy;
+import org.drools.marshalling.ObjectMarshallingStrategyAcceptor;
+
+public class SerializablePlaceholderResolverStrategy
+    implements
+    ObjectMarshallingStrategy {
+
+    private int index;
+    
+    private ObjectMarshallingStrategyAcceptor acceptor;
+    
+    public SerializablePlaceholderResolverStrategy(ObjectMarshallingStrategyAcceptor acceptor) {
+        this.acceptor = acceptor;
+    }
+    
+    public int getIndex() {
+        return this.index;
+    }
+
+    public void setIndex(int index) {
+        this.index = index;
+    }    
+
+    public Object read(ObjectInputStream os) throws IOException,
+                                                       ClassNotFoundException {
+        return  os.readObject();
+    }
+
+    public void write(ObjectOutputStream os,
+                      Object object) throws IOException {
+        os.writeObject( object );
+    }
+
+    public boolean accept(Object object) {
+        return acceptor.accept( object );
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/SerializablePlaceholderResolverStrategy.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/DefaultSignalManager.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/DefaultSignalManager.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/DefaultSignalManager.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -11,8 +11,8 @@
 import org.drools.WorkingMemory;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.WorkingMemoryAction;
-import org.drools.marshalling.MarshallerReaderContext;
-import org.drools.marshalling.MarshallerWriteContext;
+import org.drools.marshalling.impl.MarshallerReaderContext;
+import org.drools.marshalling.impl.MarshallerWriteContext;
 import org.drools.runtime.process.EventListener;
 import org.drools.runtime.process.ProcessInstance;
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -29,8 +29,8 @@
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.NodeMemory;
 import org.drools.common.WorkingMemoryAction;
-import org.drools.marshalling.MarshallerReaderContext;
-import org.drools.marshalling.MarshallerWriteContext;
+import org.drools.marshalling.impl.MarshallerReaderContext;
+import org.drools.marshalling.impl.MarshallerWriteContext;
 import org.drools.reteoo.builder.BuildContext;
 import org.drools.spi.PropagationContext;
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -16,9 +16,11 @@
  * limitations under the License.
  */
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.ObjectInput;
+import java.io.ObjectInputStream;
 import java.io.ObjectOutput;
 import java.io.OutputStream;
 import java.util.ArrayList;
@@ -42,13 +44,17 @@
 import org.drools.concurrent.ExecutorService;
 import org.drools.event.RuleBaseEventListener;
 import org.drools.impl.EnvironmentFactory;
+import org.drools.impl.KnowledgeBaseImpl;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
 import org.drools.marshalling.Marshaller;
+import org.drools.marshalling.MarshallerFactory;
 import org.drools.reteoo.ReteooWorkingMemory.WorkingMemoryReteAssertAction;
 import org.drools.rule.EntryPoint;
 import org.drools.rule.InvalidPatternException;
 import org.drools.rule.Package;
 import org.drools.rule.Rule;
 import org.drools.runtime.Environment;
+import org.drools.runtime.StatefulKnowledgeSession;
 import org.drools.FactHandle;
 import org.drools.spi.ExecutorServiceFactory;
 import org.drools.spi.FactHandleFactory;
@@ -96,7 +102,7 @@
         this( id,
               null,
               new ReteooFactHandleFactory() );
-        
+
     }
 
     /**
@@ -234,20 +240,72 @@
                                  context,
                                  workingMemory );
     }
-    
 
     public synchronized StatefulSession newStatefulSession(boolean keepReference) {
         SessionConfiguration config = new SessionConfiguration();
         config.setKeepReference( keepReference );
-                       
-        return newStatefulSession( config, EnvironmentFactory.newEnvironment() );
+
+        return newStatefulSession( config,
+                                   EnvironmentFactory.newEnvironment() );
     }
-    
-    public synchronized StatefulSession newStatefulSession(final SessionConfiguration sessionConfig, final Environment environment) {
-        return newStatefulSession( nextWorkingMemoryCounter(), sessionConfig, environment );
+
+    public synchronized StatefulSession newStatefulSession(java.io.InputStream stream) {
+        return newStatefulSession( stream,
+                                   true );
     }
-    
-    public synchronized StatefulSession newStatefulSession(int id, final SessionConfiguration sessionConfig, final Environment environment) {
+
+    public synchronized StatefulSession newStatefulSession(java.io.InputStream stream,
+                                                           boolean keepReference) {
+        StatefulSession session = null;
+        try {
+            // first unwrap the byte[]
+            ObjectInputStream ois = new ObjectInputStream( stream );
+
+            // standard serialisation would have written the statateful session instance info to the stream first
+            // so we read it, but we don't need it, so just ignore.
+            ReteooStatefulSession rsession = (ReteooStatefulSession) ois.readObject();
+
+            // now unmarshall that byte[]
+            ByteArrayInputStream bais = new ByteArrayInputStream( rsession.bytes );
+            Marshaller marshaller = MarshallerFactory.newMarshaller( new KnowledgeBaseImpl( this ) );
+            StatefulKnowledgeSession ksession = marshaller.unmarshall( bais,
+                                                                       new SessionConfiguration(),
+                                                                       EnvironmentFactory.newEnvironment() );
+            session = (StatefulSession) ((StatefulKnowledgeSessionImpl) ksession).session;
+
+            if ( keepReference ) {
+                super.addStatefulSession( session );
+                for ( Iterator it = session.getRuleBaseUpdateListeners().iterator(); it.hasNext(); ) {
+                    addEventListener( (RuleBaseEventListener) it.next() );
+                }
+            }
+
+            bais.close();
+
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to unmarshall session",
+                                        e );
+        } finally {
+            try {
+                stream.close();
+            } catch ( IOException e ) {
+                new RuntimeException( "Unable to close stream",
+                                      e );
+            }
+        }
+        return session;
+    }
+
+    public synchronized StatefulSession newStatefulSession(final SessionConfiguration sessionConfig,
+                                                           final Environment environment) {
+        return newStatefulSession( nextWorkingMemoryCounter(),
+                                   sessionConfig,
+                                   environment );
+    }
+
+    public synchronized StatefulSession newStatefulSession(int id,
+                                                           final SessionConfiguration sessionConfig,
+                                                           final Environment environment) {
         if ( this.config.isSequential() ) {
             throw new RuntimeException( "Cannot have a stateful rule session, with sequential configuration set to true" );
         }
@@ -282,95 +340,95 @@
         return session;
     }
 
-    public StatefulSession readStatefulSession(final InputStream stream,
-                                               final boolean keepReference,
-                                               final Marshaller marshaller,
-                                               final SessionConfiguration sessionConfig,
-                                               Environment environment ) throws IOException,
-                                                                          ClassNotFoundException {
+    //    public StatefulSession readStatefulSession(final InputStream stream,
+    //                                               final boolean keepReference,
+    //                                               final Marshaller marshaller,
+    //                                               final SessionConfiguration sessionConfig,
+    //                                               Environment environment ) throws IOException,
+    //                                                                          ClassNotFoundException {
+    //
+    //        if ( this.config.isSequential() ) {
+    //            throw new RuntimeException( "Cannot have a stateful rule session, with sequential configuration set to true" );
+    //        }
+    //
+    ////        PlaceholderResolverStrategyFactory factory = new PlaceholderResolverStrategyFactory();
+    ////        factory.addPlaceholderResolverStrategy( new SerializablePlaceholderResolverStrategy() );
+    //
+    //        StatefulSession session = null;
+    //        synchronized ( this.pkgs ) {
+    //           // ExecutorService executor = ExecutorServiceFactory.createExecutorService( this.config.getExecutorService() );
+    //            
+    //            session = ( StatefulSession ) ((StatefulKnowledgeSessionImpl)marshaller.unmarshall( stream, sessionConfig, environment )).session;
+    //
+    ////            WMSerialisationInContext context = new WMSerialisationInContext( stream,
+    ////                                                                             this,
+    ////                                                                             RuleBaseNodes.getNodeMap( this ),
+    ////                                                                             factory );
+    ////
+    ////            session = InputPersister.readSession( context, nextWorkingMemoryCounter(), executor );
+    //
+    //            // executor.setCommandExecutor( new CommandExecutor( session ) );
+    //
+    //
+    //            if ( keepReference ) {
+    //                super.addStatefulSession( session );
+    //                for ( Iterator it = session.getRuleBaseUpdateListeners().iterator(); it.hasNext(); ) {
+    //                    addEventListener( (RuleBaseEventListener) it.next() );
+    //                }
+    //            }
+    //        }
+    //        return session;
+    //
+    //        //        final DroolsObjectInputStream streamWithLoader = new DroolsObjectInputStream( stream,
+    //        //                                                                                      this.packageClassLoader );
+    //        //        streamWithLoader.setRuleBase( this );
+    //        //
+    //        //        final StatefulSession session = (StatefulSession) streamWithLoader.readObject();
+    //        //
+    //        //        synchronized ( this.pkgs ) {
+    //        //            ((InternalWorkingMemory) session).setRuleBase( this );
+    //        //            ((InternalWorkingMemory) session).setId( (nextWorkingMemoryCounter()) );
+    //        //
+    //        //            ExecutorService executor = ExecutorServiceFactory.createExecutorService( this.config.getExecutorService() );
+    //        //            executor.setCommandExecutor( new CommandExecutor( session ) );
+    //        //            ((InternalWorkingMemory) session).setExecutorService( executor );
+    //        //
+    //        //            if ( keepReference ) {
+    //        //                addStatefulSession( session );
+    //        //                for ( Iterator it = session.getRuleBaseUpdateListeners().iterator(); it.hasNext(); ) {
+    //        //                    addEventListener( (RuleBaseEventListener) it.next() );
+    //        //                }
+    //        //            }
+    //        //
+    //        //            return session;
+    //        //        }
+    //    }
+    //
+    //    public void writeStatefulSession(final StatefulSession session,
+    //                                     final OutputStream stream,
+    //                                     Marshaller marshaller) throws IOException {
+    //        
+    ////        PlaceholderResolverStrategyFactory factory = new PlaceholderResolverStrategyFactory();
+    ////        factory.addPlaceholderResolverStrategy( new SerializablePlaceholderResolverStrategy() );
+    ////
+    ////        WMSerialisationOutContext context = new WMSerialisationOutContext( stream,
+    ////                                                                           this,
+    ////                                                                           (InternalWorkingMemory) session,
+    ////                                                                           RuleBaseNodes.getNodeMap( this ),
+    ////                                                                           factory );
+    ////        OutputPersister.writeSession( context );
+    //        marshaller.marshall( stream, session );
+    //        //((ReteooStatefulSession) session).write( context );
+    //        
+    //
+    //        //        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    //        //        OutputPersister op = new OutputPersister( this,
+    //        //                                                  (InternalWorkingMemory) wm,
+    //        //                                                  baos,
+    //        //                                                  factory );
+    //        //        op.write();
+    //    }
 
-        if ( this.config.isSequential() ) {
-            throw new RuntimeException( "Cannot have a stateful rule session, with sequential configuration set to true" );
-        }
-
-//        PlaceholderResolverStrategyFactory factory = new PlaceholderResolverStrategyFactory();
-//        factory.addPlaceholderResolverStrategy( new SerializablePlaceholderResolverStrategy() );
-
-        StatefulSession session = null;
-        synchronized ( this.pkgs ) {
-            ExecutorService executor = ExecutorServiceFactory.createExecutorService( this.config.getExecutorService() );
-            
-            session = marshaller.read( stream, this, nextWorkingMemoryCounter(), executor, sessionConfig, environment );
-
-//            WMSerialisationInContext context = new WMSerialisationInContext( stream,
-//                                                                             this,
-//                                                                             RuleBaseNodes.getNodeMap( this ),
-//                                                                             factory );
-//
-//            session = InputPersister.readSession( context, nextWorkingMemoryCounter(), executor );
-
-            executor.setCommandExecutor( new CommandExecutor( session ) );
-
-
-            if ( keepReference ) {
-                super.addStatefulSession( session );
-                for ( Iterator it = session.getRuleBaseUpdateListeners().iterator(); it.hasNext(); ) {
-                    addEventListener( (RuleBaseEventListener) it.next() );
-                }
-            }
-        }
-        return session;
-
-        //        final DroolsObjectInputStream streamWithLoader = new DroolsObjectInputStream( stream,
-        //                                                                                      this.packageClassLoader );
-        //        streamWithLoader.setRuleBase( this );
-        //
-        //        final StatefulSession session = (StatefulSession) streamWithLoader.readObject();
-        //
-        //        synchronized ( this.pkgs ) {
-        //            ((InternalWorkingMemory) session).setRuleBase( this );
-        //            ((InternalWorkingMemory) session).setId( (nextWorkingMemoryCounter()) );
-        //
-        //            ExecutorService executor = ExecutorServiceFactory.createExecutorService( this.config.getExecutorService() );
-        //            executor.setCommandExecutor( new CommandExecutor( session ) );
-        //            ((InternalWorkingMemory) session).setExecutorService( executor );
-        //
-        //            if ( keepReference ) {
-        //                addStatefulSession( session );
-        //                for ( Iterator it = session.getRuleBaseUpdateListeners().iterator(); it.hasNext(); ) {
-        //                    addEventListener( (RuleBaseEventListener) it.next() );
-        //                }
-        //            }
-        //
-        //            return session;
-        //        }
-    }
-
-    public void writeStatefulSession(final StatefulSession session,
-                                     final OutputStream stream,
-                                     Marshaller marshaller) throws IOException {
-        
-//        PlaceholderResolverStrategyFactory factory = new PlaceholderResolverStrategyFactory();
-//        factory.addPlaceholderResolverStrategy( new SerializablePlaceholderResolverStrategy() );
-//
-//        WMSerialisationOutContext context = new WMSerialisationOutContext( stream,
-//                                                                           this,
-//                                                                           (InternalWorkingMemory) session,
-//                                                                           RuleBaseNodes.getNodeMap( this ),
-//                                                                           factory );
-//        OutputPersister.writeSession( context );
-        marshaller.write( stream, this, session );
-        //((ReteooStatefulSession) session).write( context );
-        
-
-        //        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        //        OutputPersister op = new OutputPersister( this,
-        //                                                  (InternalWorkingMemory) wm,
-        //                                                  baos,
-        //                                                  factory );
-        //        op.write();
-    }
-
     public StatelessSession newStatelessSession() {
 
         //orders the rules
@@ -396,14 +454,14 @@
         // may start in 0
         return this.reteooBuilder.getIdGenerator().getLastId() + 1;
     }
-    
-    public void addPackages(Package[] pkgs ) {
+
+    public void addPackages(Package[] pkgs) {
         addPackages( Arrays.asList( pkgs ) );
     }
-    
-    public void addPackages(Collection<Package> pkgs ) {
+
+    public void addPackages(Collection<Package> pkgs) {
         super.addPackages( pkgs );
-    }    
+    }
 
     public synchronized void addPackage(final Package newPkg) {
         List<Package> list = new ArrayList<Package>();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatefulSession.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatefulSession.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatefulSession.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,5 +1,13 @@
 package org.drools.reteoo;
 
+import java.io.ByteArrayOutputStream;
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -16,6 +24,10 @@
 import org.drools.concurrent.RetractObject;
 import org.drools.concurrent.UpdateObject;
 import org.drools.impl.EnvironmentFactory;
+import org.drools.impl.KnowledgeBaseImpl;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
+import org.drools.marshalling.Marshaller;
+import org.drools.marshalling.MarshallerFactory;
 import org.drools.FactHandle;
 import org.drools.runtime.Environment;
 import org.drools.spi.AgendaFilter;
@@ -25,13 +37,18 @@
 
 public class ReteooStatefulSession extends ReteooWorkingMemory
     implements
-    StatefulSession {
+    StatefulSession,
+    Externalizable {
 
     private static final long         serialVersionUID = -5360554247241558374L;
     private transient ExecutorService executor;
 
     private transient List            ruleBaseListeners;
-
+    
+    public ReteooStatefulSession() {
+        super();
+    }
+    
     public ReteooStatefulSession(final int id,
                                  final InternalRuleBase ruleBase,
                                  final ExecutorService executorService) {
@@ -73,7 +90,29 @@
                environment );
         this.executor = executorService;
     }
+    
+    public byte[] bytes;
+    
+    public void writeExternal(ObjectOutput out) throws IOException {
+        // all we do is create marshall to a byte[] and write to the stream
+        StatefulKnowledgeSessionImpl ksession = new StatefulKnowledgeSessionImpl( this );
+        Marshaller marshaller = MarshallerFactory.newMarshaller( ksession.getKnowledgeBase() );
+        
+        ByteArrayOutputStream stream = new ByteArrayOutputStream();
+        marshaller.marshall( stream, ksession );
+        stream.close();
+        
+        byte[] bytes = stream.toByteArray();
+        out.writeInt( bytes.length );
+        out.write( bytes );  
+    }
 
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        bytes = new byte[ in.readInt() ];
+        in.readFully( bytes );
+    }
+
     public Future asyncInsert(final Object object) {
         final AssertObject assertObject = new AssertObject( object );
         this.executor.submit( assertObject );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -36,8 +36,8 @@
 import org.drools.common.PropagationContextImpl;
 import org.drools.common.WorkingMemoryAction;
 import org.drools.impl.EnvironmentFactory;
-import org.drools.marshalling.MarshallerReaderContext;
-import org.drools.marshalling.MarshallerWriteContext;
+import org.drools.marshalling.impl.MarshallerReaderContext;
+import org.drools.marshalling.impl.MarshallerWriteContext;
 import org.drools.rule.EntryPoint;
 import org.drools.rule.Package;
 import org.drools.rule.Query;
@@ -59,6 +59,10 @@
      *
      */
     private static final long serialVersionUID = 400L;
+    
+    public ReteooWorkingMemory() {
+        super();
+    }
 
     public ReteooWorkingMemory(final int id,
                                final InternalRuleBase ruleBase) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/SlidingTimeWindow.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/SlidingTimeWindow.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/SlidingTimeWindow.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -29,7 +29,7 @@
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.PropagationContextImpl;
 import org.drools.common.WorkingMemoryAction;
-import org.drools.marshalling.MarshallerWriteContext;
+import org.drools.marshalling.impl.MarshallerWriteContext;
 import org.drools.reteoo.RightTuple;
 import org.drools.spi.PropagationContext;
 import org.drools.time.Job;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ClassUtils.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ClassUtils.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ClassUtils.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -215,7 +215,7 @@
         } else if ( STAR.equals( object ) ) {
             return false;
         } else if ( patterns.containsKey( "*" ) ) {
-            // for now we assume if the name space is * then we have a catchal *.* pattern
+            // for now we assume if the name space is * then we have a catchall *.* pattern
             return true;
         } else {
             List list = (List) object;

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -20,11 +20,11 @@
 import javax.persistence.Transient;
 import javax.persistence.Version;
 
-import org.drools.marshalling.MarshallerReaderContext;
-import org.drools.marshalling.MarshallerWriteContext;
-import org.drools.marshalling.ProcessInstanceMarshaller;
-import org.drools.marshalling.ProcessMarshallerRegistry;
-import org.drools.marshalling.RuleFlowProcessInstanceMarshaller;
+import org.drools.marshalling.impl.MarshallerReaderContext;
+import org.drools.marshalling.impl.MarshallerWriteContext;
+import org.drools.marshalling.impl.ProcessInstanceMarshaller;
+import org.drools.marshalling.impl.ProcessMarshallerRegistry;
+import org.drools.marshalling.impl.RuleFlowProcessInstanceMarshaller;
 import org.drools.process.instance.impl.ProcessInstanceImpl;
 import org.drools.ruleflow.instance.RuleFlowProcessInstance;
 import org.drools.runtime.process.ProcessInstance;

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -15,10 +15,10 @@
 import javax.persistence.Transient;
 import javax.persistence.Version;
 
-import org.drools.marshalling.InputMarshaller;
-import org.drools.marshalling.MarshallerReaderContext;
-import org.drools.marshalling.MarshallerWriteContext;
-import org.drools.marshalling.OutputMarshaller;
+import org.drools.marshalling.impl.InputMarshaller;
+import org.drools.marshalling.impl.MarshallerReaderContext;
+import org.drools.marshalling.impl.MarshallerWriteContext;
+import org.drools.marshalling.impl.OutputMarshaller;
 import org.drools.process.instance.WorkItem;
 
 @Entity

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPASessionMarshallingHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPASessionMarshallingHelper.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPASessionMarshallingHelper.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -4,23 +4,23 @@
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
-import org.drools.RuleBase;
-import org.drools.SessionConfiguration;
-import org.drools.StatefulSession;
-import org.drools.common.InternalRuleBase;
-import org.drools.marshalling.DefaultMarshaller;
+import org.drools.KnowledgeBase;
 import org.drools.marshalling.Marshaller;
-import org.drools.marshalling.MarshallingConfiguration;
+import org.drools.marshalling.MarshallerFactory;
+import org.drools.marshalling.ObjectMarshallingStrategy;
 import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
+import org.drools.runtime.KnowledgeSessionConfiguration;
+import org.drools.runtime.StatefulKnowledgeSession;
 
 public class JPASessionMarshallingHelper {
 
-    private RuleBase             ruleBase;
-    private SessionConfiguration conf;
-    private StatefulSession      session;
-    private Marshaller           marshaller;
-    private Environment          environment;
-    
+    private KnowledgeBase                 kbase;
+    private KnowledgeSessionConfiguration conf;
+    private StatefulKnowledgeSession      ksession;
+    private Marshaller                    marshaller;
+    private Environment                   env;
+
     /**
      * Exist Info, so load session from here
      * @param info
@@ -29,19 +29,24 @@
      * @param marshallingConfiguration
      */
     public JPASessionMarshallingHelper(SessionInfo info,
-                                      RuleBase    ruleBase,
-                                      SessionConfiguration conf,
-                                      MarshallingConfiguration marshallingConfiguration,
-                                      Environment environment) {   
-        this.ruleBase = ruleBase;
+                                       KnowledgeBase kbase,
+                                       KnowledgeSessionConfiguration conf,
+                                       Environment env) {
+        this.kbase = kbase;
         this.conf = conf;
-        this.environment = environment;
-        this.marshaller = new DefaultMarshaller( ((InternalRuleBase) ruleBase).getConfiguration(),
-                                                 marshallingConfiguration );
-        loadSnapshot( info.getData() );       
-        info.setJPASessionMashallingHelper( this );         
-    }    
+        this.env = env;
+        ObjectMarshallingStrategy[] strategies = (ObjectMarshallingStrategy[]) env.get( EnvironmentName.OBJECT_MARSHALLING_STRATEGIES );
+        if (strategies  != null ) {
+            // use strategies if provided in the environment
+            this.marshaller = MarshallerFactory.newMarshaller( kbase, strategies );
+        } else {
+            this.marshaller = MarshallerFactory.newMarshaller( kbase ) ;  
+        }
 
+        loadSnapshot( info.getData() );
+        info.setJPASessionMashallingHelper( this );
+    }
+
     /** 
      * new session, don't write now as info will request it on update callback
      * @param info
@@ -49,23 +54,27 @@
      * @param conf
      * @param marshallingConfiguration
      */
-    public JPASessionMarshallingHelper(StatefulSession session,
-                                      SessionConfiguration conf,
-                                      MarshallingConfiguration marshallingConfiguration) {   
-        this.session = session;     
-        this.ruleBase = session.getRuleBase();
-        this.environment = session.getEnvironment();
+    public JPASessionMarshallingHelper(StatefulKnowledgeSession ksession,
+                                       KnowledgeSessionConfiguration conf) {
+        this.ksession = ksession;
+        this.kbase = ksession.getKnowledgeBase();
         this.conf = conf;
-        this.marshaller = new DefaultMarshaller( ((InternalRuleBase) ruleBase).getConfiguration(),
-                                                 marshallingConfiguration );   
+        this.env = ksession.getEnvironment();
+        ObjectMarshallingStrategy[] strategies = (ObjectMarshallingStrategy[]) this.env.get( EnvironmentName.OBJECT_MARSHALLING_STRATEGIES );
+        if (strategies  != null ) {
+            // use strategies if provided in the environment
+            this.marshaller = MarshallerFactory.newMarshaller( kbase, strategies );
+        } else {
+            this.marshaller = MarshallerFactory.newMarshaller( kbase ) ;  
+        }
+        
     }
 
     public byte[] getSnapshot() {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         try {
-            marshaller.write( baos,
-                              (InternalRuleBase) ruleBase,
-                              session );
+            marshaller.marshall( baos,
+                                 ksession );
         } catch ( IOException e ) {
             throw new RuntimeException( "Unable to get session snapshot",
                                         e );
@@ -74,39 +83,40 @@
         return baos.toByteArray();
     }
 
-    public StatefulSession loadSnapshot(byte[] bytes,
-                                        StatefulSession session) {
-        this.session = session;
+    public StatefulKnowledgeSession loadSnapshot(byte[] bytes,
+                                                 StatefulKnowledgeSession ksession) {
+        this.ksession = ksession;
         ByteArrayInputStream bais = new ByteArrayInputStream( bytes );
         try {
-            marshaller.read( bais,
-                             (InternalRuleBase) ruleBase,
-                             session );
+            this.marshaller.unmarshall( bais,
+                                        ksession );
         } catch ( Exception e ) {
             throw new RuntimeException( "Unable to load session snapshot",
                                         e );
         }
-        return this.session;
+        return this.ksession;
     }
 
-    public StatefulSession loadSnapshot(byte[] bytes) {
+    public StatefulKnowledgeSession loadSnapshot(byte[] bytes) {
         try {
             ByteArrayInputStream bais = new ByteArrayInputStream( bytes );
-            if ( this.session == null ) {
-                this.session = this.ruleBase.readStatefulSession( bais, true, marshaller, conf, environment );
+            if ( this.ksession == null ) {
+                this.ksession = this.marshaller.unmarshall( bais,
+                                                            this.conf,
+                                                            this.env );
             } else {
                 loadSnapshot( bytes,
-                              this.session );
+                              this.ksession );
             }
         } catch ( Exception e ) {
             throw new RuntimeException( "Unable to load session snapshot",
                                         e );
         }
-        return this.session;
+        return this.ksession;
     }
 
-    public StatefulSession getObject() {
-        return session;
+    public StatefulKnowledgeSession getObject() {
+        return ksession;
     }
 
 }

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SessionInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SessionInfo.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SessionInfo.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -15,7 +15,7 @@
 import javax.persistence.Transient;
 import javax.persistence.Version;
 
-import org.drools.marshalling.MarshallingConfiguration;
+import org.drools.marshalling.impl.MarshallingConfiguration;
 
 @Entity
 public class SessionInfo {
@@ -41,9 +41,6 @@
     private byte[]             rulesByteArrayShadow;
 
     @Transient
-    MarshallingConfiguration   marshallingConfiguration;
-
-    @Transient
     JPASessionMarshallingHelper helper;
     
     public SessionInfo() {

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -18,71 +18,77 @@
 import org.drools.SessionConfiguration;
 import org.drools.StatefulSession;
 import org.drools.impl.KnowledgeBaseImpl;
-import org.drools.marshalling.MarshallingConfiguration;
-import org.drools.marshalling.MarshallingConfigurationImpl;
-import org.drools.marshalling.PlaceholderResolverStrategyFactory;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
 import org.drools.persistence.processinstance.JPASignalManager;
 import org.drools.process.command.Command;
 import org.drools.process.command.CommandService;
-import org.drools.reteoo.ReteooRuleBase;
+import org.drools.reteoo.ReteooStatefulSession;
+import org.drools.reteoo.ReteooWorkingMemory;
 import org.drools.runtime.Environment;
 import org.drools.runtime.EnvironmentName;
 import org.drools.runtime.KnowledgeSessionConfiguration;
-import org.hibernate.ejb.EntityManagerImpl;
+import org.drools.runtime.StatefulKnowledgeSession;
 
 public class SingleSessionCommandService
     implements
     CommandService {
 
-    private EntityManagerFactory       emf;
-    private EntityManager              em;
-    private SessionInfo                sessionInfo;
+    private EntityManagerFactory        emf;
+    private EntityManager               em;
+    private SessionInfo                 sessionInfo;
     private JPASessionMarshallingHelper marshallingHelper;
-    private StatefulSession            session;
-    private Environment                env;
+    private StatefulSession             session;
 
-    public SingleSessionCommandService(KnowledgeBase kbase,
-                                       KnowledgeSessionConfiguration conf,
-                                       Environment environment) {
-        this( ((KnowledgeBaseImpl) kbase).getRuleBase(),
-              (SessionConfiguration) conf,
-              environment );
-    }
+    private KnowledgeBase               kbase;
+    private StatefulKnowledgeSession    ksession;
+    private Environment                 env;
 
     public SingleSessionCommandService(RuleBase ruleBase,
                                        SessionConfiguration conf,
                                        Environment env) {
-        if (conf == null) {
+        this( new KnowledgeBaseImpl( ruleBase ),
+              (SessionConfiguration) conf,
+              env );
+    }
+
+    public SingleSessionCommandService(KnowledgeBase kbase,
+                                       KnowledgeSessionConfiguration conf,
+                                       Environment env) {
+        if ( conf == null ) {
             conf = new SessionConfiguration();
         }
         this.env = env;
         this.sessionInfo = new SessionInfo();
-        this.session = ((ReteooRuleBase) ruleBase).newStatefulSession(this.sessionInfo.getId(), conf, env);
-        ((JPASignalManager) this.session.getSignalManager()).setCommandService(this);
-        MarshallingConfiguration marshallingConf = new MarshallingConfigurationImpl(
-    		(PlaceholderResolverStrategyFactory) env.get(EnvironmentName.PLACEHOLDER_RESOLVER_STRATEGY_FACTORY),
-            false, false);
-        this.marshallingHelper = new JPASessionMarshallingHelper(this.session, conf, marshallingConf);
-        this.sessionInfo.setJPASessionMashallingHelper(this.marshallingHelper);        
 
+        this.session = ((KnowledgeBaseImpl) kbase).ruleBase.newStatefulSession( (SessionConfiguration) conf,
+                                                                                this.env );
+        this.ksession = new StatefulKnowledgeSessionImpl( (ReteooWorkingMemory) session );
+
+        ((JPASignalManager) this.session.getSignalManager()).setCommandService( this );
+
+        this.marshallingHelper = new JPASessionMarshallingHelper( this.ksession,
+                                                                  conf );
+
+        this.sessionInfo.setJPASessionMashallingHelper( this.marshallingHelper );
+
         this.emf = (EntityManagerFactory) env.get( EnvironmentName.ENTITY_MANAGER_FACTORY );
         this.em = emf.createEntityManager(); // how can I ensure this is an extended entity?
-//        System.out.println( ((EntityManagerImpl) this.em).getFlushMode() );
+        //        System.out.println( ((EntityManagerImpl) this.em).getFlushMode() );
         UserTransaction ut = null;
         try {
             InitialContext ctx = new InitialContext();
             ut = (UserTransaction) ctx.lookup( "java:comp/UserTransaction" );
             ut.begin();
-            registerRollbackSync( );
+            registerRollbackSync();
             this.em.joinTransaction();
-            
+
             this.em.persist( this.sessionInfo );
 
-//            System.out.println( "committing" );
+            //            System.out.println( "committing" );
             ut.commit();
-//            System.out.println( "commit complete" );
+            //            System.out.println( "commit complete" );
         } catch ( Throwable t1 ) {
-        	try {
+            try {
                 if ( ut != null ) {
                     ut.rollback();
                 }
@@ -93,71 +99,79 @@
                                             t2 );
             }
         }
-        
-        new Thread(new Runnable() {
-			public void run() {
-				session.fireUntilHalt();
-			}
-    	});
+
+        new Thread( new Runnable() {
+            public void run() {
+                session.fireUntilHalt();
+            }
+        } );
     }
-    
-    public SingleSessionCommandService(RuleBase ruleBase, SessionConfiguration conf, Environment env, int sessionId) {
-		if (conf == null) {
-			conf = new SessionConfiguration();
-		}
 
-		this.env = env;
+    public SingleSessionCommandService(KnowledgeBase kbase,
+                                       KnowledgeSessionConfiguration conf,
+                                       Environment env,
+                                       int sessionId) {
+        if ( conf == null ) {
+            conf = new SessionConfiguration();
+        }
 
-		this.emf = (EntityManagerFactory) env.get(EnvironmentName.ENTITY_MANAGER_FACTORY);
-		this.em = emf.createEntityManager(); // how can I ensure this is an extended entity?
-		//System.out.println(((EntityManagerImpl) this.em).getFlushMode());
-		UserTransaction ut = null;
-		try {
-			InitialContext ctx = new InitialContext();
-			ut = (UserTransaction) ctx.lookup("java:comp/UserTransaction");
-			ut.begin();
-			registerRollbackSync();
-			this.em.joinTransaction();
-		
-			sessionInfo = this.em.find(SessionInfo.class, sessionId);
-		
-		//	System.out.println("committing");
-			ut.commit();
-		//	System.out.println("commit complete");
-		} catch (Throwable t1) {
-			try {
-				if (ut != null) {
-					ut.rollback();
-				}
-				throw new RuntimeException("Could insert session data", t1);
-			} catch (Throwable t2) {
-				throw new RuntimeException("Could not rollback transaction", t2);
-			}
-		}
-		
-		MarshallingConfiguration marshallingConf = new MarshallingConfigurationImpl(
-			(PlaceholderResolverStrategyFactory) env.get(EnvironmentName.PLACEHOLDER_RESOLVER_STRATEGY_FACTORY),
-			false, false);
-		this.marshallingHelper = new JPASessionMarshallingHelper(sessionInfo, ruleBase, conf, marshallingConf, env);
-		this.sessionInfo.setJPASessionMashallingHelper(this.marshallingHelper);
-		this.session = this.marshallingHelper.getObject();
-		((JPASignalManager) this.session.getSignalManager()).setCommandService(this);
+        this.env = env;
 
-		new Thread(new Runnable() {
-			public void run() {
-				session.fireUntilHalt();
-			}
-		});
-	}
+        this.emf = (EntityManagerFactory) env.get( EnvironmentName.ENTITY_MANAGER_FACTORY );
+        this.em = emf.createEntityManager(); // how can I ensure this is an extended entity?
+        //System.out.println(((EntityManagerImpl) this.em).getFlushMode());
+        UserTransaction ut = null;
+        try {
+            InitialContext ctx = new InitialContext();
+            ut = (UserTransaction) ctx.lookup( "java:comp/UserTransaction" );
+            ut.begin();
+            registerRollbackSync();
+            this.em.joinTransaction();
 
-    
+            sessionInfo = this.em.find( SessionInfo.class,
+                                        sessionId );
+
+            //	System.out.println("committing");
+            ut.commit();
+            //	System.out.println("commit complete");
+        } catch ( Throwable t1 ) {
+            try {
+                if ( ut != null ) {
+                    ut.rollback();
+                }
+                throw new RuntimeException( "Could insert session data",
+                                            t1 );
+            } catch ( Throwable t2 ) {
+                throw new RuntimeException( "Could not rollback transaction",
+                                            t2 );
+            }
+        }
+
+        this.session = ((KnowledgeBaseImpl) kbase).ruleBase.newStatefulSession( (SessionConfiguration) conf,
+                                                                                this.env );
+        
+        this.ksession = new StatefulKnowledgeSessionImpl( (ReteooWorkingMemory) session );
+        ((JPASignalManager) this.session.getSignalManager()).setCommandService( this );
+        
+        this.marshallingHelper = new JPASessionMarshallingHelper( this.ksession,
+                                                                  conf );
+
+        this.sessionInfo.setJPASessionMashallingHelper( this.marshallingHelper );        
+
+        new Thread( new Runnable() {
+            public void run() {
+                session.fireUntilHalt();
+            }
+        } );
+    }
+
     public StatefulSession getSession() {
         return this.session;
     }
 
     public synchronized <T> T execute(Command<T> command) {
-    	session.halt();
-    	
+        session.halt();
+
         boolean localTransaction = false;
         UserTransaction ut = null;
         try {
@@ -167,16 +181,17 @@
                 // If there is no transaction then start one, we will commit within the same Command
                 ut.begin();
                 localTransaction = true;
-            } 
+            }
 
             EntityManager localEm = this.emf.createEntityManager(); // no need to call joinTransaction as it will do so if one already exists
-            this.env.set( EnvironmentName.ENTITY_MANAGER, localEm );
+            this.env.set( EnvironmentName.ENTITY_MANAGER,
+                          localEm );
 
             this.em.joinTransaction();
             //System.out.println( "1) exec ver : " + this.sessionInfo.getVersion() );
             this.sessionInfo.setDirty();
             //System.out.println( "2) exec ver : " + this.sessionInfo.getVersion() );
-            
+
             registerRollbackSync();
 
             T result = command.execute( session );
@@ -190,8 +205,8 @@
             return result;
 
         } catch ( Throwable t1 ) {
-        	t1.printStackTrace();
-        	if ( localTransaction ) {
+            t1.printStackTrace();
+            if ( localTransaction ) {
                 try {
                     if ( ut != null ) {
                         ut.rollback();
@@ -207,11 +222,11 @@
                                             t1 );
             }
         } finally {
-        	new Thread(new Runnable() {
-				public void run() {
-					session.fireUntilHalt();
-				}
-        	});
+            new Thread( new Runnable() {
+                public void run() {
+                    session.fireUntilHalt();
+                }
+            } );
         }
     }
 
@@ -224,10 +239,10 @@
     public int getSessionId() {
         return sessionInfo.getId();
     }
-    
+
     public void registerRollbackSync() throws IllegalStateException,
-                                                             RollbackException,
-                                                             SystemException {
+                                      RollbackException,
+                                      SystemException {
         TransactionManager txm = (TransactionManager) env.get( "drools.TransactionManager" );
         if ( txm == null ) {
             return;
@@ -240,7 +255,7 @@
                      map );
         }
 
-        if (  map.get( this ) == null ) {
+        if ( map.get( this ) == null ) {
             txm.getTransaction().registerSynchronization( new SynchronizationImpl( env,
                                                                                    this ) );
             map.put( this,
@@ -259,7 +274,7 @@
     public static class SynchronizationImpl
         implements
         Synchronization {
-        private Environment env;
+        private Environment                 env;
         private SingleSessionCommandService cmdService;
 
         public SynchronizationImpl(Environment env,
@@ -279,14 +294,14 @@
             System.out.println( "cleanedup rollback sychronisation" );
             Map map = (Map) env.get( "synchronizations" );
             map.remove( cmdService );
-            
+
             // cleanup local resource entity manager, normally an EntityManager should be closed with the transaction it was bound to,
             // if it was created inside the scope of the transaction, but adding this anyway just in case.
-            EntityManager localEm = ( EntityManager ) this.env.get( EnvironmentName.ENTITY_MANAGER );
+            EntityManager localEm = (EntityManager) this.env.get( EnvironmentName.ENTITY_MANAGER );
             if ( localEm != null && localEm.isOpen() ) {
                 localEm.close();
             }
-            
+
         }
 
         public void beforeCompletion() {
@@ -325,10 +340,12 @@
     //        System.out.println( "before " );
     //    }
     //}     
-    
+
     public void rollback() {
         // have to create a new localEM as an EM part of a transaction cannot do a find.
         this.sessionInfo.rollback();
-        this.marshallingHelper.loadSnapshot( this.sessionInfo.getData(), this.session );
+        this.marshallingHelper.loadSnapshot( this.sessionInfo.getData(),
+                                             this.ksession );
+        this.session = (StatefulSession) ((StatefulKnowledgeSessionImpl) this.ksession).session;
     }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java	2009-02-26 04:43:35 UTC (rev 25426)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java	2009-02-26 04:49:09 UTC (rev 25427)
@@ -1,6 +1,8 @@
 package org.drools.persistence.session;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 import java.util.Properties;
 
 import javax.naming.InitialContext;
@@ -11,12 +13,15 @@
 
 import junit.framework.TestCase;
 
+import org.drools.KnowledgeBase;
 import org.drools.KnowledgeBaseFactory;
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.SessionConfiguration;
 import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.ProcessBuilder;
+import org.drools.definition.KnowledgePackage;
+import org.drools.definitions.impl.KnowledgePackageImp;
 import org.drools.process.command.CompleteWorkItemCommand;
 import org.drools.process.command.GetProcessInstanceCommand;
 import org.drools.process.command.StartProcessCommand;
@@ -46,11 +51,11 @@
 import bitronix.tm.resource.jdbc.PoolingDataSource;
 
 public class SingleSessionCommandServiceTest extends TestCase {
-	
-    PoolingDataSource ds1;
-	private EntityManagerFactory emf;
-	
-	protected void setUp() {		
+
+    PoolingDataSource            ds1;
+    private EntityManagerFactory emf;
+
+    protected void setUp() {
         ds1 = new PoolingDataSource();
         ds1.setUniqueName( "jdbc/testDS1" );
         ds1.setClassName( "org.h2.jdbcx.JdbcDataSource" );
@@ -62,545 +67,691 @@
                                        "sasa" );
         ds1.getDriverProperties().put( "URL",
                                        "jdbc:h2:mem:mydb" );
-        ds1.init();		
-        
-        emf = Persistence.createEntityManagerFactory("org.drools.persistence.jpa");
-	}
-	
-	protected void tearDown() {
+        ds1.init();
+
+        emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+    }
+
+    protected void tearDown() {
         emf.close();
         ds1.close();
-        
+
     }
-	
-	public void testPersistenceWorkItems() throws Exception {
+
+    public void testPersistenceWorkItems() throws Exception {
         Environment env = KnowledgeBaseFactory.newEnvironment();
         env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
                  emf );
         env.set( "drools.TransactionManager",
                  TransactionManagerServices.getTransactionManager() );
-        
-        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-        Package pkg = getProcessWorkItems();
-        ruleBase.addPackage(pkg);
 
-		Properties properties = new Properties();
-		properties.setProperty("drools.commandService", "org.drools.persistence.session.SingleSessionCommandService");
-		properties.setProperty("drools.processInstanceManagerFactory", "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory");
-		properties.setProperty("drools.workItemManagerFactory", "org.drools.persistence.processinstance.JPAWorkItemManagerFactory");
-		properties.setProperty("drools.processSignalManagerFactory", "org.drools.persistence.processinstance.JPASignalManagerFactory");
-		SessionConfiguration config = new SessionConfiguration(properties);
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        Collection<KnowledgePackage> kpkgs = getProcessWorkItems();
+        kbase.addKnowledgePackages( kpkgs );
 
-		SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config, env);
-		int sessionId = service.getSessionId();
-		
-		StartProcessCommand startProcessCommand = new StartProcessCommand();
-        startProcessCommand.setProcessId("org.drools.test.TestProcess");
-        ProcessInstance processInstance = (ProcessInstance) service.execute(startProcessCommand);
-        System.out.println("Started process instance " + processInstance.getId());
-        
+        Properties properties = new Properties();
+        properties.setProperty( "drools.commandService",
+                                "org.drools.persistence.session.SingleSessionCommandService" );
+        properties.setProperty( "drools.processInstanceManagerFactory",
+                                "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory" );
+        properties.setProperty( "drools.workItemManagerFactory",
+                                "org.drools.persistence.processinstance.JPAWorkItemManagerFactory" );
+        properties.setProperty( "drools.processSignalManagerFactory",
+                                "org.drools.persistence.processinstance.JPASignalManagerFactory" );
+        SessionConfiguration config = new SessionConfiguration( properties );
+
+        SingleSessionCommandService service = new SingleSessionCommandService( kbase,
+                                                                               config,
+                                                                               env );
+        int sessionId = service.getSessionId();
+
+        StartProcessCommand startProcessCommand = new StartProcessCommand();
+        startProcessCommand.setProcessId( "org.drools.test.TestProcess" );
+        ProcessInstance processInstance = (ProcessInstance) service.execute( startProcessCommand );
+        System.out.println( "Started process instance " + processInstance.getId() );
+
         TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
         WorkItem workItem = handler.getWorkItem();
-        assertNotNull(workItem);
+        assertNotNull( workItem );
         service.dispose();
-        
-        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+
+        service = new SingleSessionCommandService( kbase,
+                                                   config,
+                                                   env,
+                                                   sessionId );
         GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
-        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
-        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
-        assertNotNull(processInstance);
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = (ProcessInstance) service.execute( getProcessInstanceCommand );
+        assertNotNull( processInstance );
         service.dispose();
-        
-        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+
+        service = new SingleSessionCommandService( kbase,
+                                                   config,
+                                                   env,
+                                                   sessionId );
         CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
-        completeWorkItemCommand.setWorkItemId(workItem.getId());
-        service.execute(completeWorkItemCommand);
+        completeWorkItemCommand.setWorkItemId( workItem.getId() );
+        service.execute( completeWorkItemCommand );
 
         workItem = handler.getWorkItem();
-        assertNotNull(workItem);
+        assertNotNull( workItem );
         service.dispose();
-        
-        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+
+        service = new SingleSessionCommandService( kbase,
+                                                   config,
+                                                   env,
+                                                   sessionId );
         getProcessInstanceCommand = new GetProcessInstanceCommand();
-        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
-        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
-        assertNotNull(processInstance);
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = (ProcessInstance) service.execute( getProcessInstanceCommand );
+        assertNotNull( processInstance );
         service.dispose();
-        
-        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+
+        service = new SingleSessionCommandService( kbase,
+                                                   config,
+                                                   env,
+                                                   sessionId );
         completeWorkItemCommand = new CompleteWorkItemCommand();
-        completeWorkItemCommand.setWorkItemId(workItem.getId());
-        service.execute(completeWorkItemCommand);
-        
+        completeWorkItemCommand.setWorkItemId( workItem.getId() );
+        service.execute( completeWorkItemCommand );
+
         workItem = handler.getWorkItem();
-        assertNotNull(workItem);
+        assertNotNull( workItem );
         service.dispose();
-        
-        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+
+        service = new SingleSessionCommandService( kbase,
+                                                   config,
+                                                   env,
+                                                   sessionId );
         getProcessInstanceCommand = new GetProcessInstanceCommand();
-        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
-        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
-        assertNotNull(processInstance);
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = (ProcessInstance) service.execute( getProcessInstanceCommand );
+        assertNotNull( processInstance );
         service.dispose();
-        
-        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+
+        service = new SingleSessionCommandService( kbase,
+                                                   config,
+                                                   env,
+                                                   sessionId );
         completeWorkItemCommand = new CompleteWorkItemCommand();
-        completeWorkItemCommand.setWorkItemId(workItem.getId());
-        service.execute(completeWorkItemCommand);
+        completeWorkItemCommand.setWorkItemId( workItem.getId() );
+        service.execute( completeWorkItemCommand );
 
         workItem = handler.getWorkItem();
-        assertNull(workItem);
+        assertNull( workItem );
         service.dispose();
-        
-        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+
+        service = new SingleSessionCommandService( kbase,
+                                                   config,
+                                                   env,
+                                                   sessionId );
         getProcessInstanceCommand = new GetProcessInstanceCommand();
-        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
-        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
-        assertNull(processInstance);
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = (ProcessInstance) service.execute( getProcessInstanceCommand );
+        assertNull( processInstance );
         service.dispose();
-	}
-	
-	public void testPersistenceWorkItemsUserTransaction() throws Exception {
+    }
+
+    public void testPersistenceWorkItemsUserTransaction() throws Exception {
         Environment env = KnowledgeBaseFactory.newEnvironment();
         env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
                  emf );
         env.set( "drools.TransactionManager",
                  TransactionManagerServices.getTransactionManager() );
-        
-        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-        Package pkg = getProcessWorkItems();
-        ruleBase.addPackage(pkg);
 
-		Properties properties = new Properties();
-		properties.setProperty("drools.commandService", "org.drools.persistence.session.SingleSessionCommandService");
-		properties.setProperty("drools.processInstanceManagerFactory", "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory");
-		properties.setProperty("drools.workItemManagerFactory", "org.drools.persistence.processinstance.JPAWorkItemManagerFactory");
-		properties.setProperty("drools.processSignalManagerFactory", "org.drools.persistence.processinstance.JPASignalManagerFactory");
-		SessionConfiguration config = new SessionConfiguration(properties);
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        Collection<KnowledgePackage> kpkgs = getProcessWorkItems();
+        kbase.addKnowledgePackages( kpkgs );
 
-		SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config, env);
-		int sessionId = service.getSessionId();
-		
-		UserTransaction ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
+        Properties properties = new Properties();
+        properties.setProperty( "drools.commandService",
+                                "org.drools.persistence.session.SingleSessionCommandService" );
+        properties.setProperty( "drools.processInstanceManagerFactory",
+                                "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory" );
+        properties.setProperty( "drools.workItemManagerFactory",
+                                "org.drools.persistence.processinstance.JPAWorkItemManagerFactory" );
+        properties.setProperty( "drools.processSignalManagerFactory",
+                                "org.drools.persistence.processinstance.JPASignalManagerFactory" );
+        SessionConfiguration config = new SessionConfiguration( properties );
+
+        SingleSessionCommandService service = new SingleSessionCommandService( kbase,
+                                                                               config,
+                                                                               env );
+        int sessionId = service.getSessionId();
+
+        UserTransaction ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
         ut.begin();
         StartProcessCommand startProcessCommand = new StartProcessCommand();
-        startProcessCommand.setProcessId("org.drools.test.TestProcess");
-        ProcessInstance processInstance = (ProcessInstance) service.execute(startProcessCommand);
-        System.out.println("Started process instance " + processInstance.getId());
+        startProcessCommand.setProcessId( "org.drools.test.TestProcess" );
+        ProcessInstance processInstance = (ProcessInstance) service.execute( startProcessCommand );
+        System.out.println( "Started process instance " + processInstance.getId() );
         ut.commit();
-        
+
         TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
         WorkItem workItem = handler.getWorkItem();
-        assertNotNull(workItem);
+        assertNotNull( workItem );
         service.dispose();
-        
-        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+
+        service = new SingleSessionCommandService( kbase,
+                                                   config,
+                                                   env,
+                                                   sessionId );
         ut.begin();
         GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
-        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
-        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
-        assertNotNull(processInstance);
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = (ProcessInstance) service.execute( getProcessInstanceCommand );
+        assertNotNull( processInstance );
         ut.commit();
         service.dispose();
-        
-        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+
+        service = new SingleSessionCommandService( kbase,
+                                                   config,
+                                                   env,
+                                                   sessionId );
         ut.begin();
         CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
-        completeWorkItemCommand.setWorkItemId(workItem.getId());
-        service.execute(completeWorkItemCommand);
+        completeWorkItemCommand.setWorkItemId( workItem.getId() );
+        service.execute( completeWorkItemCommand );
         ut.commit();
-        
+
         workItem = handler.getWorkItem();
-        assertNotNull(workItem);
+        assertNotNull( workItem );
         service.dispose();
-        
-        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+
+        service = new SingleSessionCommandService( kbase,
+                                                   config,
+                                                   env,
+                                                   sessionId );
         ut.begin();
         getProcessInstanceCommand = new GetProcessInstanceCommand();
-        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
-        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = (ProcessInstance) service.execute( getProcessInstanceCommand );
         ut.commit();
-        assertNotNull(processInstance);
+        assertNotNull( processInstance );
         service.dispose();
-        
-        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+
+        service = new SingleSessionCommandService( kbase,
+                                                   config,
+                                                   env,
+                                                   sessionId );
         ut.begin();
         completeWorkItemCommand = new CompleteWorkItemCommand();
-        completeWorkItemCommand.setWorkItemId(workItem.getId());
-        service.execute(completeWorkItemCommand);
+        completeWorkItemCommand.setWorkItemId( workItem.getId() );
+        service.execute( completeWorkItemCommand );
         ut.commit();
-        
+
         workItem = handler.getWorkItem();
-        assertNotNull(workItem);
+        assertNotNull( workItem );
         service.dispose();
-        
-        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+
+        service = new SingleSessionCommandService( kbase,
+                                                   config,
+                                                   env,
+                                                   sessionId );
         ut.begin();
         getProcessInstanceCommand = new GetProcessInstanceCommand();
-        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
-        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = (ProcessInstance) service.execute( getProcessInstanceCommand );
         ut.commit();
-        assertNotNull(processInstance);
+        assertNotNull( processInstance );
         service.dispose();
-        
-        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+
+        service = new SingleSessionCommandService( kbase,
+                                                   config,
+                                                   env,
+                                                   sessionId );
         ut.begin();
         completeWorkItemCommand = new CompleteWorkItemCommand();
-        completeWorkItemCommand.setWorkItemId(workItem.getId());
-        service.execute(completeWorkItemCommand);
+        completeWorkItemCommand.setWorkItemId( workItem.getId() );
+        service.execute( completeWorkItemCommand );
         ut.commit();
-        
+
         workItem = handler.getWorkItem();
-        assertNull(workItem);
+        assertNull( workItem );
         service.dispose();
-        
-        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+
+        service = new SingleSessionCommandService( kbase,
+                                                   config,
+                                                   env,
+                                                   sessionId );
         ut.begin();
         getProcessInstanceCommand = new GetProcessInstanceCommand();
-        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
-        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = (ProcessInstance) service.execute( getProcessInstanceCommand );
         ut.commit();
-        assertNull(processInstance);
+        assertNull( processInstance );
         service.dispose();
-	}
+    }
 
-    private Package getProcessWorkItems() {
-    	RuleFlowProcess process = new RuleFlowProcess();
-    	process.setId("org.drools.test.TestProcess");
-    	process.setName("TestProcess");
-    	process.setPackageName("org.drools.test");
-    	StartNode start = new StartNode();
-    	start.setId(1);
-    	start.setName("Start");
-    	process.addNode(start);
-    	ActionNode actionNode = new ActionNode();
-    	actionNode.setId(2);
-    	actionNode.setName("Action");
-    	DroolsConsequenceAction action = new DroolsConsequenceAction();
-    	action.setDialect("java");
-    	action.setConsequence("System.out.println(\"Executed action\");");
-    	actionNode.setAction(action);
-    	process.addNode(actionNode);
-    	new ConnectionImpl(start, Node.CONNECTION_DEFAULT_TYPE, actionNode, Node.CONNECTION_DEFAULT_TYPE);
-    	WorkItemNode workItemNode = new WorkItemNode();
-    	workItemNode.setId(3);
-    	workItemNode.setName("WorkItem1");
-    	Work work = new WorkImpl();
-    	work.setName("MyWork");
-    	workItemNode.setWork(work);
-    	process.addNode(workItemNode);
-    	new ConnectionImpl(actionNode, Node.CONNECTION_DEFAULT_TYPE, workItemNode, Node.CONNECTION_DEFAULT_TYPE);
-    	WorkItemNode workItemNode2 = new WorkItemNode();
-    	workItemNode2.setId(4);
-    	workItemNode2.setName("WorkItem2");
-    	work = new WorkImpl();
-    	work.setName("MyWork");
-    	workItemNode2.setWork(work);
-    	process.addNode(workItemNode2);
-    	new ConnectionImpl(workItemNode, Node.CONNECTION_DEFAULT_TYPE, workItemNode2, Node.CONNECTION_DEFAULT_TYPE);
-    	WorkItemNode workItemNode3 = new WorkItemNode();
-    	workItemNode3.setId(5);
-    	workItemNode3.setName("WorkItem3");
-    	work = new WorkImpl();
-    	work.setName("MyWork");
-    	workItemNode3.setWork(work);
-    	process.addNode(workItemNode3);
-    	new ConnectionImpl(workItemNode2, Node.CONNECTION_DEFAULT_TYPE, workItemNode3, Node.CONNECTION_DEFAULT_TYPE);
-    	EndNode end = new EndNode();
-    	end.setId(6);
-    	end.setName("End");
-    	process.addNode(end);
-    	new ConnectionImpl(workItemNode3, Node.CONNECTION_DEFAULT_TYPE, end, Node.CONNECTION_DEFAULT_TYPE);
-    	
-    	PackageBuilder packageBuilder = new PackageBuilder();
-    	ProcessBuilder processBuilder = new ProcessBuilder(packageBuilder);
-    	processBuilder.buildProcess(process, null);
-    	return packageBuilder.getPackage();
+    private Collection<KnowledgePackage> getProcessWorkItems() {
+        RuleFlowProcess process = new RuleFlowProcess();
+        process.setId( "org.drools.test.TestProcess" );
+        process.setName( "TestProcess" );
+        process.setPackageName( "org.drools.test" );
+        StartNode start = new StartNode();
+        start.setId( 1 );
+        start.setName( "Start" );
+        process.addNode( start );
+        ActionNode actionNode = new ActionNode();
+        actionNode.setId( 2 );
+        actionNode.setName( "Action" );
+        DroolsConsequenceAction action = new DroolsConsequenceAction();
+        action.setDialect( "java" );
+        action.setConsequence( "System.out.println(\"Executed action\");" );
+        actionNode.setAction( action );
+        process.addNode( actionNode );
+        new ConnectionImpl( start,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        WorkItemNode workItemNode = new WorkItemNode();
+        workItemNode.setId( 3 );
+        workItemNode.setName( "WorkItem1" );
+        Work work = new WorkImpl();
+        work.setName( "MyWork" );
+        workItemNode.setWork( work );
+        process.addNode( workItemNode );
+        new ConnectionImpl( actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            workItemNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        WorkItemNode workItemNode2 = new WorkItemNode();
+        workItemNode2.setId( 4 );
+        workItemNode2.setName( "WorkItem2" );
+        work = new WorkImpl();
+        work.setName( "MyWork" );
+        workItemNode2.setWork( work );
+        process.addNode( workItemNode2 );
+        new ConnectionImpl( workItemNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            workItemNode2,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        WorkItemNode workItemNode3 = new WorkItemNode();
+        workItemNode3.setId( 5 );
+        workItemNode3.setName( "WorkItem3" );
+        work = new WorkImpl();
+        work.setName( "MyWork" );
+        workItemNode3.setWork( work );
+        process.addNode( workItemNode3 );
+        new ConnectionImpl( workItemNode2,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            workItemNode3,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        EndNode end = new EndNode();
+        end.setId( 6 );
+        end.setName( "End" );
+        process.addNode( end );
+        new ConnectionImpl( workItemNode3,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            end,
+                            Node.CONNECTION_DEFAULT_TYPE );
+
+        PackageBuilder packageBuilder = new PackageBuilder();
+        ProcessBuilder processBuilder = new ProcessBuilder( packageBuilder );
+        processBuilder.buildProcess( process,
+                                     null );
+        List list = new ArrayList<KnowledgePackage>();
+        list.add( new KnowledgePackageImp( packageBuilder.getPackage() ) );
+        return list;
     }
-    
-	public void testPersistenceSubProcess() {
+
+    public void testPersistenceSubProcess() {
         Environment env = KnowledgeBaseFactory.newEnvironment();
         env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
                  emf );
         env.set( "drools.TransactionManager",
                  TransactionManagerServices.getTransactionManager() );
-        
-		Properties properties = new Properties();
-		properties.setProperty("drools.commandService", "org.drools.persistence.session.SingleSessionCommandService");
-		properties.setProperty("drools.processInstanceManagerFactory", "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory");
-		properties.setProperty("drools.workItemManagerFactory", "org.drools.persistence.processinstance.JPAWorkItemManagerFactory");
-		properties.setProperty("drools.processSignalManagerFactory", "org.drools.persistence.processinstance.JPASignalManagerFactory");
-		SessionConfiguration config = new SessionConfiguration(properties);
 
-		RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        Properties properties = new Properties();
+        properties.setProperty( "drools.commandService",
+                                "org.drools.persistence.session.SingleSessionCommandService" );
+        properties.setProperty( "drools.processInstanceManagerFactory",
+                                "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory" );
+        properties.setProperty( "drools.workItemManagerFactory",
+                                "org.drools.persistence.processinstance.JPAWorkItemManagerFactory" );
+        properties.setProperty( "drools.processSignalManagerFactory",
+                                "org.drools.persistence.processinstance.JPASignalManagerFactory" );
+        SessionConfiguration config = new SessionConfiguration( properties );
+
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
         Package pkg = getProcessSubProcess();
-        ruleBase.addPackage(pkg);
+        ruleBase.addPackage( pkg );
 
-        SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config, env);
+        SingleSessionCommandService service = new SingleSessionCommandService( ruleBase,
+                                                                               config,
+                                                                               env );
         StartProcessCommand startProcessCommand = new StartProcessCommand();
-        startProcessCommand.setProcessId("org.drools.test.TestProcess");
-        RuleFlowProcessInstance processInstance = (RuleFlowProcessInstance) service.execute(startProcessCommand);
-        System.out.println("Started process instance " + processInstance.getId());
+        startProcessCommand.setProcessId( "org.drools.test.TestProcess" );
+        RuleFlowProcessInstance processInstance = (RuleFlowProcessInstance) service.execute( startProcessCommand );
+        System.out.println( "Started process instance " + processInstance.getId() );
         long processInstanceId = processInstance.getId();
-        
+
         TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
         WorkItem workItem = handler.getWorkItem();
-        assertNotNull(workItem);
+        assertNotNull( workItem );
         service.dispose();
-        
-        service = new SingleSessionCommandService(ruleBase, config, env);
+
+        service = new SingleSessionCommandService( ruleBase,
+                                                   config,
+                                                   env );
         GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
-        getProcessInstanceCommand.setProcessInstanceId(processInstanceId);
-        processInstance = (RuleFlowProcessInstance) service.execute(getProcessInstanceCommand);
-        assertNotNull(processInstance);
-        
+        getProcessInstanceCommand.setProcessInstanceId( processInstanceId );
+        processInstance = (RuleFlowProcessInstance) service.execute( getProcessInstanceCommand );
+        assertNotNull( processInstance );
+
         Collection<NodeInstance> nodeInstances = processInstance.getNodeInstances();
-        assertEquals(1, nodeInstances.size());
+        assertEquals( 1,
+                      nodeInstances.size() );
         SubProcessNodeInstance subProcessNodeInstance = (SubProcessNodeInstance) nodeInstances.iterator().next();
         long subProcessInstanceId = subProcessNodeInstance.getProcessInstanceId();
         getProcessInstanceCommand = new GetProcessInstanceCommand();
-        getProcessInstanceCommand.setProcessInstanceId(subProcessInstanceId);
-        RuleFlowProcessInstance subProcessInstance = (RuleFlowProcessInstance) service.execute(getProcessInstanceCommand);
-        assertNotNull(subProcessInstance);
+        getProcessInstanceCommand.setProcessInstanceId( subProcessInstanceId );
+        RuleFlowProcessInstance subProcessInstance = (RuleFlowProcessInstance) service.execute( getProcessInstanceCommand );
+        assertNotNull( subProcessInstance );
         service.dispose();
 
-        service = new SingleSessionCommandService(ruleBase, config, env);
+        service = new SingleSessionCommandService( ruleBase,
+                                                   config,
+                                                   env );
         CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
-        completeWorkItemCommand.setWorkItemId(workItem.getId());
-        service.execute(completeWorkItemCommand);
+        completeWorkItemCommand.setWorkItemId( workItem.getId() );
+        service.execute( completeWorkItemCommand );
         service.dispose();
 
-        service = new SingleSessionCommandService(ruleBase, config, env);
+        service = new SingleSessionCommandService( ruleBase,
+                                                   config,
+                                                   env );
         getProcessInstanceCommand = new GetProcessInstanceCommand();
-        getProcessInstanceCommand.setProcessInstanceId(subProcessInstanceId);
-        subProcessInstance = (RuleFlowProcessInstance) service.execute(getProcessInstanceCommand);
-        assertNull(subProcessInstance);
+        getProcessInstanceCommand.setProcessInstanceId( subProcessInstanceId );
+        subProcessInstance = (RuleFlowProcessInstance) service.execute( getProcessInstanceCommand );
+        assertNull( subProcessInstance );
 
         getProcessInstanceCommand = new GetProcessInstanceCommand();
-        getProcessInstanceCommand.setProcessInstanceId(processInstanceId);
-        processInstance = (RuleFlowProcessInstance) service.execute(getProcessInstanceCommand);
-        assertNull(processInstance);
+        getProcessInstanceCommand.setProcessInstanceId( processInstanceId );
+        processInstance = (RuleFlowProcessInstance) service.execute( getProcessInstanceCommand );
+        assertNull( processInstance );
         service.dispose();
-	}
-	
-	private Package getProcessSubProcess() {
-    	RuleFlowProcess process = new RuleFlowProcess();
-    	process.setId("org.drools.test.TestProcess");
-    	process.setName("TestProcess");
-    	process.setPackageName("org.drools.test");
-    	StartNode start = new StartNode();
-    	start.setId(1);
-    	start.setName("Start");
-    	process.addNode(start);
-    	ActionNode actionNode = new ActionNode();
-    	actionNode.setId(2);
-    	actionNode.setName("Action");
-    	DroolsConsequenceAction action = new DroolsConsequenceAction();
-    	action.setDialect("java");
-    	action.setConsequence("System.out.println(\"Executed action\");");
-    	actionNode.setAction(action);
-    	process.addNode(actionNode);
-    	new ConnectionImpl(start, Node.CONNECTION_DEFAULT_TYPE, actionNode, Node.CONNECTION_DEFAULT_TYPE);
-    	SubProcessNode subProcessNode = new SubProcessNode();
-    	subProcessNode.setId(3);
-    	subProcessNode.setName("SubProcess");
-    	subProcessNode.setProcessId("org.drools.test.SubProcess");
-    	process.addNode(subProcessNode);
-    	new ConnectionImpl(actionNode, Node.CONNECTION_DEFAULT_TYPE, subProcessNode, Node.CONNECTION_DEFAULT_TYPE);
-    	EndNode end = new EndNode();
-    	end.setId(4);
-    	end.setName("End");
-    	process.addNode(end);
-    	new ConnectionImpl(subProcessNode, Node.CONNECTION_DEFAULT_TYPE, end, Node.CONNECTION_DEFAULT_TYPE);
-    	
-    	PackageBuilder packageBuilder = new PackageBuilder();
-    	ProcessBuilder processBuilder = new ProcessBuilder(packageBuilder);
-    	processBuilder.buildProcess(process, null);
+    }
 
-    	process = new RuleFlowProcess();
-    	process.setId("org.drools.test.SubProcess");
-    	process.setName("SubProcess");
-    	process.setPackageName("org.drools.test");
-    	start = new StartNode();
-    	start.setId(1);
-    	start.setName("Start");
-    	process.addNode(start);
-    	actionNode = new ActionNode();
-    	actionNode.setId(2);
-    	actionNode.setName("Action");
-    	action = new DroolsConsequenceAction();
-    	action.setDialect("java");
-    	action.setConsequence("System.out.println(\"Executed action\");");
-    	actionNode.setAction(action);
-    	process.addNode(actionNode);
-    	new ConnectionImpl(start, Node.CONNECTION_DEFAULT_TYPE, actionNode, Node.CONNECTION_DEFAULT_TYPE);
-    	WorkItemNode workItemNode = new WorkItemNode();
-    	workItemNode.setId(3);
-    	workItemNode.setName("WorkItem1");
-    	Work work = new WorkImpl();
-    	work.setName("MyWork");
-    	workItemNode.setWork(work);
-    	process.addNode(workItemNode);
-    	new ConnectionImpl(actionNode, Node.CONNECTION_DEFAULT_TYPE, workItemNode, Node.CONNECTION_DEFAULT_TYPE);
-    	end = new EndNode();
-    	end.setId(6);
-    	end.setName("End");
-    	process.addNode(end);
-    	new ConnectionImpl(workItemNode, Node.CONNECTION_DEFAULT_TYPE, end, Node.CONNECTION_DEFAULT_TYPE);
+    private Package getProcessSubProcess() {
+        RuleFlowProcess process = new RuleFlowProcess();
+        process.setId( "org.drools.test.TestProcess" );
+        process.setName( "TestProcess" );
+        process.setPackageName( "org.drools.test" );
+        StartNode start = new StartNode();
+        start.setId( 1 );
+        start.setName( "Start" );
+        process.addNode( start );
+        ActionNode actionNode = new ActionNode();
+        actionNode.setId( 2 );
+        actionNode.setName( "Action" );
+        DroolsConsequenceAction action = new DroolsConsequenceAction();
+        action.setDialect( "java" );
+        action.setConsequence( "System.out.println(\"Executed action\");" );
+        actionNode.setAction( action );
+        process.addNode( actionNode );
+        new ConnectionImpl( start,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        SubProcessNode subProcessNode = new SubProcessNode();
+        subProcessNode.setId( 3 );
+        subProcessNode.setName( "SubProcess" );
+        subProcessNode.setProcessId( "org.drools.test.SubProcess" );
+        process.addNode( subProcessNode );
+        new ConnectionImpl( actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            subProcessNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        EndNode end = new EndNode();
+        end.setId( 4 );
+        end.setName( "End" );
+        process.addNode( end );
+        new ConnectionImpl( subProcessNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            end,
+                            Node.CONNECTION_DEFAULT_TYPE );
 
-    	processBuilder.buildProcess(process, null);
-    	return packageBuilder.getPackage();
+        PackageBuilder packageBuilder = new PackageBuilder();
+        ProcessBuilder processBuilder = new ProcessBuilder( packageBuilder );
+        processBuilder.buildProcess( process,
+                                     null );
+
+        process = new RuleFlowProcess();
+        process.setId( "org.drools.test.SubProcess" );
+        process.setName( "SubProcess" );
+        process.setPackageName( "org.drools.test" );
+        start = new StartNode();
+        start.setId( 1 );
+        start.setName( "Start" );
+        process.addNode( start );
+        actionNode = new ActionNode();
+        actionNode.setId( 2 );
+        actionNode.setName( "Action" );
+        action = new DroolsConsequenceAction();
+        action.setDialect( "java" );
+        action.setConsequence( "System.out.println(\"Executed action\");" );
+        actionNode.setAction( action );
+        process.addNode( actionNode );
+        new ConnectionImpl( start,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        WorkItemNode workItemNode = new WorkItemNode();
+        workItemNode.setId( 3 );
+        workItemNode.setName( "WorkItem1" );
+        Work work = new WorkImpl();
+        work.setName( "MyWork" );
+        workItemNode.setWork( work );
+        process.addNode( workItemNode );
+        new ConnectionImpl( actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            workItemNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        end = new EndNode();
+        end.setId( 6 );
+        end.setName( "End" );
+        process.addNode( end );
+        new ConnectionImpl( workItemNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            end,
+                            Node.CONNECTION_DEFAULT_TYPE );
+
+        processBuilder.buildProcess( process,
+                                     null );
+        return packageBuilder.getPackage();
     }
-    
-	public void testPersistenceTimer() throws Exception {
+
+    public void FIXME_testPersistenceTimer() throws Exception {
         Environment env = KnowledgeBaseFactory.newEnvironment();
         env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
                  emf );
         env.set( "drools.TransactionManager",
                  TransactionManagerServices.getTransactionManager() );
-        
-		Properties properties = new Properties();
-		properties.setProperty("drools.commandService", "org.drools.persistence.session.SingleSessionCommandService");
-		properties.setProperty("drools.processInstanceManagerFactory", "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory");
-		properties.setProperty("drools.workItemManagerFactory", "org.drools.persistence.processinstance.JPAWorkItemManagerFactory");
-		properties.setProperty("drools.processSignalManagerFactory", "org.drools.persistence.processinstance.JPASignalManagerFactory");
-		SessionConfiguration config = new SessionConfiguration(properties);
-		
-        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-        Package pkg = getProcessTimer();
-        ruleBase.addPackage(pkg);
 
-        SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config, env);
-		int sessionId = service.getSessionId();
+        Properties properties = new Properties();
+        properties.setProperty( "drools.commandService",
+                                "org.drools.persistence.session.SingleSessionCommandService" );
+        properties.setProperty( "drools.processInstanceManagerFactory",
+                                "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory" );
+        properties.setProperty( "drools.workItemManagerFactory",
+                                "org.drools.persistence.processinstance.JPAWorkItemManagerFactory" );
+        properties.setProperty( "drools.processSignalManagerFactory",
+                                "org.drools.persistence.processinstance.JPASignalManagerFactory" );
+        SessionConfiguration config = new SessionConfiguration( properties );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        Collection<KnowledgePackage> kpkgs = getProcessWorkItems();
+        kbase.addKnowledgePackages( kpkgs );
+
+        SingleSessionCommandService service = new SingleSessionCommandService( kbase,
+                                                                               config,
+                                                                               env );
+        int sessionId = service.getSessionId();
         StartProcessCommand startProcessCommand = new StartProcessCommand();
-        startProcessCommand.setProcessId("org.drools.test.TestProcess");
-        ProcessInstance processInstance = (ProcessInstance) service.execute(startProcessCommand);
-        System.out.println("Started process instance " + processInstance.getId());
+        startProcessCommand.setProcessId( "org.drools.test.TestProcess" );
+        ProcessInstance processInstance = (ProcessInstance) service.execute( startProcessCommand );
+        System.out.println( "Started process instance " + processInstance.getId() );
         service.dispose();
-        
-        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+
+        service = new SingleSessionCommandService( kbase,
+                                                   config,
+                                                   env,
+                                                   sessionId );
         GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
-        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
-        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
-        assertNotNull(processInstance);
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = (ProcessInstance) service.execute( getProcessInstanceCommand );
+        assertNotNull( processInstance );
         service.dispose();
 
-        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
-        Thread.sleep(3000);
+        service = new SingleSessionCommandService( kbase,
+                                                   config,
+                                                   env,
+                                                   sessionId );
+        Thread.sleep( 3000 );
         getProcessInstanceCommand = new GetProcessInstanceCommand();
-        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
-        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
-        assertNull(processInstance);
-	}
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = (ProcessInstance) service.execute( getProcessInstanceCommand );
+        assertNull( processInstance );
+    }
 
     private Package getProcessTimer() {
-    	RuleFlowProcess process = new RuleFlowProcess();
-    	process.setId("org.drools.test.TestProcess");
-    	process.setName("TestProcess");
-    	process.setPackageName("org.drools.test");
-    	StartNode start = new StartNode();
-    	start.setId(1);
-    	start.setName("Start");
-    	process.addNode(start);
-    	TimerNode timerNode = new TimerNode();
-    	timerNode.setId(2);
-    	timerNode.setName("Timer");
-    	Timer timer = new Timer();
-    	timer.setDelay(2000);
-    	timerNode.setTimer(timer);
-    	process.addNode(timerNode);
-    	new ConnectionImpl(start, Node.CONNECTION_DEFAULT_TYPE, timerNode, Node.CONNECTION_DEFAULT_TYPE);
-    	ActionNode actionNode = new ActionNode();
-    	actionNode.setId(3);
-    	actionNode.setName("Action");
-    	DroolsConsequenceAction action = new DroolsConsequenceAction();
-    	action.setDialect("java");
-    	action.setConsequence("System.out.println(\"Executed action\");");
-    	actionNode.setAction(action);
-    	process.addNode(actionNode);
-    	new ConnectionImpl(timerNode, Node.CONNECTION_DEFAULT_TYPE, actionNode, Node.CONNECTION_DEFAULT_TYPE);
-    	EndNode end = new EndNode();
-    	end.setId(6);
-    	end.setName("End");
-    	process.addNode(end);
-    	new ConnectionImpl(actionNode, Node.CONNECTION_DEFAULT_TYPE, end, Node.CONNECTION_DEFAULT_TYPE);
-    	
-    	PackageBuilder packageBuilder = new PackageBuilder();
-    	ProcessBuilder processBuilder = new ProcessBuilder(packageBuilder);
-    	processBuilder.buildProcess(process, null);
-    	return packageBuilder.getPackage();
+        RuleFlowProcess process = new RuleFlowProcess();
+        process.setId( "org.drools.test.TestProcess" );
+        process.setName( "TestProcess" );
+        process.setPackageName( "org.drools.test" );
+        StartNode start = new StartNode();
+        start.setId( 1 );
+        start.setName( "Start" );
+        process.addNode( start );
+        TimerNode timerNode = new TimerNode();
+        timerNode.setId( 2 );
+        timerNode.setName( "Timer" );
+        Timer timer = new Timer();
+        timer.setDelay( 2000 );
+        timerNode.setTimer( timer );
+        process.addNode( timerNode );
+        new ConnectionImpl( start,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            timerNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        ActionNode actionNode = new ActionNode();
+        actionNode.setId( 3 );
+        actionNode.setName( "Action" );
+        DroolsConsequenceAction action = new DroolsConsequenceAction();
+        action.setDialect( "java" );
+        action.setConsequence( "System.out.println(\"Executed action\");" );
+        actionNode.setAction( action );
+        process.addNode( actionNode );
+        new ConnectionImpl( timerNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        EndNode end = new EndNode();
+        end.setId( 6 );
+        end.setName( "End" );
+        process.addNode( end );
+        new ConnectionImpl( actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            end,
+                            Node.CONNECTION_DEFAULT_TYPE );
+
+        PackageBuilder packageBuilder = new PackageBuilder();
+        ProcessBuilder processBuilder = new ProcessBuilder( packageBuilder );
+        processBuilder.buildProcess( process,
+                                     null );
+        return packageBuilder.getPackage();
     }
-    
-	public void testPersistenceTimer2() throws Exception {
+
+    public void FIXME_testPersistenceTimer2() throws Exception {
         Environment env = KnowledgeBaseFactory.newEnvironment();
         env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
                  emf );
         env.set( "drools.TransactionManager",
                  TransactionManagerServices.getTransactionManager() );
-        
-		Properties properties = new Properties();
-		properties.setProperty("drools.commandService", "org.drools.persistence.session.SingleSessionCommandService");
-		properties.setProperty("drools.processInstanceManagerFactory", "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory");
-		properties.setProperty("drools.workItemManagerFactory", "org.drools.persistence.processinstance.JPAWorkItemManagerFactory");
-		properties.setProperty("drools.processSignalManagerFactory", "org.drools.persistence.processinstance.JPASignalManagerFactory");
-		SessionConfiguration config = new SessionConfiguration(properties);
 
-		RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-        Package pkg = getProcessTimer2();
-        ruleBase.addPackage(pkg);
+        Properties properties = new Properties();
+        properties.setProperty( "drools.commandService",
+                                "org.drools.persistence.session.SingleSessionCommandService" );
+        properties.setProperty( "drools.processInstanceManagerFactory",
+                                "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory" );
+        properties.setProperty( "drools.workItemManagerFactory",
+                                "org.drools.persistence.processinstance.JPAWorkItemManagerFactory" );
+        properties.setProperty( "drools.processSignalManagerFactory",
+                                "org.drools.persistence.processinstance.JPASignalManagerFactory" );
+        SessionConfiguration config = new SessionConfiguration( properties );
 
-        SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config, env);
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        Collection<KnowledgePackage> kpkgs = getProcessWorkItems();
+        kbase.addKnowledgePackages( kpkgs );
+
+        SingleSessionCommandService service = new SingleSessionCommandService( kbase,
+                                                                               config,
+                                                                               env );
         int sessionId = service.getSessionId();
         StartProcessCommand startProcessCommand = new StartProcessCommand();
-        startProcessCommand.setProcessId("org.drools.test.TestProcess");
-        ProcessInstance processInstance = (ProcessInstance) service.execute(startProcessCommand);
-        System.out.println("Started process instance " + processInstance.getId());
-        
-        Thread.sleep(2000);
+        startProcessCommand.setProcessId( "org.drools.test.TestProcess" );
+        ProcessInstance processInstance = (ProcessInstance) service.execute( startProcessCommand );
+        System.out.println( "Started process instance " + processInstance.getId() );
 
-        service = new SingleSessionCommandService(ruleBase, config, env, sessionId);
+        Thread.sleep( 2000 );
+
+        service = new SingleSessionCommandService( kbase,
+                                                   config,
+                                                   env,
+                                                   sessionId );
         GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
-        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
-        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
-        assertNull(processInstance);
-	}
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = (ProcessInstance) service.execute( getProcessInstanceCommand );
+        assertNull( processInstance );
+    }
 
     private Package getProcessTimer2() {
-    	RuleFlowProcess process = new RuleFlowProcess();
-    	process.setId("org.drools.test.TestProcess");
-    	process.setName("TestProcess");
-    	process.setPackageName("org.drools.test");
-    	StartNode start = new StartNode();
-    	start.setId(1);
-    	start.setName("Start");
-    	process.addNode(start);
-    	TimerNode timerNode = new TimerNode();
-    	timerNode.setId(2);
-    	timerNode.setName("Timer");
-    	Timer timer = new Timer();
-    	timer.setDelay(0);
-    	timerNode.setTimer(timer);
-    	process.addNode(timerNode);
-    	new ConnectionImpl(start, Node.CONNECTION_DEFAULT_TYPE, timerNode, Node.CONNECTION_DEFAULT_TYPE);
-    	ActionNode actionNode = new ActionNode();
-    	actionNode.setId(3);
-    	actionNode.setName("Action");
-    	DroolsConsequenceAction action = new DroolsConsequenceAction();
-    	action.setDialect("java");
-    	action.setConsequence("try { Thread.sleep(1000); } catch (Throwable t) {} System.out.println(\"Executed action\");");
-    	actionNode.setAction(action);
-    	process.addNode(actionNode);
-    	new ConnectionImpl(timerNode, Node.CONNECTION_DEFAULT_TYPE, actionNode, Node.CONNECTION_DEFAULT_TYPE);
-    	EndNode end = new EndNode();
-    	end.setId(6);
-    	end.setName("End");
-    	process.addNode(end);
-    	new ConnectionImpl(actionNode, Node.CONNECTION_DEFAULT_TYPE, end, Node.CONNECTION_DEFAULT_TYPE);
-    	
-    	PackageBuilder packageBuilder = new PackageBuilder();
-    	ProcessBuilder processBuilder = new ProcessBuilder(packageBuilder);
-    	processBuilder.buildProcess(process, null);
-    	return packageBuilder.getPackage();
+        RuleFlowProcess process = new RuleFlowProcess();
+        process.setId( "org.drools.test.TestProcess" );
+        process.setName( "TestProcess" );
+        process.setPackageName( "org.drools.test" );
+        StartNode start = new StartNode();
+        start.setId( 1 );
+        start.setName( "Start" );
+        process.addNode( start );
+        TimerNode timerNode = new TimerNode();
+        timerNode.setId( 2 );
+        timerNode.setName( "Timer" );
+        Timer timer = new Timer();
+        timer.setDelay( 0 );
+        timerNode.setTimer( timer );
+        process.addNode( timerNode );
+        new ConnectionImpl( start,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            timerNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        ActionNode actionNode = new ActionNode();
+        actionNode.setId( 3 );
+        actionNode.setName( "Action" );
+        DroolsConsequenceAction action = new DroolsConsequenceAction();
+        action.setDialect( "java" );
+        action.setConsequence( "try { Thread.sleep(1000); } catch (Throwable t) {} System.out.println(\"Executed action\");" );
+        actionNode.setAction( action );
+        process.addNode( actionNode );
+        new ConnectionImpl( timerNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        EndNode end = new EndNode();
+        end.setId( 6 );
+        end.setName( "End" );
+        process.addNode( end );
+        new ConnectionImpl( actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            end,
+                            Node.CONNECTION_DEFAULT_TYPE );
+
+        PackageBuilder packageBuilder = new PackageBuilder();
+        ProcessBuilder processBuilder = new ProcessBuilder( packageBuilder );
+        processBuilder.buildProcess( process,
+                                     null );
+        return packageBuilder.getPackage();
     }
-    
+
 }




More information about the jboss-svn-commits mailing list