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 = "\n";
            tmp += "\n";
            tmp += "\n";
        tmp += "\n";
        tmp += "\n";
        tmp += "\n";
        tmp += "\n";
        tmp += "\n";
            tmp += "\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);
    }
    
}

 

Ads help maintain this website.