X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=support%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fobserver%2FObservable.java;h=096b0600043f726d9bdc493f83d3aacbe2e19d78;hb=f4d446b84fa1a38ed83cd157f79fdb8233822145;hp=820db38c8bb3241b61d3d3a12ab19585351ae4d4;hpb=246a6a94ac725ea202a79591a69530014bf1da5f;p=utils diff --git a/support/general/src/main/java/org/wamblee/observer/Observable.java b/support/general/src/main/java/org/wamblee/observer/Observable.java index 820db38c..096b0600 100644 --- a/support/general/src/main/java/org/wamblee/observer/Observable.java +++ b/support/general/src/main/java/org/wamblee/observer/Observable.java @@ -1,34 +1,33 @@ /* * Copyright 2005 the original author or authors. - * + * * 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. */ - package org.wamblee.observer; -import java.util.List; +import org.apache.log4j.Logger; + import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.TreeMap; -import org.apache.log4j.Logger; /** * Implements subscription and notification logic for an observer pattern. This * class is thread safe. */ public class Observable { - private static final Logger LOGGER = Logger.getLogger(Observable.class); /** @@ -53,14 +52,14 @@ public class Observable { /** * Constructs the observable. - * + * * @param aObservable * Observable this instance is used for. * @param aNotifier * Object used for implementing notification of listeners. */ public Observable(ObservableType aObservable, - ObserverNotifier aNotifier) { + ObserverNotifier aNotifier) { observable = aObservable; notifier = aNotifier; observers = new TreeMap>(); @@ -69,21 +68,24 @@ public class Observable { /** * Subscribe an obvers. - * + * * @param aObserver * Observer to subscribe. * @return Event Event to send. */ - public synchronized long subscribe(Observer aObserver) { + public synchronized long subscribe( + Observer aObserver) { long subscription = counter++; // integer rage is so large it will - // never roll over. + // never roll over. + observers.put(subscription, aObserver); + return subscription; } /** * Unsubscribe an observer. - * + * * @param aSubscription * Subscription which is used * @throws IllegalArgumentException @@ -91,15 +93,16 @@ public class Observable { */ public synchronized void unsubscribe(long aSubscription) { Object obj = observers.remove(aSubscription); + if (obj == null) { - throw new IllegalArgumentException("Subscription '" + aSubscription - + "'"); + throw new IllegalArgumentException("Subscription '" + + aSubscription + "'"); } } /** * Gets the number of subscribed observers. - * + * * @return Number of subscribed observers. */ public int getObserverCount() { @@ -108,7 +111,7 @@ public class Observable { /** * Notifies all subscribed observers. - * + * * @param aEvent * Event to send. */ @@ -117,9 +120,11 @@ public class Observable { // potential deadlock // situations. List> myObservers = new ArrayList>(); + synchronized (this) { myObservers.addAll(observers.values()); } + for (Observer observer : myObservers) { notifier.update(observer, observable, aEvent); } @@ -127,14 +132,15 @@ public class Observable { /* * (non-Javadoc) - * + * * @see java.lang.Object#finalize() */ @Override protected void finalize() throws Throwable { if (observers.size() > 0) { - LOGGER - .error("Still observers registered at finalization of observer!"); + LOGGER.error( + "Still observers registered at finalization of observer!"); + for (Observer observer : observers.values()) { LOGGER.error(" observer: " + observer); } @@ -142,5 +148,4 @@ public class Observable { super.finalize(); } - }