/** * Start all active plugins. */ @Override public void startPlugins() { for (PluginWrapper pluginWrapper : resolvedPlugins) { PluginState pluginState = pluginWrapper.getPluginState(); if ((PluginState.DISABLED != pluginState) && (PluginState.STARTED != pluginState)) { try { log.info("Start plugin '{}'", getPluginLabel(pluginWrapper.getDescriptor())); pluginWrapper.getPlugin().start(); pluginWrapper.setPluginState(PluginState.STARTED); startedPlugins.add(pluginWrapper); firePluginStateEvent(new PluginStateEvent(this, pluginWrapper, pluginState)); } catch (Exception e) { log.error(e.getMessage(), e); } } } }
String pluginClassName = pluginWrapper.getDescriptor().getPluginClass(); log.debug("Create instance for plugin '{}'", pluginClassName); pluginClass = pluginWrapper.getPluginClassLoader().loadClass(pluginClassName); } catch (ClassNotFoundException e) { log.error(e.getMessage(), e);
/** * Tests for already loaded plugins on given path. * * @param pluginPath the path to investigate * @return id of plugin or null if not loaded */ protected String idForPath(Path pluginPath) { for (PluginWrapper plugin : plugins.values()) { if (plugin.getPluginPath().equals(pluginPath)) { return plugin.getPluginId(); } } return null; }
@Override public boolean enablePlugin(String pluginId) { checkPluginId(pluginId); PluginWrapper pluginWrapper = getPlugin(pluginId); if (!isPluginValid(pluginWrapper)) { log.warn("Plugin '{}' can not be enabled", getPluginLabel(pluginWrapper.getDescriptor())); return false; } PluginDescriptor pluginDescriptor = pluginWrapper.getDescriptor(); PluginState pluginState = pluginWrapper.getPluginState(); if (PluginState.DISABLED != pluginState) { log.debug("Plugin '{}' is not disabled", getPluginLabel(pluginDescriptor)); return true; } if (!pluginStatusProvider.enablePlugin(pluginId)) { return false; } pluginWrapper.setPluginState(PluginState.CREATED); firePluginStateEvent(new PluginStateEvent(this, pluginWrapper, pluginState)); log.info("Enabled plugin '{}'", getPluginLabel(pluginDescriptor)); return true; }
public void injectExtensions() { // add extensions from classpath (non plugin) Set<String> extensionClassNames = pluginManager.getExtensionClassNames(null); for (String extensionClassName : extensionClassNames) { try { log.debug("Register extension '{}' as bean", extensionClassName); Class<?> extensionClass = getClass().getClassLoader().loadClass(extensionClassName); registerExtension(extensionClass); } catch (ClassNotFoundException e) { log.error(e.getMessage(), e); } } // add extensions for each started plugin List<PluginWrapper> startedPlugins = pluginManager.getStartedPlugins(); for (PluginWrapper plugin : startedPlugins) { log.debug("Registering extensions of the plugin '{}' as beans", plugin.getPluginId()); extensionClassNames = pluginManager.getExtensionClassNames(plugin.getPluginId()); for (String extensionClassName : extensionClassNames) { try { log.debug("Register extension '{}' as bean", extensionClassName); Class<?> extensionClass = plugin.getPluginClassLoader().loadClass(extensionClassName); registerExtension(extensionClass); } catch (ClassNotFoundException e) { log.error(e.getMessage(), e); } } } }
/** * Shortcut */ public String getPluginId() { return getDescriptor().getPluginId(); }
@Override public boolean deletePlugin(String pluginId) { checkPluginId(pluginId); PluginWrapper pluginWrapper = getPlugin(pluginId); PluginState pluginState = stopPlugin(pluginId); if (PluginState.STARTED == pluginState) { log.error("Failed to stop plugin '{}' on delete", pluginId); return false; } if (!unloadPlugin(pluginId)) { log.error("Failed to unload plugin '{}' on delete", pluginId); return false; } try { pluginWrapper.getPlugin().delete(); } catch (PluginException e) { log.error(e.getMessage(), e); return false; } Path pluginPath = pluginWrapper.getPluginPath(); return pluginRepository.deletePluginPath(pluginPath); }
PluginWrapper pluginWrapper = new PluginWrapper(this, pluginDescriptor, pluginPath, pluginClassLoader); pluginWrapper.setPluginFactory(getPluginFactory()); pluginWrapper.setRuntimeMode(getRuntimeMode()); pluginWrapper.setPluginState(PluginState.DISABLED); pluginWrapper.setPluginState(PluginState.DISABLED);
@Override public PluginWrapper whichPlugin(Class<?> clazz) { ClassLoader classLoader = clazz.getClassLoader(); for (PluginWrapper plugin : resolvedPlugins) { if (plugin.getPluginClassLoader() == classLoader) { return plugin; } } return null; }
@Override public void destroy(Application application) { List<PluginWrapper> startedPlugins = pluginManager.getStartedPlugins(); Collections.reverse(startedPlugins); // stop plugins pluginManager.stopPlugins(); // destroy started plugins in reverse order for (PluginWrapper plugin : startedPlugins) { if (plugin.getPlugin() instanceof WicketPlugin) { ((WicketPlugin) plugin.getPlugin()).destroy(application); } } }
@Override public String toString() { return "PluginStateEvent [plugin=" + plugin.getPluginId() + ", newState=" + getPluginState() + ", oldState=" + oldState + ']'; }
public PluginState getPluginState() { return plugin.getPluginState(); }
@Override public boolean disablePlugin(String pluginId) { checkPluginId(pluginId); PluginWrapper pluginWrapper = getPlugin(pluginId); PluginDescriptor pluginDescriptor = pluginWrapper.getDescriptor(); PluginState pluginState = pluginWrapper.getPluginState(); if (PluginState.DISABLED == pluginState) { log.debug("Already disabled plugin '{}'", getPluginLabel(pluginDescriptor)); return true; } if (PluginState.STOPPED == stopPlugin(pluginId)) { pluginWrapper.setPluginState(PluginState.DISABLED); firePluginStateEvent(new PluginStateEvent(this, pluginWrapper, PluginState.STOPPED)); if (!pluginStatusProvider.disablePlugin(pluginId)) { return false; } log.info("Disabled plugin '{}'", getPluginLabel(pluginDescriptor)); return true; } return false; }
@Override public String loadPlugin(Path pluginPath) { if ((pluginPath == null) || Files.notExists(pluginPath)) { throw new IllegalArgumentException(String.format("Specified plugin %s does not exist!", pluginPath)); } log.debug("Loading plugin from '{}'", pluginPath); try { PluginWrapper pluginWrapper = loadPluginFromPath(pluginPath); // try to resolve the loaded plugin together with other possible plugins that depend on this plugin resolvePlugins(); return pluginWrapper.getDescriptor().getPluginId(); } catch (PluginException e) { log.error(e.getMessage(), e); } return null; }
@Override public boolean deletePlugin(String pluginId) { checkPluginId(pluginId); PluginWrapper pluginWrapper = getPlugin(pluginId); PluginState pluginState = stopPlugin(pluginId); if (PluginState.STARTED == pluginState) { log.error("Failed to stop plugin '{}' on delete", pluginId); return false; } if (!unloadPlugin(pluginId)) { log.error("Failed to unload plugin '{}' on delete", pluginId); return false; } try { pluginWrapper.getPlugin().delete(); } catch (PluginException e) { log.error(e.getMessage(), e); return false; } Path pluginPath = pluginWrapper.getPluginPath(); return pluginRepository.deletePluginPath(pluginPath); }
PluginWrapper pluginWrapper = new PluginWrapper(this, pluginDescriptor, pluginPath, pluginClassLoader); pluginWrapper.setPluginFactory(getPluginFactory()); pluginWrapper.setRuntimeMode(getRuntimeMode()); pluginWrapper.setPluginState(PluginState.DISABLED); pluginWrapper.setPluginState(PluginState.DISABLED);
@Override public ClassLoader getClassLoader() { return plugin.getPluginClassLoader(); }
@Override public Object create(Class<?> extensionClass) { Object extension = createWithoutSpring(extensionClass); if (autowire && extension != null) { // test for SpringBean PluginWrapper pluginWrapper = pluginManager.whichPlugin(extensionClass); if (pluginWrapper != null) { Plugin plugin = pluginWrapper.getPlugin(); if (plugin instanceof SpringPlugin) { // autowire ApplicationContext pluginContext = ((SpringPlugin) plugin).getApplicationContext(); pluginContext.getAutowireCapableBeanFactory().autowireBean(extension); } } } return extension; }
@Override public void pluginStateChanged(PluginStateEvent event) { log.debug("The state of plugin '{}' has changed from '{}' to '{}'", event.getPlugin().getPluginId(), event.getOldState(), event.getPluginState()); }
/** * Returns a copy of plugins with that state. */ @Override public List<PluginWrapper> getPlugins(PluginState pluginState) { List<PluginWrapper> plugins = new ArrayList<>(); for (PluginWrapper plugin : getPlugins()) { if (pluginState.equals(plugin.getPluginState())) { plugins.add(plugin); } } return plugins; }