/*
* RemoteManagedObject.java
*
* Created on June 9, 2003, 5:17 PM
*/
package hep.aida.ref.remote;
import hep.aida.dev.IDevMutableStore;
import hep.aida.ref.AidaUtils;
import hep.aida.ref.ManagedObject;
import hep.aida.ref.event.AIDAListener;
import hep.aida.ref.event.IsObservable;
import java.util.logging.Logger;
/**
* Base class for all IManagedObjects in local AIDA Tree
* that are copies of remote AIDA Tree objects. If dataIsValid
* state changes, event is fired to notify listeners.
* @author serbo
*/
public abstract class RemoteManagedObject extends ManagedObject implements IsObservable {
public static int DEFAULT_INT = 0;
public static long DEFAULT_LONG = 0L;
public static float DEFAULT_FLOAT = 0.0F;
public static double DEFAULT_DOUBLE = 0.0;
public static double rmsFactor = Math.sqrt(12);
protected IDevMutableStore store = null;
protected String treePath = null;
protected String aidaType = "IManagedObject";
protected boolean dataIsValid = false;
protected boolean stateDidChange = false;
protected Logger remoteLogger = Logger.getLogger("hep.aida.ref.remote");
//protected long timeOfLastUpdate; // in milliseconds
//protected String xAxisType;
//protected String yAxisType;
protected boolean isLocked;
/** Creates a new instance of RemoteManagedObject */
public RemoteManagedObject(String name) {
super(name);
fillable = false;
//xAxisType = null;
//yAxisType = null;
}
static String getCurrentTime() {
long millis = System.currentTimeMillis();
long ml = millis %1000;
java.util.Date date = new java.util.Date(millis);
String tmp = java.text.DateFormat.getDateTimeInstance().format(date);
tmp = tmp + " ["+ml+"] :: ";
return tmp;
}
public void makeSureDataIsValid() {
// System.out.println("**************************************** MAKE SURE DATA IS VALID!!!!! ");
if (dataIsValid || fillable || !isConnected || isLocked ) return;
//remoteLogger.finest("RemoteManagedObject.makeSureDataIsValid :: data="+dataIsValid+", isValid="+isValid+", stateDidChange="+stateDidChange+", path="+treePath);
if (store instanceof RemoteMutableStore)
((RemoteMutableStore) store).handleDataUpdate(this, treePath, aidaType);
else if (store != null)
store.updateData(treePath, aidaType);
}
public boolean getIsLocked() {
return isLocked;
}
public void setIsLocked(boolean isLocked) {
this.isLocked = isLocked;
}
public String type() {
if (aidaType != null && !aidaType.trim().equals("")) return aidaType;
else return super.type();
}
public void setStore(IDevMutableStore store) {
this.store = store;
}
public IDevMutableStore getStore() {
return store;
}
//public void setXAxisType(String type) { xAxisType = type; }
//public String getXAxisType() { return xAxisType; }
//public void setYAxisType(String type) { yAxisType = type; }
//public String getYAxisType() { return yAxisType; }
/** Set what folder this histogram belongs to. */
public void setTreeFolder(String treeFolder) {
String histName = (name() == null) ? "Unknown" : name();
if (histName.startsWith("/")) {
histName = histName.substring(1);
histName = AidaUtils.modifyName(histName);
histName = "/" + histName;
} else {
histName = AidaUtils.modifyName(histName);
}
//System.out.println("RemoteManagedObject:: name="+histName+", path="+treeFolder);
if (treeFolder.endsWith("//")) treeFolder = treeFolder.substring(0, treeFolder.length()-2);
if (!treeFolder.startsWith("/")) treeFolder = "/"+treeFolder;
else if (treeFolder.startsWith("//")) treeFolder = treeFolder.substring(1);
if (treeFolder.equals("/") && histName.startsWith("/")) this.treePath = histName;
else if (treeFolder.endsWith("/") && histName.startsWith("/")) this.treePath = treeFolder+histName.substring(1);
else if (treeFolder.endsWith("/") || histName.startsWith("/")) this.treePath = treeFolder+histName;
else this.treePath = treeFolder+"/"+histName;
//System.out.println("\tpath="+treePath);
}
public String getTreePath() { return treePath; }
public void setConnected(boolean connected) {
super.setConnected(connected);
setDataValid(false);
}
public void setDataValid(boolean dataIsValid) {
boolean fireEvent = false;
synchronized (this) {
remoteLogger.finest("RemoteManagedObject.setDataValid :: DATA: new="+dataIsValid+", old="+this.dataIsValid+", isValid="+isValid+", stateDidChange="+stateDidChange+", path="+treePath);
if (this.dataIsValid != dataIsValid) {
this.dataIsValid = dataIsValid;
if (isValid) {
fireEvent = true;
stateDidChange = false;
} else {
stateDidChange = true;
}
}
}
if (fireEvent) fireStateChanged();
}
public boolean isDataValid() {
return dataIsValid;
}
public void setValid(AIDAListener l) {
boolean fireEvent = false;
synchronized (this) {
remoteLogger.finest("RemoteManagedObject.setValid :: dataIsValid="+dataIsValid+", oldIsValid="+isValid+", stateDidChange="+stateDidChange+", for path="+getTreePath()+", AIDAListener: "+l);
if (stateDidChange) {
fireEvent = true;
stateDidChange = false;
}
}
super.setValid(l);
if (fireEvent) fireStateChanged();
}
public void setValidForAll() {
boolean fireEvent = false;
synchronized (this) {
remoteLogger.finest("RemoteManagedObject.setValidForAll :: dataIsValid="+dataIsValid+", oldIsValid="+isValid+", stateDidChange="+stateDidChange+", for path="+getTreePath());
if (stateDidChange) {
fireEvent = true;
stateDidChange = false;
}
}
super.setValidForAll();
if (fireEvent) fireStateChanged();
}
}