001    package org.maltparser.core.flow;
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.spec.ChartSpecification;
016    import org.maltparser.core.flow.system.FlowChartSystem;
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 FlowChartManager {
029            private static FlowChartManager uniqueInstance = new FlowChartManager();
030            private final FlowChartSystem flowChartSystem; 
031            private final HashMap<String,ChartSpecification> chartSpecifications;
032            
033            public FlowChartManager() {
034                    flowChartSystem = new FlowChartSystem();
035                    chartSpecifications = new HashMap<String,ChartSpecification>();
036            }
037            
038            /**
039            * Returns a reference to the single instance.
040            */
041            public static FlowChartManager instance() {
042                    return uniqueInstance;
043            }
044            
045            public void load(String urlstring) throws MaltChainedException {
046                    load(Util.findURL(urlstring));
047            }
048            
049            public void load(PluginLoader plugins) throws MaltChainedException {
050                     for (Plugin plugin : plugins) {
051                            URL url = null;
052                            try {
053                                    url = new URL("jar:"+plugin.getUrl() + "!/appdata/plugin.xml");
054                            } catch (MalformedURLException e) {
055                                    throw new FeatureException("Malformed URL: 'jar:"+plugin.getUrl() + "!plugin.xml'", e);
056                            }
057                            try { 
058                                    InputStream is = url.openStream();
059                                    is.close();
060                            } catch (IOException e) {
061                                    continue;
062                            }
063    
064                            load(url);
065                    }
066            }
067            
068            public void load(URL url) throws MaltChainedException {
069            try {
070                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
071                DocumentBuilder db = dbf.newDocumentBuilder();
072                Element root = null;
073    
074                root = db.parse(url.openStream()).getDocumentElement();
075                if (root == null) {
076                    throw new FlowException("The flow chart specification file '"+url.getFile()+"' cannot be found. ");
077                }
078                readFlowCharts(root);
079            } catch (IOException e) {
080                    throw new FlowException("The flow chart specification file '"+url.getFile()+"' cannot be found. ", e);
081            } catch (ParserConfigurationException e) {
082                    throw new FlowException("Problem parsing the flow chart file "+url.getFile()+". ", e);
083            } catch (SAXException e) {
084                    throw new FlowException("Problem parsing the flow chart file "+url.getFile()+". ", e);
085            }
086            }
087            
088            private void readFlowCharts(Element flowcharts) throws MaltChainedException {
089                    NodeList flowChartList = flowcharts.getElementsByTagName("flowchart");
090                    for (int i = 0; i < flowChartList.getLength(); i++) {
091                            String flowChartName = ((Element)flowChartList.item(i)).getAttribute("name");
092                            if (!chartSpecifications.containsKey(flowChartName)) {
093                                    ChartSpecification chart = new ChartSpecification();
094                                    chartSpecifications.put(flowChartName, chart);
095                                    chart.read((Element)flowChartList.item(i), this);
096                            } else {
097                                    throw new FlowException("Problem parsing the flow chart file. The flow chart with the name "+flowChartName+" already exists. ");
098                            }
099                    }
100            }
101    
102            public FlowChartInstance initialize(int optionContainerIndex, String flowChartName) throws MaltChainedException {
103                    return new FlowChartInstance(optionContainerIndex, chartSpecifications.get(flowChartName), this);
104            }
105            
106            public FlowChartSystem getFlowChartSystem() {
107                    return flowChartSystem;
108            }
109            
110            public String toString() {
111                    final StringBuilder sb = new StringBuilder();
112                    sb.append("FLOW CHART SYSTEM\n");
113                    sb.append(flowChartSystem);
114                    sb.append('\n');
115                    sb.append("FLOW CHARTS:\n");
116                    for (String key : chartSpecifications.keySet()) {
117                            sb.append(chartSpecifications.get(key));
118                            sb.append('\n');
119                    }
120                    return sb.toString();
121            }
122            
123    }