2 * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.parser.stmt.reactor;
10 import static java.util.Objects.requireNonNull;
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;
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();
33 private final @NonNull StatementContextBase<A, D, ?> delegate;
35 private @Nullable Object parent;
37 BaseCurrentEffectiveStmtCtx(final StatementContextBase<A, D, ?> delegate) {
38 this.delegate = requireNonNull(delegate);
42 BaseCurrentEffectiveStmtCtx(final StatementContextBase<A, D, ?> delegate, final Parent parent) {
43 this.delegate = requireNonNull(delegate);
44 this.parent = requireNonNull(parent);
48 public StatementSource source() {
49 return delegate.source();
53 public StatementSourceReference sourceReference() {
54 return delegate.sourceReference();
58 public CommonStmtCtx root() {
59 return delegate.getRoot();
63 public CopyHistory history() {
64 return delegate.getCopyHistory();
69 return delegate.buildDeclared();
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);
79 public boolean effectiveConfig() {
80 return delegate.isConfiguration();
85 public Optional<SchemaPath> schemaPath() {
86 return delegate.schemaPath();
90 public StatementDefinition publicDefinition() {
91 return delegate.publicDefinition();
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)) {
106 // FIXME: YANGTOOLS-1185: this should be rendered unnecessary
107 private Parent loadParent() {
108 final StatementContextBase<?, ?, ?> parentDelegate = delegate.getParentContext();
109 if (parentDelegate == null) {
114 final Parent ret = new BaseCurrentEffectiveStmtCtx<>(parentDelegate);
120 public <K, V, N extends IdentifierNamespace<K, V>> Map<K, V>
121 getAllFromCurrentStmtCtxNamespace(final Class<N> type) {
122 return delegate.getAllFromCurrentStmtCtxNamespace(type);
126 public A argument() {
127 return delegate.argument();
131 public String rawArgument() {
132 return delegate.rawArgument();
136 public EffectiveStatement<?, ?> original() {
137 return delegate.getOriginalCtx().map(StmtContext::buildEffective).orElse(null);
141 public YangVersion yangVersion() {
142 return delegate.getRootVersion();
147 @SuppressWarnings("unchecked")
148 public <Z extends EffectiveStatement<A, D>> StmtContext<A, D, Z> caerbannog() {
149 return (StmtContext<A, D, Z>) delegate;