X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-rfc7950%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Frfc7950%2Fstmt%2Ftype%2FAbstractIdentityRefSpecificationSupport.java;h=edf67dca168a905941b40abe1613e83b99e3125a;hb=d605800fa3da3ea340497c683bd83ea37c12da6c;hp=e999729e319dd9e24000135434bce45777ac28f9;hpb=a993ec185764e9f07b7f1c6751bad8f63f6eecc7;p=yangtools.git diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractIdentityRefSpecificationSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractIdentityRefSpecificationSupport.java index e999729e31..edf67dca16 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractIdentityRefSpecificationSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractIdentityRefSpecificationSupport.java @@ -7,56 +7,93 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; +import static com.google.common.base.Verify.verify; +import static com.google.common.base.Verify.verifyNotNull; + +import com.google.common.collect.ImmutableList; import java.util.Collection; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; +import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; +import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.BaseEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.BaseStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.IdentityEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.IdentityRefSpecification; +import org.opendaylight.yangtools.yang.model.parser.api.YangParserConfiguration; +import org.opendaylight.yangtools.yang.model.ri.type.BaseTypes; +import org.opendaylight.yangtools.yang.model.ri.type.IdentityrefTypeBuilder; import org.opendaylight.yangtools.yang.parser.spi.IdentityNamespace; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; +import org.opendaylight.yangtools.yang.parser.spi.meta.CommonStmtCtx; +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.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.spi.source.SourceException; abstract class AbstractIdentityRefSpecificationSupport - extends AbstractStatementSupport> { - AbstractIdentityRefSpecificationSupport() { - super(YangStmtMapping.TYPE); + extends AbstractTypeSupport { + AbstractIdentityRefSpecificationSupport(final YangParserConfiguration config) { + super(config); } @Override - public final String parseArgumentValue(final StmtContext ctx, final String value) { - return value; - } + public final void onFullDefinitionDeclared(final Mutable> stmt) { + super.onFullDefinitionDeclared(stmt); - @Override - public final IdentityRefSpecification createDeclared(final StmtContext ctx) { - return new IdentityRefSpecificationImpl(ctx); + final Collection> baseStatements = + StmtContextUtils.findAllDeclaredSubstatements(stmt, BaseStatement.class); + for (StmtContext baseStmt : baseStatements) { + final QName baseIdentity = baseStmt.getArgument(); + final StmtContext stmtCtx = stmt.getFromNamespace(IdentityNamespace.class, baseIdentity); + InferenceException.throwIfNull(stmtCtx, stmt, + "Referenced base identity '%s' doesn't exist in given scope (module, imported modules, submodules)", + baseIdentity.getLocalName()); + } } @Override - public final EffectiveStatement createEffective( - final StmtContext> ctx) { - return new IdentityRefSpecificationEffectiveStatement(ctx); + protected final IdentityRefSpecification createDeclared(final StmtContext ctx, + final ImmutableList> substatements) { + if (substatements.isEmpty()) { + throw noBase(ctx); + } + return new IdentityRefSpecificationImpl(ctx.getRawArgument(), ctx.getArgument(), substatements); } @Override - public final void onFullDefinitionDeclared(final Mutable> stmt) { - super.onFullDefinitionDeclared(stmt); + protected final EffectiveStatement createEffective( + final Current stmt, + final ImmutableList> substatements) { + if (substatements.isEmpty()) { + throw noBase(stmt); + } - final Collection> baseStatements = - StmtContextUtils.findAllDeclaredSubstatements(stmt, BaseStatement.class); - for (StmtContext baseStmt : baseStatements) { - final QName baseIdentity = baseStmt.getStatementArgument(); - final StmtContext stmtCtx = stmt.getFromNamespace(IdentityNamespace.class, baseIdentity); - InferenceException.throwIfNull(stmtCtx, stmt.getStatementSourceReference(), - "Referenced base identity '%s' doesn't exist in given scope (module, imported modules, submodules)", - baseIdentity.getLocalName()); + final IdentityrefTypeBuilder builder = BaseTypes.identityrefTypeBuilder(stmt.argumentAsTypeQName()); + for (final EffectiveStatement subStmt : substatements) { + if (subStmt instanceof BaseEffectiveStatement) { + final QName identityQName = ((BaseEffectiveStatement) subStmt).argument(); + final IdentityEffectiveStatement baseIdentity = + verifyNotNull(stmt.getFromNamespace(IdentityNamespace.class, identityQName)).buildEffective(); + verify(baseIdentity instanceof IdentitySchemaNode, "Statement %s is not an IdentitySchemaNode", + baseIdentity); + builder.addIdentity((IdentitySchemaNode) baseIdentity); + } } + + return new TypeEffectiveStatementImpl<>(stmt.declared(), substatements, builder); + } + + private static SourceException noBase(final CommonStmtCtx stmt) { + /* + * https://tools.ietf.org/html/rfc7950#section-9.10.2 + * + * The "base" statement, which is a substatement to the "type" + * statement, MUST be present at least once if the type is + * "identityref". + */ + return new SourceException("At least one base statement has to be present", stmt); } } \ No newline at end of file