[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