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.mdsal.binding.runtime.api.RuntimeType;
17 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
20 * Link to the original definition of an {@link AbstractExplicitGenerator}.
22 // FIXME: sealed when we have JDK17+
23 abstract class OriginalLink<T extends EffectiveStatement<?, ?>, R extends RuntimeType> {
24 private static final class Complete<T extends EffectiveStatement<?, ?>, R extends RuntimeType>
25 extends OriginalLink<T, R> {
26 private final @NonNull AbstractExplicitGenerator<T, R> original;
28 Complete(final AbstractExplicitGenerator<T, R> original) {
29 this.original = requireNonNull(original);
33 AbstractExplicitGenerator<T, R> previous() {
38 @NonNull AbstractExplicitGenerator<T, R> original() {
43 ToStringHelper addToStringAttributes(final ToStringHelper helper) {
44 return helper.add("original", original);
48 private static final class Partial<T extends EffectiveStatement<?, ?>, R extends RuntimeType>
49 extends OriginalLink<T, R> {
50 private final @NonNull AbstractExplicitGenerator<T, R> previous;
51 private AbstractExplicitGenerator<T, R> original;
53 Partial(final AbstractExplicitGenerator<T, R> previous) {
54 this.previous = requireNonNull(previous);
58 AbstractExplicitGenerator<T, R> previous() {
63 AbstractExplicitGenerator<T, R> original() {
64 if (original == null) {
65 final var link = previous.originalLink();
66 if (link instanceof Complete || link.previous() != previous) {
67 original = link.original();
74 ToStringHelper addToStringAttributes(final ToStringHelper helper) {
75 return helper.add("previous", previous).add("original", original);
79 private OriginalLink() {
83 static <T extends EffectiveStatement<?, ?>, R extends RuntimeType> @NonNull OriginalLink<T, R> complete(
84 final AbstractExplicitGenerator<T, R> original) {
85 return new Complete<>(original);
88 static <T extends EffectiveStatement<?, ?>, R extends RuntimeType> @NonNull OriginalLink<T, R> partial(
89 final AbstractExplicitGenerator<T, R> previous) {
90 return new Partial<>(previous);
93 abstract @NonNull AbstractExplicitGenerator<T, R> previous();
95 abstract @Nullable AbstractExplicitGenerator<T, R> original();
97 abstract ToStringHelper addToStringAttributes(ToStringHelper helper);
100 public final String toString() {
101 return addToStringAttributes(MoreObjects.toStringHelper(this).omitNullValues()).toString();