Add support for transitive depends in load access warning

By: md_5 <git@md-5.net>
This commit is contained in:
Bukkit/Spigot
2020-01-28 12:43:25 +11:00
parent d1676c9727
commit 99378a8c91
2 changed files with 31 additions and 4 deletions

View File

@ -1,6 +1,10 @@
package org.bukkit.plugin;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
import com.google.common.graph.GraphBuilder;
import com.google.common.graph.Graphs;
import com.google.common.graph.MutableGraph;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
@ -44,6 +48,7 @@ public final class SimplePluginManager implements PluginManager {
private final Map<Pattern, PluginLoader> fileAssociations = new HashMap<Pattern, PluginLoader>();
private final List<Plugin> plugins = new ArrayList<Plugin>();
private final Map<String, Plugin> lookupNames = new HashMap<String, Plugin>();
private MutableGraph<String> dependencyGraph = GraphBuilder.directed().build();
private File updateDirectory;
private final SimpleCommandMap commandMap;
private final Map<String, Permission> permissions = new HashMap<String, Permission>();
@ -168,11 +173,19 @@ public final class SimplePluginManager implements PluginManager {
} else {
softDependencies.put(description.getName(), new LinkedList<String>(softDependencySet));
}
for (String depend : softDependencySet) {
dependencyGraph.putEdge(description.getName(), depend);
}
}
Collection<String> dependencySet = description.getDepend();
if (dependencySet != null && !dependencySet.isEmpty()) {
dependencies.put(description.getName(), new LinkedList<String>(dependencySet));
for (String depend : dependencySet) {
dependencyGraph.putEdge(description.getName(), depend);
}
}
Collection<String> loadBeforeSet = description.getLoadBefore();
@ -186,6 +199,8 @@ public final class SimplePluginManager implements PluginManager {
shortSoftDependency.add(description.getName());
softDependencies.put(loadBeforeTarget, shortSoftDependency);
}
dependencyGraph.putEdge(loadBeforeTarget, description.getName());
}
}
}
@ -480,6 +495,7 @@ public final class SimplePluginManager implements PluginManager {
disablePlugins();
plugins.clear();
lookupNames.clear();
dependencyGraph = GraphBuilder.directed().build();
HandlerList.unregisterAll();
fileAssociations.clear();
permissions.clear();
@ -780,6 +796,13 @@ public final class SimplePluginManager implements PluginManager {
return new HashSet<Permission>(permissions.values());
}
public boolean isTransitiveDepend(@NotNull PluginDescriptionFile plugin, @NotNull Plugin depend) {
Preconditions.checkArgument(plugin != null, "plugin");
Preconditions.checkArgument(depend != null, "depend");
return Graphs.reachableNodes(dependencyGraph, plugin.getName()).contains(depend.getName());
}
@Override
public boolean useTimings() {
return useTimings;