[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