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;
*/
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 augNode) {
+ final var it = augNode.body().iterator();
+ verify(it.hasNext(), "Augmentation %s is missing child", data);
+ data = it.next();
+ }
+ return data;
}
/**
checkPatchContext(returnValue);
}
+ /**
+ * Test of Yang Patch on the top augmented element.
+ */
+ @Test
+ public void modulePatchTargetTopLevelAugmentedContainerTest() throws Exception {
+ mockBodyReader("", jsonToPatchBodyReader, false);
+ final var inputStream = new ByteArrayInputStream("""
+ {
+ "ietf-yang-patch:yang-patch": {
+ "patch-id": "test-patch",
+ "comment": "comment",
+ "edit": [
+ {
+ "edit-id": "edit1",
+ "operation": "replace",
+ "target": "/test-m:container-root/test-m:container-lvl1/test-m-aug:container-aug",
+ "value": {
+ "container-aug": {
+ "leaf-aug": "data"
+ }
+ }
+ }
+ ]
+ }
+ }
+ """.getBytes(StandardCharsets.UTF_8));
+ final var expectedData = Builders.containerBuilder()
+ .withNodeIdentifier(new NodeIdentifier(CONT_AUG_QNAME))
+ .withChild(ImmutableNodes.leafNode(LEAF_AUG_QNAME, "data"))
+ .build();
+ final var returnValue = jsonToPatchBodyReader.readFrom(null, null, null, mediaType, null, inputStream);
+ checkPatchContext(returnValue);
+ final var data = returnValue.getData().get(0).getNode();
+ assertEquals(CONT_AUG_QNAME, data.getIdentifier().getNodeType());
+ assertEquals(expectedData, data);
+ }
+
/**
* Test of Yang Patch on the system map node element.
*/
checkPatchContext(xmlToPatchBodyReader.readFrom(null, null, null, mediaType, null, inputStream));
}
+ /**
+ * Test of Yang Patch on the top augmented element.
+ */
+ @Test
+ public void moduleTargetTopLevelAugmentedContainerTest() throws Exception {
+ mockBodyReader("", xmlToPatchBodyReader, false);
+ final var inputStream = new ByteArrayInputStream("""
+ <yang-patch xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-patch">
+ <patch-id>test-patch</patch-id>
+ <comment>This test patch for augmented element</comment>
+ <edit>
+ <edit-id>edit1</edit-id>
+ <operation>replace</operation>
+ <target>/test-m:container-root/test-m:container-lvl1/test-m-aug:container-aug</target>
+ <value>
+ <container-aug xmlns="test-ns-aug">
+ <leaf-aug>data</leaf-aug>
+ </container-aug>
+ </value>
+ </edit>
+ </yang-patch>
+ """.getBytes(StandardCharsets.UTF_8));
+ final var expectedData = Builders.containerBuilder()
+ .withNodeIdentifier(new NodeIdentifier(CONT_AUG_QNAME))
+ .withChild(ImmutableNodes.leafNode(LEAF_AUG_QNAME, "data"))
+ .build();
+ final var returnValue = xmlToPatchBodyReader.readFrom(null, null, null, mediaType, null, inputStream);
+ checkPatchContext(returnValue);
+ final var data = returnValue.getData().get(0).getNode();
+ assertEquals(CONT_AUG_QNAME, data.getIdentifier().getNodeType());
+ assertEquals(expectedData, data);
+ }
+
/**
* Test of Yang Patch on the top system map node element.
*/
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
public abstract class AbstractBodyReaderTest {
+ protected static final QName CONT_AUG_QNAME = QName.create("test-ns-aug", "container-aug").intern();
+ protected static final QName LEAF_AUG_QNAME = QName.create("test-ns-aug", "leaf-aug").intern();
protected static final QName MAP_CONT_QNAME = QName.create("map:ns", "my-map").intern();
protected static final QName KEY_LEAF_QNAME = QName.create("map:ns", "key-leaf").intern();
protected static final QName DATA_LEAF_QNAME = QName.create("map:ns", "data-leaf").intern();
--- /dev/null
+module test-m-aug {\r
+ namespace "test-ns-aug";\r
+ prefix test-m;\r
+\r
+ import test-m {\r
+ prefix tm;\r
+ }\r
+\r
+ augment /tm:container-root/tm:container-lvl1 {\r
+ container container-aug {\r
+ leaf leaf-aug {\r
+ type string;\r
+ }\r
+\r
+ list list-aug {\r
+ key list-aug-key;\r
+ leaf list-aug-key {\r
+ type string;\r
+ }\r
+\r
+ container list-aug-container {\r
+ leaf foo {\r
+ type string;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+}\r
--- /dev/null
+module test-m {\r
+ namespace "test-ns";\r
+ prefix test-m;\r
+\r
+ container container-root {\r
+ leaf leaf-lvl1 {\r
+ type string;\r
+ }\r
+\r
+ container container-lvl1 {\r
+ leaf leaf-lvl2 {\r
+ type string;\r
+ }\r
+\r
+ list list-lvl2 {\r
+ key list-lvl2-key;\r
+ leaf list-lvl2-key {\r
+ type string;\r
+ }\r
+\r
+ leaf leaf-lvl2 {\r
+ type string;\r
+ }\r
+ }\r
+ }\r
+ }\r
+}\r