Rework NormalizedNode type hierarchy
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / schema / nodes / AbstractImmutableNormalizedNode.java
index 9359831c0c186fb4f5689c241bc0d6d30beb30aa..bda43c15d6fefd63cb754e7e5574625820d34f34 100644 (file)
@@ -8,42 +8,28 @@
 package org.opendaylight.yangtools.yang.data.impl.schema.nodes;
 
 import com.google.common.base.MoreObjects.ToStringHelper;
-import org.opendaylight.yangtools.concepts.AbstractSimpleIdentifiable;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
 import org.opendaylight.yangtools.concepts.Immutable;
-import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
-public abstract class AbstractImmutableNormalizedNode<K extends PathArgument, V> extends AbstractSimpleIdentifiable<K>
-        implements NormalizedNode<K, V>, Immutable {
+public abstract class AbstractImmutableNormalizedNode<K extends PathArgument, N extends NormalizedNode>
+        extends AbstractIdentifiable<PathArgument, K> implements NormalizedNode, Immutable {
     protected AbstractImmutableNormalizedNode(final K nodeIdentifier) {
         super(nodeIdentifier);
     }
 
-    @Override
-    public final QName getNodeType() {
-        return getIdentifier().getNodeType();
-    }
-
-    @Override
-    protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
-        return super.addToStringAttributes(toStringHelper).add("value", getValue());
-    }
-
-    protected abstract boolean valueEquals(AbstractImmutableNormalizedNode<?, ?> other);
-
-    protected abstract int valueHashCode();
-
     @Override
     public final boolean equals(final Object obj) {
         if (this == obj) {
             return true;
         }
-        if (obj == null || this.getClass() != obj.getClass()) {
+        final Class<N> clazz = implementedType();
+        if (!clazz.isInstance(obj)) {
             return false;
         }
-
-        final AbstractImmutableNormalizedNode<?, ?> other = (AbstractImmutableNormalizedNode<?, ?>)obj;
+        final N other = clazz.cast(obj);
         return getIdentifier().equals(other.getIdentifier()) && valueEquals(other);
     }
 
@@ -51,4 +37,15 @@ public abstract class AbstractImmutableNormalizedNode<K extends PathArgument, V>
     public final int hashCode() {
         return 31 * getIdentifier().hashCode() + valueHashCode();
     }
+
+    @Override
+    protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
+        return super.addToStringAttributes(toStringHelper).add("body", body());
+    }
+
+    protected abstract @NonNull Class<N> implementedType();
+
+    protected abstract int valueHashCode();
+
+    protected abstract boolean valueEquals(@NonNull N other);
 }