package hep.aida.util; import hep.aida.IFitResult; import hep.aida.IManagedObject; import hep.aida.ITree; import hep.aida.dev.IAddable; import hep.aida.dev.IDevTree; import hep.aida.ref.AidaUtils; import hep.aida.ref.ContainerManagedObject; import hep.aida.ref.tree.Tree; import hep.aida.ref.xml.AIDAEntityResolver; import hep.aida.ref.xml.AidaHandlerImpl; import hep.aida.ref.xml.AidaParser; import hep.aida.ref.xml.AidaXMLStore; import hep.aida.ref.xml.AidaXMLWriter; import java.io.ByteArrayInputStream; import de.schlichtherle.io.File; import java.io.IOException; import java.io.StringWriter; import java.util.Map; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; /** * * @author The FreeHEP team @ SLAC. * @version $Id: XMLUtils.java 13343 2007-09-18 01:24:09Z serbo $ */ public abstract class XMLUtils { /** * Write AIDA Tree to an XML file * * Possible options and option values: * compress : zip, gzip, false * binary : true, false * skip : list of AIDA Type to skip when writing to file, * Example: skip=\"ITuple, ICloud2D\" */ public static void writeToFile(ITree tree, String fileName, String options) throws IOException { Map optionsMap = AidaUtils.parseOptions(options); AidaXMLStore xmlStore = new AidaXMLStore(); File file = new File(fileName); if (file.exists()) { throw new IOException("Output file already exists: " + file.getAbsolutePath()); } String cString = (String) optionsMap.get("compress"); boolean zip = cString != null && cString.equalsIgnoreCase("zip"); boolean compress = (cString == null) || cString.equalsIgnoreCase("yes") || cString.equalsIgnoreCase("true") || cString.equalsIgnoreCase("gzip"); String bString = (String) optionsMap.get("binary"); boolean binary = (bString != null) && (bString.equalsIgnoreCase("yes") || bString .equalsIgnoreCase("true")); String[] skip = null; if (optionsMap.get("skip") != null) skip = AidaUtils.parseString((String) optionsMap.get("skip")); xmlStore.commit(tree, file, skip, zip, compress, binary); } public static String createXMLString(IManagedObject mo) throws IOException { return createXMLString(mo, ""); } public static String createXMLString(IManagedObject mo, ITree tree) throws IOException { return createXMLString(mo, tree.findPath(mo)); } public static String createXMLString(IManagedObject mo, String path) throws IOException { return toXMLString(mo, path); } public static IManagedObject createManagedObject(String xmlString) throws IOException { Addable addable = new Addable(); parse(xmlString, addable, null); return addable.object(); } public static void addToTree(String xmlString, ITree tree) throws IOException { String systemID = tree.storeName(); if (tree instanceof IDevTree) parse(xmlString, (IDevTree) tree, systemID); else throw new IOException("Wrong Tree type: "+tree); } // IFitResult public static String createXMLString(IFitResult fitResult) throws IOException { return createXMLString(fitResult, "/"); } public static String createXMLString(IFitResult fitResult, String path) throws IOException { return toXMLString(fitResult, path); } public static IFitResult createFitResult(String xmlString) throws IOException { Addable addable = new Addable(); IFitResult fitResult = null; try { parse(xmlString, addable, null); IManagedObject mo = addable.object(); if (mo instanceof IFitResult) fitResult = (IFitResult) mo; else if (mo instanceof ContainerManagedObject) fitResult = (IFitResult) ((ContainerManagedObject) mo).getObject(); } catch (Exception e) { e.printStackTrace(); } return fitResult; } // Service methods private static String toXMLString(Object obj, String path) throws IOException { AidaXMLWriter axw = null; StringWriter writer = new StringWriter(); axw = new AidaXMLWriter(writer); if (obj instanceof IManagedObject) { axw.toXML((IManagedObject) obj, path); } else if (obj instanceof IFitResult) { axw.toXML((IFitResult) obj, path); } if (axw != null) { axw.close(); } return writer.toString(); } private static void parse(String xmlString, IAddable tree, String systemID) throws IOException { AidaHandlerImpl handler = new AidaHandlerImpl(tree, false); EntityResolver er = new AIDAEntityResolver(AidaParser.class, "http://aida.freehep.org/"); AidaParser parser = new AidaParser(handler, er); parser.setValidate(false); ByteArrayInputStream in = new ByteArrayInputStream(xmlString.getBytes()); InputSource is = new InputSource(in); is.setSystemId(systemID); try { parser.parse(is); } catch (IOException ioe) { throw ioe; } catch (Exception e) { IOException ioe2 = new IOException(); ioe2.initCause(e); throw ioe2; } } /* private static class Addable implements IAddable { private IManagedObject mo; private String path; private Addable() { } public void add(String path, IManagedObject mo) throws IllegalArgumentException { this.path = path; this.mo = mo; } public void hasBeenFilled(String path) throws IllegalArgumentException { } public void mkdirs(String path) throws IllegalArgumentException { } public String path() { return path; } public IManagedObject object() { return mo; } } */ }