/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package Sirius.server.registry;
import Sirius.server.observ.*;
import java.util.Vector;
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
public class Observable {
//~ Instance fields --------------------------------------------------------
protected RemoteObservable rmobs;
/** Vector, der die registrierten Observer enthaelt.* */
protected Vector observers;
/** Flag, spielt beim Muster Observer, Observable eine Rolle.* */
protected boolean changed;
private final transient org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(this.getClass());
//~ Constructors -----------------------------------------------------------
/**
* Creates a new Observable object.
*
* @param rmobs DOCUMENT ME!
*/
public Observable(final RemoteObservable rmobs) {
this.rmobs = rmobs;
observers = new Vector(10, 10);
changed = false;
}
//~ Methods ----------------------------------------------------------------
// ===================================================================================
// ==================== Implementierung des Interfaces Observable ====================
// ===================================================================================
/**
* Indicates that this object has no longer changed, or that it has already notified all of its observers of its
* most recent change, so that the hasChanged method will now return false. *
*/
public synchronized void clearChanged() {
changed = false;
}
/**
* Fragt den Status ab, ob sich etwas geaendert hat.*
*
* @return DOCUMENT ME!
*/
public synchronized boolean hasChanged() {
return changed;
}
/**
* Markiert, das sich etwas in der Registry geaendert hat, die hasChanged-Methode liefert nun true.*
*/
public synchronized void setChanged() {
changed = true;
}
/**
* liefert die Anzahl der registierten Observer/Beobachter.
*
* @return Anzahl der Observer *
*/
public synchronized int countObservers() {
return observers.size();
}
/**
* Fuegt einen Observer/Beobachter hinzu, dieser wird dann spaeter bei Aenderungen automatisch aktualisiert.
*
* @param ob ein Objekt, welches das Sirius.Observ.RemoteObserver Interface implementiert *
*/
public synchronized void addObserver(final RemoteObserver ob) {
if (!observers.contains(ob)) {
observers.addElement(ob);
if (logger.isDebugEnabled()) {
logger.debug(" Info Observer registered::" + ob.toString() + "\n"); // NOI18N
}
}
}
// -----------------------------------------------------------------------------------------------------
/**
* wenn ein Observer heruntergefahren wird, meldet er sich ueber diese Funktion bei der Registry als Observer ab. *
*
* @param ob DOCUMENT ME!
*/
public synchronized void deleteObserver(final RemoteObserver ob) {
if (observers.contains(ob)) {
observers.removeElement(ob);
if (logger.isDebugEnabled()) {
logger.debug("Info <REG> Observer removed::" + ob.toString() + "\n"); // NOI18N
}
} else if (logger.isDebugEnabled()) {
logger.debug("Info <REG> Observer not found" + ob); // NOI18N
}
}
// -----------------------------------------------------------------------------------------------------
/**
* loescht die Liste der Observer.*
*/
public synchronized void deleteObservers() {
observers = new Vector();
}
/**
* -----------------------------------------------------------------------------------------------------
*/
public void notifyObservers() {
performNotify(null);
}
/**
* -----------------------------------------------------------------------------------------------------
*
* @param r DOCUMENT ME!
*/
public void notifyObservers(final java.rmi.Remote r) {
performNotify(r);
}
/**
* -----------------------------------------------------------------------------------------------------
*
* @param s DOCUMENT ME!
*/
public void notifyObservers(final java.io.Serializable s) {
performNotify(s);
}
// -----------------------------------------------------------------------------------------------------
/**
* Diese Methode wird von {@link #notifyObservers() notifyObservers()},
* {@link #notifyObservers(Remote r) notifyObservers(Remote r)} und
* {@link #notifyObservers(Remote r) notifyObservers(Remote r)} aufgerufen. In dieser Methode werden alle
* registrierten Observer benachrichtigt *
*
* @param arg DOCUMENT ME!
*/
public void performNotify(final java.lang.Object arg) {
if (!hasChanged()) {
return;
} else {
for (int i = 0; i < observers.size(); i++) {
try {
final RemoteObserver r = (RemoteObserver)observers.elementAt(i);
r.update(rmobs, arg);
} catch (Exception e) {
logger.error("Exception in performNotify:: ", e); // NOI18N
}
}
clearChanged();
}
}
// end class
}