Add NormalizedNode.contract() 01/95901/4
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 23 Apr 2021 13:18:29 +0000 (15:18 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 23 Apr 2021 21:23:39 +0000 (23:23 +0200)
NormalizedNode hierarchy is defined in terms of interfaces with a
multitude of possible implementations. Attempting to dispatch among them
without sealed classes is an exercise in futility, but we can actually
mark the top-level contracts as needed.

This makes it very clear which interfaces can be reasonably implemented
and allows a proper dispatch on classes. Furthermore it improves safety
by explicitly not allowing mixes which would otherwise be possible.

JIRA: YANGTOOLS-1203
Change-Id: I177f158423807b83d83f375c69c6985880eaed91
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
18 files changed:
yang/rfc8528-data-api/src/main/java/org/opendaylight/yangtools/rfc8528/data/api/MountPointNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/AnydataNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/AnyxmlNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/AugmentationNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/ChoiceNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/ContainerNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/LeafNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/LeafSetEntryNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/LeafSetNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MapEntryNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MapNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/SystemLeafSetNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/SystemMapNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/UnkeyedListEntryNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/UnkeyedListNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/UserLeafSetNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/UserMapNode.java

index fecb648ecebdfc08136ee4a061098548c09b73ca..946a68445c7cc057124e01741394972b6fa40d74 100644 (file)
@@ -27,6 +27,11 @@ import org.opendaylight.yangtools.yang.data.api.schema.MixinNode;
  */
 @Beta
 public interface MountPointNode extends DataContainerNode, DataContainerChild, MixinNode {
+    @Override
+    default Class<MountPointNode> contract() {
+        return MountPointNode.class;
+    }
+
     @Override
     MountPointIdentifier getIdentifier();
 
index 3c52c5f24c1640704c30b781cac72d8641c7745d..021eece89a5ae53746989c44d95c5d1dd5c05774 100644 (file)
@@ -26,6 +26,12 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
  */
 @Beta
 public interface AnydataNode<V> extends ForeignDataNode<V> {
+    @Override
+    @SuppressWarnings("rawtypes")
+    default Class<AnydataNode> contract() {
+        return AnydataNode.class;
+    }
+
     @Override
     NodeIdentifier getIdentifier();
 }
index a0c7262d4a0b88d0b4202e94aa16a07dcfc1318f..e53c22f18095763b0c20b3a52ef9f1e4cecd8744 100644 (file)
@@ -18,6 +18,12 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
  */
 @Beta
 public interface AnyxmlNode<V> extends ForeignDataNode<V> {
+    @Override
+    @SuppressWarnings("rawtypes")
+    default Class<AnyxmlNode> contract() {
+        return AnyxmlNode.class;
+    }
+
     @Override
     NodeIdentifier getIdentifier();
 }
index 2164d9f6b3ee239a0b92ba93c422379fbac439ab..46c23cce556f51d9881bbf0be57c211eb9972c1b 100644 (file)
@@ -21,6 +21,11 @@ import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
  * Augmentation node MUST NOT be direct child of other augmentation node.
  */
 public interface AugmentationNode extends DataContainerNode, DataContainerChild, MixinNode {
+    @Override
+    default Class<AugmentationNode> contract() {
+        return AugmentationNode.class;
+    }
+
     /**
      * Gets identifier of augmentation node. Returned identifier of augmentation node contains all possible
      * direct child QNames.
index b879b62de0b8a714d57510986f9582f7247c6417..17a893fa537e8e98c3072d16cef2cd89c5ac4553 100644 (file)
@@ -26,6 +26,11 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
  * {@link org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode#getCases()}.
  */
 public interface ChoiceNode extends MixinNode, DataContainerNode, DataContainerChild {
+    @Override
+    default Class<ChoiceNode> contract() {
+        return ChoiceNode.class;
+    }
+
     @Override
     NodeIdentifier getIdentifier();
 }
index a26bcc99bee6435658fe4d9e138a4209b40e08d2..ebabb2c2d95e900340fc186af3535cf08fe4f301 100644 (file)
@@ -20,6 +20,11 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
  * {@link org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode}.
  */
 public interface ContainerNode extends DataContainerNode, DataContainerChild {
+    @Override
+    default Class<ContainerNode> contract() {
+        return ContainerNode.class;
+    }
+
     @Override
     NodeIdentifier getIdentifier();
 }
index 7b9a5d4611dc5bd61eda6fb010a03b9d7da85180..a7f5a9e40078bb418060d580495d96bb0920ce57 100644 (file)
@@ -19,6 +19,12 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
  * @param <T> Value type
  */
 public interface LeafNode<T> extends ValueNode<T>, DataContainerChild {
+    @Override
+    @SuppressWarnings("rawtypes")
+    default Class<LeafNode> contract() {
+        return LeafNode.class;
+    }
+
     @Override
     NodeIdentifier getIdentifier();
 }
index 86debe7c0cbb5b49eb0dece200bf8fee73157ecd..d4db64bd4ab88918f6cb44c5c8ca1d333f821bf7 100644 (file)
@@ -16,6 +16,12 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithV
  * @param <T> Value type
  */
 public interface LeafSetEntryNode<T> extends ValueNode<T> {
+    @Override
+    @SuppressWarnings("rawtypes")
+    default Class<LeafSetEntryNode> contract() {
+        return LeafSetEntryNode.class;
+    }
+
     /**
      * {@inheritDoc}
      *
index 519fb1591280f6a7648e3d0d26a48816c2e45cf6..eb81063e3dfa3cbd629e09151acf7187f2be70ad 100644 (file)
@@ -21,6 +21,10 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithV
  */
 public interface LeafSetNode<T>
         extends DistinctNodeContainer<NodeWithValue<?>, LeafSetEntryNode<T>>, DataContainerChild, MixinNode {
+    @Override
+    @SuppressWarnings("rawtypes")
+    Class<? extends LeafSetNode> contract();
+
     @Override
     NodeIdentifier getIdentifier();
 }
index d378db6c8f173715f35e5f4538a61b6edf8f22b6..9a6e6a5b2ba2e5e50ff4f2dc4c92d27e4711a77b 100644 (file)
@@ -14,6 +14,11 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
  * Instance of Map entry, this node does not contains value, but child nodes.
  */
 public interface MapEntryNode extends DataContainerNode {
+    @Override
+    default Class<MapEntryNode> contract() {
+        return MapEntryNode.class;
+    }
+
     /**
      * Returns identifier of this node in parent map node
      *
index 7ea30c4489871aa7eea169289b1866f2cac52fae..d48f2b8323a852daa8a002a1604cb831e3a87329 100644 (file)
@@ -23,6 +23,9 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
  */
 public interface MapNode
         extends DistinctNodeContainer<NodeIdentifierWithPredicates, MapEntryNode>, DataContainerChild, MixinNode {
+    @Override
+    Class<? extends MapNode> contract();
+
     @Override
     NodeIdentifier getIdentifier();
 
index da1ed92067989dd2da81d9bd60e2952c0c175cd4..957c7b135e46e2a9a4660eba437321af9c297276 100644 (file)
@@ -49,6 +49,18 @@ public interface NormalizedNode extends Identifiable<PathArgument> {
     // We override here, so that NormalizedNode.getIdentifier() has fewer implementations
     PathArgument getIdentifier();
 
+    /**
+     * Return the contract governing this {@link NormalizedNode} instance.
+     *
+     * @apiNote
+     *     This method should be specialized in intermediate contracts like {@link MapNode} and implemented as a default
+     *     method by interfaces which form the contracts themselves, for example {@link ContainerNode}, {@link LeafNode}
+     *     and similar.
+     *
+     * @return A class identifying the NormalizedNode contract.
+     */
+    @NonNull Class<? extends NormalizedNode> contract();
+
     /**
      * Returns the body of this node. While the return value specifies {@link Object}, this method's return value has
      * further semantics. The returned object must be a well-published contract, such as {@code String},
index 9ec7133a494a505266e2f0a33e55ed49a628f828..2e1acad7cf2265f5c734710ecd2ec64731dbc277 100644 (file)
@@ -17,6 +17,12 @@ package org.opendaylight.yangtools.yang.data.api.schema;
  * @param <T> Type of leaf node values.
  */
 public interface SystemLeafSetNode<T> extends LeafSetNode<T>, OrderingAware.System {
+    @Override
+    @SuppressWarnings("rawtypes")
+    default Class<SystemLeafSetNode> contract() {
+        return SystemLeafSetNode.class;
+    }
+
     @Override
     int hashCode();
 
index 7c39f7674a9f0a699a982c8b1daf738bb17c1f75..929fcea69935a45ed3c5f19912c170b0b36bf87a 100644 (file)
@@ -12,6 +12,11 @@ package org.opendaylight.yangtools.yang.data.api.schema;
  * a {@code list} with {@code ordered-by user;} substatement and a {@code key} definition.
  */
 public interface SystemMapNode extends MapNode, OrderingAware.System {
+    @Override
+    default Class<SystemMapNode> contract() {
+        return SystemMapNode.class;
+    }
+
     @Override
     int hashCode();
 
index 55c398baf5b04bf9ec1fe1296b461d384ecc0631..bdbad5eaacf19f3e25cd0eceba6913b6c7f83a70 100644 (file)
@@ -18,6 +18,11 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
  * which is an instance of {@link UnkeyedListNode}.
  */
 public interface UnkeyedListEntryNode extends DataContainerNode {
+    @Override
+    default Class<UnkeyedListEntryNode> contract() {
+        return UnkeyedListEntryNode.class;
+    }
+
     @Override
     NodeIdentifier getIdentifier();
 }
index 139de92b8e608d59f761a738cb157e9695a7ab20..7159e7e33f72cf2c4c3b04e9214e4df793195d92 100644 (file)
@@ -16,5 +16,8 @@ package org.opendaylight.yangtools.yang.data.api.schema;
  * (iteration) is provided by {@link #body()} call.
  */
 public interface UnkeyedListNode extends OrderedNodeContainer<UnkeyedListEntryNode>, DataContainerChild {
-
+    @Override
+    default Class<UnkeyedListNode> contract() {
+        return UnkeyedListNode.class;
+    }
 }
index e6522a179061459e3d04a3d1caa483a1ef81f2cf..5045988f63af2fd22dce2e58c525a64a15e87226 100644 (file)
@@ -14,5 +14,9 @@ package org.opendaylight.yangtools.yang.data.api.schema;
  * @param <T> Value type of Leaf entries
  */
 public interface UserLeafSetNode<T> extends LeafSetNode<T>, OrderedNodeContainer<LeafSetEntryNode<T>> {
-
+    @Override
+    @SuppressWarnings("rawtypes")
+    default Class<UserLeafSetNode> contract() {
+        return UserLeafSetNode.class;
+    }
 }
index 00b1badfdb0133ab717c5950e03d9ffc6b95c3d7..2cf620d6348533e08a7ad96e813f23593890b0d6 100644 (file)
@@ -15,6 +15,11 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
  * a {@code list} with {@code ordered-by user;} substatement and a {@code key} definition.
  */
 public interface UserMapNode extends MapNode, OrderedNodeContainer<MapEntryNode> {
+    @Override
+    default Class<UserMapNode> contract() {
+        return UserMapNode.class;
+    }
+
     /**
      * {@inheritDoc}
      *