]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6517 fix sharing of plugin api packages across plugin classloaders
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Mon, 11 May 2015 21:06:36 +0000 (23:06 +0200)
committerSimon Brandhof <simon.brandhof@sonarsource.com>
Mon, 11 May 2015 21:07:28 +0000 (23:07 +0200)
14 files changed:
server/sonar-server/src/test/projects/test-base-plugin-v2/src/org/sonar/plugins/testbase/api/BaseApi.java [new file with mode: 0644]
server/sonar-server/src/test/projects/test-base-plugin-v2/target/test-base-plugin-0.2-SNAPSHOT.jar
server/sonar-server/src/test/projects/test-base-plugin/src/org/sonar/plugins/testbase/api/BaseApi.java [new file with mode: 0644]
server/sonar-server/src/test/projects/test-base-plugin/target/test-base-plugin-0.1-SNAPSHOT.jar
server/sonar-server/src/test/projects/test-core-plugin/target/test-core-plugin-0.1-SNAPSHOT.jar
server/sonar-server/src/test/projects/test-extend-plugin/target/test-extend-plugin-0.1-SNAPSHOT.jar
server/sonar-server/src/test/projects/test-libs-plugin/target/test-libs-plugin-0.1-SNAPSHOT.jar
server/sonar-server/src/test/projects/test-require-plugin/pom.xml
server/sonar-server/src/test/projects/test-require-plugin/src/RequirePlugin.java
server/sonar-server/src/test/projects/test-require-plugin/target/test-require-plugin-0.1-SNAPSHOT.jar
server/sonar-server/src/test/projects/test-requirenew-plugin/pom.xml
server/sonar-server/src/test/projects/test-requirenew-plugin/src/RequirePlugin.java
server/sonar-server/src/test/projects/test-requirenew-plugin/target/test-requirenew-plugin-0.1-SNAPSHOT.jar
sonar-core/src/main/java/org/sonar/core/platform/PluginLoader.java

diff --git a/server/sonar-server/src/test/projects/test-base-plugin-v2/src/org/sonar/plugins/testbase/api/BaseApi.java b/server/sonar-server/src/test/projects/test-base-plugin-v2/src/org/sonar/plugins/testbase/api/BaseApi.java
new file mode 100644 (file)
index 0000000..356a9c8
--- /dev/null
@@ -0,0 +1,6 @@
+package org.sonar.plugins.testbase.api;
+
+public class BaseApi {
+  public void doNothing() {
+  }
+}
index 9bd9e0e0fc16800409d159b122de1ae62a804034..32ac594aad1241af223daa968c1db05290d2e897 100644 (file)
Binary files a/server/sonar-server/src/test/projects/test-base-plugin-v2/target/test-base-plugin-0.2-SNAPSHOT.jar and b/server/sonar-server/src/test/projects/test-base-plugin-v2/target/test-base-plugin-0.2-SNAPSHOT.jar differ
diff --git a/server/sonar-server/src/test/projects/test-base-plugin/src/org/sonar/plugins/testbase/api/BaseApi.java b/server/sonar-server/src/test/projects/test-base-plugin/src/org/sonar/plugins/testbase/api/BaseApi.java
new file mode 100644 (file)
index 0000000..356a9c8
--- /dev/null
@@ -0,0 +1,6 @@
+package org.sonar.plugins.testbase.api;
+
+public class BaseApi {
+  public void doNothing() {
+  }
+}
index 2a6148ce7b6ff0fbc0476907036dac5109496b06..f943a16b28f4088d0771e3384f22de4aa7c9cbc5 100644 (file)
Binary files a/server/sonar-server/src/test/projects/test-base-plugin/target/test-base-plugin-0.1-SNAPSHOT.jar and b/server/sonar-server/src/test/projects/test-base-plugin/target/test-base-plugin-0.1-SNAPSHOT.jar differ
index 62eba2aa80fbabc8e20007e90d94a07ec6fd9c50..278b459622726916c011acf9243734b3b861c2ca 100644 (file)
Binary files a/server/sonar-server/src/test/projects/test-core-plugin/target/test-core-plugin-0.1-SNAPSHOT.jar and b/server/sonar-server/src/test/projects/test-core-plugin/target/test-core-plugin-0.1-SNAPSHOT.jar differ
index 7a81fdf0cce220427d4d14840577b4ec0dc1578b..71dcee704960487f94ff491bd944451e6c7aebb8 100644 (file)
Binary files a/server/sonar-server/src/test/projects/test-extend-plugin/target/test-extend-plugin-0.1-SNAPSHOT.jar and b/server/sonar-server/src/test/projects/test-extend-plugin/target/test-extend-plugin-0.1-SNAPSHOT.jar differ
index 85e4772f474d918c90f1771244aeb500f419bca7..590d91b74f200e45ecb2a2389f2b2cf899aa8410 100644 (file)
Binary files a/server/sonar-server/src/test/projects/test-libs-plugin/target/test-libs-plugin-0.1-SNAPSHOT.jar and b/server/sonar-server/src/test/projects/test-libs-plugin/target/test-libs-plugin-0.1-SNAPSHOT.jar differ
index 1f77e233f62d7d69a05675087960008ce94f4259..2c45fb3afb0c9310c68fc98982041e095d7f5933 100644 (file)
       <version>4.5.4</version>
       <scope>provided</scope>
     </dependency>
+    <dependency>
+      <groupId>org.codehaus.sonar.tests</groupId>
+      <artifactId>test-base-plugin</artifactId>
+      <version>0.1-SNAPSHOT</version>
+      <type>sonar-plugin</type>
+      <scope>provided</scope>
+    </dependency>
   </dependencies>
   <build>
     <sourceDirectory>src</sourceDirectory>
index 440f73bfb5817cc13a3db0dfa81ec6b6668799f0..80aa622cf84b543724ae1782c8abb08031a02272 100644 (file)
@@ -5,6 +5,11 @@ import java.util.List;
 
 public class RequirePlugin extends SonarPlugin {
 
+  public RequirePlugin() {
+    // call a class that is in the api published by the base plugin
+    new org.sonar.plugins.testbase.api.BaseApi().doNothing();
+  }
+
   public List getExtensions() {
     return Collections.emptyList();
   }
index ac1f9f68e46a7d4e6e11731b44e2c6a73d12fb92..abf9bbed5eb994e6ec5d6195e8d3cd465f764570 100644 (file)
Binary files a/server/sonar-server/src/test/projects/test-require-plugin/target/test-require-plugin-0.1-SNAPSHOT.jar and b/server/sonar-server/src/test/projects/test-require-plugin/target/test-require-plugin-0.1-SNAPSHOT.jar differ
index ca207b10c191ad3f5fb07e995966012934bade89..58aee04720664c64b13947975151dfd4d49798bf 100644 (file)
       <version>4.5.4</version>
       <scope>provided</scope>
     </dependency>
+    <dependency>
+      <groupId>org.codehaus.sonar.tests</groupId>
+      <artifactId>test-base-plugin</artifactId>
+      <version>0.1-SNAPSHOT</version>
+      <type>sonar-plugin</type>
+      <scope>provided</scope>
+    </dependency>
   </dependencies>
   <build>
     <sourceDirectory>src</sourceDirectory>
index 440f73bfb5817cc13a3db0dfa81ec6b6668799f0..80aa622cf84b543724ae1782c8abb08031a02272 100644 (file)
@@ -5,6 +5,11 @@ import java.util.List;
 
 public class RequirePlugin extends SonarPlugin {
 
+  public RequirePlugin() {
+    // call a class that is in the api published by the base plugin
+    new org.sonar.plugins.testbase.api.BaseApi().doNothing();
+  }
+
   public List getExtensions() {
     return Collections.emptyList();
   }
index 3437dfee71c1c77810f61a9db63cb0eec5a65f2b..671f69f10f84a83d0c0f63e0b7e9c550d8bffb2c 100644 (file)
Binary files a/server/sonar-server/src/test/projects/test-requirenew-plugin/target/test-requirenew-plugin-0.1-SNAPSHOT.jar and b/server/sonar-server/src/test/projects/test-requirenew-plugin/target/test-requirenew-plugin-0.1-SNAPSHOT.jar differ
index 7afda90702125826da045e5a21103755f474f6af..8722703d7f77640d2eb1aa84771d2e0db938d476 100644 (file)
@@ -36,6 +36,7 @@ import java.net.URL;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
+import org.sonar.classloader.Mask;
 
 import static java.util.Arrays.asList;
 import static org.sonar.classloader.ClassloaderBuilder.LoadingOrder.SELF_FIRST;
@@ -56,7 +57,7 @@ import static org.sonar.classloader.ClassloaderBuilder.LoadingOrder.SELF_FIRST;
  */
 public class PluginLoader implements BatchComponent, ServerComponent {
 
-  private static final String[] DEFAULT_SHARED_RESOURCES = {"org/sonar/plugins/", "com/sonar/plugins/", "com/sonarsource/plugins/"};
+  private static final String[] DEFAULT_SHARED_RESOURCES = {"org/sonar/plugins", "com/sonar/plugins", "com/sonarsource/plugins"};
 
   private final PluginExploder exploder;
 
@@ -91,7 +92,7 @@ public class PluginLoader implements BatchComponent, ServerComponent {
       def.addMainClass(info.getKey(), info.getMainClass());
 
       for (String defaultSharedResource : DEFAULT_SHARED_RESOURCES) {
-        def.getMask().addInclusion(defaultSharedResource + info.getKey() + "/");
+        def.getMask().addInclusion(String.format("%s/%s/api/", defaultSharedResource, info.getKey()));
       }
       if (Strings.isNullOrEmpty(info.getBasePlugin())) {
         // The plugins that extend other plugins can only add some files to classloader.
@@ -110,11 +111,17 @@ public class PluginLoader implements BatchComponent, ServerComponent {
     for (ClassloaderDef def : defs) {
       builder
         .newClassloader(def.getBasePluginKey(), getClass().getClassLoader())
+        // resources to be exported to other plugin classloaders (siblings)
         .setExportMask(def.getBasePluginKey(), def.getMask())
         .setLoadingOrder(def.getBasePluginKey(), def.isSelfFirstStrategy() ? SELF_FIRST : LoadingOrder.PARENT_FIRST);
       for (File file : def.getFiles()) {
         builder.addURL(def.getBasePluginKey(), fileToUrl(file));
       }
+      for (ClassloaderDef sibling : defs) {
+        if (!sibling.getBasePluginKey().equals(def.getBasePluginKey())) {
+          builder.addSibling(def.getBasePluginKey(), sibling.getBasePluginKey(), new Mask());
+        }
+      }
     }
     Map<String, ClassLoader> classloadersByBasePluginKey = builder.build();
     for (ClassloaderDef def : defs) {