Bug 1514: Correctly handle ModuleOrModuleBuilder in ModuleDependencySort
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / util / ModuleDependencySort.java
index d962c3cfa96caa216e33796a182cce91a0d6a4ef..051dd4f72729a94bb9d76f3e3c117d5797f4c282 100644 (file)
@@ -14,6 +14,7 @@ import com.google.common.base.Optional;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
+
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -23,11 +24,13 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+
 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.ModuleImport;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleBuilder;
+import org.opendaylight.yangtools.yang.parser.util.TopologicalSort.Node;
 import org.opendaylight.yangtools.yang.parser.util.TopologicalSort.NodeImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,6 +45,13 @@ public final class ModuleDependencySort {
 
     private static final Date DEFAULT_REVISION = new Date(0);
     private static final Logger LOGGER = LoggerFactory.getLogger(ModuleDependencySort.class);
+    private static final Function<Node, Module> TOPOLOGY_FUNCTION = new Function<TopologicalSort.Node, Module>() {
+        @Override
+        public Module apply(final TopologicalSort.Node input) {
+            ModuleOrModuleBuilder moduleOrModuleBuilder = ((ModuleNodeImpl) input).getReference();
+            return moduleOrModuleBuilder.getModule();
+        }
+    };
 
     /**
      * It is not desirable to instance this class
@@ -107,14 +117,7 @@ public final class ModuleDependencySort {
         List<TopologicalSort.Node> sorted = sortInternal(ModuleOrModuleBuilder.fromAll(asList(modules),
                 Collections.<ModuleBuilder>emptyList()));
         // Cast to Module from Node and return
-        return Lists.transform(sorted, new Function<TopologicalSort.Node, Module>() {
-
-            @Override
-            public Module apply(final TopologicalSort.Node input) {
-                ModuleOrModuleBuilder moduleOrModuleBuilder = ((ModuleNodeImpl) input).getReference();
-                return moduleOrModuleBuilder.getModule();
-            }
-        });
+        return Lists.transform(sorted, TOPOLOGY_FUNCTION);
     }
 
     private static List<TopologicalSort.Node> sortInternal(final Iterable<ModuleOrModuleBuilder> modules) {
@@ -153,7 +156,7 @@ public final class ModuleDependencySort {
 
             String fromName;
             Date fromRevision;
-            Set<ModuleImport> imports;
+            Collection<ModuleImport> imports;
             URI ns;
 
             if (mmb.isModule()) {
@@ -166,7 +169,7 @@ public final class ModuleDependencySort {
                 ModuleBuilder moduleBuilder = mmb.getModuleBuilder();
                 fromName = moduleBuilder.getName();
                 fromRevision = moduleBuilder.getRevision();
-                imports = moduleBuilder.getModuleImports();
+                imports = moduleBuilder.getImports().values();
                 ns = moduleBuilder.getNamespace();
             }
 
@@ -175,12 +178,25 @@ public final class ModuleDependencySort {
                 Object mod = allNS.get(ns);
                 String name = null;
                 Date revision = null;
+
+                if(mod instanceof ModuleOrModuleBuilder) {
+                    ModuleOrModuleBuilder modOrmodBuilder = ((ModuleOrModuleBuilder) mod);
+                    if(modOrmodBuilder.isModule()) {
+                        mod = ((ModuleOrModuleBuilder) mod).getModule();
+                    } else if (modOrmodBuilder.isModuleBuilder()) {
+                        mod = ((ModuleOrModuleBuilder) mod).getModuleBuilder();
+                    } else {
+                        LOGGER.warn("ModuleOrModuleBuilder is neither Module or ModuleBuilder");
+                    }
+                }
                 if (mod instanceof Module) {
                     name = ((Module) mod).getName();
                     revision = ((Module) mod).getRevision();
                 } else if (mod instanceof ModuleBuilder) {
                     name = ((ModuleBuilder) mod).getName();
                     revision = ((ModuleBuilder) mod).getRevision();
+                } else {
+                    LOGGER.warn("Module has no name: {}", mod);
                 }
                 if (!(fromName.equals(name))) {
                     LOGGER.warn(
@@ -372,12 +388,12 @@ class ModuleOrModuleBuilder {
     private final Optional<Module> maybeModule;
     private final Optional<ModuleBuilder> maybeModuleBuilder;
 
-    ModuleOrModuleBuilder(Module module) {
+    ModuleOrModuleBuilder(final Module module) {
         maybeModule = Optional.of(module);
         maybeModuleBuilder = Optional.absent();
     }
 
-    ModuleOrModuleBuilder(ModuleBuilder moduleBuilder) {
+    ModuleOrModuleBuilder(final ModuleBuilder moduleBuilder) {
         maybeModule = Optional.absent();
         maybeModuleBuilder = Optional.of(moduleBuilder);
     }
@@ -394,7 +410,7 @@ class ModuleOrModuleBuilder {
         return maybeModuleBuilder.get();
     }
 
-    static List<ModuleOrModuleBuilder> fromAll(Collection<Module> modules, Collection<ModuleBuilder> moduleBuilders) {
+    static List<ModuleOrModuleBuilder> fromAll(final Collection<Module> modules, final Collection<ModuleBuilder> moduleBuilders) {
         List<ModuleOrModuleBuilder> result = new ArrayList<>(modules.size() + moduleBuilders.size());
         for(Module m: modules){
             result.add(new ModuleOrModuleBuilder(m));