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);
    }
  
}

 

Ads help maintain this website.