From 4b822262c88a15c9e8fca04a0bc10a78031d7f97 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 30 Jan 2022 01:22:23 +0100 Subject: [PATCH] Simplify original tracking Rather that having a quad-state 'prev' field typed to Object, potentially containing an OriginalLink, make its state logically tri-state typed with AbstractExplicitGenerator. The resolved generator is then carried in an explicit field. JIRA: MDSAL-718 Change-Id: I357a1ad6037a9c5288bdf2ec84dd90882cbcf76a Signed-off-by: Robert Varga (cherry picked from commit f356d00c296ceedabc3f8d9c27308a0dd2dbb088) --- .../reactor/AbstractCompositeGenerator.java | 3 +- .../reactor/AbstractExplicitGenerator.java | 83 +++++++++---------- .../generator/impl/reactor/OriginalLink.java | 12 ++- 3 files changed, 48 insertions(+), 50 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 1828410a19..6dae9ac584 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 @@ -17,7 +17,6 @@ import java.util.List; import java.util.stream.Collectors; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.mdsal.binding.generator.impl.reactor.OriginalLink.Partial; import org.opendaylight.mdsal.binding.model.api.Enumeration; import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject; import org.opendaylight.mdsal.binding.model.api.GeneratedType; @@ -193,7 +192,7 @@ abstract class AbstractCompositeGenerator> ex // First try groupings/augments ... final AbstractExplicitGenerator found = findInferredGenerator(childQName); if (found != null) { - return new Partial(found); + return OriginalLink.partial(found); } // ... no luck, we really need to start looking at our origin 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 b3e542f6ee..69a2f217e5 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 @@ -15,8 +15,6 @@ import com.google.common.base.MoreObjects.ToStringHelper; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.mdsal.binding.generator.impl.reactor.CollisionDomain.Member; -import org.opendaylight.mdsal.binding.generator.impl.reactor.OriginalLink.Complete; -import org.opendaylight.mdsal.binding.generator.impl.reactor.OriginalLink.Partial; import org.opendaylight.mdsal.binding.model.api.MethodSignature.ValueMechanics; import org.opendaylight.mdsal.binding.model.api.Type; import org.opendaylight.mdsal.binding.model.api.TypeMemberComment; @@ -49,11 +47,14 @@ public abstract class AbstractExplicitGenerator *
  • {@code null} when not resolved, i.e. access is not legal, or
  • *
  • {@code this} object if this is the original definition, or
  • - *
  • an {@link AbstractExplicitGenerator} pointing to the original definition, or
  • - *
  • a {@link Partial} link pointing to a generator closer to the original definition
  • + *
  • a generator which is one step closer to the original definition
  • * */ - private Object prev; + private AbstractExplicitGenerator prev; + /** + * Field holding the original incarnation, i.e. the terminal node along {@link #prev} links. + */ + private AbstractExplicitGenerator orig; AbstractExplicitGenerator(final T statement) { this.statement = requireNonNull(statement); @@ -90,30 +91,38 @@ public abstract class AbstractExplicitGenerator previous() { - final var local = prev(); - if (local == this) { - return null; - } else if (local instanceof Partial) { - return ((Partial) local).previous(); - } else { - return verifyExplicit(local); - } + final var local = verifyNotNull(prev, "Generator %s does not have linkage to previous instance resolved", this); + return local == this ? null : local; } /** @@ -138,8 +141,7 @@ public abstract class AbstractExplicitGenerator getOriginal() { - final var local = prev(); - return local == this ? this : verifyExplicit(local).getOriginal(); + return verifyNotNull(orig, "Generator %s does not have linkage to original instance resolved", this); } /** @@ -150,25 +152,14 @@ public abstract class AbstractExplicitGenerator verifyExplicit(final Object prev) { - verify(prev instanceof AbstractExplicitGenerator, "Unexpected previous %s", prev); - return (AbstractExplicitGenerator) prev; - } - - private @NonNull Object prev() { - return verifyNotNull(prev, "Generator %s does not have linkage to previous instance resolved", this); - } - @Nullable AbstractExplicitGenerator findSchemaTreeGenerator(final QName qname) { for (Generator child : this) { if (child instanceof AbstractExplicitGenerator) { 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 e51fe4b936..9794da4cf8 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 @@ -19,7 +19,7 @@ import org.eclipse.jdt.annotation.Nullable; */ // FIXME: sealed when we have JDK17+ abstract class OriginalLink { - static final class Complete extends OriginalLink { + private static final class Complete extends OriginalLink { private final @NonNull AbstractExplicitGenerator original; Complete(final AbstractExplicitGenerator original) { @@ -42,7 +42,7 @@ abstract class OriginalLink { } } - static final class Partial extends OriginalLink { + private static final class Partial extends OriginalLink { private final @NonNull AbstractExplicitGenerator previous; private AbstractExplicitGenerator original; @@ -76,6 +76,14 @@ abstract class OriginalLink { // Hidden on purpose } + static @NonNull OriginalLink complete(final AbstractExplicitGenerator original) { + return new Complete(original); + } + + static @NonNull OriginalLink partial(final AbstractExplicitGenerator previous) { + return new Partial(previous); + } + abstract @NonNull AbstractExplicitGenerator previous(); abstract @Nullable AbstractExplicitGenerator original(); -- 2.36.6