package hep.aida.ref.plotter.style.registry;

import hep.aida.IAnalysisFactory;
import hep.aida.IBaseStyle;
import hep.aida.IPlotterFactory;
import hep.aida.IPlotterStyle;
import hep.aida.ref.AidaUtils;
import hep.aida.ref.plotter.BaseStyle;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.lang.reflect.Method;
import java.net.URL;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
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;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;

public class StyleStoreXMLReader {
    private Element rootElement;
    private IPlotterFactory plotterFactory;
    
    // Convenience static method for restoring IStyleStore directly from XML file on disk or on the net
    
    public static IStyleStore restoreFromFile(String fileName) throws IOException, JDOMException  {
        boolean readOnly = false;
        String normalFileName = new String(fileName);
        String protocol = fileName.substring(0, 4);
        if (protocol.equalsIgnoreCase("http") || protocol.equalsIgnoreCase("ftp:")) {
            readOnly = true;
            normalFileName = null;
        } else if (protocol.equalsIgnoreCase("file")) {
            normalFileName = fileName.substring(5);
            File file = new File(normalFileName);
            if (!file.canWrite()) readOnly = true;
        } else {
            File file = new File(normalFileName);
            if (!file.canWrite()) readOnly = true;
            fileName = "file:"+fileName;
        }
        URL source = new URL(fileName);
        BufferedReader reader = new BufferedReader(new InputStreamReader(source.openStream()));
        StyleStoreXMLReader xmlReader = new StyleStoreXMLReader(reader);
        
        XMLStyleStore store = xmlReader.createXMLStyleStore();
        
        // Set Store as "Read-Only" if file is on the web, or is not writable
        //System.out.println("XMLStyleStore :: isReadOnly="+readOnly+", file="+normalFileName);
        //store.setReadOnly(readOnly);
        store.setCommitFileName(normalFileName);
        return store;
    }
    
    public static IStyleStore restoreFromDB(String url, String user, String pass, String table, String column) throws Exception  {
        boolean readOnly = false;
        String normalFileName = new String(url);
        
        System.out.println("fileName="+url+", user="+user+", pass="+pass);
        
        Class.forName("oracle.jdbc.driver.OracleDriver");
        Connection connection = DriverManager.getConnection(url, user, pass);
        
        Statement stRead = connection.createStatement();
        ResultSet rs = stRead.executeQuery("SELECT * FROM "+table);
        rs.next();
        Clob clob = rs.getClob(column);
        
        Reader reader = clob.getCharacterStream();
        StyleStoreXMLReader xmlReader = new StyleStoreXMLReader(reader);
        
        XMLStyleStore store = xmlReader.createXMLStyleStore();
        
        store.setCommitFileName(normalFileName);
        return store;
    }
    
    public static IStyleStore restoreFromStream(InputStream stream) throws IOException, JDOMException  {
        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
        StyleStoreXMLReader xmlReader = new StyleStoreXMLReader(reader);
        
        XMLStyleStore store = xmlReader.createXMLStyleStore();
        
        return store;
    }
    
    
    
    public StyleStoreXMLReader(Reader reader) throws IOException, JDOMException {
        SAXBuilder builder  = new SAXBuilder();
        builder.setValidation(false);
        
        EntityResolver resolver = new EntityResolver() {
            public InputSource resolveEntity(String publicId, String systemId) {
                InputStream in = getClass().getResourceAsStream(
                        "/hep/aida/ref/xml/StyleStoreDTD.dtd"
                        );
                return new InputSource( in );
            }
        };
        
        builder.setEntityResolver(resolver);
        //builder.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
        Document   doc      = builder.build(reader);
        rootElement = doc.getRootElement();
        plotterFactory = IAnalysisFactory.create().createPlotterFactory();
    }
    
    XMLStyleStore createXMLStyleStore() {
        XMLStyleStore store = null;
        String storeName = rootElement.getAttributeValue("storeName");
        String storeType = rootElement.getAttributeValue("storeType");
        boolean isReadOnly  = true;
        String tmp = rootElement.getAttributeValue("isReadOnly");
        if (tmp.equalsIgnoreCase("false")) isReadOnly = false;
        
        store = new XMLStyleStore(storeName, storeType, isReadOnly);
        
        List children = rootElement.getChildren();
        Iterator   it = children.iterator();
        while (it.hasNext()) {
            Element childElement = (Element) it.next();
            String name = childElement.getName();
            
            if (name.equals("aidaStyleStoreEntry")) {
                try {
                    StyleStoreEntry entry = createStoreEntry(childElement);
                    store.addStoreEntry(entry);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return store;
    }
    
    StyleStoreEntry createStoreEntry(Element el) {
        StyleStoreEntry entry = null;
        if (!el.getName().equals("aidaStyleStoreEntry"))
            throw new IllegalArgumentException("StyleStoreXMLReader.createStoreEntry :: wrong element name: "+el.getName()+" ... do nothing here");
        
        String name = el.getAttributeValue("entryName");
        String type = el.getAttributeValue("entryType");
        if (type == null || type.trim().equals("")) type = StyleStoreEntry.DEFAULT_ENTRY_TYPE;
        IStyleRule rule = createRule(el.getChild("aidaStyleRule"));
        IPlotterStyle style = createStyle(el.getChild("aidaPlotterStyle"));
        entry = new StyleStoreEntry(name, style, rule);
        Class previewType = null;
        try {
            previewType = Class.forName(type);
        } catch (Exception e) { e.printStackTrace(); }
        if (previewType != null) entry.setPreviewType(previewType);
        return entry;
    }
    
    IStyleRule createRule(Element el) {
        IStyleRule rule = null;
        if (!el.getName().equals("aidaStyleRule"))
            throw new IllegalArgumentException("StyleStoreXMLReader.createRule :: wrong element name: "+el.getName()+" ... do nothing here");
        
        String value = el.getAttributeValue("ruleValue");
        String type = el.getAttributeValue("ruleType");
        
        rule = new JELRule(value);
        ((JELRule) rule).setType(type);
        return rule;
    }
    
    IPlotterStyle createStyle(Element el) {
        IPlotterStyle style = plotterFactory.createPlotterStyle();
        setStyle(style, el);
        return style;
    }
    
    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");
        String optionsString = el.getAttributeValue("attributeOptions");
        if (value != null && value.equalsIgnoreCase("null")) value = null;
        
        if (optionsString == null || optionsString.trim().equals("") || !(style instanceof BaseStyle))
            style.setParameter(name, value);
        else {
            String[] options = AidaUtils.parseString(optionsString);
            ((BaseStyle) style).setParameter(name, value, options);
        }
    }
    
}

 

Ads help maintain this website.