Bug 7933: NPE when posting using XML 25/57425/3
authorIvan Hrasko <ivan.hrasko@pantheon.tech>
Fri, 19 May 2017 12:39:16 +0000 (14:39 +0200)
committerIvan Hrasko <ivan.hrasko@pantheon.tech>
Mon, 22 May 2017 11:24:45 +0000 (11:24 +0000)
- NPE was thrown because leaf value was not parsed,
thus data value was null
- fixed by adding condition to parse leaf nodes
- log warning when unknown schema node type was
not parsed
- fixed in old and new restconf

Change-Id: I13c8e419e35999980548e09f6963b0d407a45b31
Signed-off-by: Ivan Hrasko <ivan.hrasko@pantheon.tech>
restconf/sal-rest-connector/src/main/java/org/opendaylight/netconf/sal/rest/impl/XmlNormalizedNodeBodyReader.java
restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/jersey/providers/XmlNormalizedNodeBodyReader.java

index e8fabe5638f70d26f1124c7fa02a97c44e66b601..36b834ab867ccd38a02d55864df02b43aadc8dfe 100644 (file)
@@ -45,6 +45,7 @@ import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
@@ -147,19 +148,21 @@ public class XmlNormalizedNodeBodyReader extends AbstractIdentifierAwareJaxRsPro
             }
         }
 
-        NormalizedNode<?, ?> parsed = null;
-
+        final NormalizedNode<?, ?> parsed;
         if (schemaNode instanceof ContainerSchemaNode) {
-            parsed = parserFactory.getContainerNodeParser().parse(Collections.singletonList(doc.getDocumentElement()),
-                    (ContainerSchemaNode) schemaNode);
+            parsed = parserFactory.getContainerNodeParser().parse(
+                        Collections.singletonList(doc.getDocumentElement()), (ContainerSchemaNode) schemaNode);
         } else if (schemaNode instanceof ListSchemaNode) {
-            final ListSchemaNode casted = (ListSchemaNode) schemaNode;
-            parsed = parserFactory.getMapEntryNodeParser().parse(elements, casted);
+            parsed = parserFactory.getMapEntryNodeParser().parse(elements, (ListSchemaNode) schemaNode);
             if (isPost()) {
                 iiToDataList.add(parsed.getIdentifier());
             }
+        } else if (schemaNode instanceof LeafSchemaNode) {
+            parsed = parserFactory.getLeafNodeParser().parse(elements, (LeafSchemaNode) schemaNode);
+        } else {
+            LOG.warn("Unknown schema node extension {} was not parsed", schemaNode.getClass());
+            parsed = null;
         }
-        // FIXME : add another DataSchemaNode extensions e.g. LeafSchemaNode
 
         final YangInstanceIdentifier fullIIToData = YangInstanceIdentifier.create(Iterables.concat(
                 pathContext.getInstanceIdentifier().getPathArguments(), iiToDataList));
index 5bba5eb2c8852c5fe7b7476044bbba7e1d7cabe6..a17c7162934443eb2d26abd0c6233307b5ae8fe9 100644 (file)
@@ -46,6 +46,7 @@ import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
@@ -135,17 +136,20 @@ public class XmlNormalizedNodeBodyReader extends AbstractIdentifierAwareJaxRsPro
             }
         }
 
-        NormalizedNode<?, ?> parsed = null;
-
+        final NormalizedNode<?, ?> parsed;
         if (schemaNode instanceof ContainerSchemaNode) {
-            parsed = parserFactory.getContainerNodeParser().parse(Collections.singletonList(doc.getDocumentElement()),
-                (ContainerSchemaNode) schemaNode);
+            parsed = parserFactory.getContainerNodeParser().parse(
+                    Collections.singletonList(doc.getDocumentElement()), (ContainerSchemaNode) schemaNode);
         } else if (schemaNode instanceof ListSchemaNode) {
-            final ListSchemaNode casted = (ListSchemaNode) schemaNode;
-            parsed = parserFactory.getMapEntryNodeParser().parse(elements, casted);
+            parsed = parserFactory.getMapEntryNodeParser().parse(elements, (ListSchemaNode) schemaNode);
             if (isPost()) {
                 iiToDataList.add(parsed.getIdentifier());
             }
+        } else if (schemaNode instanceof LeafSchemaNode) {
+            parsed = parserFactory.getLeafNodeParser().parse(elements, (LeafSchemaNode) schemaNode);
+        } else {
+            LOG.warn("Unknown schema node extension {} was not parsed", schemaNode.getClass());
+            parsed = null;
         }
 
         final YangInstanceIdentifier fullIIToData = YangInstanceIdentifier.create(Iterables.concat(