[jboss-svn-commits] JBL Code SVN: r16736 - in labs/jbossrules/trunk: drools-compiler/src/test/resources/org/drools/integrationtests and 4 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed Nov 21 13:25:16 EST 2007
Author: tirelli
Date: 2007-11-21 13:25:16 -0500 (Wed, 21 Nov 2007)
New Revision: 16736
Added:
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_AlphaEvalWithOrCE.drl
Modified:
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeRestriction.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Declaration.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Pattern.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Constraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockConstraint.java
Log:
JBRULES-1337: Fixing bug when cloning declaration references during logic transformation
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 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -44,6 +44,9 @@
import org.drools.Cheese;
import org.drools.Cheesery;
import org.drools.Child;
+import org.drools.FactA;
+import org.drools.FactB;
+import org.drools.FactC;
import org.drools.FactHandle;
import org.drools.FirstClass;
import org.drools.FromTestClass;
@@ -4638,4 +4641,31 @@
}
-}
\ No newline at end of file
+ public void testAlphaEvalWithOrCE() throws Exception {
+ final PackageBuilder builder = new PackageBuilder();
+ builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_AlphaEvalWithOrCE.drl" ) ) );
+ final Package pkg = builder.getPackage();
+
+ final RuleBase ruleBase = getRuleBase();
+ ruleBase.addPackage( pkg );
+ final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+ final List list = new ArrayList();
+ workingMemory.setGlobal( "results",
+ list );
+
+ FactA a = new FactA();
+ a.setField1( "a value" );
+
+ workingMemory.insert( a );
+ workingMemory.insert( new FactB() );
+ workingMemory.insert( new FactC() );
+
+ workingMemory.fireAllRules();
+
+ assertEquals( "should not have fired",
+ 0,
+ list.size() );
+ }
+
+}
Copied: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_AlphaEvalWithOrCE.drl (from rev 16735, labs/jbossrules/branches/4.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_AlphaEvalWithOrCE.drl)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_AlphaEvalWithOrCE.drl (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_AlphaEvalWithOrCE.drl 2007-11-21 18:25:16 UTC (rev 16736)
@@ -0,0 +1,11 @@
+package org.drools;
+
+global java.util.List results;
+
+rule "test eval with OR"
+when
+ FactA( eval( "something".equals( field1 ) ) )
+ FactB() or FactC()
+then
+ results.add( "Should not have fired" );
+end
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -39,7 +39,7 @@
private final Declaration[] declarations = new Declaration[0];
- private Pattern otherPattern;
+ private Pattern otherPattern;
public InstanceEqualsConstraint(final Pattern otherPattern) {
this.otherPattern = otherPattern;
@@ -48,7 +48,7 @@
public Declaration[] getRequiredDeclarations() {
return this.declarations;
}
-
+
public void replaceDeclaration(Declaration oldDecl,
Declaration newDecl) {
}
@@ -79,6 +79,11 @@
return this.otherPattern.hashCode();
}
+ public Object clone() {
+ // don't clone pattern
+ return new InstanceEqualsConstraint( this.otherPattern );
+ }
+
public boolean equals(final Object object) {
if ( this == object ) {
return true;
@@ -101,7 +106,7 @@
public Object left;
public Object right;
- private Pattern pattern;
+ private Pattern pattern;
private ContextEntry entry;
public InstanceEqualsConstraintContextEntry(final Pattern pattern) {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -87,6 +87,10 @@
final InstanceNotEqualsConstraint other = (InstanceNotEqualsConstraint) object;
return this.otherPattern.equals( other.otherPattern );
}
+
+ public Object clone() {
+ return new InstanceNotEqualsConstraint( this.otherPattern );
+ }
public static class InstanceNotEqualsConstraintContextEntry
implements
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -99,6 +99,10 @@
}
return false;
}
+
+ public Object clone() {
+ return INSTANCE;
+ }
public static class TupleStartEqualsConstraintContextEntry
implements
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -75,17 +75,17 @@
this.updateRequiredDeclarations( constraint );
}
}
-
+
/**
* Adds a constraint too all lists it belongs to by checking for its type
* @param constraint
*/
public void addConstraint(Constraint constraint) {
- if( constraint instanceof AlphaNodeFieldConstraint ) {
+ if ( constraint instanceof AlphaNodeFieldConstraint ) {
this.addAlphaConstraint( (AlphaNodeFieldConstraint) constraint );
}
- if( constraint instanceof BetaNodeFieldConstraint ) {
- this.addBetaConstraint( (BetaNodeFieldConstraint) constraint );
+ if ( constraint instanceof BetaNodeFieldConstraint ) {
+ this.addBetaConstraint( (BetaNodeFieldConstraint) constraint );
}
}
@@ -94,7 +94,7 @@
*
* @param constraint
*/
- private void updateRequiredDeclarations(Constraint constraint) {
+ protected void updateRequiredDeclarations(Constraint constraint) {
Declaration[] decs = constraint.getRequiredDeclarations();
if ( decs != null && decs.length > 0 ) {
for ( int i = 0; i < decs.length; i++ ) {
@@ -126,20 +126,22 @@
public Declaration[] getRequiredDeclarations() {
return this.requiredDeclarations;
}
-
+
/**
* {@inheritDoc}
*/
public void replaceDeclaration(Declaration oldDecl,
Declaration newDecl) {
- for( int i = 0; i < this.alphaConstraints.length; i++ ) {
- this.alphaConstraints[i].replaceDeclaration( oldDecl, newDecl );
+ for ( int i = 0; i < this.alphaConstraints.length; i++ ) {
+ this.alphaConstraints[i].replaceDeclaration( oldDecl,
+ newDecl );
}
- for( int i = 0; i < this.betaConstraints.length; i++ ) {
- this.betaConstraints[i].replaceDeclaration( oldDecl, newDecl );
+ for ( int i = 0; i < this.betaConstraints.length; i++ ) {
+ this.betaConstraints[i].replaceDeclaration( oldDecl,
+ newDecl );
}
- for( int i = 0; i < this.requiredDeclarations.length; i++ ) {
- if( this.requiredDeclarations[i] == oldDecl ) {
+ for ( int i = 0; i < this.requiredDeclarations.length; i++ ) {
+ if ( this.requiredDeclarations[i] == oldDecl ) {
this.requiredDeclarations[i] = newDecl;
}
}
@@ -180,6 +182,8 @@
super();
}
+ public abstract Object clone();
+
/**
* A context entry for composite restrictions
*
@@ -189,10 +193,10 @@
implements
ContextEntry {
- private static final long serialVersionUID = 400L;
+ private static final long serialVersionUID = 400L;
public final ContextEntry[] contexts;
- public ContextEntry next;
+ public ContextEntry next;
public MultiFieldConstraintContextEntry(BetaNodeFieldConstraint[] constraints) {
contexts = new ContextEntry[constraints.length];
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeRestriction.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeRestriction.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -85,15 +85,17 @@
return this.contextEntry;
}
+ public abstract Object clone();
+
public static class CompositeContextEntry
implements
ContextEntry {
private static final long serialVersionUID = -1773986268630111227L;
- public ContextEntry[] contextEntries;
+ public ContextEntry[] contextEntries;
- private ContextEntry entry;
+ private ContextEntry entry;
public CompositeContextEntry(final Restriction[] restrictions) {
contextEntries = new ContextEntry[restrictions.length];
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -47,5 +47,13 @@
}
return true;
}
+
+ public Object clone() {
+ Restriction[] clone = new Restriction[ this.restrictions.length ];
+ for( int i = 0; i < clone.length; i++ ) {
+ clone[i] = (Restriction) this.restrictions[i].clone();
+ }
+ return new AndCompositeRestriction( clone );
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndConstraint.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndConstraint.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -21,7 +21,8 @@
import org.drools.common.InternalWorkingMemory;
import org.drools.reteoo.ReteTuple;
-import org.drools.rule.AbstractCompositeConstraint.MultiFieldConstraintContextEntry;
+import org.drools.spi.AlphaNodeFieldConstraint;
+import org.drools.spi.BetaNodeFieldConstraint;
import org.drools.util.ArrayUtils;
/**
@@ -107,5 +108,26 @@
other.betaConstraints ) && Arrays.equals( this.requiredDeclarations,
other.requiredDeclarations );
}
+
+ public Object clone() {
+ AndConstraint clone = new AndConstraint();
+
+ // clone alpha constraints
+ clone.alphaConstraints = new AlphaNodeFieldConstraint[ this.alphaConstraints.length ];
+ for( int i = 0; i < this.alphaConstraints.length; i++ ) {
+ clone.alphaConstraints[i] = (AlphaNodeFieldConstraint) this.alphaConstraints[i].clone();
+ clone.updateRequiredDeclarations( clone.alphaConstraints[i] );
+ }
+
+ // clone beta constraints
+ clone.betaConstraints = new BetaNodeFieldConstraint[ this.betaConstraints.length ];
+ for( int i = 0; i < this.betaConstraints.length; i++ ) {
+ clone.betaConstraints[i] = (BetaNodeFieldConstraint) this.betaConstraints[i].clone();
+ clone.updateRequiredDeclarations( clone.betaConstraints[i] );
+ }
+
+ return clone;
+ }
+
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Declaration.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Declaration.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Declaration.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -75,7 +75,8 @@
*/
public class Declaration
implements
- Serializable {
+ Serializable,
+ Cloneable {
// ------------------------------------------------------------
// Instance members
// ------------------------------------------------------------
@@ -322,5 +323,9 @@
protected boolean isInternalFact() {
return internalFact;
}
+
+ public Object clone() {
+ return new Declaration( this.identifier, this.extractor, this.pattern );
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -107,4 +107,10 @@
return this.extractor.equals( other.extractor ) && this.restriction.equals( other.restriction );
}
+
+ public Object clone() {
+ return new LiteralConstraint( this.extractor,
+ this.getEvaluator(),
+ this.getField() );
+ }
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -29,7 +29,7 @@
implements
Restriction {
- private static final long serialVersionUID = 400L;
+ private static final long serialVersionUID = 400L;
private final FieldValue field;
@@ -60,21 +60,24 @@
final InternalWorkingMemory workingMemoiry) {
return this.evaluator.evaluate( null,
extractor,
- object, this.field );
+ object,
+ this.field );
}
public boolean isAllowedCachedLeft(final ContextEntry context,
final Object object) {
return this.evaluator.evaluate( null,
((LiteralContextEntry) context).getFieldExtractor(),
- object, this.field );
+ object,
+ this.field );
}
public boolean isAllowedCachedRight(final ReteTuple tuple,
final ContextEntry context) {
return this.evaluator.evaluate( null,
((LiteralContextEntry) context).getFieldExtractor(),
- ((LiteralContextEntry) context).getObject(), this.field );
+ ((LiteralContextEntry) context).getObject(),
+ this.field );
}
/**
@@ -85,7 +88,7 @@
public Declaration[] getRequiredDeclarations() {
return LiteralRestriction.requiredDeclarations;
}
-
+
public void replaceDeclaration(Declaration oldDecl,
Declaration newDecl) {
}
@@ -118,14 +121,20 @@
return this.contextEntry;
}
+ public Object clone() {
+ return new LiteralRestriction( this.field,
+ this.evaluator,
+ this.contextEntry.extractor );
+ }
+
private static class LiteralContextEntry
implements
ContextEntry {
private static final long serialVersionUID = 2621864784428098347L;
- public FieldExtractor extractor;
- public Object object;
- public ContextEntry next;
+ public FieldExtractor extractor;
+ public Object object;
+ public ContextEntry next;
public LiteralContextEntry(final FieldExtractor extractor) {
this.extractor = extractor;
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -106,11 +106,11 @@
ands = new GroupElement[]{wrapper};
}
- for( int i = 0; i < ands.length; i++ ) {
+ for ( int i = 0; i < ands.length; i++ ) {
// fix the cloned declarations
this.fixClonedDeclarations( ands[i] );
}
-
+
return ands;
}
@@ -122,43 +122,53 @@
*/
private void fixClonedDeclarations(GroupElement and) {
Stack contextStack = new Stack();
- DeclarationScopeResolver resolver = new DeclarationScopeResolver( new Map[0], contextStack );
+ DeclarationScopeResolver resolver = new DeclarationScopeResolver( new Map[0],
+ contextStack );
contextStack.push( and );
- processElement( resolver, contextStack, and );
- contextStack.pop( );
+ processElement( resolver,
+ contextStack,
+ and );
+ contextStack.pop();
}
-
+
/**
* recurse through the rule condition elements updating the declaration objecs
* @param resolver
* @param contextStack
* @param element
*/
- private void processElement( final DeclarationScopeResolver resolver, final Stack contextStack, final RuleConditionElement element ) {
- if( element instanceof Pattern ) {
+ private void processElement(final DeclarationScopeResolver resolver,
+ final Stack contextStack,
+ final RuleConditionElement element) {
+ if ( element instanceof Pattern ) {
Pattern pattern = (Pattern) element;
- for( Iterator it = pattern.getNestedElements().iterator(); it.hasNext(); ) {
- processElement( resolver, contextStack, (RuleConditionElement)it.next() );
+ for ( Iterator it = pattern.getNestedElements().iterator(); it.hasNext(); ) {
+ processElement( resolver,
+ contextStack,
+ (RuleConditionElement) it.next() );
}
- for( Iterator it = pattern.getConstraints().iterator(); it.hasNext(); ) {
+ for ( Iterator it = pattern.getConstraints().iterator(); it.hasNext(); ) {
Object next = it.next();
- if( next instanceof Declaration ) {
+ if ( next instanceof Declaration ) {
continue;
}
Constraint constraint = (Constraint) next;
Declaration[] decl = constraint.getRequiredDeclarations();
- for( int i = 0; i < decl.length; i++ ) {
+ for ( int i = 0; i < decl.length; i++ ) {
Declaration resolved = resolver.getDeclaration( decl[i].getIdentifier() );
- if( resolved != null && resolved != decl[i] ) {
- constraint.replaceDeclaration( decl[i], resolved );
+ if ( resolved != null && resolved != decl[i] ) {
+ constraint.replaceDeclaration( decl[i],
+ resolved );
}
}
}
} else {
contextStack.push( element );
- for( Iterator it = element.getNestedElements().iterator(); it.hasNext(); ) {
- processElement( resolver, contextStack, (RuleConditionElement)it.next() );
+ for ( Iterator it = element.getNestedElements().iterator(); it.hasNext(); ) {
+ processElement( resolver,
+ contextStack,
+ (RuleConditionElement) it.next() );
}
contextStack.pop();
}
@@ -293,7 +303,7 @@
for ( int j = 0; j < others.length; j++ ) {
if ( others[j] != null ) {
// always add clone of them to avoid offset conflicts in declarations
-
+
// HERE IS THE MESSY PROBLEM: need to change further references to the appropriate cloned ref
and.getChildren().add( j,
((RuleConditionElement) others[j]).clone() );
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -88,4 +88,9 @@
context );
}
+ public Object clone() {
+ return new MultiRestrictionFieldConstraint( this.extractor,
+ (Restriction) this.restrictions.clone() );
+ }
+
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -48,4 +48,11 @@
return false;
}
+ public Object clone() {
+ Restriction[] clone = new Restriction[ this.restrictions.length ];
+ for( int i = 0; i < clone.length; i++ ) {
+ clone[i] = (Restriction) this.restrictions[i].clone();
+ }
+ return new OrCompositeRestriction( clone );
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrConstraint.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrConstraint.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -20,6 +20,8 @@
import org.drools.common.InternalWorkingMemory;
import org.drools.reteoo.ReteTuple;
+import org.drools.spi.AlphaNodeFieldConstraint;
+import org.drools.spi.BetaNodeFieldConstraint;
import org.drools.util.ArrayUtils;
/**
@@ -112,4 +114,23 @@
other.requiredDeclarations );
}
+ public Object clone() {
+ OrConstraint clone = new OrConstraint();
+
+ // clone alpha constraints
+ clone.alphaConstraints = new AlphaNodeFieldConstraint[ this.alphaConstraints.length ];
+ for( int i = 0; i < this.alphaConstraints.length; i++ ) {
+ clone.alphaConstraints[i] = (AlphaNodeFieldConstraint) this.alphaConstraints[i].clone();
+ clone.updateRequiredDeclarations( clone.alphaConstraints[i] );
+ }
+
+ // clone beta constraints
+ clone.betaConstraints = new BetaNodeFieldConstraint[ this.betaConstraints.length ];
+ for( int i = 0; i < this.betaConstraints.length; i++ ) {
+ clone.betaConstraints[i] = (BetaNodeFieldConstraint) this.betaConstraints[i].clone();
+ clone.updateRequiredDeclarations( clone.betaConstraints[i] );
+ }
+
+ return clone;
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Pattern.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Pattern.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Pattern.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -23,10 +23,10 @@
import java.util.List;
import java.util.Map;
-import org.drools.spi.PatternExtractor;
import org.drools.spi.Constraint;
import org.drools.spi.Extractor;
import org.drools.spi.ObjectType;
+import org.drools.spi.PatternExtractor;
public class Pattern
implements
@@ -113,7 +113,20 @@
clone.addDeclaration( decl.getIdentifier(),
decl.getExtractor() );
} else {
- clone.addConstraint( (Constraint) constr );
+ Constraint constraint = (Constraint) ((Constraint) constr).clone();
+
+ // we must update pattern references in cloned declarations
+ Declaration[] oldDecl = ((Constraint) constr).getRequiredDeclarations();
+ Declaration[] newDecl = constraint.getRequiredDeclarations();
+ for( int i = 0; i < newDecl.length; i++ ) {
+ if( newDecl[i].getPattern() == this ) {
+ newDecl[i].setPattern( clone );
+ // we still need to call replace because there might be nested declarations to replace
+ constraint.replaceDeclaration( oldDecl[i], newDecl[i] );
+ }
+ }
+
+ clone.addConstraint( constraint );
}
}
return clone;
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -53,17 +53,17 @@
private final Declaration[] previousDeclarations;
private final Declaration[] localDeclarations;
-
+
private final String[] requiredGlobals;
private static final Declaration[] EMPTY_DECLARATIONS = new Declaration[0];
- private static final String[] EMPTY_GLOBALS = new String[0];
+ private static final String[] EMPTY_GLOBALS = new String[0];
public PredicateConstraint(final PredicateExpression evaluator) {
this( evaluator,
null,
null,
- null);
+ null );
}
public PredicateConstraint(final Declaration[] previousDeclarations,
@@ -71,13 +71,13 @@
this( null,
previousDeclarations,
localDeclarations,
- null);
+ null );
}
public PredicateConstraint(final PredicateExpression expression,
final Declaration[] previousDeclarations,
final Declaration[] localDeclarations,
- final String[] requiredGlobals ) {
+ final String[] requiredGlobals) {
this.expression = expression;
@@ -123,21 +123,21 @@
public Declaration[] getLocalDeclarations() {
return this.localDeclarations;
}
-
+
public void replaceDeclaration(Declaration oldDecl,
Declaration newDecl) {
- for( int i = 0; i < this.requiredDeclarations.length; i++) {
- if( this.requiredDeclarations[i] == oldDecl ) {
+ for ( int i = 0; i < this.requiredDeclarations.length; i++ ) {
+ if ( this.requiredDeclarations[i].equals( oldDecl ) ) {
this.requiredDeclarations[i] = newDecl;
}
}
- for( int i = 0; i < this.previousDeclarations.length; i++) {
- if( this.previousDeclarations[i] == oldDecl ) {
+ for ( int i = 0; i < this.previousDeclarations.length; i++ ) {
+ if ( this.previousDeclarations[i].equals( oldDecl ) ) {
this.previousDeclarations[i] = newDecl;
}
}
- for( int i = 0; i < this.localDeclarations.length; i++) {
- if( this.localDeclarations[i] == oldDecl ) {
+ for ( int i = 0; i < this.localDeclarations.length; i++ ) {
+ if ( this.localDeclarations[i].equals( oldDecl ) ) {
this.localDeclarations[i] = newDecl;
}
}
@@ -264,6 +264,23 @@
}
}
+ public Object clone() {
+ Declaration[] previous = new Declaration[this.previousDeclarations.length];
+ for ( int i = 0; i < previous.length; i++ ) {
+ previous[i] = (Declaration) this.previousDeclarations[i].clone();
+ }
+
+ Declaration[] local = new Declaration[this.localDeclarations.length];
+ for ( int i = 0; i < local.length; i++ ) {
+ local[i] = (Declaration) this.localDeclarations[i].clone();
+ }
+
+ return new PredicateConstraint( this.expression,
+ previous,
+ local,
+ this.requiredGlobals );
+ }
+
public static class PredicateContextEntry
implements
ContextEntry {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -137,5 +137,9 @@
e );
}
}
+
+ public Object clone() {
+ return new ReturnValueConstraint( this.fieldExtractor, (ReturnValueRestriction) this.restriction.clone() );
+ }
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -123,20 +123,24 @@
return this.localDeclarations;
}
+ public String[] getRequiredGlobals() {
+ return this.requiredGlobals;
+ }
+
public void replaceDeclaration(Declaration oldDecl,
Declaration newDecl) {
for( int i = 0; i < this.requiredDeclarations.length; i++) {
- if( this.requiredDeclarations[i] == oldDecl ) {
+ if( this.requiredDeclarations[i].equals( oldDecl ) ) {
this.requiredDeclarations[i] = newDecl;
}
}
for( int i = 0; i < this.previousDeclarations.length; i++) {
- if( this.previousDeclarations[i] == oldDecl ) {
+ if( this.previousDeclarations[i].equals( oldDecl ) ) {
this.previousDeclarations[i] = newDecl;
}
}
for( int i = 0; i < this.localDeclarations.length; i++) {
- if( this.localDeclarations[i] == oldDecl ) {
+ if( this.localDeclarations[i].equals( oldDecl ) ) {
this.localDeclarations[i] = newDecl;
}
}
@@ -254,6 +258,24 @@
public ContextEntry getContextEntry() {
return this.contextEntry;
}
+
+ public Object clone() {
+ Declaration[] previous = new Declaration[ this.previousDeclarations.length ];
+ for( int i = 0; i < previous.length; i++ ) {
+ previous[i] = (Declaration) this.previousDeclarations[i].clone();
+ }
+
+ Declaration[] local = new Declaration[ this.localDeclarations.length ];
+ for( int i = 0; i < local.length; i++ ) {
+ local[i] = (Declaration) this.localDeclarations[i].clone();
+ }
+
+ return new ReturnValueRestriction( this.contextEntry.fieldExtractor,
+ previous,
+ local,
+ this.requiredGlobals,
+ this.evaluator );
+ }
public static class ReturnValueContextEntry
implements
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -51,11 +51,11 @@
public Declaration[] getRequiredDeclarations() {
return this.restriction.getRequiredDeclarations();
}
-
+
public void replaceDeclaration(Declaration oldDecl,
Declaration newDecl) {
this.restriction.replaceDeclaration( oldDecl,
- newDecl );
+ newDecl );
}
public FieldExtractor getFieldExtractor() {
@@ -115,4 +115,9 @@
return this.fieldExtractor.equals( other.fieldExtractor ) && this.restriction.equals( other.restriction );
}
+ public Object clone() {
+ return new VariableConstraint( this.fieldExtractor,
+ (VariableRestriction) this.restriction.clone() );
+ }
+
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -57,7 +57,7 @@
public void replaceDeclaration(Declaration oldDecl,
Declaration newDecl) {
- if ( this.declaration == oldDecl ) {
+ if ( this.declaration.equals( oldDecl ) ) {
this.declaration = newDecl;
this.requiredDeclarations[0] = newDecl;
this.contextEntry.declaration = newDecl;
@@ -152,6 +152,12 @@
return this.contextEntry;
}
+ public Object clone() {
+ return new VariableRestriction( this.contextEntry.extractor,
+ (Declaration) this.declaration.clone(),
+ this.evaluator );
+ }
+
public static abstract class VariableContextEntry
implements
ContextEntry {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Constraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Constraint.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Constraint.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -20,7 +20,8 @@
public interface Constraint
extends
- RuleComponent {
+ RuleComponent,
+ Cloneable {
/**
* Returns all the declarations required by the given
@@ -39,4 +40,10 @@
*/
void replaceDeclaration(Declaration oldDecl,
Declaration newDecl);
+
+ /**
+ * Clones the constraint
+ * @return
+ */
+ public Object clone();
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -9,7 +9,8 @@
public interface Restriction
extends
- Serializable {
+ Serializable,
+ Cloneable {
Declaration[] getRequiredDeclarations();
public boolean isAllowed(Extractor extractor,
@@ -23,7 +24,7 @@
ContextEntry context);
public ContextEntry getContextEntry();
-
+
/**
* A restriction may be required to replace an old
* declaration object by a new updated one
@@ -33,6 +34,7 @@
*/
void replaceDeclaration(Declaration oldDecl,
Declaration newDecl);
-
+ public Object clone();
+
}
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockConstraint.java 2007-11-21 18:11:42 UTC (rev 16735)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockConstraint.java 2007-11-21 18:25:16 UTC (rev 16736)
@@ -50,6 +50,10 @@
Declaration newDecl) {
}
+ public Object clone() {
+ return this;
+ }
+
public ContextEntry getContextEntry() {
return new ContextEntry() {
private static final long serialVersionUID = 400L;
More information about the jboss-svn-commits
mailing list