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