BUG-4688: switch IncludeStatementImpl to use queries 27/64627/3
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 23 Oct 2017 22:02:15 +0000 (00:02 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 24 Oct 2017 10:55:55 +0000 (12:55 +0200)
Use IdentifierKeyCriterion instead of lookups based on magic constants,
eliminating last real user of SimpleDateFormatUtil.DEFAULT_DATE_IMP and
killing that magic number completely.

Change-Id: I72cb7babe6904155d10e6c2a36d6d8731e58c7e3
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/rfc6020/ImportStatementDefinition.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/IncludeStatementImpl.java
yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/NamespaceKeyCriterion.java

index 9be9390888926ad4085e8e141709dc3b6f7dc296..d98926d4464c59e9eff67b49305d127ea5f8131b 100644 (file)
@@ -29,17 +29,11 @@ public final class SimpleDateFormatUtil {
      */
     public static final Date DEFAULT_DATE_REV;
 
-    /**
-     * {@link SimpleDateFormatUtil#DEFAULT_DATE} for import statement.
-     */
-    public static final Date DEFAULT_DATE_IMP;
-
     static {
         final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(REVISION_SIMPLE_DATE);
 
         try {
             DEFAULT_DATE_REV = simpleDateFormat.parse(DEFAULT_DATE);
-            DEFAULT_DATE_IMP = simpleDateFormat.parse(DEFAULT_DATE);
         } catch (final ParseException e) {
             throw new ExceptionInInitializerError(e);
         }
index 889dcc67212c8aeac8991b28150035aa31941c39..c94e031d0d9c728cdcd49d66a80dfe96b2ea7df2 100644 (file)
@@ -12,10 +12,7 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
-import java.util.Set;
 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.meta.IdentifierNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.NamespaceStorageNode;
 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Registry;
@@ -89,40 +86,7 @@ abstract class NamespaceStorageSupport implements NamespaceStorageNode {
     @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);
-
-        V potential = null;
-        if (localNamespace != null) {
-            potential = localNamespace.get(key);
-        }
-
-        if (potential == null && isModuleIdentifierWithoutSpecifiedRevision(key)) {
-            potential = getRegardlessOfRevision((ModuleIdentifier)key, (Map<ModuleIdentifier,V>)localNamespace);
-        }
-
-        return potential;
-    }
-
-    private static boolean isModuleIdentifierWithoutSpecifiedRevision(final Object obj) {
-        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,
-            final Map<ModuleIdentifier, V> localNamespace) {
-
-        if (localNamespace == null) {
-            return null;
-        }
-
-        final Set<Entry<ModuleIdentifier, V>> entrySet = localNamespace.entrySet();
-        for (final Entry<ModuleIdentifier, V> entry : entrySet) {
-            final ModuleIdentifier moduleIdentifierInMap = entry.getKey();
-            if (moduleIdentifierInMap.getName().equals(key.getName())) {
-                return entry.getValue();
-            }
-        }
-
-        return null;
+        return localNamespace == null ? null : localNamespace.get(key);
     }
 
     @Override
index 872ad380c779c98ca6ebb164e1ea5591f9e7bfed..38157523d3936eeb0aafaf118c04d2309d5c3865 100644 (file)
@@ -13,7 +13,6 @@ import static org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPha
 import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.findFirstDeclaredSubstatement;
 import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.firstAttributeOf;
 
-import com.google.common.base.MoreObjects;
 import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.base.Verify;
 import java.net.URI;
@@ -142,31 +141,6 @@ public class ImportStatementDefinition extends
 
     private static class RevisionImport {
 
-        private static final class LastRevisionCriterion extends NamespaceKeyCriterion<ModuleIdentifier> {
-            private final String moduleName;
-
-            LastRevisionCriterion(final String moduleName) {
-                this.moduleName = requireNonNull(moduleName);
-            }
-
-            @Override
-            public boolean match(final ModuleIdentifier key) {
-                return moduleName.equals(key.getName());
-            }
-
-            @Override
-            public ModuleIdentifier select(final ModuleIdentifier first, final ModuleIdentifier second) {
-                final Date firstRev = Verify.verifyNotNull(first.getRevision());
-                final Date secondRev = Verify.verifyNotNull(second.getRevision());
-                return firstRev.compareTo(secondRev) >= 0 ? first : second;
-            }
-
-            @Override
-            public String toString() {
-                return MoreObjects.toStringHelper(this).add("moduleName", moduleName).toString();
-            }
-        }
-
         private RevisionImport() {
             throw new UnsupportedOperationException("Utility class");
         }
@@ -179,7 +153,7 @@ public class ImportStatementDefinition extends
             final Date revision = firstAttributeOf(stmt.declaredSubstatements(), RevisionDateStatement.class);
             if (revision == null) {
                 imported = importAction.requiresCtx(stmt, ModuleNamespace.class,
-                    new LastRevisionCriterion(moduleName), SOURCE_LINKAGE);
+                    NamespaceKeyCriterion.latestRevisionModule(moduleName), SOURCE_LINKAGE);
             } else {
                 imported = importAction.requiresCtx(stmt, ModuleNamespace.class,
                     ModuleIdentifierImpl.create(moduleName, Optional.empty(), Optional.of(revision)), SOURCE_LINKAGE);
@@ -234,10 +208,6 @@ public class ImportStatementDefinition extends
             }
 
             @Override
-            public String toString() {
-                return addToStringAttributes(MoreObjects.toStringHelper(this)).toString();
-            }
-
             protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
                 return toStringHelper.add("moduleName", moduleName);
             }
@@ -357,15 +327,8 @@ public class ImportStatementDefinition extends
 
         private static SemVerSourceIdentifier createSemVerModuleIdentifier(
                 final ModuleIdentifier importedModuleIdentifier, final SemVer semVer) {
-            final String formattedRevision;
-            if (importedModuleIdentifier.getRevision() == SimpleDateFormatUtil.DEFAULT_DATE_IMP) {
-                formattedRevision = null;
-            } else {
-                formattedRevision = SimpleDateFormatUtil.getRevisionFormat().format(
+            final String formattedRevision = SimpleDateFormatUtil.getRevisionFormat().format(
                     importedModuleIdentifier.getRevision());
-            }
-
-
             return SemVerSourceIdentifier.create(importedModuleIdentifier.getName(), formattedRevision, semVer);
         }
     }
index 5aa3e34ad0a0648f6cda0d6b083ea7537ff9bdd6..fc6777dfa1dadd3738a50ac8d0af56de1a0c0544 100644 (file)
@@ -14,7 +14,6 @@ import java.util.Collection;
 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.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
@@ -31,6 +30,7 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.InferenceAction;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.InferenceContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Prerequisite;
+import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceKeyCriterion;
 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.SubstatementValidator;
@@ -85,10 +85,15 @@ public class IncludeStatementImpl extends AbstractDeclaredStatement<String> impl
                 RevisionDateStatement.class);
 
             final ModelActionBuilder includeAction = stmt.newInferenceAction(SOURCE_LINKAGE);
-            final Prerequisite<StmtContext<?, ?, ?>> requiresCtxPrerequisite = includeAction.requiresCtx(stmt,
-                    SubmoduleNamespace.class,ModuleIdentifierImpl.create(submoduleName, Optional.empty(),
-                        Optional.of(revision == null ? SimpleDateFormatUtil.DEFAULT_DATE_IMP
-                                : revision.getStatementArgument())), SOURCE_LINKAGE);
+            final Prerequisite<StmtContext<?, ?, ?>> requiresCtxPrerequisite;
+            if (revision == null) {
+                requiresCtxPrerequisite = includeAction.requiresCtx(stmt, SubmoduleNamespace.class,
+                    NamespaceKeyCriterion.latestRevisionModule(submoduleName), SOURCE_LINKAGE);
+            } else {
+                requiresCtxPrerequisite = includeAction.requiresCtx(stmt, SubmoduleNamespace.class,
+                    ModuleIdentifierImpl.create(submoduleName, Optional.empty(),
+                        Optional.of(revision.getStatementArgument())), SOURCE_LINKAGE);
+            }
 
             includeAction.apply(new InferenceAction() {
                 @Override
index 72760959c246fcf0b6ec75e3e6237ec9dc3831a9..3ded08a8bc1a8e9799a1f86b648d2432e82f3234 100644 (file)
@@ -7,8 +7,15 @@
  */
 package org.opendaylight.yangtools.yang.parser.spi.meta;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.annotations.Beta;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import com.google.common.base.Verify;
+import java.util.Date;
 import javax.annotation.Nonnull;
+import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
 
 /**
  * Namespace key matching criterion.
@@ -19,6 +26,41 @@ import javax.annotation.Nonnull;
  */
 @Beta
 public abstract class NamespaceKeyCriterion<K> {
+    private static final class LatestRevisionModule extends NamespaceKeyCriterion<ModuleIdentifier> {
+        private final String moduleName;
+
+        LatestRevisionModule(final String moduleName) {
+            this.moduleName = requireNonNull(moduleName);
+        }
+
+        @Override
+        public boolean match(final ModuleIdentifier key) {
+            return moduleName.equals(key.getName());
+        }
+
+        @Override
+        public ModuleIdentifier select(final ModuleIdentifier first, final ModuleIdentifier second) {
+            final Date firstRev = Verify.verifyNotNull(first.getRevision());
+            final Date secondRev = Verify.verifyNotNull(second.getRevision());
+            return firstRev.compareTo(secondRev) >= 0 ? first : second;
+        }
+
+        @Override
+        protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
+            return toStringHelper.add("moduleName", moduleName);
+        }
+    }
+
+    /**
+     * Return a criterion which selects the latest known revision of a particular module.
+     *
+     * @param moduleName Module name
+     * @return A criterion object.
+     */
+    public static NamespaceKeyCriterion<ModuleIdentifier> latestRevisionModule(final String moduleName) {
+        return new LatestRevisionModule(moduleName);
+    }
+
     /**
      * Match a key against this criterion.
      *
@@ -37,7 +79,13 @@ public abstract class NamespaceKeyCriterion<K> {
     public abstract K select(@Nonnull K first, @Nonnull K second);
 
     @Override
-    public abstract String toString();
+    public final String toString() {
+        return addToStringAttributes(MoreObjects.toStringHelper(this).omitNullValues()).toString();
+    }
+
+    protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
+        return toStringHelper;
+    }
 
     @Override
     public final int hashCode() {