Fix YANG patch request for augmented element
[netconf.git] / restconf / restconf-nb-rfc8040 / src / main / java / org / opendaylight / restconf / nb / rfc8040 / jersey / providers / patch / JsonPatchBodyReader.java
index c581243ab3073cc3785fb39e38922d950aa03c75..f04d763a23bd9d31206ffcee1a8322175896872e 100644 (file)
@@ -42,8 +42,8 @@ import org.opendaylight.yangtools.yang.common.ErrorTag;
 import org.opendaylight.yangtools.yang.common.ErrorType;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
+import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
 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.gson.JSONCodecFactorySupplier;
 import org.opendaylight.yangtools.yang.data.codec.gson.JsonParserStream;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
@@ -374,12 +374,20 @@ public class JsonPatchBodyReader extends AbstractPatchBodyReader {
      */
     private static NormalizedNode readEditData(final @NonNull JsonReader in,
              final @NonNull Inference targetSchemaNode, final @NonNull InstanceIdentifierContext path) {
-        final NormalizedNodeResult resultHolder = new NormalizedNodeResult();
-        final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder);
+        final var resultHolder = new NormalizedNodeResult();
+        final var writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder);
         JsonParserStream.create(writer, JSONCodecFactorySupplier.RFC7951.getShared(path.getSchemaContext()),
             targetSchemaNode).parse(in);
 
-        return resultHolder.getResult();
+        // In case AugmentationNode additional step to get actual data node is required
+        var data = resultHolder.getResult();
+        while (data instanceof AugmentationNode) {
+            final var augNode = (AugmentationNode) data;
+            final var it = augNode.body().iterator();
+            verify(it.hasNext(), "Augmentation %s is missing child", data);
+            data = it.next();
+        }
+        return data;
     }
 
     /**