Improve OriginalLink safety
[mdsal.git] / binding / mdsal-binding-generator / src / main / java / org / opendaylight / mdsal / binding / generator / impl / reactor / OriginalLink.java
index 9794da4cf8e8d839f5c1f40bc8a934922a3aefd5..3d9009a42b4c6dfc068e38f2f7bb22799df5178b 100644 (file)
@@ -13,26 +13,27 @@ import com.google.common.base.MoreObjects;
 import com.google.common.base.MoreObjects.ToStringHelper;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 
 /**
  * Link to the original definition of an {@link AbstractExplicitGenerator}.
  */
 // FIXME: sealed when we have JDK17+
-abstract class OriginalLink {
-    private static final class Complete extends OriginalLink {
-        private final @NonNull AbstractExplicitGenerator<?> original;
+abstract class OriginalLink<T extends EffectiveStatement<?, ?>> {
+    private static final class Complete<T extends EffectiveStatement<?, ?>> extends OriginalLink<T> {
+        private final @NonNull AbstractExplicitGenerator<T> original;
 
-        Complete(final AbstractExplicitGenerator<?> original) {
+        Complete(final AbstractExplicitGenerator<T> original) {
             this.original = requireNonNull(original);
         }
 
         @Override
-        AbstractExplicitGenerator<?> previous() {
+        AbstractExplicitGenerator<T> previous() {
             return original;
         }
 
         @Override
-        @NonNull AbstractExplicitGenerator<?> original() {
+        @NonNull AbstractExplicitGenerator<T> original() {
             return original;
         }
 
@@ -42,21 +43,21 @@ abstract class OriginalLink {
         }
     }
 
-    private static final class Partial extends OriginalLink {
-        private final @NonNull AbstractExplicitGenerator<?> previous;
-        private AbstractExplicitGenerator<?> original;
+    private static final class Partial<T extends EffectiveStatement<?, ?>> extends OriginalLink<T> {
+        private final @NonNull AbstractExplicitGenerator<T> previous;
+        private AbstractExplicitGenerator<T> original;
 
-        Partial(final AbstractExplicitGenerator<?> previous) {
+        Partial(final AbstractExplicitGenerator<T> previous) {
             this.previous = requireNonNull(previous);
         }
 
         @Override
-        AbstractExplicitGenerator<?> previous() {
+        AbstractExplicitGenerator<T> previous() {
             return previous;
         }
 
         @Override
-        AbstractExplicitGenerator<?> original() {
+        AbstractExplicitGenerator<T> original() {
             if (original == null) {
                 final var link = previous.originalLink();
                 if (link instanceof Complete || link.previous() != previous) {
@@ -76,17 +77,19 @@ abstract class OriginalLink {
         // Hidden on purpose
     }
 
-    static @NonNull OriginalLink complete(final AbstractExplicitGenerator<?> original) {
-        return new Complete(original);
+    static <T extends EffectiveStatement<?, ?>> @NonNull OriginalLink<T> complete(
+            final AbstractExplicitGenerator<T> original) {
+        return new Complete<>(original);
     }
 
-    static @NonNull OriginalLink partial(final AbstractExplicitGenerator<?> previous) {
-        return new Partial(previous);
+    static <T extends EffectiveStatement<?, ?>> @NonNull OriginalLink<T> partial(
+            final AbstractExplicitGenerator<T> previous) {
+        return new Partial<>(previous);
     }
 
-    abstract @NonNull AbstractExplicitGenerator<?> previous();
+    abstract @NonNull AbstractExplicitGenerator<T> previous();
 
-    abstract @Nullable AbstractExplicitGenerator<?> original();
+    abstract @Nullable AbstractExplicitGenerator<T> original();
 
     abstract ToStringHelper addToStringAttributes(ToStringHelper helper);