package hep.aida.ref.event; import java.util.EventObject; 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 AIDAListener and Observable, and relay things it observers to its * Observers. */ public class ObserverAdapter extends Observable implements AIDAListener { // Ideally we would like to only add ourselves as an AIDAListener if at least one person // is observing us. This makes things more efficient, and helps to avoid useless references // which hinder garbage collection protected IsObservable histo; protected Object update; private boolean observing = false; public ObserverAdapter() { this(null); } public ObserverAdapter(Object obs) { super(); if (obs instanceof IsObservable) this.histo = (IsObservable) obs; } // service methods public synchronized void setObservable(IsObservable newObs) { observe(false); histo = newObs; if (newObs != null) { observe(true); } } public synchronized void clearObservable() { setObservable(null); } public IsObservable getObservable() { return histo; } private void observe(boolean set) { //String noObservers = System.getProperty("hep.aida.ref.noObservers"); //boolean propertyForbidden = ( noObservers != null && Boolean.valueOf(noObservers).booleanValue() ); //set = !propertyForbidden && set; //set = noObservers == null && set; if (set != observing) { if (histo != null) { if (set) histo.addListener(this); else histo.removeListener(this); } observing = set; } } protected void setValid() { if (histo != null) histo.setValid(this); } // Observable methods 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); } // AIDAListener method public void stateChanged(EventObject e) { setChanged(); notifyObservers(update); } }