001package org.maltparser.core.flow.system;
002
003import java.io.IOException;
004import java.io.InputStream;
005import java.net.MalformedURLException;
006import java.net.URL;
007import java.util.HashMap;
008
009import javax.xml.parsers.DocumentBuilder;
010import javax.xml.parsers.DocumentBuilderFactory;
011import javax.xml.parsers.ParserConfigurationException;
012
013import org.maltparser.core.exception.MaltChainedException;
014import org.maltparser.core.feature.FeatureException;
015import org.maltparser.core.flow.FlowException;
016import org.maltparser.core.flow.system.elem.ChartElement;
017import org.maltparser.core.helper.URLFinder;
018import org.maltparser.core.plugin.Plugin;
019import org.maltparser.core.plugin.PluginLoader;
020import org.w3c.dom.Element;
021import org.w3c.dom.NodeList;
022import org.xml.sax.SAXException;
023/**
024*
025*
026* @author Johan Hall
027*/
028public 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}