Bug 7051 - moving of SubstatementValidator into spi.meta package
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / SubmoduleStatementImpl.java
index fabaed56dfc856d898de26c8424c45443eff1735..f887a8ae29308d276a44afac03092228a40cd4b7 100644 (file)
@@ -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;
@@ -100,6 +101,14 @@ public class SubmoduleStatementImpl extends AbstractRootStatement<SubmoduleState
         public void onLinkageDeclared(
                 final Mutable<String, SubmoduleStatement, EffectiveStatement<String, SubmoduleStatement>> stmt) {
             final ModuleIdentifier submoduleIdentifier = getSubmoduleIdentifier(stmt);
+
+            final StmtContext<?, SubmoduleStatement, EffectiveStatement<String, SubmoduleStatement>> 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);
@@ -113,9 +122,9 @@ public class SubmoduleStatementImpl extends AbstractRootStatement<SubmoduleState
             stmt.addToNs(BelongsToPrefixToModuleName.class, prefix, belongsToModuleName);
         }
 
-        private ModuleIdentifier getSubmoduleIdentifier(
+        private static ModuleIdentifier getSubmoduleIdentifier(
                 final Mutable<String, SubmoduleStatement, EffectiveStatement<String, SubmoduleStatement>> stmt) {
-            final Date maybeDate = Utils.getLatestRevision(stmt.declaredSubstatements());
+            final Date maybeDate = StmtContextUtils.getLatestRevision(stmt.declaredSubstatements());
             final Optional<Date> revisionDate = maybeDate != null ? Optional.of(maybeDate) : DEFAULT_REVISION;
 
             final ModuleIdentifier submoduleIdentifier = ModuleIdentifierImpl.create(stmt.getStatementArgument(),