YANGTOOLS-804: Netconf payload fails to render in JSON for anyxml
[yangtools.git] / yang / yang-data-codec-gson / src / main / java / org / opendaylight / yangtools / yang / data / codec / gson / JSONNormalizedNodeStreamWriter.java
index 23aa8565c4ded44484efc5e03db486ba74cd6ce2..6311b7ce54c1744d092d9579c7ee3c8fe4d7b904 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.yangtools.yang.data.codec.gson;
 
 import static java.util.Objects.requireNonNull;
-import static org.opendaylight.yangtools.yang.data.codec.gson.JsonParserStream.ANYXML_ARRAY_ELEMENT_ID;
 import static org.w3c.dom.Node.ELEMENT_NODE;
 import static org.w3c.dom.Node.TEXT_NODE;
 
@@ -278,34 +277,69 @@ public abstract class JSONNormalizedNodeStreamWriter implements NormalizedNodeSt
     }
 
     private void writeXmlNode(final Node node) throws IOException {
+        if (isArrayElement(node)) {
+            writeArrayContent(node);
+            return;
+        }
         final Element firstChildElement = getFirstChildElement(node);
         if (firstChildElement == null) {
             writeXmlValue(node);
-        } else if (ANYXML_ARRAY_ELEMENT_ID.equals(firstChildElement.getNodeName())) {
-            writer.beginArray();
-            writeArray(firstChildElement);
-            writer.endArray();
         } else {
-            writer.beginObject();
-            writeObject(firstChildElement);
-            writer.endObject();
+            writeObjectContent(firstChildElement);
         }
     }
 
-    private void writeArray(Node node) throws IOException {
-        while (node != null) {
-            if (ELEMENT_NODE == node.getNodeType()) {
-                writeXmlNode(node);
+    private void writeArrayContent(final Node node) throws IOException {
+        writer.beginArray();
+        handleArray(node);
+        writer.endArray();
+    }
+
+    private void writeObjectContent(final Element firstChildElement) throws IOException {
+        writer.beginObject();
+        writeObject(firstChildElement);
+        writer.endObject();
+    }
+
+    private static boolean isArrayElement(final Node node) {
+        if (ELEMENT_NODE == node.getNodeType()) {
+            final String nodeName = node.getNodeName();
+            for (Node nextNode = node.getNextSibling(); nextNode != null; nextNode = nextNode.getNextSibling()) {
+                if (ELEMENT_NODE == nextNode.getNodeType() && nodeName.equals(nextNode.getNodeName())) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    private void handleArray(final Node node) throws IOException {
+        final Element parentNode = (Element)node.getParentNode();
+        final NodeList elementsList = parentNode.getElementsByTagName(node.getNodeName());
+        for (int i = 0, length = elementsList.getLength(); i < length; i++) {
+            final Node arrayElement = elementsList.item(i);
+            final Element parent = (Element)arrayElement.getParentNode();
+            if (parentNode.isSameNode(parent)) {
+                final Element firstChildElement = getFirstChildElement(arrayElement);
+                if (firstChildElement != null) {
+                    writeObjectContent(firstChildElement);
+                } else {
+                    // It may be scalar
+                    writeXmlValue(arrayElement);
+                }
             }
-            node = node.getNextSibling();
         }
     }
 
     private void writeObject(Node node) throws IOException {
+        String previousNodeName = "";
         while (node != null) {
             if (ELEMENT_NODE == node.getNodeType()) {
-                writer.name(node.getNodeName());
-                writeXmlNode(node);
+                if (!node.getNodeName().equals(previousNodeName)) {
+                    previousNodeName = node.getNodeName();
+                    writer.name(node.getNodeName());
+                    writeXmlNode(node);
+                }
             }
             node = node.getNextSibling();
         }