[jboss-svn-commits] JBL Code SVN: r18230 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel and 7 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Jan 31 17:22:32 EST 2008


Author: tirelli
Date: 2008-01-31 17:22:32 -0500 (Thu, 31 Jan 2008)
New Revision: 18230

Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilderTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/dataproviders/MVELDataProvider.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELGlobalVariable.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELKnowledgeHelper.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELLocalDeclarationVariable.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAccumulator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELEvalExpression.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Action.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/DataProvider.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/EvalExpression.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/EvalConditionNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/FromNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockEvalCondition.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/PackageCompilationDataTest.java
Log:
JBRULES-1392: fixing DroolsMVELFactory sharing

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel	2008-01-31 22:22:32 UTC (rev 18230)
@@ -136,10 +136,14 @@
 public class @{invokerClassName} implements org.drools.spi.EvalExpression, org.drools.spi.CompiledInvoker
 {
     private static final long serialVersionUID  = 400L;
+
+    // no need for context    
+    public Object createContext() { return null; }
     
     public boolean evaluate(org.drools.spi.Tuple tuple,
                             org.drools.rule.Declaration[] declarations, 
-                            org.drools.WorkingMemory workingMemory) throws Exception {                             
+                            org.drools.WorkingMemory workingMemory,
+                            Object context ) throws Exception {                             
 
         @foreach{declarationTypes as type, declarations as declr} @{type} @{declr.identifier} = ( @{type} ) declarations[@{i0}].@{declr.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, ( (org.drools.common.InternalFactHandle) tuple.get( declarations[@{i0}] ) ).getObject() );
         @end{}                

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilderTest.java	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilderTest.java	2008-01-31 22:22:32 UTC (rev 18230)
@@ -77,15 +77,19 @@
                                            10 );
         final InternalFactHandle f0 = (InternalFactHandle) wm.insert( cheddar );
         final ReteTuple tuple = new ReteTuple( f0 );
+        
+        Object evalContext = eval.createContext();
 
         assertTrue( eval.isAllowed( tuple,
-                                    wm ) );
+                                    wm,
+                                    evalContext ) );
 
         cheddar.setPrice( 9 );
         wm.update( f0,
                    cheddar );
         assertFalse( eval.isAllowed( tuple,
-                                     wm ) );
+                                     wm,
+                                     evalContext ) );
     }
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/dataproviders/MVELDataProvider.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/dataproviders/MVELDataProvider.java	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/dataproviders/MVELDataProvider.java	2008-01-31 22:22:32 UTC (rev 18230)
@@ -18,24 +18,33 @@
     DataProvider,
     Serializable  {
 
+    private static final long serialVersionUID = 1901006343031798173L;
+    
     private final Serializable      expression;
-    private final DroolsMVELFactory factory;
+    private final DroolsMVELFactory prototype;
 
     public MVELDataProvider(final Serializable expression,
                             final DroolsMVELFactory factory) {
         this.expression = expression;
-        this.factory = factory;
+        this.prototype = factory;
     }
 
     public Declaration[] getRequiredDeclarations() {
         return new Declaration[]{};
         //return factory.getRequiredDeclarations();
     }
+    
+    public Object createContext() {
+        return this.prototype.clone();
+    }
 
     public Iterator getResults(final Tuple tuple,
                                final WorkingMemory wm,
-                               final PropagationContext ctx) {
-        this.factory.setContext( tuple,
+                               final PropagationContext ctx,
+                               final Object executionContext ) {
+        DroolsMVELFactory factory = (DroolsMVELFactory) executionContext;
+        
+        factory.setContext( tuple,
                                  null,
                                  null,
                                  wm,
@@ -43,7 +52,7 @@
 
         //this.expression.
         final Object result = MVEL.executeExpression( this.expression,
-                                                      this.factory );
+                                                      factory );
         if ( result instanceof Collection ) {
             return ((Collection) result).iterator();
         } else if ( result instanceof Iterator ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELFactory.java	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELFactory.java	2008-01-31 22:22:32 UTC (rev 18230)
@@ -1,8 +1,5 @@
 package org.drools.base.mvel;
 
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
 import java.io.Serializable;
 import java.lang.reflect.Method;
 import java.util.Calendar;
@@ -13,13 +10,10 @@
 import java.util.Map;
 
 import org.drools.WorkingMemory;
-import org.drools.common.DroolsObjectInputStream;
 import org.drools.reteoo.ReteTuple;
 import org.drools.rule.Declaration;
-import org.drools.rule.Package;
 import org.drools.spi.KnowledgeHelper;
 import org.drools.spi.Tuple;
-import org.mvel.CompileException;
 import org.mvel.DataConversion;
 import org.mvel.integration.VariableResolver;
 import org.mvel.integration.impl.BaseVariableResolverFactory;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELGlobalVariable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELGlobalVariable.java	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELGlobalVariable.java	2008-01-31 22:22:32 UTC (rev 18230)
@@ -9,6 +9,8 @@
     VariableResolver,
     Serializable {
 
+    private static final long serialVersionUID = -2480015657934353449L;
+    
     private String            name;
     private Class             knownType;
     private DroolsMVELFactory factory;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELKnowledgeHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELKnowledgeHelper.java	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELKnowledgeHelper.java	2008-01-31 22:22:32 UTC (rev 18230)
@@ -2,7 +2,6 @@
 
 import java.io.Serializable;
 
-import org.drools.rule.Declaration;
 import org.drools.spi.KnowledgeHelper;
 import org.mvel.integration.VariableResolver;
 
@@ -11,6 +10,8 @@
     VariableResolver,
     Serializable  {
 
+    private static final long serialVersionUID = 9175428283083361478L;
+    
     private DroolsMVELFactory factory;
     public static final String DROOLS = "drools";
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELLocalDeclarationVariable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELLocalDeclarationVariable.java	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELLocalDeclarationVariable.java	2008-01-31 22:22:32 UTC (rev 18230)
@@ -11,6 +11,8 @@
     VariableResolver,
     Serializable  {
 
+    private static final long serialVersionUID = -8081447010148362496L;
+    
     private Declaration       declaration;
     private DroolsMVELFactory factory;
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAccumulator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAccumulator.java	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAccumulator.java	2008-01-31 22:22:32 UTC (rev 18230)
@@ -39,7 +39,7 @@
 
     private static final long       serialVersionUID = 400L;
 
-    private final DroolsMVELFactory model;
+    private final DroolsMVELFactory prototype;
     private final Serializable      init;
     private final Serializable      action;
     private final Serializable      reverse;
@@ -51,7 +51,7 @@
                            final Serializable reverse,
                            final Serializable result) {
         super();
-        this.model = factory;
+        this.prototype = factory;
         this.init = init;
         this.action = action;
         this.reverse = reverse;
@@ -148,7 +148,7 @@
     }
 
     public Object createWorkingMemoryContext() {
-        return this.model.clone();
+        return this.prototype.clone();
     }
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAction.java	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAction.java	2008-01-31 22:22:32 UTC (rev 18230)
@@ -4,8 +4,6 @@
 
 import org.drools.WorkingMemory;
 import org.drools.spi.Action;
-import org.drools.spi.Consequence;
-import org.drools.spi.KnowledgeHelper;
 import org.mvel.CompiledExpression;
 import org.mvel.MVEL;
 import org.mvel.debug.DebugTools;
@@ -17,20 +15,25 @@
     private static final long       serialVersionUID = 400L;
 
     private final Serializable      expr;
-    private final DroolsMVELFactory factory;
+    private final DroolsMVELFactory prototype;
 
     public MVELAction(final Serializable expr,
                       final DroolsMVELFactory factory) {
         this.expr = expr;
-        this.factory = factory;
+        this.prototype = factory;
     }
     
     public String getDialect() {
         return "mvel";
     }
 
-    public void execute(final WorkingMemory workingMemory) throws Exception {
-        this.factory.setContext( null,
+    public Object createContext() {
+        return this.prototype.clone();
+    }
+    
+    public void execute(final WorkingMemory workingMemory, final Object actionContext ) throws Exception {
+        DroolsMVELFactory factory = (DroolsMVELFactory) actionContext;
+        factory.setContext( null,
                                  null,
                                  null,
                                  workingMemory,
@@ -46,11 +49,11 @@
             }
             MVEL.executeDebugger( compexpr,
                                   null,
-                                  this.factory );
+                                  factory );
         } else {
             MVEL.executeExpression( compexpr,
                                     null,
-                                    this.factory );
+                                    factory );
         }
 
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELEvalExpression.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELEvalExpression.java	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELEvalExpression.java	2008-01-31 22:22:32 UTC (rev 18230)
@@ -17,25 +17,31 @@
     private static final long       serialVersionUID = 400L;
 
     private final Serializable      expr;
-    private final DroolsMVELFactory factory;
+    private final DroolsMVELFactory prototype;
 
     public MVELEvalExpression(final Serializable expr,
                               final DroolsMVELFactory factory) {
         this.expr = expr;
-        this.factory = factory;
+        this.prototype = factory;
     }
+    
+    public Object createContext() {
+        return this.prototype.clone();
+    }
 
     public boolean evaluate(final Tuple tuple,
                             final Declaration[] requiredDeclarations,
-                            final WorkingMemory workingMemory) throws Exception {
-        this.factory.setContext( tuple,
+                            final WorkingMemory workingMemory,
+                            final Object context) throws Exception {
+        DroolsMVELFactory factory = (DroolsMVELFactory) context;
+        factory.setContext( tuple,
                                  null,
                                  null,
                                  workingMemory,
                                  null );
         final Boolean result = (Boolean) MVEL.executeExpression( this.expr,
                                                                  new Object(),
-                                                                 this.factory );
+                                                                 factory );
         return result.booleanValue();
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java	2008-01-31 22:22:32 UTC (rev 18230)
@@ -16,6 +16,8 @@
  * limitations under the License.
  */
 
+import java.io.Serializable;
+
 import org.drools.RuleBaseConfiguration;
 import org.drools.common.BaseNode;
 import org.drools.common.InternalWorkingMemory;
@@ -141,14 +143,15 @@
     public void assertTuple(final ReteTuple tuple,
                             final PropagationContext context,
                             final InternalWorkingMemory workingMemory) {
+        final EvalMemory memory = (EvalMemory) workingMemory.getNodeMemory( this );
 
         final boolean allowed = this.condition.isAllowed( tuple,
-                                                          workingMemory );
+                                                          workingMemory,
+                                                          memory.context );
 
         if ( allowed ) {
             if ( this.tupleMemoryEnabled ) {
-                final TupleHashTable memory = (TupleHashTable) workingMemory.getNodeMemory( this );
-                memory.add( tuple );
+                memory.tupleMemory.add( tuple );
             }
 
             this.sink.propagateAssertTuple( tuple,
@@ -160,10 +163,10 @@
     public void retractTuple(final ReteTuple tuple,
                              final PropagationContext context,
                              final InternalWorkingMemory workingMemory) {
-        final TupleHashTable memory = (TupleHashTable) workingMemory.getNodeMemory( this );
+        final EvalMemory memory = (EvalMemory) workingMemory.getNodeMemory( this );
 
         // can we improve that?
-        final ReteTuple memTuple = memory.remove( tuple );
+        final ReteTuple memTuple = memory.tupleMemory.remove( tuple );
         if ( memTuple != null ) {
             this.sink.propagateRetractTuple( memTuple,
                                              context,
@@ -199,7 +202,7 @@
     }
 
     public Object createMemory(final RuleBaseConfiguration config) {
-        return new TupleHashTable();
+        return new EvalMemory( this.tupleMemoryEnabled, this.condition.createContext() ); 
     }
 
     /* (non-Javadoc)
@@ -209,9 +212,9 @@
                            final PropagationContext context,
                            final InternalWorkingMemory workingMemory) {
 
-        final TupleHashTable memory = (TupleHashTable) workingMemory.getNodeMemory( this );
+        final EvalMemory memory = (EvalMemory) workingMemory.getNodeMemory( this );
 
-        final Iterator it = memory.iterator();
+        final Iterator it = memory.tupleMemory.iterator();
         for ( ReteTuple tuple = (ReteTuple) it.next(); tuple != null; tuple = (ReteTuple) it.next() ) {
             sink.assertTuple( tuple,
                               context,
@@ -278,5 +281,20 @@
     public void setPreviousTupleSinkNode(final TupleSinkNode previous) {
         this.previousTupleSinkNode = previous;
     }
+    
+    public static class EvalMemory implements Serializable {
 
+        private static final long serialVersionUID = -2754669682742843929L;
+        
+        public TupleHashTable tupleMemory;
+        public Object context;
+        
+        public EvalMemory( final boolean tupleMemoryEnabled, final Object context ) {
+            this.context = context;
+            if( tupleMemoryEnabled ) {
+                this.tupleMemory = new TupleHashTable();
+            }
+        }
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java	2008-01-31 22:22:32 UTC (rev 18230)
@@ -1,5 +1,7 @@
 package org.drools.reteoo;
 
+import java.io.Serializable;
+
 import org.drools.RuleBaseConfiguration;
 import org.drools.common.BaseNode;
 import org.drools.common.BetaConstraints;
@@ -32,9 +34,9 @@
 
     private TupleSinkNode              previousTupleSinkNode;
     private TupleSinkNode              nextTupleSinkNode;
-    
-    protected boolean                 tupleMemoryEnabled;      
 
+    protected boolean                  tupleMemoryEnabled;
+
     public FromNode(final int id,
                     final DataProvider dataProvider,
                     final TupleSource tupleSource,
@@ -54,20 +56,23 @@
     public void assertTuple(final ReteTuple leftTuple,
                             final PropagationContext context,
                             final InternalWorkingMemory workingMemory) {
-        final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
+        final FromMemory memory = (FromMemory) workingMemory.getNodeMemory( this );
 
-        memory.getTupleMemory().add( leftTuple );
+        memory.betaMemory.getTupleMemory().add( leftTuple );
         final LinkedList list = new LinkedList();
-        this.betaConstraints.updateFromTuple( memory.getContext(),
+        this.betaConstraints.updateFromTuple( memory.betaMemory.getContext(),
                                               workingMemory,
                                               leftTuple );
 
         for ( final java.util.Iterator it = this.dataProvider.getResults( leftTuple,
                                                                           workingMemory,
-                                                                          context ); it.hasNext(); ) {
+                                                                          context,
+                                                                          memory.providerContext ); it.hasNext(); ) {
             final Object object = it.next();
 
-            final InternalFactHandle handle = workingMemory.getFactHandleFactory().newFactHandle( object, false, workingMemory );
+            final InternalFactHandle handle = workingMemory.getFactHandleFactory().newFactHandle( object,
+                                                                                                  false,
+                                                                                                  workingMemory );
 
             boolean isAllowed = true;
             if ( this.alphaConstraints != null ) {
@@ -82,7 +87,7 @@
                 }
             }
 
-            if ( isAllowed && this.betaConstraints.isAllowedCachedLeft( memory.getContext(),
+            if ( isAllowed && this.betaConstraints.isAllowedCachedLeft( memory.betaMemory.getContext(),
                                                                         handle ) ) {
                 list.add( new LinkedListEntry( handle ) );
 
@@ -94,12 +99,12 @@
                 workingMemory.getFactHandleFactory().destroyFactHandle( handle );
             }
         }
-        
-        this.betaConstraints.resetTuple( memory.getContext() );
-        
+
+        this.betaConstraints.resetTuple( memory.betaMemory.getContext() );
+
         if ( !list.isEmpty() ) {
-            memory.getCreatedHandles().put( leftTuple,
-                                            list );
+            memory.betaMemory.getCreatedHandles().put( leftTuple,
+                                                       list );
         }
 
     }
@@ -108,10 +113,10 @@
                              final PropagationContext context,
                              final InternalWorkingMemory workingMemory) {
 
-        final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
-        final ReteTuple tuple = memory.getTupleMemory().remove( leftTuple );
+        final FromMemory memory = (FromMemory) workingMemory.getNodeMemory( this );
+        final ReteTuple tuple = memory.betaMemory.getTupleMemory().remove( leftTuple );
 
-        final LinkedList list = (LinkedList) memory.getCreatedHandles().remove( tuple );
+        final LinkedList list = (LinkedList) memory.betaMemory.getCreatedHandles().remove( tuple );
         // if tuple was propagated
         if ( list != null ) {
             for ( LinkedListEntry entry = (LinkedListEntry) list.getFirst(); entry != null; entry = (LinkedListEntry) entry.getNext() ) {
@@ -145,12 +150,13 @@
     }
 
     public void remove(ReteooBuilder builder,
-                       final BaseNode node, final InternalWorkingMemory[] workingMemories) {
+                       final BaseNode node,
+                       final InternalWorkingMemory[] workingMemories) {
 
         if ( !node.isInUse() ) {
             removeTupleSink( (TupleSink) node );
         }
-        removeShare(builder);
+        removeShare( builder );
 
         if ( !this.isInUse() ) {
             for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
@@ -158,18 +164,19 @@
             }
         }
         this.tupleSource.remove( builder,
-                                 this, workingMemories );
+                                 this,
+                                 workingMemories );
     }
 
     public void updateSink(final TupleSink sink,
                            final PropagationContext context,
                            final InternalWorkingMemory workingMemory) {
 
-        final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
+        final FromMemory memory = (FromMemory) workingMemory.getNodeMemory( this );
 
-        final Iterator tupleIter = memory.getTupleMemory().iterator();
+        final Iterator tupleIter = memory.betaMemory.getTupleMemory().iterator();
         for ( ReteTuple tuple = (ReteTuple) tupleIter.next(); tuple != null; tuple = (ReteTuple) tupleIter.next() ) {
-            final LinkedList list = (LinkedList) memory.getCreatedHandles().remove( tuple );
+            final LinkedList list = (LinkedList) memory.betaMemory.getCreatedHandles().remove( tuple );
             if ( list == null ) {
                 continue;
             }
@@ -185,18 +192,20 @@
     }
 
     public Object createMemory(final RuleBaseConfiguration config) {
-        return new BetaMemory( new TupleHashTable(),
-                               null,
-                               this.betaConstraints.createContext() );
+        BetaMemory beta = new BetaMemory( new TupleHashTable(),
+                                          null,
+                                          this.betaConstraints.createContext() );
+        return new FromMemory( beta,
+                               this.dataProvider.createContext() );
     }
-    
+
     public boolean isTupleMemoryEnabled() {
         return tupleMemoryEnabled;
     }
 
     public void setTupleMemoryEnabled(boolean tupleMemoryEnabled) {
         this.tupleMemoryEnabled = tupleMemoryEnabled;
-    }    
+    }
 
     /**
      * Returns the next node
@@ -234,4 +243,16 @@
         this.previousTupleSinkNode = previous;
     }
 
+    public static class FromMemory implements Serializable {
+        private static final long serialVersionUID = -5802345705144095216L;
+        
+        public BetaMemory betaMemory;
+        public Object     providerContext;
+
+        public FromMemory(BetaMemory betaMemory,
+                          Object providerContext) {
+            this.betaMemory = betaMemory;
+            this.providerContext = providerContext;
+        }
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java	2008-01-31 22:22:32 UTC (rev 18230)
@@ -65,13 +65,19 @@
     public Declaration[] getRequiredDeclarations() {
         return this.requiredDeclarations;
     }
+    
+    public Object createContext() {
+        return this.expression.createContext();
+    }
 
     public boolean isAllowed(final Tuple tuple,
-                             final WorkingMemory workingMemory) {
+                             final WorkingMemory workingMemory,
+                             final Object context ) {
         try {
             return this.expression.evaluate( tuple,
                                              this.requiredDeclarations,
-                                             workingMemory );
+                                             workingMemory,
+                                             context );
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException( e );
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Action.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Action.java	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Action.java	2008-01-31 22:22:32 UTC (rev 18230)
@@ -1,8 +1,10 @@
 package org.drools.spi;
 
 import org.drools.WorkingMemory;
-import org.drools.rule.Dialectable;
 
 public interface Action {
-    void execute(WorkingMemory workingMemory) throws Exception ;
+    
+    public Object createContext();
+    
+    public void execute(final WorkingMemory workingMemory, final Object actionContext ) throws Exception ;
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/DataProvider.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/DataProvider.java	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/DataProvider.java	2008-01-31 22:22:32 UTC (rev 18230)
@@ -9,9 +9,12 @@
 public interface DataProvider extends Serializable {
 
     public Declaration[] getRequiredDeclarations();
+    
+    public Object createContext();
 
     public Iterator getResults(Tuple tuple,
                                WorkingMemory wm,
-                               PropagationContext ctx);
+                               PropagationContext ctx,
+                               Object providerContext);
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/EvalExpression.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/EvalExpression.java	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/EvalExpression.java	2008-01-31 22:22:32 UTC (rev 18230)
@@ -22,7 +22,11 @@
 public interface EvalExpression
     extends
     Invoker {
+    
+    public Object createContext();
+    
     public boolean evaluate(Tuple tuple,
                             Declaration[] requiredDeclarations,
-                            WorkingMemory workingMemory) throws Exception;
+                            WorkingMemory workingMemory,
+                            Object context ) throws Exception;
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/EvalConditionNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/EvalConditionNodeTest.java	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/EvalConditionNodeTest.java	2008-01-31 22:22:32 UTC (rev 18230)
@@ -21,6 +21,7 @@
 import org.drools.RuleBaseFactory;
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.PropagationContextImpl;
+import org.drools.reteoo.EvalConditionNode.EvalMemory;
 import org.drools.reteoo.builder.BuildContext;
 import org.drools.spi.PropagationContext;
 import org.drools.util.TupleHashTable;
@@ -79,9 +80,9 @@
                                                               new MockEvalCondition( true ),
                                                               buildContext );
 
-        final TupleHashTable memory = (TupleHashTable) workingMemory.getNodeMemory( node );
+        final EvalMemory memory = (EvalMemory) workingMemory.getNodeMemory( node );
 
-        assertNotNull( memory );
+        assertNotNull( memory.tupleMemory );
     }
 
     /**
@@ -123,13 +124,13 @@
                           this.workingMemory );
 
         // Check memory was populated
-        final TupleHashTable memory = (TupleHashTable) this.workingMemory.getNodeMemory( node );
+        final EvalMemory memory = (EvalMemory) this.workingMemory.getNodeMemory( node );
 
         assertEquals( 2,
-                      memory.size() );
+                      memory.tupleMemory.size() );
 
-        assertTrue( memory.contains( tuple0 ) );
-        assertTrue( memory.contains( tuple1 ) );
+        assertTrue( memory.tupleMemory.contains( tuple0 ) );
+        assertTrue( memory.tupleMemory.contains( tuple1 ) );
 
         // make sure assertions were propagated
         assertEquals( 2,
@@ -170,12 +171,12 @@
                           this.workingMemory );
 
         // Check memory was populated
-        final TupleHashTable memory = (TupleHashTable) this.workingMemory.getNodeMemory( node );
+        final EvalMemory memory = (EvalMemory) this.workingMemory.getNodeMemory( node );
 
         assertEquals( 2,
-                      memory.size() );
-        assertTrue( memory.contains( tuple0 ) );
-        assertTrue( memory.contains( tuple1 ) );
+                      memory.tupleMemory.size() );
+        assertTrue( memory.tupleMemory.contains( tuple0 ) );
+        assertTrue( memory.tupleMemory.contains( tuple1 ) );
 
         // make sure assertions were propagated
         assertEquals( 2,
@@ -188,9 +189,9 @@
 
         // Now test that the fact is retracted correctly
         assertEquals( 1,
-                      memory.size() );
+                      memory.tupleMemory.size() );
 
-        assertTrue( memory.contains( tuple1 ) );
+        assertTrue( memory.tupleMemory.contains( tuple1 ) );
 
         // make sure retractions were propagated
         assertEquals( 1,
@@ -203,7 +204,7 @@
 
         // Now test that the fact is retracted correctly
         assertEquals( 0,
-                      memory.size() );
+                      memory.tupleMemory.size() );
 
         // make sure retractions were propagated
         assertEquals( 2,
@@ -243,10 +244,10 @@
                           this.workingMemory );
 
         // Check memory was not populated
-        final TupleHashTable memory = (TupleHashTable) this.workingMemory.getNodeMemory( node );
+        final EvalMemory memory = (EvalMemory) this.workingMemory.getNodeMemory( node );
 
         assertEquals( 0,
-                      memory.size() );
+                      memory.tupleMemory.size() );
 
         // test no propagations
         assertEquals( 0,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/FromNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/FromNodeTest.java	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/FromNodeTest.java	2008-01-31 22:22:32 UTC (rev 18230)
@@ -24,6 +24,7 @@
 import org.drools.common.InternalFactHandle;
 import org.drools.common.PropagationContextImpl;
 import org.drools.common.SingleBetaConstraints;
+import org.drools.reteoo.FromNode.FromMemory;
 import org.drools.rule.Declaration;
 import org.drools.rule.LiteralConstraint;
 import org.drools.rule.Pattern;
@@ -283,15 +284,15 @@
         assertEquals( 2,
                       asserted.size() );
 
-        final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( from );
+        final FromMemory memory = (FromMemory) workingMemory.getNodeMemory( from );
         assertEquals( 1,
-                      memory.getTupleMemory().size() );
-        assertNull( memory.getFactHandleMemory() );
+                      memory.betaMemory.getTupleMemory().size() );
+        assertNull( memory.betaMemory.getFactHandleMemory() );
         assertEquals( 2,
-                      ((LinkedList) memory.getCreatedHandles().get( tuple )).size() );
+                      ((LinkedList) memory.betaMemory.getCreatedHandles().get( tuple )).size() );
 
-        final InternalFactHandle handle1 = (InternalFactHandle) ((LinkedListEntry) ((LinkedList) memory.getCreatedHandles().get( tuple )).getFirst()).getObject();
-        final InternalFactHandle handle2 = (InternalFactHandle) ((LinkedListEntry) ((LinkedList) memory.getCreatedHandles().get( tuple )).getLast()).getObject();
+        final InternalFactHandle handle1 = (InternalFactHandle) ((LinkedListEntry) ((LinkedList) memory.betaMemory.getCreatedHandles().get( tuple )).getFirst()).getObject();
+        final InternalFactHandle handle2 = (InternalFactHandle) ((LinkedListEntry) ((LinkedList) memory.betaMemory.getCreatedHandles().get( tuple )).getLast()).getObject();
         assertEquals( handle1.getObject(),
                       cheese1 );
         assertEquals( handle2.getObject(),
@@ -301,8 +302,8 @@
                            context,
                            workingMemory );
         assertEquals( 0,
-                      memory.getTupleMemory().size() );
-        assertNull( memory.getFactHandleMemory() );
+                      memory.betaMemory.getTupleMemory().size() );
+        assertNull( memory.betaMemory.getFactHandleMemory() );
     }
 
     public static class MockDataProvider
@@ -321,9 +322,14 @@
 
         public Iterator getResults(final Tuple tuple,
                                    final WorkingMemory wm,
-                                   final PropagationContext ctx) {
+                                   final PropagationContext ctx,
+                                   final Object providerContext ) {
             return this.collection.iterator();
         }
+
+        public Object createContext() {
+            return null;
+        }
     }
 
     public static class Person {

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockEvalCondition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockEvalCondition.java	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockEvalCondition.java	2008-01-31 22:22:32 UTC (rev 18230)
@@ -36,10 +36,13 @@
                                                        * 
                                                        */
                                                       private static final long serialVersionUID = 400L;
+                                                      
+                                                      public Object createContext() { return null; }
 
                                                       public boolean evaluate(Tuple tuple,
                                                                               Declaration[] requiredDeclarations,
-                                                                              WorkingMemory workingMemory) {
+                                                                              WorkingMemory workingMemory,
+                                                                              Object context ) {
                                                           return MockEvalCondition.this.isAllowed.booleanValue();
                                                       }
                                                   };

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/PackageCompilationDataTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/PackageCompilationDataTest.java	2008-01-31 20:45:17 UTC (rev 18229)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/PackageCompilationDataTest.java	2008-01-31 22:22:32 UTC (rev 18230)
@@ -13,7 +13,8 @@
 
 public class PackageCompilationDataTest extends TestCase {
     public static class TestEvalExpression implements EvalExpression {
-        public boolean evaluate(Tuple t, Declaration[] d, WorkingMemory w) {
+        public Object createContext() { return null; }
+        public boolean evaluate(Tuple t, Declaration[] d, WorkingMemory w, Object context ) {
             return false;
         }
     }




More information about the jboss-svn-commits mailing list