*/
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 javax.annotation.Nonnull;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.common.YangVersion;
import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
if (!StmtContextUtils.areFeaturesSupported(usesNode)) {
return;
}
-
- SUBSTATEMENT_VALIDATOR.validate(usesNode);
+ super.onFullDefinitionDeclared(usesNode);
if (StmtContextUtils.isInExtensionBody(usesNode)) {
return;
}
- ModelActionBuilder usesAction = usesNode.newInferenceAction(ModelProcessingPhase.EFFECTIVE_MODEL);
+ final ModelActionBuilder usesAction = usesNode.newInferenceAction(ModelProcessingPhase.EFFECTIVE_MODEL);
final QName groupingName = usesNode.getStatementArgument();
final Prerequisite<StmtContext<?, ?, ?>> sourceGroupingPre = usesAction.requiresCtx(usesNode,
@Override
public void apply() {
- StatementContextBase<?, ?, ?> targetNodeStmtCtx = (StatementContextBase<?, ?, ?>) targetNodePre.get();
- StatementContextBase<?, ?, ?> sourceGrpStmtCtx = (StatementContextBase<?, ?, ?>) sourceGroupingPre.get();
+ final StatementContextBase<?, ?, ?> targetNodeStmtCtx = (StatementContextBase<?, ?, ?>) targetNodePre.get();
+ final StatementContextBase<?, ?, ?> sourceGrpStmtCtx = (StatementContextBase<?, ?, ?>) sourceGroupingPre.get();
try {
copyFromSourceToTarget(sourceGrpStmtCtx, targetNodeStmtCtx, usesNode);
resolveUsesNode(usesNode, targetNodeStmtCtx);
- } catch (SourceException e) {
+ StmtContextUtils.validateIfFeatureAndWhenOnListKeys(usesNode);
+ } catch (final SourceException e) {
LOG.warn(e.getMessage(), e);
throw e;
}
return new UsesEffectiveStatementImpl(ctx);
}
+ @Override
+ protected SubstatementValidator getSubstatementValidator() {
+ return SUBSTATEMENT_VALIDATOR;
+ }
+
}
@Nonnull
final Mutable<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> usesNode,
final StatementContextBase<?, ?, ?> targetNodeStmtCtx) {
for (final StatementContextBase<?, ?, ?> subStmtCtx : usesNode.declaredSubstatements()) {
- if (StmtContextUtils.producesDeclared(subStmtCtx, RefineStatement.class)) {
+ if (StmtContextUtils.producesDeclared(subStmtCtx, RefineStatement.class)
+ && areFeaturesSupported(subStmtCtx)) {
performRefine(subStmtCtx, targetNodeStmtCtx);
}
}
}
+ private static boolean areFeaturesSupported(final StatementContextBase<?, ?, ?> subStmtCtx) {
+ /*
+ * In case of Yang 1.1, checks whether features are supported.
+ */
+ return !YangVersion.VERSION_1_1.equals(subStmtCtx.getRootVersion()) || StmtContextUtils
+ .areFeaturesSupported(subStmtCtx);
+ }
+
private static void performRefine(final StatementContextBase<?, ?, ?> refineCtx,
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());
+ InferenceException.throwIf(!(refineArgument instanceof SchemaNodeIdentifier),
+ refineCtx.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, refineCtx.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: {}",
return targetCtx.getFromNamespace(ModuleCtxToModuleQName.class, targetCtx);
}
if (targetCtx.getPublicDefinition() == YangStmtMapping.AUGMENT) {
- return targetCtx.getFromNamespace(ModuleCtxToModuleQName.class, targetCtx.getRoot());
+ return Utils.getRootModuleQName(targetCtx);
}
final Object targetStmtArgument = targetCtx.getStatementArgument();