    001    package org.maltparser.core.flow.system;
    002
    003    import java.io.IOException;
    004    import java.io.InputStream;
    005    import java.net.MalformedURLException;
    006    import java.net.URL;
    007    import java.util.HashMap;
    008
    009    import javax.xml.parsers.DocumentBuilder;
    010    import javax.xml.parsers.DocumentBuilderFactory;
    011    import javax.xml.parsers.ParserConfigurationException;
    012
    013    import org.maltparser.core.exception.MaltChainedException;
    014    import org.maltparser.core.feature.FeatureException;
    015    import org.maltparser.core.flow.FlowException;
    016    import org.maltparser.core.flow.system.elem.ChartElement;
    017    import org.maltparser.core.helper.URLFinder;
    018    import org.maltparser.core.plugin.Plugin;
    019    import org.maltparser.core.plugin.PluginLoader;
    020    import org.w3c.dom.Element;
    021    import org.w3c.dom.NodeList;
    022    import org.xml.sax.SAXException;
    023    /**
    024    *
    025    *
    026    * @author Johan Hall
    027    */
    028    public class FlowChartSystem {
    029            private HashMap<String,ChartElement> chartElements;
    030
    031            public FlowChartSystem() {
    032                    chartElements = new HashMap<String,ChartElement>();
    033            }
    034
    035            public void load(String urlstring) throws MaltChainedException {
    036                    final URLFinder f = new URLFinder();
    037                    load(f.findURL(urlstring));
    038            }
    039
    040            public void load(PluginLoader plugins) throws MaltChainedException {
    041                     for (Plugin plugin : plugins) {
    042                            URL url = null;
    043                            try {
    044                                    url = new URL("jar:"+plugin.getUrl() + "!/appdata/plugin.xml");
    045                            } catch (MalformedURLException e) {
    046                                    throw new FeatureException("Malformed URL: 'jar:"+plugin.getUrl() + "!plugin.xml'", e);
    047                            }
    048                            try {
    049                                    InputStream is = url.openStream();
    050                                    is.close();
    051                            } catch (IOException e) {
    052                                    continue;
    053                            }
    054
    055                            load(url);
    056                    }
    057            }
    058
    059            public void load(URL specModelURL) throws MaltChainedException {
    060            try {
    061                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    062                DocumentBuilder db = dbf.newDocumentBuilder();
    063                Element root = null;
    064
    065                root = db.parse(specModelURL.openStream()).getDocumentElement();
    066
    067                if (root == null) {
    068                    throw new FlowException("The flow chart system file '"+specModelURL.getFile()+"' cannot be found. ");
    069                }
    070
    071                readChartElements(root);
    072            } catch (IOException e) {
    073                    throw new FlowException("The flow chart system file '"+specModelURL.getFile()+"' cannot be found. ", e);
    074            } catch (ParserConfigurationException e) {
    075                    throw new FlowException("Problem parsing the file "+specModelURL.getFile()+". ", e);
    076            } catch (SAXException e) {
    077                    throw new FlowException("Problem parsing the file "+specModelURL.getFile()+". ", e);
    078            }
    079            }
    080
    081            public void readChartElements(Element root) throws MaltChainedException {
    082                    NodeList chartElem = root.getElementsByTagName("chartelement");
    083                    for (int i = 0; i < chartElem.getLength(); i++) {
    084                            ChartElement chartElement = new ChartElement();
    085                            chartElement.read((Element)chartElem.item(i), this);
    086                            chartElements.put(((Element)chartElem.item(i)).getAttribute("item"),chartElement);
    087                    }
    088            }
    089
    090            public ChartElement getChartElement(String name) {
    091                    return chartElements.get(name);
    092            }
    093
    094
    095            public String toString() {
    096                    StringBuilder sb = new StringBuilder();
    097                    sb.append("CHART ELEMENTS:\n");
    098                    for (String key : chartElements.keySet()) {
    099                            sb.append(chartElements.get(key));
    100                            sb.append('\n');
    101                    }
    102                    return sb.toString();
    103            }
    104    }