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=37177c29d783efc7188a14b15c8e6e81b5de84cf;hpb=fe9a911aaad06d217575473e1da84f8815bc6d8f;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 37177c29d7..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 @@ -23,10 +23,11 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement; import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement; 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; @@ -90,34 +91,45 @@ public class SubmoduleStatementImpl extends AbstractRootStatement> stmt) { + stmt.setRootIdentifier(getSubmoduleIdentifier(stmt)); + } + @Override public void onLinkageDeclared( final Mutable> stmt) { - final Date maybeDate = Utils.getLatestRevision(stmt.declaredSubstatements()); - final Optional revisionDate = maybeDate != null ? Optional.of(maybeDate) : DEFAULT_REVISION; + final ModuleIdentifier submoduleIdentifier = getSubmoduleIdentifier(stmt); - final ModuleIdentifier submoduleIdentifier = ModuleIdentifierImpl.create(stmt.getStatementArgument(), - Optional.empty(), 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); - final String belongsToModuleName = firstAttributeOf( - stmt.declaredSubstatements(), BelongsToStatement.class); - final 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()); final String prefix = (String) prefixSubStmtCtx.getStatementArgument(); stmt.addToNs(BelongsToPrefixToModuleName.class, prefix, belongsToModuleName); } - @Override - public void onFullDefinitionDeclared(final Mutable> stmt) { - super.onFullDefinitionDeclared(stmt); - getSubstatementValidator().validate(stmt); + 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