2 * Copyright (c) 2021 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 com.google.common.base.Verify.verify;
11 import static java.util.Objects.requireNonNull;
13 import com.google.common.collect.ImmutableList;
14 import java.util.Collection;
15 import java.util.stream.Stream;
16 import org.eclipse.jdt.annotation.NonNull;
17 import org.eclipse.jdt.annotation.Nullable;
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.parser.spi.meta.CopyType;
21 import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.UndeclaredCurrent;
22 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.StorageNodeType;
23 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementFactory;
24 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport;
25 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
26 import org.opendaylight.yangtools.yang.parser.spi.meta.UndeclaredStatementFactory;
27 import org.opendaylight.yangtools.yang.parser.spi.source.ImplicitSubstatement;
31 * Core reactor statement implementation of {@link Mutable}.
33 * @param <A> Argument type
34 * @param <D> Declared Statement representation
35 * @param <E> Effective Statement representation
37 final class UndeclaredStmtCtx<A, D extends DeclaredStatement<A>, E extends EffectiveStatement<A, D>>
38 extends OriginalStmtCtx<A, D, E> implements UndeclaredCurrent<A, D> {
39 private final StatementContextBase<?, ?, ?> parent;
40 private final A argument;
42 private UndeclaredStmtCtx(final UndeclaredStmtCtx<A, D, E> original, final StatementContextBase<?, ?, ?> parent) {
44 this.parent = requireNonNull(parent);
45 this.argument = original.argument;
48 UndeclaredStmtCtx(final StatementContextBase<?, ?, ?> parent, final StatementSupport<A, D, E> support,
49 final @Nullable A argument) {
50 super(new StatementDefinitionContext<>(support), ImplicitSubstatement.of(parent.sourceReference()));
51 this.parent = requireNonNull(parent);
52 this.argument = argument != null ? argument : definition().parseArgumentValue(this, null);
55 // Exposed for StatementContextBase.wrapWithImplicit()
56 UndeclaredStmtCtx(final StatementContextBase<?, ?, ?> original, final StatementSupport<A, D, E> support) {
57 super(new StatementDefinitionContext<>(verifySupport(support)), original.sourceReference(),
58 original.getLastOperation());
59 this.parent = original.getParentContext();
60 this.argument = castArgument(original);
63 // Exposed for implicit substatement wrapping in StatementContextBase.childCopyOf()
64 UndeclaredStmtCtx(final StatementContextBase<?, ?, ?> parent, final StatementSupport<A, D, E> support,
65 final StatementContextBase<?, ?, ?> original, final CopyType type) {
66 super(new StatementDefinitionContext<>(verifySupport(support)), original.sourceReference(), type);
67 this.parent = requireNonNull(parent);
68 this.argument = castArgument(original);
71 // Exposed for AbstractResumedStatement
72 UndeclaredStmtCtx(final StatementContextBase<?, ?, ?> parent, final StatementSupport<A, D, E> support,
73 final String rawArgument) {
74 super(new StatementDefinitionContext<>(support), ImplicitSubstatement.of(parent.sourceReference()));
75 this.parent = requireNonNull(parent);
76 this.argument = definition().parseArgumentValue(this, rawArgument);
79 // FIXME: this assumes original's argument type matches this type... which is true for the only case we
80 // currently care about (implicit case in choice, which is always triggered by a SchemaTree original),
81 // but this will need re-visiting
82 @SuppressWarnings("unchecked")
83 private static <A> @NonNull A castArgument(final StatementContextBase<?, ?, ?> original) {
84 return (A) original.getArgument();
87 private static <T> T verifySupport(final T support) {
88 verify(support instanceof UndeclaredStatementFactory, "Unexpected statement support %s", support);
93 public Collection<? extends StatementContextBase<?, ?, ?>> mutableDeclaredSubstatements() {
94 return ImmutableList.of();
98 Stream<? extends @NonNull StmtContext<?, ?, ?>> streamDeclared() {
99 return Stream.empty();
103 void dropDeclaredSubstatements() {
108 UndeclaredStmtCtx<A, D, E> reparent(final StatementContextBase<?, ?, ?> newParent) {
109 return new UndeclaredStmtCtx<>(this, newParent);
113 E createEffective(final StatementFactory<A, D, E> factory) {
114 return createEffective(factory, this, streamEffective());
117 @SuppressWarnings("unchecked")
118 private static <A, D extends DeclaredStatement<A>, E extends EffectiveStatement<A, D>> @NonNull E createEffective(
119 final @NonNull StatementFactory<A, D, E> factory, final @NonNull UndeclaredCurrent<A, D> ctx,
120 final @NonNull Stream<? extends StmtContext<?, ?, ?>> substatements) {
121 verify(factory instanceof UndeclaredStatementFactory, "Unexpected factory %s", factory);
122 return ((UndeclaredStatementFactory<A, D, E>) factory).createUndeclaredEffective(ctx, substatements);
126 E createInferredEffective(final StatementFactory<A, D, E> factory, final InferredStatementContext<A, D, E> ctx,
127 final Stream<? extends StmtContext<?, ?, ?>> declared,
128 final Stream<? extends StmtContext<?, ?, ?>> effective) {
129 final long declaredCount = declared.count();
130 verify(declaredCount == 0, "Unexpected non-empty declared statements in %s", ctx);
131 return createEffective(factory, new ForwardingUndeclaredCurrent<>(ctx), effective);
135 * KEEP THINGS ORGANIZED!
137 * below methods exist in the same form in InferredStatementContext. If any adjustment is made here, make sure it is
138 * properly updated there.
141 public A argument() {
146 public StatementContextBase<?, ?, ?> getParentContext() {
151 public StorageNodeType getStorageNodeType() {
152 return StorageNodeType.STATEMENT_LOCAL;
156 public StatementContextBase<?, ?, ?> getParentNamespaceStorage() {
161 public RootStatementContext<?, ?, ?> getRoot() {
162 return parent.getRoot();
166 public EffectiveConfig effectiveConfig() {
167 return effectiveConfig(parent);
171 protected boolean isIgnoringIfFeatures() {
172 return isIgnoringIfFeatures(parent);
176 protected boolean isIgnoringConfig() {
177 return isIgnoringConfig(parent);
181 protected boolean isParentSupportedByFeatures() {
182 return parent.isSupportedByFeatures();