Introduce PluginDependencyTracker

This commit is contained in:
Rene Pfeuffer
2019-09-16 11:42:26 +02:00
parent 0142258705
commit 14451897b2
2 changed files with 123 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
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) {
plugin.getDependencies().forEach(dependency -> addDependency(plugin.getInformation().getName(), dependency));
}
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) {
plugins.computeIfAbsent(to, name -> createInitialDependencyCollection(from));
}
private void removeDependency(String from, String to) {
plugins.get(to).remove(from);
}
private Collection<String> createInitialDependencyCollection(String from) {
Collection<String> dependencies = new HashSet<>();
dependencies.add(from);
return dependencies;
}
}