org/objectweb/proactive/core/event/AbstractEventProducer.java

00001 /* 
00002  * ################################################################
00003  * 
00004  * ProActive: The Java(TM) library for Parallel, Distributed, 
00005  *            Concurrent computing with Security and Mobility
00006  * 
00007  * Copyright (C) 1997-2007 INRIA/University of Nice-Sophia Antipolis
00008  * Contact: proactive@objectweb.org
00009  * 
00010  * This library is free software; you can redistribute it and/or
00011  * modify it under the terms of the GNU Lesser General Public
00012  * License as published by the Free Software Foundation; either
00013  * version 2.1 of the License, or any later version.
00014  *  
00015  * This library is distributed in the hope that it will be useful,
00016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00018  * Lesser General Public License for more details.
00019  * 
00020  * You should have received a copy of the GNU Lesser General Public
00021  * License along with this library; if not, write to the Free Software
00022  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
00023  * USA
00024  *  
00025  *  Initial developer(s):               The ProActive Team
00026  *                        http://www.inria.fr/oasis/ProActive/contacts.html
00027  *  Contributor(s): 
00028  * 
00029  * ################################################################
00030  */ 
00031 package org.objectweb.proactive.core.event;
00032 
00033 import org.apache.log4j.Logger;
00034 import org.objectweb.proactive.core.util.log.Loggers;
00035 import org.objectweb.proactive.core.util.log.ProActiveLogger;
00036 
00037 
00066 public abstract class AbstractEventProducer implements java.io.Serializable {
00067     //
00068     // -- PROTECTED MEMBERS -----------------------------------------------
00069     //
00070     protected static Logger logger = ProActiveLogger.getLogger(Loggers.EVENTS);
00071 
00073     protected boolean shouldSerializeListeners;
00074 
00078     protected transient ListenerList eventListeners;
00079 
00080     //
00081     // -- CONSTRUCTORS -----------------------------------------------
00082     //
00083 
00087     public AbstractEventProducer() {
00088         this(false);
00089     }
00090 
00096     public AbstractEventProducer(boolean shouldSerializeListeners) {
00097         this.shouldSerializeListeners = shouldSerializeListeners;
00098         if (shouldSerializeListeners) {
00099             eventListeners = new PlainListenerList();
00100         } else {
00101             eventListeners = new WeakReferenceListenerList();
00102         }
00103     }
00104 
00111     public AbstractEventProducer(boolean shouldSerializeListeners,
00112         boolean useWeakRef) {
00113         this.shouldSerializeListeners = shouldSerializeListeners;
00114         if (!shouldSerializeListeners && useWeakRef) {
00115             eventListeners = new WeakReferenceListenerList();
00116         } else {
00117             eventListeners = new PlainListenerList();
00118         }
00119     }
00120 
00121     //
00122     // -- PUBLIC METHODS -----------------------------------------------
00123     //
00124     //
00125     // -- PROTECTED METHODS -----------------------------------------------
00126     //
00127 
00132     protected boolean hasListeners() {
00133         return !eventListeners.isEmpty();
00134     }
00135 
00140     protected void addListener(ProActiveListener listener) {
00141         synchronized (eventListeners) {
00142             if (!eventListeners.contains(listener)) {
00143                 eventListeners.add(listener);
00144             }
00145         }
00146     }
00147 
00152     protected void removeListener(ProActiveListener listener) {
00153         synchronized (eventListeners) {
00154             eventListeners.remove(listener);
00155         }
00156     }
00157 
00163     protected void notifyAllListeners(ProActiveEvent event) {
00164         synchronized (eventListeners) {
00165             java.util.Iterator iterator = eventListeners.iterator();
00166             while (iterator.hasNext()) {
00167                 notifyOneListener((ProActiveListener) iterator.next(), event);
00168             }
00169         }
00170     }
00171 
00177     protected abstract void notifyOneListener(ProActiveListener listener,
00178         ProActiveEvent event);
00179 
00180     //
00181     // -- PRIVATE METHODS -----------------------------------------------
00182     //
00183 
00187     private void writeObject(java.io.ObjectOutputStream s)
00188         throws java.io.IOException {
00189         s.writeBoolean(shouldSerializeListeners);
00190         if (shouldSerializeListeners) {
00191             s.writeObject(eventListeners);
00192         }
00193     }
00194 
00200     private void readObject(java.io.ObjectInputStream s)
00201         throws java.io.IOException, ClassNotFoundException {
00202         shouldSerializeListeners = s.readBoolean();
00203         if (shouldSerializeListeners) {
00204             eventListeners = (ListenerList) s.readObject();
00205         } else {
00206             eventListeners = new WeakReferenceListenerList();
00207         }
00208     }
00209 
00210     //
00211     // -- INNER CLASSES -----------------------------------------------
00212     //
00213 
00225     protected interface ListenerList {
00226 
00231         public boolean isEmpty();
00232 
00237         public int size();
00238 
00243         public boolean contains(ProActiveListener listener);
00244 
00250         public boolean add(ProActiveListener listener);
00251 
00257         public boolean remove(ProActiveListener listener);
00258 
00263         public java.util.Iterator iterator();
00264     }
00265 
00276     private class PlainListenerList implements java.io.Serializable,
00277         ListenerList {
00278         protected java.util.ArrayList list;
00279 
00280         public PlainListenerList() {
00281             list = new java.util.ArrayList();
00282         }
00283 
00284         public boolean isEmpty() {
00285             return list.isEmpty();
00286         }
00287 
00288         public int size() {
00289             return list.size();
00290         }
00291 
00292         public boolean contains(ProActiveListener listener) {
00293             return list.contains(listener);
00294         }
00295 
00296         public boolean add(ProActiveListener listener) {
00297             return list.add(listener);
00298         }
00299 
00300         public boolean remove(ProActiveListener listener) {
00301             return list.remove(listener);
00302         }
00303 
00304         public java.util.Iterator iterator() {
00305             return list.iterator();
00306         }
00307     }
00308 
00321     private class WeakReferenceListenerList extends PlainListenerList {
00322         public WeakReferenceListenerList() {
00323         }
00324 
00325         public boolean contains(ProActiveListener listener) {
00326             java.util.Iterator iterator = iterator();
00327             while (iterator.hasNext()) {
00328                 if (iterator.next() == listener) {
00329                     return true;
00330                 }
00331             }
00332             return false;
00333         }
00334 
00335         public boolean add(ProActiveListener listener) {
00336             return list.add(new java.lang.ref.WeakReference(listener));
00337         }
00338 
00339         public boolean remove(ProActiveListener listener) {
00340             java.util.Iterator iterator = iterator();
00341             while (iterator.hasNext()) {
00342                 if (iterator.next() == listener) {
00343                     iterator.remove();
00344                     return true;
00345                 }
00346             }
00347             return false;
00348         }
00349 
00350         public java.util.Iterator iterator() {
00351             return new WeakReferenceIterator(list.iterator());
00352         }
00353     }
00354 
00368     private class WeakReferenceIterator implements java.util.Iterator {
00369         private java.util.Iterator iterator;
00370         private Object nextObject;
00371 
00372         public WeakReferenceIterator(java.util.Iterator iterator) {
00373             this.iterator = iterator;
00374             nextObject = getNextObject();
00375         }
00376 
00377         public boolean hasNext() {
00378             return nextObject != null;
00379         }
00380 
00381         public Object next() {
00382             Object result = nextObject;
00383             nextObject = getNextObject();
00384             return result;
00385         }
00386 
00387         public void remove() {
00388             iterator.remove();
00389         }
00390 
00391         private Object getNextObject() {
00392             while (iterator.hasNext()) {
00393                 java.lang.ref.WeakReference ref = (java.lang.ref.WeakReference) iterator.next();
00394                 Object target = ref.get();
00395                 if (target == null) {
00396                     // object has been removed
00397                     //logger.debug("!!!!!!!!!!!! REMOVED A GARBAGED LISTENER");
00398                     iterator.remove();
00399                 } else {
00400                     return target;
00401                 }
00402             }
00403             return null;
00404         }
00405     }
00406 
00407     // end inner class WeakReferenceIterator
00408 }

Generated on Mon Jan 22 15:16:07 2007 for ProActive by  doxygen 1.5.1