Eliminate ModuleIdentifier
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / SubmoduleStatementImpl.java
index fabaed56dfc856d898de26c8424c45443eff1735..0e1f1ae43a7f4eec91c048a1ef7a0fcb52e7eb7c 100644 (file)
@@ -10,23 +10,21 @@ 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.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.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.model.util.ModuleIdentifierImpl;
+import org.opendaylight.yangtools.yang.model.repo.api.RevisionSourceIdentifier;
+import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
 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;
@@ -60,7 +58,6 @@ public class SubmoduleStatementImpl extends AbstractRootStatement<SubmoduleState
             .addAny(YangStmtMapping.USES)
             .addOptional(YangStmtMapping.YANG_VERSION)
             .build();
-    private static final Optional<Date> DEFAULT_REVISION = Optional.of(SimpleDateFormatUtil.DEFAULT_DATE_REV);
 
     protected SubmoduleStatementImpl(final StmtContext<String, SubmoduleStatement, ?> context) {
         super(context);
@@ -93,13 +90,23 @@ public class SubmoduleStatementImpl extends AbstractRootStatement<SubmoduleState
         @Override
         public void onPreLinkageDeclared(
                 final Mutable<String, SubmoduleStatement, EffectiveStatement<String, SubmoduleStatement>> stmt) {
-            stmt.setRootIdentifier(getSubmoduleIdentifier(stmt));
+            stmt.setRootIdentifier(RevisionSourceIdentifier.create(stmt.getStatementArgument(),
+                StmtContextUtils.getLatestRevision(stmt.declaredSubstatements())));
         }
 
         @Override
         public void onLinkageDeclared(
                 final Mutable<String, SubmoduleStatement, EffectiveStatement<String, SubmoduleStatement>> stmt) {
-            final ModuleIdentifier submoduleIdentifier = getSubmoduleIdentifier(stmt);
+            final SourceIdentifier submoduleIdentifier = RevisionSourceIdentifier.create(stmt.getStatementArgument(),
+                StmtContextUtils.getLatestRevision(stmt.declaredSubstatements()));
+
+            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,16 +120,6 @@ public class SubmoduleStatementImpl extends AbstractRootStatement<SubmoduleState
             stmt.addToNs(BelongsToPrefixToModuleName.class, prefix, belongsToModuleName);
         }
 
-        private ModuleIdentifier getSubmoduleIdentifier(
-                final Mutable<String, SubmoduleStatement, EffectiveStatement<String, SubmoduleStatement>> stmt) {
-            final Date maybeDate = Utils.getLatestRevision(stmt.declaredSubstatements());
-            final Optional<Date> revisionDate = maybeDate != null ? Optional.of(maybeDate) : DEFAULT_REVISION;
-
-            final ModuleIdentifier submoduleIdentifier = ModuleIdentifierImpl.create(stmt.getStatementArgument(),
-                    Optional.empty(), revisionDate);
-            return submoduleIdentifier;
-        }
-
         @Override
         protected SubstatementValidator getSubstatementValidator() {
             return SUBSTATEMENT_VALIDATOR;
@@ -145,5 +142,4 @@ public class SubmoduleStatementImpl extends AbstractRootStatement<SubmoduleState
     public BelongsToStatement getBelongsTo() {
         return firstDeclared(BelongsToStatement.class);
     }
-
 }