*/
package org.opendaylight.yangtools.yang.parser.stmt.reactor;
-import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.base.Verify.verify;
import static com.google.common.base.Verify.verifyNotNull;
import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.common.XMLNamespace;
import org.opendaylight.yangtools.yang.common.YangVersion;
-import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedStatement;
import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder;
globalContext.putModelDefinedStatementDefinition(name, def);
}
}
- } else if (current != null && current.producesDeclared(UnrecognizedStatement.class)) {
- /*
- * This code wraps statements encountered inside an extension so
- * they do not get confused with regular statements.
- */
- def = checkNotNull(current.definition().getAsUnknownStatementDefinition(def),
- "Unable to create unknown statement definition of yang statement %s in unknown statement %s", def,
- current);
+ } else if (current != null) {
+ def = current.definition().overrideDefinition(def);
}
if (InferenceException.throwIfNull(def, ref, "Statement %s does not have type mapping defined.", name)
import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
import org.opendaylight.yangtools.yang.parser.spi.meta.ImplicitParentAwareStatementSupport;
import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
+import org.opendaylight.yangtools.yang.parser.spi.meta.OverrideChildStatementSupport;
import org.opendaylight.yangtools.yang.parser.spi.meta.ParserNamespace;
import org.opendaylight.yangtools.yang.parser.spi.meta.StatementFactory;
import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport;
return support.hasArgumentSpecificSupports();
}
- // FIXME: 7.0.0: do we still need this?
- StatementDefinitionContext<?, ?, ?> getAsUnknownStatementDefinition(
- final StatementDefinitionContext<?, ?, ?> yangStmtDef) {
+ @NonNull StatementDefinitionContext<?, ?, ?> overrideDefinition(
+ final @NonNull StatementDefinitionContext<?, ?, ?> def) {
+ if (!(support instanceof OverrideChildStatementSupport)) {
+ return def;
+ }
+
if (unknownStmtDefsOfYangStmts != null) {
- final StatementDefinitionContext<?, ?, ?> existing = unknownStmtDefsOfYangStmts.get(yangStmtDef);
+ final StatementDefinitionContext<?, ?, ?> existing = unknownStmtDefsOfYangStmts.get(def);
if (existing != null) {
return existing;
}
} else {
- unknownStmtDefsOfYangStmts = new HashMap<>();
+ unknownStmtDefsOfYangStmts = new HashMap<>(4);
}
- @SuppressWarnings("unchecked")
- final StatementDefinitionContext<?, ?, ?> ret = support.getUnknownStatementDefinitionOf(
- yangStmtDef.getPublicView()).map(StatementDefinitionContext::new).orElse(null);
- if (ret != null) {
- unknownStmtDefsOfYangStmts.put(yangStmtDef, ret);
+ final StatementSupport<?, ?, ?> override =
+ ((OverrideChildStatementSupport) support).statementDefinitionOverrideOf(def.getPublicView());
+ final StatementDefinitionContext<?, ?, ?> ret;
+ if (override != null) {
+ ret = new StatementDefinitionContext<>(override);
+ } else {
+ ret = def;
}
+ unknownStmtDefsOfYangStmts.put(def, ret);
return ret;
}
}
import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport;
+import org.opendaylight.yangtools.yang.parser.spi.meta.OverrideChildStatementSupport;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
final class UnrecognizedStatementSupport
- extends AbstractStatementSupport<Object, UnrecognizedStatement, UnrecognizedEffectiveStatement> {
+ extends AbstractStatementSupport<Object, UnrecognizedStatement, UnrecognizedEffectiveStatement>
+ implements OverrideChildStatementSupport {
UnrecognizedStatementSupport(final StatementDefinition publicDefinition) {
// We have no idea about the statement's semantics, hence there should be noone interested in its semantics.
// Nevertheless it may be of interest for various hacks to understand there was an extension involved.
}
@Override
- public Optional<StatementSupport<?, ?, ?>> getUnknownStatementDefinitionOf(
- final StatementDefinition yangStmtDef) {
+ public UnrecognizedStatementSupport statementDefinitionOverrideOf(final StatementDefinition childDef) {
+ /*
+ * This code wraps statements encountered inside an extension so they do not get confused with regular
+ * statements.
+ */
final QName baseQName = getStatementName();
- final QName statementName = QName.create(baseQName, yangStmtDef.getStatementName().getLocalName());
+ final QName statementName = QName.create(baseQName, childDef.getStatementName().getLocalName());
final ModelDefinedStatementDefinition def;
- final Optional<ArgumentDefinition> optArgDef = yangStmtDef.getArgumentDefinition();
+ final Optional<ArgumentDefinition> optArgDef = childDef.getArgumentDefinition();
if (optArgDef.isPresent()) {
final ArgumentDefinition argDef = optArgDef.get();
def = new ModelDefinedStatementDefinition(statementName, argDef.getArgumentName(), argDef.isYinElement());
} else {
def = new ModelDefinedStatementDefinition(statementName);
}
- return Optional.of(new UnrecognizedStatementSupport(def));
+ return new UnrecognizedStatementSupport(def);
}
@Override
--- /dev/null
+/*
+ * Copyright (c) 2021 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.spi.meta;
+
+import com.google.common.annotations.Beta;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
+
+/**
+ * An additional trait for {@link StatementSupport}, allowing a parent statement to override the support for a child
+ * statement.
+ */
+@Beta
+public interface OverrideChildStatementSupport {
+ /**
+ * Returns unknown statement form of a regular YANG statement supplied as a parameter to the method.
+ *
+ * @param childDef statement definition of a regular YANG statement
+ * @return Optional of unknown statement form of a regular YANG statement, or {@code null} if it should not be
+ * overridden.
+ */
+ @Nullable StatementSupport<?, ?, ?> statementDefinitionOverrideOf(@NonNull StatementDefinition childDef);
+}
return rawArgument;
}
- /**
- * Returns unknown statement form of a regular YANG statement supplied as a parameter to the method. Default
- * implementation does nothing.
- *
- * @param yangStmtDef statement definition of a regular YANG statement
- * @return Optional of unknown statement form of a regular YANG statement or empty() if it is not supported by this
- * statement support
- */
- public Optional<StatementSupport<?, ?, ?>> getUnknownStatementDefinitionOf(final StatementDefinition yangStmtDef) {
- return Optional.empty();
- }
-
/**
* Returns true if this statement support and all its substatements ignore if-feature statements (e.g. yang-data
* extension defined in <a href="https://tools.ietf.org/html/rfc8040#section-8">RFC 8040</a>). Default