summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--gnu/xml/stream/XIncludeFilter.java160
-rw-r--r--gnu/xml/stream/XMLParser.java91
-rw-r--r--gnu/xml/stream/XMLStreamWriterImpl.java2
4 files changed, 159 insertions, 100 deletions
diff --git a/ChangeLog b/ChangeLog
index ad84ed418..3131a9314 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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();