[jboss-svn-commits] JBL Code SVN: r25808 - labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Mar 24 21:53:31 EDT 2009


Author: stampy88
Date: 2009-03-24 21:53:31 -0400 (Tue, 24 Mar 2009)
New Revision: 25808

Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AbstractEventSupport.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/RuleBaseEventSupport.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowEventSupport.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/WorkingMemoryEventSupport.java
Log:
Refactored rest of event support classes per JBRULES-2028

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AbstractEventSupport.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AbstractEventSupport.java	2009-03-25 00:54:05 UTC (rev 25807)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AbstractEventSupport.java	2009-03-25 01:53:31 UTC (rev 25808)
@@ -86,4 +86,8 @@
     public boolean isEmpty() {
         return this.listeners.isEmpty();
     }
+        
+    public void clear() {
+        this.listeners.clear();
+    }
 }

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-03-25 00:54:05 UTC (rev 25807)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AgendaEventSupport.java	2009-03-25 01:53:31 UTC (rev 25808)
@@ -16,147 +16,103 @@
  * limitations under the License.
  */
 
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-
+import org.drools.WorkingMemory;
 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;
 
+import java.util.Iterator;
+
 /**
  * @author <a href="mailto:simon at redhillconsulting.com.au">Simon Harris </a>
+ * @author <a href="mailto:stampy88 at yahoo.com">dave sinclair</a>
  */
-public class AgendaEventSupport
-    implements
-    Externalizable {
-    /**
-     *
-     */
-    private static final long serialVersionUID = 400L;
-    private List<AgendaEventListener> listeners = new CopyOnWriteArrayList<AgendaEventListener>();
+public class AgendaEventSupport extends AbstractEventSupport<AgendaEventListener> {
 
     public AgendaEventSupport() {
     }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        listeners   = (List<AgendaEventListener>)in.readObject();
-    }
-
-    public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(listeners);
-    }
-
-    public void addEventListener(final AgendaEventListener listener) {
-        if ( !this.listeners.contains( listener ) ) {
-            this.listeners.add( listener );
-        }
-    }
-
-    public void removeEventListener(final AgendaEventListener listener) {
-        this.listeners.remove( listener );
-    }
-
-    public List<AgendaEventListener> getEventListeners() {
-        return Collections.unmodifiableList( this.listeners );
-    }
-
-    public int size() {
-        return this.listeners.size();
-    }
-
-    public boolean isEmpty() {
-        return this.listeners.isEmpty();
-    }
-
     public void fireActivationCreated(final Activation activation,
                                       final WorkingMemory workingMemory) {
-        if ( this.listeners.isEmpty() ) {
-            return;
-        }
+        final Iterator<AgendaEventListener> iter = getEventListenersIterator();
 
-        final ActivationCreatedEvent event = new ActivationCreatedEvent( activation );
+        if (iter.hasNext()) {
+            final ActivationCreatedEvent event = new ActivationCreatedEvent(activation);
 
-        for ( AgendaEventListener listener: listeners) {
-            listener.activationCreated( event, workingMemory );
+            do{
+                iter.next().activationCreated(event, workingMemory);
+            }  while (iter.hasNext());
         }
     }
 
     public void fireActivationCancelled(final Activation activation,
                                         final WorkingMemory workingMemory,
                                         final ActivationCancelledCause cause) {
-        if ( this.listeners.isEmpty() ) {
-            return;
-        }
+        final Iterator<AgendaEventListener> iter = getEventListenersIterator();
 
-        final ActivationCancelledEvent event = new ActivationCancelledEvent( activation,
-                                                                             cause );
+        if (iter.hasNext()) {
+            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);
+            do{
+                iter.next().activationCancelled(event, workingMemory);
+            }  while (iter.hasNext());
         }
     }
 
     public void fireBeforeActivationFired(final Activation activation,
                                           final WorkingMemory workingMemory) {
-        if ( this.listeners.isEmpty() ) {
-            return;
-        }
+        final Iterator<AgendaEventListener> iter = getEventListenersIterator();
 
-        final BeforeActivationFiredEvent event = new BeforeActivationFiredEvent( activation );
+        if (iter.hasNext()) {
+            final BeforeActivationFiredEvent event = new BeforeActivationFiredEvent(activation);
 
-        for ( AgendaEventListener listener: listeners) {
-            listener.beforeActivationFired( event, workingMemory );
+            do{
+                iter.next().beforeActivationFired(event, workingMemory);
+            }  while (iter.hasNext());
         }
     }
 
     public void fireAfterActivationFired(final Activation activation,
                                          final InternalWorkingMemory workingMemory) {
-        if ( this.listeners.isEmpty() ) {
-            return;
-        }
+        final Iterator<AgendaEventListener> iter = getEventListenersIterator();
 
-        final AfterActivationFiredEvent event = new AfterActivationFiredEvent( activation );
+        if (iter.hasNext()) {
+            final AfterActivationFiredEvent event = new AfterActivationFiredEvent(activation);
 
-        for ( AgendaEventListener listener: listeners) {
-            listener.afterActivationFired( event, workingMemory );
+            do{
+                iter.next().afterActivationFired(event, workingMemory);
+            }  while (iter.hasNext());
         }
     }
 
     public void fireAgendaGroupPopped(final AgendaGroup agendaGroup,
                                       final InternalWorkingMemory workingMemory) {
-        if ( this.listeners.isEmpty() ) {
-            return;
-        }
+        final Iterator<AgendaEventListener> iter = getEventListenersIterator();
 
-        final AgendaGroupPoppedEvent event = new AgendaGroupPoppedEvent( agendaGroup );
+        if (iter.hasNext()) {
+            final AgendaGroupPoppedEvent event = new AgendaGroupPoppedEvent(agendaGroup);
 
-        for ( AgendaEventListener listener: listeners) {
-            listener.agendaGroupPopped( event, workingMemory );
+            do{
+                iter.next().agendaGroupPopped(event, workingMemory);
+            }  while (iter.hasNext());
         }
     }
 
     public void fireAgendaGroupPushed(final AgendaGroup agendaGroup,
                                       final InternalWorkingMemory workingMemory) {
-        if ( this.listeners.isEmpty() ) {
-            return;
-        }
+        final Iterator<AgendaEventListener> iter = getEventListenersIterator();
 
-        final AgendaGroupPushedEvent event = new AgendaGroupPushedEvent( agendaGroup );
+        if (iter.hasNext()) {
+            final AgendaGroupPushedEvent event = new AgendaGroupPushedEvent(agendaGroup);
 
-        for ( AgendaEventListener listener: listeners) {
-            listener.agendaGroupPushed( event, workingMemory );
+            do{
+                iter.next().agendaGroupPushed(event, workingMemory);
+            }  while (iter.hasNext());
         }
     }
 
     public void reset() {
-        this.listeners.clear();
+        this.clear();
     }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleBaseEventSupport.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleBaseEventSupport.java	2009-03-25 00:54:05 UTC (rev 25807)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleBaseEventSupport.java	2009-03-25 01:53:31 UTC (rev 25808)
@@ -23,12 +23,6 @@
 import java.util.Iterator;
 
 /**
- * Please note that any event notification methods, e.g. <method>fireBeforePackageAdded</method>, etc.,
- * always create the event and iterator regardless if there are listeners. This is because if the
- * check is to see if there are listeners via the <method>isEmpty</method> method, theoretically
- * there should be synchonrization involved to ensure the <method>isEmpty</method> and
- * </method>getEventListenersIterator</method> both see the same list contents.
- *
  * @author etirelli
  * @author <a href="mailto:stampy88 at yahoo.com">dave sinclair</a>
  */
@@ -42,134 +36,176 @@
     public RuleBaseEventSupport(final RuleBase ruleBase) {
         this.ruleBase = ruleBase;
     }
-   
+
     public void setRuleBase(RuleBase ruleBase) {
         this.ruleBase = ruleBase;
     }
 
     public void fireBeforePackageAdded(final Package newPkg) {
-        final BeforePackageAddedEvent event = new BeforePackageAddedEvent(this.ruleBase, newPkg);
         final Iterator<RuleBaseEventListener> iter = getEventListenersIterator();
 
-        while (iter.hasNext()) {
-            iter.next().beforePackageAdded(event);
+        if (iter.hasNext()) {
+            final BeforePackageAddedEvent event = new BeforePackageAddedEvent(this.ruleBase, newPkg);
+
+            do {
+                iter.next().beforePackageAdded(event);
+            } while (iter.hasNext());
         }
     }
 
     public void fireAfterPackageAdded(final Package newPkg) {
-        final AfterPackageAddedEvent event = new AfterPackageAddedEvent(this.ruleBase, newPkg);
         final Iterator<RuleBaseEventListener> iter = getEventListenersIterator();
 
-        while (iter.hasNext()) {
-            iter.next().afterPackageAdded(event);
+        if (iter.hasNext()) {
+            final AfterPackageAddedEvent event = new AfterPackageAddedEvent(this.ruleBase, newPkg);
+
+            do {
+                iter.next().afterPackageAdded(event);
+            } while (iter.hasNext());
         }
     }
 
     public void fireBeforePackageRemoved(final Package pkg) {
-        final BeforePackageRemovedEvent event = new BeforePackageRemovedEvent(this.ruleBase, pkg);
         final Iterator<RuleBaseEventListener> iter = getEventListenersIterator();
 
-        while (iter.hasNext()) {
-            iter.next().beforePackageRemoved(event);
+        if (iter.hasNext()) {
+            final BeforePackageRemovedEvent event = new BeforePackageRemovedEvent(this.ruleBase, pkg);
+
+            do {
+                iter.next().beforePackageRemoved(event);
+            } while (iter.hasNext());
         }
     }
 
     public void fireAfterPackageRemoved(final Package pkg) {
-        final AfterPackageRemovedEvent event = new AfterPackageRemovedEvent(this.ruleBase, pkg);
         final Iterator<RuleBaseEventListener> iter = getEventListenersIterator();
 
-        while (iter.hasNext()) {
-            iter.next().afterPackageRemoved(event);
+        if (iter.hasNext()) {
+            final AfterPackageRemovedEvent event = new AfterPackageRemovedEvent(this.ruleBase, pkg);
+
+            do {
+                iter.next().afterPackageRemoved(event);
+            } while (iter.hasNext());
         }
     }
 
     public void fireBeforeRuleBaseLocked() {
-        final BeforeRuleBaseLockedEvent event = new BeforeRuleBaseLockedEvent(this.ruleBase);
         final Iterator<RuleBaseEventListener> iter = getEventListenersIterator();
 
-        while (iter.hasNext()) {
-            iter.next().beforeRuleBaseLocked(event);
+        if (iter.hasNext()) {
+            final BeforeRuleBaseLockedEvent event = new BeforeRuleBaseLockedEvent(this.ruleBase);
+
+            do {
+                iter.next().beforeRuleBaseLocked(event);
+            } while (iter.hasNext());
         }
     }
 
     public void fireAfterRuleBaseLocked() {
-        final AfterRuleBaseLockedEvent event = new AfterRuleBaseLockedEvent(this.ruleBase);
         final Iterator<RuleBaseEventListener> iter = getEventListenersIterator();
 
-        while (iter.hasNext()) {
-            iter.next().afterRuleBaseLocked(event);
+        if (iter.hasNext()) {
+            final AfterRuleBaseLockedEvent event = new AfterRuleBaseLockedEvent(this.ruleBase);
+
+            do {
+                iter.next().afterRuleBaseLocked(event);
+            } while (iter.hasNext());
         }
     }
 
     public void fireBeforeRuleBaseUnlocked() {
-        final BeforeRuleBaseUnlockedEvent event = new BeforeRuleBaseUnlockedEvent(this.ruleBase);
         final Iterator<RuleBaseEventListener> iter = getEventListenersIterator();
 
-        while (iter.hasNext()) {
-            iter.next().beforeRuleBaseUnlocked(event);
+        if (iter.hasNext()) {
+            final BeforeRuleBaseUnlockedEvent event = new BeforeRuleBaseUnlockedEvent(this.ruleBase);
+
+            do {
+                iter.next().beforeRuleBaseUnlocked(event);
+            } while (iter.hasNext());
         }
     }
 
     public void fireAfterRuleBaseUnlocked() {
-        final AfterRuleBaseUnlockedEvent event = new AfterRuleBaseUnlockedEvent(this.ruleBase);
         final Iterator<RuleBaseEventListener> iter = getEventListenersIterator();
 
-        while (iter.hasNext()) {
-            iter.next().afterRuleBaseUnlocked(event);
+        if (iter.hasNext()) {
+            final AfterRuleBaseUnlockedEvent event = new AfterRuleBaseUnlockedEvent(this.ruleBase);
+
+            do {
+                iter.next().afterRuleBaseUnlocked(event);
+            } while (iter.hasNext());
         }
     }
 
     public void fireBeforeRuleAdded(final Package newPkg, final Rule rule) {
-        final BeforeRuleAddedEvent event = new BeforeRuleAddedEvent(this.ruleBase, newPkg, rule);
         final Iterator<RuleBaseEventListener> iter = getEventListenersIterator();
 
-        while (iter.hasNext()) {
-            iter.next().beforeRuleAdded(event);
+        if (iter.hasNext()) {
+            final BeforeRuleAddedEvent event = new BeforeRuleAddedEvent(this.ruleBase, newPkg, rule);
+
+            do {
+                iter.next().beforeRuleAdded(event);
+            } while (iter.hasNext());
         }
     }
 
     public void fireAfterRuleAdded(final Package newPkg, final Rule rule) {
-        final AfterRuleAddedEvent event = new AfterRuleAddedEvent(this.ruleBase, newPkg, rule);
         final Iterator<RuleBaseEventListener> iter = getEventListenersIterator();
 
-        while (iter.hasNext()) {
-            iter.next().afterRuleAdded(event);
+        if (iter.hasNext()) {
+            final AfterRuleAddedEvent event = new AfterRuleAddedEvent(this.ruleBase, newPkg, rule);
+
+            do {
+                iter.next().afterRuleAdded(event);
+            } while (iter.hasNext());
         }
     }
 
     public void fireBeforeRuleRemoved(final Package pkg, final Rule rule) {
-        final BeforeRuleRemovedEvent event = new BeforeRuleRemovedEvent(this.ruleBase, pkg, rule);
         final Iterator<RuleBaseEventListener> iter = getEventListenersIterator();
 
-        while (iter.hasNext()) {
-            iter.next().beforeRuleRemoved(event);
+        if (iter.hasNext()) {
+            final BeforeRuleRemovedEvent event = new BeforeRuleRemovedEvent(this.ruleBase, pkg, rule);
+
+            do {
+                iter.next().beforeRuleRemoved(event);
+            } while (iter.hasNext());
         }
     }
 
     public void fireAfterRuleRemoved(final Package pkg, final Rule rule) {
-        final AfterRuleRemovedEvent event = new AfterRuleRemovedEvent(this.ruleBase, pkg, rule);
         final Iterator<RuleBaseEventListener> iter = getEventListenersIterator();
 
-        while (iter.hasNext()) {
-            iter.next().afterRuleRemoved(event);
+        if (iter.hasNext()) {
+            final AfterRuleRemovedEvent event = new AfterRuleRemovedEvent(this.ruleBase, pkg, rule);
+
+            do {
+                iter.next().afterRuleRemoved(event);
+            } while (iter.hasNext());
         }
     }
 
     public void fireBeforeFunctionRemoved(final Package pkg, final String function) {
-        final BeforeFunctionRemovedEvent event = new BeforeFunctionRemovedEvent(this.ruleBase, pkg, function);
         final Iterator<RuleBaseEventListener> iter = getEventListenersIterator();
 
-        while (iter.hasNext()) {
-            iter.next().beforeFunctionRemoved(event);
+        if (iter.hasNext()) {
+            final BeforeFunctionRemovedEvent event = new BeforeFunctionRemovedEvent(this.ruleBase, pkg, function);
+
+            do {
+                iter.next().beforeFunctionRemoved(event);
+            } while (iter.hasNext());
         }
     }
 
     public void fireAfterFunctionRemoved(final Package pkg, final String function) {
-        final AfterFunctionRemovedEvent event = new AfterFunctionRemovedEvent(this.ruleBase, pkg, function);
         final Iterator<RuleBaseEventListener> iter = getEventListenersIterator();
 
-        while (iter.hasNext()) {
-            iter.next().afterFunctionRemoved(event);
+        if (iter.hasNext()) {
+            final AfterFunctionRemovedEvent event = new AfterFunctionRemovedEvent(this.ruleBase, pkg, function);
+                    
+            do {
+                iter.next().afterFunctionRemoved(event);
+            } while (iter.hasNext());
         }
     }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowEventSupport.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowEventSupport.java	2009-03-25 00:54:05 UTC (rev 25807)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowEventSupport.java	2009-03-25 01:53:31 UTC (rev 25808)
@@ -1,280 +1,231 @@
-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.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import org.drools.WorkingMemory;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.process.instance.ProcessInstance;
-import org.drools.runtime.process.NodeInstance;
-import org.drools.runtime.process.WorkflowProcessInstance;
-import org.drools.spi.RuleFlowGroup;
-
-/**
- * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
- */
-public class RuleFlowEventSupport implements Externalizable {
-
-    // TODO separate out process level stuff
-
-    private static final long                 serialVersionUID = 400L;
-    private List<RuleFlowEventListener> listeners        = new CopyOnWriteArrayList<RuleFlowEventListener>();
-
-    public RuleFlowEventSupport() {
-    }
-
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        listeners   = (List<RuleFlowEventListener>)in.readObject();
-    }
-
-    public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(listeners);
-    }
-
-    public void addEventListener(final RuleFlowEventListener listener) {
-        if ( !this.listeners.contains( listener ) ) {
-            this.listeners.add( listener );
-        }
-    }
-
-    public void removeEventListener(final RuleFlowEventListener listener) {
-        this.listeners.remove( listener );
-    }
-
-    public List<RuleFlowEventListener> getEventListeners() {
-        return Collections.unmodifiableList( this.listeners );
-    }
-
-    public int size() {
-        return this.listeners.size();
-    }
-
-    public boolean isEmpty() {
-        return this.listeners.isEmpty();
-    }
-
-    public void fireBeforeRuleFlowProcessStarted(
-            final ProcessInstance instance,
-            final InternalWorkingMemory workingMemory) {
-        if (this.listeners.isEmpty()) {
-            return;
-        }
-
-        final RuleFlowStartedEvent event = new RuleFlowStartedEvent( instance );
-
-        for ( RuleFlowEventListener listener: listeners ) {
-            listener.beforeRuleFlowStarted( event, workingMemory );
-        }
-    }
-
-    public void fireAfterRuleFlowProcessStarted(
-            final ProcessInstance instance,
-            final InternalWorkingMemory workingMemory) {
-        if (this.listeners.isEmpty()) {
-            return;
-        }
-
-        final RuleFlowStartedEvent event = new RuleFlowStartedEvent( instance );
-
-        for ( RuleFlowEventListener listener: listeners ) {
-            listener.afterRuleFlowStarted( event, workingMemory );
-        }
-    }
-
-    public void fireBeforeRuleFlowProcessCompleted(
-            final WorkflowProcessInstance instance,
-            final InternalWorkingMemory workingMemory) {
-        if (this.listeners.isEmpty()) {
-            return;
-        }
-
-        final RuleFlowCompletedEvent event = new RuleFlowCompletedEvent( instance );
-
-        for ( RuleFlowEventListener listener: listeners ) {
-            listener.beforeRuleFlowCompleted( event, workingMemory );
-        }
-    }
-
-    public void fireAfterRuleFlowProcessCompleted(
-            final WorkflowProcessInstance instance,
-            final InternalWorkingMemory workingMemory) {
-        if (this.listeners.isEmpty()) {
-            return;
-        }
-
-        final RuleFlowCompletedEvent event = new RuleFlowCompletedEvent( instance );
-
-        for ( RuleFlowEventListener listener: listeners ) {
-            listener.afterRuleFlowCompleted( event, workingMemory );
-        }
-    }
-
-    public void fireBeforeRuleFlowGroupActivated(final RuleFlowGroup ruleFlowGroup,
-                                                 final InternalWorkingMemory workingMemory) {
-        if ( this.listeners.isEmpty() ) {
-            return;
-        }
-
-        final RuleFlowGroupActivatedEvent event = new RuleFlowGroupActivatedEvent( ruleFlowGroup );
-
-        for ( RuleFlowEventListener listener: listeners ) {
-            listener.beforeRuleFlowGroupActivated( event, workingMemory );
-        }
-    }
-
-    public void fireAfterRuleFlowGroupActivated(final RuleFlowGroup ruleFlowGroup,
-                                                final InternalWorkingMemory workingMemory) {
-        if ( this.listeners.isEmpty() ) {
-            return;
-        }
-
-        final RuleFlowGroupActivatedEvent event = new RuleFlowGroupActivatedEvent( ruleFlowGroup );
-
-        for ( RuleFlowEventListener listener: listeners ) {
-            listener.afterRuleFlowGroupActivated( event, workingMemory );
-        }
-    }
-
-    public void fireBeforeRuleFlowGroupDeactivated(final RuleFlowGroup ruleFlowGroup,
-                                                   final InternalWorkingMemory workingMemory) {
-        if ( this.listeners.isEmpty() ) {
-            return;
-        }
-
-        final RuleFlowGroupDeactivatedEvent event = new RuleFlowGroupDeactivatedEvent( ruleFlowGroup );
-
-        for ( RuleFlowEventListener listener: listeners ) {
-            listener.beforeRuleFlowGroupDeactivated( event, workingMemory );
-        }
-    }
-
-    public void fireAfterRuleFlowGroupDeactivated(final RuleFlowGroup ruleFlowGroup,
-                                                  final InternalWorkingMemory workingMemory) {
-        if ( this.listeners.isEmpty() ) {
-            return;
-        }
-
-        final RuleFlowGroupDeactivatedEvent event = new RuleFlowGroupDeactivatedEvent( ruleFlowGroup );
-
-        for ( RuleFlowEventListener listener: listeners ) {
-            listener.afterRuleFlowGroupDeactivated( event, workingMemory );
-        }
-    }
-
-    public void fireBeforeRuleFlowNodeTriggered(
-            final NodeInstance ruleFlowNodeInstance,
-            final InternalWorkingMemory workingMemory) {
-        if (this.listeners.isEmpty()) {
-            return;
-        }
-
-        final RuleFlowNodeTriggeredEvent event = new RuleFlowNodeTriggeredEvent( ruleFlowNodeInstance );
-
-        for ( RuleFlowEventListener listener: listeners ) {
-            listener.beforeRuleFlowNodeTriggered( event, workingMemory );
-        }
-    }
-
-    public void fireAfterRuleFlowNodeTriggered(
-            final NodeInstance ruleFlowNodeInstance,
-            final InternalWorkingMemory workingMemory) {
-        if (this.listeners.isEmpty()) {
-            return;
-        }
-
-        final RuleFlowNodeTriggeredEvent event = new RuleFlowNodeTriggeredEvent( ruleFlowNodeInstance );
-
-        for ( RuleFlowEventListener listener: listeners ) {
-            listener.afterRuleFlowNodeTriggered( event, workingMemory );
-        }
-    }
-
-    public void fireBeforeRuleFlowNodeLeft(
-            final NodeInstance ruleFlowNodeInstance,
-            final InternalWorkingMemory workingMemory) {
-        if (this.listeners.isEmpty()) {
-            return;
-        }
-
-        final RuleFlowNodeTriggeredEvent event = new RuleFlowNodeTriggeredEvent( ruleFlowNodeInstance );
-
-        for ( RuleFlowEventListener listener: listeners ) {
-            listener.beforeRuleFlowNodeLeft( event, workingMemory );
-        }
-    }
-
-    public void fireAfterRuleFlowNodeLeft(
-            final NodeInstance ruleFlowNodeInstance,
-            final InternalWorkingMemory workingMemory) {
-        if (this.listeners.isEmpty()) {
-            return;
-        }
-
-        final RuleFlowNodeTriggeredEvent event = new RuleFlowNodeTriggeredEvent( ruleFlowNodeInstance );
-
-        for ( RuleFlowEventListener listener: listeners ) {
-            listener.afterRuleFlowNodeLeft( event, workingMemory );
-        }
-    }
-
-    public void fireBeforeVariableChange(final ProcessInstance instance,
-                                            final String name,
-                                            final Object value,
-                                            WorkingMemory workingMemory) {
-        if (this.listeners.isEmpty()) {
-            return;
-        }
-
-        final RuleFlowVariableChangeEvent event = new RuleFlowVariableChangeEvent(instance, name, value );
-
-        for ( RuleFlowEventListener listener: listeners ) {
-            if(listener instanceof RuleFlowEventListenerExtension) {
-                ((RuleFlowEventListenerExtension) listener).beforeVariableChange(event, workingMemory);
-            }
-        }
-    }
-
-     public void fireAfterVariableChange(final ProcessInstance instance,
-                                            final String name,
-                                            final Object value,
-                                            WorkingMemory workingMemory) {
-        if (this.listeners.isEmpty()) {
-            return;
-        }
-
-        final RuleFlowVariableChangeEvent event = new RuleFlowVariableChangeEvent(instance, name, value );
-
-        for ( RuleFlowEventListener listener: listeners ) {
-            if(listener instanceof RuleFlowEventListenerExtension) {
-                ((RuleFlowEventListenerExtension) listener).afterVariableChange(event, workingMemory);
-            }
-            
-        }
-    }
-
-    public void reset() {
-        this.listeners.clear();
-    }
-
+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 org.drools.WorkingMemory;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.process.instance.ProcessInstance;
+import org.drools.runtime.process.NodeInstance;
+import org.drools.runtime.process.WorkflowProcessInstance;
+import org.drools.spi.RuleFlowGroup;
+
+import java.util.Iterator;
+
+/**
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ * @author <a href="mailto:stampy88 at yahoo.com">dave sinclair</a>
+ */
+public class RuleFlowEventSupport extends AbstractEventSupport<RuleFlowEventListener> {
+
+    // TODO separate out process level stuff
+
+    public void fireBeforeRuleFlowProcessStarted(final ProcessInstance instance,
+                                                 final InternalWorkingMemory workingMemory) {
+        final Iterator<RuleFlowEventListener> iter = getEventListenersIterator();
+
+        if (iter.hasNext()) {
+            final RuleFlowStartedEvent event = new RuleFlowStartedEvent(instance);
+
+            do{
+                iter.next().beforeRuleFlowStarted(event, workingMemory);
+            } while (iter.hasNext());
+        }
+    }
+
+    public void fireAfterRuleFlowProcessStarted(final ProcessInstance instance,
+                                                final InternalWorkingMemory workingMemory) {
+        final Iterator<RuleFlowEventListener> iter = getEventListenersIterator();
+
+        if (iter.hasNext()) {
+            final RuleFlowStartedEvent event = new RuleFlowStartedEvent(instance);
+
+            do {
+                iter.next().afterRuleFlowStarted(event, workingMemory);
+            } while (iter.hasNext());
+        }
+    }
+
+    public void fireBeforeRuleFlowProcessCompleted(final WorkflowProcessInstance instance,
+                                                   final InternalWorkingMemory workingMemory) {
+        final Iterator<RuleFlowEventListener> iter = getEventListenersIterator();
+
+        if (iter.hasNext()) {
+            final RuleFlowCompletedEvent event = new RuleFlowCompletedEvent(instance);
+
+            do {
+                iter.next().beforeRuleFlowCompleted(event, workingMemory);
+            } while (iter.hasNext());
+        }
+    }
+
+    public void fireAfterRuleFlowProcessCompleted(final WorkflowProcessInstance instance,
+                                                  final InternalWorkingMemory workingMemory) {
+        final Iterator<RuleFlowEventListener> iter = getEventListenersIterator();
+
+        if (iter.hasNext()) {
+            final RuleFlowCompletedEvent event = new RuleFlowCompletedEvent(instance);
+
+            do {
+                iter.next().afterRuleFlowCompleted(event, workingMemory);
+            } while (iter.hasNext());
+        }
+    }
+
+    public void fireBeforeRuleFlowGroupActivated(final RuleFlowGroup ruleFlowGroup,
+                                                 final InternalWorkingMemory workingMemory) {
+        final Iterator<RuleFlowEventListener> iter = getEventListenersIterator();
+
+        if (iter.hasNext()) {
+            final RuleFlowGroupActivatedEvent event = new RuleFlowGroupActivatedEvent(ruleFlowGroup);
+
+            do {
+                iter.next().beforeRuleFlowGroupActivated(event, workingMemory);
+            } while (iter.hasNext());
+        }
+    }
+
+    public void fireAfterRuleFlowGroupActivated(final RuleFlowGroup ruleFlowGroup,
+                                                final InternalWorkingMemory workingMemory) {
+        final Iterator<RuleFlowEventListener> iter = getEventListenersIterator();
+
+        if (iter.hasNext()) {
+            final RuleFlowGroupActivatedEvent event = new RuleFlowGroupActivatedEvent(ruleFlowGroup);
+
+            do{
+                iter.next().afterRuleFlowGroupActivated(event, workingMemory);
+            } while (iter.hasNext());
+        }
+    }
+
+    public void fireBeforeRuleFlowGroupDeactivated(final RuleFlowGroup ruleFlowGroup,
+                                                   final InternalWorkingMemory workingMemory) {
+        final Iterator<RuleFlowEventListener> iter = getEventListenersIterator();
+
+        if (iter.hasNext()) {
+            final RuleFlowGroupDeactivatedEvent event = new RuleFlowGroupDeactivatedEvent(ruleFlowGroup);
+
+            do{
+                iter.next().beforeRuleFlowGroupDeactivated(event, workingMemory);
+            } while (iter.hasNext());
+        }
+    }
+
+    public void fireAfterRuleFlowGroupDeactivated(final RuleFlowGroup ruleFlowGroup,
+                                                  final InternalWorkingMemory workingMemory) {
+        final Iterator<RuleFlowEventListener> iter = getEventListenersIterator();
+
+        if (iter.hasNext()) {
+            final RuleFlowGroupDeactivatedEvent event = new RuleFlowGroupDeactivatedEvent(ruleFlowGroup);
+
+            do {
+                iter.next().afterRuleFlowGroupDeactivated(event, workingMemory);
+            } while (iter.hasNext());
+        }
+    }
+
+    public void fireBeforeRuleFlowNodeTriggered(final NodeInstance ruleFlowNodeInstance,
+                                                final InternalWorkingMemory workingMemory) {
+        final Iterator<RuleFlowEventListener> iter = getEventListenersIterator();
+
+        if (iter.hasNext()) {
+            final RuleFlowNodeTriggeredEvent event = new RuleFlowNodeTriggeredEvent(ruleFlowNodeInstance);
+
+            do {
+                iter.next().beforeRuleFlowNodeTriggered(event, workingMemory);
+            } while (iter.hasNext());
+        }
+    }
+
+    public void fireAfterRuleFlowNodeTriggered(final NodeInstance ruleFlowNodeInstance,
+                                               final InternalWorkingMemory workingMemory) {
+        final Iterator<RuleFlowEventListener> iter = getEventListenersIterator();
+
+        if (iter.hasNext()) {
+            final RuleFlowNodeTriggeredEvent event = new RuleFlowNodeTriggeredEvent(ruleFlowNodeInstance);
+
+            do{
+                iter.next().afterRuleFlowNodeTriggered(event, workingMemory);
+            } while (iter.hasNext());
+        }
+    }
+
+    public void fireBeforeRuleFlowNodeLeft(final NodeInstance ruleFlowNodeInstance,
+                                           final InternalWorkingMemory workingMemory) {
+        final Iterator<RuleFlowEventListener> iter = getEventListenersIterator();
+
+        if (iter.hasNext()) {
+            final RuleFlowNodeTriggeredEvent event = new RuleFlowNodeTriggeredEvent(ruleFlowNodeInstance);
+
+            do{
+                iter.next().beforeRuleFlowNodeLeft(event, workingMemory);
+            } while (iter.hasNext());
+        }
+    }
+
+    public void fireAfterRuleFlowNodeLeft(final NodeInstance ruleFlowNodeInstance,
+                                          final InternalWorkingMemory workingMemory) {
+        final Iterator<RuleFlowEventListener> iter = getEventListenersIterator();
+
+        if (iter.hasNext()) {
+            final RuleFlowNodeTriggeredEvent event = new RuleFlowNodeTriggeredEvent(ruleFlowNodeInstance);
+
+            do{
+                iter.next().afterRuleFlowNodeLeft(event, workingMemory);
+            } while (iter.hasNext());
+        }
+    }
+
+    public void fireBeforeVariableChange(final ProcessInstance instance,
+                                         final String name,
+                                         final Object value,
+                                         WorkingMemory workingMemory) {
+        final Iterator<RuleFlowEventListener> iter = getEventListenersIterator();
+
+        if (iter.hasNext()) {
+            final RuleFlowVariableChangeEvent event = new RuleFlowVariableChangeEvent(instance, name, value);
+
+            do{
+                RuleFlowEventListener listener = iter.next();
+                if (listener instanceof RuleFlowEventListenerExtension) {
+                    ((RuleFlowEventListenerExtension) listener).beforeVariableChange(event, workingMemory);
+                }
+            } while (iter.hasNext());
+        }
+    }
+
+    public void fireAfterVariableChange(final ProcessInstance instance,
+                                        final String name,
+                                        final Object value,
+                                        WorkingMemory workingMemory) {
+        final Iterator<RuleFlowEventListener> iter = getEventListenersIterator();
+
+        if (iter.hasNext()) {
+            final RuleFlowVariableChangeEvent event = new RuleFlowVariableChangeEvent(instance, name, value);
+
+            do{
+                RuleFlowEventListener listener = iter.next();
+                if (listener instanceof RuleFlowEventListenerExtension) {
+                    ((RuleFlowEventListenerExtension) listener).afterVariableChange(event, workingMemory);
+                }
+            } while (iter.hasNext());
+        }
+    }
+
+    public void reset() {
+        this.clear();
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/WorkingMemoryEventSupport.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/WorkingMemoryEventSupport.java	2009-03-25 00:54:05 UTC (rev 25807)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/WorkingMemoryEventSupport.java	2009-03-25 01:53:31 UTC (rev 25808)
@@ -22,6 +22,7 @@
 import java.io.ObjectOutput;
 import java.util.Collections;
 import java.util.List;
+import java.util.Iterator;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.drools.common.InternalWorkingMemory;
@@ -30,64 +31,25 @@
 
 /**
  * @author <a href="mailto:simon at redhillconsulting.com.au">Simon Harris </a>
+ * @author <a href="mailto:stampy88 at yahoo.com">dave sinclair</a>
  */
-public class WorkingMemoryEventSupport
-    implements
-    Externalizable {
-    /**
-     *
-     */
-    private static final long                      serialVersionUID = 400L;
-    private List<WorkingMemoryEventListener> listeners        = new CopyOnWriteArrayList<WorkingMemoryEventListener>();
+public class WorkingMemoryEventSupport extends AbstractEventSupport<WorkingMemoryEventListener> {
 
-    public WorkingMemoryEventSupport() {
-    }
-
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        listeners   = (List<WorkingMemoryEventListener>)in.readObject();
-    }
-
-    public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(listeners);
-    }
-
-    public void addEventListener(final WorkingMemoryEventListener listener) {
-        if ( !this.listeners.contains( listener ) ) {
-            this.listeners.add( listener );
-        }
-    }
-
-    public void removeEventListener(final WorkingMemoryEventListener listener) {
-        this.listeners.remove( listener );
-    }
-
-    public List getEventListeners() {
-        return Collections.unmodifiableList( this.listeners );
-    }
-
-    public int size() {
-        return this.listeners.size();
-    }
-
-    public boolean isEmpty() {
-        return this.listeners.isEmpty();
-    }
-
     public void fireObjectInserted(final PropagationContext propagationContext,
                                    final FactHandle handle,
                                    final Object object,
                                    final InternalWorkingMemory workingMemory) {
-        if ( this.listeners.isEmpty() ) {
-            return;
-        }
+        final Iterator<WorkingMemoryEventListener> iter = getEventListenersIterator();
 
-        final ObjectInsertedEvent event = new ObjectInsertedEvent( workingMemory,
-                                                                   propagationContext,
-                                                                   handle,
-                                                                   object );
+        if (iter.hasNext()) {
+            final ObjectInsertedEvent event = new ObjectInsertedEvent(workingMemory,
+                    propagationContext,
+                    handle,
+                    object);
 
-        for ( int i = 0, size = this.listeners.size(); i < size; i++ ) {
-            ((WorkingMemoryEventListener) this.listeners.get( i )).objectInserted( event );
+            do {
+                iter.next().objectInserted(event);
+            } while (iter.hasNext());
         }
     }
 
@@ -96,18 +58,18 @@
                                   final Object oldObject,
                                   final Object object,
                                   final InternalWorkingMemory workingMemory) {
-        if ( this.listeners.isEmpty() ) {
-            return;
-        }
+        final Iterator<WorkingMemoryEventListener> iter = getEventListenersIterator();
 
-        final ObjectUpdatedEvent event = new ObjectUpdatedEvent( workingMemory,
-                                                                 propagationContext,
-                                                                 handle,
-                                                                 oldObject,
-                                                                 object );
+        if (iter.hasNext()) {
+            final ObjectUpdatedEvent event = new ObjectUpdatedEvent(workingMemory,
+                    propagationContext,
+                    handle,
+                    oldObject,
+                    object);
 
-        for ( int i = 0, size = this.listeners.size(); i < size; i++ ) {
-            ((WorkingMemoryEventListener) this.listeners.get( i )).objectUpdated( event );
+            do {
+                iter.next().objectUpdated(event);
+            } while (iter.hasNext());
         }
     }
 
@@ -115,22 +77,21 @@
                                     final FactHandle handle,
                                     final Object oldObject,
                                     final InternalWorkingMemory workingMemory) {
-        if ( this.listeners.isEmpty() ) {
-            return;
-        }
+        final Iterator<WorkingMemoryEventListener> iter = getEventListenersIterator();
 
-        final ObjectRetractedEvent event = new ObjectRetractedEvent( workingMemory,
-                                                                     propagationContext,
-                                                                     handle,
-                                                                     oldObject );
+        if (iter.hasNext()) {
+            final ObjectRetractedEvent event = new ObjectRetractedEvent(workingMemory,
+                    propagationContext,
+                    handle,
+                    oldObject);
 
-        for ( int i = 0, size = this.listeners.size(); i < size; i++ ) {
-            ((WorkingMemoryEventListener) this.listeners.get( i )).objectRetracted( event );
+            do {
+                iter.next().objectRetracted(event);
+            } while (iter.hasNext());
         }
     }
 
     public void reset() {
-        this.listeners.clear();
+        this.clear();
     }
-
 }
\ No newline at end of file




More information about the jboss-svn-commits mailing list