/*
 Copyright (C) 2007 Richard Gomes

 This source code is release under the BSD License.

 This file is part of JQuantLib, a free-software/open-source library
 for financial quantitative analysts and developers - http://jquantlib.org/

 JQuantLib is free software: you can redistribute it and/or modify it
 under the terms of the JQuantLib license.  You should have received a
 copy of the license along with this program; if not, please email
 . The license is also available online at
 .

 This program is distributed in the hope that it will be useful, but WITHOUT
 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 FOR A PARTICULAR PURPOSE.  See the license for more details.

 JQuantLib is based on QuantLib. http://quantlib.org/
 When applicable, the original copyright notice follows this notice.
 */

package org.jquantlib.util;

import java.lang.ref.WeakReference;

/**
 * Implementation of Observable that holds references to Observers as
 * WeakReferences.
 *
 * @note This implementation notifies the observers in a synchronous
 * fashion. Note that this can cause trouble if you notify observers while
 * in a transactional context because the notification is then done also in the
 * transaction.
 *
 * 

* This class is based on the work done by Martin Fischer. See references below. * * @see * Martin Fischer: Observer and Observable interfaces * @see Improved Observer/Observable * * @see Observable * @see Observer * @see DefaultObservable * * @author Martin Fischer (original author) * @author Richard Gomes * @author Srinivas Hasti */ public class WeakReferenceObservable extends DefaultObservable { public WeakReferenceObservable(final Observable observable) { super(observable); } @Override public void addObserver(final Observer referent) { super.addObserver(new WeakReferenceObserver(referent)); } /** * This method deletes the Observer passed as argument but also discards those Observers which where reclaimed by gc */ @Override public void deleteObserver(final Observer observer) { for (final Observer weakObserver : getObservers()) { final WeakReferenceObserver weakReference = (WeakReferenceObserver) weakObserver; final Observer referent = weakReference.get(); if (referent == null || referent.equals(observer)) deleteWeakReference(weakReference); } } private void deleteWeakReference(final WeakReferenceObserver observer){ super.deleteObserver(observer); } // // inner classes // private class WeakReferenceObserver extends WeakReference implements Observer { public WeakReferenceObserver(final Observer referent) { super(referent); } @Override //XXX::OBS public void update(final Observable o, final Object arg) { public void update() { final Observer referent = get(); if (referent != null) //XXX::OBS referent.update(o, arg); referent.update(); else deleteWeakReference(this); } } }

Ads help maintain this website.