Do not use BindingReflections to acquire augmentations
[mdsal.git] / binding / mdsal-binding-generator / src / main / java / org / opendaylight / mdsal / binding / generator / impl / reactor / OriginalLink.java
1 /*
2  * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.mdsal.binding.generator.impl.reactor;
9
10 import static java.util.Objects.requireNonNull;
11
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;
17
18 /**
19  * Link to the original definition of an {@link AbstractExplicitGenerator}.
20  */
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;
25
26         Complete(final AbstractExplicitGenerator<T> original) {
27             this.original = requireNonNull(original);
28         }
29
30         @Override
31         AbstractExplicitGenerator<T> previous() {
32             return original;
33         }
34
35         @Override
36         @NonNull AbstractExplicitGenerator<T> original() {
37             return original;
38         }
39
40         @Override
41         ToStringHelper addToStringAttributes(final ToStringHelper helper) {
42             return helper.add("original", original);
43         }
44     }
45
46     private static final class Partial<T extends EffectiveStatement<?, ?>> extends OriginalLink<T> {
47         private final @NonNull AbstractExplicitGenerator<T> previous;
48         private AbstractExplicitGenerator<T> original;
49
50         Partial(final AbstractExplicitGenerator<T> previous) {
51             this.previous = requireNonNull(previous);
52         }
53
54         @Override
55         AbstractExplicitGenerator<T> previous() {
56             return previous;
57         }
58
59         @Override
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();
65                 }
66             }
67             return original;
68         }
69
70         @Override
71         ToStringHelper addToStringAttributes(final ToStringHelper helper) {
72             return helper.add("previous", previous).add("original", original);
73         }
74     }
75
76     private OriginalLink() {
77         // Hidden on purpose
78     }
79
80     static <T extends EffectiveStatement<?, ?>> @NonNull OriginalLink<T> complete(
81             final AbstractExplicitGenerator<T> original) {
82         return new Complete<>(original);
83     }
84
85     static <T extends EffectiveStatement<?, ?>> @NonNull OriginalLink<T> partial(
86             final AbstractExplicitGenerator<T> previous) {
87         return new Partial<>(previous);
88     }
89
90     abstract @NonNull AbstractExplicitGenerator<T> previous();
91
92     abstract @Nullable AbstractExplicitGenerator<T> original();
93
94     abstract ToStringHelper addToStringAttributes(ToStringHelper helper);
95
96     @Override
97     public final String toString() {
98         return addToStringAttributes(MoreObjects.toStringHelper(this).omitNullValues()).toString();
99     }
100 }