[jboss-svn-commits] JBL Code SVN: r23993 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/base/accumulators and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Nov 20 10:17:15 EST 2008


Author: tirelli
Date: 2008-11-20 10:17:15 -0500 (Thu, 20 Nov 2008)
New Revision: 23993

Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/AccumulateTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MVELAccumulatorFunctionExecutor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/RuleBaseNodes.java
Log:
JBRULES-1855: fixing serialization

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/AccumulateTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/AccumulateTest.java	2008-11-20 15:16:34 UTC (rev 23992)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/AccumulateTest.java	2008-11-20 15:17:15 UTC (rev 23993)
@@ -4,6 +4,7 @@
 import java.io.InputStreamReader;
 import java.io.Reader;
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
 import junit.framework.Assert;
@@ -18,6 +19,7 @@
 import org.drools.RuleBaseConfiguration;
 import org.drools.RuleBaseFactory;
 import org.drools.RuntimeDroolsException;
+import org.drools.StatefulSession;
 import org.drools.WorkingMemory;
 import org.drools.compiler.DrlParser;
 import org.drools.compiler.DroolsParserException;
@@ -62,9 +64,12 @@
         final Package pkg = builder.getPackage();
 
         // add the package to a rulebase
-        final RuleBase ruleBase = getRuleBase();
+        RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        // load up the rulebase
+
+        // test rulebase serialization
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+
         return ruleBase;
     }
 
@@ -836,68 +841,98 @@
         final Reader reader = new InputStreamReader( getClass().getResourceAsStream( fileName ) );
         final RuleBase ruleBase = loadRuleBase( reader );
 
-        final WorkingMemory wm = ruleBase.newStatefulSession();
-        final List results = new ArrayList();
+        StatefulSession session = ruleBase.newStatefulSession();
+        DataSet data = new DataSet();
+        data.results = new ArrayList<Object>();
 
-        wm.setGlobal( "results",
-                      results );
+        session.setGlobal( "results",
+                           data.results );
 
-        final Cheese[] cheese = new Cheese[]{new Cheese( "stilton",
-                                                         8 ), new Cheese( "stilton",
-                                                                          10 ), new Cheese( "stilton",
-                                                                                            9 ), new Cheese( "brie",
-                                                                                                             11 ), new Cheese( "brie",
-                                                                                                                               4 ), new Cheese( "provolone",
-                                                                                                                                                8 )};
-        final Person bob = new Person( "Bob",
-                                       "stilton" );
+        data.cheese = new Cheese[]{new Cheese( "stilton",
+                                               8,
+                                               0 ), new Cheese( "stilton",
+                                                                10,
+                                                                1 ), new Cheese( "stilton",
+                                                                                 9,
+                                                                                 2 ), new Cheese( "brie",
+                                                                                                  11,
+                                                                                                  3 ), new Cheese( "brie",
+                                                                                                                   4,
+                                                                                                                   4 ), new Cheese( "provolone",
+                                                                                                                                    8,
+                                                                                                                                    5 )};
+        data.bob = new Person( "Bob",
+                               "stilton" );
 
-        final FactHandle[] cheeseHandles = new FactHandle[cheese.length];
-        for ( int i = 0; i < cheese.length; i++ ) {
-            cheeseHandles[i] = wm.insert( cheese[i] );
+        data.cheeseHandles = new FactHandle[data.cheese.length];
+        for ( int i = 0; i < data.cheese.length; i++ ) {
+            data.cheeseHandles[i] = session.insert( data.cheese[i] );
         }
-        final FactHandle bobHandle = wm.insert( bob );
+        data.bobHandle = session.insert( data.bob );
 
         // ---------------- 1st scenario
-        wm.fireAllRules();
+        session.fireAllRules();
         Assert.assertEquals( 1,
-                             results.size() );
+                             data.results.size() );
         Assert.assertEquals( 27,
-                             ((Number) results.get( results.size() - 1 )).intValue() );
+                             ((Number) data.results.get( data.results.size() - 1 )).intValue() );
 
+        session = SerializationHelper.getSerialisedStatefulSession( session,
+                                                                    ruleBase );
+        updateReferences( session,
+                          data );
+
         // ---------------- 2nd scenario
         final int index = 1;
-        cheese[index].setPrice( 3 );
-        wm.update( cheeseHandles[index],
-                   cheese[index] );
-        wm.fireAllRules();
+        data.cheese[index].setPrice( 3 );
+        session.update( data.cheeseHandles[index],
+                        data.cheese[index] );
+        session.fireAllRules();
 
         Assert.assertEquals( 2,
-                             results.size() );
+                             data.results.size() );
         Assert.assertEquals( 20,
-                             ((Number) results.get( results.size() - 1 )).intValue() );
+                             ((Number) data.results.get( data.results.size() - 1 )).intValue() );
 
         // ---------------- 3rd scenario
-        bob.setLikes( "brie" );
-        wm.update( bobHandle,
-                   bob );
-        wm.fireAllRules();
+        data.bob.setLikes( "brie" );
+        session.update( data.bobHandle,
+                        data.bob );
+        session.fireAllRules();
 
         Assert.assertEquals( 3,
-                             results.size() );
+                             data.results.size() );
         Assert.assertEquals( 15,
-                             ((Number) results.get( results.size() - 1 )).intValue() );
+                             ((Number) data.results.get( data.results.size() - 1 )).intValue() );
 
         // ---------------- 4th scenario
-        wm.retract( cheeseHandles[3] );
-        wm.fireAllRules();
+        session.retract( data.cheeseHandles[3] );
+        session.fireAllRules();
 
         // should not have fired as per constraint
         Assert.assertEquals( 3,
-                             results.size() );
+                             data.results.size() );
 
     }
 
+    private void updateReferences(final StatefulSession session,
+                                  final DataSet data ) {
+        data.results = (List<?>) session.getGlobal( "results" );
+        for ( Iterator< ? > it = session.iterateObjects(); it.hasNext(); ) {
+            Object next = (Object) it.next();
+            if ( next instanceof Cheese ) {
+                Cheese c = (Cheese) next;
+                data.cheese[c.getOldPrice()] = c;
+                data.cheeseHandles[c.getOldPrice()] = session.getFactHandle( c );
+                assertNotNull( data.cheeseHandles[c.getOldPrice()] );
+            } else if( next instanceof Person ) {
+                Person p = (Person) next;
+                data.bob = p;
+                data.bobHandle = session.getFactHandle( data.bob );
+            }
+        }
+    }
+
     public void execTestAccumulateCount(String fileName) throws Exception {
         // read in the source
         final Reader reader = new InputStreamReader( getClass().getResourceAsStream( fileName ) );
@@ -1305,4 +1340,12 @@
         assertEquals( new Integer( 100 ),
                       results.get( 0 ) );
     }
+
+    public static class DataSet {
+        public Cheese[]     cheese;
+        public FactHandle[] cheeseHandles;
+        public Person       bob;
+        public FactHandle   bobHandle;
+        public List< ? >    results;
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MVELAccumulatorFunctionExecutor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MVELAccumulatorFunctionExecutor.java	2008-11-20 15:16:34 UTC (rev 23992)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MVELAccumulatorFunctionExecutor.java	2008-11-20 15:17:15 UTC (rev 23993)
@@ -169,6 +169,9 @@
         Externalizable {
         public Serializable               context;
         public Map<Integer, Serializable> reverseSupport;
+        
+        public MVELAccumulatorFunctionContext() {
+        }
 
         public void readExternal(ObjectInput in) throws IOException,
                                                 ClassNotFoundException {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java	2008-11-20 15:16:34 UTC (rev 23992)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java	2008-11-20 15:17:15 UTC (rev 23993)
@@ -24,6 +24,7 @@
 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;
@@ -72,6 +73,7 @@
 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;
@@ -324,7 +326,7 @@
         }
 
         readLeftTuples( context );
-
+ 
         readPropagationContexts( context );
 
         readActivations( context );
@@ -598,6 +600,22 @@
                 }
                 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 );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java	2008-11-20 15:16:34 UTC (rev 23992)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java	2008-11-20 15:17:15 UTC (rev 23993)
@@ -23,12 +23,12 @@
 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.ProcessInstance;
 import org.drools.process.instance.WorkItemManager;
 import org.drools.process.instance.context.swimlane.SwimlaneContextInstance;
 import org.drools.process.instance.context.variable.VariableScopeInstance;
@@ -345,7 +345,7 @@
             stream.writeShort( PersisterEnums.LEFT_TUPLE );
 
             stream.writeInt( leftTuple.getLeftTupleSink().getId() );
-            context.out.println( "LeftTuple int:" + leftTuple.getLeftTupleSink().getId() );
+            context.out.println( "LeftTuple sinkId:" + leftTuple.getLeftTupleSink().getId() );
             writeLeftTuple( leftTuple,
                             context,
                             true );
@@ -377,7 +377,7 @@
         ObjectOutputStream stream = context.stream;
         InternalWorkingMemory wm = context.wm;
         stream.writeInt( rightTuple.getRightTupleSink().getId() );
-        context.out.println( "RightTuple int:" + rightTuple.getRightTupleSink().getId() );
+        context.out.println( "RightTuple sinkId:" + rightTuple.getRightTupleSink().getId() );
     }
 
     public static void writeLeftTuples(MarshallerWriteContext context) throws IOException {
@@ -395,7 +395,7 @@
                 stream.writeInt( leftTuple.getLeftTupleSink().getId() );
                 stream.writeInt( handle.getId() );
 
-                context.out.println( "LeftTuple int:" + leftTuple.getLeftTupleSink().getId() + " int:" + handle.getId() );
+                context.out.println( "LeftTuple sinkId:" + leftTuple.getLeftTupleSink().getId() + " handleId:" + handle.getId() );
                 writeLeftTuple( leftTuple,
                                 context,
                                 true );
@@ -427,6 +427,7 @@
                                     recurse );
                 }
                 stream.writeShort( PersisterEnums.END );
+                context.out.println( "JoinNode   ---   END" );
                 break;
             }
             case NodeTypeEnums.EvalConditionNode : {
@@ -550,6 +551,22 @@
                 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();

Modified: 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	2008-11-20 15:16:34 UTC (rev 23992)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/RuleBaseNodes.java	2008-11-20 15:17:15 UTC (rev 23993)
@@ -62,6 +62,15 @@
                                   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 );




More information about the jboss-svn-commits mailing list