Browse Source

Fix #42 and it's a help for #32

pull/54/head
Mário Franco 9 years ago
parent
commit
e4cf827a4c
  1. 18
      pf4j/src/main/java/ro/fortsoft/pf4j/DefaultPluginManager.java
  2. 26
      pf4j/src/main/java/ro/fortsoft/pf4j/DependencyResolver.java
  3. 7
      pf4j/src/main/java/ro/fortsoft/pf4j/util/DirectedGraph.java

18
pf4j/src/main/java/ro/fortsoft/pf4j/DefaultPluginManager.java

@ -93,6 +93,7 @@ public class DefaultPluginManager implements PluginManager {
private PluginFactory pluginFactory; private PluginFactory pluginFactory;
private ExtensionFactory extensionFactory; private ExtensionFactory extensionFactory;
private PluginStatusProvider pluginStatusProvider; private PluginStatusProvider pluginStatusProvider;
private DependencyResolver dependencyResolver;
/** /**
* The plugins repository. * The plugins repository.
@ -297,6 +298,10 @@ public class DefaultPluginManager implements PluginManager {
*/ */
@Override @Override
public PluginState stopPlugin(String pluginId) { public PluginState stopPlugin(String pluginId) {
return stopPlugin(pluginId, true);
}
private PluginState stopPlugin(String pluginId, boolean stopDependents) {
if (!plugins.containsKey(pluginId)) { if (!plugins.containsKey(pluginId)) {
throw new IllegalArgumentException(String.format("Unknown pluginId %s", pluginId)); throw new IllegalArgumentException(String.format("Unknown pluginId %s", pluginId));
} }
@ -315,9 +320,14 @@ public class DefaultPluginManager implements PluginManager {
return pluginState; return pluginState;
} }
for (PluginDependency dependency : pluginDescriptor.getDependencies()) { if (stopDependents) {
stopPlugin(dependency.getPluginId()); List<String> dependents = dependencyResolver.getDependents(pluginId);
} while (!dependents.isEmpty()) {
String dependent = dependents.remove(0);
stopPlugin(dependent, false);
dependents.addAll(dependencyResolver.getDependents(dependent));
}
}
try { try {
log.info("Stop plugin '{}:{}'", pluginDescriptor.getPluginId(), pluginDescriptor.getVersion()); log.info("Stop plugin '{}:{}'", pluginDescriptor.getPluginId(), pluginDescriptor.getVersion());
@ -813,7 +823,7 @@ public class DefaultPluginManager implements PluginManager {
} }
private void resolveDependencies() throws PluginException { private void resolveDependencies() throws PluginException {
DependencyResolver dependencyResolver = new DependencyResolver(unresolvedPlugins); dependencyResolver = new DependencyResolver(unresolvedPlugins);
resolvedPlugins = dependencyResolver.getSortedPlugins(); resolvedPlugins = dependencyResolver.getSortedPlugins();
for (PluginWrapper pluginWrapper : resolvedPlugins) { for (PluginWrapper pluginWrapper : resolvedPlugins) {
unresolvedPlugins.remove(pluginWrapper); unresolvedPlugins.remove(pluginWrapper);

26
pf4j/src/main/java/ro/fortsoft/pf4j/DependencyResolver.java

@ -28,7 +28,8 @@ class DependencyResolver {
private static final Logger log = LoggerFactory.getLogger(DependencyResolver.class); private static final Logger log = LoggerFactory.getLogger(DependencyResolver.class);
private List<PluginWrapper> plugins; private List<PluginWrapper> plugins;
private DirectedGraph<String> graph; private DirectedGraph<String> dependenciesGraph;
private DirectedGraph<String> dependentsGraph;
public DependencyResolver(List<PluginWrapper> plugins) { public DependencyResolver(List<PluginWrapper> plugins) {
this.plugins = plugins; this.plugins = plugins;
@ -36,15 +37,23 @@ class DependencyResolver {
initGraph(); initGraph();
} }
public List<String> getDependecies(String pluginsId) {
return dependenciesGraph.getNeighbors(pluginsId);
}
public List<String> getDependents(String pluginsId) {
return dependentsGraph.getNeighbors(pluginsId);
}
/** /**
* Get the list of plugins in dependency sorted order. * Get the list of plugins in dependency sorted order.
*/ */
public List<PluginWrapper> getSortedPlugins() throws PluginException { public List<PluginWrapper> getSortedPlugins() throws PluginException {
log.debug("Graph: {}", graph); log.debug("Graph: {}", dependenciesGraph);
List<String> pluginsId = graph.reverseTopologicalSort(); List<String> pluginsId = dependenciesGraph.reverseTopologicalSort();
if (pluginsId == null) { if (pluginsId == null) {
throw new CyclicDependencyException("Cyclic dependencies !!!" + graph.toString()); throw new CyclicDependencyException("Cyclic dependencies !!!" + dependenciesGraph.toString());
} }
log.debug("Plugins order: {}", pluginsId); log.debug("Plugins order: {}", pluginsId);
@ -58,7 +67,8 @@ class DependencyResolver {
private void initGraph() { private void initGraph() {
// create graph // create graph
graph = new DirectedGraph<>(); dependenciesGraph = new DirectedGraph<>();
dependentsGraph = new DirectedGraph<>();
// populate graph // populate graph
for (PluginWrapper pluginWrapper : plugins) { for (PluginWrapper pluginWrapper : plugins) {
@ -67,10 +77,12 @@ class DependencyResolver {
List<PluginDependency> dependencies = descriptor.getDependencies(); List<PluginDependency> dependencies = descriptor.getDependencies();
if (!dependencies.isEmpty()) { if (!dependencies.isEmpty()) {
for (PluginDependency dependency : dependencies) { for (PluginDependency dependency : dependencies) {
graph.addEdge(pluginId, dependency.getPluginId()); dependenciesGraph.addEdge(pluginId, dependency.getPluginId());
dependentsGraph.addEdge(dependency.getPluginId(), pluginId);
} }
} else { } else {
graph.addVertex(pluginId); dependenciesGraph.addVertex(pluginId);
dependentsGraph.addVertex(pluginId);
} }
} }
} }

7
pf4j/src/main/java/ro/fortsoft/pf4j/util/DirectedGraph.java

@ -69,6 +69,13 @@ public class DirectedGraph<V> {
neighbors.get(from).remove(to); neighbors.get(from).remove(to);
} }
public List<V> getNeighbors(V vertex) {
if (neighbors.containsKey(vertex)) {
return new ArrayList<V>();
}
return neighbors.get(vertex);
}
/** /**
* Report (as a Map) the out-degree of each vertex. * Report (as a Map) the out-degree of each vertex.
*/ */

Loading…
Cancel
Save