[jboss-svn-commits] JBL Code SVN: r24771 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/common and 7 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sun Jan 18 22:00:05 EST 2009
Author: mark.proctor at jboss.com
Date: 2009-01-18 22:00:04 -0500 (Sun, 18 Jan 2009)
New Revision: 24771
Added:
labs/jbossrules/trunk/drools-api/src/main/java/org/drools/event/rule/ActivationCancelledCause.java
Modified:
labs/jbossrules/trunk/drools-api/src/main/java/org/drools/event/rule/ActivationCancelledEvent.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultAgenda.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/ActivationCancelledEvent.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AgendaEventListener.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AgendaEventSupport.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/rule/impl/ActivationCancelledEventImpl.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/AgendaEventSupportTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/rule/AgendaEventSupportTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java
Log:
JBRULES-1775 Activation Cancelled Events are not being fired if an Agenda Filter is used
-filters now emit cancelled events
-cancelled events now have a cause - FILTER, CLEAR, WME_MODIFY
Added: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/event/rule/ActivationCancelledCause.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/event/rule/ActivationCancelledCause.java (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/event/rule/ActivationCancelledCause.java 2009-01-19 03:00:04 UTC (rev 24771)
@@ -0,0 +1,7 @@
+package org.drools.event.rule;
+
+public enum ActivationCancelledCause {
+ FILTER,
+ WME_CHANGE,
+ CLEAR;
+}
Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/event/rule/ActivationCancelledEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/event/rule/ActivationCancelledEvent.java 2009-01-19 01:10:14 UTC (rev 24770)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/event/rule/ActivationCancelledEvent.java 2009-01-19 03:00:04 UTC (rev 24771)
@@ -19,4 +19,5 @@
public interface ActivationCancelledEvent
extends
ActivationEvent {
+ ActivationCancelledCause getCause();
}
\ 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 2009-01-19 01:10:14 UTC (rev 24770)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultAgenda.java 2009-01-19 03:00:04 UTC (rev 24771)
@@ -33,6 +33,7 @@
import org.drools.base.DefaultKnowledgeHelper;
import org.drools.base.SequentialKnowledgeHelper;
import org.drools.common.RuleFlowGroupImpl.DeactivateCallback;
+import org.drools.event.rule.ActivationCancelledCause;
import org.drools.impl.StatefulKnowledgeSessionImpl;
import org.drools.process.instance.ProcessInstance;
import org.drools.reteoo.LeftTuple;
@@ -705,7 +706,8 @@
for ( ScheduledAgendaItem item = (ScheduledAgendaItem) this.scheduledActivations.removeFirst(); item != null; item = (ScheduledAgendaItem) this.scheduledActivations.removeFirst() ) {
Scheduler.getInstance().removeAgendaItem( item );
eventsupport.getAgendaEventSupport().fireActivationCancelled( item,
- this.workingMemory );
+ this.workingMemory,
+ ActivationCancelledCause.CLEAR );
}
}
@@ -763,7 +765,8 @@
}
eventsupport.getAgendaEventSupport().fireActivationCancelled( item,
- this.workingMemory );
+ this.workingMemory,
+ ActivationCancelledCause.CLEAR );
}
((InternalAgendaGroup) agendaGroup).clear();
}
@@ -803,7 +806,8 @@
}
eventsupport.getAgendaEventSupport().fireActivationCancelled( activation,
- this.workingMemory );
+ this.workingMemory,
+ ActivationCancelledCause.CLEAR);
}
}
activationGroup.clear();
@@ -832,7 +836,8 @@
}
eventsupport.getAgendaEventSupport().fireActivationCancelled( item,
- this.workingMemory );
+ this.workingMemory,
+ ActivationCancelledCause.CLEAR );
}
((InternalRuleFlowGroup) ruleFlowGroup).clear();
@@ -865,6 +870,12 @@
if ( filter == null || filter.accept( item ) ) {
fireActivation( item );
+ } else {
+ final EventSupport eventsupport = (EventSupport) this.workingMemory;
+
+ eventsupport.getAgendaEventSupport().fireActivationCancelled( item,
+ this.workingMemory,
+ ActivationCancelledCause.FILTER );
}
return true;
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/ActivationCancelledEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/ActivationCancelledEvent.java 2009-01-19 01:10:14 UTC (rev 24770)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/ActivationCancelledEvent.java 2009-01-19 03:00:04 UTC (rev 24771)
@@ -16,18 +16,25 @@
* limitations under the License.
*/
+import org.drools.event.rule.ActivationCancelledCause;
import org.drools.spi.Activation;
public class ActivationCancelledEvent extends ActivationEvent {
-
+ private ActivationCancelledCause cause;
+
/**
*
*/
private static final long serialVersionUID = 400L;
- public ActivationCancelledEvent(final Activation activation) {
+ public ActivationCancelledEvent(final Activation activation, ActivationCancelledCause cause) {
super( activation );
+ this.cause = cause;
}
+
+ public ActivationCancelledCause getCause() {
+ return cause;
+ }
public String toString() {
return "<==[ActivationCancelled(" + getActivation().getActivationNumber() + "): rule=" + getActivation().getRule().getName() + "; tuple=" + getActivation().getTuple() + "]";
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AgendaEventListener.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AgendaEventListener.java 2009-01-19 01:10:14 UTC (rev 24770)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AgendaEventListener.java 2009-01-19 03:00:04 UTC (rev 24771)
@@ -19,6 +19,7 @@
import java.util.EventListener;
import org.drools.WorkingMemory;
+import org.drools.event.rule.ActivationCancelledCause;
public interface AgendaEventListener
extends
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AgendaEventSupport.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AgendaEventSupport.java 2009-01-19 01:10:14 UTC (rev 24770)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AgendaEventSupport.java 2009-01-19 03:00:04 UTC (rev 24771)
@@ -25,6 +25,7 @@
import java.util.concurrent.CopyOnWriteArrayList;
import org.drools.common.InternalWorkingMemory;
+import org.drools.event.rule.ActivationCancelledCause;
import org.drools.WorkingMemory;
import org.drools.spi.Activation;
import org.drools.spi.AgendaGroup;
@@ -88,16 +89,18 @@
}
public void fireActivationCancelled(final Activation activation,
- final WorkingMemory workingMemory) {
+ final WorkingMemory workingMemory,
+ final ActivationCancelledCause cause) {
if ( this.listeners.isEmpty() ) {
return;
}
- final ActivationCancelledEvent event = new ActivationCancelledEvent( activation );
+ final ActivationCancelledEvent event = new ActivationCancelledEvent( activation,
+ cause );
for ( int i = 0, size = this.listeners.size(); i < size; i++ ) {
((AgendaEventListener) this.listeners.get( i )).activationCancelled( event,
- workingMemory );
+ workingMemory);
}
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/rule/impl/ActivationCancelledEventImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/rule/impl/ActivationCancelledEventImpl.java 2009-01-19 01:10:14 UTC (rev 24770)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/rule/impl/ActivationCancelledEventImpl.java 2009-01-19 03:00:04 UTC (rev 24771)
@@ -1,5 +1,6 @@
package org.drools.event.rule.impl;
+import org.drools.event.rule.ActivationCancelledCause;
import org.drools.event.rule.ActivationCancelledEvent;
import org.drools.runtime.KnowledgeRuntime;
import org.drools.runtime.rule.Activation;
@@ -22,9 +23,15 @@
public class ActivationCancelledEventImpl extends ActivationEventImpl implements ActivationCancelledEvent {
-
- public ActivationCancelledEventImpl(Activation activation, KnowledgeRuntime kruntime) {
- super( activation, kruntime );
+ private ActivationCancelledCause cause;
+
+ public ActivationCancelledEventImpl(Activation activation, KnowledgeRuntime kruntime, ActivationCancelledCause cause) {
+ super( activation, kruntime);
+ this.cause = cause;
}
+ public ActivationCancelledCause getCause() {
+ return cause;
+ }
+
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java 2009-01-19 01:10:14 UTC (rev 24770)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java 2009-01-19 03:00:04 UTC (rev 24771)
@@ -36,6 +36,7 @@
import org.drools.event.process.impl.ProcessNodeLeftEventImpl;
import org.drools.event.process.impl.ProcessNodeTriggeredEventImpl;
import org.drools.event.process.impl.ProcessStartedEventImpl;
+import org.drools.event.rule.ActivationCancelledCause;
import org.drools.event.rule.AgendaEventListener;
import org.drools.event.rule.WorkingMemoryEventListener;
import org.drools.event.rule.impl.ActivationCancelledEventImpl;
@@ -444,7 +445,8 @@
WorkingMemory workingMemory) {
listener.activationCancelled( new ActivationCancelledEventImpl( event.getActivation(),
- ((InternalWorkingMemory)workingMemory).getKnowledgeRuntime() ) );
+ ((InternalWorkingMemory)workingMemory).getKnowledgeRuntime(),
+ event.getCause() ) );
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java 2009-01-19 01:10:14 UTC (rev 24770)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java 2009-01-19 03:00:04 UTC (rev 24771)
@@ -32,6 +32,7 @@
import org.drools.common.NodeMemory;
import org.drools.common.PropagationContextImpl;
import org.drools.common.ScheduledAgendaItem;
+import org.drools.event.rule.ActivationCancelledCause;
import org.drools.reteoo.builder.BuildContext;
import org.drools.rule.GroupElement;
import org.drools.rule.Rule;
@@ -302,7 +303,8 @@
}
((EventSupport) workingMemory).getAgendaEventSupport().fireActivationCancelled( activation,
- workingMemory );
+ workingMemory,
+ ActivationCancelledCause.WME_CHANGE );
((InternalAgenda) workingMemory.getAgenda()).decreaseActiveActivations();
}
} else {
@@ -360,7 +362,8 @@
if ( activation.isActivated() ) {
activation.remove();
((EventSupport) workingMemory).getAgendaEventSupport().fireActivationCancelled( activation,
- workingMemory );
+ workingMemory,
+ ActivationCancelledCause.CLEAR );
}
final PropagationContext propagationContext = new PropagationContextImpl( workingMemory.getNextPropagationIdCounter(),
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/AgendaEventSupportTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/AgendaEventSupportTest.java 2009-01-19 01:10:14 UTC (rev 24770)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/AgendaEventSupportTest.java 2009-01-19 03:00:04 UTC (rev 24771)
@@ -40,6 +40,7 @@
import org.drools.base.evaluators.Operator;
import org.drools.base.evaluators.SetEvaluatorsDefinition;
import org.drools.base.evaluators.SoundslikeEvaluatorsDefinition;
+import org.drools.event.rule.ActivationCancelledCause;
import org.drools.rule.LiteralConstraint;
import org.drools.rule.Package;
import org.drools.rule.Pattern;
@@ -164,15 +165,34 @@
ActivationCreatedEvent createdEvent = (ActivationCreatedEvent) agendaList.get( 0 );
assertSame( cheddar,
createdEvent.getActivation().getTuple().get( 0 ).getObject() );
+
+ // clear the agenda to check CLEAR events occur
+ wm.clearAgenda();
+ ActivationCancelledEvent cancelledEvent = (ActivationCancelledEvent) agendaList.get( 1 );
+ assertEquals( ActivationCancelledCause.CLEAR, cancelledEvent.getCause() );
+
agendaList.clear();
+ // update results in an ActivationCreatedEvent
+ cheddar.setPrice( 14 );
+ wm.update( cheddarHandle,
+ cheddar );
+ assertEquals( 1,
+ agendaList.size() );
+ createdEvent = (ActivationCreatedEvent) agendaList.get( 0 );
+ assertSame( cheddar,
+ createdEvent.getActivation().getTuple().get( 0 ).getObject() );
+ agendaList.clear();
+
// update results in a ActivationCancelledEvent and an ActivationCreatedEvent, note the object is always resolvable
cheddar.setPrice( 14 );
wm.update( cheddarHandle,
cheddar );
assertEquals( 2,
- agendaList.size() );
- ActivationCancelledEvent cancelledEvent = (ActivationCancelledEvent) agendaList.get( 0 );
+ agendaList.size() );
+
+ cancelledEvent = (ActivationCancelledEvent) agendaList.get( 0 );
+ assertEquals( ActivationCancelledCause.WME_CHANGE, cancelledEvent.getCause() );
assertSame( cheddar,
cancelledEvent.getActivation().getTuple().get( 0 ).getObject() );
createdEvent = (ActivationCreatedEvent) agendaList.get( 1 );
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/rule/AgendaEventSupportTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/rule/AgendaEventSupportTest.java 2009-01-19 01:10:14 UTC (rev 24770)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/rule/AgendaEventSupportTest.java 2009-01-19 03:00:04 UTC (rev 24771)
@@ -66,9 +66,9 @@
registry.addEvaluatorDefinition( new SoundslikeEvaluatorsDefinition() );
}
-// public void testIsSerializable() {
-// assertTrue( Serializable.class.isAssignableFrom( AgendaEventSupport.class ) );
-// }
+ // public void testIsSerializable() {
+ // assertTrue( Serializable.class.isAssignableFrom( AgendaEventSupport.class ) );
+ // }
public void testAgendaEventListener() throws Exception {
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
@@ -114,14 +114,13 @@
}
} );
pkg.addRule( rule );
-
-
+
List<KnowledgePackage> pkgs = new ArrayList<KnowledgePackage>();
pkgs.add( new KnowledgePackageImp( pkg ) );
kbase.addKnowledgePackages( pkgs );
// create a new working memory and add an AgendaEventListener
- StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession();
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
final List agendaList = new ArrayList();
final AgendaEventListener agendaEventListener = new AgendaEventListener() {
@@ -150,12 +149,12 @@
agendaList.add( event );
}
};
- session.addEventListener( agendaEventListener );
+ ksession.addEventListener( agendaEventListener );
// assert the cheese fact
final Cheese cheddar = new Cheese( "cheddar",
15 );
- FactHandle cheddarHandle = session.insert( cheddar );
+ FactHandle cheddarHandle = ksession.insert( cheddar );
// should be one ActivationCreatedEvent
assertEquals( 1,
@@ -163,35 +162,54 @@
ActivationCreatedEvent createdEvent = (ActivationCreatedEvent) agendaList.get( 0 );
assertSame( cheddarHandle,
createdEvent.getActivation().getFactHandles().toArray()[0] );
+
+ // clear the agenda to check CLEAR events occur
+ ksession.getAgenda().clear();
+ ActivationCancelledEvent cancelledEvent = (ActivationCancelledEvent) agendaList.get( 1 );
+ assertEquals( ActivationCancelledCause.CLEAR,
+ cancelledEvent.getCause() );
+
agendaList.clear();
+ // update results in an ActivationCreatedEvent
+ cheddar.setPrice( 14 );
+ ksession.update( cheddarHandle,
+ cheddar );
+ assertEquals( 1,
+ agendaList.size() );
+ createdEvent = (ActivationCreatedEvent) agendaList.get( 0 );
+ assertSame( cheddarHandle,
+ createdEvent.getActivation().getFactHandles().toArray()[0] );
+ agendaList.clear();
+
// update results in a ActivationCancelledEvent and an ActivationCreatedEvent, note the object is always resolvable
cheddar.setPrice( 14 );
- session.update( cheddarHandle,
- cheddar );
+ ksession.update( cheddarHandle,
+ cheddar );
assertEquals( 2,
agendaList.size() );
- ActivationCancelledEvent cancelledEvent = (ActivationCancelledEvent) agendaList.get( 0 );
+ cancelledEvent = (ActivationCancelledEvent) agendaList.get( 0 );
+ assertEquals( ActivationCancelledCause.WME_CHANGE, cancelledEvent.getCause() );
assertSame( cheddarHandle,
cancelledEvent.getActivation().getFactHandles().toArray()[0] );
createdEvent = (ActivationCreatedEvent) agendaList.get( 1 );
assertSame( cheddarHandle,
- createdEvent.getActivation().getFactHandles().toArray()[0]);
+ createdEvent.getActivation().getFactHandles().toArray()[0] );
agendaList.clear();
// retract results in a ActivationCancelledEvent, note the object is not resolveable now as it no longer exists
- session.retract( cheddarHandle );
+ ksession.retract( cheddarHandle );
assertEquals( 1,
agendaList.size() );
cancelledEvent = (ActivationCancelledEvent) agendaList.get( 0 );
- assertNull( ((InternalFactHandle)cancelledEvent.getActivation().getFactHandles().toArray()[0]).getObject() );
+ assertNull( ((InternalFactHandle) cancelledEvent.getActivation().getFactHandles().toArray()[0]).getObject() );
// re-assert the fact so we can test the agenda group events
- cheddarHandle = session.insert( cheddar );
+ cheddarHandle = ksession.insert( cheddar );
agendaList.clear();
// setFocus results in an AgendaGroupPushedEvent
- session.getAgenda().getAgendaGroup( "test group" ).setFocus();
+ ksession.getAgenda().getAgendaGroup( "test group" ).setFocus();
assertEquals( 1,
agendaList.size() );
final AgendaGroupPushedEvent pushedEvent = (AgendaGroupPushedEvent) agendaList.get( 0 );
@@ -201,7 +219,7 @@
// fireAllRules results in a BeforeActivationFiredEvent and an AfterActivationFiredEvent
// the AgendaGroup becomes empty, which results in a popped event.
- session.fireAllRules();
+ ksession.fireAllRules();
assertEquals( 3,
agendaList.size() );
final BeforeActivationFiredEvent beforeEvent = (BeforeActivationFiredEvent) agendaList.get( 0 );
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java 2009-01-19 01:10:14 UTC (rev 24770)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java 2009-01-19 03:00:04 UTC (rev 24771)
@@ -39,6 +39,10 @@
import org.drools.common.InternalWorkingMemory;
import org.drools.common.PropagationContextImpl;
import org.drools.common.RuleFlowGroupImpl;
+import org.drools.event.ActivationCancelledEvent;
+import org.drools.event.AgendaEventSupport;
+import org.drools.event.DefaultAgendaEventListener;
+import org.drools.event.rule.ActivationCancelledCause;
import org.drools.reteoo.ReteooBuilder.IdGenerator;
import org.drools.reteoo.builder.BuildContext;
import org.drools.rule.Rule;
@@ -178,6 +182,18 @@
final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newStatefulSession();
final DefaultAgenda agenda = (DefaultAgenda) workingMemory.getAgenda();
+
+ final Boolean[] filtered = new Boolean[] { false };
+
+ workingMemory.addEventListener( new DefaultAgendaEventListener() {
+
+ public void activationCancelled(ActivationCancelledEvent event,
+ WorkingMemory workingMemory) {
+ if ( event.getCause() == ActivationCancelledCause.FILTER ) {
+ filtered[0] = true;
+ }
+ }
+ });
final Rule rule = new Rule( "test-rule" );
final RuleTerminalNode node = new RuleTerminalNode( 3,
@@ -248,11 +264,13 @@
// make sure it also fired
assertEquals( new Boolean( true ),
results.get( "fired" ) );
+
+ assertEquals( false, filtered[0].booleanValue() );
// clear the agenda and the result map
agenda.clearAndCancel();
results.clear();
-
+
// False filter, activations should always be denied
final AgendaFilter filterFalse = new AgendaFilter() {
public boolean accept(Activation item) {
@@ -276,6 +294,8 @@
// check the consequence never fired
assertNull( results.get( "fired" ) );
+
+ assertEquals( true, filtered[0].booleanValue() );
}
public void testFocusStack() throws ConsequenceException {
More information about the jboss-svn-commits
mailing list