[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