BUG-4688: switch revisions from Date to Revision
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / SubmoduleStatementImpl.java
index bb84a520dd22652bcc6a4a76af462f25faf3c9db..53b71315658e845a2879c4235c10338fcd99c268 100644 (file)
@@ -10,10 +10,9 @@ 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.common.Revision;
 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;
@@ -23,10 +22,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;
@@ -60,7 +60,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);
@@ -90,29 +89,43 @@ public class SubmoduleStatementImpl extends AbstractRootStatement<SubmoduleState
             return new SubmoduleEffectiveStatementImpl(ctx);
         }
 
+        @Override
+        public void onPreLinkageDeclared(
+                final Mutable<String, SubmoduleStatement, EffectiveStatement<String, SubmoduleStatement>> stmt) {
+            stmt.setRootIdentifier(getSubmoduleIdentifier(stmt));
+        }
+
         @Override
         public void onLinkageDeclared(
                 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 = getSubmoduleIdentifier(stmt);
 
-            final ModuleIdentifier submoduleIdentifier = ModuleIdentifierImpl.create(stmt.getStatementArgument(),
-                Optional.empty(), revisionDate);
+            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);
-            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);
         }
 
+        private static ModuleIdentifier getSubmoduleIdentifier(
+                final Mutable<String, SubmoduleStatement, EffectiveStatement<String, SubmoduleStatement>> stmt) {
+            final Optional<Revision> maybeDate = StmtContextUtils.getLatestRevision(stmt.declaredSubstatements());
+            return ModuleIdentifierImpl.create(stmt.getStatementArgument(), maybeDate);
+        }
+
         @Override
         protected SubstatementValidator getSubstatementValidator() {
             return SUBSTATEMENT_VALIDATOR;
@@ -135,5 +148,4 @@ public class SubmoduleStatementImpl extends AbstractRootStatement<SubmoduleState
     public BelongsToStatement getBelongsTo() {
         return firstDeclared(BelongsToStatement.class);
     }
-
 }