[jboss-svn-commits] JBL Code SVN: r19601 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/reteoo and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Apr 16 20:50:45 EDT 2008


Author: mingjin
Date: 2008-04-16 20:50:44 -0400 (Wed, 16 Apr 2008)
New Revision: 19601

Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/sequential/SequentialTest.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/ReteooRuleBase.java
Log:
JBRULES-1567 - ArrayIndexOutOfBoundsException in sequential execution after calling RuleBase.addPackage(..)
- ReteooBuilder: added void setOrdered(boolean ordered) to allow resetting ordered flag.
- ReteooRuleBase: overwrite addPackage to reset ReteooBuilder.ordered.
- SequentialTest: added test case just for this.

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/sequential/SequentialTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/sequential/SequentialTest.java	2008-04-16 19:33:43 UTC (rev 19600)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/sequential/SequentialTest.java	2008-04-17 00:50:44 UTC (rev 19601)
@@ -8,6 +8,7 @@
 import org.drools.RuleBaseFactory;
 import org.drools.StatelessSession;
 import org.drools.integrationtests.SerializationHelper;
+import org.drools.integrationtests.DynamicRulesTest;
 import org.drools.compiler.DroolsParserException;
 import org.drools.compiler.PackageBuilder;
 import org.drools.rule.Package;
@@ -80,7 +81,48 @@
         assertEquals( "rule 3", list.get( 0 ));
         assertEquals( "rule 2", list.get( 1 ));
         assertEquals( "rule 1", list.get( 2 ));
-    }      
+    }
+
+    // JBRULES-1567 - ArrayIndexOutOfBoundsException in sequential execution after calling RuleBase.addPackage(..)
+    public void testSequentialWithRulebaseUpdate() throws Exception {
+        PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "simpleSalience.drl" ) ) );
+
+        RuleBaseConfiguration conf = new RuleBaseConfiguration();
+        conf.setSequential( true );
+        RuleBase ruleBase = getRuleBase( conf );
+
+        ruleBase.addPackage(builder.getPackage());
+        StatelessSession    session = ruleBase.newStatelessSession();
+
+        final List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+
+        session.execute(new Person("pob"));
+
+        builder = new PackageBuilder();
+        builder.addPackageFromDrl(
+                new InputStreamReader( DynamicRulesTest.class.getResourceAsStream( "test_Dynamic3.drl" ) ) );
+
+        ruleBase.addPackage(builder.getPackage());
+        session = ruleBase.newStatelessSession();
+        session.setGlobal( "list",
+                           list );
+        Person  person  = new Person("bop");
+        session.execute(person);
+
+        assertEquals( 7,
+                      list.size() );
+
+        assertEquals( "rule 3", list.get( 0 ));
+        assertEquals( "rule 2", list.get( 1 ));
+        assertEquals( "rule 1", list.get( 2 ));
+        assertEquals( "rule 3", list.get( 3 ));
+        assertEquals( "rule 2", list.get( 4 ));
+        assertEquals( "rule 1", list.get( 5 ));
+        assertEquals( person, list.get( 6 ));
+    }
     
     
 

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	2008-04-16 19:33:43 UTC (rev 19600)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2008-04-17 00:50:44 UTC (rev 19601)
@@ -74,8 +74,6 @@
     /** The RuleBase */
     private transient InternalRuleBase        ruleBase;
 
-    private transient InternalWorkingMemory[] workingMemories;
-
     private Map                               rules;
 
     private transient ReteooRuleBuilder       ruleBuilder;
@@ -133,6 +131,10 @@
         return this.idGenerator;
     }
 
+    protected void setOrdered(boolean ordered) {
+        this.ordered = ordered;
+    }
+
     public void order() {
         if ( ordered ) {
             // we should only do this on first call, its expected the RuleBase should not change afterwards.
@@ -229,7 +231,7 @@
 
     public void removeRule(final Rule rule) {
         // reset working memories for potential propagation
-        this.workingMemories = (InternalWorkingMemory[]) this.ruleBase.getWorkingMemories();
+        InternalWorkingMemory[] workingMemories = this.ruleBase.getWorkingMemories();
 
         final Object object = this.rules.remove( rule );
 
@@ -240,7 +242,7 @@
             node.remove( context,
                          this,
                          null,
-                         this.workingMemories );
+                         workingMemories );
             context.clear();
         }
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2008-04-16 19:33:43 UTC (rev 19600)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2008-04-17 00:50:44 UTC (rev 19601)
@@ -317,6 +317,11 @@
         return this.reteooBuilder.getIdGenerator().getLastId() + 1;
     }
 
+    public synchronized void addPackage(final Package newPkg) {
+        super.addPackage(newPkg);
+        this.reteooBuilder.setOrdered(false);
+    }
+    
     public static class InitialFactHandleDummyObject
         implements
         Externalizable {




More information about the jboss-svn-commits mailing list