for (Bundle bundle : bundles) {
addSortedBundle(bundle, namedBundles, sortedBundles, dependencyStack);
}
遍历所有的bundle。
// add the given bundle to the sorted bundles, first adding dependencies
private static void addSortedBundle(Bundle bundle, Map bundles, linkedHashSet sortedBundles,
linkedHashSet dependencyStack) {
String name = bundle.plugin.getName();
if (dependencyStack.contains(name)) {
StringBuilder msg = new StringBuilder("Cycle found in plugin dependencies: ");
dependencyStack.forEach(s -> {
msg.append(s);
msg.append(" -> ");
});
msg.append(name);
throw new IllegalStateException(msg.toString());
}
if (sortedBundles.contains(bundle)) {
// already added this plugin, via a dependency
return;
}
dependencyStack.add(name);
for (String dependency : bundle.plugin.getExtendedPlugins()) {
Bundle depBundle = bundles.get(dependency);
if (depBundle == null) {
throw new IllegalArgumentException("Missing plugin [" + dependency + "], dependency of [" + name + "]");
}
addSortedBundle(depBundle, bundles, sortedBundles, dependencyStack);
assert sortedBundles.contains(depBundle);
}
dependencyStack.remove(name);
sortedBundles.add(bundle);
}
步骤
1. 判断dependencyStack中是否含有当前待处理的bunlde的name, 如果包含则证明存在循环依赖则报错。
2. bunlde已经存在在sortedBundles中。则直接返回。
3. 将当前bundle的name加入到dependencyStack中
4. 遍历当前bunlde所有的依赖, 每个依赖的bundle都会从步骤1开始执行。
5. 将当前bundle的name从dependencyStack中删除
6. 将当前bundle加入到sortedBundles中。



