a766ca45fb218844b284fc2f27129805feb7cf4a
[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.mdsal.binding.runtime.api.RuntimeType;
17 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
18
19 /**
20  * Link to the original definition of an {@link AbstractExplicitGenerator}.
21  */
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;
27
28         Complete(final AbstractExplicitGenerator<T, R> original) {
29             this.original = requireNonNull(original);
30         }
31
32         @Override
33         AbstractExplicitGenerator<T, R> previous() {
34             return original;
35         }
36
37         @Override
38         @NonNull AbstractExplicitGenerator<T, R> original() {
39             return original;
40         }
41
42         @Override
43         ToStringHelper addToStringAttributes(final ToStringHelper helper) {
44             return helper.add("original", original);
45         }
46     }
47
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;
52
53         Partial(final AbstractExplicitGenerator<T, R> previous) {
54             this.previous = requireNonNull(previous);
55         }
56
57         @Override
58         AbstractExplicitGenerator<T, R> previous() {
59             return previous;
60         }
61
62         @Override
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();
68                 }
69             }
70             return original;
71         }
72
73         @Override
74         ToStringHelper addToStringAttributes(final ToStringHelper helper) {
75             return helper.add("previous", previous).add("original", original);
76         }
77     }
78
79     private OriginalLink() {
80         // Hidden on purpose
81     }
82
83     static <T extends EffectiveStatement<?, ?>, R extends RuntimeType> @NonNull OriginalLink<T, R> complete(
84             final AbstractExplicitGenerator<T, R> original) {
85         return new Complete<>(original);
86     }
87
88     static <T extends EffectiveStatement<?, ?>, R extends RuntimeType> @NonNull OriginalLink<T, R> partial(
89             final AbstractExplicitGenerator<T, R> previous) {
90         return new Partial<>(previous);
91     }
92
93     abstract @NonNull AbstractExplicitGenerator<T, R> previous();
94
95     abstract @Nullable AbstractExplicitGenerator<T, R> original();
96
97     abstract ToStringHelper addToStringAttributes(ToStringHelper helper);
98
99     @Override
100     public final String toString() {
101         return addToStringAttributes(MoreObjects.toStringHelper(this).omitNullValues()).toString();
102     }
103 }