Introduce {Qualified,Unqualified}.of() 04/101004/2
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 8 May 2022 21:57:59 +0000 (23:57 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 9 May 2022 05:49:21 +0000 (07:49 +0200)
We are proliferating use on Unqualified quite a bit and since it is a
visible class, we should have a nice way of instantiating it. Introduce
static factory of() methods for both alternatives.

Change-Id: Ib19077861678d8e84cf67c517a382b758186a266
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
common/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/UnresolvedQName.java
common/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/YangConstants.java
parser/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AugmentIdentifierStatementSupport.java
parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/ModuleStatementSupport.java
parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/path/PathExpressionParser.java
parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/submodule/SubmoduleStatementSupport.java
parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/path/PathExpressionParserTest.java
xpath/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/AntlrXPathParser.java
xpath/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/InstanceIdentifierParser.java
xpath/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/Utils.java

index bdf614eb873247db377152449527f0af9ebfcaf1..6a014ac4715147af81285d0fde5f116dc9c8e648 100644 (file)
@@ -46,6 +46,19 @@ public abstract sealed class UnresolvedQName extends AbstractQName {
             this.prefix = requireNonNull(prefix);
         }
 
+        /**
+         * Create a new qualified unresolved QName.
+         *
+         * @param prefix The prefix on this qualified QName
+         * @param localName The local name of this qualified QName
+         * @return An UnqualifiedQName instance
+         * @throws NullPointerException if any argument is {@code null}
+         * @throws IllegalArgumentException if {@code localName} is not a valid YANG identifier
+         */
+        public static Qualified of(final String prefix, final String localName) {
+            return new Qualified(checkLocalName(prefix), checkLocalName(localName));
+        }
+
         /**
          * Read an QualifiedQName from a DataInput. The format is expected to match the output format of
          * {@link #writeTo(DataOutput)}.
@@ -55,7 +68,7 @@ public abstract sealed class UnresolvedQName extends AbstractQName {
          * @throws IOException if I/O error occurs
          */
         public static Qualified readFrom(final DataInput in) throws IOException {
-            return qualified(in.readUTF(), in.readUTF());
+            return of(in.readUTF(), in.readUTF());
         }
 
         @Override
@@ -127,6 +140,18 @@ public abstract sealed class UnresolvedQName extends AbstractQName {
             super(localName);
         }
 
+        /**
+         * Create a new unqualified unresolved QName.
+         *
+         * @param localName The local name of this unqualified QName
+         * @return An UnqualifiedQName instance
+         * @throws NullPointerException if localName is {@code null}
+         * @throws IllegalArgumentException if {@code localName} is not a valid YANG identifier
+         */
+        public static Unqualified of(final String localName) {
+            return new Unqualified(checkLocalName(localName));
+        }
+
         /**
          * Read an UnqualifiedQName from a DataInput. The format is expected to match the output format of
          * {@link #writeTo(DataOutput)}.
@@ -136,7 +161,7 @@ public abstract sealed class UnresolvedQName extends AbstractQName {
          * @throws IOException if I/O error occurs
          */
         public static Unqualified readFrom(final DataInput in) throws IOException {
-            return unqualified(in.readUTF());
+            return of(in.readUTF());
         }
 
         @Override
@@ -150,7 +175,6 @@ public abstract sealed class UnresolvedQName extends AbstractQName {
         }
 
         @Override
-        @SuppressFBWarnings(value = "NP_NONNULL_RETURN_VIOLATION", justification = "Non-grok of @Nullable")
         public @Nullable String getPrefix() {
             return null;
         }
@@ -206,9 +230,11 @@ public abstract sealed class UnresolvedQName extends AbstractQName {
      * @return An UnqualifiedQName instance
      * @throws NullPointerException if any argument is {@code null}
      * @throws IllegalArgumentException if {@code localName} is not a valid YANG identifier
+     * @deprecated Use {@link Qualified#of(String, String)} instead.
      */
+    @Deprecated(since = "9.0.0", forRemoval = true)
     public static Qualified qualified(final String prefix, final String localName) {
-        return new Qualified(checkLocalName(prefix), checkLocalName(localName));
+        return Qualified.of(prefix, localName);
     }
 
     /**
@@ -218,9 +244,11 @@ public abstract sealed class UnresolvedQName extends AbstractQName {
      * @return An UnqualifiedQName instance
      * @throws NullPointerException if localName is {@code null}
      * @throws IllegalArgumentException if {@code localName} is not a valid YANG identifier
+     * @deprecated Use {@link Unqualified#of(String)} instead.
      */
+    @Deprecated(since = "9.0.0", forRemoval = true)
     public static Unqualified unqualified(final String localName) {
-        return new Unqualified(checkLocalName(localName));
+        return Unqualified.of(localName);
     }
 
     /**
@@ -229,7 +257,6 @@ public abstract sealed class UnresolvedQName extends AbstractQName {
      * @param localName The local name of this unqualified QName
      * @return An UnqualifiedQName instance, or null if localName is not valid
      */
-    @SuppressFBWarnings(value = "NP_NONNULL_RETURN_VIOLATION", justification = "Non-grok of @Nullable")
     public static @Nullable Unqualified tryLocalName(final String localName) {
         return isValidLocalName(localName) ? new Unqualified(localName) : null;
     }
index eb6b00618f4d54d09772e73babfda58e3a62d1a5..565b06bdadcfdf49121b8b157020aa783b773022 100644 (file)
@@ -142,8 +142,8 @@ public final class YangConstants {
 
     // Dummy template UnqualifiedQName. These are never leaked, but are used for efficient instantiation via
     // UnqualifiedQName#bindTo()
-    private static final Unqualified DUMMY_OPERATION_INPUT = UnresolvedQName.unqualified("input");
-    private static final Unqualified DUMMY_OPERATION_OUTPUT = UnresolvedQName.unqualified("output");
+    private static final Unqualified DUMMY_OPERATION_INPUT = Unqualified.of("input");
+    private static final Unqualified DUMMY_OPERATION_OUTPUT = Unqualified.of("output");
 
     private YangConstants() {
         // Hidden on purpose
index 697739144719fa29315ef067417ca6ca703fcba5..86b27106455257e2bd00796064dbb0c3bce2eba1 100644 (file)
@@ -12,7 +12,6 @@ import com.google.common.collect.ImmutableList;
 import org.opendaylight.yangtools.odlext.model.api.AugmentIdentifierEffectiveStatement;
 import org.opendaylight.yangtools.odlext.model.api.AugmentIdentifierStatement;
 import org.opendaylight.yangtools.odlext.model.api.OpenDaylightExtensionsStatements;
-import org.opendaylight.yangtools.yang.common.UnresolvedQName;
 import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclarationReference;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
@@ -39,7 +38,7 @@ public final class AugmentIdentifierStatementSupport
     @Override
     public Unqualified parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
         try {
-            return UnresolvedQName.unqualified(value).intern();
+            return Unqualified.of(value).intern();
         } catch (IllegalArgumentException e) {
             throw new SourceException(ctx, e, "Invalid identifier \"%s\"", value);
         }
index 2b290c1278cf0f183cced9084c5991ae56dc0942..c06b2e880abc9a5c9b8d55b387f05d58f6ec82cd 100644 (file)
@@ -22,7 +22,6 @@ import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.Empty;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.common.Revision;
-import org.opendaylight.yangtools.yang.common.UnresolvedQName;
 import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.common.XMLNamespace;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
@@ -141,7 +140,7 @@ public final class ModuleStatementSupport
     @Override
     public Unqualified parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
         try {
-            return UnresolvedQName.unqualified(value);
+            return Unqualified.of(value);
         } catch (IllegalArgumentException e) {
             throw new SourceException(e.getMessage(), ctx, e);
         }
index 48ffa293b49d46f3c033dde6132fca89ca8d7f56..667d44d34a2ff07f7a5a16cfd175355de3654843 100644 (file)
@@ -19,7 +19,7 @@ import org.antlr.v4.runtime.tree.ParseTree;
 import org.antlr.v4.runtime.tree.TerminalNode;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.common.UnresolvedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.PathExpression;
 import org.opendaylight.yangtools.yang.model.api.PathExpression.DerefSteps;
 import org.opendaylight.yangtools.yang.model.api.PathExpression.LocationPathSteps;
@@ -86,8 +86,7 @@ class PathExpressionParser {
         final Steps steps;
         if (childPath instanceof Path_strContext) {
             steps = new LocationPathSteps(parsePathStr(ctx, pathArg, (Path_strContext) childPath));
-        } else if (childPath instanceof Deref_exprContext) {
-            final Deref_exprContext deref = (Deref_exprContext) childPath;
+        } else if (childPath instanceof Deref_exprContext deref) {
             steps = new DerefSteps(parseRelative(ctx, pathArg,
                 getChild(deref, 0, Deref_function_invocationContext.class).getChild(Relative_pathContext.class, 0)),
                 parseRelative(ctx, pathArg, getChild(deref, deref.getChildCount() - 1, Relative_pathContext.class)));
@@ -221,7 +220,7 @@ class PathExpressionParser {
     private static YangQNameExpr createChildExpr(final StmtContext<?, ?, ?> ctx, final Node_identifierContext qname) {
         switch (qname.getChildCount()) {
             case 1:
-                return YangQNameExpr.of(UnresolvedQName.unqualified(qname.getText()).intern());
+                return YangQNameExpr.of(Unqualified.of(qname.getText()).intern());
             case 3:
                 return YangQNameExpr.of(parseQName(ctx, qname));
             default:
@@ -233,7 +232,7 @@ class PathExpressionParser {
             final List<YangExpr> predicates) {
         switch (qname.getChildCount()) {
             case 1:
-                return YangXPathAxis.CHILD.asStep(UnresolvedQName.unqualified(qname.getText()).intern(), predicates);
+                return YangXPathAxis.CHILD.asStep(Unqualified.of(qname.getText()).intern(), predicates);
             case 3:
                 return YangXPathAxis.CHILD.asStep(parseQName(ctx, qname), predicates);
             default:
index dd1af390bf6396453acb5fcc0568c811628e427c..1a1e4abe82248fc6bb11947ece883aeb3837199f 100644 (file)
@@ -13,7 +13,6 @@ import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.f
 import com.google.common.annotations.Beta;
 import com.google.common.collect.ImmutableList;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.yang.common.UnresolvedQName;
 import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclarationReference;
@@ -117,7 +116,7 @@ public final class SubmoduleStatementSupport
     @Override
     public Unqualified parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
         try {
-            return UnresolvedQName.unqualified(value);
+            return Unqualified.of(value);
         } catch (IllegalArgumentException e) {
             throw new SourceException(e.getMessage(), ctx, e);
         }
index 6a4d4183705f454f1f98be6626ecaa3b009e25aa..4d0259a0ea6448d35b7b04b7fee637e92ecbb015 100644 (file)
@@ -24,7 +24,7 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
-import org.opendaylight.yangtools.yang.common.UnresolvedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.PathExpression;
 import org.opendaylight.yangtools.yang.model.api.PathExpression.DerefSteps;
 import org.opendaylight.yangtools.yang.model.api.PathExpression.LocationPathSteps;
@@ -66,9 +66,9 @@ public class PathExpressionParserTest {
 
         final DerefSteps derefSteps = (DerefSteps) steps;
         assertEquals(YangLocationPath.relative(YangXPathAxis.PARENT.asStep(),
-            YangXPathAxis.CHILD.asStep(UnresolvedQName.unqualified("type"))), derefSteps.getRelativePath());
+            YangXPathAxis.CHILD.asStep(Unqualified.of("type"))), derefSteps.getRelativePath());
         assertEquals(YangLocationPath.relative(YangXPathAxis.PARENT.asStep(),
-            YangXPathAxis.CHILD.asStep(UnresolvedQName.unqualified("id"))), derefSteps.getDerefArgument());
+            YangXPathAxis.CHILD.asStep(Unqualified.of("id"))), derefSteps.getDerefArgument());
     }
 
     @Test
@@ -114,13 +114,13 @@ public class PathExpressionParserTest {
 
         path.getSteps();
         assertEquals(ImmutableList.of(
-            YangXPathAxis.CHILD.asStep(UnresolvedQName.unqualified("device_types")),
-            YangXPathAxis.CHILD.asStep(UnresolvedQName.unqualified("device_type"),
+            YangXPathAxis.CHILD.asStep(Unqualified.of("device_types")),
+            YangXPathAxis.CHILD.asStep(Unqualified.of("device_type"),
                 ImmutableSet.of(YangBinaryOperator.EQUALS.exprWith(
-                    YangQNameExpr.of(UnresolvedQName.unqualified("type")),
+                    YangQNameExpr.of(Unqualified.of("type")),
                     YangPathExpr.of(YangFunctionCallExpr.of(YangFunction.CURRENT.getIdentifier()), Relative.relative(
                         YangXPathAxis.PARENT.asStep(),
-                        YangXPathAxis.CHILD.asStep(UnresolvedQName.unqualified("type_text"))))))),
-            YangXPathAxis.CHILD.asStep(UnresolvedQName.unqualified("desc"))), path.getSteps());
+                        YangXPathAxis.CHILD.asStep(Unqualified.of("type_text"))))))),
+            YangXPathAxis.CHILD.asStep(Unqualified.of("desc"))), path.getSteps());
     }
 }
index 1c381a4ae836aae1419baca7c5c94e69c0dffcb9..8a93731f4d7eff249a79b37632b28061056933bc 100644 (file)
@@ -117,13 +117,13 @@ abstract class AntlrXPathParser implements YangXPathParser {
         @Override
         QNameStep createStep(final YangXPathAxis axis, final String localName,
                 final List<YangExpr> predicates) {
-            return axis.asStep(UnresolvedQName.unqualified(localName).intern(), predicates);
+            return axis.asStep(UnresolvedQName.Unqualified.of(localName).intern(), predicates);
         }
 
         @Override
         QNameStep createStep(final YangXPathAxis axis, final String prefix, final String localName,
                 final List<YangExpr> predicates) {
-            return axis.asStep(UnresolvedQName.qualified(prefix, localName).intern(), predicates);
+            return axis.asStep(UnresolvedQName.Qualified.of(prefix, localName).intern(), predicates);
         }
 
         @Override
index c3654f0b7877feea3f58e9df7fc51195a8f8caa5..e232653ac716cf82148325e2a2780c77f1179505 100644 (file)
@@ -55,12 +55,12 @@ abstract class InstanceIdentifierParser {
 
         @Override
         YangQNameExpr createExpr(final String prefix, final String localName) {
-            return YangQNameExpr.of(UnresolvedQName.qualified(prefix, localName));
+            return YangQNameExpr.of(UnresolvedQName.Qualified.of(prefix, localName));
         }
 
         @Override
         QNameStep createChildStep(final String prefix, final String localName, final Collection<YangExpr> predicates) {
-            return YangXPathAxis.CHILD.asStep(UnresolvedQName.qualified(prefix, localName), predicates);
+            return YangXPathAxis.CHILD.asStep(UnresolvedQName.Qualified.of(prefix, localName), predicates);
         }
     }
 
index a0f04393859e4784c3a9c4ed57dd9f3541e834a5..b965d9b005dcf157395ea767bb9ce075761820d9 100644 (file)
@@ -12,6 +12,8 @@ import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.common.UnresolvedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Qualified;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.common.YangNamespaceContext;
 import org.opendaylight.yangtools.yang.xpath.api.YangLiteralExpr;
 import org.opendaylight.yangtools.yang.xpath.api.YangQNameExpr;
@@ -23,7 +25,7 @@ import org.opendaylight.yangtools.yang.xpath.api.YangQNameExpr.Unresolved;
  */
 final class Utils {
     private Utils() {
-
+        // Hidden on purpose
     }
 
     static Unresolved interpretAsQName(final YangLiteralExpr expr) throws XPathExpressionException {
@@ -32,8 +34,8 @@ final class Utils {
 
         final UnresolvedQName qname;
         try {
-            qname = colon != -1 ? UnresolvedQName.qualified(text.substring(0, colon), text.substring(colon + 1))
-                    : UnresolvedQName.unqualified(text);
+            qname = colon != -1 ? Qualified.of(text.substring(0, colon), text.substring(colon + 1))
+                    : Unqualified.of(text);
         } catch (IllegalArgumentException e) {
             throw wrapException(e, "Cannot interpret %s as a QName", expr);
         }
@@ -47,7 +49,7 @@ final class Utils {
         final int colon = text.indexOf(':');
         try {
             if (colon == -1) {
-                return YangQNameExpr.of(UnresolvedQName.unqualified(text).intern());
+                return YangQNameExpr.of(Unqualified.of(text).intern());
             }
 
             return YangQNameExpr.of(namespaceContext.createQName(text.substring(0, colon), text.substring(colon + 1)));