package hep.aida.ref.xml; import hep.aida.IAnalysisFactory; import hep.aida.IBaseStyle; import hep.aida.IPlotterStyle; import hep.aida.ref.plotter.BaseStyle; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import org.freehep.xml.util.XMLWriter; /** * Convert AIDA objects to XML. * @author The AIDA team @ SLAC. * @version $Id: AidaStyleXMLWriter.java 8704 2006-08-26 00:19:06Z serbo $ */ public class AidaStyleXMLWriter extends XMLWriter { // Convenience statice methods for writing IPlotterStyle directly to XML file on disk public static void writeToFile(String fileName, IPlotterStyle style) throws IOException { writeToFile(fileName, style, false); } public static void writeToFile(String fileName, IPlotterStyle style, boolean writeAllParameters) throws IOException { File file = new File(fileName); if (file.exists()) file.delete(); Writer writer = new BufferedWriter(new FileWriter(file)); AidaStyleXMLWriter xmlWriter = new AidaStyleXMLWriter(writer); xmlWriter.plotterStyleToXML(style, writeAllParameters); xmlWriter.close(); } public AidaStyleXMLWriter(Writer writer) throws IOException { super(writer); openDoc("1.0", "ISO-8859-1", false); referToDTD("aidaPlotterStyle", "http://java.freehep.org/schemas/jaida/1.0/aidaPlotterStyle.dtd"); } public void close() throws IOException { super.close(); } public void plotterStyleToXML(IPlotterStyle style) { plotterStyleToXML(style, false); } public void plotterStyleToXML(IPlotterStyle style, boolean writeAllParameters) { if (isStyleEmpty(style, writeAllParameters)) return; openTag("aidaPlotterStyle"); IBaseStyle[] children = style.children(); if (children != null) { for (int i=0; i<children.length; i++) { toXML(children[i], writeAllParameters); } } parametersToXML(style, writeAllParameters); closeTag(); } void toXML(IBaseStyle style) { toXML(style, false); } void toXML(IBaseStyle style, boolean writeAllParameters) { if (isStyleEmpty(style, writeAllParameters)) return; setAttribute("type", style.name()); openTag("aidaStyle"); IBaseStyle[] children = style.children(); if (children != null) { for (int i=0; i<children.length; i++) { toXML(children[i], writeAllParameters); } } parametersToXML(style, writeAllParameters); closeTag(); } void parametersToXML(IBaseStyle style, boolean writeAllParameters) { String[] parNames = style.availableParameters(); if (parNames != null) { for (int i=0; i<parNames.length; i++) { String name = parNames[i]; String value = style.parameterValue(name); if (value == null) value = "null"; boolean isSet = true; String type = String.class.getName(); if (style instanceof BaseStyle) { isSet = ((BaseStyle) style).isParameterSet(name); type = ((BaseStyle) style).parameter(name).type().getName(); } if (isSet || writeAllParameters) { setAttribute("attributeName", name); setAttribute("attributeValue", value); printTag("aidaStyleAttribute"); } } } } boolean isStyleEmpty(IBaseStyle style) { return isStyleEmpty(style, false); } boolean isStyleEmpty(IBaseStyle style, boolean writeAllParameters) { boolean isEmpty = true; // Check if style has any valid parameters String[] parNames = style.availableParameters(); if (parNames != null) { for (int i=0; i<parNames.length; i++) { String name = parNames[i]; boolean isSet = true; if (style instanceof BaseStyle) isSet = ((BaseStyle) style).isParameterSet(name); if (isSet || writeAllParameters) { return false; } } } // Check if children styles are empty IBaseStyle[] children = style.children(); if (children != null) { for (int i=0; i<children.length; i++) { if (!isStyleEmpty(children[i])) return false; } } return isEmpty; } public void printStyle(IBaseStyle style) { printStyle(style, false); } public static void printStyle(IBaseStyle style, boolean writeAllParameters) { System.out.println("<"+style.name()+" type="+style.type().getName()+" >"); IBaseStyle[] children = style.children(); if (children != null) { for (int i=0; i<children.length; i++) { printStyle(children[i], writeAllParameters); } } String[] parNames = style.availableParameters(); if (parNames != null) { for (int i=0; i<parNames.length; i++) { String name = parNames[i]; String value = style.parameterValue(name); boolean isSet = true; if (style instanceof BaseStyle) isSet = ((BaseStyle) style).isParameterSet(name); if (isSet || writeAllParameters) { System.out.println("\t\t<parameter name="+name+" value="+value+" />"); } } } System.out.println("</"+style.name()+">"); } // Shows how to use AidaStyleXMLWriter by writing IPlotterStyle to XML file public static void main(String[] args) throws IOException { // Initial setup String fileName = "C:/work/Projects/Tests/PlotterStyle.xml"; boolean writeAllParameters = true; // Create File and Writer File file = new File(fileName); if (file.exists()) file.delete(); Writer writer = new BufferedWriter(new FileWriter(file)); AidaStyleXMLWriter xmlWriter = new AidaStyleXMLWriter(writer); // Create AIDA IPlotterStyle and set several parameters IPlotterStyle style = IAnalysisFactory.create().createPlotterFactory().createPlotterStyle(); style.xAxisStyle().setLabel("xxxxxAxisLabel"); style.dataStyle().markerStyle().setShape("box"); style.yAxisStyle().setLabel("yyyyyAxisLabel"); //AidaStyleXMLWriter.printStyle(style.dataStyle().lineStyle(), true); AidaStyleXMLWriter.printStyle(style.xAxisStyle(), true); // Write it ot XML file xmlWriter.plotterStyleToXML(style, writeAllParameters); xmlWriter.close(); } }