Introduce UnresolvedQName 46/97646/5
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 27 Sep 2021 11:38:09 +0000 (13:38 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 27 Sep 2021 13:53:04 +0000 (15:53 +0200)
Our AbstractQName hierarchy has either a resolved QName, or two
unresolved {Qualified,Unqualified}QNames. The quality of being resolved
vs. unresolved is not modeled.

Introduce UnresolvedQName as the only AbstractQName alternative to
QName, so that it can be used to model this distinction. This allows,
for example, yang-xpath-api to be specified better.

JIRA: YANGTOOLS-1329
Change-Id: I9893850cea27bdd98d08b00ceb8c1f288dcc2778
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
42 files changed:
common/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/AbstractQName.java
common/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QQNv1.java
common/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QualifiedQName.java [deleted file]
common/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/UQNv1.java
common/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/UnqualifiedQName.java [deleted file]
common/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/UnresolvedQName.java [new file with mode: 0644]
common/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/YangConstants.java
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/leafref/LeafRefPathParserImpl.java
model/odlext-model-api/src/main/java/org/opendaylight/yangtools/odlext/model/api/AugmentIdentifierEffectiveStatement.java
model/odlext-model-api/src/main/java/org/opendaylight/yangtools/odlext/model/api/AugmentIdentifierStatement.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/BodyDeclaredStatement.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/LinkageDeclaredStatement.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/ModuleEffectiveStatement.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/ModuleStatement.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RevisionAwareDeclaredStatement.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/SubmoduleEffectiveStatement.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/SubmoduleStatement.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/DeclaredStatements.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/decl/AbstractDeclaredEffectiveRootStatement.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/decl/ModuleStatementImpl.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/decl/SubmoduleStatementImpl.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/ref/RefModuleStatement.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/ref/RefSubmoduleStatement.java
model/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaInferenceStack.java
parser/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AugmentIdentifierEffectiveStatementImpl.java
parser/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AugmentIdentifierStatementImpl.java
parser/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AugmentIdentifierStatementSupport.java
parser/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/RefAugmentIdentifierStatement.java
parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveModule.java
parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/ModuleEffectiveStatementImpl.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/SubmoduleEffectiveStatementImpl.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-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/YangLocationPath.java
xpath/yang-xpath-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/YangQNameExpr.java
xpath/yang-xpath-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/YangXPathAxis.java
xpath/yang-xpath-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/YangXPathExpression.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 c82e3a02cc27efc44ad9d883b26b846527aa1c80..5e4f696b7f2390489f4598590d996b5043dfcb60 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.yangtools.yang.common;
 import static com.google.common.base.Preconditions.checkArgument;
 import static java.util.Objects.requireNonNull;
 
-import com.google.common.annotations.Beta;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.concepts.Identifier;
@@ -18,9 +17,9 @@ import org.opendaylight.yangtools.concepts.WritableObject;
 
 /**
  * Abstract superclass for sharing QName references, which can either be resolved {@link QName}s or unresolved
- * {@link UnqualifiedQName} and {@link QualifiedQName}s.
+ * {@link UnresolvedQName.Unqualified} and {@link UnresolvedQName.Qualified}s.
  */
-@Beta
+// FIXME: sealed to allow QName and UnresolvedQName only when we have JDK17+
 @NonNullByDefault
 public abstract class AbstractQName implements Identifier, WritableObject {
     private static final long serialVersionUID = 1L;
index 1623681cfbdd53a3a484b66fb5229f43158e9ffc..8f81ccad4015d0554261e90a9bf93760509ee602 100644 (file)
@@ -14,21 +14,22 @@ import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Qualified;
 
 /**
- * Externalizable proxy for {@link QualifiedQName}.
+ * Externalizable proxy for {@link Qualified}.
  */
 final class QQNv1 implements Externalizable {
     private static final long serialVersionUID = 1L;
 
-    private QualifiedQName qname;
+    private Qualified qname;
 
     @SuppressWarnings("checkstyle:redundantModifier")
     public QQNv1() {
         // For Externalizable
     }
 
-    QQNv1(final QualifiedQName qname) {
+    QQNv1(final Qualified qname) {
         this.qname = requireNonNull(qname);
     }
 
@@ -39,7 +40,7 @@ final class QQNv1 implements Externalizable {
 
     @Override
     public void readExternal(final ObjectInput in) throws IOException {
-        qname = QualifiedQName.readFrom(in);
+        qname = Qualified.readFrom(in);
     }
 
     Object readResolve() {
diff --git a/common/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QualifiedQName.java b/common/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QualifiedQName.java
deleted file mode 100644 (file)
index 1c12ecb..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.yangtools.yang.common;
-
-import static java.util.Objects.requireNonNull;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-import java.util.Optional;
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.jdt.annotation.Nullable;
-
-/**
- * An unresolved, qualified {@link QName}. It is guaranteed to hold a valid {@link #getLocalName()} bound to a namespace
- * identified through a prefix string, but remains unresolved. A resolved {@link QName} can be obtained through
- * {@link #bindTo(YangNamespaceContext)}.
- */
-@Beta
-@NonNullByDefault
-public final class QualifiedQName extends AbstractQName implements Comparable<QualifiedQName> {
-    private static final long serialVersionUID = 1L;
-    private static final Interner<QualifiedQName> INTERNER = Interners.newWeakInterner();
-
-    private final String prefix;
-
-    private QualifiedQName(final String prefix, final String localName) {
-        super(localName);
-        this.prefix = requireNonNull(prefix);
-    }
-
-    public static QualifiedQName of(final String prefix, final String localName) {
-        return new QualifiedQName(checkLocalName(prefix), checkLocalName(localName));
-    }
-
-    /**
-     * Read an QualifiedQName from a DataInput. The format is expected to match the output format of
-     * {@link #writeTo(DataOutput)}.
-     *
-     * @param in DataInput to read
-     * @return An QualifiedQName instance
-     * @throws IOException if I/O error occurs
-     */
-    public static QualifiedQName readFrom(final DataInput in) throws IOException {
-        return of(in.readUTF(), in.readUTF());
-    }
-
-    public Optional<QName> bindTo(final YangNamespaceContext namespaceContext) {
-        return namespaceContext.findNamespaceForPrefix(prefix).map(this::bindTo);
-    }
-
-    @Override
-    @SuppressFBWarnings(value = "ES_COMPARING_STRINGS_WITH_EQ", justification = "Interning identity check")
-    public QualifiedQName intern() {
-        // Make sure to intern the string and check whether it refers to the same name as we are
-        final String name = getLocalName();
-        final String internedName = name.intern();
-        final QualifiedQName template = internedName == name ? this : new QualifiedQName(prefix.intern(), internedName);
-        return INTERNER.intern(template);
-    }
-
-    @Override
-    @SuppressWarnings("checkstyle:parameterName")
-    public int compareTo(final QualifiedQName o) {
-        return getLocalName().compareTo(o.getLocalName());
-    }
-
-    @Override
-    public void writeTo(final DataOutput out) throws IOException {
-        out.writeUTF(getLocalName());
-    }
-
-    @Override
-    public int hashCode() {
-        return getLocalName().hashCode();
-    }
-
-    @Override
-    public boolean equals(final @Nullable Object obj) {
-        return this == obj || obj instanceof QualifiedQName
-                && getLocalName().equals(((AbstractQName) obj).getLocalName());
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this).add("localName", getLocalName()).toString();
-    }
-
-    @Override
-    Object writeReplace() {
-        return new QQNv1(this);
-    }
-}
index a0955ae92260350fb7459d7b9a2fb768eb6c9f73..f1e144117756d6467dfe22c076ad05e915c5da68 100644 (file)
@@ -14,21 +14,22 @@ import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 
 /**
- * Externalizable proxy for {@link UnqualifiedQName}.
+ * Externalizable proxy for {@link Unqualified}.
  */
 final class UQNv1 implements Externalizable {
     private static final long serialVersionUID = 1L;
 
-    private UnqualifiedQName qname;
+    private Unqualified qname;
 
     @SuppressWarnings("checkstyle:redundantModifier")
     public UQNv1() {
         // For Externalizable
     }
 
-    UQNv1(final UnqualifiedQName qname) {
+    UQNv1(final Unqualified qname) {
         this.qname = requireNonNull(qname);
     }
 
@@ -39,7 +40,7 @@ final class UQNv1 implements Externalizable {
 
     @Override
     public void readExternal(final ObjectInput in) throws IOException {
-        qname = UnqualifiedQName.readFrom(in);
+        qname = Unqualified.readFrom(in);
     }
 
     Object readResolve() {
diff --git a/common/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/UnqualifiedQName.java b/common/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/UnqualifiedQName.java
deleted file mode 100644 (file)
index 821bc91..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.yangtools.yang.common;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.jdt.annotation.Nullable;
-
-/**
- * An unresolved, unqualified {@link QName}. It is guaranteed to hold a valid {@link #getLocalName()}, in the default
- * namespace, which is not resolved. A resolved {@link QName} can be constructed through {@link #bindTo(QNameModule)}.
- */
-@Beta
-@NonNullByDefault
-public final class UnqualifiedQName extends AbstractQName implements Comparable<UnqualifiedQName> {
-    private static final long serialVersionUID = 1L;
-    private static final Interner<UnqualifiedQName> INTERNER = Interners.newWeakInterner();
-
-    private UnqualifiedQName(final String localName) {
-        super(localName);
-    }
-
-    /**
-     * Create a new unqualified QName.
-     *
-     * @param localName The local name of this unqualified QName
-     * @return An UnqualifiedQName instance
-     * @throws NullPointerException if localName is null
-     * @throws IllegalArgumentException if localName is not a valid YANG identifier
-     */
-    public static UnqualifiedQName of(final String localName) {
-        return new UnqualifiedQName(checkLocalName(localName));
-    }
-
-    /**
-     * Create a new unqualified QName.
-     *
-     * @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 UnqualifiedQName tryCreate(final String localName) {
-        return isValidLocalName(localName) ? new UnqualifiedQName(localName) : null;
-    }
-
-    /**
-     * Read an UnqualifiedQName from a DataInput. The format is expected to match the output format of
-     * {@link #writeTo(DataOutput)}.
-     *
-     * @param in DataInput to read
-     * @return An UnqualifiedQName instance
-     * @throws IOException if I/O error occurs
-     */
-    public static UnqualifiedQName readFrom(final DataInput in) throws IOException {
-        return of(in.readUTF());
-    }
-
-    @Override
-    @SuppressFBWarnings(value = "ES_COMPARING_STRINGS_WITH_EQ", justification = "Interning identity check")
-    public UnqualifiedQName intern() {
-        // Make sure to intern the string and check whether it refers to the same name as we are
-        final String name = getLocalName();
-        final String internedName = name.intern();
-        final UnqualifiedQName template = internedName == name ? this : new UnqualifiedQName(internedName);
-        return INTERNER.intern(template);
-    }
-
-    @Override
-    @SuppressWarnings("checkstyle:parameterName")
-    public int compareTo(final UnqualifiedQName o) {
-        return getLocalName().compareTo(o.getLocalName());
-    }
-
-    @Override
-    public void writeTo(final DataOutput out) throws IOException {
-        out.writeUTF(getLocalName());
-    }
-
-    @Override
-    public int hashCode() {
-        return getLocalName().hashCode();
-    }
-
-    @Override
-    public boolean equals(final @Nullable Object obj) {
-        return this == obj || obj instanceof UnqualifiedQName
-                && getLocalName().equals(((AbstractQName) obj).getLocalName());
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this).add("localName", getLocalName()).toString();
-    }
-
-    @Override
-    Object writeReplace() {
-        return new UQNv1(this);
-    }
-}
diff --git a/common/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/UnresolvedQName.java b/common/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/UnresolvedQName.java
new file mode 100644 (file)
index 0000000..58ea59f
--- /dev/null
@@ -0,0 +1,238 @@
+/*
+ * Copyright (c) 2021 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.common;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.Interner;
+import com.google.common.collect.Interners;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.Optional;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+
+/**
+ * A {@link QName} equivalent which has not been resolved. There are two subclasses:
+ * <ol>
+ *   <li>{@link Unqualified}, which holds only a local name available through {@link #getLocalName()}.<li>
+ *   <li>{@link Qualified}, which also holds a string prefix available via {@link Qualified#getPrefix()}.</li>
+ * </ol>
+ */
+// FIXME: sealed to allow Qualified and Unqualified only when we have JDK17+
+@NonNullByDefault
+public abstract class UnresolvedQName extends AbstractQName {
+    /**
+     * An unresolved, qualified {@link QName}. It is guaranteed to hold a valid {@link #getLocalName()} bound to a
+     * namespace identified through a prefix string, but remains unresolved. A resolved {@link QName} can be obtained
+     * through {@link #bindTo(YangNamespaceContext)}.
+     */
+    public static final class Qualified extends UnresolvedQName implements Comparable<Qualified> {
+        private static final long serialVersionUID = 1L;
+        private static final Interner<Qualified> INTERNER = Interners.newWeakInterner();
+
+        private final String prefix;
+
+        private Qualified(final String prefix, final String localName) {
+            super(localName);
+            this.prefix = requireNonNull(prefix);
+        }
+
+        /**
+         * Read an QualifiedQName from a DataInput. The format is expected to match the output format of
+         * {@link #writeTo(DataOutput)}.
+         *
+         * @param in DataInput to read
+         * @return An QualifiedQName instance
+         * @throws IOException if I/O error occurs
+         */
+        public static Qualified readFrom(final DataInput in) throws IOException {
+            return qualified(in.readUTF(), in.readUTF());
+        }
+
+        @Override
+        public @NonNull String getPrefix() {
+            return prefix;
+        }
+
+        public Optional<QName> bindTo(final YangNamespaceContext namespaceContext) {
+            return namespaceContext.findNamespaceForPrefix(prefix).map(this::bindTo);
+        }
+
+        @Override
+        @SuppressFBWarnings(value = "ES_COMPARING_STRINGS_WITH_EQ", justification = "Interning identity check")
+        public Qualified intern() {
+            // Make sure to intern the string and check whether it refers to the same name as we are
+            final String name = getLocalName();
+            final String internedName = name.intern();
+            final Qualified template = internedName == name ? this : new Qualified(prefix.intern(), internedName);
+            return INTERNER.intern(template);
+        }
+
+        @Override
+        @SuppressWarnings("checkstyle:parameterName")
+        public int compareTo(final Qualified o) {
+            return getLocalName().compareTo(o.getLocalName());
+        }
+
+        @Override
+        public void writeTo(final DataOutput out) throws IOException {
+            out.writeUTF(getLocalName());
+        }
+
+        @Override
+        public int hashCode() {
+            return getLocalName().hashCode();
+        }
+
+        @Override
+        public boolean equals(final @Nullable Object obj) {
+            return this == obj || obj instanceof Qualified && getLocalName().equals(((Qualified) obj).getLocalName());
+        }
+
+        @Override
+        public String toString() {
+            return MoreObjects.toStringHelper(this).add("localName", getLocalName()).toString();
+        }
+
+        @Override
+        Object writeReplace() {
+            return new QQNv1(this);
+        }
+    }
+
+    /**
+     * An unresolved, unqualified {@link QName}. It is guaranteed to hold a valid {@link #getLocalName()}, in the
+     * default namespace, which is not resolved. A resolved {@link QName} can be constructed through
+     * {@link #bindTo(QNameModule)}.
+     */
+    public static final class Unqualified extends UnresolvedQName implements Comparable<Unqualified> {
+        private static final long serialVersionUID = 1L;
+        private static final Interner<Unqualified> INTERNER = Interners.newWeakInterner();
+
+        private Unqualified(final String localName) {
+            super(localName);
+        }
+
+        /**
+         * Read an UnqualifiedQName from a DataInput. The format is expected to match the output format of
+         * {@link #writeTo(DataOutput)}.
+         *
+         * @param in DataInput to read
+         * @return An UnqualifiedQName instance
+         * @throws IOException if I/O error occurs
+         */
+        public static Unqualified readFrom(final DataInput in) throws IOException {
+            return unqualified(in.readUTF());
+        }
+
+        @Override
+        @SuppressFBWarnings(value = "ES_COMPARING_STRINGS_WITH_EQ", justification = "Interning identity check")
+        public Unqualified intern() {
+            // Make sure to intern the string and check whether it refers to the same name as we are
+            final String name = getLocalName();
+            final String internedName = name.intern();
+            final Unqualified template = internedName == name ? this : new Unqualified(internedName);
+            return INTERNER.intern(template);
+        }
+
+        @Override
+        @SuppressFBWarnings(value = "NP_NONNULL_RETURN_VIOLATION", justification = "Non-grok of @Nullable")
+        public @Nullable String getPrefix() {
+            return null;
+        }
+
+        @Override
+        @SuppressWarnings("checkstyle:parameterName")
+        public int compareTo(final Unqualified o) {
+            return getLocalName().compareTo(o.getLocalName());
+        }
+
+        @Override
+        public void writeTo(final DataOutput out) throws IOException {
+            out.writeUTF(getLocalName());
+        }
+
+        @Override
+        public int hashCode() {
+            return getLocalName().hashCode();
+        }
+
+        @Override
+        public boolean equals(final @Nullable Object obj) {
+            return this == obj || obj instanceof Unqualified
+                    && getLocalName().equals(((AbstractQName) obj).getLocalName());
+        }
+
+        @Override
+        public String toString() {
+            return MoreObjects.toStringHelper(this).add("localName", getLocalName()).toString();
+        }
+
+        @Override
+        Object writeReplace() {
+            return new UQNv1(this);
+        }
+    }
+
+    private static final long serialVersionUID = 1L;
+
+    private UnresolvedQName(final String localName) {
+        super(localName);
+    }
+
+    /**
+     * 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 qualified(final String prefix, final String localName) {
+        return new Qualified(checkLocalName(prefix), checkLocalName(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 unqualified(final String localName) {
+        return new Unqualified(checkLocalName(localName));
+    }
+
+    /**
+     * Try to create a new unqualified QName.
+     *
+     * @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;
+    }
+
+    @Override
+    public abstract UnresolvedQName intern();
+
+    /**
+     * Return the prefix of this unresolved QName.
+     *
+     * @return This QName's prefix
+     */
+    public abstract @Nullable String getPrefix();
+}
index d6b83a3bda0bb9750559e11296eb3c01e244dc73..eb6b00618f4d54d09772e73babfda58e3a62d1a5 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.common;
 
 import java.net.URI;
 import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 
 /**
  * Constant definitions present in RFC documents related to the YANG language.
@@ -141,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 UnqualifiedQName DUMMY_OPERATION_INPUT = UnqualifiedQName.of("input");
-    private static final UnqualifiedQName DUMMY_OPERATION_OUTPUT = UnqualifiedQName.of("output");
+    private static final Unqualified DUMMY_OPERATION_INPUT = UnresolvedQName.unqualified("input");
+    private static final Unqualified DUMMY_OPERATION_OUTPUT = UnresolvedQName.unqualified("output");
 
     private YangConstants() {
         // Hidden on purpose
index 2e763958b74c047a170f2d84e8fb668ec8e8f790..f3545ac731bff6740324847828dd1257f88b82dd 100644 (file)
@@ -16,7 +16,7 @@ import java.util.Set;
 import org.opendaylight.yangtools.yang.common.AbstractQName;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+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;
@@ -65,8 +65,8 @@ final class LeafRefPathParserImpl {
         //        where the typedef is referenced.  If a typedef is defined and
         //        referenced within a grouping, the namespace is affected by where
         //        the grouping is used (see Section 7.13).
-        this.leafrefModule = getBaseModule(leafrefType);
-        this.nodeModule = currentNode.getQName().getModule();
+        leafrefModule = getBaseModule(leafrefType);
+        nodeModule = currentNode.getQName().getModule();
     }
 
     LeafRefPath parseLeafRefPath(final PathExpression path) {
@@ -155,9 +155,9 @@ final class LeafRefPathParserImpl {
     private static QName resolve(final AbstractQName qname, final QNameModule localModule) {
         if (qname instanceof QName) {
             return (QName) qname;
-        } else if (qname instanceof UnqualifiedQName) {
+        } else if (qname instanceof Unqualified) {
             // Bind to namespace. Note we expect to perform frequent matching, hence we are interning the result
-            return ((UnqualifiedQName) qname).bindTo(localModule).intern();
+            return ((Unqualified) qname).bindTo(localModule).intern();
         } else {
             throw new IllegalStateException("Unhandled unresolved QName " + qname);
         }
index f73dc00f55cc130b88d04a02727f5542d1febf2b..a6f5e40e9da308632bd957f89942e0d7bb22e11d 100644 (file)
@@ -8,13 +8,13 @@
 package org.opendaylight.yangtools.odlext.model.api;
 
 import com.google.common.annotations.Beta;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnknownEffectiveStatement;
 
 @Beta
 public interface AugmentIdentifierEffectiveStatement
-        extends UnknownEffectiveStatement<UnqualifiedQName, AugmentIdentifierStatement> {
+        extends UnknownEffectiveStatement<Unqualified, AugmentIdentifierStatement> {
     @Override
     default StatementDefinition statementDefinition() {
         return OpenDaylightExtensionsStatements.AUGMENT_IDENTIFIER;
index c850264c6c1063668571aca350623b6d90e6a4d6..cd07e5b876e2a25b59850c6a858a92caacc06971 100644 (file)
@@ -8,12 +8,12 @@
 package org.opendaylight.yangtools.odlext.model.api;
 
 import com.google.common.annotations.Beta;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
 
 @Beta
-public interface AugmentIdentifierStatement extends UnknownStatement<UnqualifiedQName> {
+public interface AugmentIdentifierStatement extends UnknownStatement<Unqualified> {
     @Override
     default StatementDefinition statementDefinition() {
         return OpenDaylightExtensionsStatements.AUGMENT_IDENTIFIER;
index d7c23cd82abc8e74ad7d9a463693ec74412aafa1..63d6af57427676feb677ab256abb55c6c5d91234 100644 (file)
@@ -10,11 +10,11 @@ package org.opendaylight.yangtools.yang.model.api.stmt;
 import com.google.common.annotations.Beta;
 import java.util.Collection;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 
 @Beta
-public interface BodyDeclaredStatement extends NotificationStatementAwareDeclaredStatement<UnqualifiedQName>,
-        DataDefinitionAwareDeclaredStatement.WithReusableDefinitions<UnqualifiedQName> {
+public interface BodyDeclaredStatement extends NotificationStatementAwareDeclaredStatement<Unqualified>,
+        DataDefinitionAwareDeclaredStatement.WithReusableDefinitions<Unqualified> {
     default @NonNull Collection<? extends ExtensionStatement> getExtensions() {
         return declaredSubstatements(ExtensionStatement.class);
     }
index 88f93c0bdee7ff6333ccdcda3c5d509e2fd37df2..7cda41af595fb58cb3866a62bdf236992ea9f2c5 100644 (file)
@@ -10,11 +10,11 @@ package org.opendaylight.yangtools.yang.model.api.stmt;
 import com.google.common.annotations.Beta;
 import java.util.Collection;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 
 @Beta
-public interface LinkageDeclaredStatement extends DeclaredStatement<UnqualifiedQName> {
+public interface LinkageDeclaredStatement extends DeclaredStatement<Unqualified> {
     default @NonNull Collection<? extends ImportStatement> getImports() {
         return declaredSubstatements(ImportStatement.class);
     }
index 7df36936d9dcf122e00019867db214111acc32f7..d9f436fc715c74078e7cc6e87562a758ea18be47 100644 (file)
@@ -11,7 +11,7 @@ import com.google.common.annotations.Beta;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
@@ -21,7 +21,7 @@ import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
  */
 @Beta
 public interface ModuleEffectiveStatement
-        extends DataTreeAwareEffectiveStatement<UnqualifiedQName, ModuleStatement>, SchemaTreeRoot {
+        extends DataTreeAwareEffectiveStatement<Unqualified, ModuleStatement>, SchemaTreeRoot {
     /**
      * Namespace mapping all known prefixes in a module to their modules. Note this namespace includes the module
      * in which it is instantiated.
index bdfbe66f6ae92239a04cb1980a0bc46cfdfe064d..965012460ef49ac32d8b64db8c91ae87f8bd3acb 100644 (file)
@@ -8,11 +8,11 @@
 package org.opendaylight.yangtools.yang.model.api.stmt;
 
 import java.util.Optional;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
-public interface ModuleStatement extends MetaDeclaredStatement<UnqualifiedQName>, ModuleHeaderGroup,
+public interface ModuleStatement extends MetaDeclaredStatement<Unqualified>, ModuleHeaderGroup,
         LinkageDeclaredStatement, RevisionAwareDeclaredStatement, BodyDeclaredStatement {
     @Override
     default StatementDefinition statementDefinition() {
index 0faea315b5b17b0335499fa1bd5320e38a5ce872..4961153ae806501e84620f382c87ee7e4dddf2b4 100644 (file)
@@ -10,11 +10,11 @@ package org.opendaylight.yangtools.yang.model.api.stmt;
 import com.google.common.annotations.Beta;
 import java.util.Collection;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 
 @Beta
-public interface RevisionAwareDeclaredStatement extends DeclaredStatement<UnqualifiedQName> {
+public interface RevisionAwareDeclaredStatement extends DeclaredStatement<Unqualified> {
     default @NonNull Collection<? extends RevisionStatement> getRevisions() {
         return declaredSubstatements(RevisionStatement.class);
     }
index bdf12cca658d7e7df5fff6cbf6ef81c93f7e3bb4..67410d92d02bf7c247b5e3914f07cf0be096aa9c 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.yangtools.yang.model.api.stmt;
 
 import com.google.common.annotations.Beta;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
@@ -19,7 +19,7 @@ import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
  */
 @Beta
 public interface SubmoduleEffectiveStatement
-        extends DataTreeAwareEffectiveStatement<UnqualifiedQName, SubmoduleStatement> {
+        extends DataTreeAwareEffectiveStatement<Unqualified, SubmoduleStatement> {
     @Override
     default StatementDefinition statementDefinition() {
         return YangStmtMapping.SUBMODULE;
index 4672f2d13935a7cb6156f5ab0e640087d505c9ed..df75ae109dc62420eaa7b2ca71141e969428754a 100644 (file)
@@ -10,11 +10,11 @@ package org.opendaylight.yangtools.yang.model.api.stmt;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
-public interface SubmoduleStatement extends MetaDeclaredStatement<UnqualifiedQName>, LinkageDeclaredStatement,
+public interface SubmoduleStatement extends MetaDeclaredStatement<Unqualified>, LinkageDeclaredStatement,
         RevisionAwareDeclaredStatement, BodyDeclaredStatement {
     @Override
     default StatementDefinition statementDefinition() {
index c445ee2ba26d3a95688493cef2e95a54494259d3..e0bed7821b364caa5738ec3d6bd379b9335364bf 100644 (file)
@@ -16,7 +16,7 @@ import org.opendaylight.yangtools.yang.common.Ordering;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.Revision;
 import org.opendaylight.yangtools.yang.common.Uint32;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.common.XMLNamespace;
 import org.opendaylight.yangtools.yang.common.YangVersion;
 import org.opendaylight.yangtools.yang.model.api.DeviateKind;
@@ -490,7 +490,7 @@ public final class DeclaredStatements {
             : new RegularModifierStatement(argument, substatements);
     }
 
-    public static ModuleStatement createModule(final String rawArgument, final UnqualifiedQName argument,
+    public static ModuleStatement createModule(final String rawArgument, final Unqualified argument,
             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
         return new ModuleStatementImpl(rawArgument, argument, substatements);
     }
@@ -637,7 +637,7 @@ public final class DeclaredStatements {
         }
     }
 
-    public static SubmoduleStatement createSubmodule(final String rawArgument, final UnqualifiedQName argument,
+    public static SubmoduleStatement createSubmodule(final String rawArgument, final Unqualified argument,
             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
         return new SubmoduleStatementImpl(rawArgument, argument, substatements);
     }
index cb5a71d6896d71e330461f51596d132f46996bfe..1ecf54d0e839f026d2e476597b99101b85abf0ad 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl;
 
 import com.google.common.collect.ImmutableList;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.BodyDeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.LinkageDeclaredStatement;
@@ -16,10 +16,10 @@ import org.opendaylight.yangtools.yang.model.api.stmt.MetaDeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionAwareDeclaredStatement;
 import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithArgument.WithSubstatements;
 
-abstract class AbstractDeclaredEffectiveRootStatement<D extends DeclaredStatement<UnqualifiedQName>>
-        extends WithSubstatements<UnqualifiedQName> implements LinkageDeclaredStatement,
-                MetaDeclaredStatement<UnqualifiedQName>, RevisionAwareDeclaredStatement, BodyDeclaredStatement {
-    protected AbstractDeclaredEffectiveRootStatement(final String rawArgument, final UnqualifiedQName argument,
+abstract class AbstractDeclaredEffectiveRootStatement<D extends DeclaredStatement<Unqualified>>
+        extends WithSubstatements<Unqualified> implements LinkageDeclaredStatement,
+                MetaDeclaredStatement<Unqualified>, RevisionAwareDeclaredStatement, BodyDeclaredStatement {
+    protected AbstractDeclaredEffectiveRootStatement(final String rawArgument, final Unqualified argument,
             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
         super(rawArgument, argument, substatements);
     }
index a659ab14894ad6366c0f646f8fd319b09c9b3837..38058b0d988b66f649ccd704edb84f6bb09bda8e 100644 (file)
@@ -8,13 +8,13 @@
 package org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl;
 
 import com.google.common.collect.ImmutableList;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
 
 public final class ModuleStatementImpl extends AbstractDeclaredEffectiveRootStatement<ModuleStatement>
         implements ModuleStatement {
-    public ModuleStatementImpl(final String rawArgument, final UnqualifiedQName argument,
+    public ModuleStatementImpl(final String rawArgument, final Unqualified argument,
             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
         super(rawArgument, argument, substatements);
     }
index fd319fa425dbb2f4b4b0d02a1c508424453b11ac..c54593156f5e6c0b3caea489436509cca0c55e0c 100644 (file)
@@ -8,13 +8,13 @@
 package org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl;
 
 import com.google.common.collect.ImmutableList;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement;
 
 public final class SubmoduleStatementImpl extends AbstractDeclaredEffectiveRootStatement<SubmoduleStatement>
         implements SubmoduleStatement {
-    public SubmoduleStatementImpl(final String rawArgument, final UnqualifiedQName argument,
+    public SubmoduleStatementImpl(final String rawArgument, final Unqualified argument,
             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
         super(rawArgument, argument, substatements);
     }
index 5da41ef606f74e24875b22c2b88d4c5e3996b4e4..aadb4a2a244d67f5f208d78c6a51903c173fa28f 100644 (file)
@@ -7,12 +7,12 @@
  */
 package org.opendaylight.yangtools.yang.model.ri.stmt.impl.ref;
 
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclarationReference;
 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
 import org.opendaylight.yangtools.yang.model.spi.meta.AbstractRefStatement;
 
-public final class RefModuleStatement extends AbstractRefStatement<UnqualifiedQName, ModuleStatement>
+public final class RefModuleStatement extends AbstractRefStatement<Unqualified, ModuleStatement>
         implements ModuleStatement {
     public RefModuleStatement(final ModuleStatement delegate, final DeclarationReference ref) {
         super(delegate, ref);
index c5773b51d6aecf63fa019cbf3b0a4d9f3aa82d4b..ecab0ab2f204df1caa4c64af99d762d026d10755 100644 (file)
@@ -7,12 +7,12 @@
  */
 package org.opendaylight.yangtools.yang.model.ri.stmt.impl.ref;
 
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclarationReference;
 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement;
 import org.opendaylight.yangtools.yang.model.spi.meta.AbstractRefStatement;
 
-public final class RefSubmoduleStatement extends AbstractRefStatement<UnqualifiedQName, SubmoduleStatement>
+public final class RefSubmoduleStatement extends AbstractRefStatement<Unqualified, SubmoduleStatement>
         implements SubmoduleStatement {
     public RefSubmoduleStatement(final SubmoduleStatement delegate, final DeclarationReference ref) {
         super(delegate, ref);
index 78a70e66909ab0cffe8155a8b064c6d4a84e690b..893956e49f3f53812ee75316a7ee3d40a94b9016 100644 (file)
@@ -31,7 +31,7 @@ import org.opendaylight.yangtools.rfc8040.model.api.YangDataEffectiveStatement;
 import org.opendaylight.yangtools.yang.common.AbstractQName;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider;
 import org.opendaylight.yangtools.yang.model.api.EffectiveStatementInference;
@@ -141,17 +141,17 @@ public final class SchemaInferenceStack implements Mutable, EffectiveModelContex
     private boolean clean;
 
     private SchemaInferenceStack(final EffectiveModelContext effectiveModel, final int expectedSize) {
-        this.deque = new ArrayDeque<>(expectedSize);
+        deque = new ArrayDeque<>(expectedSize);
         this.effectiveModel = requireNonNull(effectiveModel);
-        this.clean = true;
+        clean = true;
     }
 
     private SchemaInferenceStack(final SchemaInferenceStack source) {
-        this.deque = source.deque.clone();
-        this.effectiveModel = source.effectiveModel;
-        this.currentModule = source.currentModule;
-        this.groupingDepth = source.groupingDepth;
-        this.clean = source.clean;
+        deque = source.deque.clone();
+        effectiveModel = source.effectiveModel;
+        currentModule = source.currentModule;
+        groupingDepth = source.groupingDepth;
+        clean = source.clean;
     }
 
     private SchemaInferenceStack(final EffectiveModelContext effectiveModel,
@@ -166,8 +166,8 @@ public final class SchemaInferenceStack implements Mutable, EffectiveModelContex
 
     private SchemaInferenceStack(final EffectiveModelContext effectiveModel) {
         this.effectiveModel = requireNonNull(effectiveModel);
-        this.deque = new ArrayDeque<>();
-        this.clean = true;
+        deque = new ArrayDeque<>();
+        clean = true;
     }
 
     /**
@@ -660,9 +660,9 @@ public final class SchemaInferenceStack implements Mutable, EffectiveModelContex
         final QName qname;
         if (toResolve instanceof QName) {
             qname = (QName) toResolve;
-        } else if (toResolve instanceof UnqualifiedQName) {
+        } else if (toResolve instanceof Unqualified) {
             checkArgument(defaultNamespace != null, "Can not find target module of step %s", step);
-            qname = ((UnqualifiedQName) toResolve).bindTo(defaultNamespace);
+            qname = ((Unqualified) toResolve).bindTo(defaultNamespace);
         } else {
             throw new VerifyException("Unexpected child step QName " + toResolve);
         }
index 5844cc1765424083621ecfbf010b6348ba7fa3c4..151ce35b949bf63f11cf0368472d0692f6f4f723 100644 (file)
@@ -10,12 +10,11 @@ package org.opendaylight.yangtools.odlext.parser;
 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.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveStatement.DefaultArgument.WithSubstatements;
 
-final class AugmentIdentifierEffectiveStatementImpl
-        extends WithSubstatements<UnqualifiedQName, AugmentIdentifierStatement>
+final class AugmentIdentifierEffectiveStatementImpl extends WithSubstatements<Unqualified, AugmentIdentifierStatement>
         implements AugmentIdentifierEffectiveStatement {
     AugmentIdentifierEffectiveStatementImpl(final AugmentIdentifierStatement declared,
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
index 6deef3ea395cf07554cb46d2c5ee21479aeaf815..be161a9c6520dac56ff81811d520d1d5d968c2da 100644 (file)
@@ -9,13 +9,13 @@ package org.opendaylight.yangtools.odlext.parser;
 
 import com.google.common.collect.ImmutableList;
 import org.opendaylight.yangtools.odlext.model.api.AugmentIdentifierStatement;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithArgument.WithSubstatements;
 
-final class AugmentIdentifierStatementImpl extends WithSubstatements<UnqualifiedQName>
+final class AugmentIdentifierStatementImpl extends WithSubstatements<Unqualified>
         implements AugmentIdentifierStatement {
-    AugmentIdentifierStatementImpl(final UnqualifiedQName argument,
+    AugmentIdentifierStatementImpl(final Unqualified argument,
             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
         super(argument.getLocalName(), argument, substatements);
     }
index 9f05f8596538290a022c4ca4f2ce75c34fdf8500..0a31524c54e9fb5e029543ad3c3897164b00bf87 100644 (file)
@@ -12,7 +12,8 @@ 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.UnqualifiedQName;
+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;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
@@ -25,8 +26,7 @@ import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 
 @Beta
 public final class AugmentIdentifierStatementSupport
-        extends AbstractStatementSupport<UnqualifiedQName, AugmentIdentifierStatement,
-                                         AugmentIdentifierEffectiveStatement> {
+        extends AbstractStatementSupport<Unqualified, AugmentIdentifierStatement, AugmentIdentifierEffectiveStatement> {
     private static final SubstatementValidator VALIDATOR =
         SubstatementValidator.builder(OpenDaylightExtensionsStatements.AUGMENT_IDENTIFIER).build();
 
@@ -36,9 +36,9 @@ public final class AugmentIdentifierStatementSupport
     }
 
     @Override
-    public UnqualifiedQName parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
+    public Unqualified parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
         try {
-            return UnqualifiedQName.of(value).intern();
+            return UnresolvedQName.unqualified(value).intern();
         } catch (IllegalArgumentException e) {
             throw new SourceException(ctx, e, "Invalid identifier \"%s\"", value);
         }
@@ -46,7 +46,7 @@ public final class AugmentIdentifierStatementSupport
 
     @Override
     protected AugmentIdentifierStatement createDeclared(
-            final StmtContext<UnqualifiedQName, AugmentIdentifierStatement, ?> ctx,
+            final StmtContext<Unqualified, AugmentIdentifierStatement, ?> ctx,
             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
         return new AugmentIdentifierStatementImpl(ctx.getArgument(), substatements);
     }
@@ -59,7 +59,7 @@ public final class AugmentIdentifierStatementSupport
 
     @Override
     protected AugmentIdentifierEffectiveStatement createEffective(
-            final Current<UnqualifiedQName, AugmentIdentifierStatement> stmt,
+            final Current<Unqualified, AugmentIdentifierStatement> stmt,
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
         return new AugmentIdentifierEffectiveStatementImpl(stmt.declared(), substatements);
     }
index befe367d4c374ad045dec26b691d994ad28fe03e..138d8b7c80000a41c78564c8a1a2910e168e7e2b 100644 (file)
@@ -8,11 +8,11 @@
 package org.opendaylight.yangtools.odlext.parser;
 
 import org.opendaylight.yangtools.odlext.model.api.AugmentIdentifierStatement;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclarationReference;
 import org.opendaylight.yangtools.yang.model.spi.meta.AbstractRefStatement;
 
-final class RefAugmentIdentifierStatement extends AbstractRefStatement<UnqualifiedQName, AugmentIdentifierStatement>
+final class RefAugmentIdentifierStatement extends AbstractRefStatement<Unqualified, AugmentIdentifierStatement>
         implements AugmentIdentifierStatement {
     RefAugmentIdentifierStatement(final AugmentIdentifierStatement delegate, final DeclarationReference ref) {
         super(delegate, ref);
index 8daa4eebd94caa5c7614c94fa2e274087b733b8a..18b7b429e71bd5c882ed8d6f7935730ef1575d5b 100644 (file)
@@ -24,7 +24,7 @@ import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.SemVer;
 import org.opendaylight.yangtools.openconfig.model.api.OpenConfigVersionEffectiveStatement;
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.common.YangVersion;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
@@ -59,17 +59,16 @@ import org.opendaylight.yangtools.yang.parser.spi.source.ImportPrefixToModuleCtx
 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 
 @Beta
-public abstract class AbstractEffectiveModule<D extends DeclaredStatement<UnqualifiedQName>,
-        E extends DataTreeAwareEffectiveStatement<UnqualifiedQName, D>>
-        extends WithTypedefNamespace<UnqualifiedQName, D, E>
-        implements ModuleLike, DocumentedNodeMixin<UnqualifiedQName, D>,
-            NotificationNodeContainerCompat<UnqualifiedQName, D, E> {
+public abstract class AbstractEffectiveModule<D extends DeclaredStatement<Unqualified>,
+        E extends DataTreeAwareEffectiveStatement<Unqualified, D>>
+        extends WithTypedefNamespace<Unqualified, D, E>
+        implements ModuleLike, DocumentedNodeMixin<Unqualified, D>, NotificationNodeContainerCompat<Unqualified, D, E> {
     private final String prefix;
     private final ImmutableSet<GroupingDefinition> groupings;
     private final ImmutableSet<UsesNode> uses;
     private final ImmutableSet<TypeDefinition<?>> typeDefinitions;
 
-    protected AbstractEffectiveModule(final Current<UnqualifiedQName, D> stmt,
+    protected AbstractEffectiveModule(final Current<Unqualified, D> stmt,
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final String prefix) {
         super(stmt.declared(), substatements);
 
@@ -101,7 +100,7 @@ public abstract class AbstractEffectiveModule<D extends DeclaredStatement<Unqual
     }
 
     @Override
-    public UnqualifiedQName argument() {
+    public Unqualified argument() {
         return getDeclared().argument();
     }
 
index ddf6773f8585fcc64d4c4509de9cc5b0bbd8a2ed..71360a89deb24e8d9eff639bf22fc60e8dac939d 100644 (file)
@@ -21,7 +21,7 @@ import java.util.function.Function;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.Submodule;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
@@ -52,7 +52,7 @@ final class ModuleEffectiveStatementImpl extends AbstractEffectiveModule<ModuleS
     private final @NonNull QNameModule qnameModule;
     private final ImmutableList<Submodule> submodules;
 
-    ModuleEffectiveStatementImpl(final Current<UnqualifiedQName, ModuleStatement> stmt,
+    ModuleEffectiveStatementImpl(final Current<Unqualified, ModuleStatement> stmt,
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
             final Collection<? extends Submodule> submodules, final QNameModule qnameModule) {
         super(stmt, substatements, findPrefix(stmt, substatements, "module", stmt.getRawArgument()));
index 9026d06136669c8a40397fee8914dc1bff137c87..4522b063c9e1e614092d3e92044fc5d8ef8d4f50 100644 (file)
@@ -23,7 +23,8 @@ import org.opendaylight.yangtools.openconfig.model.api.OpenConfigStatements;
 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.UnqualifiedQName;
+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;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
@@ -70,7 +71,7 @@ import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 
 @Beta
 public final class ModuleStatementSupport
-        extends AbstractStatementSupport<UnqualifiedQName, ModuleStatement, ModuleEffectiveStatement> {
+        extends AbstractStatementSupport<Unqualified, ModuleStatement, ModuleEffectiveStatement> {
     private static final SubstatementValidator RFC6020_VALIDATOR = SubstatementValidator.builder(YangStmtMapping.MODULE)
         .addAny(YangStmtMapping.ANYXML)
         .addAny(YangStmtMapping.AUGMENT)
@@ -147,16 +148,16 @@ public final class ModuleStatementSupport
     }
 
     @Override
-    public UnqualifiedQName parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
+    public Unqualified parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
         try {
-            return UnqualifiedQName.of(value);
+            return UnresolvedQName.unqualified(value);
         } catch (IllegalArgumentException e) {
             throw new SourceException(e.getMessage(), ctx, e);
         }
     }
 
     @Override
-    public void onPreLinkageDeclared(final Mutable<UnqualifiedQName, ModuleStatement, ModuleEffectiveStatement> stmt) {
+    public void onPreLinkageDeclared(final Mutable<Unqualified, ModuleStatement, ModuleEffectiveStatement> stmt) {
         final String moduleName = stmt.getRawArgument();
 
         final XMLNamespace moduleNs = SourceException.throwIfNull(
@@ -179,7 +180,7 @@ public final class ModuleStatementSupport
     }
 
     @Override
-    public void onLinkageDeclared(final Mutable<UnqualifiedQName, ModuleStatement, ModuleEffectiveStatement> stmt) {
+    public void onLinkageDeclared(final Mutable<Unqualified, ModuleStatement, ModuleEffectiveStatement> stmt) {
         final XMLNamespace moduleNs = SourceException.throwIfNull(
             firstAttributeOf(stmt.declaredSubstatements(), NamespaceStatement.class), stmt,
             "Namespace of the module [%s] is missing", stmt.argument());
@@ -219,7 +220,7 @@ public final class ModuleStatementSupport
 
     @Override
     protected ImmutableList<? extends EffectiveStatement<?, ?>> buildEffectiveSubstatements(
-            final Current<UnqualifiedQName, ModuleStatement> stmt,
+            final Current<Unqualified, ModuleStatement> stmt,
             final List<? extends StmtContext<?, ?, ?>> substatements) {
         final ImmutableList<? extends EffectiveStatement<?, ?>> local =
                 super.buildEffectiveSubstatements(stmt, substatements);
@@ -245,7 +246,7 @@ public final class ModuleStatementSupport
     }
 
     @Override
-    protected ModuleStatement createDeclared(final StmtContext<UnqualifiedQName, ModuleStatement, ?> ctx,
+    protected ModuleStatement createDeclared(final StmtContext<Unqualified, ModuleStatement, ?> ctx,
             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
         if (substatements.isEmpty()) {
             throw noNamespace(ctx);
@@ -260,7 +261,7 @@ public final class ModuleStatementSupport
     }
 
     @Override
-    protected ModuleEffectiveStatement createEffective(final Current<UnqualifiedQName, ModuleStatement> stmt,
+    protected ModuleEffectiveStatement createEffective(final Current<Unqualified, ModuleStatement> stmt,
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
         if (substatements.isEmpty()) {
             throw noNamespace(stmt);
@@ -293,7 +294,7 @@ public final class ModuleStatementSupport
     }
 
     private static void addToSemVerModuleNamespace(
-            final Mutable<UnqualifiedQName, ModuleStatement, ModuleEffectiveStatement> stmt,
+            final Mutable<Unqualified, ModuleStatement, ModuleEffectiveStatement> stmt,
             final SourceIdentifier moduleIdentifier) {
         final SemVerSourceIdentifier id = SemVerSourceIdentifier.create(stmt.getRawArgument(),
             stmt.getFromNamespace(SemanticVersionNamespace.class, stmt));
index 7fae6a57aca9d144cac347332c24a07f35283899..48ffa293b49d46f3c033dde6132fca89ca8d7f56 100644 (file)
@@ -17,8 +17,9 @@ import org.antlr.v4.runtime.CharStreams;
 import org.antlr.v4.runtime.CommonTokenStream;
 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.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName;
 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;
@@ -220,7 +221,7 @@ class PathExpressionParser {
     private static YangQNameExpr createChildExpr(final StmtContext<?, ?, ?> ctx, final Node_identifierContext qname) {
         switch (qname.getChildCount()) {
             case 1:
-                return YangQNameExpr.of(UnqualifiedQName.of(qname.getText()).intern());
+                return YangQNameExpr.of(UnresolvedQName.unqualified(qname.getText()).intern());
             case 3:
                 return YangQNameExpr.of(parseQName(ctx, qname));
             default:
@@ -232,7 +233,7 @@ class PathExpressionParser {
             final List<YangExpr> predicates) {
         switch (qname.getChildCount()) {
             case 1:
-                return YangXPathAxis.CHILD.asStep(UnqualifiedQName.of(qname.getText()).intern(), predicates);
+                return YangXPathAxis.CHILD.asStep(UnresolvedQName.unqualified(qname.getText()).intern(), predicates);
             case 3:
                 return YangXPathAxis.CHILD.asStep(parseQName(ctx, qname), predicates);
             default:
@@ -240,7 +241,7 @@ class PathExpressionParser {
         }
     }
 
-    private static QName parseQName(final StmtContext<?, ?, ?> ctx, final Node_identifierContext qname) {
+    private static @NonNull QName parseQName(final StmtContext<?, ?, ?> ctx, final Node_identifierContext qname) {
         return StmtContextUtils.parseNodeIdentifier(ctx, qname.getChild(0).getText(), qname.getChild(2).getText());
     }
 }
index 1898b5ca07b252b5996310f34327a10db604bedb..92c9917a907b5d977b1c8f698ec223bf09ab52aa 100644 (file)
@@ -24,7 +24,7 @@ import java.util.Set;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.common.Revision;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.model.api.Submodule;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
@@ -55,7 +55,7 @@ final class SubmoduleEffectiveStatementImpl
     private ImmutableSet<Submodule> submodules;
     private boolean sealed;
 
-    SubmoduleEffectiveStatementImpl(final Current<UnqualifiedQName, SubmoduleStatement> stmt,
+    SubmoduleEffectiveStatementImpl(final Current<Unqualified, SubmoduleStatement> stmt,
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
         super(stmt, substatements, findSubmodulePrefix(stmt, substatements));
 
@@ -74,7 +74,7 @@ final class SubmoduleEffectiveStatementImpl
 
         final Optional<Revision> submoduleRevision = findFirstEffectiveSubstatementArgument(
             RevisionEffectiveStatement.class);
-        this.qnameModule = QNameModule.create(belongsToModuleQName.getNamespace(), submoduleRevision).intern();
+        qnameModule = QNameModule.create(belongsToModuleQName.getNamespace(), submoduleRevision).intern();
 
         /*
          * Because of possible circular chains of includes between submodules we can
index b3846638d972b25b90c6a5215b3b7d30ff8b534d..178302b263e368d70293570e5ec97a1239f12564 100644 (file)
@@ -13,7 +13,8 @@ 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.UnqualifiedQName;
+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;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
@@ -41,7 +42,7 @@ import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 
 @Beta
 public final class SubmoduleStatementSupport
-        extends AbstractStatementSupport<UnqualifiedQName, SubmoduleStatement, SubmoduleEffectiveStatement> {
+        extends AbstractStatementSupport<Unqualified, SubmoduleStatement, SubmoduleEffectiveStatement> {
     private static final SubstatementValidator RFC6020_VALIDATOR =
         SubstatementValidator.builder(YangStmtMapping.SUBMODULE)
             .addAny(YangStmtMapping.ANYXML)
@@ -113,24 +114,22 @@ public final class SubmoduleStatementSupport
     }
 
     @Override
-    public UnqualifiedQName parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
+    public Unqualified parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
         try {
-            return UnqualifiedQName.of(value);
+            return UnresolvedQName.unqualified(value);
         } catch (IllegalArgumentException e) {
             throw new SourceException(e.getMessage(), ctx, e);
         }
     }
 
     @Override
-    public void onPreLinkageDeclared(
-            final Mutable<UnqualifiedQName, SubmoduleStatement, SubmoduleEffectiveStatement> stmt) {
+    public void onPreLinkageDeclared(final Mutable<Unqualified, SubmoduleStatement, SubmoduleEffectiveStatement> stmt) {
         stmt.setRootIdentifier(RevisionSourceIdentifier.create(stmt.getRawArgument(),
             StmtContextUtils.getLatestRevision(stmt.declaredSubstatements())));
     }
 
     @Override
-    public void onLinkageDeclared(
-            final Mutable<UnqualifiedQName, SubmoduleStatement, SubmoduleEffectiveStatement> stmt) {
+    public void onLinkageDeclared(final Mutable<Unqualified, SubmoduleStatement, SubmoduleEffectiveStatement> stmt) {
         final SourceIdentifier submoduleIdentifier = RevisionSourceIdentifier.create(stmt.getRawArgument(),
             StmtContextUtils.getLatestRevision(stmt.declaredSubstatements()));
 
@@ -153,7 +152,7 @@ public final class SubmoduleStatementSupport
     }
 
     @Override
-    protected SubmoduleStatement createDeclared(final StmtContext<UnqualifiedQName, SubmoduleStatement, ?> ctx,
+    protected SubmoduleStatement createDeclared(final StmtContext<Unqualified, SubmoduleStatement, ?> ctx,
             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
         if (substatements.isEmpty()) {
             throw noBelongsTo(ctx);
@@ -168,7 +167,7 @@ public final class SubmoduleStatementSupport
     }
 
     @Override
-    protected SubmoduleEffectiveStatement createEffective(final Current<UnqualifiedQName, SubmoduleStatement> stmt,
+    protected SubmoduleEffectiveStatement createEffective(final Current<Unqualified, SubmoduleStatement> stmt,
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
         if (substatements.isEmpty()) {
             throw noBelongsTo(stmt);
index ceecf8874bb0f94cde4bf58dfc9be8ddc7a6e6b7..6a4d4183705f454f1f98be6626ecaa3b009e25aa 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.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName;
 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(UnqualifiedQName.of("type"))), derefSteps.getRelativePath());
+            YangXPathAxis.CHILD.asStep(UnresolvedQName.unqualified("type"))), derefSteps.getRelativePath());
         assertEquals(YangLocationPath.relative(YangXPathAxis.PARENT.asStep(),
-            YangXPathAxis.CHILD.asStep(UnqualifiedQName.of("id"))), derefSteps.getDerefArgument());
+            YangXPathAxis.CHILD.asStep(UnresolvedQName.unqualified("id"))), derefSteps.getDerefArgument());
     }
 
     @Test
@@ -114,13 +114,13 @@ public class PathExpressionParserTest {
 
         path.getSteps();
         assertEquals(ImmutableList.of(
-            YangXPathAxis.CHILD.asStep(UnqualifiedQName.of("device_types")),
-            YangXPathAxis.CHILD.asStep(UnqualifiedQName.of("device_type"),
+            YangXPathAxis.CHILD.asStep(UnresolvedQName.unqualified("device_types")),
+            YangXPathAxis.CHILD.asStep(UnresolvedQName.unqualified("device_type"),
                 ImmutableSet.of(YangBinaryOperator.EQUALS.exprWith(
-                    YangQNameExpr.of(UnqualifiedQName.of("type")),
+                    YangQNameExpr.of(UnresolvedQName.unqualified("type")),
                     YangPathExpr.of(YangFunctionCallExpr.of(YangFunction.CURRENT.getIdentifier()), Relative.relative(
                         YangXPathAxis.PARENT.asStep(),
-                        YangXPathAxis.CHILD.asStep(UnqualifiedQName.of("type_text"))))))),
-            YangXPathAxis.CHILD.asStep(UnqualifiedQName.of("desc"))), path.getSteps());
+                        YangXPathAxis.CHILD.asStep(UnresolvedQName.unqualified("type_text"))))))),
+            YangXPathAxis.CHILD.asStep(UnresolvedQName.unqualified("desc"))), path.getSteps());
     }
 }
index 15e42f43ceb6192710337f6dadb35b50be980019..b4134d7ce8fb284e14fc83f986b831e78cc5191d 100644 (file)
@@ -25,6 +25,7 @@ import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.yang.common.AbstractQName;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName;
 
 @Beta
 public abstract class YangLocationPath implements YangExpr {
@@ -241,15 +242,15 @@ public abstract class YangLocationPath implements YangExpr {
         }
     }
 
-    public static class UnresolvedQNameStep extends AbstractQNameStep<AbstractQName>
+    public static class UnresolvedQNameStep extends AbstractQNameStep<UnresolvedQName>
             implements UnresolvedQNameReferent<ResolvedQNameStep> {
         private static final long serialVersionUID = 1L;
 
-        UnresolvedQNameStep(final YangXPathAxis axis, final AbstractQName qname) {
+        UnresolvedQNameStep(final YangXPathAxis axis, final UnresolvedQName qname) {
             super(axis, qname);
         }
 
-        static UnresolvedQNameStep of(final YangXPathAxis axis, final AbstractQName qname,
+        static UnresolvedQNameStep of(final YangXPathAxis axis, final UnresolvedQName qname,
                 final Collection<YangExpr> predicates) {
             return predicates.isEmpty() ? new UnresolvedQNameStep(axis, qname)
                     : new UnresolvedQNameStepWithPredicates(axis, qname, ImmutableSet.copyOf(predicates));
@@ -266,7 +267,7 @@ public abstract class YangLocationPath implements YangExpr {
 
         private final ImmutableSet<YangExpr> predicates;
 
-        UnresolvedQNameStepWithPredicates(final YangXPathAxis axis, final AbstractQName qname,
+        UnresolvedQNameStepWithPredicates(final YangXPathAxis axis, final UnresolvedQName qname,
                 final ImmutableSet<YangExpr> predicates) {
             super(axis, qname);
             this.predicates = requireNonNull(predicates);
index 1c90f3c58720bc4f63245a1815ff330aad60c630..e8e35f5195f69d372000c228bd2c67110aeb4347 100644 (file)
@@ -11,8 +11,8 @@ import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.yangtools.yang.common.AbstractQName;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName;
 
 /**
  * An XPath QName expression. This is an exact QName, which cannot be converted to a string literal compatible with
@@ -60,14 +60,14 @@ public abstract class YangQNameExpr implements YangExpr, QNameReferent {
     public static final class Unresolved extends YangQNameExpr implements UnresolvedQNameReferent<Resolved> {
         private static final long serialVersionUID = 1L;
 
-        private final AbstractQName qname;
+        private final UnresolvedQName qname;
 
-        Unresolved(final AbstractQName qname) {
+        Unresolved(final UnresolvedQName qname) {
             this.qname = requireNonNull(qname);
         }
 
         @Override
-        public AbstractQName getQName() {
+        public UnresolvedQName getQName() {
             return qname;
         }
 
@@ -93,7 +93,7 @@ public abstract class YangQNameExpr implements YangExpr, QNameReferent {
         // Prevent instantiation
     }
 
-    public static Unresolved of(final AbstractQName qname) {
+    public static Unresolved of(final UnresolvedQName qname) {
         return new Unresolved(qname);
     }
 
index 3fc7ce508ee1d458b58a505fed75b45885a6d8a2..1f2a5ae88048b7ded324edce74aca23feefc4762 100644 (file)
@@ -12,8 +12,8 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.annotations.Beta;
 import com.google.common.collect.ImmutableSet;
 import java.util.Collection;
-import org.opendaylight.yangtools.yang.common.AbstractQName;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName;
 import org.opendaylight.yangtools.yang.xpath.api.YangLocationPath.AxisStep;
 import org.opendaylight.yangtools.yang.xpath.api.YangLocationPath.AxisStepWithPredicates;
 import org.opendaylight.yangtools.yang.xpath.api.YangLocationPath.NodeTypeStep;
@@ -117,11 +117,11 @@ public enum YangXPathAxis {
         return ResolvedQNameStep.of(this, qname, predicates);
     }
 
-    public final UnresolvedQNameStep asStep(final AbstractQName qname) {
+    public final UnresolvedQNameStep asStep(final UnresolvedQName qname) {
         return new UnresolvedQNameStep(this, qname);
     }
 
-    public final UnresolvedQNameStep asStep(final AbstractQName qname, final Collection<YangExpr> predicates) {
+    public final UnresolvedQNameStep asStep(final UnresolvedQName qname, final Collection<YangExpr> predicates) {
         return UnresolvedQNameStep.of(this, qname, predicates);
     }
 
index c62d6b49f69e6ec224dcbd9a4c7b33429ea01254..58004a95b8ba9d6bc1d2102ec95f4f96bb35aab8 100644 (file)
@@ -11,8 +11,8 @@ import com.google.common.annotations.Beta;
 import javax.xml.xpath.XPathExpressionException;
 import org.opendaylight.yangtools.concepts.Immutable;
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.common.QualifiedQName;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Qualified;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
 import org.opendaylight.yangtools.yang.common.YangVersion;
 
 /**
@@ -24,11 +24,11 @@ import org.opendaylight.yangtools.yang.common.YangVersion;
  * levels to which an XPath expression can be bound:
  * <ul>
  * <li>Unbound Expressions, which is a essentially a parse tree. No namespace binding has been performed, i.e. all
- *     node identifiers are in {@link QualifiedQName} or {@link UnqualifiedQName} form. This level is typically not used
- *     when dealing with YANG models directly, but can be useful for validating a String conforms to XPath syntax.
+ *     node identifiers are in {@link Qualified} or {@link Unqualified} form. This level is typically not used when
+ *     dealing with YANG models directly, but can be useful for validating a String conforms to XPath syntax.
  * </li>
- * <li>Qualified-bound Expressions, where all {@link QualifiedQName}s are resolved and bound to {@link QName}s, but
- *     {@link UnqualifiedQName}s are still present. This level corresponds to how far a YANG parser can interpret XPath
+ * <li>Qualified-bound Expressions, where all {@link Qualified}s are resolved and bound to {@link QName}s, but
+ *     {@link Unqualified}s are still present. This level corresponds to how far a YANG parser can interpret XPath
  *     expressions defined in {@code typedef} statements and statements which are not fully instantiated, i.e. are
  *     descendants of a {@code grouping} statement.
  * </li>
@@ -47,12 +47,15 @@ import org.opendaylight.yangtools.yang.common.YangVersion;
 @Beta
 public interface YangXPathExpression extends Immutable {
     /**
-     * A Qualified-bound expression. All {@link QualifiedQName}s are eliminated and replaced with {@link QName}s.
+     * A Qualified-bound expression. All {@link Qualified}s are eliminated and replaced with {@link QName}s.
      */
     interface QualifiedBound extends YangXPathExpression {
 
     }
 
+    /**
+     * An Unqualified-bound expression. All {@link Unqualified}s are eliminated and replaced with {@link QName}s.
+     */
     interface UnqualifiedBound extends QualifiedBound {
         @Override
         YangQNameExpr.Resolved interpretAsQName(YangLiteralExpr expr) throws XPathExpressionException;
index a12dfd2e8b7a292fb5f47967adc2c62f45a2237b..a7e09afbc40d0accb19b61185afc7e66822a8cf5 100644 (file)
@@ -40,8 +40,7 @@ import org.antlr.v4.runtime.tree.ParseTree;
 import org.antlr.v4.runtime.tree.TerminalNode;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.common.QualifiedQName;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName;
 import org.opendaylight.yangtools.yang.common.YangConstants;
 import org.opendaylight.yangtools.yang.common.YangNamespaceContext;
 import org.opendaylight.yangtools.yang.common.YangVersion;
@@ -118,13 +117,13 @@ abstract class AntlrXPathParser implements YangXPathParser {
         @Override
         QNameStep createStep(final YangXPathAxis axis, final String localName,
                 final List<YangExpr> predicates) {
-            return axis.asStep(UnqualifiedQName.of(localName).intern(), predicates);
+            return axis.asStep(UnresolvedQName.unqualified(localName).intern(), predicates);
         }
 
         @Override
         QNameStep createStep(final YangXPathAxis axis, final String prefix, final String localName,
                 final List<YangExpr> predicates) {
-            return axis.asStep(QualifiedQName.of(prefix, localName).intern(), predicates);
+            return axis.asStep(UnresolvedQName.qualified(prefix, localName).intern(), predicates);
         }
 
         @Override
@@ -228,8 +227,8 @@ abstract class AntlrXPathParser implements YangXPathParser {
 
     AntlrXPathParser(final YangXPathMathMode mathMode) {
         this.mathMode = requireNonNull(mathMode);
-        this.mathSupport = mathMode.getSupport();
-        this.functionSupport = new FunctionSupport(mathSupport);
+        mathSupport = mathMode.getSupport();
+        functionSupport = new FunctionSupport(mathSupport);
     }
 
     abstract QName createQName(String localName);
index cadea136ee4a2c3145461267b2b9271dbc3f6f5a..c3654f0b7877feea3f58e9df7fc51195a8f8caa5 100644 (file)
@@ -20,7 +20,7 @@ import javax.xml.xpath.XPathExpressionException;
 import org.antlr.v4.runtime.CharStreams;
 import org.antlr.v4.runtime.CommonTokenStream;
 import org.antlr.v4.runtime.tree.ParseTree;
-import org.opendaylight.yangtools.yang.common.QualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName;
 import org.opendaylight.yangtools.yang.common.YangNamespaceContext;
 import org.opendaylight.yangtools.yang.xpath.antlr.instanceIdentifierParser;
 import org.opendaylight.yangtools.yang.xpath.antlr.instanceIdentifierParser.EqQuotedStringContext;
@@ -55,12 +55,12 @@ abstract class InstanceIdentifierParser {
 
         @Override
         YangQNameExpr createExpr(final String prefix, final String localName) {
-            return YangQNameExpr.of(QualifiedQName.of(prefix, localName));
+            return YangQNameExpr.of(UnresolvedQName.qualified(prefix, localName));
         }
 
         @Override
         QNameStep createChildStep(final String prefix, final String localName, final Collection<YangExpr> predicates) {
-            return YangXPathAxis.CHILD.asStep(QualifiedQName.of(prefix, localName), predicates);
+            return YangXPathAxis.CHILD.asStep(UnresolvedQName.qualified(prefix, localName), predicates);
         }
     }
 
@@ -88,7 +88,7 @@ abstract class InstanceIdentifierParser {
     private final YangXPathMathSupport mathSupport;
 
     InstanceIdentifierParser(final YangXPathMathMode mathMode) {
-        this.mathSupport = mathMode.getSupport();
+        mathSupport = mathMode.getSupport();
     }
 
     final Absolute interpretAsInstanceIdentifier(final YangLiteralExpr expr) throws XPathExpressionException {
index 74ebb6a99f9032226cd7559fd00aee429ed400c0..a0f04393859e4784c3a9c4ed57dd9f3541e834a5 100644 (file)
@@ -9,11 +9,9 @@ package org.opendaylight.yangtools.yang.xpath.impl;
 
 import javax.xml.xpath.XPathExpressionException;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.yangtools.yang.common.AbstractQName;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.common.QualifiedQName;
-import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnresolvedQName;
 import org.opendaylight.yangtools.yang.common.YangNamespaceContext;
 import org.opendaylight.yangtools.yang.xpath.api.YangLiteralExpr;
 import org.opendaylight.yangtools.yang.xpath.api.YangQNameExpr;
@@ -32,10 +30,10 @@ final class Utils {
         final String text = expr.getLiteral();
         final int colon = text.indexOf(':');
 
-        final AbstractQName qname;
+        final UnresolvedQName qname;
         try {
-            qname = colon != -1 ? QualifiedQName.of(text.substring(0, colon), text.substring(colon + 1))
-                    : UnqualifiedQName.of(text);
+            qname = colon != -1 ? UnresolvedQName.qualified(text.substring(0, colon), text.substring(colon + 1))
+                    : UnresolvedQName.unqualified(text);
         } catch (IllegalArgumentException e) {
             throw wrapException(e, "Cannot interpret %s as a QName", expr);
         }
@@ -49,7 +47,7 @@ final class Utils {
         final int colon = text.indexOf(':');
         try {
             if (colon == -1) {
-                return YangQNameExpr.of(UnqualifiedQName.of(text).intern());
+                return YangQNameExpr.of(UnresolvedQName.unqualified(text).intern());
             }
 
             return YangQNameExpr.of(namespaceContext.createQName(text.substring(0, colon), text.substring(colon + 1)));