package hep.aida.ref.xml; import hep.aida.IAnalysisFactory; import hep.aida.IBaseStyle; import hep.aida.IPlotterStyle; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; import java.lang.reflect.Method; import java.net.URL; import java.util.Iterator; import java.util.List; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; /** * Restore IPlotterStyle from XML * @author The AIDA team @ SLAC. */ public class AidaStyleXMLReader { private Element rootElement; // Convenience static method for restoring IPlotterStyle directly from XML file on disk public static IPlotterStyle restoreFromFile(String fileName) throws IOException, JDOMException { File file = new File(fileName); FileReader reader = new FileReader(file); AidaStyleXMLReader xmlReader = new AidaStyleXMLReader(reader); IPlotterStyle style = IAnalysisFactory.create().createPlotterFactory().createPlotterStyle(); xmlReader.setStyle(style); return style; } public static void setStyleFromFile(IPlotterStyle style, String fileName) throws IOException, JDOMException { File file = new File(fileName); FileReader reader = new FileReader(file); AidaStyleXMLReader xmlReader = new AidaStyleXMLReader(reader); xmlReader.setStyle(style); return; } public static void setStyleFromFile(IPlotterStyle style, URL fileURL) throws IOException, JDOMException { InputStream is = fileURL.openStream(); Reader reader = new InputStreamReader(is); AidaStyleXMLReader xmlReader = new AidaStyleXMLReader(reader); xmlReader.setStyle(style); return; } /** Creates a new instance of AidaStyleXMLReader */ public AidaStyleXMLReader(Reader reader) throws IOException, JDOMException { SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(reader); rootElement = doc.getRootElement(); } /* * To create new IPlotterStyle */ public IPlotterStyle createStyle() { IPlotterStyle style = IAnalysisFactory.create().createPlotterFactory().createPlotterStyle(); setStyle(style, rootElement); return style; } /* * To set parameters in existing IPlotterStyle */ public void setStyle(IPlotterStyle style) { setStyle(style, rootElement); } void setStyle(IBaseStyle style, Element el) { if (!el.getName().equals("aidaStyle") && !el.getName().equals("aidaPlotterStyle")) { System.out.println("***** AidaStyleXMLReader.setParameter: wrong element name: "+el.getName()+" ... do nothing here"); return; } List children = el.getChildren(); Iterator it = children.iterator(); while (it.hasNext()) { Element childElement = (Element) it.next(); String name = childElement.getName(); if (name.equals("aidaStyle")) { String styleName = childElement.getAttributeValue("type"); IBaseStyle subStyle = null; Method method = null; try { method = style.getClass().getMethod(styleName, (Class[]) null); subStyle = (IBaseStyle) method.invoke(style, (Object[]) null); setStyle(subStyle, childElement); } catch (Exception e) { System.out.println("\t***** Invalid method: "+((method == null) ? "null" : method.getName())+" for: "+styleName+"... do nothing here"); } } else if (name.equals("aidaStyleAttribute")) { setParameter(style, childElement); } } } void setParameter(IBaseStyle style, Element el) { if (!el.getName().equals("aidaStyleAttribute")) { System.out.println("AidaStyleXMLReader.setParameter: wrong element name: "+el.getName()+" ... do nothing here"); return; } String name = el.getAttributeValue("attributeName"); String value = el.getAttributeValue("attributeValue"); if (value != null && value.equalsIgnoreCase("null")) value = null; style.setParameter(name, value); } // Shows how to use AidaStyleXMLReader by restoring IPlotterStyle from // XML file on disk and then writing it out again for comparison public static void main(String[] args) throws IOException, JDOMException { // Restoring IPlotterStyle from XML file /* String xmlFileName = "C:/work/Projects/Tests/PlotterStyle.xml"; IPlotterStyle style = AidaStyleXMLReader.restoreStyleFromFile(xmlFileName); */ String tmp = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n"; tmp += "<!DOCTYPE aidaPlotterStyle SYSTEM \"http://java.freehep.org/schemas/jaida/1.0/aidaPlotterStyle.dtd\">\n"; tmp += "<aidaPlotterStyle>\n"; tmp += "<aidaStyle type=\"dataStyle\">\n"; tmp += "<aidaStyle type=\"markerStyle\">\n"; tmp += "<aidaStyleAttribute attributeName=\"color\" attributeValue=\"red\"/>\n"; tmp += "</aidaStyle>\n"; tmp += "</aidaStyle>\n"; tmp += "</aidaPlotterStyle>\n"; Reader reader = new StringReader(tmp); AidaStyleXMLReader xmlReader = new AidaStyleXMLReader(reader); IPlotterStyle plotterStyle = IAnalysisFactory.create().createPlotterFactory().createPlotterStyle(); xmlReader.setStyle(plotterStyle); // Writing IPlotterStyle to different XML file boolean writeAllParameters = false; String newXmlFileName = "C:/work/Projects/Tests/PlotterStyle-test2.xml"; AidaStyleXMLWriter.writeToFile(newXmlFileName, plotterStyle, writeAllParameters); } }