Files
SCM-Manager/scm-webapp/src/main/java/sonia/scm/plugin/PluginDependencyTracker.java

43 lines
1.3 KiB
Java
Raw Normal View History

2019-09-16 11:42:26 +02:00
package sonia.scm.plugin;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import static sonia.scm.ScmConstraintViolationException.Builder.doThrow;
class PluginDependencyTracker {
private final Map<String, Collection<String>> plugins = new HashMap<>();
void addInstalled(PluginDescriptor plugin) {
2019-09-17 13:00:24 +02:00
if (plugin.getDependencies() != null) {
plugin.getDependencies().forEach(dependency -> addDependency(plugin.getInformation().getName(), dependency));
}
2019-09-16 11:42:26 +02:00
}
void removeInstalled(PluginDescriptor plugin) {
doThrow()
.violation("Plugin is needed as a dependency for other plugins", "plugin")
.when(!mayUninstall(plugin.getInformation().getName()));
plugin.getDependencies().forEach(dependency -> removeDependency(plugin.getInformation().getName(), dependency));
}
boolean mayUninstall(String name) {
return plugins.computeIfAbsent(name, x -> new HashSet<>()).isEmpty();
}
private void addDependency(String from, String to) {
2019-09-16 17:49:21 +02:00
plugins.computeIfAbsent(to, name -> new HashSet<>()).add(from);
2019-09-16 11:42:26 +02:00
}
private void removeDependency(String from, String to) {
Collection<String> dependencies = plugins.get(to);
if (dependencies == null) {
throw new NullPointerException("inverse dependencies not found for " + to);
}
dependencies.remove(from);
2019-09-16 11:42:26 +02:00
}
}