package org.maltparser.core.flow;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.maltparser.core.exception.MaltChainedException;
import org.maltparser.core.feature.FeatureException;
import org.maltparser.core.flow.spec.ChartSpecification;
import org.maltparser.core.flow.system.FlowChartSystem;
import org.maltparser.core.helper.URLFinder;
import org.maltparser.core.plugin.Plugin;
import org.maltparser.core.plugin.PluginLoader;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
*
*
* @author Johan Hall
*/
public class FlowChartManager {
private static FlowChartManager uniqueInstance = new FlowChartManager();
private final FlowChartSystem flowChartSystem;
private final HashMap<String, ChartSpecification> chartSpecifications;
public FlowChartManager() {
flowChartSystem = new FlowChartSystem();
chartSpecifications = new HashMap<String, ChartSpecification>();
}
/**
* Returns a reference to the single instance.
*/
public static FlowChartManager instance() {
return uniqueInstance;
}
public void load(String urlstring) throws MaltChainedException {
final URLFinder f = new URLFinder();
load(f.findURL(urlstring));
}
public void load(PluginLoader plugins) throws MaltChainedException {
for (Plugin plugin : plugins) {
URL url = null;
try {
url = new URL("jar:" + plugin.getUrl() + "!/appdata/plugin.xml");
} catch (MalformedURLException e) {
throw new FeatureException("Malformed URL: 'jar:" + plugin.getUrl() + "!plugin.xml'", e);
}
try {
InputStream is = url.openStream();
is.close();
} catch (IOException e) {
continue;
}
load(url);
}
}
public void load(URL url) throws MaltChainedException {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Element root = db.parse(url.openStream()).getDocumentElement();
if (root == null) {
throw new FlowException("The flow chart specification file '" + url.getFile() + "' cannot be found. ");
}
readFlowCharts(root);
} catch (IOException e) {
throw new FlowException("The flow chart specification file '" + url.getFile() + "' cannot be found. ", e);
} catch (ParserConfigurationException e) {
throw new FlowException("Problem parsing the flow chart file " + url.getFile() + ". ", e);
} catch (SAXException e) {
throw new FlowException("Problem parsing the flow chart file " + url.getFile() + ". ", e);
}
}
private void readFlowCharts(Element flowcharts) throws MaltChainedException {
NodeList flowChartList = flowcharts.getElementsByTagName("flowchart");
for (int i = 0; i < flowChartList.getLength(); i++) {
String flowChartName = ((Element) flowChartList.item(i)).getAttribute("name");
if (!chartSpecifications.containsKey(flowChartName)) {
ChartSpecification chart = new ChartSpecification();
chartSpecifications.put(flowChartName, chart);
chart.read((Element) flowChartList.item(i), this);
} else {
throw new FlowException("Problem parsing the flow chart file. The flow chart with the name " + flowChartName + " already exists. ");
}
}
}
public FlowChartInstance initialize(int optionContainerIndex, String flowChartName) throws MaltChainedException {
return new FlowChartInstance(optionContainerIndex, chartSpecifications.get(flowChartName), this);
}
public FlowChartSystem getFlowChartSystem() {
return flowChartSystem;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("FLOW CHART SYSTEM\n");
sb.append(flowChartSystem);
sb.append('\n');
sb.append("FLOW CHARTS:\n");
for (String key : chartSpecifications.keySet()) {
sb.append(chartSpecifications.get(key));
sb.append('\n');
}
return sb.toString();
}
}