aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulien HENRY <julien.henry@sonarsource.com>2013-01-29 09:56:48 +0100
committerJulien HENRY <julien.henry@sonarsource.com>2013-01-29 09:58:11 +0100
commit9f3de2ad8b0aaff9ec309a50a1b5d0f3c578d7a8 (patch)
treed895d242da60ed1208cddf81d5fd4dfea3949aa5
parent62806519276a867d5f243f18fc5e8b12e34f5b69 (diff)
downloadsonarqube-9f3de2ad8b0aaff9ec309a50a1b5d0f3c578d7a8.tar.gz
sonarqube-9f3de2ad8b0aaff9ec309a50a1b5d0f3c578d7a8.zip
SONAR-2291 Don't extract plugins in the cache folder
but instead extract them in a temporary location.
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginRepository.java12
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginRepositoryTest.java29
-rw-r--r--sonar-core/src/main/java/org/sonar/core/plugins/PluginInstaller.java24
3 files changed, 38 insertions, 27 deletions
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 1ea9307364d..be4e3837230 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
@@ -52,9 +52,11 @@ public class BatchPluginRepository implements PluginRepository {
private Map<String, PluginMetadata> metadataByKey;
private Settings settings;
private PluginClassloaders classLoaders;
+ private TempDirectories workingDirectories;
- public BatchPluginRepository(PluginDownloader pluginDownloader, Settings settings) {
+ public BatchPluginRepository(PluginDownloader pluginDownloader, TempDirectories workingDirectories, Settings settings) {
this.pluginDownloader = pluginDownloader;
+ this.workingDirectories = workingDirectories;
this.settings = settings;
}
@@ -71,7 +73,9 @@ public class BatchPluginRepository implements PluginRepository {
if (filter.accepts(remote.getKey())) {
List<File> pluginFiles = pluginDownloader.downloadPlugin(remote);
List<File> extensionFiles = pluginFiles.subList(1, pluginFiles.size());
- PluginMetadata metadata = extractor.installInSameLocation(pluginFiles.get(0), remote.isCore(), extensionFiles);
+ File targetDir = workingDirectories.getDir("plugins/" + remote.getKey());
+ LOG.debug("Installing plugin " + remote.getKey() + " into " + targetDir);
+ PluginMetadata metadata = extractor.install(pluginFiles.get(0), remote.isCore(), extensionFiles, targetDir);
if (StringUtils.isBlank(metadata.getBasePlugin()) || filter.accepts(metadata.getBasePlugin())) {
LOG.debug("Excluded plugin: " + metadata.getKey());
metadataByKey.put(metadata.getKey(), metadata);
@@ -125,9 +129,9 @@ public class BatchPluginRepository implements PluginRepository {
// These default values are not supported by Settings because the class CorePlugin
// is not loaded yet.
whites.addAll(propertyValues(settings,
- CoreProperties.DRY_RUN_INCLUDE_PLUGINS, CoreProperties.DRY_RUN_INCLUDE_PLUGINS_DEFAULT_VALUE));
+ CoreProperties.DRY_RUN_INCLUDE_PLUGINS, CoreProperties.DRY_RUN_INCLUDE_PLUGINS_DEFAULT_VALUE));
blacks.addAll(propertyValues(settings,
- CoreProperties.DRY_RUN_EXCLUDE_PLUGINS, CoreProperties.DRY_RUN_EXCLUDE_PLUGINS_DEFAULT_VALUE));
+ CoreProperties.DRY_RUN_EXCLUDE_PLUGINS, CoreProperties.DRY_RUN_EXCLUDE_PLUGINS_DEFAULT_VALUE));
}
if (!whites.isEmpty()) {
LOG.info("Include plugins: " + Joiner.on(", ").join(whites));
diff --git a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginRepositoryTest.java b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginRepositoryTest.java
index f0cf8a22478..f7af9003d62 100644
--- a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginRepositoryTest.java
+++ b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginRepositoryTest.java
@@ -22,7 +22,9 @@ package org.sonar.batch.bootstrap;
import com.google.common.collect.Lists;
import org.codehaus.plexus.util.FileUtils;
import org.junit.After;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
import org.sonar.api.CoreProperties;
import org.sonar.api.config.Settings;
import org.sonar.core.plugins.RemotePlugin;
@@ -40,6 +42,9 @@ import static org.mockito.Mockito.when;
public class BatchPluginRepositoryTest {
+ @Rule
+ public TemporaryFolder temp = new TemporaryFolder();
+
private BatchPluginRepository repository;
@After
@@ -51,12 +56,15 @@ public class BatchPluginRepositoryTest {
@Test
public void shouldLoadPlugin() throws IOException {
+ TempDirectories tempDirs = mock(TempDirectories.class);
+ File toDir = temp.newFolder();
+ when(tempDirs.getDir("plugins/checkstyle")).thenReturn(toDir);
RemotePlugin checkstyle = new RemotePlugin("checkstyle", true);
PluginDownloader downloader = mock(PluginDownloader.class);
when(downloader.downloadPlugin(checkstyle)).thenReturn(copyFiles("sonar-checkstyle-plugin-2.8.jar"));
- repository = new BatchPluginRepository(downloader, new Settings());
+ repository = new BatchPluginRepository(downloader, tempDirs, new Settings());
repository.doStart(Arrays.asList(checkstyle));
@@ -68,6 +76,11 @@ public class BatchPluginRepositoryTest {
@Test
public void shouldLoadPluginExtension() throws IOException {
+ TempDirectories tempDirs = mock(TempDirectories.class);
+ File toDir1 = temp.newFolder();
+ File toDir2 = temp.newFolder();
+ when(tempDirs.getDir("plugins/checkstyle")).thenReturn(toDir1);
+ when(tempDirs.getDir("plugins/checkstyleextensions")).thenReturn(toDir2);
RemotePlugin checkstyle = new RemotePlugin("checkstyle", true);
RemotePlugin checkstyleExt = new RemotePlugin("checkstyleextensions", false);
@@ -75,7 +88,7 @@ public class BatchPluginRepositoryTest {
when(downloader.downloadPlugin(checkstyle)).thenReturn(copyFiles("sonar-checkstyle-plugin-2.8.jar"));
when(downloader.downloadPlugin(checkstyleExt)).thenReturn(copyFiles("sonar-checkstyle-extensions-plugin-0.1-SNAPSHOT.jar"));
- repository = new BatchPluginRepository(downloader, new Settings());
+ repository = new BatchPluginRepository(downloader, tempDirs, new Settings());
repository.doStart(Arrays.asList(checkstyle, checkstyleExt));
@@ -88,13 +101,16 @@ public class BatchPluginRepositoryTest {
@Test
public void shouldLoadPluginDeprecatedExtensions() throws IOException {
+ TempDirectories tempDirs = mock(TempDirectories.class);
+ File toDir = temp.newFolder();
+ when(tempDirs.getDir("plugins/checkstyle")).thenReturn(toDir);
RemotePlugin checkstyle = new RemotePlugin("checkstyle", true);
checkstyle.getFiles().add(new RemotePluginFile("checkstyle-ext.xml", "fakemd5"));
PluginDownloader downloader = mock(PluginDownloader.class);
when(downloader.downloadPlugin(checkstyle)).thenReturn(copyFiles("sonar-checkstyle-plugin-2.8.jar", "checkstyle-ext.xml"));
- repository = new BatchPluginRepository(downloader, new Settings());
+ repository = new BatchPluginRepository(downloader, tempDirs, new Settings());
repository.doStart(Arrays.asList(checkstyle));
@@ -107,6 +123,11 @@ public class BatchPluginRepositoryTest {
@Test
public void shouldExcludePluginAndItsExtensions() throws IOException {
+ TempDirectories tempDirs = mock(TempDirectories.class);
+ File toDir1 = temp.newFolder();
+ File toDir2 = temp.newFolder();
+ when(tempDirs.getDir("plugins/checkstyle")).thenReturn(toDir1);
+ when(tempDirs.getDir("plugins/checkstyleextensions")).thenReturn(toDir2);
RemotePlugin checkstyle = new RemotePlugin("checkstyle", true);
RemotePlugin checkstyleExt = new RemotePlugin("checkstyleextensions", false);
@@ -116,7 +137,7 @@ public class BatchPluginRepositoryTest {
Settings settings = new Settings();
settings.setProperty(CoreProperties.BATCH_EXCLUDE_PLUGINS, "checkstyle");
- repository = new BatchPluginRepository(downloader, settings);
+ repository = new BatchPluginRepository(downloader, tempDirs, settings);
repository.doStart(Arrays.asList(checkstyle, checkstyleExt));
diff --git a/sonar-core/src/main/java/org/sonar/core/plugins/PluginInstaller.java b/sonar-core/src/main/java/org/sonar/core/plugins/PluginInstaller.java
index df935471b71..4384ff0d63f 100644
--- a/sonar-core/src/main/java/org/sonar/core/plugins/PluginInstaller.java
+++ b/sonar-core/src/main/java/org/sonar/core/plugins/PluginInstaller.java
@@ -20,25 +20,17 @@
package org.sonar.core.plugins;
import org.apache.commons.io.FileUtils;
-import org.sonar.api.Plugin;
import org.sonar.api.utils.SonarException;
import org.sonar.api.utils.ZipUtils;
-import org.sonar.updatecenter.common.PluginKeyUtils;
import org.sonar.updatecenter.common.PluginManifest;
import java.io.File;
import java.io.IOException;
-import java.net.URL;
-import java.net.URLClassLoader;
import java.util.List;
import java.util.zip.ZipEntry;
public class PluginInstaller {
- public DefaultPluginMetadata installInSameLocation(File pluginFile, boolean isCore, List<File> deprecatedExtensions) {
- return install(pluginFile, isCore, deprecatedExtensions, null);
- }
-
public DefaultPluginMetadata install(File pluginFile, boolean isCore, List<File> deprecatedExtensions, File toDir) {
DefaultPluginMetadata metadata = extractMetadata(pluginFile, isCore);
metadata.setDeprecatedExtensions(deprecatedExtensions);
@@ -60,17 +52,11 @@ public class PluginInstaller {
}
private File copyPlugin(DefaultPluginMetadata metadata, File toDir, File pluginFile) throws IOException {
- File pluginBasedir;
- if (toDir != null) {
- pluginBasedir = toDir;
- FileUtils.forceMkdir(pluginBasedir);
- File targetFile = new File(pluginBasedir, pluginFile.getName());
- FileUtils.copyFile(pluginFile, targetFile);
- metadata.addDeployedFile(targetFile);
- } else {
- pluginBasedir = pluginFile.getParentFile();
- metadata.addDeployedFile(pluginFile);
- }
+ File pluginBasedir = toDir;
+ FileUtils.forceMkdir(pluginBasedir);
+ File targetFile = new File(pluginBasedir, pluginFile.getName());
+ FileUtils.copyFile(pluginFile, targetFile);
+ metadata.addDeployedFile(targetFile);
return pluginBasedir;
}