[jboss-svn-commits] JBL Code SVN: r10809 - in labs/jbossrules/trunk/drools-core/src: test/java/org/drools/event and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Apr 7 09:03:46 EDT 2007


Author: mark.proctor at jboss.com
Date: 2007-04-07 09:03:46 -0400 (Sat, 07 Apr 2007)
New Revision: 10809

Added:
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/AgendaEventSupportTest.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultAgenda.java
Log:
JBRULES-771 Expose agenda group events
-Added unit test for AgendaEventListener

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	2007-04-07 12:47:52 UTC (rev 10808)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultAgenda.java	2007-04-07 13:03:46 UTC (rev 10809)
@@ -167,13 +167,12 @@
         // Set the focus to the agendaGroup if it doesn't already have the focus
         if ( this.focusStack.getLast() != agendaGroup ) {
             this.focusStack.add( agendaGroup );
+            final EventSupport eventsupport = (EventSupport) this.workingMemory;
+            eventsupport.getAgendaEventSupport().fireAgendaGroupPushed( agendaGroup );            
             return true;
-        }
-        
-        final EventSupport eventsupport = (EventSupport) this.workingMemory;
-        eventsupport.getAgendaEventSupport().fireAgendaGroupPushed( agendaGroup );
-        
-        return false;
+        } else {         
+        	return false;
+    	}
     }
 
     /* (non-Javadoc)

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/AgendaEventSupportTest.java	2007-04-07 13:03:46 UTC (rev 10809)
@@ -0,0 +1,169 @@
+package org.drools.event;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.Cheese;
+import org.drools.FactHandle;
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.WorkingMemory;
+import org.drools.base.ClassFieldExtractor;
+import org.drools.base.ClassObjectType;
+import org.drools.base.FieldFactory;
+import org.drools.base.ValueType;
+import org.drools.base.evaluators.Operator;
+import org.drools.reteoo.AlphaNode;
+import org.drools.rule.Column;
+import org.drools.rule.LiteralConstraint;
+import org.drools.rule.Rule;
+import org.drools.rule.Package;
+import org.drools.spi.Consequence;
+import org.drools.spi.Evaluator;
+import org.drools.spi.FieldValue;
+import org.drools.spi.KnowledgeHelper;
+
+import junit.framework.TestCase;
+
+/**
+ * @author <a href="mailto:simon at redhillconsulting.com.au">Simon Harris</a>
+ */
+public class AgendaEventSupportTest extends TestCase {
+    public void testIsSerializable() {
+        assertTrue( Serializable.class.isAssignableFrom( AgendaEventSupport.class ) );
+    }
+
+    public void testAgendaEventListener() throws Exception {
+        RuleBase rb = RuleBaseFactory.newRuleBase();
+        
+        // create a simpe package with one rule to test the events
+        Package pkg = new Package( "org.drools.test" );        
+        Rule rule = new Rule("test1");
+        rule.setAgendaGroup( "test group" );
+        ClassObjectType cheeseObjectType = new ClassObjectType( Cheese.class );
+        Column column = new Column(0, cheeseObjectType);
+        
+        ClassFieldExtractor extractor = new ClassFieldExtractor( Cheese.class,
+        														 "type" );
+
+        FieldValue field = FieldFactory.getFieldValue( "cheddar" );
+
+        Evaluator evaluator = ValueType.STRING_TYPE.getEvaluator( Operator.EQUAL );
+
+        LiteralConstraint constraint = new LiteralConstraint( extractor,
+        													  evaluator,
+        													  field );     
+        column.addConstraint( constraint );
+        rule.addPattern( column );
+        
+        rule.setConsequence(new Consequence() {
+			public void evaluate(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory) throws Exception {
+			}        	
+        });        
+        pkg.addRule(rule);        
+        rb.addPackage(pkg);        
+        
+        // create a new working memory and add an AgendaEventListener
+        WorkingMemory wm = rb.newWorkingMemory();        
+        final List agendaList = new ArrayList();
+        AgendaEventListener agendaEventListener = new AgendaEventListener() {
+
+            public void activationCancelled(ActivationCancelledEvent event,
+                                            WorkingMemory workingMemory) {
+                agendaList.add( event );
+                
+            }
+
+            public void activationCreated(ActivationCreatedEvent event,
+                                          WorkingMemory workingMemory) {
+                agendaList.add( event );
+            }
+
+            public void afterActivationFired(AfterActivationFiredEvent event,
+                                             WorkingMemory workingMemory) {
+                agendaList.add( event );
+            }
+
+            public void agendaGroupPopped(AgendaGroupPoppedEvent event,
+                                          WorkingMemory workingMemory) {
+                agendaList.add( event );
+            }
+
+            public void agendaGroupPushed(AgendaGroupPushedEvent event,
+                                          WorkingMemory workingMemory) {
+                agendaList.add( event );
+            }
+
+            public void beforeActivationFired(BeforeActivationFiredEvent event,
+                                              WorkingMemory workingMemory) {
+                agendaList.add( event );
+            }           
+        };        
+        wm.addEventListener( agendaEventListener );
+        
+        // assert the cheese fact
+        Cheese cheddar = new Cheese( "cheddar", 15 );
+        FactHandle cheddarHandle = wm.assertObject( cheddar );
+        
+        // should be one ActivationCreatedEvent
+        assertEquals( 1, agendaList.size() );
+        ActivationCreatedEvent createdEvent = ( ActivationCreatedEvent ) agendaList.get( 0 );
+        assertSame( cheddar, createdEvent.getActivation().getTuple().get( 0 ).getObject() );
+        agendaList.clear();
+        
+        // modify results in a ActivationCancelledEvent and an ActivationCreatedEvent, note the object is always resolvable        
+        cheddar.setPrice( 14 );
+        wm.modifyObject( cheddarHandle, cheddar);
+        assertEquals( 2, agendaList.size() );
+        ActivationCancelledEvent cancelledEvent = ( ActivationCancelledEvent ) agendaList.get( 0 );
+        assertSame( cheddar, cancelledEvent.getActivation().getTuple().get( 0 ).getObject() );
+        createdEvent = ( ActivationCreatedEvent ) agendaList.get( 1 );
+        assertSame( cheddar, createdEvent.getActivation().getTuple().get( 0 ).getObject() );
+        agendaList.clear();        
+        
+        // retract results in a ActivationCancelledEvent, noe the object is not resolveable now as it no longer exists
+        wm.retractObject( cheddarHandle );
+        assertEquals( 1, agendaList.size() );
+        cancelledEvent = ( ActivationCancelledEvent ) agendaList.get( 0 );
+        assertNull( cancelledEvent.getActivation().getTuple().get( 0 ).getObject() );
+        
+        // re-assert the fact so we can test the agenda group events
+        cheddarHandle = wm.assertObject( cheddar );
+        agendaList.clear();
+        
+        // setFocus results in an AgendaGroupPushedEvent
+        wm.setFocus( "test group" );
+        assertEquals( 1, agendaList.size() );
+        AgendaGroupPushedEvent pushedEvent = ( AgendaGroupPushedEvent ) agendaList.get( 0 );
+        assertEquals( "test group", pushedEvent.getAgendaGroup().getName() );
+        agendaList.clear();
+        
+        // fireAllRules results in a BeforeActivationFiredEvent and an AfterActivationFiredEvent
+        // the AgendaGroup becomes empty, which results in a popped event.
+        wm.fireAllRules();
+        assertEquals( 3, agendaList.size() );
+        BeforeActivationFiredEvent beforeEvent = ( BeforeActivationFiredEvent ) agendaList.get( 0 );
+        assertSame( cheddar, beforeEvent.getActivation().getTuple().get( 0 ).getObject() );
+        AfterActivationFiredEvent afterEvent = ( AfterActivationFiredEvent ) agendaList.get( 1 );
+        assertSame( cheddar, afterEvent.getActivation().getTuple().get( 0 ).getObject() );        
+        AgendaGroupPoppedEvent poppedEvent = ( AgendaGroupPoppedEvent ) agendaList.get( 2 );
+        assertEquals( "test group", poppedEvent.getAgendaGroup().getName() );        
+    }
+}
\ No newline at end of file




More information about the jboss-svn-commits mailing list