/* * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.yangtools.yang.parser.stmt.reactor; import static java.util.Objects.requireNonNull; import java.util.Map; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.common.YangVersion; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; import org.opendaylight.yangtools.yang.model.api.meta.StatementSource; import org.opendaylight.yangtools.yang.parser.spi.meta.CommonStmtCtx; import org.opendaylight.yangtools.yang.parser.spi.meta.CopyHistory; import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference; // FIXME: YANGTOOLS-1185: integrate this into StatementContextBase final class BaseCurrentEffectiveStmtCtx> implements EffectiveStmtCtx.Current { static final Object NULL_OBJ = new Object(); private final @NonNull StatementContextBase delegate; private @Nullable Object parent; BaseCurrentEffectiveStmtCtx(final StatementContextBase delegate) { this.delegate = requireNonNull(delegate); this.parent = null; } BaseCurrentEffectiveStmtCtx(final StatementContextBase delegate, final Parent parent) { this.delegate = requireNonNull(delegate); this.parent = requireNonNull(parent); } @Override public StatementSource source() { return delegate.source(); } @Override public StatementSourceReference sourceReference() { return delegate.sourceReference(); } @Override public CommonStmtCtx root() { return delegate.getRoot(); } @Override public CopyHistory history() { return delegate.getCopyHistory(); } @Override public D declared() { return delegate.buildDeclared(); } @Override public > V getFromNamespace( final Class<@NonNull N> type, final T key) { return delegate.getFromNamespace(type, key); } @Override public boolean effectiveConfig() { return delegate.isConfiguration(); } @Override @Deprecated public Optional schemaPath() { return delegate.schemaPath(); } @Override public StatementDefinition publicDefinition() { return delegate.publicDefinition(); } @Override public Parent effectiveParent() { final Object local = parent; if (local instanceof Parent) { return (Parent) local; } else if (NULL_OBJ.equals(local)) { return null; } else { return loadParent(); } } // FIXME: YANGTOOLS-1185: this should be rendered unnecessary private Parent loadParent() { final StatementContextBase parentDelegate = delegate.getParentContext(); if (parentDelegate == null) { parent = NULL_OBJ; return null; } final Parent ret = new BaseCurrentEffectiveStmtCtx<>(parentDelegate); parent = ret; return ret; } @Override public > Map getAllFromCurrentStmtCtxNamespace(final Class type) { return delegate.getAllFromCurrentStmtCtxNamespace(type); } @Override public A argument() { return delegate.getStatementArgument(); } @Override public String rawArgument() { return delegate.rawArgument(); } @Override public EffectiveStatement original() { return delegate.getOriginalCtx().map(StmtContext::buildEffective).orElse(null); } @Override public YangVersion yangVersion() { return delegate.getRootVersion(); } @Override @Deprecated @SuppressWarnings("unchecked") public > StmtContext caerbannog() { return (StmtContext) delegate; } }