From 1639e4fba1bd2203f39104076d85d69bd0228c8b Mon Sep 17 00:00:00 2001 From: Evgeny Mandrikov Date: Tue, 8 Feb 2011 00:51:56 +0300 Subject: SONAR-2075: Add the ability for a plugin to extend an other plugin --- .../batch/bootstrap/BatchPluginRepository.java | 58 +++++++++++++++------- 1 file changed, 41 insertions(+), 17 deletions(-) (limited to 'sonar-batch') diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginRepository.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginRepository.java index 5ec8ac920ae..c883998d927 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginRepository.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginRepository.java @@ -57,6 +57,7 @@ public class BatchPluginRepository extends AbstractPluginRepository { private ClassLoadersCollection classLoaders; private ExtensionDownloader extensionDownloader; private EnvironmentInformation environment; + private List register; public BatchPluginRepository(JpaPluginDao dao, ExtensionDownloader extensionDownloader, EnvironmentInformation environment) { this.dao = dao; @@ -69,36 +70,59 @@ public class BatchPluginRepository extends AbstractPluginRepository { * for unit tests only */ BatchPluginRepository() { + } + + private List download(JpaPlugin pluginMetadata) { + List urls = Lists.newArrayList(); + for (JpaPluginFile pluginFile : pluginMetadata.getFiles()) { + File file = extensionDownloader.downloadExtension(pluginFile); + try { + urls.add(file.toURI().toURL()); + } catch (MalformedURLException e) { + throw new SonarException("Can not get the URL of: " + file, e); + } + } + return urls; } public void start() { + register = Lists.newArrayList(); classLoaders = new ClassLoadersCollection(Thread.currentThread().getContextClassLoader()); - for (JpaPlugin pluginMetadata : dao.getPlugins()) { - String key = pluginMetadata.getKey(); - List urls = Lists.newArrayList(); - for (JpaPluginFile pluginFile : pluginMetadata.getFiles()) { - File file = extensionDownloader.downloadExtension(pluginFile); - try { - urls.add(file.toURI().toURL()); - - } catch (MalformedURLException e) { - throw new SonarException("Can not get the URL of: " + file, e); - } + + List jpaPlugins = dao.getPlugins(); + + for (JpaPlugin pluginMetadata : jpaPlugins) { + if (StringUtils.isEmpty(pluginMetadata.getBasePlugin())) { + String key = pluginMetadata.getKey(); + List urls = download(pluginMetadata); + classLoaders.createClassLoader(key, urls, pluginMetadata.isUseChildFirstClassLoader() == Boolean.TRUE); + register.add(pluginMetadata); } - if (LOG.isDebugEnabled()) { - LOG.debug("Classloader of plugin " + key + ":"); - for (URL url : urls) { - LOG.debug(" -> " + url); + } + + // Extend plugins by other plugins + for (JpaPlugin pluginMetadata : jpaPlugins) { + String pluginKey = pluginMetadata.getKey(); + String basePluginKey = pluginMetadata.getBasePlugin(); + if (StringUtils.isNotEmpty(basePluginKey)) { + if (classLoaders.get(basePluginKey) != null) { + LOG.debug("Plugin {} extends {}", pluginKey, basePluginKey); + List urls = download(pluginMetadata); + classLoaders.extend(basePluginKey, pluginKey, urls); + register.add(pluginMetadata); + } else { + // Ignored, because base plugin doesn't exists + LOG.warn("Plugin {} extends nonexistent plugin {}", pluginKey, basePluginKey); } } - classLoaders.createClassLoader(key, urls, pluginMetadata.isUseChildFirstClassLoader() == Boolean.TRUE); } + classLoaders.done(); } public void registerPlugins(MutablePicoContainer pico) { - for (JpaPlugin pluginMetadata : dao.getPlugins()) { + for (JpaPlugin pluginMetadata : register) { try { Class claz = classLoaders.get(pluginMetadata.getKey()).loadClass(pluginMetadata.getPluginClass()); Plugin plugin = (Plugin) claz.newInstance(); -- cgit v1.2.3