/*
* UpdatableQueue.java
*
* Created on May 11, 2003, 9:32 PM
*/
package hep.aida.ref.remote;
import hep.aida.ref.remote.interfaces.AidaUpdatable;
import hep.aida.ref.remote.interfaces.AidaUpdateEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author serbo
*/
public class RemoteUpdatableQueue extends Thread {
private List updatables;
private List events;
private boolean keepRunning;
private Logger remoteLogger;
/** Creates a new instance of UpdatableQueue */
public RemoteUpdatableQueue() {
updatables = new ArrayList(100);
events = new ArrayList(100);
keepRunning = true;
remoteLogger = Logger.getLogger("hep.aida.ref.remote");
remoteLogger.fine("UpdatableQueue: START");
//this.setPriority(this.getPriority()-1);
this.start();
}
public synchronized void close() {
keepRunning = false;
updatables.clear();
events.clear();
this.notify();
}
public void schedule(Object source, AidaUpdateEvent event) {
if (!keepRunning) return; // Do not schedule new events if queue is shutting down
remoteLogger.finest("RemoteUpdatableQueue.schedule: id="+event.id()+", nodeType="+event.nodeType()+", path="+event.path());
synchronized( this ) {
updatables.add(source);
events.add(event);
this.notify();
}
}
public void schedule(Object source, AidaUpdateEvent[] evts) {
if (!keepRunning) return; // Do not schedule new events if queue is shutting down
synchronized( this ) {
if (evts == null || evts.length == 0) return;
for (int i=0; i<evts.length; i++) {
AidaUpdateEvent event = evts[i];
remoteLogger.finest("RemoteUpdatableQueue.schedule: id="+event.id()+", nodeType="+event.nodeType()+", path="+event.path());
updatables.add(source);
events.add(event);
}
this.notify();
}
}
public void run() {
while (keepRunning) {
Object obj = null;
AidaUpdatable source = null;
AidaUpdateEvent event = null;
int size = 0;
try {
synchronized (this) {
if(updatables.size() == 0) this.wait();
size = updatables.size();
if (size > 0) {
obj = updatables.remove(0);
event = (AidaUpdateEvent) events.remove(0);
}
}
remoteLogger.finest("RemoteUpdatableQueue.run *** Start for event: "+event+", object: "+obj);
if (event == null) {
remoteLogger.fine("RemoteUpdatableQueue.run event=null for object: "+obj);
} else if (obj == null) {
remoteLogger.fine("RemoteUpdatableQueue.run object=null for event: id="+event.id()+", nodeType="+event.nodeType()+", path="+event.path());
} else if (obj instanceof AidaUpdatable) {
source = (AidaUpdatable) obj;
source.stateChanged(event);
remoteLogger.finest("RemoteUpdatableQueue.run *** Finished for event: id="+event.id()+", nodeType="+event.nodeType()+", path="+event.path()+", object: "+obj);
} else {
// If not AidaUpdatable, do something else here.
remoteLogger.fine("RemoteUpdatableQueue.run object is not AidaUpdatable: "+obj);
}
} catch (InterruptedException e2) {
remoteLogger.log(Level.INFO, "RemoteUpdatableQueue InterruptedException: \n\t" + e2.getMessage());
remoteLogger.log(Level.FINE, "", e2.getStackTrace());
} catch (Exception e3) {
remoteLogger.log(Level.INFO, "Exception in RemoteUpdatableQueue: \n\t" + e3.getMessage());
remoteLogger.log(Level.FINE, "", e3.getStackTrace());
} // end of try/catch
} // end of while
} //end of run
}