Fix DerivableSchemaNode.getOriginal() 56/97456/5
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 12 Sep 2021 15:45:05 +0000 (17:45 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 12 Sep 2021 16:37:57 +0000 (18:37 +0200)
We should be returning a type capture here, fix that up, which prompts
us having to retrofit the interface properly into concrete SchemaNodes
-- making it obvious where we have some overlap.

Change-Id: Ia8648c203f8e1560008711954febb815aecb1b6a
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
20 files changed:
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/AnydataSchemaNode.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/AnyxmlSchemaNode.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/CaseSchemaNode.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/ChoiceSchemaNode.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/ContainerSchemaNode.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DerivableSchemaNode.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/LeafListSchemaNode.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/LeafSchemaNode.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/ListSchemaNode.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/AbstractLeafEffectiveStatement.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/AbstractLeafListEffectiveStatement.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/AbstractListEffectiveStatement.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/CaseEffectiveStatementMixin.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/ChoiceEffectiveStatementImpl.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/ContainerEffectiveStatementImpl.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/EmptyAnydataEffectiveStatement.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/EmptyAnyxmlEffectiveStatement.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/EmptyListEffectiveStatement.java
model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/EffectiveStatementMixins.java
parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/GroupingTest.java

index b2c5d5eedf932f9b4e2bfda20e19f14a22de3716..35306d3d41a607e909e910b1325cd020dc474ea9 100644 (file)
@@ -22,7 +22,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.AnydataEffectiveStatement;
  * of this document.
  */
 @Beta
-public interface AnydataSchemaNode extends DataSchemaNode, MandatoryAware, MustConstraintAware,
+public interface AnydataSchemaNode extends DerivableSchemaNode<AnydataSchemaNode>, MandatoryAware, MustConstraintAware,
         EffectiveStatementEquivalent<AnydataEffectiveStatement> {
     /**
      * Schema of data.
index 73e0ee3a9640140a6f77f2e3627abe232c08a83b..e38935764ba7760306235f24825195c3a256e3c3 100644 (file)
@@ -18,7 +18,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement;
  * This interface was modeled according to definition in
  * <a href="https://tools.ietf.org/html/rfc6020#section-7.10">[RFC-6020] The anyxml Statement</a>
  */
-public interface AnyxmlSchemaNode extends DataSchemaNode, MandatoryAware, MustConstraintAware,
+public interface AnyxmlSchemaNode extends DerivableSchemaNode<AnyxmlSchemaNode>, MandatoryAware, MustConstraintAware,
         EffectiveStatementEquivalent<AnyxmlEffectiveStatement> {
 
 }
index 52ae91483feca4f53e43aa05ce3af216d10f380c..aa7c794e868c60b5c4f324c3891c2c366934f3a8 100644 (file)
@@ -12,7 +12,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.CaseEffectiveStatement;
 /**
  * The CaseSchemaNode interface is used to define branches of the ChoiceSchemaNode.
  */
-public interface CaseSchemaNode extends DataSchemaNode, DataNodeContainer, AugmentationTarget,
+public interface CaseSchemaNode extends DerivableSchemaNode<CaseSchemaNode>, DataNodeContainer, AugmentationTarget,
         EffectiveStatementEquivalent<CaseEffectiveStatement> {
 
 }
index 37b4f7274e3783e045b07be5dde441b849469070..6e67e6274402bec47338a119be9aa8708243c506 100644 (file)
@@ -22,7 +22,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceEffectiveStatement;
  * A ChoiceSchemaNode defines a set of alternatives. It consists of a number of branches defined as
  * ChoiceCaseSchemaNode objects.
  */
-public interface ChoiceSchemaNode extends DataSchemaNode, AugmentationTarget, MandatoryAware,
+public interface ChoiceSchemaNode extends DerivableSchemaNode<ChoiceSchemaNode>, AugmentationTarget, MandatoryAware,
         EffectiveStatementEquivalent<ChoiceEffectiveStatement> {
     /**
      * Returns cases of choice, keyed by their {@link SchemaNode#getQName()}. Returned map does not contain null keys
index b32c7528581899d664f63e5d67e9266527fe4cc7..5e2949bb499d1ea5b4179bfc012e68ee0430f9b6 100644 (file)
@@ -14,7 +14,8 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatemen
  * containers, those that exist only for organizing the hierarchy of data nodes, and those whose presence in the
  * configuration has an explicit meaning.
  */
-public interface ContainerSchemaNode extends ContainerLike, EffectiveStatementEquivalent<ContainerEffectiveStatement> {
+public interface ContainerSchemaNode extends ContainerLike, DerivableSchemaNode<ContainerSchemaNode>,
+        EffectiveStatementEquivalent<ContainerEffectiveStatement> {
     /**
      * Returns true if this container is marked as presence.
      *
index 7dd80983ad99e4ff258c12cadc6ca721422b4fc5..3e0c3af3cbbaf2ab9444a4df62616c3fdd3953ff 100644 (file)
@@ -13,14 +13,12 @@ import java.util.Optional;
  * Schema Node which may be derived from other schema node using augmentation or uses statement.
  */
 // FIXME: 8.0.0: refactor this interface to take into account CopyableNode and AddedByUsesAware
-public interface DerivableSchemaNode extends DataSchemaNode {
+public interface DerivableSchemaNode<T extends DerivableSchemaNode<T>> extends DataSchemaNode {
     /**
      * If this node is added by uses, returns original node definition from
      * grouping where it was defined.
      *
-     * @return original node definition from grouping if this node is added by
-     *         uses, Optional.absent otherwise
+     * @return original node definition from grouping if this node is added by uses, absent otherwise
      */
-    // FIXME: 8.0.0: this should be a type capture as it always matches this node's type
-    Optional<? extends SchemaNode> getOriginal();
+    Optional<T> getOriginal();
 }
index 68a8f01ad0c7ddba67b0f607ec6d20a855cab0e4..5b7c6143ef25dd1f0fb2392bd6485a76898766d4 100644 (file)
@@ -15,7 +15,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.LeafListEffectiveStatement
  * Interface describing YANG 'leaf-list' statement.
  */
 public interface LeafListSchemaNode extends TypedDataSchemaNode, MustConstraintAware, ElementCountConstraintAware,
-        EffectiveStatementEquivalent<LeafListEffectiveStatement> {
+        DerivableSchemaNode<LeafListSchemaNode>, EffectiveStatementEquivalent<LeafListEffectiveStatement> {
     /**
      * YANG 'ordered-by' statement. It defines whether the order of entries
      * within this leaf-list are determined by the user or the system. If not
index 6a3eb9f852628a6b3f87ee4d5949c35fd8527d07..e65dbcb0a6a10e591d3a1e1952142117194ac32d 100644 (file)
@@ -18,6 +18,6 @@ import org.opendaylight.yangtools.yang.model.api.stmt.LeafEffectiveStatement;
  * substatements is captured in the type returned via {@link #getType()}.
  */
 public interface LeafSchemaNode extends TypedDataSchemaNode, MandatoryAware, MustConstraintAware,
-        EffectiveStatementEquivalent<LeafEffectiveStatement> {
+        DerivableSchemaNode<LeafSchemaNode>, EffectiveStatementEquivalent<LeafEffectiveStatement> {
 
 }
index 848d4bada15e679199e2a52d5b4c6cbe4dc0c5d0..fda98f5f85a77147928c23a29cda529eec1aa39b 100644 (file)
@@ -21,7 +21,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.UniqueEffectiveStatement;
  * The 'list' statement is used to define an interior data node in the schema tree. A list entry is uniquely identified
  * by the values of the list's keys, if defined.
  */
-public interface ListSchemaNode extends DataNodeContainer, AugmentationTarget, DataSchemaNode,
+public interface ListSchemaNode extends DataNodeContainer, AugmentationTarget, DerivableSchemaNode<ListSchemaNode>,
         NotificationNodeContainer, ActionNodeContainer, ElementCountConstraintAware, MustConstraintAware,
         EffectiveStatementEquivalent<ListEffectiveStatement> {
     /**
index 407bfa361b5c59f0d4014eab25390e969176f948..61a176aa2554d9c3835cc14ada0bd0d5de3e311e 100644 (file)
@@ -12,7 +12,6 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.collect.ImmutableList;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
@@ -33,9 +32,8 @@ import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.M
 
 public abstract class AbstractLeafEffectiveStatement
         extends AbstractDeclaredEffectiveStatement.Default<QName, LeafStatement>
-        implements LeafEffectiveStatement, LeafSchemaNode, DerivableSchemaNode,
-            DataSchemaNodeMixin<LeafStatement>, MandatoryMixin<QName, LeafStatement>,
-            MustConstraintMixin<QName, LeafStatement> {
+        implements LeafEffectiveStatement, LeafSchemaNode, DataSchemaNodeMixin<LeafStatement>,
+            MandatoryMixin<QName, LeafStatement>, MustConstraintMixin<QName, LeafStatement> {
     private final @NonNull Object substatements;
     private final @NonNull QName argument;
     private final @NonNull TypeDefinition<?> type;
index 8b98e64062d76a74cc1c4e7565f9df9660d47449..881d98b6ad267f649f96522624ea4ffcbe1229d5 100644 (file)
@@ -12,7 +12,6 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.collect.ImmutableList;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
@@ -32,9 +31,8 @@ import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.U
 
 abstract class AbstractLeafListEffectiveStatement
         extends AbstractDeclaredEffectiveStatement.Default<QName, LeafListStatement>
-        implements LeafListEffectiveStatement, LeafListSchemaNode, DerivableSchemaNode,
-            UserOrderedMixin<QName, LeafListStatement>, DataSchemaNodeMixin<LeafListStatement>,
-            MustConstraintMixin<QName, LeafListStatement> {
+        implements LeafListEffectiveStatement, LeafListSchemaNode, UserOrderedMixin<QName, LeafListStatement>,
+            DataSchemaNodeMixin<LeafListStatement>, MustConstraintMixin<QName, LeafListStatement> {
     private final @NonNull Object substatements;
     private final @NonNull QName argument;
     private final @NonNull TypeDefinition<?> type;
index 7f3dfc6e54468dd1764f62abfeff991b1de2279a..506413c5297d27c0bad5b747829aae0c43797bd5 100644 (file)
@@ -15,7 +15,6 @@ import java.util.List;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ListEffectiveStatement;
@@ -35,7 +34,7 @@ import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.W
 
 abstract class AbstractListEffectiveStatement
         extends WithTypedefNamespace<QName, ListStatement, ListEffectiveStatement>
-        implements ListEffectiveStatement, ListSchemaNode, DerivableSchemaNode,
+        implements ListEffectiveStatement, ListSchemaNode,
             ActionNodeContainerCompat<QName, ListStatement, ListEffectiveStatement>,
             NotificationNodeContainerCompat<QName, ListStatement, ListEffectiveStatement>,
             DataSchemaNodeMixin<ListStatement>, UserOrderedMixin<QName, ListStatement>,
index 206e34e0fd31a6a1ecf5922de21f39c1362c2430..f71170fceb2ccb0eef4b20ea07811c87abc01535 100644 (file)
@@ -9,7 +9,6 @@ package org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff;
 
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.stmt.CaseEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.CaseStatement;
 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.AugmentationTargetMixin;
@@ -18,7 +17,7 @@ import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.D
 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.DocumentedNodeMixin;
 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.MustConstraintMixin;
 
-interface CaseEffectiveStatementMixin extends CaseEffectiveStatement, CaseSchemaNode, DerivableSchemaNode,
+interface CaseEffectiveStatementMixin extends CaseEffectiveStatement, CaseSchemaNode,
         DataSchemaNodeMixin<CaseStatement>, DocumentedNodeMixin.WithStatus<QName, CaseStatement>,
         DataNodeContainerMixin<QName, CaseStatement>, MustConstraintMixin<QName, CaseStatement>,
         AugmentationTargetMixin<QName, CaseStatement> {
index f830d1fbcf0a60b1e32135b5cbdd8965003a9812..45dede877c099dfb453c494c0dadd2e9472c2d90 100644 (file)
@@ -17,7 +17,6 @@ import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceStatement;
@@ -29,9 +28,8 @@ import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.M
 
 public final class ChoiceEffectiveStatementImpl
         extends DefaultWithDataTree<QName, ChoiceStatement, ChoiceEffectiveStatement>
-        implements ChoiceEffectiveStatement, ChoiceSchemaNode, DerivableSchemaNode,
-                   DataSchemaNodeMixin<ChoiceStatement>, AugmentationTargetMixin<QName, ChoiceStatement>,
-                   MandatoryMixin<QName, ChoiceStatement> {
+        implements ChoiceEffectiveStatement, ChoiceSchemaNode, DataSchemaNodeMixin<ChoiceStatement>,
+            AugmentationTargetMixin<QName, ChoiceStatement>, MandatoryMixin<QName, ChoiceStatement> {
     private final CaseSchemaNode defaultCase;
     private final ChoiceSchemaNode original;
     private final @NonNull QName argument;
index 0f9749ab9533895e3de9fa18c58b1c8ccde749c6..619edfc619c9d2ebe6c42a7d138d3e8588e4597f 100644 (file)
@@ -16,7 +16,6 @@ import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerStatement;
@@ -33,9 +32,8 @@ import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.P
 
 public final class ContainerEffectiveStatementImpl
         extends WithTypedefNamespace<QName, ContainerStatement, ContainerEffectiveStatement>
-        implements ContainerEffectiveStatement, ContainerSchemaNode, DerivableSchemaNode,
-            DataSchemaNodeMixin<ContainerStatement>, DataNodeContainerMixin<QName, ContainerStatement>,
-            ActionNodeContainerMixin<QName, ContainerStatement>,
+        implements ContainerEffectiveStatement, ContainerSchemaNode, DataSchemaNodeMixin<ContainerStatement>,
+            DataNodeContainerMixin<QName, ContainerStatement>, ActionNodeContainerMixin<QName, ContainerStatement>,
             ActionNodeContainerCompat<QName, ContainerStatement, ContainerEffectiveStatement>,
             NotificationNodeContainerMixin<QName, ContainerStatement>,
             NotificationNodeContainerCompat<QName, ContainerStatement, ContainerEffectiveStatement>,
index 66e7591df0487235acf7caf11ed9f646633a8a47..9a0adaadc532d3f65bded1aceb331be3269e26f2 100644 (file)
@@ -22,7 +22,8 @@ import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveS
 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.OpaqueDataSchemaNodeMixin;
 
 public class EmptyAnydataEffectiveStatement extends Default<QName, AnydataStatement>
-        implements AnydataEffectiveStatement, AnydataSchemaNode, OpaqueDataSchemaNodeMixin<AnydataStatement> {
+        implements AnydataEffectiveStatement, AnydataSchemaNode,
+            OpaqueDataSchemaNodeMixin<AnydataStatement, AnydataSchemaNode> {
     private final @NonNull QName argument;
     private final AnydataSchemaNode original;
     private final int flags;
index bc1445df9810f467832b3a130562dab40b422fa3..a5fca5941625dfd0afbee70dafa178b1228a7437 100644 (file)
@@ -21,7 +21,8 @@ import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveS
 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.OpaqueDataSchemaNodeMixin;
 
 public class EmptyAnyxmlEffectiveStatement extends Default<QName, AnyxmlStatement>
-        implements AnyxmlEffectiveStatement, AnyxmlSchemaNode, OpaqueDataSchemaNodeMixin<AnyxmlStatement> {
+        implements AnyxmlEffectiveStatement, AnyxmlSchemaNode,
+            OpaqueDataSchemaNodeMixin<AnyxmlStatement, AnyxmlSchemaNode> {
     private final @NonNull QName argument;
     private final AnyxmlSchemaNode original;
     private final int flags;
index d3595ccb1ea7f8a65059cd52f9a968a2d31335d3..830c75efe7f9f5e620b609bd616f097ad07819b9 100644 (file)
@@ -11,7 +11,7 @@ import com.google.common.collect.ImmutableList;
 import java.util.Optional;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.ElementCountConstraint;
-import org.opendaylight.yangtools.yang.model.api.SchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ListStatement;
 
@@ -28,7 +28,7 @@ public final class EmptyListEffectiveStatement extends AbstractListEffectiveStat
     }
 
     @Override
-    public Optional<? extends SchemaNode> getOriginal() {
+    public Optional<ListSchemaNode> getOriginal() {
         return Optional.empty();
     }
 
index d9e1aed84faa18ab45f4803122654a34df6dddd0..dc93fd2b73450fc55f9aead3d888eb0807e17f2c 100644 (file)
@@ -399,8 +399,8 @@ public final class EffectiveStatementMixins {
      *
      * @param <D> Class representing declared version of this statement.
      */
-    public interface OpaqueDataSchemaNodeMixin<D extends DeclaredStatement<QName>>
-            extends DerivableSchemaNode, DataSchemaNodeMixin<D>, DocumentedNodeMixin.WithStatus<QName, D>,
+    public interface OpaqueDataSchemaNodeMixin<D extends DeclaredStatement<QName>, S extends DerivableSchemaNode<S>>
+            extends DerivableSchemaNode<S>, DataSchemaNodeMixin<D>, DocumentedNodeMixin.WithStatus<QName, D>,
                     MandatoryMixin<QName, D>, MustConstraintMixin<QName, D>, WhenConditionMixin<QName, D> {
         @Override
         default QName getQName() {
index 6fde4e592a9799ffd92ec3b24d74995b705548e3..6f1e3e57c6e1549bd650e823d8922447f1dcefa7 100644 (file)
@@ -602,8 +602,8 @@ public class GroupingTest {
         }
     }
 
-    private static @Nullable SchemaNode extractOriginal(final SchemaNode node) {
+    private static @Nullable DerivableSchemaNode<?> extractOriginal(final SchemaNode node) {
         assertThat(node, instanceOf(DerivableSchemaNode.class));
-        return ((DerivableSchemaNode) node).getOriginal().orElse(null);
+        return ((DerivableSchemaNode<?>) node).getOriginal().orElse(null);
     }
 }