X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=support%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fobserver%2FObservable.java;h=219c51fcee04d8adcae19c249b0eaaa423b648f0;hb=8de36ff0206c996baf3ee4adc3e2293b12ff5f39;hp=2980afafd33dbc63a0a7416e6aed4ca7cb2396c9;hpb=32a62ca2c752e33a7873ac868a7a1f289caedcd4;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 2980afaf..219c51fc 100644 --- a/support/general/src/main/java/org/wamblee/observer/Observable.java +++ b/support/general/src/main/java/org/wamblee/observer/Observable.java @@ -1,55 +1,53 @@ /* * 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); /** * Observable. */ - private ObservableType _observable; + private ObservableType observable; /** * Used to notify observers. */ - private ObserverNotifier _notifier; + private ObserverNotifier notifier; /** * Map of subscription to observer. */ - private Map> _observers; + private Map> observers; /** * Counter for subscriptions. Holds the next subscription. */ - private long _counter; + private long counter; /** * Constructs the observable. @@ -60,11 +58,11 @@ public class Observable { * Object used for implementing notification of listeners. */ public Observable(ObservableType aObservable, - ObserverNotifier aNotifier) { - _observable = aObservable; - _notifier = aNotifier; - _observers = new TreeMap>(); - _counter = 0; + ObserverNotifier aNotifier) { + observable = aObservable; + notifier = aNotifier; + observers = new TreeMap>(); + counter = 0; } /** @@ -75,9 +73,11 @@ public class Observable { * @return Event Event to send. */ public synchronized long subscribe(Observer aObserver) { - long subscription = _counter++; // integer rage is so large it will - // never roll over. - _observers.put(subscription, aObserver); + long subscription = counter++; // integer rage is so large it will + // never roll over. + + observers.put(subscription, aObserver); + return subscription; } @@ -90,10 +90,11 @@ public class Observable { * In case the subscription is not known. */ public synchronized void unsubscribe(long aSubscription) { - Object obj = _observers.remove(aSubscription); + Object obj = observers.remove(aSubscription); + if (obj == null) { - throw new IllegalArgumentException("Subscription '" + aSubscription - + "'"); + throw new IllegalArgumentException("Subscription '" + + aSubscription + "'"); } } @@ -103,7 +104,7 @@ public class Observable { * @return Number of subscribed observers. */ public int getObserverCount() { - return _observers.size(); + return observers.size(); } /** @@ -116,12 +117,14 @@ public class Observable { // Make sure we do the notification while not holding the lock to avoid // potential deadlock // situations. - List> observers = new ArrayList>(); + List> myObservers = new ArrayList>(); + synchronized (this) { - observers.addAll(_observers.values()); + myObservers.addAll(observers.values()); } - for (Observer observer : observers) { - _notifier.update(observer, _observable, aEvent); + + for (Observer observer : myObservers) { + notifier.update(observer, observable, aEvent); } } @@ -132,15 +135,15 @@ public class Observable { */ @Override protected void finalize() throws Throwable { - if (_observers.size() > 0) { + if (observers.size() > 0) { LOGGER - .error("Still observers registered at finalization of observer!"); - for (Observer observer : _observers.values()) { + .error("Still observers registered at finalization of observer!"); + + for (Observer observer : observers.values()) { LOGGER.error(" observer: " + observer); } } super.finalize(); } - }