*/
package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
-import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
import java.util.ArrayList;
import java.util.Collection;
import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder;
import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.InferenceAction;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.InferenceContext;
import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Prerequisite;
import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-
public class UsesStatementImpl extends AbstractDeclaredStatement<QName> implements UsesStatement {
private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping
.USES)
@Override
public void onFullDefinitionDeclared(
- final StmtContext.Mutable<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> usesNode) {
- if (!StmtContextUtils.areFeaturesSupported(usesNode)) {
+ final Mutable<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> usesNode) {
+ if (!usesNode.isSupportedByFeatures()) {
return;
}
super.onFullDefinitionDeclared(usesNode);
usesAction.apply(new InferenceAction() {
@Override
- public void apply() {
- final StatementContextBase<?, ?, ?> targetNodeStmtCtx = (StatementContextBase<?, ?, ?>) targetNodePre.get();
- final StatementContextBase<?, ?, ?> sourceGrpStmtCtx = (StatementContextBase<?, ?, ?>) sourceGroupingPre.get();
+ public void apply(final InferenceContext ctx) {
+ final StatementContextBase<?, ?, ?> targetNodeStmtCtx = (StatementContextBase<?, ?, ?>) targetNodePre.resolve(ctx);
+ final StatementContextBase<?, ?, ?> sourceGrpStmtCtx = (StatementContextBase<?, ?, ?>) sourceGroupingPre.resolve(ctx);
try {
copyFromSourceToTarget(sourceGrpStmtCtx, targetNodeStmtCtx, usesNode);
* @throws SourceException
* instance of SourceException
*/
- private static void copyFromSourceToTarget(final StatementContextBase<?, ?, ?> sourceGrpStmtCtx,
+ private static void copyFromSourceToTarget(final Mutable<?, ?, ?> sourceGrpStmtCtx,
final StatementContextBase<?, ?, ?> targetCtx,
final StmtContext.Mutable<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> usesNode) {
- final Collection<StatementContextBase<?, ?, ?>> declared = sourceGrpStmtCtx.declaredSubstatements();
- final Collection<StatementContextBase<?, ?, ?>> effective = sourceGrpStmtCtx.effectiveSubstatements();
- final Collection<StatementContextBase<?, ?, ?>> buffer = new ArrayList<>(declared.size() + effective.size());
+ final Collection<? extends Mutable<?, ?, ?>> declared = sourceGrpStmtCtx.mutableDeclaredSubstatements();
+ final Collection<? extends Mutable<?, ?, ?>> effective = sourceGrpStmtCtx.mutableEffectiveSubstatements();
+ final Collection<Mutable<?, ?, ?>> buffer = new ArrayList<>(declared.size() + effective.size());
final QNameModule newQNameModule = getNewQNameModule(targetCtx, sourceGrpStmtCtx);
- for (final StatementContextBase<?, ?, ?> original : declared) {
- if (StmtContextUtils.areFeaturesSupported(original)) {
+ for (final Mutable<?, ?, ?> original : declared) {
+ if (original.isSupportedByFeatures()) {
copyStatement(original, targetCtx, newQNameModule, buffer);
}
}
- for (final StatementContextBase<?, ?, ?> original : effective) {
+ for (final Mutable<?, ?, ?> original : effective) {
copyStatement(original, targetCtx, newQNameModule, buffer);
}
usesNode.addAsEffectOfStatement(buffer);
}
- private static void copyStatement(final StatementContextBase<?, ?, ?> original,
+ private static void copyStatement(final Mutable<?, ?, ?> original,
final StatementContextBase<?, ?, ?> targetCtx, final QNameModule targetModule,
- final Collection<StatementContextBase<?, ?, ?>> buffer) {
+ final Collection<Mutable<?, ?, ?>> buffer) {
if (needToCopyByUses(original)) {
- final StatementContextBase<?, ?, ?> copy = original.createCopy(targetModule, targetCtx,
- CopyType.ADDED_BY_USES);
+ final Mutable<?, ?, ?> copy = original.createCopy(targetModule, targetCtx, CopyType.ADDED_BY_USES);
buffer.add(copy);
} else if (isReusedByUsesOnTop(original)) {
buffer.add(original);
public static void resolveUsesNode(
final Mutable<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> usesNode,
final StatementContextBase<?, ?, ?> targetNodeStmtCtx) {
- for (final StatementContextBase<?, ?, ?> subStmtCtx : usesNode.declaredSubstatements()) {
+ for (final Mutable<?, ?, ?> subStmtCtx : usesNode.mutableDeclaredSubstatements()) {
if (StmtContextUtils.producesDeclared(subStmtCtx, RefineStatement.class)
&& areFeaturesSupported(subStmtCtx)) {
performRefine(subStmtCtx, targetNodeStmtCtx);
}
}
- private static boolean areFeaturesSupported(final StatementContextBase<?, ?, ?> subStmtCtx) {
+ private static boolean areFeaturesSupported(final Mutable<?, ?, ?> subStmtCtx) {
/*
* In case of Yang 1.1, checks whether features are supported.
*/
- return !YangVersion.VERSION_1_1.equals(subStmtCtx.getRootVersion()) || StmtContextUtils
- .areFeaturesSupported(subStmtCtx);
+ return !YangVersion.VERSION_1_1.equals(subStmtCtx.getRootVersion()) || subStmtCtx.isSupportedByFeatures();
}
- private static void performRefine(final StatementContextBase<?, ?, ?> refineCtx,
+ private static void performRefine(final Mutable<?, ?, ?> subStmtCtx,
final StatementContextBase<?, ?, ?> usesParentCtx) {
- final Object refineArgument = refineCtx.getStatementArgument();
- Preconditions.checkArgument(refineArgument instanceof SchemaNodeIdentifier,
- "Invalid refine argument %s. It must be instance of SchemaNodeIdentifier. At %s", refineArgument,
- refineCtx.getStatementSourceReference());
+ final Object refineArgument = subStmtCtx.getStatementArgument();
+ InferenceException.throwIf(!(refineArgument instanceof SchemaNodeIdentifier),
+ subStmtCtx.getStatementSourceReference(),
+ "Invalid refine argument %s. It must be instance of SchemaNodeIdentifier.", refineArgument);
final SchemaNodeIdentifier refineTargetNodeIdentifier = (SchemaNodeIdentifier) refineArgument;
final StatementContextBase<?, ?, ?> refineTargetNodeCtx = Utils.findNode(usesParentCtx,
refineTargetNodeIdentifier);
- Preconditions.checkArgument(refineTargetNodeCtx != null, "Refine target node %s not found. At %s",
- refineTargetNodeIdentifier, refineCtx.getStatementSourceReference());
+
+ InferenceException.throwIfNull(refineTargetNodeCtx, subStmtCtx.getStatementSourceReference(),
+ "Refine target node %s not found.", refineTargetNodeIdentifier);
+
if (StmtContextUtils.isUnknownStatement(refineTargetNodeCtx)) {
LOG.debug(
"Refine node '{}' in uses '{}' has target node unknown statement '{}'. Refine has been skipped. At line: {}",
- refineCtx.getStatementArgument(), refineCtx.getParentContext().getStatementArgument(),
- refineTargetNodeCtx.getStatementArgument(), refineCtx.getStatementSourceReference());
- refineCtx.addAsEffectOfStatement(refineTargetNodeCtx);
+ subStmtCtx.getStatementArgument(), subStmtCtx.getParentContext().getStatementArgument(),
+ refineTargetNodeCtx.getStatementArgument(), subStmtCtx.getStatementSourceReference());
+ subStmtCtx.addAsEffectOfStatement(refineTargetNodeCtx);
return;
}
- addOrReplaceNodes(refineCtx, refineTargetNodeCtx);
- refineCtx.addAsEffectOfStatement(refineTargetNodeCtx);
+ addOrReplaceNodes(subStmtCtx, refineTargetNodeCtx);
+ subStmtCtx.addAsEffectOfStatement(refineTargetNodeCtx);
}
- private static void addOrReplaceNodes(final StatementContextBase<?, ?, ?> refineCtx,
+ private static void addOrReplaceNodes(final Mutable<?, ?, ?> subStmtCtx,
final StatementContextBase<?, ?, ?> refineTargetNodeCtx) {
- for (final StatementContextBase<?, ?, ?> refineSubstatementCtx : refineCtx.declaredSubstatements()) {
+ for (final Mutable<?, ?, ?> refineSubstatementCtx : subStmtCtx.mutableDeclaredSubstatements()) {
if (isSupportedRefineSubstatement(refineSubstatementCtx)) {
addOrReplaceNode(refineSubstatementCtx, refineTargetNodeCtx);
}
}
}
- private static void addOrReplaceNode(final StatementContextBase<?, ?, ?> refineSubstatementCtx,
+ private static void addOrReplaceNode(final Mutable<?, ?, ?> refineSubstatementCtx,
final StatementContextBase<?, ?, ?> refineTargetNodeCtx) {
final StatementDefinition refineSubstatementDef = refineSubstatementCtx.getPublicDefinition();
return ALLOWED_TO_ADD_BY_REFINE_DEF_SET.contains(publicDefinition);
}
- private static boolean isSupportedRefineSubstatement(final StatementContextBase<?, ?, ?> refineSubstatementCtx) {
+ private static boolean isSupportedRefineSubstatement(final StmtContext<?, ?, ?> refineSubstatementCtx) {
final Collection<?> supportedRefineSubstatements = refineSubstatementCtx.getFromNamespace(
ValidationBundlesNamespace.class, ValidationBundleType.SUPPORTED_REFINE_SUBSTATEMENTS);
|| StmtContextUtils.isUnknownStatement(refineSubstatementCtx);
}
- private static boolean isSupportedRefineTarget(final StatementContextBase<?, ?, ?> refineSubstatementCtx,
- final StatementContextBase<?, ?, ?> refineTargetNodeCtx) {
-
+ private static boolean isSupportedRefineTarget(final StmtContext<?, ?, ?> refineSubstatementCtx,
+ final StmtContext<?, ?, ?> refineTargetNodeCtx) {
final Collection<?> supportedRefineTargets = YangValidationBundles.SUPPORTED_REFINE_TARGETS
.get(refineSubstatementCtx.getPublicDefinition());
}
- private static QNameModule getNewQNameModule(final StatementContextBase<?, ?, ?> targetCtx,
+ private static QNameModule getNewQNameModule(final StmtContext<?, ?, ?> targetCtx,
final StmtContext<?, ?, ?> stmtContext) {
if (targetCtx.isRootContext()) {
return targetCtx.getFromNamespace(ModuleCtxToModuleQName.class, targetCtx);