diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | gnu/xml/stream/XIncludeFilter.java | 160 | ||||
-rw-r--r-- | gnu/xml/stream/XMLParser.java | 91 | ||||
-rw-r--r-- | gnu/xml/stream/XMLStreamWriterImpl.java | 2 |
4 files changed, 159 insertions, 100 deletions
@@ -1,3 +1,9 @@ +2005-12-13 Chris Burdess <dog@gnu.org> + + * gnu/xml/stream/XIncludeFilter.java, + gnu/xml/stream/XMLStreamWriterImpl.java, + gnu/xml/stream/XMLParser.java: XInclude fixes. + 2005-12-13 Anthony Balkissoon <abalkiss@redhat.com> * javax/swing/text/html/HTMLDocument.java: diff --git a/gnu/xml/stream/XIncludeFilter.java b/gnu/xml/stream/XIncludeFilter.java index 219e2996a..576af90c5 100644 --- a/gnu/xml/stream/XIncludeFilter.java +++ b/gnu/xml/stream/XIncludeFilter.java @@ -45,6 +45,7 @@ import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.util.HashSet; +import java.util.NoSuchElementException; import java.util.StringTokenizer; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; @@ -101,6 +102,8 @@ class XIncludeFilter Node current; TreeWalker walker; HashSet seen = new HashSet(); + boolean backtracking; + boolean lookahead; Reader includedText; char[] buf; @@ -270,6 +273,13 @@ class XIncludeFilter return super.getName(); } + public String getNamespaceURI() + { + if (current != null) + return current.getNamespaceURI(); + return super.getNamespaceURI(); + } + // TODO namespaces public String getPIData() @@ -366,77 +376,79 @@ class XIncludeFilter public boolean hasNext() throws XMLStreamException { - if (current != null) - return true; - if (walker != null) + if (!lookahead) { - Node n = walker.getCurrentNode(); - if (n.getNodeType() == Node.ELEMENT_NODE) - return true; - Node next = walker.nextNode(); - walker.setCurrentNode(n); - if (next != null) - return true; - } - if (result != null) - { - switch (result.getResultType()) + try { - case XPathResult.BOOLEAN_TYPE: - case XPathResult.NUMBER_TYPE: - case XPathResult.STRING_TYPE: - return true; - case XPathResult.ANY_UNORDERED_NODE_TYPE: - case XPathResult.FIRST_ORDERED_NODE_TYPE: - return result.getSingleNodeValue() != null; - case XPathResult.ORDERED_NODE_ITERATOR_TYPE: - case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: - return !result.getInvalidIteratorState(); - case XPathResult.ORDERED_NODE_SNAPSHOT_TYPE: - case XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE: - return snapshotIndex < result.getSnapshotLength(); + next(); + } + catch (NoSuchElementException e) + { + event = -1; } + lookahead = true; } - if (includedText != null) - return true; - return super.hasNext(); + return (event != -1); } public int next() throws XMLStreamException { + if (lookahead) + { + lookahead = false; + return event; + } + buf = null; + len = 0; if (walker != null) { Node c = walker.getCurrentNode(); - boolean isStartElement = seen.contains(c); - seen.add(c); - if (isStartElement) - return (event = XMLStreamConstants.START_ELEMENT); - Node n = walker.firstChild(); - if (n == null) - n = walker.nextSibling(); + Node n = null; + if (c.getNodeType() == Node.ELEMENT_NODE) + { + boolean isStartElement = !seen.contains(c); + if (isStartElement) + { + seen.add(c); + current = c; + event = XMLStreamConstants.START_ELEMENT; + return event; + } + else if (backtracking) + { + n = walker.nextSibling(); + if (n != null) + backtracking = false; + } + else + { + n = walker.firstChild(); + if (n == null) + n = walker.nextSibling(); + } + } + else + { + n = walker.firstChild(); + if (n == null) + n = walker.nextSibling(); + } if (n == null) { - if (c.getNodeType() == Node.ELEMENT_NODE) + current = walker.parentNode(); + if (current != null && current.getNodeType() == Node.ELEMENT_NODE) { // end-element - seen.remove(c); - do - { - n = walker.parentNode(); - if (n == null) - { - walker = null; - break; - } - n = walker.nextSibling(); - } - while (n == null); - current = c; - return (event = XMLStreamConstants.END_ELEMENT); + backtracking = true; + event = XMLStreamConstants.END_ELEMENT; + return event; } else - current = null; + { + walker = null; + current = null; + } } else { @@ -449,17 +461,24 @@ class XIncludeFilter String text = n.getNodeValue(); buf = text.toCharArray(); len = buf.length; - return (event = isSpace(buf, len) ? - XMLStreamConstants.SPACE : - XMLStreamConstants.CHARACTERS); + event = isSpace(buf, len) ? + XMLStreamConstants.SPACE : + XMLStreamConstants.CHARACTERS; + return event; case Node.CDATA_SECTION_NODE: - return (event = XMLStreamConstants.CDATA); + event = XMLStreamConstants.CDATA; + return event; case Node.COMMENT_NODE: - return (event = XMLStreamConstants.COMMENT); + event = XMLStreamConstants.COMMENT; + return event; case Node.PROCESSING_INSTRUCTION_NODE: - return (event = XMLStreamConstants.PROCESSING_INSTRUCTION); + event = XMLStreamConstants.PROCESSING_INSTRUCTION; + return event; case Node.ENTITY_REFERENCE_NODE: - return (event = XMLStreamConstants.ENTITY_REFERENCE); + event = XMLStreamConstants.ENTITY_REFERENCE; + return event; + default: + throw new IllegalStateException(); } } } @@ -473,22 +492,25 @@ class XIncludeFilter buf = btext.toCharArray(); len = buf.length; result = null; - return (event = XMLStreamConstants.CHARACTERS); + event = XMLStreamConstants.CHARACTERS; + return event; case XPathResult.NUMBER_TYPE: double nval = result.getNumberValue(); String ntext = new Double(nval).toString(); buf = ntext.toCharArray(); len = buf.length; result = null; - return (event = XMLStreamConstants.CHARACTERS); + event = XMLStreamConstants.CHARACTERS; + return event; case XPathResult.STRING_TYPE: String stext = result.getStringValue(); buf = stext.toCharArray(); len = buf.length; result = null; - return (event = isSpace(buf, len) ? - XMLStreamConstants.SPACE : - XMLStreamConstants.CHARACTERS); + event = isSpace(buf, len) ? + XMLStreamConstants.SPACE : + XMLStreamConstants.CHARACTERS; + return event; case XPathResult.ANY_UNORDERED_NODE_TYPE: case XPathResult.FIRST_ORDERED_NODE_TYPE: Node n1 = result.getSingleNodeValue(); @@ -521,6 +543,8 @@ class XIncludeFilter walker = getDocumentTraversal(d3) .createTreeWalker(n3, SHOW_FLAGS, null, expandERefs); return next(); + default: + throw new IllegalStateException(); } } if (includedText != null) @@ -564,7 +588,8 @@ class XIncludeFilter String xpointer = getAttributeValue(null, "xpointer"); String encoding = getAttributeValue(null, "encoding"); String accept = getAttributeValue(null, "accept"); - String acceptLanguage = getAttributeValue(null, "accept-language"); + String acceptLanguage = getAttributeValue(null, + "accept-language"); if (includeResource(href, parse, xpointer, encoding, accept, acceptLanguage)) { @@ -666,6 +691,7 @@ class XIncludeFilter snapshotIndex = 0; walker = null; current = null; + backtracking = false; URLConnection connection = getURLConnection(href, accept, acceptLanguage); @@ -677,7 +703,7 @@ class XIncludeFilter result = null; Node item = doc.getDocumentElement(); walker = dt.createTreeWalker(item, SHOW_FLAGS, null, - expandERefs); + expandERefs); } else { diff --git a/gnu/xml/stream/XMLParser.java b/gnu/xml/stream/XMLParser.java index 233fe9f6c..ba3d64b88 100644 --- a/gnu/xml/stream/XMLParser.java +++ b/gnu/xml/stream/XMLParser.java @@ -82,6 +82,8 @@ import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; +import gnu.java.net.CRLFInputStream; + /** * An XML parser. * @@ -422,7 +424,9 @@ public class XMLParser public String getEncoding() { - return (input.forceReader) ? null : input.inputEncoding; + if (input.forceReader) + return null; + return (input.inputEncoding == null) ? "UTF-8" : input.inputEncoding; } public int getEventType() @@ -506,7 +510,7 @@ public class XMLParser int ci = qName.indexOf(':'); if (ci == -1) return null; - String prefix = qName.substring(ci + 1); + String prefix = qName.substring(0, ci); return getNamespaceURI(prefix); default: return null; @@ -611,7 +615,7 @@ public class XMLParser public String getVersion() { - return xmlVersion; + return (xmlVersion == null) ? "1.0" : xmlVersion; } public boolean hasName() @@ -720,7 +724,14 @@ public class XMLParser { if (!lookahead) { - next(); + try + { + next(); + } + catch (NoSuchElementException e) + { + event = -1; + } lookahead = true; } return event != -1; @@ -2496,57 +2507,64 @@ public class XMLParser public static void main(String[] args) throws Exception { + boolean xIncludeAware = false; + if (args.length > 1 && "-x".equals(args[1])) + xIncludeAware = true; XMLParser p = new XMLParser(new java.io.FileInputStream(args[0]), args[0]); + XMLStreamReader reader = p; + if (xIncludeAware) + reader = new XIncludeFilter(p, args[0], true, true, true); try { int event; - do + //do + while (reader.hasNext()) { - event = p.next(); + event = reader.next(); switch (event) { case XMLStreamConstants.START_DOCUMENT: - System.out.println("START_DOCUMENT version="+p.getVersion()+ - " encoding="+p.getEncoding()); + System.out.println("START_DOCUMENT version="+reader.getVersion()+ + " encoding="+reader.getEncoding()); break; case XMLStreamConstants.END_DOCUMENT: System.out.println("END_DOCUMENT"); break; case XMLStreamConstants.START_ELEMENT: - System.out.println("START_ELEMENT "+p.getName()); - int l = p.getNamespaceCount(); + System.out.println("START_ELEMENT "+reader.getName()); + int l = reader.getNamespaceCount(); for (int i = 0; i < l; i++) - System.out.println("\tnamespace "+p.getNamespacePrefix(i)+ - "='"+p.getNamespaceURI(i)+"'"); - l = p.getAttributeCount(); + System.out.println("\tnamespace "+reader.getNamespacePrefix(i)+ + "='"+reader.getNamespaceURI(i)+"'"); + l = reader.getAttributeCount(); for (int i = 0; i < l; i++) - System.out.println("\tattribute "+p.getAttributeQName(i)+ - "='"+p.getAttributeValue(i)+"'"); + System.out.println("\tattribute "+reader.getAttributeQName(i)+ + "='"+reader.getAttributeValue(i)+"'"); break; case XMLStreamConstants.END_ELEMENT: - System.out.println("END_ELEMENT "+p.getName()); + System.out.println("END_ELEMENT "+reader.getName()); break; case XMLStreamConstants.CHARACTERS: - System.out.println("CHARACTERS '"+p.getText()+"'"); + System.out.println("CHARACTERS '"+reader.getText()+"'"); break; case XMLStreamConstants.CDATA: - System.out.println("CDATA '"+p.getText()+"'"); + System.out.println("CDATA '"+reader.getText()+"'"); break; case XMLStreamConstants.SPACE: - System.out.println("SPACE '"+p.getText()+"'"); + System.out.println("SPACE '"+reader.getText()+"'"); break; case XMLStreamConstants.DTD: - System.out.println("DTD "+p.getText()); + System.out.println("DTD "+reader.getText()); break; case XMLStreamConstants.ENTITY_REFERENCE: - System.out.println("ENTITY_REFERENCE "+p.getText()); + System.out.println("ENTITY_REFERENCE "+reader.getText()); break; case XMLStreamConstants.COMMENT: - System.out.println("COMMENT '"+p.getText()+"'"); + System.out.println("COMMENT '"+reader.getText()+"'"); break; case XMLStreamConstants.PROCESSING_INSTRUCTION: - System.out.println("PROCESSING_INSTRUCTION "+p.getPITarget()+ - " "+p.getPIData()); + System.out.println("PROCESSING_INSTRUCTION "+reader.getPITarget()+ + " "+reader.getPIData()); break; case XMLStreamConstants.START_ENTITY: System.out.println("START_ENTITY"); @@ -2558,11 +2576,11 @@ public class XMLParser System.out.println("Unknown event: "+event); } } - while (event != -1 && event != XMLStreamConstants.END_DOCUMENT); + //while (event != XMLStreamConstants.END_DOCUMENT); } catch (XMLStreamException e) { - Location l = p.getLocation(); + Location l = reader.getLocation(); System.out.println("At line "+l.getLineNumber()+ ", column "+l.getColumnNumber()+ " of "+l.getLocationURI()); @@ -2698,6 +2716,7 @@ public class XMLParser { try { + in = new CRLFInputStream(in); reader = new XMLInputStreamReader(in, defaultEncoding); } catch (UnsupportedEncodingException e) @@ -2710,8 +2729,10 @@ public class XMLParser } } else - forceReader = true; - reader = new CRLFReader(reader); + { + forceReader = true; + reader = new CRLFReader(reader); + } this.reader = reader; } @@ -2725,7 +2746,7 @@ public class XMLParser void mark(int len) throws IOException { - //System.out.println("mark"); + //System.out.println(" mark:"+len); markOffset = offset; markLine = line; markColumn = column; @@ -2784,7 +2805,7 @@ public class XMLParser void reset() throws IOException { - //System.out.println("reset"); + //System.out.println(" reset"); reader.reset(); offset = markOffset; line = markLine; @@ -2884,9 +2905,13 @@ public class XMLParser private void setInputEncoding(String encoding) throws UnsupportedEncodingException { - inputEncoding = encoding; - reader = new XMLInputStreamReader((XMLInputStreamReader) reader, encoding); - reader = new CRLFReader(reader); + if (!encoding.equals(inputEncoding) && + reader instanceof XMLInputStreamReader) + { + inputEncoding = encoding; + reader = new XMLInputStreamReader((XMLInputStreamReader) reader, + encoding); + } } } diff --git a/gnu/xml/stream/XMLStreamWriterImpl.java b/gnu/xml/stream/XMLStreamWriterImpl.java index d677048cf..6157296c6 100644 --- a/gnu/xml/stream/XMLStreamWriterImpl.java +++ b/gnu/xml/stream/XMLStreamWriterImpl.java @@ -282,6 +282,8 @@ public class XMLStreamWriterImpl public void writeEndElement() throws XMLStreamException { + if (elements.isEmpty()) + throw new IllegalStateException("no matching start element"); try { endStartElement(); |