[jboss-svn-commits] JBL Code SVN: r32581 - 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
Thu Apr 15 23:46:08 EDT 2010


Author: tirelli
Date: 2010-04-15 23:46:05 -0400 (Thu, 15 Apr 2010)
New Revision: 32581

Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ConcurrentNodeMemories.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.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/reteoo/LeftInputAdapterNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryElementNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.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/RightInputAdapterNode.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/BuildUtils.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSource.java
Log:
JBRULES-2312: JBRULES-2465: Fixing node removal and node ID recycling. Test cases added.

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java	2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -1,7 +1,12 @@
 package org.drools.integrationtests;
 
+import static org.mockito.Matchers.*;
+import static org.mockito.Mockito.*;
+
+import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.Reader;
+import java.io.StringReader;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
@@ -23,7 +28,6 @@
 import org.drools.Person;
 import org.drools.PersonInterface;
 import org.drools.Precondition;
-import org.drools.Primitives;
 import org.drools.RuleBase;
 import org.drools.RuleBaseConfiguration;
 import org.drools.RuleBaseFactory;
@@ -35,15 +39,16 @@
 import org.drools.builder.KnowledgeBuilderFactory;
 import org.drools.builder.ResourceType;
 import org.drools.common.InternalFactHandle;
+import org.drools.compiler.DroolsParserException;
 import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
 import org.drools.core.util.DroolsStreamUtils;
 import org.drools.definition.KnowledgePackage;
 import org.drools.definitions.impl.KnowledgePackageImp;
-import org.drools.impl.StatefulKnowledgeSessionImpl;
+import org.drools.event.rule.AgendaEventListener;
 import org.drools.io.ResourceFactory;
 import org.drools.marshalling.MarshallerFactory;
-import org.drools.reteoo.ReteooWorkingMemory;
+import org.drools.reteoo.ReteooRuleBase;
 import org.drools.rule.Package;
 import org.drools.runtime.StatefulKnowledgeSession;
 import org.drools.runtime.rule.WorkingMemoryEntryPoint;
@@ -1026,29 +1031,31 @@
                          ResourceType.DRL );
             Collection<KnowledgePackage> pkgs = builder.getKnowledgePackages();
             KnowledgePackage pkg = pkgs.iterator().next();
-            
+
             // serialize out
             byte[] out = DroolsStreamUtils.streamOut( ((KnowledgePackageImp) pkg).pkg );
 
             // adding original packages to a kbase just to make sure they are fine
-            KnowledgeBaseConfiguration kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null, loader1 );
+            KnowledgeBaseConfiguration kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null,
+                                                                                                       loader1 );
             KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase( kbaseConf );
             kbase.addKnowledgePackages( pkgs );
-            
+
             // now, create another classloader and make sure it has access to the classes
             ClassLoader loader2 = new SubvertedClassLoader( new URL[]{getClass().getResource( "/testEnum.jar" )},
                                                             this.getClass().getClassLoader() );
-            
+
             // create another builder
             KnowledgeBuilderConfiguration conf2 = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration( null,
                                                                                                             loader2 );
             KnowledgeBuilder builder2 = KnowledgeBuilderFactory.newKnowledgeBuilder( conf2 );
             builder2.add( ResourceFactory.newByteArrayResource( out ),
-                         ResourceType.PKG );
+                          ResourceType.PKG );
             Collection<KnowledgePackage> pkgs2 = builder2.getKnowledgePackages();
-            
+
             // create another kbase
-            KnowledgeBaseConfiguration kbaseConf2 = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null, loader2 );
+            KnowledgeBaseConfiguration kbaseConf2 = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null,
+                                                                                                        loader2 );
             KnowledgeBase kbase2 = KnowledgeBaseFactory.newKnowledgeBase( kbaseConf2 );
             kbase2.addKnowledgePackages( pkgs2 );
 
@@ -1075,30 +1082,32 @@
                          ResourceType.DRL );
             Collection<KnowledgePackage> pkgs = builder.getKnowledgePackages();
             KnowledgePackage pkg = pkgs.iterator().next();
-            
+
             // serialize out
             byte[] out = DroolsStreamUtils.streamOut( pkg );
 
             // adding original packages to a kbase just to make sure they are fine
-            KnowledgeBaseConfiguration kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null, loader1 );
+            KnowledgeBaseConfiguration kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null,
+                                                                                                       loader1 );
             KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase( kbaseConf );
             kbase.addKnowledgePackages( pkgs );
-            
+
             // now, create another classloader and make sure it has access to the classes
             ClassLoader loader2 = new SubvertedClassLoader( new URL[]{getClass().getResource( "/testEnum.jar" )},
                                                             this.getClass().getClassLoader() );
             //loader2.loadClass( "org.drools.Primitives" );
             //loader2.loadClass( "org.drools.TestEnum" );
-            
+
             // set context classloader and use it
             ClassLoader ccl = Thread.currentThread().getContextClassLoader();
             Thread.currentThread().setContextClassLoader( loader2 );
             KnowledgePackage pkg2 = (KnowledgePackage) DroolsStreamUtils.streamIn( out );
             Collection<KnowledgePackage> pkgs2 = Collections.singleton( pkg2 );
             Thread.currentThread().setContextClassLoader( ccl );
-            
+
             // create another kbase
-            KnowledgeBaseConfiguration kbaseConf2 = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null, loader2 );
+            KnowledgeBaseConfiguration kbaseConf2 = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null,
+                                                                                                        loader2 );
             KnowledgeBase kbase2 = KnowledgeBaseFactory.newKnowledgeBase( kbaseConf2 );
             kbase2.addKnowledgePackages( pkgs2 );
 
@@ -1109,6 +1118,90 @@
 
     }
 
+    public void testDynamicRuleRemovalsSubNetworkAndNot() throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "test_DynamicRulesWithNotSubnetwork.drl" ) ),
+                      ResourceType.DRL );
+        assertFalse( kbuilder.getErrors().toString(),
+                     kbuilder.hasErrors() );
+
+        final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        final AgendaEventListener alistener = mock( AgendaEventListener.class );
+        ksession.addEventListener( alistener );
+
+        // pattern does not match, so do not activate
+        ksession.insert( new Person( "toni" ) );
+        verify( alistener,
+                never() ).activationCreated( any( org.drools.event.rule.ActivationCreatedEvent.class ) );
+
+        // pattern matches, so create activation
+        ksession.insert( new Person( "bob" ) );
+        verify( alistener,
+                times( 1 ) ).activationCreated( any( org.drools.event.rule.ActivationCreatedEvent.class ) );
+
+        // already active, so no new activation should be created
+        ksession.insert( new Person( "mark" ) );
+        verify( alistener,
+                times( 1 ) ).activationCreated( any( org.drools.event.rule.ActivationCreatedEvent.class ) );
+
+        kbase.removeKnowledgePackage( "org.drools" );
+
+        assertEquals( 0,
+                      kbase.getKnowledgePackages().size() );
+
+        // lets re-compile and add it again
+        kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "test_DynamicRulesWithNotSubnetwork.drl" ) ),
+                      ResourceType.DRL );
+        assertFalse( kbuilder.getErrors().toString(),
+                     kbuilder.hasErrors() );
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+        
+        // rule should be reactivated, since data is still in the session
+        verify( alistener,
+                times( 2 ) ).activationCreated( any( org.drools.event.rule.ActivationCreatedEvent.class ) );
+        
+    }
+
+    public void testSharedLIANodeRemoval() throws IOException, DroolsParserException {
+        String str = "global java.util.List list;\n";
+        str += "rule \"test\"\n";
+        str += "when\n";
+        str += "  exists(eval(true))\n";
+        str += "then\n";
+        str += " list.add(\"fired\");\n";
+        str += "end\n";
+        
+        PackageBuilder pkgBuilder = new PackageBuilder();
+        pkgBuilder.addPackageFromDrl(new StringReader(str));
+        Assert.assertTrue("Should not have errors", pkgBuilder.getErrors().isEmpty());
+
+        // Add once ...
+        ReteooRuleBase rb = new ReteooRuleBase("dummy");
+        rb.addPackage(pkgBuilder.getPackage());
+
+        // This one works
+        List list = new ArrayList();
+        StatefulSession session = rb.newStatefulSession();
+        session.setGlobal( "list", list );
+        session.fireAllRules();       
+        assertEquals(1, list.size() );
+
+        
+        list.clear();
+        // ... remove ...
+        rb.removePackage(pkgBuilder.getPackage().getName());
+        rb.addPackage(pkgBuilder.getPackage());          
+        session = rb.newStatefulSession();
+        session.setGlobal( "list", list );
+        session.fireAllRules();   
+        assertEquals(1, list.size() );
+    }
+    
     public class SubvertedClassLoader extends URLClassLoader {
 
         private static final long serialVersionUID = 400L;

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java	2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -1120,9 +1120,9 @@
         assertEquals( 2,
                       nodes.size() );
         assertEquals( "InitialFact",
-                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 3 )).getObjectType()).getClassType().getSimpleName() );
+                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 2 )).getObjectType()).getClassType().getSimpleName() );
         assertEquals( "Rule 1",
-                      ((RuleTerminalNode) nodes.get( 5 )).getRule().getName() );
+                      ((RuleTerminalNode) nodes.get( 4 )).getRule().getName() );
 
         StatefulSession session = ruleBase.newStatefulSession();
 
@@ -1171,9 +1171,9 @@
         assertEquals( 2,
                       nodes.size() );
         assertEquals( "InitialFact",
-                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 3 )).getObjectType()).getClassType().getSimpleName() );
+                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 2 )).getObjectType()).getClassType().getSimpleName() );
         assertEquals( "Rule 1",
-                      ((RuleTerminalNode) nodes.get( 5 )).getRule().getName() );
+                      ((RuleTerminalNode) nodes.get( 4 )).getRule().getName() );
 
         StatefulSession session = ruleBase.newStatefulSession();
 
@@ -1230,9 +1230,9 @@
         assertEquals( 2,
                       nodes.size() );
         assertEquals( "Person",
-                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 3 )).getObjectType()).getClassType().getSimpleName() );
+                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 2 )).getObjectType()).getClassType().getSimpleName() );
         assertEquals( "Rule 1",
-                      ((RuleTerminalNode) nodes.get( 5 )).getRule().getName() );
+                      ((RuleTerminalNode) nodes.get( 4 )).getRule().getName() );
 
         StatefulSession session = ruleBase.newStatefulSession();
 
@@ -1278,13 +1278,13 @@
         assertEquals( 4,
                       nodes.size() );
         assertEquals( "Cheese",
-                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 3 )).getObjectType()).getClassType().getSimpleName() );
+                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 2 )).getObjectType()).getClassType().getSimpleName() );
         assertEquals( "Person",
-                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 6 )).getObjectType()).getClassType().getSimpleName() );
+                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 4 )).getObjectType()).getClassType().getSimpleName() );
         assertEquals( "JoinNode",
-                      nodes.get( 7 ).getClass().getSimpleName() );
+                      nodes.get( 5 ).getClass().getSimpleName() );
         assertEquals( "Rule 1",
-                      ((RuleTerminalNode) nodes.get( 8 )).getRule().getName() );
+                      ((RuleTerminalNode) nodes.get( 6 )).getRule().getName() );
 
         StatefulSession session = ruleBase.newStatefulSession();
 
@@ -1336,7 +1336,6 @@
         r2d2.setCheese( brie );
         session.insert( r2d2 );
 
-        System.out.println( "\n\njointpattern" );
         session = getSerialisedStatefulSession( session );
 
         session.fireAllRules();

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -6907,41 +6907,6 @@
         ksession.insert( new Pet("Toni") );
     }
    
-    public void FIXME_testSharedLIANodeRemoval() throws IOException, DroolsParserException {
-        String str = "global java.util.List list;\n";
-        str += "rule \"test\"\n";
-        str += "when\n";
-        str += "  exists(eval(true))\n";
-        str += "then\n";
-        str += " list.add(\"fired\");\n";
-        str += "end\n";
-        
-        PackageBuilder pkgBuilder = new PackageBuilder();
-        pkgBuilder.addPackageFromDrl(new StringReader(str));
-        Assert.assertTrue("Should not have errors", pkgBuilder.getErrors().isEmpty());
-
-        // Add once ...
-        ReteooRuleBase rb = new ReteooRuleBase("dummy");
-        rb.addPackage(pkgBuilder.getPackage());
-
-        // This one works
-        List list = new ArrayList();
-        StatefulSession session = rb.newStatefulSession();
-        session.setGlobal( "list", list );
-        session.fireAllRules();       
-        assertEquals(1, list.size() );
-
-        
-        list.clear();
-        // ... remove ...
-        rb.removePackage(pkgBuilder.getPackage().getName());
-        rb.addPackage(pkgBuilder.getPackage());          
-        session = rb.newStatefulSession();
-        session.setGlobal( "list", list );
-        session.fireAllRules();   
-        assertEquals(1, list.size() );
-    }
-    
     public void testClassLoaderHits() throws Exception {
         final KnowledgeBuilderConfiguration conf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
         //conf.setOption( ClassLoaderCacheOption.DISABLED );

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-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -20,6 +20,7 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 
+import org.drools.reteoo.EntryPointNode;
 import org.drools.reteoo.ReteooBuilder;
 import org.drools.reteoo.RuleRemovalContext;
 
@@ -96,7 +97,7 @@
                   builder,
                   node,
                   workingMemories );
-        if ( !isInUse() ) {
+        if ( !this.isInUse() && !( this instanceof EntryPointNode ) ) {
             builder.getIdGenerator().releaseId( this.getId() );
         }
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ConcurrentNodeMemories.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ConcurrentNodeMemories.java	2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ConcurrentNodeMemories.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -114,7 +114,8 @@
         try {
             this.lock.lock();
             if( node.getId() >= this.memories.length() ) {
-                int size = Math.max( this.rulebase.getNodeCount(), node.getId() + 1 );
+                // adding some buffer for new nodes, so that we reduce array copies
+                int size = Math.max( this.rulebase.getNodeCount(), node.getId() + 32 ); 
                 AtomicReferenceArray<Object> newMem = new AtomicReferenceArray<Object>( size );
                 for ( int i = 0; i < this.memories.length(); i++ ) {
                     newMem.set( i,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -20,9 +20,7 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 
-import org.drools.FactException;
 import org.drools.RuleBaseConfiguration;
-import org.drools.common.BaseNode;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.NodeMemory;
@@ -180,24 +178,6 @@
                                 workingMemory );
     }
 
-    protected void doRemove(final RuleRemovalContext context,
-                            final ReteooBuilder builder,
-                            final BaseNode node,
-                            final InternalWorkingMemory[] workingMemories) {
-        if ( !node.isInUse() ) {
-            removeObjectSink( (ObjectSink) node );
-        }
-        if ( !this.isInUse() ) {
-            for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
-                workingMemories[i].clearNodeMemory( this );
-            }
-        }
-        this.source.remove( context,
-                            builder,
-                            this,
-                            workingMemories );
-    }
-
     /**
      * Creates a HashSet for the AlphaNode's memory.
      */

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java	2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -225,10 +225,8 @@
                             final ReteooBuilder builder,
                             final BaseNode node,
                             final InternalWorkingMemory[] workingMemories) {
-        context.visitTupleSource( this );
         if ( !node.isInUse() ) {
             removeTupleSink( (LeftTupleSink) node );
-            
         }
         if ( !this.isInUse() || context.getCleanupAdapter() != null ) {
             for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
@@ -292,13 +290,10 @@
                                 builder,
                                 this,
                                 workingMemories );
-        if ( !context.alreadyVisited( this.leftInput ) ) {
-            this.leftInput.remove( context,
-                                   builder,
-                                   this,
-                                   workingMemories );
-        }
-
+        this.leftInput.remove( context,
+                               builder,
+                               this,
+                               workingMemories );
     }
 
     public void modifyObject(InternalFactHandle factHandle,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java	2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -30,7 +30,6 @@
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.InternalWorkingMemoryEntryPoint;
-import org.drools.common.NodeMemory;
 import org.drools.common.PropagationContextImpl;
 import org.drools.common.RuleBasePartitionId;
 import org.drools.core.util.Iterator;
@@ -283,10 +282,6 @@
                             final InternalWorkingMemory[] workingMemories) {
         final ObjectTypeNode objectTypeNode = (ObjectTypeNode) node;
         removeObjectSink( objectTypeNode );
-        for ( int i = 0; i < workingMemories.length; i++ ) {
-            // clear the node memory for each working memory.
-            workingMemories[i].clearNodeMemory( (NodeMemory) node );
-        }
     }
 
     public Map<ObjectType, ObjectTypeNode> getObjectTypeNodes() {

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-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -304,23 +304,20 @@
                             final ReteooBuilder builder,
                             final BaseNode node,
                             final InternalWorkingMemory[] workingMemories) {
-        context.visitTupleSource( this );
         if ( !node.isInUse() ) {
             removeTupleSink( (LeftTupleSink) node );
         }
 
         if ( !this.isInUse() ) {
-            for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
-                workingMemories[i].clearNodeMemory( this );
+            for( InternalWorkingMemory workingMemory : workingMemories ) {
+                workingMemory.clearNodeMemory( this );
             }
         }
 
-        if ( !context.alreadyVisited( this.tupleSource ) ) {
-            this.tupleSource.remove( context,
-                                     builder,
-                                     this,
-                                     workingMemories );
-        }
+        this.tupleSource.remove( context,
+                                 builder,
+                                 this,
+                                 workingMemories );
     }
 
     public boolean isLeftTupleMemoryEnabled() {

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	2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -354,8 +354,6 @@
                             final BaseNode node,
                             final InternalWorkingMemory[] workingMemories) {
 
-        context.visitTupleSource( this );
-
         if ( !node.isInUse() ) {
             removeTupleSink( (LeftTupleSink) node );
         }
@@ -375,12 +373,10 @@
             }
         }
 
-        if ( !context.alreadyVisited( this.tupleSource ) ) {
-            this.tupleSource.remove( context,
-                                     builder,
-                                     this,
-                                     workingMemories );
-        }
+        this.tupleSource.remove( context,
+                                 builder,
+                                 this,
+                                 workingMemories );
     }
 
     @SuppressWarnings("unchecked")

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java	2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -25,7 +25,6 @@
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.PropagationContextImpl;
 import org.drools.common.RuleBasePartitionId;
-import org.drools.core.util.RightTupleList;
 import org.drools.reteoo.builder.BuildContext;
 import org.drools.spi.PropagationContext;
 
@@ -172,7 +171,6 @@
                             final ReteooBuilder builder,
                             final BaseNode node,
                             final InternalWorkingMemory[] workingMemories) {
-        context.visitTupleSource( this );
         if ( !node.isInUse() ) {
             removeTupleSink( (LeftTupleSink) node );
         }
@@ -265,12 +263,6 @@
                                        workingMemory );
         }
 
-        public void retractRightTuple(final RightTuple rightTuple,
-                                      final PropagationContext context,
-                                      final InternalWorkingMemory workingMemory) {
-            throw new UnsupportedOperationException( "ObjectSinkAdapter onlys supports assertObject method calls" );
-        }
-
         public void modifyObject(InternalFactHandle factHandle,
                                  ModifyPreviousTuples modifyPreviousTuples,
                                  PropagationContext context,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java	2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -24,6 +24,7 @@
 import org.drools.common.BaseNode;
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.InternalWorkingMemory;
+import org.drools.common.NodeMemory;
 import org.drools.common.RuleBasePartitionId;
 import org.drools.spi.PropagationContext;
 
@@ -192,4 +193,22 @@
     public boolean isInUse() {
         return this.sink.size() > 0;
     }
+    
+    protected void doRemove(final RuleRemovalContext context,
+                            final ReteooBuilder builder,
+                            final BaseNode node,
+                            final InternalWorkingMemory[] workingMemories) {
+        if ( !node.isInUse() ) {
+            removeObjectSink( (ObjectSink) node );
+        }
+        if ( !this.isInUse() && this instanceof NodeMemory ) {
+            for( InternalWorkingMemory workingMemory : workingMemories ) {
+                workingMemory.clearNodeMemory( (NodeMemory) this );
+            }
+        }
+        this.source.remove( context,
+                            builder,
+                            this,
+                            workingMemories );
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -327,19 +327,24 @@
                   workingMemories );
     }
 
+    /**
+     * OTN needs to override remove to avoid releasing the node ID, since OTN are
+     * never removed from the rulebase in the current implementation
+     */
     protected void doRemove(final RuleRemovalContext context,
                             final ReteooBuilder builder,
                             final BaseNode node,
                             final InternalWorkingMemory[] workingMemories) {
-        if( context.getCleanupAdapter() != null ) {
-            for( InternalWorkingMemory workingMemory : workingMemories ) {
+        if ( context.getCleanupAdapter() != null ) {
+            for ( InternalWorkingMemory workingMemory : workingMemories ) {
                 CleanupAdapter adapter = context.getCleanupAdapter();
                 final ObjectHashSet memory = (ObjectHashSet) workingMemory.getNodeMemory( this );
                 Iterator it = memory.iterator();
                 for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
                     InternalFactHandle handle = (InternalFactHandle) entry.getValue();
-                    for( LeftTuple leftTuple = handle.getFirstLeftTuple(); leftTuple != null; leftTuple = leftTuple.getLeftParentNext() ) {
-                        adapter.cleanUp( leftTuple, workingMemory );
+                    for ( LeftTuple leftTuple = handle.getFirstLeftTuple(); leftTuple != null; leftTuple = leftTuple.getLeftParentNext() ) {
+                        adapter.cleanUp( leftTuple,
+                                         workingMemory );
                     }
                 }
             }
@@ -348,11 +353,6 @@
         if ( !node.isInUse() ) {
             removeObjectSink( (ObjectSink) node );
         }
-        if ( ! this.isInUse() ) {
-            for( InternalWorkingMemory workingMemory : workingMemories ) {
-                workingMemory.clearNodeMemory( this );
-            }
-        }
     }
 
     /**

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java	2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -24,7 +24,6 @@
 
 import org.drools.RuleBaseConfiguration;
 import org.drools.RuntimeDroolsException;
-import org.drools.common.BaseNode;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.NodeMemory;
@@ -128,24 +127,6 @@
         // this node does not require update, so nothing else to do.
     }
 
-    protected void doRemove(final RuleRemovalContext context,
-                            final ReteooBuilder builder,
-                            final BaseNode node,
-                            final InternalWorkingMemory[] workingMemories) {
-        if ( !node.isInUse() ) {
-            removeObjectSink( (ObjectSink) node );
-        }
-        if ( !this.isInUse() ) {
-            for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
-                workingMemories[i].clearNodeMemory( this );
-            }
-        }
-        this.source.remove( context,
-                            builder,
-                            this,
-                            workingMemories );
-    }
-
     /**
      * @see org.drools.reteoo.ObjectSinkNode#getNextObjectSinkNode()
      */
@@ -329,10 +310,6 @@
         protected InternalFactHandle handle;
         protected PropagationContext context;
 
-        public Action() {
-
-        }
-
         public Action(InternalFactHandle handle,
                       PropagationContext context) {
             super();
@@ -375,10 +352,6 @@
     private static class RetractAction extends Action {
         private static final long serialVersionUID = -84784886430845209L;
 
-        public RetractAction() {
-
-        }
-
         public RetractAction(final InternalFactHandle handle,
                              final PropagationContext context) {
             super( handle,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryElementNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryElementNode.java	2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryElementNode.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -1,28 +1,17 @@
 package org.drools.reteoo;
 
-import org.drools.QueryResults;
-import org.drools.RuleBaseConfiguration;
-import org.drools.base.ArrayElements;
-import org.drools.base.DefaultQueryResultsCollector;
 import org.drools.base.DroolsQuery;
 import org.drools.base.QueryResultCollector;
 import org.drools.common.BaseNode;
-import org.drools.common.BetaConstraints;
-import org.drools.common.DisconnectedFactHandle;
-import org.drools.common.EmptyBetaConstraints;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
-import org.drools.common.NodeMemory;
 import org.drools.common.PropagationContextImpl;
 import org.drools.common.QueryElementFactHandle;
-import org.drools.core.util.Entry;
 import org.drools.reteoo.builder.BuildContext;
 import org.drools.rule.Declaration;
 import org.drools.rule.EntryPoint;
 import org.drools.rule.QueryElement;
 import org.drools.rule.Variable;
-import org.drools.spi.AlphaNodeFieldConstraint;
-import org.drools.spi.DataProvider;
 import org.drools.spi.PropagationContext;
 
 public class QueryElementNode extends LeftTupleSource
@@ -61,17 +50,14 @@
                             ReteooBuilder builder,
                             BaseNode node,
                             InternalWorkingMemory[] workingMemories) {
-        context.visitTupleSource( this );
         if ( !node.isInUse() ) {
             removeTupleSink( (LeftTupleSink) node );
         }
 
-        if ( !context.alreadyVisited( this.tupleSource ) ) {
-            this.tupleSource.remove( context,
-                                     builder,
-                                     this,
-                                     workingMemories );
-        }
+        this.tupleSource.remove( context,
+                                 builder,
+                                 this,
+                                 workingMemories );
     }
 
     public void attach() {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java	2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -19,23 +19,16 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.util.LinkedList;
-import java.util.List;
 
-import org.drools.RuleBaseConfiguration;
-import org.drools.base.ArrayElements;
 import org.drools.base.DroolsQuery;
 import org.drools.common.BaseNode;
-import org.drools.common.DisconnectedFactHandle;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
-import org.drools.common.NodeMemory;
 import org.drools.common.PropagationContextImpl;
 import org.drools.reteoo.builder.BuildContext;
 import org.drools.rule.GroupElement;
 import org.drools.rule.Query;
 import org.drools.rule.Rule;
-import org.drools.rule.Variable;
 import org.drools.spi.PropagationContext;
 
 /**
@@ -202,12 +195,10 @@
                             final ReteooBuilder builder,
                             final BaseNode node,
                             final InternalWorkingMemory[] workingMemories) {
-        if ( !context.alreadyVisited( this.tupleSource ) ) {
-            this.tupleSource.remove( context,
-                                     builder,
-                                     this,
-                                     workingMemories );
-        }
+        this.tupleSource.remove( context,
+                                 builder,
+                                 this,
+                                 workingMemories );
     }
 
     public boolean isInUse() {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java	2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -181,8 +181,7 @@
                             final ReteooBuilder builder,
                             final BaseNode node,
                             final InternalWorkingMemory[] workingMemories) {
-        final EntryPointNode entryPointNode = (EntryPointNode) node;
-        removeObjectSink( entryPointNode );
+        // for now, we don't remove EntryPointNodes because they might be referenced by external sources
     }
 
     public EntryPointNode getEntryPointNode(final EntryPoint entryPoint) {

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-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -238,7 +238,6 @@
                          this,
                          null,
                          workingMemories );
-            context.clear();
         }
     }
 
@@ -280,6 +279,9 @@
         }
 
         public void releaseId(int id) {
+            if( recycledIds.contains( id ) ) {
+                System.out.println("ERROR");
+            }
             this.recycledIds.add(id );
         }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java	2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -239,8 +239,8 @@
         }
 
         if ( !this.isInUse() ) {
-            for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
-                ObjectHashMap memory = (ObjectHashMap) workingMemories[i].getNodeMemory( this );
+            for ( InternalWorkingMemory workingMemory : workingMemories ) {
+                ObjectHashMap memory = (ObjectHashMap) workingMemory.getNodeMemory( this );
 
                 Iterator it = memory.iterator();
                 for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
@@ -249,17 +249,15 @@
                     leftTuple.unlinkFromRightParent();
 
                     InternalFactHandle handle = (InternalFactHandle) entry.getValue();
-                    workingMemories[i].getFactHandleFactory().destroyFactHandle( handle );
+                    workingMemory.getFactHandleFactory().destroyFactHandle( handle );
                 }
+                workingMemory.clearNodeMemory( this );
             }
         }
-
-        if ( !context.alreadyVisited( this.tupleSource ) ) {
-            this.tupleSource.remove( context,
-                                     builder,
-                                     this,
-                                     workingMemories );
-        }
+        this.tupleSource.remove( context,
+                                 builder,
+                                 this,
+                                 workingMemories );
     }
 
     public boolean isLeftTupleMemoryEnabled() {

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-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleRemovalContext.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -22,8 +22,6 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.util.HashMap;
-import java.util.Map;
 
 import org.drools.common.InternalWorkingMemory;
 
@@ -38,49 +36,18 @@
     implements
     Externalizable {
 
-    private Map<Integer, LeftTupleSource> visitedNodes;
     private CleanupAdapter cleanupAdapter;
 
     public RuleRemovalContext() {
-        this.visitedNodes = new HashMap<Integer, LeftTupleSource>();
     }
 
-    @SuppressWarnings("unchecked")
     public void readExternal(ObjectInput in) throws IOException,
                                             ClassNotFoundException {
-        visitedNodes = (Map<Integer, LeftTupleSource>) in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject( visitedNodes );
     }
 
-    /**
-     * We need to track tuple source nodes that we visit
-     * to avoid multiple removal in case of subnetworks
-     *
-     * @param node
-     */
-    public void visitTupleSource(LeftTupleSource node) {
-        this.visitedNodes.put( new Integer( node.getId() ),
-                               node );
-    }
-
-    /**
-     * We need to track tuple source nodes that we visit
-     * to avoid multiple removal in case of subnetworks
-     *
-     * @param node
-     * @return
-     */
-    public boolean alreadyVisited(LeftTupleSource node) {
-        return this.visitedNodes.containsKey( new Integer( node.getId() ) );
-    }
-
-    public void clear() {
-        this.visitedNodes.clear();
-    }
-    
     public void setCleanupAdapter(CleanupAdapter cleanupAdapter) {
         this.cleanupAdapter = cleanupAdapter;
     }

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-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -101,10 +101,7 @@
         RuleBasePartitionId partition = null;
         if ( candidate instanceof EntryPointNode ) {
             // entry point nodes are always shared
-            EntryPointNode epn = context.getRuleBase().getRete().getEntryPointNode( ((EntryPointNode) candidate).getEntryPoint() );
-            if ( epn != null ) {
-                node = epn;
-            }
+            node = context.getRuleBase().getRete().getEntryPointNode( ((EntryPointNode) candidate).getEntryPoint() );
             // all EntryPointNodes belong to the main partition
             partition = RuleBasePartitionId.MAIN_PARTITION;
         } else if ( candidate instanceof ObjectTypeNode ) {
@@ -131,11 +128,6 @@
             } else {
                 throw new RuntimeDroolsException( "This is a bug on node sharing verification. Please report to development team." );
             }
-            if ( node != null ) {
-                // shared node found
-                // undo previous id assignment
-                context.releaseId( candidate.getId() );
-            }
         }
 
         if ( node == null ) {
@@ -161,6 +153,10 @@
             }
             // adds the node to the context list to track all added nodes
             context.getNodes().add( node );
+        } else {
+            // shared node found
+            // undo previous id assignment
+            context.releaseId( candidate.getId() );
         }
         return node;
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSource.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSource.java	2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSource.java	2010-04-16 03:46:05 UTC (rev 32581)
@@ -23,7 +23,6 @@
 import java.util.Iterator;
 import java.util.List;
 
-import org.drools.common.BaseNode;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.RuleBasePartitionId;
@@ -92,12 +91,6 @@
         }
     }
 
-    protected void doRemove(final RuleRemovalContext context,
-                            final ReteooBuilder builder,
-                            final BaseNode node,
-                            final InternalWorkingMemory[] workingMemories) {
-    }
-
     public void attach(final InternalWorkingMemory[] workingMemories) {
         // TODO Auto-generated method stub
 



More information about the jboss-svn-commits mailing list