Browse Source

SONAR-6517 fix sharing of plugin api packages across plugin classloaders

tags/5.2-RC1
Simon Brandhof 9 years ago
parent
commit
ed48e4f187

+ 6
- 0
server/sonar-server/src/test/projects/test-base-plugin-v2/src/org/sonar/plugins/testbase/api/BaseApi.java View File

@@ -0,0 +1,6 @@
package org.sonar.plugins.testbase.api;

public class BaseApi {
public void doNothing() {
}
}

BIN
server/sonar-server/src/test/projects/test-base-plugin-v2/target/test-base-plugin-0.2-SNAPSHOT.jar View File


+ 6
- 0
server/sonar-server/src/test/projects/test-base-plugin/src/org/sonar/plugins/testbase/api/BaseApi.java View File

@@ -0,0 +1,6 @@
package org.sonar.plugins.testbase.api;

public class BaseApi {
public void doNothing() {
}
}

BIN
server/sonar-server/src/test/projects/test-base-plugin/target/test-base-plugin-0.1-SNAPSHOT.jar View File


BIN
server/sonar-server/src/test/projects/test-core-plugin/target/test-core-plugin-0.1-SNAPSHOT.jar View File


BIN
server/sonar-server/src/test/projects/test-extend-plugin/target/test-extend-plugin-0.1-SNAPSHOT.jar View File


BIN
server/sonar-server/src/test/projects/test-libs-plugin/target/test-libs-plugin-0.1-SNAPSHOT.jar View File


+ 7
- 0
server/sonar-server/src/test/projects/test-require-plugin/pom.xml View File

@@ -16,6 +16,13 @@
<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>

+ 5
- 0
server/sonar-server/src/test/projects/test-require-plugin/src/RequirePlugin.java View 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();
}

BIN
server/sonar-server/src/test/projects/test-require-plugin/target/test-require-plugin-0.1-SNAPSHOT.jar View File


+ 7
- 0
server/sonar-server/src/test/projects/test-requirenew-plugin/pom.xml View File

@@ -16,6 +16,13 @@
<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>

+ 5
- 0
server/sonar-server/src/test/projects/test-requirenew-plugin/src/RequirePlugin.java View 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();
}

BIN
server/sonar-server/src/test/projects/test-requirenew-plugin/target/test-requirenew-plugin-0.1-SNAPSHOT.jar View File


+ 9
- 2
sonar-core/src/main/java/org/sonar/core/platform/PluginLoader.java View 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) {

Loading…
Cancel
Save