Rework QNameStep API integration 70/86570/4
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 25 Dec 2019 18:49:37 +0000 (19:49 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 25 Dec 2019 21:21:59 +0000 (22:21 +0100)
What we really want here is to take advantage of the fact we have
AbstractQName. It allows us to simplify our XPath model in terms
of class differences.

JIRA: YANGTOOLS-1054
Change-Id: Icfb8f82ae5dbcc0888bf7fd734b4eb23bc277933
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-xpath-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/QNameReferent.java
yang/yang-xpath-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/ResolvedQNameReferent.java
yang/yang-xpath-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/UnresolvedQNameReferent.java
yang/yang-xpath-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/YangLocationPath.java

index d21504f34bbd5aba595b6ee1d149513fc8c9853c..a642bd025501a27a8fdb942e8c35ea27d92e8be3 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.xpath.api;
 
 import com.google.common.annotations.Beta;
 import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.yang.common.AbstractQName;
 
 /**
  * An object referencing a QName, either resolved or unresolved.
@@ -17,10 +18,19 @@ import org.opendaylight.yangtools.concepts.Immutable;
  */
 @Beta
 public interface QNameReferent extends Immutable {
+    /**
+     * Return the referenced {@link AbstractQName}.
+     *
+     * @return An AbstractQName
+     */
+    AbstractQName getQName();
+
     /**
      * Return local name part of the referenced QName.
      *
      * @return Local name string.
      */
-    String getLocalName();
+    default String getLocalName() {
+        return getQName().getLocalName();
+    }
 }
index bb98744fc77dbde01f65ffcb28a927e2ea63bf00..b17046fcd2c8f7e1b8ec90bda6bae9af80321cf1 100644 (file)
@@ -22,10 +22,6 @@ public interface ResolvedQNameReferent extends QNameReferentBehavior<ResolvedQNa
      *
      * @return A QName
      */
-    QName getQName();
-
     @Override
-    default String getLocalName() {
-        return getQName().getLocalName();
-    }
-}
\ No newline at end of file
+    QName getQName();
+}
index 956673394c1838ee84de54f9d50e8f1e91ec7246..5d6a6c0e16b2e4522d16a117650bb3a1d2da2b2d 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.yangtools.yang.xpath.api;
 
 import com.google.common.annotations.Beta;
-import org.opendaylight.yangtools.yang.common.AbstractQName;
 
 /**
  * A {@link QNameReferent} referencing an unresolved QName.
@@ -18,15 +17,5 @@ import org.opendaylight.yangtools.yang.common.AbstractQName;
 @Beta
 public interface UnresolvedQNameReferent<T extends ResolvedQNameReferent> extends
         QNameReferentBehavior<UnresolvedQNameReferent<T>> {
-    /**
-     * Return the referenced {@link AbstractQName}.
-     *
-     * @return An AbstractQName
-     */
-    AbstractQName getQName();
 
-    @Override
-    default String getLocalName() {
-        return getQName().getLocalName();
-    }
 }
index 72806f51e2ee6cb335628bdc6955d9845c65c494..52a2889e313ac8ee2f928a8e315a96606fe759fd 100644 (file)
@@ -20,6 +20,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Objects;
 import java.util.Set;
+import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.yang.common.AbstractQName;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -160,24 +161,18 @@ public abstract class YangLocationPath implements YangExpr {
         }
     }
 
-    public static class ResolvedQNameStep extends QNameStep implements ResolvedQNameReferent {
+    private abstract static class AbstractQNameStep<T extends AbstractQName> extends QNameStep {
         private static final long serialVersionUID = 1L;
 
-        private final QName qname;
+        private final T qname;
 
-        ResolvedQNameStep(final YangXPathAxis axis, final QName qname) {
+        AbstractQNameStep(final YangXPathAxis axis, final T qname) {
             super(axis);
             this.qname = requireNonNull(qname);
         }
 
-        static ResolvedQNameStep of(final YangXPathAxis axis, final QName qname,
-                final Collection<YangExpr> predicates) {
-            return predicates.isEmpty() ? new ResolvedQNameStep(axis, qname)
-                    : new ResolvedQNameStepWithPredicates(axis, qname, ImmutableSet.copyOf(predicates));
-        }
-
         @Override
-        public final QName getQName() {
+        public final @NonNull T getQName() {
             return qname;
         }
 
@@ -187,14 +182,17 @@ public abstract class YangLocationPath implements YangExpr {
         }
 
         @Override
-        public final boolean equals(@Nullable final Object obj) {
+        @SuppressFBWarnings(value = "EQ_UNUSUAL", justification = "Polymorphic via equalityClass()")
+        public final boolean equals(final @Nullable Object obj) {
             if (this == obj) {
                 return true;
             }
-            if (!(obj instanceof ResolvedQNameStep)) {
+            final Class<? extends AbstractQNameStep<?>> eq = equalityClass();
+            if (!equalityClass().isInstance(obj)) {
                 return false;
             }
-            final ResolvedQNameStep other = (ResolvedQNameStep) obj;
+
+            final AbstractQNameStep<?> other = eq.cast(obj);
             return getAxis().equals(other.getAxis()) && qname.equals(other.qname)
                     && getPredicates().equals(other.getPredicates());
         }
@@ -203,6 +201,27 @@ public abstract class YangLocationPath implements YangExpr {
         protected ToStringHelper addToStringAttributes(final ToStringHelper helper) {
             return super.addToStringAttributes(helper).add("qname", qname);
         }
+
+        abstract Class<? extends AbstractQNameStep<?>> equalityClass();
+    }
+
+    public static class ResolvedQNameStep extends AbstractQNameStep<QName> implements ResolvedQNameReferent {
+        private static final long serialVersionUID = 1L;
+
+        ResolvedQNameStep(final YangXPathAxis axis, final QName qname) {
+            super(axis, qname);
+        }
+
+        static ResolvedQNameStep of(final YangXPathAxis axis, final QName qname,
+                final Collection<YangExpr> predicates) {
+            return predicates.isEmpty() ? new ResolvedQNameStep(axis, qname)
+                    : new ResolvedQNameStepWithPredicates(axis, qname, ImmutableSet.copyOf(predicates));
+        }
+
+        @Override
+        final Class<ResolvedQNameStep> equalityClass() {
+            return ResolvedQNameStep.class;
+        }
     }
 
     private static final class ResolvedQNameStepWithPredicates extends ResolvedQNameStep {
@@ -223,14 +242,12 @@ public abstract class YangLocationPath implements YangExpr {
     }
 
     // FIXME: 5.0.0: integrate this into QName step once QName is a subclass AbstractQName
-    public static class UnresolvedQNameStep extends QNameStep implements UnresolvedQNameReferent<ResolvedQNameStep> {
+    public static class UnresolvedQNameStep extends AbstractQNameStep<AbstractQName>
+            implements UnresolvedQNameReferent<ResolvedQNameStep> {
         private static final long serialVersionUID = 1L;
 
-        private final AbstractQName qname;
-
         UnresolvedQNameStep(final YangXPathAxis axis, final AbstractQName qname) {
-            super(axis);
-            this.qname = requireNonNull(qname);
+            super(axis, qname);
         }
 
         static UnresolvedQNameStep of(final YangXPathAxis axis, final AbstractQName qname,
@@ -240,26 +257,8 @@ public abstract class YangLocationPath implements YangExpr {
         }
 
         @Override
-        public final AbstractQName getQName() {
-            return qname;
-        }
-
-        @Override
-        public final int hashCode() {
-            return Objects.hash(getAxis(), qname, getPredicates());
-        }
-
-        @Override
-        public final boolean equals(final @Nullable Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (!(obj instanceof UnresolvedQNameStep)) {
-                return false;
-            }
-            final UnresolvedQNameStep other = (UnresolvedQNameStep) obj;
-            return getAxis().equals(other.getAxis()) && qname.equals(other.qname)
-                    && getPredicates().equals(other.getPredicates());
+        final Class<UnresolvedQNameStep> equalityClass() {
+            return UnresolvedQNameStep.class;
         }
     }