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) {
|
2019-09-26 16:51:26 +02:00
|
|
|
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
|
|
|
}
|
|
|
|
|
}
|