]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5927 Blacklist the build breaker plugin in preview mode
authorJulien HENRY <julien.henry@sonarsource.com>
Wed, 25 Feb 2015 17:49:15 +0000 (18:49 +0100)
committerJulien HENRY <julien.henry@sonarsource.com>
Wed, 25 Feb 2015 17:51:52 +0000 (18:51 +0100)
sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginRepository.java
sonar-batch/src/main/java/org/sonar/batch/bootstrap/DefaultPluginsReferential.java [deleted file]
sonar-batch/src/main/java/org/sonar/batch/bootstrap/DefaultPluginsRepository.java [new file with mode: 0644]
sonar-batch/src/main/java/org/sonar/batch/bootstrap/GlobalContainer.java
sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginRepositoryTest.java
sonar-batch/src/test/java/org/sonar/batch/bootstrap/DefaultPluginsReferentialTest.java [deleted file]
sonar-batch/src/test/java/org/sonar/batch/bootstrap/DefaultPluginsRepositoryTest.java [new file with mode: 0644]

index 42f21fe91044bf48c2d655e4b3faea1b03a2224e..b8a44c0d97cf64b8c1ad75fd89e7f4e2d67b3ba2 100644 (file)
@@ -37,11 +37,7 @@ import org.sonar.core.plugins.RemotePlugin;
 
 import java.io.File;
 import java.text.MessageFormat;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Sets.newHashSet;
@@ -132,6 +128,7 @@ public class BatchPluginRepository implements PluginRepository {
   }
 
   static class PluginFilter {
+    private static final String BUILDBREAKER_PLUGIN_KEY = "buildbreaker";
     private static final String PROPERTY_IS_DEPRECATED_MSG = "Property {0} is deprecated. Please use {1} instead.";
     Set<String> whites = newHashSet(), blacks = newHashSet();
     private DefaultAnalysisMode mode;
@@ -182,6 +179,11 @@ public class BatchPluginRepository implements PluginRepository {
         return !mode.isMediumTest();
       }
 
+      if (BUILDBREAKER_PLUGIN_KEY.equals(pluginKey) && mode.isPreview()) {
+        LOG.info("Build Breaker plugin is no more supported in preview/incremental mode");
+        return false;
+      }
+
       List<String> mergeList = newArrayList(blacks);
       mergeList.removeAll(whites);
       return mergeList.isEmpty() || !mergeList.contains(pluginKey);
diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/DefaultPluginsReferential.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/DefaultPluginsReferential.java
deleted file mode 100644 (file)
index d023b5e..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.batch.bootstrap;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.CharUtils;
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.sonar.api.SonarPlugin;
-import org.sonar.api.platform.PluginMetadata;
-import org.sonar.core.plugins.RemotePlugin;
-import org.sonar.core.plugins.RemotePluginFile;
-import org.sonar.home.cache.FileCache;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-/**
- * A {@link PluginsRepository} implementation that put downloaded plugins in a FS cache.
- */
-public class DefaultPluginsReferential implements PluginsRepository {
-
-  private static final Logger LOG = LoggerFactory.getLogger(DefaultPluginsReferential.class);
-
-  private ServerClient server;
-  private FileCache fileCache;
-
-  public DefaultPluginsReferential(FileCache fileCache, ServerClient server) {
-    this.server = server;
-    this.fileCache = fileCache;
-  }
-
-  @Override
-  public File pluginFile(final RemotePlugin remote) {
-    try {
-      final RemotePluginFile file = remote.file();
-      return fileCache.get(file.getFilename(), file.getHash(), new FileCache.Downloader() {
-        @Override
-        public void download(String filename, File toFile) throws IOException {
-          String url = "/deploy/plugins/" + remote.getKey() + "/" + file.getFilename();
-          if (LOG.isDebugEnabled()) {
-            LOG.debug("Download {} to {}", url, toFile.getAbsolutePath());
-          } else {
-            LOG.info("Download {}", file.getFilename());
-          }
-          server.download(url, toFile);
-        }
-      });
-
-    } catch (Exception e) {
-      throw new IllegalStateException("Fail to download plugin: " + remote.getKey(), e);
-    }
-  }
-
-  @Override
-  public List<RemotePlugin> pluginList() {
-    String url = "/deploy/plugins/index.txt";
-    try {
-      LOG.debug("Download index of plugins");
-      String indexContent = server.request(url);
-      String[] rows = StringUtils.split(indexContent, CharUtils.LF);
-      List<RemotePlugin> remoteLocations = Lists.newArrayList();
-      for (String row : rows) {
-        remoteLocations.add(RemotePlugin.unmarshal(row));
-      }
-      return remoteLocations;
-
-    } catch (Exception e) {
-      throw new IllegalStateException("Fail to download plugins index: " + url, e);
-    }
-  }
-
-  @Override
-  public Map<PluginMetadata, SonarPlugin> localPlugins() {
-    return Collections.emptyMap();
-  }
-
-}
diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/DefaultPluginsRepository.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/DefaultPluginsRepository.java
new file mode 100644 (file)
index 0000000..2687ebc
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.batch.bootstrap;
+
+import com.google.common.collect.Lists;
+import org.apache.commons.lang.CharUtils;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.sonar.api.SonarPlugin;
+import org.sonar.api.platform.PluginMetadata;
+import org.sonar.core.plugins.RemotePlugin;
+import org.sonar.core.plugins.RemotePluginFile;
+import org.sonar.home.cache.FileCache;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A {@link PluginsRepository} implementation that put downloaded plugins in a FS cache.
+ */
+public class DefaultPluginsRepository implements PluginsRepository {
+
+  private static final Logger LOG = LoggerFactory.getLogger(DefaultPluginsRepository.class);
+
+  private ServerClient server;
+  private FileCache fileCache;
+
+  public DefaultPluginsRepository(FileCache fileCache, ServerClient server) {
+    this.server = server;
+    this.fileCache = fileCache;
+  }
+
+  @Override
+  public File pluginFile(final RemotePlugin remote) {
+    try {
+      final RemotePluginFile file = remote.file();
+      return fileCache.get(file.getFilename(), file.getHash(), new FileCache.Downloader() {
+        @Override
+        public void download(String filename, File toFile) throws IOException {
+          String url = "/deploy/plugins/" + remote.getKey() + "/" + file.getFilename();
+          if (LOG.isDebugEnabled()) {
+            LOG.debug("Download {} to {}", url, toFile.getAbsolutePath());
+          } else {
+            LOG.info("Download {}", file.getFilename());
+          }
+          server.download(url, toFile);
+        }
+      });
+
+    } catch (Exception e) {
+      throw new IllegalStateException("Fail to download plugin: " + remote.getKey(), e);
+    }
+  }
+
+  @Override
+  public List<RemotePlugin> pluginList() {
+    String url = "/deploy/plugins/index.txt";
+    try {
+      LOG.debug("Download index of plugins");
+      String indexContent = server.request(url);
+      String[] rows = StringUtils.split(indexContent, CharUtils.LF);
+      List<RemotePlugin> remoteLocations = Lists.newArrayList();
+      for (String row : rows) {
+        remoteLocations.add(RemotePlugin.unmarshal(row));
+      }
+      return remoteLocations;
+
+    } catch (Exception e) {
+      throw new IllegalStateException("Fail to download plugins index: " + url, e);
+    }
+  }
+
+  @Override
+  public Map<PluginMetadata, SonarPlugin> localPlugins() {
+    return Collections.emptyMap();
+  }
+
+}
index 011329d9421f4646732c126fa85624f198c8512d..bffee518e54ed62d12abb0c20436dc3171a16610 100644 (file)
@@ -96,7 +96,7 @@ public class GlobalContainer extends ComponentContainer {
       new GlobalRepositoriesProvider(),
       UserRepository.class);
     if (getComponentByType(PluginsRepository.class) == null) {
-      add(DefaultPluginsReferential.class);
+      add(DefaultPluginsRepository.class);
     }
     if (getComponentByType(GlobalRepositoriesLoader.class) == null) {
       add(DefaultGlobalRepositoriesLoader.class);
index d0c959abb877cc355ca4c57f33ca29f3582afa9a..66a499b01c079e2c845a185e0fee499467f2b845 100644 (file)
@@ -53,6 +53,7 @@ public class BatchPluginRepositoryTest {
   @Before
   public void before() throws IOException {
     mode = mock(DefaultAnalysisMode.class);
+    when(mode.isPreview()).thenReturn(false);
     userHome = temp.newFolder();
     cache = new FileCacheBuilder().setUserHome(userHome).build();
   }
@@ -68,7 +69,7 @@ public class BatchPluginRepositoryTest {
   public void shouldLoadPlugin() throws Exception {
     RemotePlugin checkstyle = new RemotePlugin("checkstyle", true);
 
-    DefaultPluginsReferential downloader = mock(DefaultPluginsReferential.class);
+    DefaultPluginsRepository downloader = mock(DefaultPluginsRepository.class);
     when(downloader.pluginFile(checkstyle)).thenReturn(fileFromCache("sonar-checkstyle-plugin-2.8.jar"));
 
     repository = new BatchPluginRepository(downloader, new Settings(), mode, new BatchPluginJarInstaller(cache));
@@ -86,7 +87,7 @@ public class BatchPluginRepositoryTest {
     RemotePlugin checkstyle = new RemotePlugin("checkstyle", true);
     RemotePlugin checkstyleExt = new RemotePlugin("checkstyleextensions", false);
 
-    DefaultPluginsReferential downloader = mock(DefaultPluginsReferential.class);
+    DefaultPluginsRepository downloader = mock(DefaultPluginsRepository.class);
     when(downloader.pluginFile(checkstyle)).thenReturn(fileFromCache("sonar-checkstyle-plugin-2.8.jar"));
     when(downloader.pluginFile(checkstyleExt)).thenReturn(fileFromCache("sonar-checkstyle-extensions-plugin-0.1-SNAPSHOT.jar"));
 
@@ -106,7 +107,7 @@ public class BatchPluginRepositoryTest {
     RemotePlugin checkstyle = new RemotePlugin("checkstyle", true);
     RemotePlugin checkstyleExt = new RemotePlugin("checkstyleextensions", false);
 
-    DefaultPluginsReferential downloader = mock(DefaultPluginsReferential.class);
+    DefaultPluginsRepository downloader = mock(DefaultPluginsRepository.class);
     when(downloader.pluginFile(checkstyle)).thenReturn(fileFromCache("sonar-checkstyle-plugin-2.8.jar"));
     when(downloader.pluginFile(checkstyleExt)).thenReturn(fileFromCache("sonar-checkstyle-extensions-plugin-0.1-SNAPSHOT.jar"));
 
@@ -131,6 +132,14 @@ public class BatchPluginRepositoryTest {
   public void shouldAlwaysAcceptIfNoWhiteListAndBlackList() {
     BatchPluginRepository.PluginFilter filter = new BatchPluginRepository.PluginFilter(new Settings(), mode);
     assertThat(filter.accepts("pmd")).isTrue();
+    assertThat(filter.accepts("buildbreaker")).isTrue();
+  }
+
+  @Test
+  public void shouldBlackListBuildBreakerInPreviewMode() {
+    when(mode.isPreview()).thenReturn(true);
+    BatchPluginRepository.PluginFilter filter = new BatchPluginRepository.PluginFilter(new Settings(), mode);
+    assertThat(filter.accepts("buildbreaker")).isFalse();
   }
 
   @Test
diff --git a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/DefaultPluginsReferentialTest.java b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/DefaultPluginsReferentialTest.java
deleted file mode 100644 (file)
index 2abff9e..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.batch.bootstrap;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.rules.TemporaryFolder;
-import org.sonar.core.plugins.RemotePlugin;
-import org.sonar.home.cache.FileCache;
-
-import java.io.File;
-import java.util.List;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class DefaultPluginsReferentialTest {
-
-  @Rule
-  public TemporaryFolder temp = new TemporaryFolder();
-
-  @Rule
-  public ExpectedException thrown = ExpectedException.none();
-
-  @Test
-  public void should_request_list_of_plugins() {
-    FileCache cache = mock(FileCache.class);
-    ServerClient server = mock(ServerClient.class);
-    when(server.request("/deploy/plugins/index.txt")).thenReturn("checkstyle,true\nsqale,false");
-    DefaultPluginsReferential downloader = new DefaultPluginsReferential(cache, server);
-
-    List<RemotePlugin> plugins = downloader.pluginList();
-    assertThat(plugins).hasSize(2);
-    assertThat(plugins.get(0).getKey()).isEqualTo("checkstyle");
-    assertThat(plugins.get(0).isCore()).isTrue();
-    assertThat(plugins.get(1).getKey()).isEqualTo("sqale");
-    assertThat(plugins.get(1).isCore()).isFalse();
-  }
-
-  @Test
-  public void should_download_plugin() throws Exception {
-    FileCache cache = mock(FileCache.class);
-
-    File pluginJar = temp.newFile();
-    when(cache.get(eq("checkstyle-plugin.jar"), eq("fakemd5_1"), any(FileCache.Downloader.class))).thenReturn(pluginJar);
-
-    ServerClient server = mock(ServerClient.class);
-    DefaultPluginsReferential downloader = new DefaultPluginsReferential(cache, server);
-
-    RemotePlugin plugin = new RemotePlugin("checkstyle", true)
-      .setFile("checkstyle-plugin.jar", "fakemd5_1");
-    File file = downloader.pluginFile(plugin);
-
-    assertThat(file).isEqualTo(pluginJar);
-  }
-
-  @Test
-  public void should_fail_to_get_plugin_index() throws Exception {
-    thrown.expect(IllegalStateException.class);
-
-    ServerClient server = mock(ServerClient.class);
-    doThrow(new IllegalStateException()).when(server).request("/deploy/plugins/index.txt");
-
-    new DefaultPluginsReferential(mock(FileCache.class), server).pluginList();
-  }
-}
diff --git a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/DefaultPluginsRepositoryTest.java b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/DefaultPluginsRepositoryTest.java
new file mode 100644 (file)
index 0000000..f03d16b
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.batch.bootstrap;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.rules.TemporaryFolder;
+import org.sonar.core.plugins.RemotePlugin;
+import org.sonar.home.cache.FileCache;
+
+import java.io.File;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class DefaultPluginsRepositoryTest {
+
+  @Rule
+  public TemporaryFolder temp = new TemporaryFolder();
+
+  @Rule
+  public ExpectedException thrown = ExpectedException.none();
+
+  @Test
+  public void should_request_list_of_plugins() {
+    FileCache cache = mock(FileCache.class);
+    ServerClient server = mock(ServerClient.class);
+    when(server.request("/deploy/plugins/index.txt")).thenReturn("checkstyle,true\nsqale,false");
+    DefaultPluginsRepository downloader = new DefaultPluginsRepository(cache, server);
+
+    List<RemotePlugin> plugins = downloader.pluginList();
+    assertThat(plugins).hasSize(2);
+    assertThat(plugins.get(0).getKey()).isEqualTo("checkstyle");
+    assertThat(plugins.get(0).isCore()).isTrue();
+    assertThat(plugins.get(1).getKey()).isEqualTo("sqale");
+    assertThat(plugins.get(1).isCore()).isFalse();
+  }
+
+  @Test
+  public void should_download_plugin() throws Exception {
+    FileCache cache = mock(FileCache.class);
+
+    File pluginJar = temp.newFile();
+    when(cache.get(eq("checkstyle-plugin.jar"), eq("fakemd5_1"), any(FileCache.Downloader.class))).thenReturn(pluginJar);
+
+    ServerClient server = mock(ServerClient.class);
+    DefaultPluginsRepository downloader = new DefaultPluginsRepository(cache, server);
+
+    RemotePlugin plugin = new RemotePlugin("checkstyle", true)
+      .setFile("checkstyle-plugin.jar", "fakemd5_1");
+    File file = downloader.pluginFile(plugin);
+
+    assertThat(file).isEqualTo(pluginJar);
+  }
+
+  @Test
+  public void should_fail_to_get_plugin_index() throws Exception {
+    thrown.expect(IllegalStateException.class);
+
+    ServerClient server = mock(ServerClient.class);
+    doThrow(new IllegalStateException()).when(server).request("/deploy/plugins/index.txt");
+
+    new DefaultPluginsRepository(mock(FileCache.class), server).pluginList();
+  }
+}