Use DatabindContext in instance identifier serialization 81/109081/2
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 27 Nov 2023 23:20:55 +0000 (00:20 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 27 Nov 2023 23:50:28 +0000 (00:50 +0100)
The first thing this path does is create a DataSchemaContextTree -- so
let's pass a DatabindContext, which has that readily available.

JIRA: NETCONF-1157
Change-Id: Ia66d13e4489b00a28404274c9841f227391876ba
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/databind/PatchBody.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/RestconfStrategy.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/IdentifierCodec.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/YangInstanceIdentifierSerializer.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/devnotif/SubscribeDeviceNotificationRpc.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/CreateDataChangeEventSubscriptionRpc.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/IdentifierCodecTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/YangInstanceIdentifierSerializerTest.java

index 151dba80b66dc34e3832288995cc4521c5b3558a..1f300696f249161b4e4dd9f8d3e6b854045a6607 100644 (file)
@@ -53,7 +53,7 @@ public abstract sealed class PatchBody extends AbstractBody permits JsonPatchBod
         if (urlPath.isEmpty()) {
             targetUrl = target.startsWith("/") ? target.substring(1) : target;
         } else {
-            targetUrl = IdentifierCodec.serialize(urlPath, databind.modelContext()) + target;
+            targetUrl = IdentifierCodec.serialize(urlPath, databind) + target;
         }
 
         try {
index 03036b3316e48fa454bc59d48507b47bc56265be..5b593ffc64da40e01635039f385317fa340e498f 100644 (file)
@@ -402,7 +402,7 @@ public abstract class RestconfStrategy {
                 ret.set(new CreateResource(IdentifierCodec.serialize(
                     data instanceof MapNode mapData && !mapData.isEmpty()
                         ? path.node(mapData.body().iterator().next().name()) : path,
-                    modelContext())));
+                    databind)));
             }
 
             @Override
index 6b537700daac8f6061fb4d1cfbe2ef8d7526811c..50370239afc972150ab5273bb7b543b9d06e72a2 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.restconf.nb.rfc8040.utils.parser;
 import org.opendaylight.restconf.api.ApiPath;
 import org.opendaylight.restconf.nb.rfc8040.databind.DatabindContext;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 
 /**
  * Codec for identifier to serialize {@link YangInstanceIdentifier} to {@link String} and deserialize {@link String} to
@@ -21,8 +20,8 @@ public final class IdentifierCodec {
         // Hidden on purpose
     }
 
-    public static String serialize(final YangInstanceIdentifier data, final EffectiveModelContext schemaContext) {
-        return YangInstanceIdentifierSerializer.create(schemaContext, data);
+    public static String serialize(final YangInstanceIdentifier data, final DatabindContext databind) {
+        return YangInstanceIdentifierSerializer.create(databind, data);
     }
 
     public static YangInstanceIdentifier deserialize(final ApiPath data, final DatabindContext databind) {
index a6cd8a58f58f556cf2b2f09eea8abc18c75dd0e5..d053e83ae7806189cf475b2f7616045e0adbed31 100644 (file)
@@ -11,6 +11,7 @@ import java.util.Map.Entry;
 import java.util.Set;
 import org.opendaylight.restconf.api.ApiPath;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
+import org.opendaylight.restconf.nb.rfc8040.databind.DatabindContext;
 import org.opendaylight.yangtools.yang.common.ErrorTag;
 import org.opendaylight.yangtools.yang.common.ErrorType;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -21,10 +22,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithV
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.util.DataSchemaContext;
 import org.opendaylight.yangtools.yang.data.util.DataSchemaContext.PathMixin;
-import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.Module;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
 /**
  * Serializer for {@link YangInstanceIdentifier} to {@link String} for restconf.
@@ -36,17 +34,15 @@ public final class YangInstanceIdentifierSerializer {
     }
 
     /**
-     * Method to create String from {@link Iterable} of {@link PathArgument}
-     * which are parsing from data by {@link SchemaContext}.
+     * Method to create String from {@link Iterable} of {@link PathArgument} which are parsing from data with the help
+     * of an {@link EffectiveModelContext}.
      *
-     * @param schemaContext
-     *             for validate of parsing path arguments
-     * @param data
-     *             path to data
+     * @param databind for validate of parsing path arguments
+     * @param data path to data
      * @return {@link String}
      */
-    public static String create(final EffectiveModelContext schemaContext, final YangInstanceIdentifier data) {
-        final var current = DataSchemaContextTree.from(schemaContext).getRoot();
+    public static String create(final DatabindContext databind, final YangInstanceIdentifier data) {
+        final var current = databind.schemaTree().getRoot();
         final var variables = new MainVarsWrapper(current);
         final var path = new StringBuilder();
 
@@ -80,7 +76,7 @@ public final class YangInstanceIdentifierSerializer {
                     path.append('/');
                 }
 
-                path.append(prefixForNamespace(arg.getNodeType(), schemaContext)).append(':');
+                path.append(prefixForNamespace(arg.getNodeType(), databind.modelContext())).append(':');
             } else {
                 path.append('/');
             }
@@ -123,13 +119,11 @@ public final class YangInstanceIdentifierSerializer {
     /**
      * Create prefix of namespace from {@link QName}.
      *
-     * @param qname
-     *             {@link QName}
+     * @param qname {@link QName}
      * @return {@link String}
      */
-    private static String prefixForNamespace(final QName qname, final SchemaContext schemaContext) {
-        final Module module = schemaContext.findModule(qname.getModule()).orElse(null);
-        return module.getName();
+    private static String prefixForNamespace(final QName qname, final EffectiveModelContext schemaContext) {
+        return schemaContext.findModuleStatement(qname.getModule()).orElseThrow().argument().getLocalName();
     }
 
     private static final class MainVarsWrapper {
index 377216c6f6ca144f1ec3796a0ec6de32237bf448..8bf3b520685a134f84603cf8c75d7652cdc33f73 100644 (file)
@@ -83,7 +83,7 @@ public final class SubscribeDeviceNotificationRpc extends RpcImplementation {
 
         return streamRegistry.createStream(restconfURI, new DeviceNotificationSource(mountPointService, path),
             "All YANG notifications occuring on mount point /"
-                + IdentifierCodec.serialize(path, input.currentContext().modelContext()))
+                + IdentifierCodec.serialize(path, input.currentContext()))
             .transform(stream -> input.newOperationOutput(Builders.containerBuilder()
                 .withNodeIdentifier(new NodeIdentifier(SubscribeDeviceNotificationOutput.QNAME))
                 .withChild(ImmutableNodes.leafNode(DEVICE_NOTIFICATION_STREAM_PATH_NODEID, stream.name()))
index 2fe82719d4a4d710c78000bc25a1dc29b213b40f..49960caa80085089e7b9c734f34acf451ebdcd9b 100644 (file)
@@ -112,7 +112,7 @@ public final class CreateDataChangeEventSubscriptionRpc extends RpcImplementatio
         return streamRegistry.createStream(restconfURI,
             new DataTreeChangeSource(databindProvider, changeService, datastore, path),
             "Events occuring in " + datastore + " datastore under /"
-                + IdentifierCodec.serialize(path, input.currentContext().modelContext()))
+                + IdentifierCodec.serialize(path, input.currentContext()))
             .transform(stream -> input.newOperationOutput(Builders.containerBuilder()
                 .withNodeIdentifier(OUTPUT_NODEID)
                 .withChild(ImmutableNodes.leafNode(STREAM_NAME_NODEID, stream.name()))
index cd6b7e800e4992fc16691e93a32df6d53d0633fc..d8cb55ac1afed74a72dc07258ca73cac10783cb0 100644 (file)
@@ -32,7 +32,7 @@ class IdentifierCodecTest {
         final var dataYangII = IdentifierCodec.deserialize(ApiPath.parse(
             "list-test:top/list1=%2C%27\"%3A\"%20%2F,,foo/list2=a,b/result"), DATABIND);
         assertEquals("list-test:top/list1=%2C%27\"%3A\" %2F,,foo/list2=a,b/result",
-            IdentifierCodec.serialize(dataYangII, DATABIND.modelContext()));
+            IdentifierCodec.serialize(dataYangII, DATABIND));
     }
 
     /**
@@ -44,7 +44,7 @@ class IdentifierCodecTest {
     void codecLeafListTest() throws Exception {
         final var str = "list-test:top/Y=4";
         final var dataYangII = IdentifierCodec.deserialize(ApiPath.parse(str), DATABIND);
-        assertEquals(str, IdentifierCodec.serialize(dataYangII, DATABIND.modelContext()));
+        assertEquals(str, IdentifierCodec.serialize(dataYangII, DATABIND));
     }
 
     /**
@@ -54,8 +54,7 @@ class IdentifierCodecTest {
      */
     @Test
     void codecDeserializeNullTest() {
-        final var dataYangII = IdentifierCodec.deserialize(null, DATABIND);
-        assertEquals(YangInstanceIdentifier.of(), dataYangII);
+        assertEquals(YangInstanceIdentifier.of(), IdentifierCodec.deserialize(null, DATABIND));
     }
 
     /**
@@ -64,7 +63,7 @@ class IdentifierCodecTest {
      */
     @Test
     void codecSerializeEmptyTest() {
-        assertEquals("", IdentifierCodec.serialize(YangInstanceIdentifier.of(), DATABIND.modelContext()));
+        assertEquals("", IdentifierCodec.serialize(YangInstanceIdentifier.of(), DATABIND));
     }
 
     /**
@@ -73,7 +72,7 @@ class IdentifierCodecTest {
      */
     @Test
     void codecDeserializeAndSerializeEmptyTest() throws Exception {
-        final var serialized = IdentifierCodec.serialize(YangInstanceIdentifier.of(), DATABIND.modelContext());
+        final var serialized = IdentifierCodec.serialize(YangInstanceIdentifier.of(), DATABIND);
         assertEquals(YangInstanceIdentifier.of(), IdentifierCodec.deserialize(ApiPath.parse(serialized),
             DATABIND));
     }
index 7db7907f4e70f4a99f49b051b6e0188ab81a2082..e7643a1ea58a4296b54dd3b8304b5c6b22194bab 100644 (file)
@@ -14,22 +14,21 @@ import com.google.common.collect.ImmutableMap;
 import java.util.Map;
 import org.junit.jupiter.api.Test;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
+import org.opendaylight.restconf.nb.rfc8040.databind.DatabindContext;
 import org.opendaylight.yangtools.yang.common.ErrorTag;
 import org.opendaylight.yangtools.yang.common.ErrorType;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 
 /**
  * Unit tests for {@link YangInstanceIdentifierSerializer}.
  */
 class YangInstanceIdentifierSerializerTest {
-    // schema context with test modules
-    private static final EffectiveModelContext SCHEMA_CONTEXT =
-        YangParserTestUtils.parseYangResourceDirectory("/restconf/parser/serializer");
+    private static final DatabindContext DATABIND = DatabindContext.ofModel(
+        YangParserTestUtils.parseYangResourceDirectory("/restconf/parser/serializer"));
 
     /**
      * Positive test of serialization of <code>YangInstanceIdentifier</code> containing container node to
@@ -37,7 +36,7 @@ class YangInstanceIdentifierSerializerTest {
      */
     @Test
     void serializeContainerTest() {
-        assertEquals("serializer-test:contA", YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT,
+        assertEquals("serializer-test:contA", YangInstanceIdentifierSerializer.create(DATABIND,
             YangInstanceIdentifier.of(QName.create("serializer:test", "2016-06-06", "contA"))));
     }
 
@@ -47,7 +46,7 @@ class YangInstanceIdentifierSerializerTest {
      */
     @Test
     void serializeContainerWithLeafTest() {
-        assertEquals("serializer-test:contA/leaf-A", YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT,
+        assertEquals("serializer-test:contA/leaf-A", YangInstanceIdentifierSerializer.create(DATABIND,
             YangInstanceIdentifier.of(
                 QName.create("serializer:test", "2016-06-06", "contA"),
                 QName.create("serializer:test", "2016-06-06", "leaf-A"))));
@@ -63,7 +62,7 @@ class YangInstanceIdentifierSerializerTest {
         final var leafList = QName.create("serializer:test", "2016-06-06", "leaf-list-AA");
 
         assertEquals("serializer-test:contA/list-A=100/leaf-list-AA=instance",
-            YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, YangInstanceIdentifier.builder()
+            YangInstanceIdentifierSerializer.create(DATABIND, YangInstanceIdentifier.builder()
                 .node(QName.create("serializer:test", "2016-06-06", "contA"))
                 .node(list)
                 .node(NodeIdentifierWithPredicates.of(list, QName.create(list, "list-key"), 100))
@@ -79,7 +78,7 @@ class YangInstanceIdentifierSerializerTest {
      */
     @Test
     void serializeListWithNoKeysTest() {
-        assertEquals("serializer-test:list-no-key", YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT,
+        assertEquals("serializer-test:list-no-key", YangInstanceIdentifierSerializer.create(DATABIND,
             YangInstanceIdentifier.of(
                 QName.create("serializer:test", "2016-06-06", "list-no-key"),
                 QName.create("serializer:test", "2016-06-06", "list-no-key"))));
@@ -92,7 +91,7 @@ class YangInstanceIdentifierSerializerTest {
      */
     @Test
     void serializeMapWithNoKeysTest() {
-        assertEquals("serializer-test:list-one-key", YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT,
+        assertEquals("serializer-test:list-one-key", YangInstanceIdentifierSerializer.create(DATABIND,
             YangInstanceIdentifier.builder()
                 .node(QName.create("serializer:test", "2016-06-06", "list-one-key"))
                 .nodeWithKey(QName.create("serializer:test", "2016-06-06", "list-one-key"), Map.of())
@@ -106,7 +105,7 @@ class YangInstanceIdentifierSerializerTest {
      */
     @Test
     void serializeMapWithOneKeyTest() {
-        assertEquals("serializer-test:list-one-key=value", YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT,
+        assertEquals("serializer-test:list-one-key=value", YangInstanceIdentifierSerializer.create(DATABIND,
             YangInstanceIdentifier.builder()
                 .node(QName.create("serializer:test", "2016-06-06", "list-one-key"))
                 .nodeWithKey(QName.create("serializer:test", "2016-06-06", "list-one-key"),
@@ -124,7 +123,7 @@ class YangInstanceIdentifierSerializerTest {
         final var list = QName.create("serializer:test", "2016-06-06", "list-multiple-keys");
 
         assertEquals("serializer-test:list-multiple-keys=value-1,2,true",
-            YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, YangInstanceIdentifier.builder()
+            YangInstanceIdentifierSerializer.create(DATABIND, YangInstanceIdentifier.builder()
                 .node(list)
                 .nodeWithKey(list, ImmutableMap.of(
                     QName.create(list, "name"), "value-1",
@@ -140,7 +139,7 @@ class YangInstanceIdentifierSerializerTest {
      */
     @Test
     void serializeLeafTest() {
-        assertEquals("serializer-test:leaf-0", YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT,
+        assertEquals("serializer-test:leaf-0", YangInstanceIdentifierSerializer.create(DATABIND,
             YangInstanceIdentifier.of(QName.create("serializer:test", "2016-06-06", "leaf-0"))));
     }
 
@@ -151,7 +150,7 @@ class YangInstanceIdentifierSerializerTest {
      */
     @Test
     void serializeLeafListTest() {
-        assertEquals("serializer-test:leaf-list-0=instance", YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT,
+        assertEquals("serializer-test:leaf-list-0=instance", YangInstanceIdentifierSerializer.create(DATABIND,
             YangInstanceIdentifier.builder()
                 .node(QName.create("serializer:test", "2016-06-06", "leaf-list-0"))
                 .node(new NodeWithValue<>(QName.create("serializer:test", "2016-06-06", "leaf-list-0"), "instance"))
@@ -177,7 +176,7 @@ class YangInstanceIdentifierSerializerTest {
     @Test
     void serializeNullDataNegativeTest() {
         assertThrows(NullPointerException.class,
-            () -> YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, null));
+            () -> YangInstanceIdentifierSerializer.create(DATABIND, null));
     }
 
     /**
@@ -187,7 +186,7 @@ class YangInstanceIdentifierSerializerTest {
      */
     @Test
     void serializeEmptyDataTest() {
-        assertEquals("", YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, YangInstanceIdentifier.of()));
+        assertEquals("", YangInstanceIdentifierSerializer.create(DATABIND, YangInstanceIdentifier.of()));
     }
 
     /**
@@ -201,7 +200,7 @@ class YangInstanceIdentifierSerializerTest {
                 QName.create("serializer:test", "2016-06-06", "not-existing-leaf"));
 
         final var ex = assertThrows(RestconfDocumentedException.class,
-            () -> YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, data));
+            () -> YangInstanceIdentifierSerializer.create(DATABIND, data));
         final var errors = ex.getErrors();
         assertEquals(1, errors.size());
         final var error = errors.get(0);
@@ -219,7 +218,7 @@ class YangInstanceIdentifierSerializerTest {
     @Test
     void serializePercentEncodingTest() {
         assertEquals("serializer-test:list-one-key=foo%3Afoo bar%2Ffoo%2Cbar%2F%27bar%27",
-            YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT,
+            YangInstanceIdentifierSerializer.create(DATABIND,
                 YangInstanceIdentifier.builder()
                     .node(QName.create("serializer:test", "2016-06-06", "list-one-key"))
                     .nodeWithKey(QName.create("serializer:test", "2016-06-06", "list-one-key"),
@@ -232,7 +231,7 @@ class YangInstanceIdentifierSerializerTest {
      */
     @Test
     void serializeNoPercentEncodingTest() {
-        assertEquals("serializer-test:list-one-key=foo\"b\"bar", YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT,
+        assertEquals("serializer-test:list-one-key=foo\"b\"bar", YangInstanceIdentifierSerializer.create(DATABIND,
             YangInstanceIdentifier.builder()
                 .node(QName.create("serializer:test", "2016-06-06", "list-one-key"))
                 .nodeWithKey(QName.create("serializer:test", "2016-06-06", "list-one-key"),
@@ -250,7 +249,7 @@ class YangInstanceIdentifierSerializerTest {
         final var child = QName.create("serializer:test", "2016-06-06", "augmented-leaf");
 
         assertEquals("serializer-test-included:augmented-list=100/serializer-test:augmented-leaf",
-            YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, YangInstanceIdentifier.builder()
+            YangInstanceIdentifierSerializer.create(DATABIND, YangInstanceIdentifier.builder()
                 .node(list)
                 .node(NodeIdentifierWithPredicates.of(list, QName.create(list, "list-key"), 100))
                 .node(child)
@@ -275,7 +274,7 @@ class YangInstanceIdentifierSerializerTest {
                 .build();
 
         final var ex = assertThrows(RestconfDocumentedException.class,
-            () -> YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, data));
+            () -> YangInstanceIdentifierSerializer.create(DATABIND, data));
         final var errors = ex.getErrors();
         assertEquals(1, errors.size());
         final var error = errors.get(0);