/*
* RmiHist1DConverter.java
*
* Created on October 14, 2003, 7:39 PM
*/
package hep.aida.ref.remote.rmi.converters;
import hep.aida.IAnnotation;
import hep.aida.IDataPoint;
import hep.aida.IDataPointSet;
import hep.aida.IManagedObject;
import hep.aida.IMeasurement;
import hep.aida.ref.Annotation;
import hep.aida.ref.remote.RemoteDataPointSet;
import hep.aida.ref.remote.RemoteManagedObject;
import hep.aida.ref.remote.rmi.data.RmiAnnotationItem;
import hep.aida.ref.remote.rmi.data.RmiDataPointSetData;
/**
*
* @author serbo
*/
public class RmiDataPointSetConverter extends RmiConverter {
private static RmiDataPointSetConverter converter = null;
/** Creates a new instance of RmiHist1DAdapter */
public static RmiDataPointSetConverter getInstance() {
if (converter == null) converter = new RmiDataPointSetConverter();
return converter;
}
/** Creates a new instance of RmiHist1DConverter */
private RmiDataPointSetConverter() {
super();
dataType = "RmiDataPointSetData";
aidaType = "IDataPointSet";
}
public Object createAidaObject(String name) {
RemoteDataPointSet result = new RemoteDataPointSet(name);
return result;
}
public Object extractData(Object aidaObject) {
if (!(aidaObject instanceof hep.aida.IDataPointSet))
throw new IllegalArgumentException("Not supported data type: "+aidaObject.getClass().getName());
RmiDataPointSetData data = createData((hep.aida.IDataPointSet) aidaObject);
return data;
}
public boolean updateAidaObject(Object aidaObject, Object newData) {
RmiDataPointSetData data = null;
if (newData instanceof RmiDataPointSetData) {
data = (RmiDataPointSetData) newData;
}
if (!(aidaObject instanceof hep.aida.ref.remote.RemoteDataPointSet))
throw new IllegalArgumentException("Not supported object type: "+aidaObject.getClass().getName());
if (!(data != null && data instanceof hep.aida.ref.remote.rmi.data.RmiDataPointSetData))
throw new IllegalArgumentException("Not supported data type: "+(newData == null ? "null" : newData.getClass().getName()));
updateData((RemoteDataPointSet) aidaObject, data);
return true;
}
// Service methods
/**
* Update data in RemoteHistogram1d from RmiHist1DData
* and calls setDataValid(true) method.
*/
public IManagedObject updateData(RemoteDataPointSet hist, RmiDataPointSetData data)
{
// If data == null, just leave the old dats in.
// Maybe should clear the histogram instead?
if (data == null) return hist;
synchronized (hist) {
hist.setFillable(true);
// Check and set Annotation
RmiAnnotationItem[] items = data.getAnnotationItems();
if (items != null && items.length > 0) {
boolean sticky = false;
IAnnotation localAnnotation = hist.annotation();
if (localAnnotation instanceof Annotation)
((Annotation) localAnnotation).setFillable(true);
for (int i=0; i<items.length; i++) {
String key = items[i].key;
String newValue = items[i].value;
String oldValue = null;
try {
oldValue = localAnnotation.value(key);
} catch (IllegalArgumentException e) {}
if (oldValue == null) localAnnotation.addItem(key, newValue, sticky);
else if (!newValue.equals(oldValue)) {
localAnnotation.setValue(key, newValue);
localAnnotation.setSticky(key, sticky);
}
}
// Check for "stat.Updated" info
java.util.Date date = new java.util.Date();
java.text.DateFormat df = java.text.DateFormat.getTimeInstance();
String dateString = df.format(date);
try {
String value = localAnnotation.value("stat.Updated");
if (value == null || value.equals("0") || value.equals(""))
localAnnotation.setValue("stat.Updated", dateString);
} catch (IllegalArgumentException e) {
localAnnotation.addItem("stat.Updated", dateString);
}
if (localAnnotation instanceof Annotation)
((Annotation) localAnnotation).setFillable(false);
}
// Set all other information
//hist.setXAxisType(data.getXAxisType());
//hist.setYAxisType(data.getYAxisType());
//hist.setTimeOfLastUpdate(data.getTimeOfLastUpdate());
hist.setDimension(data.getDimension());
hist.setUpperExtent(data.getUpperExtent());
hist.setLowerExtent(data.getLowerExtent());
hist.setValues(data.getValues());
hist.setPlusErrors(data.getPlusErrors());
hist.setMinusErrors(data.getMinusErrors());
hist.setFillable(false);
hist.setDataValid(true);
}
return hist;
}
/**
* Create RmiHist1DData structure from an IHistogram1D
*/
public RmiDataPointSetData createData(IDataPointSet hist) {
RmiDataPointSetData data = new RmiDataPointSetData();
RmiAnnotationItem[] rAnnotation = null;
int dimension = 0;
double[] upperExtent = null;
double[] lowerExtent = null;
double[] values = null;
double[] plusErrors = null;
double[] minusErrors = null;
String xAxisType = null;
String yAxisType = null;
long timeOfLastUpdate = 0;
synchronized (hist) {
// Get Annotation information
boolean sticky = false;
IAnnotation lAnnotation = hist.annotation();
if (lAnnotation != null && lAnnotation.size() > 0) {
rAnnotation = new RmiAnnotationItem[lAnnotation.size()];
for (int i=0; i<lAnnotation.size(); i++) {
String key = lAnnotation.key(i);
String value = lAnnotation.value(key);
rAnnotation[i] = new RmiAnnotationItem(key, value, sticky);
}
}
int nPoints = hist.size();
dimension = hist.dimension();
// Get information
if (nPoints > 0) {
upperExtent = new double[dimension];
lowerExtent = new double[dimension];
values = new double[dimension*nPoints];
plusErrors = new double[dimension*nPoints];
minusErrors = new double[dimension*nPoints];
for (int dim=0; dim<dimension; dim++) {
upperExtent[dim] = hist.upperExtent(dim);
lowerExtent[dim] = hist.lowerExtent(dim);
}
int index = 0;
for (int ip=0; ip<nPoints; ip++) {
IDataPoint p = hist.point(ip);
for (int dim=0; dim<dimension; dim++) {
index = ip*dimension+dim;
IMeasurement m = p.coordinate(dim);
values[index] = m.value();
plusErrors[index] = m.errorPlus();
minusErrors[index] = m.errorMinus();
}
}
}
if (hist instanceof RemoteManagedObject) {
RemoteManagedObject rdps = (RemoteManagedObject) hist;
//xAxisType = rdps.getXAxisType();
//yAxisType = rdps.getYAxisType();
//timeOfLastUpdate = rdps.getTimeOfLastUpdate();
}
} // end synchronized
// Set all the information
data.setAnnotationItems(rAnnotation);
//data.setXAxisType(xAxisType);
//data.setYAxisType(yAxisType);
//data.setTimeOfLastUpdate(timeOfLastUpdate);
data.setDimension(dimension);
data.setUpperExtent(upperExtent);
data.setLowerExtent(lowerExtent);
data.setValues(values);
data.setPlusErrors(plusErrors);
data.setMinusErrors(minusErrors);
return data;
}
}