* 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 org.apache.log4j.Logger;
-
/**
- * Implements subscription and notification logic for an observer pattern.
- * This class is thread safe.
+ * Implements subscription and notification logic for an observer pattern. This
+ * class is thread safe.
*/
public class Observable<ObservableType, Event> {
-
+
private static final Logger LOGGER = Logger.getLogger(Observable.class);
-
+
/**
- * Observable.
+ * Observable.
*/
private ObservableType _observable;
-
+
/**
- * Used to notify observers.
+ * Used to notify observers.
*/
- private ObserverNotifier<ObservableType,Event> _notifier;
-
+ private ObserverNotifier<ObservableType, Event> _notifier;
+
/**
- * Map of subscription to observer.
+ * Map of subscription to observer.
*/
- private Map<Long, Observer<ObservableType,Event>> _observers;
-
+ private Map<Long, Observer<ObservableType, Event>> _observers;
+
/**
- * Counter for subscriptions. Holds the next subscription.
+ * Counter for subscriptions. Holds the next subscription.
*/
- private long _counter;
-
+ private long _counter;
+
/**
- * Constructs the observable.
- * @param aObservable Observable this instance is used for.
- * @param aNotifier Object used for implementing notification of listeners.
+ * 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<ObservableType,Event> aNotifier) {
+ public Observable(ObservableType aObservable,
+ ObserverNotifier<ObservableType, Event> aNotifier) {
_observable = aObservable;
- _notifier = aNotifier;
+ _notifier = aNotifier;
_observers = new TreeMap<Long, Observer<ObservableType, Event>>();
- _counter = 0;
+ _counter = 0;
}
-
+
/**
- * Subscribe an obvers.
- * @param aObserver Observer to subscribe.
- * @return Event Event to send.
+ * Subscribe an obvers.
+ *
+ * @param aObserver
+ * Observer to subscribe.
+ * @return Event Event to send.
*/
public synchronized long subscribe(Observer<ObservableType, Event> aObserver) {
- long subscription = _counter++; // integer rage is so large it will never roll over.
+ long subscription = _counter++; // integer rage is so large it will
+ // never roll over.
_observers.put(subscription, aObserver);
- return subscription;
+ return subscription;
}
-
+
/**
- * Unsubscribe an observer.
- * @param aSubscription Subscription which is used
- * @throws IllegalArgumentException In case the subscription is not known.
+ * Unsubscribe an observer.
+ *
+ * @param aSubscription
+ * Subscription which is used
+ * @throws IllegalArgumentException
+ * In case the subscription is not known.
*/
public synchronized void unsubscribe(long aSubscription) {
Object obj = _observers.remove(aSubscription);
- if ( obj == null ) {
- throw new IllegalArgumentException("Subscription '" + aSubscription + "'");
+ if (obj == null) {
+ throw new IllegalArgumentException("Subscription '" + aSubscription
+ + "'");
}
}
-
+
/**
- * Gets the number of subscribed observers.
+ * Gets the number of subscribed observers.
+ *
+ * @return Number of subscribed observers.
*/
- public int getObserverCount() {
- return _observers.size();
+ public int getObserverCount() {
+ return _observers.size();
}
-
+
/**
- * Notifies all subscribed observers.
- * @param aEvent Event to send.
+ * Notifies all subscribed observers.
+ *
+ * @param aEvent
+ * Event to send.
*/
public void send(Event aEvent) {
- // Make sure we do the notification while not holding the lock to avoid potential deadlock
- // situations.
- List<Observer<ObservableType,Event>> observers = new ArrayList<Observer<ObservableType, Event>>();
- synchronized (this) {
+ // Make sure we do the notification while not holding the lock to avoid
+ // potential deadlock
+ // situations.
+ List<Observer<ObservableType, Event>> observers = new ArrayList<Observer<ObservableType, Event>>();
+ synchronized (this) {
observers.addAll(_observers.values());
}
- for (Observer<ObservableType,Event> observer: observers) {
- _notifier.update(observer, _observable, aEvent);
+ for (Observer<ObservableType, Event> observer : observers) {
+ _notifier.update(observer, _observable, aEvent);
}
}
-
- /* (non-Javadoc)
+
+ /*
+ * (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!");
- for (Observer observer: _observers.values()) {
+ if (_observers.size() > 0) {
+ LOGGER
+ .error("Still observers registered at finalization of observer!");
+ for (Observer observer : _observers.values()) {
LOGGER.error(" observer: " + observer);
}
}
-
+
super.finalize();
}