package jas.hist.util; import java.util.Observable; import java.util.Observer; /** * An ObserverAdapter can be used as a base class for class that wants to act * as both and Observer and Observable, and relay things it observers to its * Observers. */ public class ObserverAdapter extends Observable implements Observer { // Ideally we would like to only add ourselves as an Observer if at least one person // is observing us. This makes things more efficient, and helps to avoid useless references // which hinder garbage collection private Observable obs; private boolean observing = false; public ObserverAdapter(Observable obs) { this.obs = obs; } public ObserverAdapter() { } public synchronized void setObservable(Observable newObs) { if (observing && obs != null) obs.deleteObserver(this); obs = newObs; if (observing && obs != null) obs.addObserver(this); } public synchronized void clearObservable() { setObservable(null); } /** * When the object which we are observing is updated, relay the response to our observers */ public void update(Observable o, Object arg) { setChanged(); notifyObservers(arg); } private void observe(boolean set) { if (set != observing) { if (obs != null) { if (set) obs.addObserver(this); else obs.deleteObserver(this); } observing = set; } } public synchronized void addObserver(Observer o) { super.addObserver(o); observe(true); } public synchronized void deleteObserver(Observer o) { super.deleteObserver(o); if (countObservers() == 0) observe(false); } public synchronized void deleteObservers() { super.deleteObservers(); observe(false); } }