package org.drugis.common.beans;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Collection;
import java.util.LinkedList;
import com.jgoodies.binding.beans.Observable;
/**
* Class to manage PropertyChangeListener to facilitate implementation of Observable.
*/
public class ObserverManager {
private static final PropertyChangeListener[] LISTENER_ARRAY = new PropertyChangeListener[]{};
private Observable d_source;
private Collection<PropertyChangeListener> d_listeners = createCollection();
public ObserverManager(Observable source) {
d_source = source;
}
protected Collection<PropertyChangeListener> createCollection() {
return new LinkedList<PropertyChangeListener>();
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
synchronized (d_listeners) {
d_listeners.add(listener);
}
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
synchronized (d_listeners) {
d_listeners.remove(listener);
}
}
public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
PropertyChangeEvent event = new PropertyChangeEvent(d_source, propertyName, oldValue, newValue);
// Copy the list of listeners for thread safety
// We don't synchronize the for-loop because listeners might be doing time-consuming stuff
PropertyChangeListener[] arr;
synchronized (d_listeners) {
arr = d_listeners.toArray(LISTENER_ARRAY);
}
for (PropertyChangeListener l : arr) {
l.propertyChange(event);
}
}
}