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 }