CopyHistory and yangVersion merge
[yangtools.git] / yang / yang-parser-reactor / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / reactor / BaseCurrentEffectiveStmtCtx.java
1 /*
2  * Copyright (c) 2020 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.yangtools.yang.parser.stmt.reactor;
9
10 import static java.util.Objects.requireNonNull;
11
12 import java.util.Map;
13 import java.util.Optional;
14 import org.eclipse.jdt.annotation.NonNull;
15 import org.eclipse.jdt.annotation.Nullable;
16 import org.opendaylight.yangtools.yang.common.YangVersion;
17 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
18 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
19 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
20 import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
21 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
22 import org.opendaylight.yangtools.yang.model.api.meta.StatementSource;
23 import org.opendaylight.yangtools.yang.parser.spi.meta.CommonStmtCtx;
24 import org.opendaylight.yangtools.yang.parser.spi.meta.CopyHistory;
25 import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx;
26 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
27 import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference;
28
29 // FIXME: YANGTOOLS-1185: integrate this into StatementContextBase
30 final class BaseCurrentEffectiveStmtCtx<A, D extends DeclaredStatement<A>> implements EffectiveStmtCtx.Current<A, D> {
31     static final Object NULL_OBJ = new Object();
32
33     private final @NonNull StatementContextBase<A, D, ?> delegate;
34
35     private @Nullable Object parent;
36
37     BaseCurrentEffectiveStmtCtx(final StatementContextBase<A, D, ?> delegate) {
38         this.delegate = requireNonNull(delegate);
39         this.parent = null;
40     }
41
42     BaseCurrentEffectiveStmtCtx(final StatementContextBase<A, D, ?> delegate, final Parent parent) {
43         this.delegate = requireNonNull(delegate);
44         this.parent = requireNonNull(parent);
45     }
46
47     @Override
48     public StatementSource source() {
49         return delegate.source();
50     }
51
52     @Override
53     public StatementSourceReference sourceReference() {
54         return delegate.sourceReference();
55     }
56
57     @Override
58     public CommonStmtCtx root() {
59         return delegate.getRoot();
60     }
61
62     @Override
63     public CopyHistory history() {
64         return delegate.history();
65     }
66
67     @Override
68     public D declared() {
69         return delegate.buildDeclared();
70     }
71
72     @Override
73     public <K, V, T extends K, N extends IdentifierNamespace<K, V>> V getFromNamespace(
74             final Class<@NonNull N> type, final T key) {
75         return delegate.getFromNamespace(type, key);
76     }
77
78     @Override
79     public boolean effectiveConfig() {
80         return delegate.isConfiguration();
81     }
82
83     @Override
84     @Deprecated
85     public Optional<SchemaPath> schemaPath() {
86         return delegate.schemaPath();
87     }
88
89     @Override
90     public StatementDefinition publicDefinition() {
91         return delegate.publicDefinition();
92     }
93
94     @Override
95     public Parent effectiveParent() {
96         final Object local = parent;
97         if (local instanceof Parent) {
98             return (Parent) local;
99         } else if (NULL_OBJ.equals(local)) {
100             return null;
101         } else {
102             return loadParent();
103         }
104     }
105
106     // FIXME: YANGTOOLS-1185: this should be rendered unnecessary
107     private Parent loadParent() {
108         final StatementContextBase<?, ?, ?> parentDelegate = delegate.getParentContext();
109         if (parentDelegate == null) {
110             parent = NULL_OBJ;
111             return null;
112         }
113
114         final Parent ret = new BaseCurrentEffectiveStmtCtx<>(parentDelegate);
115         parent = ret;
116         return ret;
117     }
118
119     @Override
120     public <K, V, N extends IdentifierNamespace<K, V>> Map<K, V>
121             getAllFromCurrentStmtCtxNamespace(final Class<N> type) {
122         return delegate.getAllFromCurrentStmtCtxNamespace(type);
123     }
124
125     @Override
126     public A argument() {
127         return delegate.argument();
128     }
129
130     @Override
131     public String rawArgument() {
132         return delegate.rawArgument();
133     }
134
135     @Override
136     public EffectiveStatement<?, ?> original() {
137         return delegate.getOriginalCtx().map(StmtContext::buildEffective).orElse(null);
138     }
139
140     @Override
141     public YangVersion yangVersion() {
142         return delegate.yangVersion();
143     }
144
145     @Override
146     @Deprecated
147     @SuppressWarnings("unchecked")
148     public <Z extends EffectiveStatement<A, D>> StmtContext<A, D, Z> caerbannog() {
149         return (StmtContext<A, D, Z>) delegate;
150     }
151 }