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);