X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fstmt%2Frfc6020%2FBaseStatementImpl.java;h=9fdf95ae95c8a27d336a06bf2afafa5cb9557744;hb=04fa25a4fe8957f6492618aa9a1e9a4f9af39df4;hp=5460fd238f66e6fb42674069392f8d24e0527d23;hpb=be1171fbcc4469bd090366052f96a2ae08ffac25;p=yangtools.git diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BaseStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BaseStatementImpl.java index 5460fd238f..9fdf95ae95 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BaseStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BaseStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,53 +7,106 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.BaseEffectiveStatementImpl; - +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; 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.BaseStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement; +import org.opendaylight.yangtools.yang.parser.spi.IdentityNamespace; +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.DerivedIdentitiesNamespace; +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.StmtContext.Mutable; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.BaseEffectiveStatementImpl; -public class BaseStatementImpl extends AbstractDeclaredStatement - implements BaseStatement { +public class BaseStatementImpl extends AbstractDeclaredStatement implements BaseStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = + SubstatementValidator.builder(Rfc6020Mapping.BASE).build(); - protected BaseStatementImpl(StmtContext context) { + protected BaseStatementImpl(final StmtContext context) { super(context); } public static class Definition - extends - AbstractStatementSupport> { + extends AbstractStatementSupport> { public Definition() { super(Rfc6020Mapping.BASE); } @Override - public QName parseArgumentValue(StmtContext ctx, String value) { + public QName parseArgumentValue(final StmtContext ctx, final String value) { return Utils.qNameFromArgument(ctx, value); } @Override - public BaseStatement createDeclared( - StmtContext ctx) { + public BaseStatement createDeclared(final StmtContext ctx) { return new BaseStatementImpl(ctx); } @Override public EffectiveStatement createEffective( - StmtContext> ctx) { + final StmtContext> ctx) { return new BaseEffectiveStatementImpl(ctx); } + @Override + public void onStatementDefinitionDeclared( + final Mutable> baseStmtCtx) { + final Mutable baseParentCtx = baseStmtCtx.getParentContext(); + if (StmtContextUtils.producesDeclared(baseParentCtx, IdentityStatement.class)) { + + final QName baseIdentityQName = baseStmtCtx.getStatementArgument(); + final ModelActionBuilder baseIdentityAction = baseStmtCtx.newInferenceAction( + ModelProcessingPhase.STATEMENT_DEFINITION); + final Prerequisite> requiresPrereq = baseIdentityAction.requiresCtx(baseStmtCtx, + IdentityNamespace.class, baseIdentityQName, ModelProcessingPhase.STATEMENT_DEFINITION); + final Prerequisite> mutatesPrereq = baseIdentityAction.mutatesCtx( + baseParentCtx, ModelProcessingPhase.STATEMENT_DEFINITION); + + baseIdentityAction.apply(new InferenceAction() { + @Override + public void apply() { + List> derivedIdentities = + baseStmtCtx.getFromNamespace(DerivedIdentitiesNamespace.class, baseStmtCtx.getStatementArgument()); + if (derivedIdentities == null) { + derivedIdentities = new ArrayList<>(); + baseStmtCtx.addToNs(DerivedIdentitiesNamespace.class, baseIdentityQName, derivedIdentities); + } + derivedIdentities.add(baseParentCtx); + } + + @Override + public void prerequisiteFailed(final Collection> failed) { + throw new InferenceException(baseStmtCtx.getStatementSourceReference(), + "Unable to resolve identity %s and base identity %s", + baseParentCtx.getStatementArgument(), baseStmtCtx.getStatementArgument()); + } + }); + } + } + + @Override + public void onFullDefinitionDeclared( + final Mutable> stmt) { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override public QName getName() { return argument(); } - }