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) {
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;
}
}