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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Apr 28 17:04:36 EDT 2010


Author: tirelli
Date: 2010-04-28 17:04:34 -0400 (Wed, 28 Apr 2010)
New Revision: 32675

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_ModifyWithRuleflowAndSubNetwork.drl
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_modifyWithRuleflowAndSubnetwork.rf
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/DefaultAgenda.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/RuleFlowGroupImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ModifyPreviousTuples.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
Log:
JBRULES-2339: JBRULES-2340: fixing errors in rete building and propagation when using rules and ruleflow

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	2010-04-28 17:54:29 UTC (rev 32674)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2010-04-28 21:04:34 UTC (rev 32675)
@@ -91,6 +91,7 @@
 import org.drools.Win;
 import org.drools.WorkingMemory;
 import org.drools.Cheesery.Maturity;
+import org.drools.Order.OrderStatus;
 import org.drools.builder.KnowledgeBuilder;
 import org.drools.builder.KnowledgeBuilderConfiguration;
 import org.drools.builder.KnowledgeBuilderError;
@@ -6999,25 +7000,60 @@
             }
         }
         assertTrue( kbuilder.hasErrors() );
+    }
+    
+    public void testModifyWithRuleflowAndSubNetwork() throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_ModifyWithRuleflowAndSubNetwork.drl", getClass() ),
+                      ResourceType.DRL );
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_modifyWithRuleflowAndSubnetwork.rf", getClass() ),
+                      ResourceType.DRF );
+        KnowledgeBuilderErrors errors = kbuilder.getErrors();
+        if ( errors.size() > 0 ) {
+            for ( KnowledgeBuilderError error : errors ) {
+                System.err.println( error );
+            }
+            throw new IllegalArgumentException( "Could not parse knowledge." );
+        }
+        assertFalse( kbuilder.hasErrors() );
 
-//        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-//        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-//        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
-//        ksession.setGlobal( "ksession", ksession );
-//
-//        // create working memory mock listener
-//        org.drools.event.rule.WorkingMemoryEventListener wml = Mockito.mock( org.drools.event.rule.WorkingMemoryEventListener.class );
-//        
-//        ksession.addEventListener( wml );
-//
-//        org.drools.runtime.rule.FactHandle personFH = ksession.insert( new Person("mark", 40) );
-//        
-//        int fired = ksession.fireAllRules();
-//        assertEquals( 1, fired );
-//
-//        // capture the arguments and check that the retracts happened
-//        ArgumentCaptor<org.drools.event.rule.ObjectUpdatedEvent> updates = ArgumentCaptor.forClass(org.drools.event.rule.ObjectUpdatedEvent.class);
-//        verify( wml, times(1) ).objectUpdated( updates.capture() );
-//        assertThat( updates.getValue().getFactHandle(), is( personFH ) );
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        // create working memory mock listener
+        org.drools.event.rule.WorkingMemoryEventListener wml = Mockito.mock( org.drools.event.rule.WorkingMemoryEventListener.class );
+        org.drools.event.rule.AgendaEventListener ael = Mockito.mock( org.drools.event.rule.AgendaEventListener.class );
+        
+        ksession.addEventListener( wml );
+        ksession.addEventListener( ael );
+
+        Order order = new Order( 1, "bob" );
+        OrderItem item = new OrderItem( order, 1 );
+        order.addItem( item );
+        order.setStatus( new OrderStatus() );
+        order.getStatus().setActive( true );
+        org.drools.runtime.rule.FactHandle orderFH = ksession.insert( order );
+        
+        Order order2 = new Order( 2, "bob" );
+        OrderItem item2 = new OrderItem( order, 2 );
+        order2.addItem( item2 );
+        order2.setStatus( new OrderStatus() );
+        order2.getStatus().setActive( true );
+        org.drools.runtime.rule.FactHandle order2FH = ksession.insert( order2 );
+
+        ksession.startProcess( "ruleflow" );
+        
+        int fired = ksession.fireAllRules();
+        assertEquals( 4, fired );
+
+        // capture the arguments and check that the retracts happened
+//        ArgumentCaptor<org.drools.event.rule.ObjectRetractedEvent> retracts = ArgumentCaptor.forClass(org.drools.event.rule.ObjectRetractedEvent.class);
+//        verify( wml, times(2) ).objectRetracted( retracts.capture() );
+//        List<org.drools.event.rule.ObjectRetractedEvent> values = retracts.getAllValues();
+//        assertThat( values.get( 0 ).getFactHandle(), is( personFH ) );
+//        assertThat( values.get( 1 ).getFactHandle(), is( petFH ) );
     }
+   
+    
 }

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_ModifyWithRuleflowAndSubNetwork.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_ModifyWithRuleflowAndSubNetwork.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_ModifyWithRuleflowAndSubNetwork.drl	2010-04-28 21:04:34 UTC (rev 32675)
@@ -0,0 +1,25 @@
+package org.drools
+
+import org.drools.Order.OrderStatus
+
+rule "insert OrderStatus"
+    ruleflow-group "process"
+when
+    $o : Order()
+then
+    insert( $o.getStatus() );
+end
+
+rule "test modify with ruleflow and subnetwork"
+    ruleflow-group "process"
+when
+    $os : OrderStatus( active == true )
+    $o : Order( status == $os, $items : itemsValues )
+    Number( intValue < 10 ) from accumulate(
+        OrderItem( ) from $items,
+        count( 1 ) )
+then
+    modify( $os ) {
+        setActive( false ) 
+    }
+end

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_modifyWithRuleflowAndSubnetwork.rf
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_modifyWithRuleflowAndSubnetwork.rf	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_modifyWithRuleflowAndSubnetwork.rf	2010-04-28 21:04:34 UTC (rev 32675)
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?> 
+<process xmlns="http://drools.org/drools-5.0/process"
+         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+         xs:schemaLocation="http://drools.org/drools-5.0/process drools-processes-5.0.xsd"
+         type="RuleFlow" name="Simple flow" id="ruleflow" package-name="org.drools" >
+
+  <header>
+  </header>
+
+  <nodes>
+    <start id="1" name="Start" x="100" y="100" width="48" height="48" />
+    <ruleSet id="2" name="Process" x="223" y="108" width="80" height="48" ruleFlowGroup="process" />
+    <end id="3" name="End" x="391" y="115" width="48" height="48" />
+  </nodes>
+
+  <connections>
+    <connection from="1" to="2" />
+    <connection from="2" to="3" />
+  </connections>
+
+</process>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultAgenda.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultAgenda.java	2010-04-28 17:54:29 UTC (rev 32674)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultAgenda.java	2010-04-28 21:04:34 UTC (rev 32675)
@@ -904,6 +904,13 @@
             }
             activation.setActivated( false );
 
+            if ( activation.getActivationNode() != null ) {
+                final InternalRuleFlowGroup ruleFlowGroup = (InternalRuleFlowGroup) activation.getActivationNode().getParentContainer();
+                // it is possible that the ruleflow group is no longer active if it was
+                // cleared during execution of this activation
+                ruleFlowGroup.removeActivation( activation );
+            }
+
             try {
                 this.knowledgeHelper.setActivation( activation );
                 activation.getRule().getConsequence().evaluate( this.knowledgeHelper,
@@ -924,15 +931,6 @@
                 }
             }
 
-            if ( activation.getActivationNode() != null ) {
-                final InternalRuleFlowGroup ruleFlowGroup = (InternalRuleFlowGroup) activation.getActivationNode().getParentContainer();
-                // it is possible that the ruleflow group is no longer active if it was
-                // cleared during execution of this activation
-                if ( ruleFlowGroup.isActive() ) {
-                    ruleFlowGroup.removeActivation( activation );
-                }
-            }
-
             // if the tuple contains expired events 
             for ( LeftTuple tuple = (LeftTuple) activation.getTuple(); tuple != null; tuple = tuple.getParent() ) {
                 if ( tuple.getLastHandle().isEvent() ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/RuleFlowGroupImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/RuleFlowGroupImpl.java	2010-04-28 17:54:29 UTC (rev 32674)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/RuleFlowGroupImpl.java	2010-04-28 21:04:34 UTC (rev 32675)
@@ -185,6 +185,7 @@
     }
 
     public void addActivation(final Activation activation) {
+        assert activation.getActivationNode() == null;
         final ActivationNode node = new ActivationNode( activation,
                                                               this );
         activation.setActivationNode( node );
@@ -198,7 +199,7 @@
     public void removeActivation(final Activation activation) {
         final ActivationNode node = activation.getActivationNode();
         this.list.remove( node );
-        activation.setActivationGroupNode( null );
+        activation.setActivationNode( null );
         if ( this.active && this.autoDeactivate ) {
             if ( this.list.isEmpty() ) {
                 // deactivate callback

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ModifyPreviousTuples.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ModifyPreviousTuples.java	2010-04-28 17:54:29 UTC (rev 32674)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ModifyPreviousTuples.java	2010-04-28 21:04:34 UTC (rev 32675)
@@ -37,7 +37,7 @@
     }
 
     public LeftTuple removeLeftTuple(LeftTupleSink sink) {
-        if ( this.leftTuple == null ) {
+        if ( this.leftTuple == null && this.leftTuples == null ) {
             return null;
         }
         if ( this.leftTuples == null ) {
@@ -62,7 +62,7 @@
     }
 
     public RightTuple removeRightTuple(RightTupleSink sink) {
-        if ( this.rightTuple == null ) {
+        if ( this.rightTuple == null && this.rightTuples == null ) {
             return null;
         }        
         if ( this.rightTuples == null ) {

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	2010-04-28 17:54:29 UTC (rev 32674)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2010-04-28 21:04:34 UTC (rev 32675)
@@ -251,7 +251,6 @@
         private int               nextId;
 
         public IdGenerator() {
-
         }
 
         public IdGenerator(final int firstId) {
@@ -259,6 +258,7 @@
             this.recycledIds = new LinkedList<Integer>();
         }
 
+        @SuppressWarnings("unchecked")
         public void readExternal(ObjectInput in) throws IOException,
                                                 ClassNotFoundException {
             recycledIds = (Queue<Integer>) in.readObject();
@@ -272,14 +272,11 @@
 
         public int getNextId() {
             Integer id = this.recycledIds.poll();
-            if ( id == null ) {
-                return this.nextId++;
-            }
-            return id;
+            return ( id == null ) ? this.nextId++ : id.intValue();
         }
 
         public void releaseId(int id) {
-            this.recycledIds.add(id );
+            this.recycledIds.add( id );
         }
 
         public int getLastId() {



More information about the jboss-svn-commits mailing list