[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