You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2014/05/07 15:42:59 UTC
git commit: [OLINGO-231] Fixed namespace problems
Repository: olingo-odata2
Updated Branches:
refs/heads/OLINGO-231_PocForAndroid c321fb745 -> 67c0bd1b7
[OLINGO-231] Fixed namespace problems
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/67c0bd1b
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/67c0bd1b
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/67c0bd1b
Branch: refs/heads/OLINGO-231_PocForAndroid
Commit: 67c0bd1b72a1724bf1d6f9a83954b80e919d9801
Parents: c321fb7
Author: Michael Bolz <mi...@sap.com>
Authored: Wed May 7 10:03:58 2014 +0200
Committer: Michael Bolz <mi...@sap.com>
Committed: Wed May 7 10:03:58 2014 +0200
----------------------------------------------------------------------
.../odata2/android/xml/AndroidXmlWriter.java | 112 +++++++++++++------
.../android/xml/AndroidXmlWriterTest.java | 1 -
2 files changed, 77 insertions(+), 36 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/67c0bd1b/odata2-android/src/main/java/org/apache/olingo/odata2/android/xml/AndroidXmlWriter.java
----------------------------------------------------------------------
diff --git a/odata2-android/src/main/java/org/apache/olingo/odata2/android/xml/AndroidXmlWriter.java b/odata2-android/src/main/java/org/apache/olingo/odata2/android/xml/AndroidXmlWriter.java
index 0e8887d..2ec14d1 100644
--- a/odata2-android/src/main/java/org/apache/olingo/odata2/android/xml/AndroidXmlWriter.java
+++ b/odata2-android/src/main/java/org/apache/olingo/odata2/android/xml/AndroidXmlWriter.java
@@ -25,7 +25,6 @@ import org.xmlpull.v1.XmlSerializer;
import java.io.IOException;
import java.io.OutputStream;
-import java.io.PrintWriter;
import java.io.Writer;
import java.util.Map;
import java.util.Stack;
@@ -38,8 +37,7 @@ public class AndroidXmlWriter implements XMLStreamWriter {
private static final String DEFAULT_VERSION = "1.0";
private final XmlSerializer serializer;
- private final Stack<String> tags;
- private final Stack<String> namespaces;
+ private final Stack<TagHandle> tagStack;
private String defaultNamespace = null;
@@ -49,8 +47,7 @@ public class AndroidXmlWriter implements XMLStreamWriter {
public AndroidXmlWriter(Object output, String encoding) throws XMLStreamException {
serializer = Xml.newSerializer();
- tags = new Stack<String>();
- namespaces = new Stack<String>();
+ tagStack = new Stack<TagHandle>();
try {
if (output instanceof OutputStream) {
@@ -76,10 +73,6 @@ public class AndroidXmlWriter implements XMLStreamWriter {
throw new XMLStreamException(message, e);
}
- private String nextTagToClose() {
- return tags.pop();
- }
-
public AndroidXmlWriter setProperties(Map<String, Object> properties) throws XMLStreamException {
for (Map.Entry<String, Object> entry : properties.entrySet()) {
setProperty(entry.getKey(), entry.getValue());
@@ -154,7 +147,15 @@ public class AndroidXmlWriter implements XMLStreamWriter {
public void writeAttribute(String prefix, String namespaceURI, String localName, String value)
throws XMLStreamException {
try {
- writeCurrentTag();
+ if(prefix != null && serializer.getPrefix(namespaceURI, false) == null) {
+ setPrefix(prefix, namespaceURI);
+ }
+ ensureTagWritten();
+ if(namespaceURI != null
+ && namespaceURI.equals(serializer.getNamespace())
+ && namespaceURI.equals(defaultNamespace)) {
+ namespaceURI = null;
+ }
serializer.attribute(namespaceURI, localName, value);
} catch (Exception e) {
wrapAndReThrow(e);
@@ -185,18 +186,22 @@ public class AndroidXmlWriter implements XMLStreamWriter {
}
private String nextNamespaceUriToWrite() {
- return nextNamespaceUriToWrite(true);
- }
-
- private String nextNamespaceUriToWrite(boolean keep) {
- if(namespaces.isEmpty()) {
- return defaultNamespace;
+ if(tagStack.isEmpty()) {
+ return null;
}
- if(keep) {
- return namespaces.peek();
- }
- return namespaces.pop();
+ TagHandle tag = tagStack.peek();
+ return tag.namespaceUri;
}
+//
+// private String nextNamespaceUriToWrite(boolean keep) {
+// if(namespaces.isEmpty()) {
+// return defaultNamespace;
+// }
+// if(keep) {
+// return namespaces.peek();
+// }
+// return namespaces.pop();
+// }
@Override
public void writeStartElement(String namespaceURI, String localName) throws XMLStreamException {
@@ -208,17 +213,11 @@ public class AndroidXmlWriter implements XMLStreamWriter {
}
}
- TagHandle currentTag = null;
-
@Override
public void writeStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
try {
- writeCurrentTag();
- //
- tags.push(localName);
- namespaces.push(namespaceURI);
- //
- currentTag = new TagHandle(localName, namespaceURI, prefix);
+ ensureTagWritten();
+ createTag(prefix, localName, namespaceURI);
} catch (Exception e) {
wrapAndReThrow(e);
}
@@ -236,8 +235,8 @@ public class AndroidXmlWriter implements XMLStreamWriter {
@Override
public void writeEndElement() throws XMLStreamException {
try {
- writeCurrentTag();
- serializer.endTag(nextNamespaceUriToWrite(false), nextTagToClose());
+ ensureTagWritten();
+ endTag();
} catch (Exception e) {
wrapAndReThrow(e);
}
@@ -255,18 +254,42 @@ public class AndroidXmlWriter implements XMLStreamWriter {
@Override
public void writeCharacters(String text) throws XMLStreamException {
try {
- writeCurrentTag();
+ ensureTagWritten();
serializer.text(text);
} catch (Exception e) {
wrapAndReThrow(e);
}
}
- private void writeCurrentTag() throws XMLStreamException {
+ private void createTag(String prefix, String localName, String namespaceURI) {
+ if(namespaceURI == null) {
+ namespaceURI = defaultNamespace;
+ }
+ TagHandle tag = new TagHandle(localName, namespaceURI, prefix);
+ tagStack.push(tag);
+ }
+
+ private void ensureTagWritten() throws XMLStreamException {
+ try {
+ if(!tagStack.isEmpty()) {
+ TagHandle tag = tagStack.peek();
+ if(!tag.written) {
+ String uri = tag.namespaceUri == null? defaultNamespace: tag.namespaceUri;
+ serializer.startTag(uri, tag.name);
+ tag.written = true;
+ }
+ }
+ } catch (Exception e) {
+ wrapAndReThrow(e);
+ }
+ }
+
+ private void endTag() throws XMLStreamException {
try {
- if(currentTag != null) {
- serializer.startTag(currentTag.namespaceUri, currentTag.name);
- currentTag = null;
+ if(!tagStack.isEmpty()) {
+ TagHandle tag = tagStack.pop();
+ String uri = tag.namespaceUri == null? defaultNamespace: tag.namespaceUri;
+ serializer.endTag(uri, tag.name);
}
} catch (Exception e) {
wrapAndReThrow(e);
@@ -277,11 +300,30 @@ public class AndroidXmlWriter implements XMLStreamWriter {
final String name;
final String namespaceUri;
final String namespacePrefix;
+ boolean written = false;
private TagHandle(String name, String namespaceUri, String namespacePrefix) {
this.name = name;
this.namespaceUri = namespaceUri;
this.namespacePrefix = namespacePrefix;
}
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder("<");
+ if(namespacePrefix != null) {
+ sb.append(namespacePrefix).append(":");
+ }
+ sb.append(name).append(" ");
+ if(namespaceUri != null) {
+ sb.append("xmlns=");
+ if(namespacePrefix != null) {
+ sb.append(namespacePrefix).append(":");
+ }
+ sb.append(namespaceUri);
+ }
+ sb.append(">");
+ return sb.toString();
+ }
}
}
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/67c0bd1b/odata2-android/src/test/java/org/apache/olingo/odata2/android/xml/AndroidXmlWriterTest.java
----------------------------------------------------------------------
diff --git a/odata2-android/src/test/java/org/apache/olingo/odata2/android/xml/AndroidXmlWriterTest.java b/odata2-android/src/test/java/org/apache/olingo/odata2/android/xml/AndroidXmlWriterTest.java
index 0eb376c..825ff5d 100644
--- a/odata2-android/src/test/java/org/apache/olingo/odata2/android/xml/AndroidXmlWriterTest.java
+++ b/odata2-android/src/test/java/org/apache/olingo/odata2/android/xml/AndroidXmlWriterTest.java
@@ -108,7 +108,6 @@ public class AndroidXmlWriterTest {
StringHelper.Stream content = StringHelper.toStream(entry.getEntity());
String xmlString = content.asString();
- System.out.println(xmlString);
assertXpathEvaluatesTo(Edm.NAMESPACE_ATOM_2005, "/*/namespace::*[name()='']", xmlString);