mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-13 17:05:43 +01:00
Introduce PluginDependencyTracker
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user