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
15
16
17
18 final class PluginsInEnableOrder {
19
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
33
34
35
36
37
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 }