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%2FSubmoduleStatementImpl.java;h=53b71315658e845a2879c4235c10338fcd99c268;hb=b212baa59f859732bd3a799425bb420035fe6154;hp=9a3b1346158d3d983b751c23756072bfd3eb9205;hpb=30c67c4d780e897d972d60bb79d546b512516f90;p=yangtools.git diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/SubmoduleStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/SubmoduleStatementImpl.java index 9a3b134615..53b7131565 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/SubmoduleStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/SubmoduleStatementImpl.java @@ -9,93 +9,130 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.findFirstDeclaredSubstatement; import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.firstAttributeOf; -import java.net.URI; -import java.util.Date; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.yangtools.yang.common.Revision; import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier; -import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; +import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToStatement; import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.RevisionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement; import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement; -import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleIdentifierImpl; +import org.opendaylight.yangtools.yang.model.util.ModuleIdentifierImpl; import org.opendaylight.yangtools.yang.parser.spi.SubmoduleNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; 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.meta.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToPrefixToModuleName; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.SubmoduleEffectiveStatementImpl; -import com.google.common.base.Optional; - -public class SubmoduleStatementImpl extends - AbstractRootStatement implements SubmoduleStatement { - protected SubmoduleStatementImpl( - StmtContext context) { +public class SubmoduleStatementImpl extends AbstractRootStatement implements SubmoduleStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping + .SUBMODULE) + .addAny(YangStmtMapping.ANYXML) + .addAny(YangStmtMapping.AUGMENT) + .addMandatory(YangStmtMapping.BELONGS_TO) + .addAny(YangStmtMapping.CHOICE) + .addOptional(YangStmtMapping.CONTACT) + .addAny(YangStmtMapping.CONTAINER) + .addOptional(YangStmtMapping.DESCRIPTION) + .addAny(YangStmtMapping.DEVIATION) + .addAny(YangStmtMapping.EXTENSION) + .addAny(YangStmtMapping.FEATURE) + .addAny(YangStmtMapping.GROUPING) + .addAny(YangStmtMapping.IDENTITY) + .addAny(YangStmtMapping.IMPORT) + .addAny(YangStmtMapping.INCLUDE) + .addAny(YangStmtMapping.LEAF) + .addAny(YangStmtMapping.LEAF_LIST) + .addAny(YangStmtMapping.LIST) + .addAny(YangStmtMapping.NOTIFICATION) + .addOptional(YangStmtMapping.ORGANIZATION) + .addOptional(YangStmtMapping.REFERENCE) + .addAny(YangStmtMapping.REVISION) + .addAny(YangStmtMapping.RPC) + .addAny(YangStmtMapping.TYPEDEF) + .addAny(YangStmtMapping.USES) + .addOptional(YangStmtMapping.YANG_VERSION) + .build(); + + protected SubmoduleStatementImpl(final StmtContext context) { super(context); } - public static class Definition - extends - AbstractStatementSupport> { + public static class Definition extends AbstractStatementSupport> { public Definition() { - super(Rfc6020Mapping.SUBMODULE); + super(YangStmtMapping.SUBMODULE); } @Override - public String parseArgumentValue(StmtContext ctx, String value) { + public String parseArgumentValue(final StmtContext ctx, final String value) { return value; } @Override public SubmoduleStatement createDeclared( - StmtContext ctx) { + final StmtContext ctx) { return new SubmoduleStatementImpl(ctx); } @Override public EffectiveStatement createEffective( - StmtContext> ctx) { + final StmtContext> ctx) { return new SubmoduleEffectiveStatementImpl(ctx); } @Override - public void onLinkageDeclared( - Mutable> stmt) - throws SourceException { - - Optional revisionDate = Optional - .fromNullable(firstAttributeOf( - stmt.declaredSubstatements(), - RevisionStatement.class)); + public void onPreLinkageDeclared( + final Mutable> stmt) { + stmt.setRootIdentifier(getSubmoduleIdentifier(stmt)); + } - ModuleIdentifier submoduleIdentifier = new ModuleIdentifierImpl( - stmt.getStatementArgument(), Optional. absent(), - revisionDate); + @Override + public void onLinkageDeclared( + final Mutable> stmt) { + final ModuleIdentifier submoduleIdentifier = getSubmoduleIdentifier(stmt); + + final StmtContext> + possibleDuplicateSubmodule = stmt.getFromNamespace(SubmoduleNamespace.class, submoduleIdentifier); + if (possibleDuplicateSubmodule != null && possibleDuplicateSubmodule != stmt) { + throw new SourceException(stmt.getStatementSourceReference(), "Submodule name collision: %s. At %s", + stmt.getStatementArgument(), possibleDuplicateSubmodule.getStatementSourceReference()); + } stmt.addContext(SubmoduleNamespace.class, submoduleIdentifier, stmt); - String belongsToModuleName = firstAttributeOf( - stmt.declaredSubstatements(), BelongsToStatement.class); - StmtContext prefixSubStmtCtx = findFirstDeclaredSubstatement( - stmt, 0, BelongsToStatement.class, PrefixStatement.class); + final String belongsToModuleName = firstAttributeOf(stmt.declaredSubstatements(), BelongsToStatement.class); + final StmtContext prefixSubStmtCtx = findFirstDeclaredSubstatement(stmt, 0, + BelongsToStatement.class, PrefixStatement.class); + SourceException.throwIfNull(prefixSubStmtCtx, stmt.getStatementSourceReference(), + "Prefix of belongsTo statement is missing in submodule [%s]", stmt.getStatementArgument()); - if (prefixSubStmtCtx == null) { - throw new IllegalArgumentException( - "Prefix of belongsTo statement is missing in submodule [" - + stmt.getStatementArgument() + "]."); - } + final String prefix = (String) prefixSubStmtCtx.getStatementArgument(); - String prefix = (String) prefixSubStmtCtx.getStatementArgument(); + stmt.addToNs(BelongsToPrefixToModuleName.class, prefix, belongsToModuleName); + } - stmt.addToNs(BelongsToPrefixToModuleName.class, prefix, - belongsToModuleName); + private static ModuleIdentifier getSubmoduleIdentifier( + final Mutable> stmt) { + final Optional maybeDate = StmtContextUtils.getLatestRevision(stmt.declaredSubstatements()); + return ModuleIdentifierImpl.create(stmt.getStatementArgument(), maybeDate); + } + + @Override + protected SubstatementValidator getSubstatementValidator() { + return SUBSTATEMENT_VALIDATOR; } } + @Nonnull @Override public String getName() { return rawArgument(); @@ -106,9 +143,9 @@ public class SubmoduleStatementImpl extends return firstDeclared(YangVersionStatement.class); } + @Nonnull @Override public BelongsToStatement getBelongsTo() { return firstDeclared(BelongsToStatement.class); } - }