View Javadoc
1   package com.atlassian.plugin.manager;
2   
3   import com.atlassian.plugin.Plugin;
4   import com.atlassian.plugin.PluginRegistry;
5   
6   import java.util.ArrayList;
7   import java.util.Collection;
8   import java.util.Collections;
9   import java.util.HashSet;
10  import java.util.List;
11  import java.util.Set;
12  
13  /**
14   * A class to sort plugins in enable order
15   *
16   * @since v4.0
17   */
18  final class PluginsInEnableOrder {
19      // the list of plugins sorted by requirement order.
20      final List<Plugin> sortedList;
21  
22      public PluginsInEnableOrder(final Collection<Plugin> pluginsToEnable, PluginRegistry.ReadOnly pluginRegistry) {
23          this.sortedList = new ArrayList<>();
24          final Set<Plugin> visited = new HashSet<>();
25  
26          for (final Plugin plugin : pluginsToEnable) {
27              sortPluginForEnable(plugin, visited, pluginsToEnable, pluginRegistry);
28          }
29      }
30  
31      /**
32       * If currentPlugin has not been visited, recurse on to each recognized plugin that it requires, and
33       * then add it to the sorted list if it is allowed.
34       *
35       * @param currentPlugin  the plugin we are inspecting requirements of.
36       * @param visited        the list of plugins we've already recursed into.
37       * @param allowedPlugins the plugins which we can accumulate into sortedList.
38       */
39      private void sortPluginForEnable(
40              final Plugin currentPlugin,
41              final Set<Plugin> visited,
42              final Collection<Plugin> allowedPlugins,
43              final PluginRegistry.ReadOnly pluginRegistry) {
44          if (!visited.add(currentPlugin)) {
45              return;
46          }
47  
48          for (final String key : currentPlugin.getDependencies().getAll()) {
49              final Plugin requiredPlugin = pluginRegistry.get(key);
50  
51              if (null != requiredPlugin) {
52                  sortPluginForEnable(requiredPlugin, visited, allowedPlugins, pluginRegistry);
53              }
54          }
55  
56          if (allowedPlugins.contains(currentPlugin)) {
57              sortedList.add(currentPlugin);
58          }
59      }
60  
61      public List<Plugin> get() {
62          return Collections.unmodifiableList(sortedList);
63      }
64  }