From 96bef3b9a537f9a7f6c6d688495bf0e5d80cd4fa Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 24 Feb 2022 08:17:11 +0100 Subject: [PATCH 1/1] Improve OriginalLink safety The links to previous and original statement need to match our statement, otherwise we are in trouble. While we do not verify this at runtime (yet), improve type definitions to carry these around. JIRA: MDSAL-696 Change-Id: I3bcc1c3b0d2e3f74a0727f8bfa6b2f1e1c578f67 Signed-off-by: Robert Varga --- .../reactor/AbstractCompositeGenerator.java | 14 +++---- .../reactor/AbstractExplicitGenerator.java | 14 +++---- .../generator/impl/reactor/OriginalLink.java | 39 ++++++++++--------- 3 files changed, 35 insertions(+), 32 deletions(-) diff --git a/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/AbstractCompositeGenerator.java b/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/AbstractCompositeGenerator.java index 810d2d876d..450dab4e2e 100644 --- a/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/AbstractCompositeGenerator.java +++ b/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/AbstractCompositeGenerator.java @@ -329,20 +329,20 @@ abstract class AbstractCompositeGenerator> ex } @Override - final AbstractCompositeGenerator getOriginal() { - return (AbstractCompositeGenerator) super.getOriginal(); + final AbstractCompositeGenerator getOriginal() { + return (AbstractCompositeGenerator) super.getOriginal(); } @Override - final AbstractCompositeGenerator tryOriginal() { - return (AbstractCompositeGenerator) super.tryOriginal(); + final AbstractCompositeGenerator tryOriginal() { + return (AbstractCompositeGenerator) super.tryOriginal(); } - final @Nullable OriginalLink originalChild(final QName childQName) { + final > @Nullable OriginalLink originalChild(final QName childQName) { // First try groupings/augments ... var found = findInferredGenerator(childQName); if (found != null) { - return OriginalLink.partial(found); + return (OriginalLink) OriginalLink.partial(found); } // ... no luck, we really need to start looking at our origin @@ -351,7 +351,7 @@ abstract class AbstractCompositeGenerator> ex final QName prevQName = childQName.bindTo(prev.getQName().getModule()); found = prev.findSchemaTreeGenerator(prevQName); if (found != null) { - return found.originalLink(); + return (OriginalLink) found.originalLink(); } } diff --git a/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/AbstractExplicitGenerator.java b/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/AbstractExplicitGenerator.java index fca1b5bacb..10cac0c71c 100644 --- a/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/AbstractExplicitGenerator.java +++ b/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/AbstractExplicitGenerator.java @@ -50,11 +50,11 @@ public abstract class AbstractExplicitGeneratora generator which is one step closer to the original definition * */ - private AbstractExplicitGenerator prev; + private AbstractExplicitGenerator prev; /** * Field holding the original incarnation, i.e. the terminal node along {@link #prev} links. */ - private AbstractExplicitGenerator orig; + private AbstractExplicitGenerator orig; AbstractExplicitGenerator(final T statement) { this.statement = requireNonNull(statement); @@ -104,7 +104,7 @@ public abstract class AbstractExplicitGeneratororiginalChild(getQName()); if (link == null) { LOG.trace("Cannot link {} yet", this); return false; @@ -134,7 +134,7 @@ public abstract class AbstractExplicitGenerator previous() { + final @Nullable AbstractExplicitGenerator previous() { final var local = verifyNotNull(prev, "Generator %s does not have linkage to previous instance resolved", this); return local == this ? null : local; } @@ -144,11 +144,11 @@ public abstract class AbstractExplicitGenerator getOriginal() { + @NonNull AbstractExplicitGenerator getOriginal() { return verifyNotNull(orig, "Generator %s does not have linkage to original instance resolved", this); } - @Nullable AbstractExplicitGenerator tryOriginal() { + @Nullable AbstractExplicitGenerator tryOriginal() { return orig; } @@ -157,7 +157,7 @@ public abstract class AbstractExplicitGenerator originalLink() { final var local = prev; if (local == null) { return OriginalLink.partial(this); diff --git a/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/OriginalLink.java b/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/OriginalLink.java index 9794da4cf8..3d9009a42b 100644 --- a/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/OriginalLink.java +++ b/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/OriginalLink.java @@ -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> { + private static final class Complete> extends OriginalLink { + private final @NonNull AbstractExplicitGenerator original; - Complete(final AbstractExplicitGenerator original) { + Complete(final AbstractExplicitGenerator original) { this.original = requireNonNull(original); } @Override - AbstractExplicitGenerator previous() { + AbstractExplicitGenerator previous() { return original; } @Override - @NonNull AbstractExplicitGenerator original() { + @NonNull AbstractExplicitGenerator 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> extends OriginalLink { + private final @NonNull AbstractExplicitGenerator previous; + private AbstractExplicitGenerator original; - Partial(final AbstractExplicitGenerator previous) { + Partial(final AbstractExplicitGenerator previous) { this.previous = requireNonNull(previous); } @Override - AbstractExplicitGenerator previous() { + AbstractExplicitGenerator previous() { return previous; } @Override - AbstractExplicitGenerator original() { + AbstractExplicitGenerator 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 > @NonNull OriginalLink complete( + final AbstractExplicitGenerator original) { + return new Complete<>(original); } - static @NonNull OriginalLink partial(final AbstractExplicitGenerator previous) { - return new Partial(previous); + static > @NonNull OriginalLink partial( + final AbstractExplicitGenerator previous) { + return new Partial<>(previous); } - abstract @NonNull AbstractExplicitGenerator previous(); + abstract @NonNull AbstractExplicitGenerator previous(); - abstract @Nullable AbstractExplicitGenerator original(); + abstract @Nullable AbstractExplicitGenerator original(); abstract ToStringHelper addToStringAttributes(ToStringHelper helper); -- 2.36.6