[jboss-svn-commits] JBL Code SVN: r29434 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools/integrationtests and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Sep 22 11:13:04 EDT 2009


Author: tirelli
Date: 2009-09-22 11:13:03 -0400 (Tue, 22 Sep 2009)
New Revision: 29434

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_RuleExtend.drl
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java
Log:
JBRULES-2282: fixing bug when using variables bound in parent rules in the rule's consequence

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java	2009-09-22 13:55:53 UTC (rev 29433)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java	2009-09-22 15:13:03 UTC (rev 29434)
@@ -697,8 +697,7 @@
                 DeclarationScopeResolver resolver = ((RuleBuildContext) context).getDeclarationResolver();
                 for ( Iterator it = list[0].iterator(); it.hasNext(); ) {
                     String identifier = (String) it.next();
-                    Class cls = resolver.getDeclaration( null,
-                                                         identifier ).getExtractor().getExtractToClass();
+                    Class cls = resolver.getDeclarationClasses( ((RuleBuildContext)context).getRule() ).get( identifier );
                     parserContext.addInput( identifier,
                                             cls );
                 }

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	2009-09-22 13:55:53 UTC (rev 29433)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2009-09-22 15:13:03 UTC (rev 29434)
@@ -157,7 +157,7 @@
 
 /** Run all the tests with the ReteOO engine implementation */
 public class MiscTest extends TestCase {
-    
+
     private final Mockery context = new Mockery();
 
     protected RuleBase getRuleBase() throws Exception {
@@ -1385,14 +1385,13 @@
         FactHandle handle = session.insert( mycheese );
         session.fireAllRules();
         //System.out.println(((List) session.getGlobal( "list" )).toString());
-        assertEquals( 2, 
+        assertEquals( 2,
                       ((List) session.getGlobal( "list" )).size() );
         assertEquals( "rule 4",
-                      ((List) session.getGlobal( "list" )).get( 0 ) );        
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
         assertEquals( "rule 2b",
                       ((List) session.getGlobal( "list" )).get( 1 ) );
 
-
         //Test 2nd level (parent) to make sure rule honors the extend rule
         final List list2 = new ArrayList();
         session.setGlobal( "list",
@@ -1447,6 +1446,51 @@
 
     }
 
+    public void testExtends2() {
+        final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        try {
+            kbuilder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "test_RuleExtend.drl" ) ),
+                          ResourceType.DRL );
+
+            assertFalse( kbuilder.getErrors().toString(), 
+                         kbuilder.hasErrors() );
+            
+            KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+            kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+            final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+            final List results = new ArrayList();
+            ksession.setGlobal( "results",
+                                results );
+
+            final Cheese stilton = new Cheese( "stilton",
+                                               5 );
+            final Cheese cheddar = new Cheese( "cheddar",
+                                               7 );
+            final Cheese brie = new Cheese( "brie",
+                                            5 );
+
+            ksession.insert( stilton );
+            ksession.insert( cheddar );
+            ksession.insert( brie );
+
+            ksession.fireAllRules();
+
+            assertEquals( 2,  
+                          results.size() );
+            assertEquals( "stilton", 
+                          results.get( 0 ) );
+            assertEquals( "brie", 
+                          results.get( 1 ) );
+        } catch ( Exception e ) {
+            e.printStackTrace();
+            if( kbuilder.hasErrors() )
+                System.out.println( kbuilder.getErrors() );
+            fail("Unexpected exception: "+e.getMessage());
+        }
+    }
+
     public void testLatinLocale() throws Exception {
         Locale defaultLoc = Locale.getDefault();
 
@@ -4397,19 +4441,21 @@
         final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
         kbuilder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "test_ConstraintConnectorOr.drl" ) ),
                       ResourceType.DRL );
-        assertFalse( kbuilder.getErrors().toString(), kbuilder.hasErrors() );
-        
+        assertFalse( kbuilder.getErrors().toString(),
+                     kbuilder.hasErrors() );
+
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
         kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-        
+
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
         List<Person> results = new ArrayList<Person>();
-        ksession.setGlobal( "results", results );
+        ksession.setGlobal( "results",
+                            results );
 
         final Person mark = new Person( "Mark" );
         mark.setAlive( true );
         mark.setHappy( true );
-        
+
         final Person bush = new Person( "Bush" );
         bush.setAlive( true );
         bush.setHappy( false );
@@ -4417,19 +4463,20 @@
         final Person conan = new Person( "Conan" );
         conan.setAlive( false );
         conan.setHappy( true );
-        
+
         final Person nero = new Person( "Nero" );
         nero.setAlive( false );
         nero.setHappy( false );
-        
+
         ksession.insert( mark );
         ksession.insert( bush );
         ksession.insert( conan );
         ksession.insert( nero );
-        
+
         ksession.fireAllRules();
-        
-        assertEquals( 3, results.size() );
+
+        assertEquals( 3,
+                      results.size() );
         assertTrue( results.contains( mark ) );
         assertTrue( results.contains( bush ) );
         assertTrue( results.contains( conan ) );
@@ -6746,7 +6793,7 @@
     public void testFireAllWhenFiringUntilHalt() {
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
         final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
-        
+
         Runnable fireUntilHalt = new Runnable() {
             public void run() {
                 ksession.fireUntilHalt();
@@ -6777,16 +6824,18 @@
         } catch ( InterruptedException e ) {
         }
         boolean aliveT1 = t1.isAlive();
-        if( t2.isAlive() ){
+        if ( t2.isAlive() ) {
             t2.interrupt();
         }
-        if( t1.isAlive() ) {
+        if ( t1.isAlive() ) {
             t1.interrupt();
         }
-        assertFalse( "T2 should have finished", aliveT2 );
-        assertFalse( "T1 should have finished", aliveT1 );
+        assertFalse( "T2 should have finished",
+                     aliveT2 );
+        assertFalse( "T1 should have finished",
+                     aliveT1 );
     }
-    
+
     public void testDroolsQueryCleanup() {
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
         kbuilder.add( ResourceFactory.newClassPathResource( "test_QueryMemoryLeak.drl",
@@ -6899,16 +6948,16 @@
         // Retrieve the generated fact type
         FactType cheeseFact = kbase.getFactType( "org.drools.generatedbeans",
                                                  "Cheese" );
-        
+
         assertTrue( "Generated beans must be serializable",
-                    Serializable.class.isAssignableFrom( cheeseFact.getFactClass() ));
+                    Serializable.class.isAssignableFrom( cheeseFact.getFactClass() ) );
 
         // Create a new Fact instance
         Object cheese = cheeseFact.newInstance();
         cheeseFact.set( cheese,
                         "type",
                         "stilton" );
-        
+
         // another instance
         Object cheese2 = cheeseFact.newInstance();
         cheeseFact.set( cheese2,
@@ -6945,31 +6994,32 @@
 
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
         kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-        
+
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
-        
+
         // creating listener as a jmock proxy
-        final org.drools.event.rule.WorkingMemoryEventListener wmeListener = context.mock(org.drools.event.rule.WorkingMemoryEventListener.class);
-        
-        context.checking(new Expectations() {{
-            exactly(2).of(wmeListener).objectInserted( with(any(org.drools.event.rule.ObjectInsertedEvent.class)) );
-        }});
-        
+        final org.drools.event.rule.WorkingMemoryEventListener wmeListener = context.mock( org.drools.event.rule.WorkingMemoryEventListener.class );
+
+        context.checking( new Expectations() {
+            {
+                exactly( 2 ).of( wmeListener ).objectInserted( with( any( org.drools.event.rule.ObjectInsertedEvent.class ) ) );
+            }
+        } );
+
         ksession.addEventListener( wmeListener );
-        
+
         // listener will be notified of both facts insertion
-        ksession.insert( new Cheese("stilton") );
+        ksession.insert( new Cheese( "stilton" ) );
         ksession.insert( wmeListener );
-        
+
         // firing rules will remove listener
         ksession.fireAllRules();
-        
+
         // inserting another object into the working memory, listener should NOT be notified,
         // since it is no longer listening.
-        ksession.insert( new Cheese("brie") );
+        ksession.insert( new Cheese( "brie" ) );
 
         context.assertIsSatisfied();
     }
 
 }
-

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_RuleExtend.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_RuleExtend.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_RuleExtend.drl	2009-09-22 15:13:03 UTC (rev 29434)
@@ -0,0 +1,24 @@
+package org.drools.test;
+
+import org.drools.Cheese;
+
+global java.util.List results;
+
+rule "test A"
+    salience 10
+when
+    $a: Cheese ( type == "stilton" )
+then
+    results.add( $a.getType() );
+end
+
+rule "test B" extends "test A"
+when
+    $b: Cheese ( type == "cheddar" )
+    $c: Cheese ( type == "brie" )
+then
+    modify( $a ) {
+        setType( $c.getType() )
+    }
+    results.add( $a.getType() );
+end

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java	2009-09-22 13:55:53 UTC (rev 29433)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java	2009-09-22 15:13:03 UTC (rev 29434)
@@ -441,7 +441,7 @@
      */
     public Declaration getDeclaration(final String identifier) {
         if ( this.dirty || (this.declarations == null) ) {
-            this.declarations = this.lhsRoot.getOuterDeclarations();
+            this.declarations = this.getExtendedLhs(this, null).getOuterDeclarations();
             this.declarationArray = (Declaration[]) this.declarations.values().toArray( new Declaration[this.declarations.values().size()] );
             this.dirty = false;
         }
@@ -478,7 +478,7 @@
      */
     public Declaration[] getDeclarations() {
         if ( this.dirty || (this.declarationArray == null) ) {
-            this.declarations = this.lhsRoot.getOuterDeclarations();
+            this.declarations = this.getExtendedLhs(this, null).getOuterDeclarations();
             this.declarationArray = (Declaration[]) this.declarations.values().toArray( new Declaration[this.declarations.values().size()] );
             this.dirty = false;
         }



More information about the jboss-svn-commits mailing list