Reformulate StatementContextFactory.createEffective()
[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.parser.spi.meta.CopyHistory;
23 import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx;
24 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
25 import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference;
26
27 // FIXME: YANGTOOLS-1185: integrate this into StatementContextBase
28 final class BaseCurrentEffectiveStmtCtx<A, D extends DeclaredStatement<A>> implements EffectiveStmtCtx.Current<A, D> {
29     static final Object NULL_OBJ = new Object();
30
31     private final @NonNull StmtContext<A, D, ?> delegate;
32
33     private @Nullable Object parent;
34
35     BaseCurrentEffectiveStmtCtx(final StmtContext<A, D, ?> delegate) {
36         this.delegate = requireNonNull(delegate);
37         this.parent = null;
38     }
39
40     BaseCurrentEffectiveStmtCtx(final StmtContext<A, D, ?> delegate, final Parent parent) {
41         this.delegate = requireNonNull(delegate);
42         this.parent = requireNonNull(parent);
43     }
44
45     @Override
46     public StatementSourceReference sourceReference() {
47         return delegate.getStatementSourceReference();
48     }
49
50     @Override
51     public CopyHistory history() {
52         return delegate.getCopyHistory();
53     }
54
55     @Override
56     public D declared() {
57         return delegate.buildDeclared();
58     }
59
60     @Override
61     public <K, V, T extends K, N extends IdentifierNamespace<K, V>> V getFromNamespace(
62             final Class<@NonNull N> type, final T key) {
63         return delegate.getFromNamespace(type, key);
64     }
65
66     @Override
67     public boolean effectiveConfig() {
68         return delegate.isConfiguration();
69     }
70
71     @Override
72     @Deprecated
73     public Optional<SchemaPath> schemaPath() {
74         return delegate.getSchemaPath();
75     }
76
77     @Override
78     public StatementDefinition publicDefinition() {
79         return delegate.getPublicDefinition();
80     }
81
82     @Override
83     public Parent parent() {
84         final Object local = parent;
85         if (local instanceof Parent) {
86             return (Parent) local;
87         } else if (NULL_OBJ.equals(local)) {
88             return null;
89         } else {
90             return loadParent();
91         }
92     }
93
94     // FIXME: YANGTOOLS-1185: this should be rendered unnecessary
95     private Parent loadParent() {
96         final StmtContext<?, ?, ?> parentDelegate = delegate.getParentContext();
97         if (parentDelegate == null) {
98             parent = NULL_OBJ;
99             return null;
100         }
101
102         final Parent ret = new BaseCurrentEffectiveStmtCtx<>(parentDelegate);
103         parent = ret;
104         return ret;
105     }
106
107     @Override
108     public <K, V, N extends IdentifierNamespace<K, V>> Map<K, V>
109             getAllFromCurrentStmtCtxNamespace(final Class<N> type) {
110         return delegate.getAllFromCurrentStmtCtxNamespace(type);
111     }
112
113     @Override
114     public A argument() {
115         return delegate.getStatementArgument();
116     }
117
118     @Override
119     public String rawArgument() {
120         return delegate.rawStatementArgument();
121     }
122
123     @Override
124     public EffectiveStatement<?, ?> original() {
125         return delegate.getOriginalCtx().map(StmtContext::buildEffective).orElse(null);
126     }
127
128     @Override
129     public YangVersion yangVersion() {
130         return delegate.getRootVersion();
131     }
132
133     @Override
134     @Deprecated
135     @SuppressWarnings("unchecked")
136     public <Z extends EffectiveStatement<A, D>> StmtContext<A, D, Z> caerbannog() {
137         return (StmtContext<A, D, Z>) delegate;
138     }
139 }