Require ApiIdentifier to be instantiated with Unqualified 15/111215/5
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 3 Apr 2024 08:56:34 +0000 (10:56 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 3 Apr 2024 11:37:35 +0000 (13:37 +0200)
We are using Unqualified internally, require users to pass it down.

JIRA: NETCONF-1264
Change-Id: I273a384331c175a34621c634071e46bb6cd035ad
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
protocol/restconf-api/src/main/java/org/opendaylight/restconf/api/ApiPath.java
protocol/restconf-api/src/main/java/org/opendaylight/restconf/api/ApiPathParser.java
protocol/restconf-api/src/main/java/org/opendaylight/restconf/api/query/FieldsParameterParser.java
protocol/restconf-api/src/test/java/org/opendaylight/restconf/api/FieldsParamTest.java

index 45b087adf4f97e5eca1da2df1ba25ff3eac07b2f..5a650860a7c728b14f8b8e36f5e7c4b005e65578 100644 (file)
@@ -48,12 +48,18 @@ public record ApiPath(ImmutableList<Step> steps) implements HierarchicalIdentifi
         private final @Nullable String module;
         private final Unqualified identifier;
 
+        @Deprecated(since = "7.0.4", forRemoval = true)
         Step(final @Nullable String module, final String identifier) {
             this.identifier = verifyNotNull(UnresolvedQName.tryLocalName(identifier),
                 "Unexpected invalid identifier %s", identifier);
             this.module = module;
         }
 
+        Step(final @Nullable String module, final Unqualified identifier) {
+            this.module = module;
+            this.identifier = requireNonNull(identifier);
+        }
+
         public Unqualified identifier() {
             return identifier;
         }
@@ -82,15 +88,15 @@ public record ApiPath(ImmutableList<Step> steps) implements HierarchicalIdentifi
         }
 
         void appendTo(final StringBuilder sb) {
-            appendTo(sb, module, identifier.getLocalName());
+            appendTo(sb, module, identifier);
         }
 
         static final StringBuilder appendTo(final StringBuilder sb, final @Nullable String module,
-                final String identifier) {
+                final Unqualified identifier) {
             if (module != null) {
                 sb.append(module).append(':');
             }
-            return sb.append(identifier);
+            return sb.append(identifier.getLocalName());
         }
     }
 
@@ -98,10 +104,15 @@ public record ApiPath(ImmutableList<Step> steps) implements HierarchicalIdentifi
      * An {@code api-identifier} step in a {@link ApiPath}.
      */
     public static final class ApiIdentifier extends Step {
+        @Deprecated(since = "7.0.4", forRemoval = true)
         public ApiIdentifier(final @Nullable String module, final String identifier) {
             super(module, identifier);
         }
 
+        public ApiIdentifier(final @Nullable String module, final Unqualified identifier) {
+            super(module, identifier);
+        }
+
         @Override
         public int hashCode() {
             return Objects.hash(module(), identifier());
@@ -119,25 +130,27 @@ public record ApiPath(ImmutableList<Step> steps) implements HierarchicalIdentifi
     public static final class ListInstance extends Step {
         private final ImmutableList<String> keyValues;
 
-        ListInstance(final @Nullable String module, final String identifier, final ImmutableList<String> keyValues) {
+        ListInstance(final @Nullable String module, final Unqualified identifier,
+                final ImmutableList<String> keyValues) {
             super(module, identifier);
             this.keyValues = requireNonNull(keyValues);
         }
 
-        public static ListInstance of(final @Nullable String module, final String identifier, final String value) {
+        public static ListInstance of(final @Nullable String module, final Unqualified identifier, final String value) {
             return new ListInstance(module, identifier, ImmutableList.of(value));
         }
 
-        public static ListInstance of(final @Nullable String module, final String identifier, final String... values) {
+        public static ListInstance of(final @Nullable String module, final Unqualified identifier,
+                final String... values) {
             return of(module, identifier, ImmutableList.copyOf(values));
         }
 
-        public static ListInstance of(final @Nullable String module, final String identifier,
+        public static ListInstance of(final @Nullable String module, final Unqualified identifier,
                 final List<String> values) {
             return of(module, identifier, ImmutableList.copyOf(values));
         }
 
-        public static ListInstance of(final @Nullable String module, final String identifier,
+        public static ListInstance of(final @Nullable String module, final Unqualified identifier,
                 final ImmutableList<String> values) {
             if (values.isEmpty()) {
                 throw new IllegalArgumentException(
index a2d1e54b5c6343e355cab239494f013017a183ff..41a80c10ad0838897a16ba35888119ed1c02949c 100644 (file)
@@ -21,6 +21,7 @@ import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.restconf.api.ApiPath.ApiIdentifier;
 import org.opendaylight.restconf.api.ApiPath.ListInstance;
 import org.opendaylight.restconf.api.ApiPath.Step;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.common.YangNames;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -167,12 +168,12 @@ sealed class ApiPathParser {
             if (ch == ':') {
                 return parseStep(endSub(str, idx), str, nextOffset, limit);
             } else if (ch == '=') {
-                return parseStep(null, endSub(str, idx), str, nextOffset, limit);
+                return parseStep(null, endUnqualified(str, idx), str, nextOffset, limit);
             }
             idx = continueIdentifer(idx, ch);
         }
 
-        steps.add(new ApiIdentifier(null, endSub(str, idx)));
+        steps.add(new ApiIdentifier(null, endUnqualified(str, idx)));
         return idx;
     }
 
@@ -183,17 +184,17 @@ sealed class ApiPathParser {
         while (idx < limit) {
             final char ch = peekBasicLatin(str, idx, limit);
             if (ch == '=') {
-                return parseStep(module, endSub(str, idx), str, nextOffset, limit);
+                return parseStep(module, endUnqualified(str, idx), str, nextOffset, limit);
             }
             idx = continueIdentifer(idx, ch);
         }
 
-        steps.add(new ApiIdentifier(module, endSub(str, idx)));
+        steps.add(new ApiIdentifier(module, endUnqualified(str, idx)));
         return idx;
     }
 
     // Starting at first key-value
-    private int parseStep(final @Nullable String module, final @NonNull String identifier,
+    private int parseStep(final @Nullable String module, final @NonNull Unqualified identifier,
             final String str, final int offset, final int limit) throws ParseException {
         final var values = ImmutableList.<String>builder();
 
@@ -302,6 +303,10 @@ sealed class ApiPathParser {
         return sb;
     }
 
+    private @NonNull Unqualified endUnqualified(final String str, final int idx) {
+        return Unqualified.of(endSub(str, idx));
+    }
+
     private static byte parsePercent(final String str, final int offset, final int limit) throws ParseException {
         if (limit - offset < 3) {
             throw new ParseException("Incomplete escape '" + str.substring(offset, limit) + "'", offset);
index b04853fd6aa45fb4651eead47ff0f6f5d59b6d57..e7bc8eba413a36795e0121983421c841a186c8ec 100644 (file)
@@ -16,6 +16,7 @@ import java.util.List;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.restconf.api.ApiPath.ApiIdentifier;
 import org.opendaylight.restconf.api.query.FieldsParam.NodeSelector;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.common.YangNames;
 
 /**
@@ -158,7 +159,7 @@ final class FieldsParameterParser {
             int idx = offset + 1;
             while (true) {
                 if (idx == str.length()) {
-                    path.add(new ApiIdentifier(null, str.substring(offset)));
+                    path.add(new ApiIdentifier(null, Unqualified.of(str.substring(offset))));
                     return idx;
                 }
 
@@ -173,7 +174,7 @@ final class FieldsParameterParser {
                     // We have complete first identifier, now switch to parsing the second identifier
                     return parsePathStepSecond(first, str, idx + 1);
                 }
-                path.add(new ApiIdentifier(null, first));
+                path.add(new ApiIdentifier(null, Unqualified.of(first)));
 
                 return switch (ch) {
                     case ';', ')' -> /* End of this selector, return */ idx;
@@ -193,7 +194,7 @@ final class FieldsParameterParser {
             int idx = offset + 1;
             while (true) {
                 if (idx == str.length()) {
-                    path.add(new ApiIdentifier(module, str.substring(offset)));
+                    path.add(new ApiIdentifier(module, Unqualified.of(str.substring(offset))));
                     return idx;
                 }
 
@@ -202,7 +203,7 @@ final class FieldsParameterParser {
                     idx++;
                     continue;
                 }
-                path.add(new ApiIdentifier(module, str.substring(offset, idx)));
+                path.add(new ApiIdentifier(module, Unqualified.of(str.substring(offset, idx))));
 
                 return switch (ch) {
                     case ';', ')' -> /* End of this selector, return */ idx;
index 489bd25c5afa82e44258db07738449c7e70044da..68a9771a1e5c8028cf7cb7371923970ada167064 100644 (file)
@@ -16,6 +16,7 @@ import org.junit.jupiter.api.Test;
 import org.opendaylight.restconf.api.ApiPath.ApiIdentifier;
 import org.opendaylight.restconf.api.query.FieldsParam;
 import org.opendaylight.restconf.api.query.FieldsParam.NodeSelector;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 
 class FieldsParamTest {
     // https://www.rfc-editor.org/rfc/rfc8040#section-4.8.3:
@@ -27,11 +28,11 @@ class FieldsParamTest {
         assertEquals(2, selectors.size());
 
         var selector = selectors.get(0);
-        assertEquals(List.of(new ApiIdentifier(null, "genre")), selector.path());
+        assertEquals(List.of(new ApiIdentifier(null, Unqualified.of("genre"))), selector.path());
         assertEquals(List.of(), selector.subSelectors());
 
         selector = selectors.get(1);
-        assertEquals(List.of(new ApiIdentifier(null, "year")), selector.path());
+        assertEquals(List.of(new ApiIdentifier(null, Unqualified.of("year"))), selector.path());
         assertEquals(List.of(), selector.subSelectors());
     }
 
@@ -45,7 +46,9 @@ class FieldsParamTest {
         assertEquals(1, selectors.size());
 
         final var selector = selectors.get(0);
-        assertEquals(List.of(new ApiIdentifier(null, "admin"), new ApiIdentifier(null, "label")), selector.path());
+        assertEquals(
+            List.of(new ApiIdentifier(null, Unqualified.of("admin")), new ApiIdentifier(null, Unqualified.of("label"))),
+            selector.path());
         assertEquals(List.of(), selector.subSelectors());
     }
 
@@ -60,18 +63,18 @@ class FieldsParamTest {
         assertEquals(1, selectors.size());
 
         final var selector = selectors.get(0);
-        assertEquals(List.of(new ApiIdentifier(null, "admin")), selector.path());
+        assertEquals(List.of(new ApiIdentifier(null, Unqualified.of("admin"))), selector.path());
 
         final var subSelectors = selector.subSelectors();
         assertEquals(2, subSelectors.size());
 
         var subSelector = subSelectors.get(0);
-        assertEquals(List.of(new ApiIdentifier(null, "label")), subSelector.path());
+        assertEquals(List.of(new ApiIdentifier(null, Unqualified.of("label"))), subSelector.path());
         assertEquals(List.of(), subSelector.subSelectors());
 
 
         subSelector = subSelectors.get(1);
-        assertEquals(List.of(new ApiIdentifier(null, "catalogue-number")), subSelector.path());
+        assertEquals(List.of(new ApiIdentifier(null, Unqualified.of("catalogue-number"))), subSelector.path());
         assertEquals(List.of(), subSelector.subSelectors());
     }
 
@@ -92,18 +95,20 @@ class FieldsParamTest {
 
         final var selector = selectors.get(0);
         assertEquals(
-            List.of(new ApiIdentifier("ietf-yang-library", "modules-state"), new ApiIdentifier(null, "module")),
+            List.of(
+                new ApiIdentifier("ietf-yang-library", Unqualified.of("modules-state")),
+                new ApiIdentifier(null, Unqualified.of("module"))),
             selector.path());
 
         final var subSelectors = selector.subSelectors();
         assertEquals(2, subSelectors.size());
 
         var subSelector = subSelectors.get(0);
-        assertEquals(List.of(new ApiIdentifier(null, "name")), subSelector.path());
+        assertEquals(List.of(new ApiIdentifier(null, Unqualified.of("name"))), subSelector.path());
         assertEquals(List.of(), subSelector.subSelectors());
 
         subSelector = subSelectors.get(1);
-        assertEquals(List.of(new ApiIdentifier(null, "revision")), subSelector.path());
+        assertEquals(List.of(new ApiIdentifier(null, Unqualified.of("revision"))), subSelector.path());
         assertEquals(List.of(), subSelector.subSelectors());
     }
 
@@ -113,7 +118,7 @@ class FieldsParamTest {
         assertEquals(1, selectors.size());
 
         final var selector = selectors.get(0);
-        assertEquals(List.of(new ApiIdentifier("ietf-yang-library", "modules-state")), selector.path());
+        assertEquals(List.of(new ApiIdentifier("ietf-yang-library", Unqualified.of("modules-state"))), selector.path());
         assertEquals(List.of(), selector.subSelectors());
     }
 
@@ -123,13 +128,13 @@ class FieldsParamTest {
         assertEquals(1, selectors.size());
 
         final var selector = selectors.get(0);
-        assertEquals(List.of(new ApiIdentifier(null, "a")), selector.path());
+        assertEquals(List.of(new ApiIdentifier(null, Unqualified.of("a"))), selector.path());
 
         final var subSelectors = selector.subSelectors();
         assertEquals(1, subSelectors.size());
 
         final var subSelector = subSelectors.get(0);
-        assertEquals(List.of(new ApiIdentifier("b", "c")), subSelector.path());
+        assertEquals(List.of(new ApiIdentifier("b", Unqualified.of("c"))), subSelector.path());
         assertEquals(List.of(), subSelector.subSelectors());
     }
 
@@ -139,13 +144,13 @@ class FieldsParamTest {
         assertEquals(1, selectors.size());
 
         final var selector = selectors.get(0);
-        assertEquals(List.of(new ApiIdentifier("a", "b")), selector.path());
+        assertEquals(List.of(new ApiIdentifier("a", Unqualified.of("b"))), selector.path());
 
         final var subSelectors = selector.subSelectors();
         assertEquals(1, subSelectors.size());
 
         final var subSelector = subSelectors.get(0);
-        assertEquals(List.of(new ApiIdentifier(null, "c")), subSelector.path());
+        assertEquals(List.of(new ApiIdentifier(null, Unqualified.of("c"))), subSelector.path());
         assertEquals(List.of(), subSelector.subSelectors());
     }