001    package org.maltparser.core.propagation.spec;
002    
003    import java.io.IOException;
004    import java.net.URL;
005    
006    import javax.xml.parsers.DocumentBuilder;
007    import javax.xml.parsers.DocumentBuilderFactory;
008    import javax.xml.parsers.ParserConfigurationException;
009    
010    import org.maltparser.core.exception.MaltChainedException;
011    import org.maltparser.core.propagation.PropagationException;
012    import org.w3c.dom.Element;
013    import org.w3c.dom.NodeList;
014    import org.xml.sax.SAXException;
015    
016    /**
017     * @author Johan Hall
018     *
019     */
020    public class PropagationSpecsReader {
021            public PropagationSpecsReader() { }
022            
023            public void load(URL url, PropagationSpecs propagationSpecs) throws MaltChainedException {
024            try {
025                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
026                DocumentBuilder db = dbf.newDocumentBuilder();
027                Element root = null;
028    
029                root = db.parse(url.openStream()).getDocumentElement();
030    
031                if (root == null) {
032                    throw new PropagationException("The propagation specification file '"+url.getFile()+"' cannot be found. ");
033                }
034                
035                readPropagationSpecs(root, propagationSpecs);
036            } catch (IOException e) {
037                    throw new PropagationException("The propagation specification file '"+url.getFile()+"' cannot be found. ", e);
038            } catch (ParserConfigurationException e) {
039                    throw new PropagationException("Problem parsing the file "+url.getFile()+". ", e);
040            } catch (SAXException e) {
041                    throw new PropagationException("Problem parsing the file "+url.getFile()+". ", e);
042            }
043            }
044            
045            private void readPropagationSpecs(Element propagations, PropagationSpecs propagationSpecs) throws MaltChainedException {
046                    NodeList propagationList = propagations.getElementsByTagName("propagation");
047                    for (int i = 0; i < propagationList.getLength(); i++) {
048                            readPropagationSpec((Element)propagationList.item(i), propagationSpecs);
049                    }
050            }
051            
052            private void readPropagationSpec(Element propagation, PropagationSpecs propagationSpecs) throws MaltChainedException {
053                    int nFrom = propagation.getElementsByTagName("from").getLength();
054                    if (nFrom < 1 && nFrom > 1) {
055                            throw new PropagationException("Propagation specification wrongly formatted: Number of 'from' elements is '"+nFrom+"', must be 1.");
056                    }
057                    
058                    int nTo = propagation.getElementsByTagName("to").getLength();
059                    if (nTo < 1 && nTo > 1) {
060                            throw new PropagationException("Propagation specification wrongly formatted: Number of 'to' elements is '"+nTo+"', must be 1.");
061                    }
062                    
063                    int nFor = propagation.getElementsByTagName("for").getLength();
064                    if (nFor > 1) {
065                            throw new PropagationException("Propagation specification wrongly formatted: Number of 'for' elements is '"+nFor+"', at most 1.");
066                    }
067                    
068                    int nOver = propagation.getElementsByTagName("over").getLength();
069                    if (nOver > 1) {
070                            throw new PropagationException("Propagation specification wrongly formatted: Number of 'over' elements is '"+nOver+"',at most 1.");
071                    }
072                    String fromText = ((Element)propagation.getElementsByTagName("from").item(0)).getTextContent().trim();
073                    if (fromText.length() == 0) {
074                            throw new PropagationException("Propagation specification wrongly formatted: The 'from' element is empty");
075                    }
076                    String toText = ((Element)propagation.getElementsByTagName("to").item(0)).getTextContent().trim();
077                    if (toText.length() == 0) {
078                            throw new PropagationException("Propagation specification wrongly formatted: The 'to' element is empty");
079                    }
080                    String forText = "";
081                    if (nFor != 0) {
082                            forText = ((Element)propagation.getElementsByTagName("for").item(0)).getTextContent().trim();
083                    }
084                    String overText = "";
085                    if (nOver != 0) {
086                            overText = ((Element)propagation.getElementsByTagName("over").item(0)).getTextContent().trim();
087                    }
088                    propagationSpecs.add(new PropagationSpec(fromText, toText, forText, overText));
089            }
090    }