/* * RmiHist1DConverter.java * * Created on October 14, 2003, 7:39 PM */ package hep.aida.ref.remote.rmi.converters; import hep.aida.IAnnotation; import hep.aida.ICloud1D; import hep.aida.IHistogram1D; import hep.aida.IManagedObject; import hep.aida.ref.Annotation; import hep.aida.ref.remote.RemoteCloud1D; import hep.aida.ref.remote.RemoteHistogram1D; import hep.aida.ref.remote.rmi.data.RmiAnnotationItem; import hep.aida.ref.remote.rmi.data.RmiCloud1DData; import hep.aida.ref.remote.rmi.data.RmiHist1DData; /** * * @author serbo */ public class RmiCloud1DConverter extends RmiConverter { private static RmiCloud1DConverter converter = null; /** Creates a new instance of RmiHist1DAdapter */ public static RmiCloud1DConverter getInstance() { if (converter == null) converter = new RmiCloud1DConverter(); return converter; } /** Creates a new instance of RmiHist1DConverter */ private RmiCloud1DConverter() { super(); dataType = "RmiCloud1DData"; aidaType = "ICloud1D"; } public Object createAidaObject(String name) { RemoteCloud1D result = new RemoteCloud1D(name); return result; } public Object extractData(Object aidaObject) { RmiCloud1DData data = null; if (aidaObject instanceof hep.aida.ICloud1D) { data = createData((hep.aida.ICloud1D) aidaObject); } else if (aidaObject instanceof Object[] && ((Object[]) aidaObject)[0] instanceof ICloud1D) { ICloud1D[] arr = new ICloud1D[((Object[]) aidaObject).length]; for (int i=0; i<arr.length; i++) { arr[i] = (ICloud1D) ((Object[]) aidaObject)[i]; } data = createData(arr); } else throw new IllegalArgumentException("Not supported data type: "+aidaObject.getClass().getName()); return data; } public boolean updateAidaObject(Object aidaObject, Object newData) { RmiCloud1DData data = null; if (newData instanceof RmiCloud1DData) { data = (RmiCloud1DData) newData; } if (!(aidaObject instanceof hep.aida.ref.remote.RemoteCloud1D)) throw new IllegalArgumentException("Not supported object type: "+aidaObject.getClass().getName()); if (!(data != null && data instanceof hep.aida.ref.remote.rmi.data.RmiCloud1DData)) throw new IllegalArgumentException("Not supported data type: "+(newData == null ? "null" : newData.getClass().getName())); updateData((RemoteCloud1D) aidaObject, data); return true; } // Service methods /** * Update data in RemoteHistogram1d from RmiHist1DData * and calls setDataValid(true) method. */ public IManagedObject updateData(RemoteCloud1D cloud, RmiCloud1DData data) { // If data == null, just leave the old dats in. // Maybe should clear the histogram instead? if (data == null) return cloud; synchronized (cloud) { cloud.setFillable(true); // Set historam info RmiHist1DData histData = data.getHist(); RemoteHistogram1D hist = (RemoteHistogram1D) cloud.histogram(); RmiHist1DConverter.getInstance().updateData(hist, histData); hist.setFillable(true); hist.setDataValid(true); // 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); IAnnotation localAnnotation = cloud.annotation(); if (localAnnotation instanceof Annotation) ((Annotation) localAnnotation).setFillable(true); 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 cloud.setConverted(data.getConverted()); cloud.setEntries(data.getEntries()); cloud.setSummOfWeights(data.getSumOfWeights()); cloud.setMaxEntries(data.getMaxEntries()); cloud.setLowerEdge(data.getLowerEdge()); cloud.setUpperEdge(data.getUpperEdge()); cloud.setMean(data.getMean()); cloud.setRms(data.getRms()); cloud.setValues(data.getValues()); cloud.setWeights(data.getWeights()); cloud.setFillable(false); cloud.setDataValid(true); } return cloud; } /** * Create RmiHist1DData structure from an IHistogram1D */ public RmiCloud1DData createData(ICloud1D cloud) { RmiCloud1DData data = new RmiCloud1DData(); RmiHist1DData histData = null; RmiAnnotationItem[] rAnnotation = null; boolean isConverted = false; int maxEntries = 0; int entries = 0; double sumOfWeights = 0.; double lowerEdge = Double.NaN; double upperEdge = Double.NaN; double mean = Double.NaN; double rms = Double.NaN; double[] values = null; double[] weights = null; synchronized (cloud) { isConverted = cloud.isConverted(); maxEntries = cloud.maxEntries(); entries = cloud.entries(); sumOfWeights = cloud.sumOfWeights(); lowerEdge = cloud.lowerEdge(); upperEdge = cloud.upperEdge(); if (isConverted) { IHistogram1D hist = cloud.histogram(); histData = RmiHist1DConverter.getInstance().createData(hist); } else { // Get Annotation information boolean sticky = false; IAnnotation lAnnotation = cloud.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); } } // Get global histogram information mean = cloud.mean(); rms = cloud.rms(); // Get bin information if (entries > 0) { values = new double[entries]; weights = new double[entries]; int i = 0; for (i=0; i<entries; i++) { values[i] = cloud.value(i); weights[i] = cloud.weight(i); } } } } // end synchronized // Set all the information if (isConverted) { data.setHist(histData); } else { histData = new RmiHist1DData(); histData.setAnnotationItems(rAnnotation); } data.setValues(values); data.setWeights(weights); data.setConverted(isConverted); data.setEntries(entries); data.setSumOfWeights(sumOfWeights); data.setMaxEntries(maxEntries); data.setLowerEdge(lowerEdge); data.setUpperEdge(upperEdge); data.setMean(mean); data.setRms(rms); return data; } /** * Create RmiHist1DData structure from an array of IHistogram1D */ public RmiCloud1DData createData(ICloud1D[] arr) { System.out.println("Create data for: "+arr.length); RmiCloud1DData[] allData = new RmiCloud1DData[arr.length]; for (int i=0; i<allData.length; i++) { allData[i] = createData(arr[i]); } /* RmiCloud1DData data = new RmiCloud1DData(); RmiHist1DData histData = null; RmiAnnotationItem[] rAnnotation = null; boolean isConverted = false; int maxEntries = 0; int entries = 0; double lowerEdge = Double.NaN; double upperEdge = Double.NaN; double mean = Double.NaN; double rms = Double.NaN; double[] values = null; double[] weights = null; // Do Merging here: // Set all the information if (isConverted) { data.setHist(histData); } else { histData = new RmiHist1DData(); histData.setAnnotationItems(rAnnotation); } data.setValues(values); data.setWeights(weights); data.setConverted(isConverted); data.setEntries(entries); data.setMaxEntries(maxEntries); data.setLowerEdge(lowerEdge); data.setUpperEdge(upperEdge); data.setMean(mean); data.setRms(rms); return data; */ return allData[0]; } }