Drop unneeded generic type specifiers
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / repo / DependencyResolver.java
index 45ad366285af4c7f5244ebed4ff22c6b3429e336..affa642e43db3f0dcfcc4628e79dee119bde33c0 100644 (file)
@@ -7,18 +7,22 @@
  */
 package org.opendaylight.yangtools.yang.parser.repo;
 
+import com.google.common.base.MoreObjects;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.Map;
-
+import java.util.Map.Entry;
+import java.util.Set;
+import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.ModuleImport;
 import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
 import org.opendaylight.yangtools.yang.parser.impl.util.YangModelDependencyInfo;
@@ -49,7 +53,7 @@ final class DependencyResolver {
     }
 
     private static SourceIdentifier findWildcard(final Iterable<SourceIdentifier> haystack, final String needle) {
-        for (SourceIdentifier r : haystack) {
+        for (final SourceIdentifier r : haystack) {
             if (r.getName().equals(needle)) {
                 return r;
             }
@@ -59,7 +63,7 @@ final class DependencyResolver {
     }
 
     private static boolean isKnown(final Collection<SourceIdentifier> haystack, final ModuleImport mi) {
-        final String rev = mi.getRevision() != null ? mi.getRevision().toString() : null;
+        final String rev = mi.getRevision() != null ? QName.formattedRevision(mi.getRevision()) : null;
         final SourceIdentifier msi = SourceIdentifier.create(mi.getModuleName(), Optional.fromNullable(rev));
 
         // Quick lookup
@@ -71,9 +75,12 @@ final class DependencyResolver {
         return rev == null && findWildcard(haystack, mi.getModuleName()) != null;
     }
 
-    public static final DependencyResolver create(final Map<SourceIdentifier, YangModelDependencyInfo> depInfo) {
+
+
+    public static DependencyResolver create(final Map<SourceIdentifier, YangModelDependencyInfo> depInfo) {
         final Collection<SourceIdentifier> resolved = new ArrayList<>(depInfo.size());
         final Collection<SourceIdentifier> pending = new ArrayList<>(depInfo.keySet());
+        final Map<SourceIdentifier, BelongsToDependency> submodules = Maps.newHashMap();
 
         boolean progress;
         do {
@@ -85,7 +92,16 @@ final class DependencyResolver {
                 final YangModelDependencyInfo dep = depInfo.get(id);
 
                 boolean okay = true;
-                for (ModuleImport mi : dep.getDependencies()) {
+
+                final Set<ModuleImport> dependencies = dep.getDependencies();
+
+                // in case of submodule, remember belongs to
+                if(dep instanceof YangModelDependencyInfo.SubmoduleDependencyInfo) {
+                    final String parent = ((YangModelDependencyInfo.SubmoduleDependencyInfo) dep).getParentModule();
+                    submodules.put(id, new BelongsToDependency(parent));
+                }
+
+                for (final ModuleImport mi : dependencies) {
                     if (!isKnown(resolved, mi)) {
                         LOG.debug("Source {} is missing import {}", id, mi);
                         okay = false;
@@ -102,11 +118,22 @@ final class DependencyResolver {
             }
         } while (progress);
 
+        /// Additional check only for belongs-to statement
+        for (final Entry<SourceIdentifier, BelongsToDependency> submodule : submodules.entrySet()) {
+            final BelongsToDependency belongs = submodule.getValue();
+            final SourceIdentifier sourceIdentifier = submodule.getKey();
+            if (!isKnown(resolved, belongs)) {
+                LOG.debug("Source {} is missing parent {}", sourceIdentifier, belongs);
+                pending.add(sourceIdentifier);
+                resolved.remove(sourceIdentifier);
+            }
+        }
+
         if (!pending.isEmpty()) {
             final Multimap<SourceIdentifier, ModuleImport> imports = ArrayListMultimap.create();
-            for (SourceIdentifier id : pending) {
+            for (final SourceIdentifier id : pending) {
                 final YangModelDependencyInfo dep = depInfo.get(id);
-                for (ModuleImport mi : dep.getDependencies()) {
+                for (final ModuleImport mi : dep.getDependencies()) {
                     if (!isKnown(pending, mi) && !isKnown(resolved, mi)) {
                         imports.put(id, mi);
                     }
@@ -115,7 +142,7 @@ final class DependencyResolver {
 
             return new DependencyResolver(resolved, pending, imports);
         } else {
-            return new DependencyResolver(resolved, Collections.<SourceIdentifier>emptyList(), ImmutableMultimap.<SourceIdentifier, ModuleImport>of());
+            return new DependencyResolver(resolved, Collections.emptyList(), ImmutableMultimap.of());
         }
     }
 
@@ -158,4 +185,34 @@ final class DependencyResolver {
     Multimap<SourceIdentifier, ModuleImport> getUnsatisfiedImports() {
         return unsatisfiedImports;
     }
+
+    private static class BelongsToDependency implements ModuleImport {
+        private final String parent;
+
+        public BelongsToDependency(final String parent) {
+            this.parent = parent;
+        }
+
+        @Override
+        public String getModuleName() {
+            return parent;
+        }
+
+        @Override
+        public Date getRevision() {
+            return null;
+        }
+
+        @Override
+        public String getPrefix() {
+            return null;
+        }
+
+        @Override
+        public String toString() {
+            return MoreObjects.toStringHelper(this)
+                    .add("parent", parent)
+                    .toString();
+        }
+    }
 }