BUG-4688: Fix BelongsToPrefixToModuleIdentifier namespace 48/64548/5
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 19 Oct 2017 20:39:43 +0000 (22:39 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 20 Oct 2017 10:00:25 +0000 (12:00 +0200)
This namespace is used as a lookup indirection in the lookup of
QNameModule corresponding to a prefix:

String -> BelongsToPrefixToModuleIdentifier ->
    ModuleIdentifierToModuleQName -> QNameModule

Whereas we get the target module's StmtContext from the reactor,
and hence can go through ModuleCtxToModuleQName namespace instead:

String -> BelongsToPrefixToModuleCtx ->
    ModuleCtxToModuleQName -> QNameModule

This has the benefit of not needing any wildcard searches and
us getting precisely the QNameModule of the module which satisfied
our reactor requirement. It also removes the only source of
SimpleDateFormatUtil.DEFAULT_BELONGS_TO_DATE and hence that magic
value is removed, too.

Change-Id: I1d74bed41952ba7f15bfeb6af94193632b8fb8ab
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/SimpleDateFormatUtil.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/NamespaceStorageSupport.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SourceSpecificContext.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BelongsToStatementImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YangInferencePipeline.java
yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/BelongsToPrefixToModuleCtx.java [moved from yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/BelongsToPrefixToModuleIdentifier.java with 71% similarity]

index 1edbaa08a017ebc093b712ce39f1e664ca090eb1..9be9390888926ad4085e8e141709dc3b6f7dc296 100644 (file)
@@ -34,18 +34,12 @@ public final class SimpleDateFormatUtil {
      */
     public static final Date DEFAULT_DATE_IMP;
 
-    /**
-     * {@link SimpleDateFormatUtil#DEFAULT_DATE} for belongs-to statement.
-     */
-    public static final Date DEFAULT_BELONGS_TO_DATE;
-
     static {
         final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(REVISION_SIMPLE_DATE);
 
         try {
             DEFAULT_DATE_REV = simpleDateFormat.parse(DEFAULT_DATE);
             DEFAULT_DATE_IMP = simpleDateFormat.parse(DEFAULT_DATE);
-            DEFAULT_BELONGS_TO_DATE = simpleDateFormat.parse(DEFAULT_DATE);
         } catch (final ParseException e) {
             throw new ExceptionInInitializerError(e);
         }
index 6ca662a455f97dc3bec88184bb76f6b322479bc3..0a97b80aadeef3910da87a90f33f41dcfa321808 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.yangtools.yang.parser.stmt.reactor;
 
 import com.google.common.collect.ImmutableMap;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -82,7 +81,7 @@ abstract class NamespaceStorageSupport implements NamespaceStorageNode {
     @SuppressWarnings("unchecked")
     @Override
     public <K, V, N extends IdentifierNamespace<K, V>> V getFromLocalStorage(final Class<N> type, final K key) {
-        final Map<K, V> localNamespace = (Map<K,V>) namespaces.get(type);
+        final Map<K, V> localNamespace = (Map<K, V>) namespaces.get(type);
 
         V potential = null;
         if (localNamespace != null) {
@@ -90,19 +89,15 @@ abstract class NamespaceStorageSupport implements NamespaceStorageNode {
         }
 
         if (potential == null && isModuleIdentifierWithoutSpecifiedRevision(key)) {
-            potential = getRegardlessOfRevision((ModuleIdentifier)key,(Map<ModuleIdentifier,V>)localNamespace);
+            potential = getRegardlessOfRevision((ModuleIdentifier)key, (Map<ModuleIdentifier,V>)localNamespace);
         }
 
         return potential;
     }
 
     private static boolean isModuleIdentifierWithoutSpecifiedRevision(final Object obj) {
-        if (!(obj instanceof ModuleIdentifier)) {
-            return false;
-        }
-
-        final Date rev = ((ModuleIdentifier) obj).getRevision();
-        return rev == SimpleDateFormatUtil.DEFAULT_DATE_IMP || rev == SimpleDateFormatUtil.DEFAULT_BELONGS_TO_DATE;
+        return obj instanceof ModuleIdentifier
+                && ((ModuleIdentifier) obj).getRevision() == SimpleDateFormatUtil.DEFAULT_DATE_IMP;
     }
 
     private static <K, V, N extends IdentifierNamespace<K, V>> V getRegardlessOfRevision(final ModuleIdentifier key,
index ee0cbd5db1dc4a75130a1492ffede7567dfcaa80..197753978774ac9555ea3f93bb5159f29f510950 100644 (file)
@@ -42,12 +42,14 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Storag
 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementDefinitionNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupportBundle;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
 import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToModuleContext;
-import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToPrefixToModuleIdentifier;
+import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToPrefixToModuleCtx;
 import org.opendaylight.yangtools.yang.parser.spi.source.ImpPrefixToModuleIdentifier;
 import org.opendaylight.yangtools.yang.parser.spi.source.ImpPrefixToNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.source.ImportedModuleContext;
+import org.opendaylight.yangtools.yang.parser.spi.source.ModuleCtxToModuleQName;
 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleIdentifierToModuleQName;
 import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule;
 import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModuleMap;
@@ -395,16 +397,19 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh
     }
 
     private PrefixToModule prefixes() {
-        final Map<String, ModuleIdentifier> allPrefixes = getRoot().getAllFromNamespace(
+        final Map<String, ModuleIdentifier> allImports = getRoot().getAllFromNamespace(
             ImpPrefixToModuleIdentifier.class);
-        final Map<String, ModuleIdentifier> belongsToPrefixes = getRoot().getAllFromNamespace(
-            BelongsToPrefixToModuleIdentifier.class);
-        if (belongsToPrefixes != null) {
-            allPrefixes.putAll(belongsToPrefixes);
+        if (allImports != null) {
+            allImports.forEach((key, value) ->
+            prefixToModuleMap.put(key, getRoot().getFromNamespace(ModuleIdentifierToModuleQName.class, value)));
         }
 
-        allPrefixes.forEach((key, value) ->
-            prefixToModuleMap.put(key, getRoot().getFromNamespace(ModuleIdentifierToModuleQName.class, value)));
+        final Map<String, StmtContext<?, ?, ?>> allBelongsTo = getRoot().getAllFromNamespace(
+            BelongsToPrefixToModuleCtx.class);
+        if (allBelongsTo != null) {
+            allBelongsTo.forEach((key, value) ->
+            prefixToModuleMap.put(key, getRoot().getFromNamespace(ModuleCtxToModuleQName.class, value)));
+        }
 
         return prefixToModuleMap;
     }
index bba1fd029cb746e58b492736178fe70ac1a79830..30c1cc1bbbc5197d8c3449309b9788243954bb1c 100644 (file)
@@ -7,18 +7,16 @@
  */
 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
 
+import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.findFirstDeclaredSubstatement;
+
 import java.util.Collection;
-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.repo.api.RevisionSourceIdentifier;
 import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.util.ModuleIdentifierImpl;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
@@ -29,10 +27,9 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Prereq
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
 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.BelongsToModuleContext;
-import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToPrefixToModuleIdentifier;
+import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToPrefixToModuleCtx;
 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNamespaceForBelongsTo;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.BelongsToEffectiveStatementImpl;
 
@@ -82,11 +79,8 @@ public class BelongsToStatementImpl extends AbstractDeclaredStatement<String>
             ModelActionBuilder belongsToAction = belongsToCtx.newInferenceAction(ModelProcessingPhase.SOURCE_LINKAGE);
 
             final SourceIdentifier belongsToSourceIdentifier = getSourceIdentifier(belongsToCtx);
-            final ModuleIdentifier belongsToModuleIdentifier = ModuleIdentifierImpl.create(
-                belongsToCtx.getStatementArgument(), Optional.empty(),
-                Optional.of(SimpleDateFormatUtil.DEFAULT_BELONGS_TO_DATE));
             final Prerequisite<StmtContext<?, ?, ?>> belongsToPrereq = belongsToAction.requiresCtx(belongsToCtx,
-                ModuleNamespaceForBelongsTo.class, belongsToModuleIdentifier.getName(),
+                ModuleNamespaceForBelongsTo.class, belongsToCtx.getStatementArgument(),
                 ModelProcessingPhase.SOURCE_LINKAGE);
 
             belongsToAction.apply(new InferenceAction() {
@@ -95,9 +89,9 @@ public class BelongsToStatementImpl extends AbstractDeclaredStatement<String>
                     StmtContext<?, ?, ?> belongsToModuleCtx = belongsToPrereq.resolve(ctx);
 
                     belongsToCtx.addToNs(BelongsToModuleContext.class, belongsToSourceIdentifier, belongsToModuleCtx);
-                    belongsToCtx.addToNs(BelongsToPrefixToModuleIdentifier.class,
-                        StmtContextUtils.findFirstDeclaredSubstatement(belongsToCtx, PrefixStatement.class)
-                        .getStatementArgument(), belongsToModuleIdentifier);
+                    belongsToCtx.addToNs(BelongsToPrefixToModuleCtx.class,
+                        findFirstDeclaredSubstatement(belongsToCtx, PrefixStatement.class).getStatementArgument(),
+                        belongsToModuleCtx);
                 }
 
                 @Override
index 4f7275310f9bea05a2aa9588a51405b11123dba2..ab3ee19a9cda74ba42f4be143dba8cd341a2bf3b 100644 (file)
@@ -38,7 +38,7 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupportBundle;
 import org.opendaylight.yangtools.yang.parser.spi.source.AnyxmlSchemaLocationNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.source.AugmentToChoiceNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToModuleContext;
-import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToPrefixToModuleIdentifier;
+import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToPrefixToModuleCtx;
 import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToPrefixToModuleName;
 import org.opendaylight.yangtools.yang.parser.spi.source.ImpPrefixToModuleIdentifier;
 import org.opendaylight.yangtools.yang.parser.spi.source.ImpPrefixToNamespace;
@@ -139,7 +139,7 @@ public final class YangInferencePipeline {
             .addSupport(sourceLocal(IncludedModuleContext.class))
             .addSupport(sourceLocal(IncludedSubmoduleNameToIdentifier.class))
             .addSupport(sourceLocal(ImpPrefixToModuleIdentifier.class))
-            .addSupport(sourceLocal(BelongsToPrefixToModuleIdentifier.class))
+            .addSupport(sourceLocal(BelongsToPrefixToModuleCtx.class))
             .addSupport(sourceLocal(URIStringToImpPrefix.class))
             .addSupport(sourceLocal(BelongsToModuleContext.class))
             .addSupport(sourceLocal(QNameToStatementDefinition.class))
@@ -7,14 +7,13 @@
  */
 package org.opendaylight.yangtools.yang.parser.spi.source;
 
-import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
-import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ImportedNamespaceContext;
 
 /**
  * Source-specific mapping of belongsTo prefixes to module identifiers. This mapping allows source-specific context
  * to correctly populate prefixes map for actual parsing phase and eventually, resolve QName for any valid declared
  * statement.
  */
-public interface BelongsToPrefixToModuleIdentifier extends IdentifierNamespace<String, ModuleIdentifier> {
+public interface BelongsToPrefixToModuleCtx extends ImportedNamespaceContext<String> {
 
 }