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}