Enforce explicit generator linkage
[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
17 /**
18  * Link to the original definition of an {@link AbstractExplicitGenerator}.
19  */
20 // FIXME: sealed when we have JDK17+
21 abstract class OriginalLink {
22     static final class Complete extends OriginalLink {
23         private final @NonNull AbstractExplicitGenerator<?> original;
24
25         Complete(final AbstractExplicitGenerator<?> original) {
26             this.original = requireNonNull(original);
27         }
28
29         @Override
30         AbstractExplicitGenerator<?> previous() {
31             return original;
32         }
33
34         @Override
35         @NonNull AbstractExplicitGenerator<?> original() {
36             return original;
37         }
38
39         @Override
40         ToStringHelper addToStringAttributes(final ToStringHelper helper) {
41             return helper.add("original", original);
42         }
43     }
44
45     static final class Partial extends OriginalLink {
46         private final @NonNull AbstractExplicitGenerator<?> previous;
47         private AbstractExplicitGenerator<?> original;
48
49         Partial(final AbstractExplicitGenerator<?> previous) {
50             this.previous = requireNonNull(previous);
51         }
52
53         @Override
54         AbstractExplicitGenerator<?> previous() {
55             return previous;
56         }
57
58         @Override
59         AbstractExplicitGenerator<?> original() {
60             if (original == null) {
61                 final var link = previous.originalLink();
62                 if (link instanceof Complete || link.previous() != previous) {
63                     original = link.original();
64                 }
65             }
66             return original;
67         }
68
69         @Override
70         ToStringHelper addToStringAttributes(final ToStringHelper helper) {
71             return helper.add("previous", previous).add("original", original);
72         }
73     }
74
75     private OriginalLink() {
76         // Hidden on purpose
77     }
78
79     abstract @NonNull AbstractExplicitGenerator<?> previous();
80
81     abstract @Nullable AbstractExplicitGenerator<?> original();
82
83     abstract ToStringHelper addToStringAttributes(ToStringHelper helper);
84
85     @Override
86     public final String toString() {
87         return addToStringAttributes(MoreObjects.toStringHelper(this).omitNullValues()).toString();
88     }
89 }