This fix needs to go out with the 0.4.0 release. The bug would lead to
invalid Atom documents being produced in certain circumstances using the
StreamWriter.
- James
[EMAIL PROTECTED] wrote:
Author: jmsnell
Date: Sat Mar 22 13:23:52 2008
New Revision: 640073
URL: http://svn.apache.org/viewvc?rev=640073&view=rev
Log:
Fix a pretty serious bug in the StreamWriter implementation that messed up the
serialization of default namespaces and would produce invalid Atom documents
Modified:
incubator/abdera/java/branches/abdera-0.4.0-incubating/parser/src/main/java/org/apache/abdera/parser/stax/StaxStreamWriter.java
Modified:
incubator/abdera/java/branches/abdera-0.4.0-incubating/parser/src/main/java/org/apache/abdera/parser/stax/StaxStreamWriter.java
URL:
http://svn.apache.org/viewvc/incubator/abdera/java/branches/abdera-0.4.0-incubating/parser/src/main/java/org/apache/abdera/parser/stax/StaxStreamWriter.java?rev=640073&r1=640072&r2=640073&view=diff
==============================================================================
---
incubator/abdera/java/branches/abdera-0.4.0-incubating/parser/src/main/java/org/apache/abdera/parser/stax/StaxStreamWriter.java
(original)
+++
incubator/abdera/java/branches/abdera-0.4.0-incubating/parser/src/main/java/org/apache/abdera/parser/stax/StaxStreamWriter.java
Sat Mar 22 13:23:52 2008
@@ -25,6 +25,7 @@
import java.util.Map;
import java.util.Stack;
+import javax.xml.namespace.NamespaceContext;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
@@ -150,6 +151,12 @@
}
}
+ private boolean needToWriteNamespace(String prefix, String namespace) {
+ NamespaceContext nc = writer.getNamespaceContext();
+ String uri = nc.getNamespaceURI(prefix);
+ return uri != null ? !uri.equals(namespace) : true;
+ }
+
public StreamWriter startElement(
String name,
String namespace,
@@ -157,21 +164,24 @@
try {
if (autoindent && textwritten == 0) indent();
push();
- if (prefix != null) {
+ if (prefix != null && !prefix.equals("")) {
writer.writeStartElement(
prefix,
name,
namespace);
+ if (needToWriteNamespace(prefix,namespace))
+ writeNamespace(prefix,namespace,false);
} else if (namespace != null) {
writer.writeStartElement(
"",
name,
namespace);
+ if (needToWriteNamespace(prefix,namespace))
+ writer.writeDefaultNamespace(namespace);
} else {
writer.writeStartElement("",name,"");
writer.writeDefaultNamespace("");
}
- writeNamespace(prefix,namespace,false);
if (autoflush) writer.flush();
} catch(XMLStreamException e) {
throw new RuntimeException(e);
@@ -227,6 +237,26 @@
return writeId(FOMHelper.generateUuid());
}
+ public StreamWriter writeDefaultNamespace(String uri) {
+ try {
+ writer.writeDefaultNamespace(uri);
+ } catch (XMLStreamException e) {
+ throw new RuntimeException(e);
+ }
+ return this;
+ }
+
+ public StreamWriter writeNamespace(
+ String prefix,
+ String uri) {
+ try {
+ writer.writeNamespace(prefix, uri);
+ } catch (XMLStreamException e) {
+ throw new RuntimeException(e);
+ }
+ return this;
+ }
+
public StreamWriter writeAttribute(
String name,
String namespace,