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    }