00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
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
00069
00070 protected static Logger logger = ProActiveLogger.getLogger(Loggers.EVENTS);
00071
00073 protected boolean shouldSerializeListeners;
00074
00078 protected transient ListenerList eventListeners;
00079
00080
00081
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
00123
00124
00125
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
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
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
00397
00398 iterator.remove();
00399 } else {
00400 return target;
00401 }
00402 }
00403 return null;
00404 }
00405 }
00406
00407
00408 }