2 * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.mdsal.binding.generator.impl.reactor;
10 import static java.util.Objects.requireNonNull;
12 import com.google.common.base.MoreObjects;
13 import com.google.common.base.MoreObjects.ToStringHelper;
14 import org.eclipse.jdt.annotation.NonNull;
15 import org.eclipse.jdt.annotation.Nullable;
16 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
19 * Link to the original definition of an {@link AbstractExplicitGenerator}.
21 // FIXME: sealed when we have JDK17+
22 abstract class OriginalLink<T extends EffectiveStatement<?, ?>> {
23 private static final class Complete<T extends EffectiveStatement<?, ?>> extends OriginalLink<T> {
24 private final @NonNull AbstractExplicitGenerator<T> original;
26 Complete(final AbstractExplicitGenerator<T> original) {
27 this.original = requireNonNull(original);
31 AbstractExplicitGenerator<T> previous() {
36 @NonNull AbstractExplicitGenerator<T> original() {
41 ToStringHelper addToStringAttributes(final ToStringHelper helper) {
42 return helper.add("original", original);
46 private static final class Partial<T extends EffectiveStatement<?, ?>> extends OriginalLink<T> {
47 private final @NonNull AbstractExplicitGenerator<T> previous;
48 private AbstractExplicitGenerator<T> original;
50 Partial(final AbstractExplicitGenerator<T> previous) {
51 this.previous = requireNonNull(previous);
55 AbstractExplicitGenerator<T> previous() {
60 AbstractExplicitGenerator<T> original() {
61 if (original == null) {
62 final var link = previous.originalLink();
63 if (link instanceof Complete || link.previous() != previous) {
64 original = link.original();
71 ToStringHelper addToStringAttributes(final ToStringHelper helper) {
72 return helper.add("previous", previous).add("original", original);
76 private OriginalLink() {
80 static <T extends EffectiveStatement<?, ?>> @NonNull OriginalLink<T> complete(
81 final AbstractExplicitGenerator<T> original) {
82 return new Complete<>(original);
85 static <T extends EffectiveStatement<?, ?>> @NonNull OriginalLink<T> partial(
86 final AbstractExplicitGenerator<T> previous) {
87 return new Partial<>(previous);
90 abstract @NonNull AbstractExplicitGenerator<T> previous();
92 abstract @Nullable AbstractExplicitGenerator<T> original();
94 abstract ToStringHelper addToStringAttributes(ToStringHelper helper);
97 public final String toString() {
98 return addToStringAttributes(MoreObjects.toStringHelper(this).omitNullValues()).toString();