Bug 8939: Extract MapEntryNode from MapNode result of XML parsing
[netconf.git] / restconf / sal-rest-connector / src / main / java / org / opendaylight / restconf / jersey / providers / XmlNormalizedNodeBodyReader.java
index e5978bedd263f062a0d153d47531307a37fc04c8..ced6918fa9a7767e03737b5e3b41f57d9015696b 100644 (file)
@@ -34,6 +34,7 @@ import org.opendaylight.restconf.utils.RestconfConstants;
 import org.opendaylight.yangtools.util.xml.UntrustedXML;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream;
@@ -122,7 +123,7 @@ public class XmlNormalizedNodeBodyReader extends AbstractNormalizedNodeBodyReade
                             docRootElm, scQName));
         }
 
-        final NormalizedNode<?, ?> parsed;
+        NormalizedNode<?, ?> parsed;
         final NormalizedNodeResult resultHolder = new NormalizedNodeResult();
         final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder);
 
@@ -132,6 +133,17 @@ public class XmlNormalizedNodeBodyReader extends AbstractNormalizedNodeBodyReade
                     schemaNode);
             xmlParser.traverse(new DOMSource(doc.getDocumentElement()));
             parsed = resultHolder.getResult();
+
+            // When parsing an XML source with a list root node
+            // the new XML parser always returns a MapNode with one MapEntryNode inside.
+            // However, the old XML parser returned a MapEntryNode directly in this place.
+            // Therefore we now have to extract the MapEntryNode from the parsed MapNode.
+            if (parsed instanceof MapNode) {
+                final MapNode mapNode = (MapNode) parsed;
+                // extracting the MapEntryNode
+                parsed = mapNode.getValue().iterator().next();
+            }
+
             if (schemaNode instanceof  ListSchemaNode && isPost()) {
                 iiToDataList.add(parsed.getIdentifier());
             }