[jboss-svn-commits] JBL Code SVN: r33154 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/common and 3 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri May 28 22:34:51 EDT 2010


Author: tirelli
Date: 2010-05-28 22:34:50 -0400 (Fri, 28 May 2010)
New Revision: 33154

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FailureOnRemovalTest.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.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/ReteooBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleRemovalContext.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/AccumulateBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildContext.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/CollectBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/EvalBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/ForallBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/FromBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/GroupElementBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/QueryElementBuilder.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/EvalConditionNodeTest.java
Log:
JBRULES-2098: fixing node sharing and removal on eval nodes

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FailureOnRemovalTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FailureOnRemovalTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FailureOnRemovalTest.java	2010-05-29 02:34:50 UTC (rev 33154)
@@ -0,0 +1,104 @@
+package org.drools.integrationtests;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.Collection;
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseConfiguration;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderConfiguration;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.builder.conf.DefaultDialectOption;
+import org.drools.compiler.DroolsParserException;
+import org.drools.conf.SequentialOption;
+import org.drools.conf.ShareAlphaNodesOption;
+import org.drools.conf.ShareBetaNodesOption;
+import org.drools.definition.KnowledgePackage;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+
+public class FailureOnRemovalTest extends TestCase {
+    private static final String  LS                   = System.getProperty( "line.separator" );
+    private static final String  PACKAGE              = "failure_on_removal";
+    private static final String  RULE_1               = "rule_1";
+    private static final String  RULE_2               = "rule_2";
+    private static final String  RULE_3               = "rule_3";
+    private static final boolean SHARE_BETA_NODES     = true;
+    private static final boolean NOT_SHARE_BETA_NODES = false;
+
+    public void testWithBetaNodeSharing() throws Exception {
+        runTest( SHARE_BETA_NODES );
+    }
+
+    public void testWithoutBetaNodeSharing() throws Exception {
+        runTest( NOT_SHARE_BETA_NODES );
+    }
+
+    private void runTest(boolean shareBetaNodes) throws Exception {
+        KnowledgeBase kbase = createKnowledgeBase( shareBetaNodes );
+        Collection<KnowledgePackage> rule1 = compileRule( RULE_1 );
+        kbase.addKnowledgePackages( rule1 );
+
+        // we need to add at least two rules. Test will not fail with only one rule.
+        Collection<KnowledgePackage> rule2 = compileRule( RULE_2 );
+        kbase.addKnowledgePackages( rule2 );
+
+        kbase.removeRule( PACKAGE,
+                          RULE_1 );
+        
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+        int fired = ksession.fireAllRules();
+        ksession.dispose();
+        
+        assertEquals( 1, fired );
+
+        Collection<KnowledgePackage> rule3 = compileRule( RULE_3 );
+        kbase.addKnowledgePackages( rule3 );
+    }
+
+    private Collection<KnowledgePackage> compileRule(String name) throws DroolsParserException,
+                                                                 IOException {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder( createKnowledgeBuilderConfiguration() );
+        String drl = getDrl( name );
+        Reader drlReader = new StringReader( drl );
+        kbuilder.add( ResourceFactory.newReaderResource( drlReader ),
+                      ResourceType.DRL );
+        assertFalse( kbuilder.getErrors().toString(),
+                     kbuilder.hasErrors() );
+        return kbuilder.getKnowledgePackages();
+    }
+
+    private KnowledgeBuilderConfiguration createKnowledgeBuilderConfiguration() {
+        Properties properties = new Properties();
+        properties.setProperty( "drools.dialect.java.compiler",
+                                "JANINO" );
+        KnowledgeBuilderConfiguration kconf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration( properties,
+                                                                                                        getClass().getClassLoader() );
+        kconf.setOption( DefaultDialectOption.get( "java" ) );
+        return kconf;
+    }
+
+    private KnowledgeBase createKnowledgeBase(boolean shareBetaNodes) {
+        KnowledgeBaseConfiguration ruleBaseConfiguration = createKnowledgeBaseConfiguration( shareBetaNodes );
+        return KnowledgeBaseFactory.newKnowledgeBase( ruleBaseConfiguration );
+    }
+
+    private KnowledgeBaseConfiguration createKnowledgeBaseConfiguration(boolean shareBetaNodes) {
+        KnowledgeBaseConfiguration kconf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
+        kconf.setOption( SequentialOption.NO );
+        kconf.setOption( ShareAlphaNodesOption.YES );
+        kconf.setOption( shareBetaNodes ? ShareBetaNodesOption.YES : ShareBetaNodesOption.NO );
+        return kconf;
+    }
+
+    private String getDrl(String name) {
+        return new StringBuffer( "package " ).append( PACKAGE ).append( LS ).append( "rule '" ).append( name ).append( '\'' ).append( LS ).append( "when" ).append( LS ).append( "eval (true)" ).append( LS ).append( "then" ).append( LS ).append( "end" ).append( LS ).toString();
+    }
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java	2010-05-28 23:17:38 UTC (rev 33153)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java	2010-05-29 02:34:50 UTC (rev 33154)
@@ -19,10 +19,14 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.util.HashMap;
+import java.util.Map;
 
+import org.drools.definition.rule.Rule;
 import org.drools.reteoo.EntryPointNode;
 import org.drools.reteoo.ReteooBuilder;
 import org.drools.reteoo.RuleRemovalContext;
+import org.drools.spi.RuleComponent;
 
 /**
  * The base class for all Rete nodes.
@@ -35,9 +39,10 @@
     implements
     NetworkNode {
 
-    protected int id;
-    protected RuleBasePartitionId partitionId;
-    protected boolean partitionsEnabled;
+    protected int                      id;
+    protected RuleBasePartitionId      partitionId;
+    protected boolean                  partitionsEnabled;
+    protected Map<Rule, RuleComponent> associations;
 
     public BaseNode() {
 
@@ -49,23 +54,30 @@
      * @param id
      *      The unique id
      */
-    public BaseNode(final int id, final RuleBasePartitionId partitionId, final boolean partitionsEnabled ) {
+    public BaseNode(final int id,
+                    final RuleBasePartitionId partitionId,
+                    final boolean partitionsEnabled) {
         super();
         this.id = id;
         this.partitionId = partitionId;
         this.partitionsEnabled = partitionsEnabled;
+        this.associations = new HashMap<Rule, RuleComponent>();
     }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        id  = in.readInt();
+    @SuppressWarnings("unchecked")
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        id = in.readInt();
         partitionId = (RuleBasePartitionId) in.readObject();
         partitionsEnabled = in.readBoolean();
+        associations = (Map<Rule, RuleComponent>) in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeInt(id);
+        out.writeInt( id );
         out.writeObject( partitionId );
         out.writeBoolean( partitionsEnabled );
+        out.writeObject( associations );
     }
 
     /* (non-Javadoc)
@@ -81,23 +93,24 @@
     public abstract void attach();
 
     public abstract void attach(InternalWorkingMemory[] workingMemories);
-    
+
     /**
      * A method that is called for all nodes whose network bellow them 
      * changed, after the change is complete, providing them with an oportunity
      * for state update
      */
     public abstract void networkUpdated();
-    
+
     public void remove(RuleRemovalContext context,
                        ReteooBuilder builder,
                        BaseNode node,
                        InternalWorkingMemory[] workingMemories) {
+        this.removeAssociation( context.getRule() );
         doRemove( context,
                   builder,
                   node,
                   workingMemories );
-        if ( !this.isInUse() && !( this instanceof EntryPointNode ) ) {
+        if ( !this.isInUse() && !(this instanceof EntryPointNode) ) {
             builder.getIdGenerator().releaseId( this.getId() );
         }
     }
@@ -137,13 +150,44 @@
     public RuleBasePartitionId getPartitionId() {
         return this.partitionId;
     }
-    
+
     /**
      * Sets the partition this node belongs to
      * 
      * @param partitionId
      */
-    public void setPartitionId( final RuleBasePartitionId partitionId ) {
+    public void setPartitionId(final RuleBasePartitionId partitionId) {
         this.partitionId = partitionId;
     }
+
+    /**
+     * Creates an association between this node and the rule + rule component
+     * that caused the creation of this node. Since nodes might be shared,
+     * there might be more than one source for each node.
+     * 
+     * @param rule The rule source
+     * @param component
+     */
+    public void addAssociation( Rule rule, RuleComponent component ) {
+        this.associations.put( rule, component );
+    }
+    
+    /**
+     * Returns the map of associations for this node
+     * 
+     * @return
+     */
+    public Map<Rule, RuleComponent> getAssociations() {
+        return this.associations;
+    }
+    
+    /**
+     * Removes the association to the given rule from the
+     * associations map.
+     *  
+     * @param rule
+     */
+    public void removeAssociation( Rule rule ) {
+        this.associations.remove( rule );
+    }
 }

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	2010-05-28 23:17:38 UTC (rev 33153)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java	2010-05-29 02:34:50 UTC (rev 33154)
@@ -20,6 +20,7 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.util.Map.Entry;
 
 import org.drools.RuleBaseConfiguration;
 import org.drools.common.BaseNode;
@@ -28,9 +29,11 @@
 import org.drools.common.NodeMemory;
 import org.drools.common.PropagationContextImpl;
 import org.drools.common.RuleBasePartitionId;
+import org.drools.definition.rule.Rule;
 import org.drools.reteoo.builder.BuildContext;
 import org.drools.rule.EvalCondition;
 import org.drools.spi.PropagationContext;
+import org.drools.spi.RuleComponent;
 
 /**
  * Node which filters <code>ReteTuple</code>s.
@@ -312,6 +315,11 @@
             for( InternalWorkingMemory workingMemory : workingMemories ) {
                 workingMemory.clearNodeMemory( this );
             }
+        } else {
+            // need to re-wire eval expression to the same one from another rule 
+            // that is sharing this node
+            Entry<Rule, RuleComponent> next = this.getAssociations().entrySet().iterator().next();
+            this.condition = (EvalCondition) next.getValue();
         }
 
         this.tupleSource.remove( context,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2010-05-28 23:17:38 UTC (rev 33153)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2010-05-29 02:34:50 UTC (rev 33154)
@@ -231,7 +231,7 @@
         final Object object = this.rules.remove( rule );
 
         final BaseNode[] nodes = (BaseNode[]) object;
-        final RuleRemovalContext context = new RuleRemovalContext();
+        final RuleRemovalContext context = new RuleRemovalContext( rule );
         for ( int i = 0, length = nodes.length; i < length; i++ ) {
             final BaseNode node = nodes[i];
             node.remove( context,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleRemovalContext.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleRemovalContext.java	2010-05-28 23:17:38 UTC (rev 33153)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleRemovalContext.java	2010-05-29 02:34:50 UTC (rev 33154)
@@ -24,6 +24,7 @@
 import java.io.ObjectOutput;
 
 import org.drools.common.InternalWorkingMemory;
+import org.drools.definition.rule.Rule;
 
 /**
  * This context class is used during rule removal to ensure
@@ -36,9 +37,13 @@
     implements
     Externalizable {
 
+    // the rule being removed
+    private Rule rule;
+    
     private CleanupAdapter cleanupAdapter;
 
-    public RuleRemovalContext() {
+    public RuleRemovalContext( final Rule rule ) {
+        this.rule = rule;
     }
 
     public void readExternal(ObjectInput in) throws IOException,
@@ -48,6 +53,15 @@
     public void writeExternal(ObjectOutput out) throws IOException {
     }
 
+    /**
+     * Returns the reference to the rule being removed from the kbase
+     * 
+     * @return
+     */
+    public Rule getRule() {
+        return rule;
+    }
+
     public void setCleanupAdapter(CleanupAdapter cleanupAdapter) {
         this.cleanupAdapter = cleanupAdapter;
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/AccumulateBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/AccumulateBuilder.java	2010-05-28 23:17:38 UTC (rev 33153)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/AccumulateBuilder.java	2010-05-29 02:34:50 UTC (rev 33154)
@@ -47,6 +47,7 @@
                       final RuleConditionElement rce) {
         final Accumulate accumulate = (Accumulate) rce;
         boolean existSubNetwort = false;
+        context.pushRuleComponent( accumulate );
 
         final List resultBetaConstraints = context.getBetaconstraints();
         final List resultAlphaConstraints = context.getAlphaConstraints();
@@ -113,6 +114,7 @@
         context.setObjectSource( null );
         context.setCurrentPatternOffset( currentPatternIndex );
         context.setBehaviors( Collections.EMPTY_LIST );
+        context.popRuleComponent();
     }
 
     /**

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildContext.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildContext.java	2010-05-28 23:17:38 UTC (rev 33153)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildContext.java	2010-05-29 02:34:50 UTC (rev 33154)
@@ -19,6 +19,7 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.ListIterator;
+import java.util.Stack;
 
 import org.drools.common.BaseNode;
 import org.drools.common.InternalRuleBase;
@@ -32,6 +33,7 @@
 import org.drools.rule.Query;
 import org.drools.rule.Rule;
 import org.drools.rule.RuleConditionElement;
+import org.drools.spi.RuleComponent;
 import org.drools.time.TemporalDependencyMatrix;
 
 /**
@@ -58,6 +60,9 @@
     
     // rule being added at this moment
     private Rule                             rule;
+    
+    // the rule component being processed at the moment
+    private Stack<RuleComponent>             ruleComponent;
 
     // working memories attached to the given rulebase
     private InternalWorkingMemory[]          workingMemories;
@@ -125,6 +130,8 @@
         this.nodes = new LinkedList<BaseNode>();
 
         this.partitionId = null;
+        
+        this.ruleComponent = new Stack<RuleComponent>();
     }
 
     /**
@@ -444,4 +451,40 @@
         }
     }
 
+    /**
+     * Removes the top element from the rule component stack.
+     * The rule component stack is used to add trackability to
+     * the ReteOO nodes so that they can be linked to the rule
+     * components that originated them.
+     *  
+     * @return
+     */
+    public RuleComponent popRuleComponent() {
+        return this.ruleComponent.pop();
+    }
+    
+    /**
+     * Peeks at the top element from the rule component stack.
+     * The rule component stack is used to add trackability to
+     * the ReteOO nodes so that they can be linked to the rule
+     * components that originated them.
+     *  
+     * @return
+     */
+    public RuleComponent peekRuleComponent() { 
+        return this.ruleComponent.isEmpty() ? null : this.ruleComponent.peek();
+    }
+    
+    /**
+     * Adds the ruleComponent to the top of the rule component stack.
+     * The rule component stack is used to add trackability to
+     * the ReteOO nodes so that they can be linked to the rule
+     * components that originated them.
+     *  
+     * @return
+     */
+    public void pushRuleComponent( RuleComponent ruleComponent ) {
+        this.ruleComponent.push( ruleComponent );
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java	2010-05-28 23:17:38 UTC (rev 33153)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java	2010-05-29 02:34:50 UTC (rev 33154)
@@ -158,6 +158,7 @@
             // undo previous id assignment
             context.releaseId( candidate.getId() );
         }
+        node.addAssociation( context.getRule(), context.peekRuleComponent() );
         return node;
 
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/CollectBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/CollectBuilder.java	2010-05-28 23:17:38 UTC (rev 33153)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/CollectBuilder.java	2010-05-29 02:34:50 UTC (rev 33154)
@@ -52,6 +52,7 @@
 
         boolean existSubNetwort = false;
         final Collect collect = (Collect) rce;
+        context.pushRuleComponent( collect );
 
         final List resultBetaConstraints = context.getBetaconstraints();
         final List resultAlphaConstraints = context.getAlphaConstraints();
@@ -125,6 +126,7 @@
         context.setObjectSource( null );
         context.setCurrentPatternOffset( currentPatternIndex );
         context.setBehaviors( Collections.EMPTY_LIST );
+        context.popRuleComponent();
     }
 
     /**

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/EvalBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/EvalBuilder.java	2010-05-28 23:17:38 UTC (rev 33153)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/EvalBuilder.java	2010-05-29 02:34:50 UTC (rev 33154)
@@ -37,6 +37,7 @@
                       final RuleConditionElement rce) {
 
         final EvalCondition eval = (EvalCondition) rce;
+        context.pushRuleComponent( rce );
         utils.checkUnboundDeclarations( context,
                                         eval.getRequiredDeclarations() );
         context.setTupleSource( (LeftTupleSource) utils.attachNode( context,
@@ -44,6 +45,7 @@
                                                                                        context.getTupleSource(),
                                                                                        eval,
                                                                                        context ) ) );
+        context.popRuleComponent();
 
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/ForallBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/ForallBuilder.java	2010-05-28 23:17:38 UTC (rev 33153)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/ForallBuilder.java	2010-05-29 02:34:50 UTC (rev 33154)
@@ -49,6 +49,7 @@
                       final BuildUtils utils,
                       final RuleConditionElement rce) {
         final Forall forall = (Forall) rce;
+        context.pushRuleComponent( forall );
 
         // forall can be translated into
         // not( basePattern and not( <remaining_patterns>+ ) ) 
@@ -81,6 +82,8 @@
         builder.build( context,
                        utils,
                        not );
+        
+        context.popRuleComponent();
 
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/FromBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/FromBuilder.java	2010-05-28 23:17:38 UTC (rev 33153)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/FromBuilder.java	2010-05-29 02:34:50 UTC (rev 33154)
@@ -38,6 +38,7 @@
                       final BuildUtils utils,
                       final RuleConditionElement rce) {
         final From from = (From) rce;
+        context.pushRuleComponent( from );
 
         BetaConstraints betaConstraints = utils.createBetaNodeConstraint( context, context.getBetaconstraints(), true );
         
@@ -51,6 +52,7 @@
                                                                               context ) ) );
         context.setAlphaConstraints( null );
         context.setBetaconstraints( null );
+        context.popRuleComponent();
     }
 
     /**

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/GroupElementBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/GroupElementBuilder.java	2010-05-28 23:17:38 UTC (rev 33153)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/GroupElementBuilder.java	2010-05-29 02:34:50 UTC (rev 33154)
@@ -73,12 +73,14 @@
         final ReteooComponentBuilder builder = this.geBuilders.get( ge.getType() );
         
         context.push( ge );
+        context.pushRuleComponent( ge );
 
         builder.build( context,
                        utils,
                        rce );
         
         context.pop();
+        context.popRuleComponent();
     }
 
     /**

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java	2010-05-28 23:17:38 UTC (rev 33153)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java	2010-05-29 02:34:50 UTC (rev 33154)
@@ -35,7 +35,6 @@
 import org.drools.rule.Behavior;
 import org.drools.rule.Declaration;
 import org.drools.rule.EntryPoint;
-import org.drools.rule.FixedDuration;
 import org.drools.rule.GroupElement;
 import org.drools.rule.InvalidPatternException;
 import org.drools.rule.Pattern;
@@ -45,7 +44,6 @@
 import org.drools.rule.VariableConstraint;
 import org.drools.spi.AlphaNodeFieldConstraint;
 import org.drools.spi.Constraint;
-import org.drools.spi.Duration;
 import org.drools.spi.ObjectType;
 import org.drools.time.impl.CompositeMaxDurationTimer;
 import org.drools.time.impl.DurationTimer;
@@ -69,9 +67,11 @@
 
         final Pattern pattern = (Pattern) rce;
 
+        context.pushRuleComponent( pattern );
         this.attachPattern( context,
                             utils,
                             pattern );
+        context.popRuleComponent();
 
     }
 
@@ -314,11 +314,13 @@
         for ( final Iterator<Constraint> it = alphaConstraints.iterator(); it.hasNext(); ) {
             final AlphaNodeFieldConstraint constraint = (AlphaNodeFieldConstraint) it.next();
 
+            context.pushRuleComponent( constraint );
             context.setObjectSource( (ObjectSource) utils.attachNode( context,
                                                                       new AlphaNode( context.getNextId(),
                                                                                      (AlphaNodeFieldConstraint) constraint,
                                                                                      context.getObjectSource(),
                                                                                      context ) ) );
+            context.popRuleComponent();
         }
 
         // now restore back to original values

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/QueryElementBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/QueryElementBuilder.java	2010-05-28 23:17:38 UTC (rev 33153)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/QueryElementBuilder.java	2010-05-29 02:34:50 UTC (rev 33154)
@@ -34,6 +34,7 @@
                       final RuleConditionElement rce) {
 
         final QueryElement qe = (QueryElement) rce;
+        context.pushRuleComponent( qe );
         
         qe.getResultPattern().setOffset( context.getCurrentPatternOffset() );
         
@@ -46,7 +47,7 @@
                                                                                           qe,
                                                                                           false,
                                                                                           context ) ) );
-
+        context.popRuleComponent();
     }
 
     /**

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	2010-05-28 23:17:38 UTC (rev 33153)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/EvalConditionNodeTest.java	2010-05-29 02:34:50 UTC (rev 33154)
@@ -16,12 +16,15 @@
  * limitations under the License.
  */
 
+import static org.mockito.Mockito.mock;
+
 import org.drools.DroolsTestCase;
 import org.drools.FactException;
 import org.drools.RuleBaseFactory;
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.PropagationContextImpl;
+import org.drools.definition.rule.Rule;
 import org.drools.reteoo.EvalConditionNode.EvalMemory;
 import org.drools.reteoo.builder.BuildContext;
 import org.drools.spi.PropagationContext;
@@ -231,7 +234,7 @@
                               this.workingMemory );
 
         // Check memory was not populated
-        final EvalMemory memory = (EvalMemory) this.workingMemory.getNodeMemory( node );
+        this.workingMemory.getNodeMemory( node );
 
         // test no propagations
         assertEquals( 0,
@@ -286,7 +289,7 @@
         assertEquals( 1,
                       sink.getAsserted().size() );
 
-        RuleRemovalContext removalContext = new RuleRemovalContext();
+        RuleRemovalContext removalContext = new RuleRemovalContext( mock( Rule.class ));
         InternalWorkingMemory[] workingMemories = new InternalWorkingMemory[]{this.workingMemory};
 
         // This use to throw ClassCastException JBRULES-1719



More information about the jboss-svn-commits mailing list