private String getDependencyVersionSupport(PluginDescriptor dependent, String dependencyId) { List<PluginDependency> dependencies = dependent.getDependencies(); for (PluginDependency dependency : dependencies) { if (dependencyId.equals(dependency.getPluginId())) { return dependency.getPluginVersionSupport(); } } throw new IllegalStateException("Cannot find a dependency with id '" + dependencyId + "' for plugin '" + dependent.getPluginId() + "'"); }
private Class<?> loadClassFromDependencies(String className) { log.trace("Search in dependencies for class '{}'", className); List<PluginDependency> dependencies = pluginDescriptor.getDependencies(); for (PluginDependency dependency : dependencies) { ClassLoader classLoader = pluginManager.getPluginClassLoader(dependency.getPluginId()); // If the dependency is marked as optional, its class loader might not be available. if (classLoader == null && dependency.isOptional()) { continue; } try { return classLoader.loadClass(className); } catch (ClassNotFoundException e) { // try next dependency } } return null; }
@Override public void pluginStateChanged(PluginStateEvent event) { // TODO optimize (do only for some transitions) // clear cache entries = null; // By default we're assuming, that no checks for extension dependencies are necessary. // // A plugin, that has an optional dependency to other plugins, might lead to unloadable // Java classes (NoClassDefFoundError) at application runtime due to possibly missing // dependencies. Therefore we're enabling the check for optional extensions, if the // started plugin contains at least one optional plugin dependency. if (checkForExtensionDependencies == null && PluginState.STARTED.equals(event.getPluginState())) { for (PluginDependency dependency : event.getPlugin().getDescriptor().getDependencies()) { if (dependency.isOptional()) { log.debug("Enable check for extension dependencies via ASM."); checkForExtensionDependencies = true; break; } } } }
for (PluginDependency dependency : pluginDescriptor.getDependencies()) { startPlugin(dependency.getPluginId());
private void addPlugin(PluginDescriptor descriptor) { String pluginId = descriptor.getPluginId(); List<PluginDependency> dependencies = descriptor.getDependencies(); if (dependencies.isEmpty()) { dependenciesGraph.addVertex(pluginId); dependentsGraph.addVertex(pluginId); } else { boolean edgeAdded = false; for (PluginDependency dependency : dependencies) { // Don't register optional plugins in the dependency graph to avoid automatic disabling of the plugin, // if an optional dependency is missing. if (!dependency.isOptional()) { edgeAdded = true; dependenciesGraph.addEdge(pluginId, dependency.getPluginId()); dependentsGraph.addEdge(dependency.getPluginId(), pluginId); } } // Register the plugin without dependencies, if all of its dependencies are optional. if (!edgeAdded) { dependenciesGraph.addVertex(pluginId); dependentsGraph.addVertex(pluginId); } } }
private String getDependencyVersionSupport(PluginDescriptor dependent, String dependencyId) { List<PluginDependency> dependencies = dependent.getDependencies(); for (PluginDependency dependency : dependencies) { if (dependencyId.equals(dependency.getPluginId())) { return dependency.getPluginVersionSupport(); } } throw new IllegalStateException("Cannot find a dependency with id '" + dependencyId + "' for plugin '" + dependent.getPluginId() + "'"); }
private Class<?> loadClassFromDependencies(String className) { log.trace("Search in dependencies for class '{}'", className); List<PluginDependency> dependencies = pluginDescriptor.getDependencies(); for (PluginDependency dependency : dependencies) { ClassLoader classLoader = pluginManager.getPluginClassLoader(dependency.getPluginId()); // If the dependency is marked as optional, its class loader might not be available. if (classLoader == null && dependency.isOptional()) { continue; } try { return classLoader.loadClass(className); } catch (ClassNotFoundException e) { // try next dependency } } return null; }
@Override public void pluginStateChanged(PluginStateEvent event) { // TODO optimize (do only for some transitions) // clear cache entries = null; // By default we're assuming, that no checks for extension dependencies are necessary. // // A plugin, that has an optional dependency to other plugins, might lead to unloadable // Java classes (NoClassDefFoundError) at application runtime due to possibly missing // dependencies. Therefore we're enabling the check for optional extensions, if the // started plugin contains at least one optional plugin dependency. if (checkForExtensionDependencies == null && PluginState.STARTED.equals(event.getPluginState())) { for (PluginDependency dependency : event.getPlugin().getDescriptor().getDependencies()) { if (dependency.isOptional()) { log.debug("Enable check for extension dependencies via ASM."); checkForExtensionDependencies = true; break; } } } }
for (PluginDependency dependency : pluginDescriptor.getDependencies()) { startPlugin(dependency.getPluginId());
private void addPlugin(PluginDescriptor descriptor) { String pluginId = descriptor.getPluginId(); List<PluginDependency> dependencies = descriptor.getDependencies(); if (dependencies.isEmpty()) { dependenciesGraph.addVertex(pluginId); dependentsGraph.addVertex(pluginId); } else { boolean edgeAdded = false; for (PluginDependency dependency : dependencies) { // Don't register optional plugins in the dependency graph to avoid automatic disabling of the plugin, // if an optional dependency is missing. if (!dependency.isOptional()) { edgeAdded = true; dependenciesGraph.addEdge(pluginId, dependency.getPluginId()); dependentsGraph.addEdge(dependency.getPluginId(), pluginId); } } // Register the plugin without dependencies, if all of its dependencies are optional. if (!edgeAdded) { dependenciesGraph.addVertex(pluginId); dependentsGraph.addVertex(pluginId); } } }