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=f887a8ae29308d276a44afac03092228a40cd4b7;hb=81c8d73d4d85ef015a06145b2d4315fed8efb49d;hp=c009a7fe6c5c27cb022d5d08d074ec504c7a397e;hpb=aae3ec264b796274acca53ddb404f0bdecdace70;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 c009a7fe6c..f887a8ae29 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 @@ -10,54 +10,56 @@ 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 com.google.common.base.Optional; import java.util.Date; +import java.util.Optional; +import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil; 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.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.SubstatementValidator; 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; public class SubmoduleStatementImpl extends AbstractRootStatement implements SubmoduleStatement { - private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping .SUBMODULE) - .addAny(Rfc6020Mapping.ANYXML) - .addAny(Rfc6020Mapping.AUGMENT) - .addMandatory(Rfc6020Mapping.BELONGS_TO) - .addAny(Rfc6020Mapping.CHOICE) - .addOptional(Rfc6020Mapping.CONTACT) - .addAny(Rfc6020Mapping.CONTAINER) - .addOptional(Rfc6020Mapping.DESCRIPTION) - .addAny(Rfc6020Mapping.DEVIATION) - .addAny(Rfc6020Mapping.EXTENSION) - .addAny(Rfc6020Mapping.FEATURE) - .addAny(Rfc6020Mapping.GROUPING) - .addAny(Rfc6020Mapping.IDENTITY) - .addAny(Rfc6020Mapping.IMPORT) - .addAny(Rfc6020Mapping.INCLUDE) - .addAny(Rfc6020Mapping.LEAF) - .addAny(Rfc6020Mapping.LEAF_LIST) - .addAny(Rfc6020Mapping.LIST) - .addAny(Rfc6020Mapping.NOTIFICATION) - .addOptional(Rfc6020Mapping.ORGANIZATION) - .addOptional(Rfc6020Mapping.REFERENCE) - .addAny(Rfc6020Mapping.REVISION) - .addAny(Rfc6020Mapping.RPC) - .addAny(Rfc6020Mapping.TYPEDEF) - .addAny(Rfc6020Mapping.USES) - .addOptional(Rfc6020Mapping.YANG_VERSION) + .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(); private static final Optional DEFAULT_REVISION = Optional.of(SimpleDateFormatUtil.DEFAULT_DATE_REV); @@ -69,7 +71,7 @@ public class SubmoduleStatementImpl extends AbstractRootStatement> { public Definition() { - super(Rfc6020Mapping.SUBMODULE); + super(YangStmtMapping.SUBMODULE); } @Override @@ -90,37 +92,53 @@ public class SubmoduleStatementImpl extends AbstractRootStatement> stmt) { + stmt.setRootIdentifier(getSubmoduleIdentifier(stmt)); + } - final Optional revisionDate = Optional.fromNullable( - Utils.getLatestRevision(stmt.declaredSubstatements())).or(DEFAULT_REVISION); + @Override + public void onLinkageDeclared( + final Mutable> stmt) { + final ModuleIdentifier submoduleIdentifier = getSubmoduleIdentifier(stmt); - ModuleIdentifier submoduleIdentifier = new ModuleIdentifierImpl(stmt.getStatementArgument(), - Optional.absent(), revisionDate); + 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()); + "Prefix of belongsTo statement is missing in submodule [%s]", stmt.getStatementArgument()); - String prefix = (String) prefixSubStmtCtx.getStatementArgument(); + final String prefix = (String) prefixSubStmtCtx.getStatementArgument(); stmt.addToNs(BelongsToPrefixToModuleName.class, prefix, belongsToModuleName); } + private static ModuleIdentifier getSubmoduleIdentifier( + final Mutable> stmt) { + final Date maybeDate = StmtContextUtils.getLatestRevision(stmt.declaredSubstatements()); + final Optional revisionDate = maybeDate != null ? Optional.of(maybeDate) : DEFAULT_REVISION; + + final ModuleIdentifier submoduleIdentifier = ModuleIdentifierImpl.create(stmt.getStatementArgument(), + Optional.empty(), revisionDate); + return submoduleIdentifier; + } + @Override - public void onFullDefinitionDeclared(final Mutable> stmt) { - super.onFullDefinitionDeclared(stmt); - SUBSTATEMENT_VALIDATOR.validate(stmt); + protected SubstatementValidator getSubstatementValidator() { + return SUBSTATEMENT_VALIDATOR; } } + @Nonnull @Override public String getName() { return rawArgument(); @@ -131,6 +149,7 @@ public class SubmoduleStatementImpl extends AbstractRootStatement