Do not create temporary array for module sorting 06/58606/2
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 9 Jun 2017 09:17:47 +0000 (11:17 +0200)
committerRobert Varga <nite@hq.sk>
Fri, 9 Jun 2017 13:11:46 +0000 (13:11 +0000)
ModuleDependencySort uses an internal iterable anyway, so expose
that method and pass our temporary set, skipping an unnecessary
copy operation.

Change-Id: I2253ed4edc3837ebb9182bcb1b0069d94e2f83e7
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit c0f132ca8118358f1e41feb196da4f068f130430)

yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EffectiveSchemaContext.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ModuleDependencySort.java

index 0223bdf1399c1b1d0d06197f29c31756627f5766..5e670f5af2476f2ef2d8e69704c40805fd06a678 100644 (file)
@@ -43,23 +43,18 @@ public final class EffectiveSchemaContext extends AbstractEffectiveSchemaContext
         this.rootDeclaredStatements = ImmutableList.copyOf(rootDeclaredStatements);
         this.rootEffectiveStatements = ImmutableList.copyOf(rootEffectiveStatements);
 
-        Set<Module> modulesInit = new HashSet<>();
+        final Set<Module> modulesInit = new HashSet<>();
         for (EffectiveStatement<?, ?> rootEffectiveStatement : rootEffectiveStatements) {
             if (rootEffectiveStatement instanceof ModuleEffectiveStatementImpl) {
                 Module module = (Module) rootEffectiveStatement;
                 modulesInit.add(module);
             }
         }
+        this.modules = ImmutableSet.copyOf(ModuleDependencySort.sort(modulesInit));
 
-        Module[] moduleArray = new Module[modulesInit.size()];
-        List<Module> sortedModuleList = ModuleDependencySort.sort(modulesInit.toArray(moduleArray));
-        this.modules = ImmutableSet.copyOf(sortedModuleList);
-
-        final SetMultimap<URI, Module> nsMap = Multimaps.newSetMultimap(
-                new TreeMap<>(), MODULE_SET_SUPPLIER);
-        final SetMultimap<String, Module> nameMap = Multimaps.newSetMultimap(
-                new TreeMap<>(), MODULE_SET_SUPPLIER);
-        Set<ModuleIdentifier> modIdBuilder = new HashSet<>();
+        final SetMultimap<URI, Module> nsMap = Multimaps.newSetMultimap(new TreeMap<>(), MODULE_SET_SUPPLIER);
+        final SetMultimap<String, Module> nameMap = Multimaps.newSetMultimap(new TreeMap<>(), MODULE_SET_SUPPLIER);
+        final Set<ModuleIdentifier> modIdBuilder = new HashSet<>();
         for (Module m : modulesInit) {
             nameMap.put(m.getName(), m);
             nsMap.put(m.getNamespace(), m);
index 6c6afb12c8e9b9473d9cc728b017baa3987ee014..bc980c03a0f6cdd5510fa3f61ad3b44aea40fb5c 100644 (file)
@@ -60,7 +60,18 @@ public final class ModuleDependencySort {
      *         returned order.
      */
     public static List<Module> sort(final Module... modules) {
-        List<TopologicalSort.Node> sorted = sortInternal(Arrays.asList(modules));
+        return sort(Arrays.asList(modules));
+    }
+
+    /**
+     * Topological sort of module dependency graph.
+     *
+     * @param modules YANG modules
+     * @return Sorted list of Modules. Modules can be further processed in
+     *         returned order.
+     */
+    public static List<Module> sort(final Iterable<Module> modules) {
+        final List<TopologicalSort.Node> sorted = sortInternal(modules);
         // Cast to Module from Node and return
         return Lists.transform(sorted, TOPOLOGY_FUNCTION);
     }
@@ -111,10 +122,10 @@ public final class ModuleDependencySort {
 
             // check for existence of module with same namespace
             if (allNS.containsKey(ns)) {
-                Module mod = allNS.get(ns);
-                String name = mod.getName();
-                Date revision = mod.getRevision();
-                if (!(fromName.equals(name))) {
+                final Module mod = allNS.get(ns);
+                final String name = mod.getName();
+                final Date revision = mod.getRevision();
+                if (!fromName.equals(name)) {
                     LOGGER.warn(
                             "Error while sorting module [{}, {}]: module with same namespace ({}) already loaded: [{}, {}]",
                             fromName, fromRevision, ns, name, revision);