*/
package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
-import static org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase.FULL_DECLARATION;
-
+import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX;
import java.util.Collection;
-
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping;
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement;
import org.opendaylight.yangtools.yang.parser.spi.GroupingNamespace;
+import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator;
import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
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.Prerequisite;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase;
import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.UsesEffectiveStatementImpl;
public class UsesStatementImpl extends AbstractDeclaredStatement<QName> implements UsesStatement {
+ private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping
+ .USES)
+ .add(Rfc6020Mapping.AUGMENT, 0, MAX)
+ .add(Rfc6020Mapping.DESCRIPTION, 0, 1)
+ .add(Rfc6020Mapping.IF_FEATURE, 0, MAX)
+ .add(Rfc6020Mapping.REFINE, 0, MAX)
+ .add(Rfc6020Mapping.REFERENCE, 0, 1)
+ .add(Rfc6020Mapping.STATUS, 0, 1)
+ .add(Rfc6020Mapping.WHEN, 0, 1)
+ .build();
private static final Logger LOG = LoggerFactory.getLogger(UsesStatementImpl.class);
- protected UsesStatementImpl(StmtContext<QName, UsesStatement, ?> context) {
+ protected UsesStatementImpl(final StmtContext<QName, UsesStatement, ?> context) {
super(context);
}
}
@Override
- public QName parseArgumentValue(StmtContext<?, ?, ?> ctx, String value) {
+ public QName parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
return Utils.qNameFromArgument(ctx, value);
}
@Override
public void onFullDefinitionDeclared(
- final StmtContext.Mutable<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> usesNode)
- throws SourceException {
+ final StmtContext.Mutable<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> usesNode) {
+ if (!StmtContextUtils.areFeaturesSupported(usesNode)) {
+ return;
+ }
+
+ SUBSTATEMENT_VALIDATOR.validate(usesNode);
- ModelActionBuilder usesAction = usesNode.newInferenceAction(FULL_DECLARATION);
+ if (StmtContextUtils.isInExtensionBody(usesNode)) {
+ return;
+ }
+
+ ModelActionBuilder usesAction = usesNode.newInferenceAction(ModelProcessingPhase.EFFECTIVE_MODEL);
final QName groupingName = usesNode.getStatementArgument();
final Prerequisite<StmtContext<?, ?, ?>> sourceGroupingPre = usesAction.requiresCtx(usesNode,
- GroupingNamespace.class, groupingName, FULL_DECLARATION);
- final Prerequisite<? extends StmtContext.Mutable<?, ?, ?>> targetNodePre = usesAction.mutatesCtx(
- usesNode.getParentContext(), FULL_DECLARATION);
+ GroupingNamespace.class, groupingName, ModelProcessingPhase.EFFECTIVE_MODEL);
+ final Prerequisite<? extends StmtContext.Mutable<?, ?, ?>> targetNodePre = usesAction.mutatesEffectiveCtx(
+ usesNode.getParentContext());
usesAction.apply(new InferenceAction() {
@Override
- public void apply() throws InferenceException {
+ public void apply() {
StatementContextBase<?, ?, ?> targetNodeStmtCtx = (StatementContextBase<?, ?, ?>) targetNodePre.get();
StatementContextBase<?, ?, ?> sourceGrpStmtCtx = (StatementContextBase<?, ?, ?>) sourceGroupingPre.get();
try {
- GroupingUtils.copyFromSourceToTarget(sourceGrpStmtCtx, targetNodeStmtCtx);
+ GroupingUtils.copyFromSourceToTarget(sourceGrpStmtCtx, targetNodeStmtCtx, usesNode);
GroupingUtils.resolveUsesNode(usesNode, targetNodeStmtCtx);
} catch (SourceException e) {
LOG.warn(e.getMessage(), e);
+ throw e;
}
}
@Override
- public void prerequisiteFailed(Collection<? extends Prerequisite<?>> failed) throws InferenceException {
- if (failed.contains(sourceGroupingPre)) {
- throw new InferenceException("Grouping " + groupingName + " was not resolved.", usesNode
- .getStatementSourceReference());
- }
+ public void prerequisiteFailed(final Collection<? extends Prerequisite<?>> failed) {
+ InferenceException.throwIf(failed.contains(sourceGroupingPre),
+ usesNode.getStatementSourceReference(), "Grouping '%s' was not resolved.", groupingName);
throw new InferenceException("Unknown error occurred.", usesNode.getStatementSourceReference());
}
});
}
@Override
- public UsesStatement createDeclared(StmtContext<QName, UsesStatement, ?> ctx) {
+ public UsesStatement createDeclared(final StmtContext<QName, UsesStatement, ?> ctx) {
return new UsesStatementImpl(ctx);
}
@Override
public EffectiveStatement<QName, UsesStatement> createEffective(
- StmtContext<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> ctx) {
+ final StmtContext<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> ctx) {
return new UsesEffectiveStatementImpl(ctx);
}