    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.Util;
    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                    load(Util.findURL(urlstring));
    037            }
    038
    039            public void load(PluginLoader plugins) throws MaltChainedException {
    040                     for (Plugin plugin : plugins) {
    041                            URL url = null;
    042                            try {
    043                                    url = new URL("jar:"+plugin.getUrl() + "!/appdata/plugin.xml");
    044                            } catch (MalformedURLException e) {
    045                                    throw new FeatureException("Malformed URL: 'jar:"+plugin.getUrl() + "!plugin.xml'", e);
    046                            }
    047                            try {
    048                                    InputStream is = url.openStream();
    049                                    is.close();
    050                            } catch (IOException e) {
    051                                    continue;
    052                            }
    053
    054                            load(url);
    055                    }
    056            }
    057
    058            public void load(URL specModelURL) throws MaltChainedException {
    059            try {
    060                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    061                DocumentBuilder db = dbf.newDocumentBuilder();
    062                Element root = null;
    063
    064                root = db.parse(specModelURL.openStream()).getDocumentElement();
    065
    066                if (root == null) {
    067                    throw new FlowException("The flow chart system file '"+specModelURL.getFile()+"' cannot be found. ");
    068                }
    069
    070                readChartElements(root);
    071            } catch (IOException e) {
    072                    throw new FlowException("The flow chart system file '"+specModelURL.getFile()+"' cannot be found. ", e);
    073            } catch (ParserConfigurationException e) {
    074                    throw new FlowException("Problem parsing the file "+specModelURL.getFile()+". ", e);
    075            } catch (SAXException e) {
    076                    throw new FlowException("Problem parsing the file "+specModelURL.getFile()+". ", e);
    077            }
    078            }
    079
    080            public void readChartElements(Element root) throws MaltChainedException {
    081                    NodeList chartElem = root.getElementsByTagName("chartelement");
    082                    for (int i = 0; i < chartElem.getLength(); i++) {
    083                            ChartElement chartElement = new ChartElement();
    084                            chartElement.read((Element)chartElem.item(i), this);
    085                            chartElements.put(((Element)chartElem.item(i)).getAttribute("item"),chartElement);
    086                    }
    087            }
    088
    089            public ChartElement getChartElement(String name) {
    090                    return chartElements.get(name);
    091            }
    092
    093
    094            public String toString() {
    095                    StringBuilder sb = new StringBuilder();
    096                    sb.append("CHART ELEMENTS:\n");
    097                    for (String key : chartElements.keySet()) {
    098                            sb.append(chartElements.get(key));
    099                            sb.append('\n');
    100                    }
    101                    return sb.toString();
    102            }
    103    }