Merge "Added tests for yang.model.util"
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / util / ModuleDependencySort.java
index 728a1698a864579818cb9a2648ccc6dec4ea25b6..05dbd2e1b7f1d7f0b4ba454e94138a257e59e396 100644 (file)
@@ -28,6 +28,7 @@ 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 +43,16 @@ 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) {
+            if (input == null) {
+                return null;
+            }
+            ModuleOrModuleBuilder moduleOrModuleBuilder = ((ModuleNodeImpl) input).getReference();
+            return moduleOrModuleBuilder.getModule();
+        }
+    };
 
     /**
      * It is not desirable to instance this class
@@ -57,6 +68,9 @@ public final class ModuleDependencySort {
         @Override
         public ModuleBuilder apply(final TopologicalSort.Node input) {
             // Cast to ModuleBuilder from Node and return
+            if (input == null) {
+                return null;
+            }
             ModuleOrModuleBuilder moduleOrModuleBuilder = ((ModuleNodeImpl) input).getReference();
             return moduleOrModuleBuilder.getModuleBuilder();
         }
@@ -87,6 +101,9 @@ public final class ModuleDependencySort {
 
             @Override
             public ModuleBuilder apply(final TopologicalSort.Node input) {
+                if (input == null) {
+                    return null;
+                }
                 ModuleOrModuleBuilder moduleOrModuleBuilder = ((ModuleNodeImpl) input).getReference();
                 if (moduleOrModuleBuilder.isModuleBuilder()) {
                     return moduleOrModuleBuilder.getModuleBuilder();
@@ -107,14 +124,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) {
@@ -145,7 +155,7 @@ public final class ModuleDependencySort {
      */
     private static void processDependencies(final Map<String, Map<Date, ModuleNodeImpl>> moduleGraph,
             final Iterable<ModuleOrModuleBuilder> mmbs) {
-        Map<URI, Object> allNS = new HashMap<>();
+        Map<URI, ModuleOrModuleBuilder> allNS = new HashMap<>();
 
         // Create edges in graph
         for (ModuleOrModuleBuilder mmb : mmbs) {
@@ -172,15 +182,15 @@ public final class ModuleDependencySort {
 
             // check for existence of module with same namespace
             if (allNS.containsKey(ns)) {
-                Object mod = allNS.get(ns);
+                ModuleOrModuleBuilder mod = allNS.get(ns);
                 String name = null;
                 Date revision = null;
-                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();
+                if (mod.isModule()) {
+                    name = mod.getModule().getName();
+                    revision = mod.getModule().getRevision();
+                } else if (mod.isModuleBuilder()) {
+                    name = mod.getModuleBuilder().getName();
+                    revision = mod.getModuleBuilder().getRevision();
                 }
                 if (!(fromName.equals(name))) {
                     LOGGER.warn(
@@ -372,12 +382,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 +404,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));