aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulien HENRY <julien.henry@sonarsource.com>2017-01-05 11:24:54 +0100
committerJulien HENRY <henryju@yahoo.fr>2017-01-10 20:52:16 +0100
commitfafd6a2b35d2b7947a7727b10560e1f4c0a90e81 (patch)
tree31aed5897e2e8af36effa3d4cd658fa278e6c88c
parentb0ff5f224d41bdb89a4a42e5500ce4f830c7ab01 (diff)
downloadsonarqube-fafd6a2b35d2b7947a7727b10560e1f4c0a90e81.tar.gz
sonarqube-fafd6a2b35d2b7947a7727b10560e1f4c0a90e81.zip
SONAR-8573 Use api/settings to load global settings
-rw-r--r--it/it-tests/src/test/java/it/authorisation/ExecuteAnalysisPermissionTest.java2
-rw-r--r--plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/XooPlugin.java6
-rw-r--r--plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/XooPluginTest.java4
-rw-r--r--sonar-core/src/main/java/org/sonar/core/config/CorePropertyDefinitions.java6
-rw-r--r--sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalContainer.java3
-rw-r--r--sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalSettings.java10
-rw-r--r--sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/DefaultSettingsLoader.java109
-rw-r--r--sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/SettingsLoader.java26
-rw-r--r--sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/package-info.java23
-rw-r--r--sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/GlobalSettingsTest.java27
-rw-r--r--sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java13
-rw-r--r--sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/log/ExceptionHandlingMediumTest.java29
-rw-r--r--sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/settings/DefaultSettingsLoaderTest.java63
-rw-r--r--sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleSettingsTest.java4
-rw-r--r--sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectSettingsTest.java4
15 files changed, 284 insertions, 45 deletions
diff --git a/it/it-tests/src/test/java/it/authorisation/ExecuteAnalysisPermissionTest.java b/it/it-tests/src/test/java/it/authorisation/ExecuteAnalysisPermissionTest.java
index c7438fb61dc..a36a8d5ca84 100644
--- a/it/it-tests/src/test/java/it/authorisation/ExecuteAnalysisPermissionTest.java
+++ b/it/it-tests/src/test/java/it/authorisation/ExecuteAnalysisPermissionTest.java
@@ -82,10 +82,10 @@ public class ExecuteAnalysisPermissionTest {
"You're only authorized to execute a local (preview) SonarQube analysis without pushing the results to the SonarQube server. Please contact your SonarQube administrator.");
}
+ removeProjectPermission("anyone", "sample", "user");
try {
// Execute anonymous analysis
executeAnonymousAnalysis();
- ;
fail();
} catch (BuildFailureException e) {
assertThat(e.getResult().getLogs()).contains(
diff --git a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/XooPlugin.java b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/XooPlugin.java
index 9a84189608f..5dd494efb8e 100644
--- a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/XooPlugin.java
+++ b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/XooPlugin.java
@@ -20,6 +20,7 @@
package org.sonar.xoo;
import org.sonar.api.Plugin;
+import org.sonar.api.PropertyType;
import org.sonar.api.SonarProduct;
import org.sonar.api.config.PropertyDefinition;
import org.sonar.api.resources.Qualifiers;
@@ -81,6 +82,11 @@ public class XooPlugin implements Plugin {
.subCategory("General")
.onQualifiers(Qualifiers.PROJECT)
.build(),
+ // Used by DuplicationsTest. If not declared it is not returned by api/settings
+ PropertyDefinition.builder("sonar.cpd.xoo.minimumTokens")
+ .onQualifiers(Qualifiers.PROJECT)
+ .type(PropertyType.INTEGER)
+ .build(),
Xoo.class,
Xoo2.class,
XooRulesDefinition.class,
diff --git a/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/XooPluginTest.java b/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/XooPluginTest.java
index 03d8f037c4b..1969b18c482 100644
--- a/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/XooPluginTest.java
+++ b/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/XooPluginTest.java
@@ -36,7 +36,7 @@ public class XooPluginTest {
SonarRuntime runtime = SonarRuntimeImpl.forSonarLint(Version.parse("5.4"));
Plugin.Context context = new Plugin.Context(runtime);
new XooPlugin().define(context);
- assertThat(context.getExtensions()).hasSize(41).doesNotContain(CpdTokenizerSensor.class);
+ assertThat(context.getExtensions()).hasSize(42).doesNotContain(CpdTokenizerSensor.class);
}
@Test
@@ -44,6 +44,6 @@ public class XooPluginTest {
SonarRuntime runtime = SonarRuntimeImpl.forSonarQube(Version.parse("5.5"), SonarQubeSide.SCANNER);
Plugin.Context context = new Plugin.Context(runtime);
new XooPlugin().define(context);
- assertThat(context.getExtensions()).hasSize(44).contains(CpdTokenizerSensor.class);
+ assertThat(context.getExtensions()).hasSize(45).contains(CpdTokenizerSensor.class);
}
}
diff --git a/sonar-core/src/main/java/org/sonar/core/config/CorePropertyDefinitions.java b/sonar-core/src/main/java/org/sonar/core/config/CorePropertyDefinitions.java
index f896ae44ddd..12bbe0a1185 100644
--- a/sonar-core/src/main/java/org/sonar/core/config/CorePropertyDefinitions.java
+++ b/sonar-core/src/main/java/org/sonar/core/config/CorePropertyDefinitions.java
@@ -112,14 +112,16 @@ public class CorePropertyDefinitions {
.build(),
PropertyDefinition.builder(CoreProperties.PREVIEW_INCLUDE_PLUGINS)
.name("Plugins accepted for Preview mode")
- .description("Comma-separated list of plugin keys. Those plugins will be used during preview analyses.")
+ .description("List of plugin keys. Those plugins will be used during preview analyses.")
.category(CoreProperties.CATEGORY_GENERAL)
+ .multiValues(true)
.defaultValue(CoreProperties.PREVIEW_INCLUDE_PLUGINS_DEFAULT_VALUE)
.build(),
PropertyDefinition.builder(CoreProperties.PREVIEW_EXCLUDE_PLUGINS)
.name("Plugins excluded for Preview mode")
- .description("Comma-separated list of plugin keys. Those plugins will not be used during preview analyses.")
+ .description("List of plugin keys. Those plugins will not be used during preview analyses.")
.category(CoreProperties.CATEGORY_GENERAL)
+ .multiValues(true)
.defaultValue(CoreProperties.PREVIEW_EXCLUDE_PLUGINS_DEFAULT_VALUE)
.build(),
PropertyDefinition.builder(CoreProperties.CORE_AUTHENTICATOR_REALM)
diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalContainer.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalContainer.java
index 19e2e4702fa..66811cfc6d8 100644
--- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalContainer.java
+++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalContainer.java
@@ -42,6 +42,8 @@ import org.sonar.scanner.platform.DefaultServer;
import org.sonar.scanner.repository.DefaultGlobalRepositoriesLoader;
import org.sonar.scanner.repository.GlobalRepositoriesLoader;
import org.sonar.scanner.repository.GlobalRepositoriesProvider;
+import org.sonar.scanner.repository.settings.DefaultSettingsLoader;
+import org.sonar.scanner.repository.settings.SettingsLoader;
import org.sonar.scanner.storage.StoragesManager;
import org.sonar.scanner.task.TaskContainer;
@@ -94,6 +96,7 @@ public class GlobalContainer extends ComponentContainer {
new GlobalRepositoriesProvider(),
UuidFactoryImpl.INSTANCE);
addIfMissing(ScannerPluginInstaller.class, PluginInstaller.class);
+ addIfMissing(DefaultSettingsLoader.class, SettingsLoader.class);
addIfMissing(DefaultGlobalRepositoriesLoader.class, GlobalRepositoriesLoader.class);
}
diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalSettings.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalSettings.java
index ea7d38c7720..9a11958b714 100644
--- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalSettings.java
+++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalSettings.java
@@ -30,7 +30,7 @@ import org.sonar.api.config.Encryption;
import org.sonar.api.config.PropertyDefinitions;
import org.sonar.api.config.Settings;
import org.sonar.api.utils.MessageException;
-import org.sonar.scanner.protocol.input.GlobalRepositories;
+import org.sonar.scanner.repository.settings.SettingsLoader;
public class GlobalSettings extends Settings {
@@ -47,23 +47,23 @@ public class GlobalSettings extends Settings {
"sonar.jdbc.password", JDBC_SPECIFIC_MESSAGE);
private final GlobalProperties bootstrapProps;
- private final GlobalRepositories globalReferentials;
+ private final SettingsLoader settingsLoader;
private final GlobalMode mode;
private final Map<String, String> properties = new HashMap<>();
public GlobalSettings(GlobalProperties bootstrapProps, PropertyDefinitions propertyDefinitions,
- GlobalRepositories globalReferentials, GlobalMode mode) {
+ SettingsLoader settingsLoader, GlobalMode mode) {
super(propertyDefinitions, new Encryption(bootstrapProps.property(CoreProperties.ENCRYPTION_SECRET_KEY_PATH)));
this.mode = mode;
this.bootstrapProps = bootstrapProps;
- this.globalReferentials = globalReferentials;
+ this.settingsLoader = settingsLoader;
init();
new DroppedPropertyChecker(this.getProperties(), DROPPED_PROPERTIES).checkDroppedProperties();
}
private void init() {
- addProperties(globalReferentials.globalSettings());
+ addProperties(settingsLoader.load(null));
addProperties(bootstrapProps.properties());
if (hasKey(CoreProperties.PERMANENT_SERVER_ID)) {
diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/DefaultSettingsLoader.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/DefaultSettingsLoader.java
new file mode 100644
index 00000000000..5e72ecf04ce
--- /dev/null
+++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/DefaultSettingsLoader.java
@@ -0,0 +1,109 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact AT sonarsource DOT com
+ *
+ * This program 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.
+ *
+ * This program 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.scanner.repository.settings;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Joiner;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import javax.annotation.Nullable;
+import org.apache.commons.io.IOUtils;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
+import org.sonar.api.utils.log.Profiler;
+import org.sonar.scanner.bootstrap.ScannerWsClient;
+import org.sonarqube.ws.Settings.FieldValues.Value;
+import org.sonarqube.ws.Settings.Setting;
+import org.sonarqube.ws.Settings.ValuesWsResponse;
+import org.sonarqube.ws.client.GetRequest;
+
+public class DefaultSettingsLoader implements SettingsLoader {
+
+ private ScannerWsClient wsClient;
+ private static final Logger LOG = Loggers.get(DefaultSettingsLoader.class);
+
+ public DefaultSettingsLoader(ScannerWsClient wsClient) {
+ this.wsClient = wsClient;
+ }
+
+ @Override
+ public Map<String, String> load(@Nullable String componentKey) {
+ String url = "api/settings/values.protobuf";
+ Profiler profiler = Profiler.create(LOG);
+ if (componentKey != null) {
+ url += "?component=" + componentKey;
+ profiler.startInfo("Load settings for component '" + componentKey + "'");
+ } else {
+ profiler.startInfo("Load global settings");
+ }
+ InputStream is = wsClient.call(new GetRequest(url)).contentStream();
+ ValuesWsResponse values = null;
+
+ try {
+ values = ValuesWsResponse.parseFrom(is);
+ profiler.stopInfo();
+ return toMap(values.getSettingsList());
+ } catch (IOException e) {
+ throw new IllegalStateException("Failed to load server settings", e);
+ } finally {
+ IOUtils.closeQuietly(is);
+ }
+ }
+
+ @VisibleForTesting
+ static Map<String, String> toMap(List<Setting> settingsList) {
+ Map<String, String> result = new LinkedHashMap<>();
+ for (Setting s : settingsList) {
+ if (!s.getInherited()) {
+ switch (s.getValueOneOfCase()) {
+ case VALUE:
+ result.put(s.getKey(), s.getValue());
+ break;
+ case VALUES:
+ result.put(s.getKey(), Joiner.on(',').join(s.getValues().getValuesList()));
+ break;
+ case FIELDVALUES:
+ convertPropertySetToProps(result, s);
+ break;
+ default:
+ throw new IllegalStateException("Unknow property value for " + s.getKey());
+ }
+ }
+ }
+ return result;
+ }
+
+ private static void convertPropertySetToProps(Map<String, String> result, Setting s) {
+ List<String> ids = new ArrayList<>();
+ int id = 1;
+ for (Value v : s.getFieldValues().getFieldValuesList()) {
+ for (Map.Entry<String, String> entry : v.getValue().entrySet()) {
+ result.put(s.getKey() + "." + id + "." + entry.getKey(), entry.getValue());
+ }
+ ids.add(String.valueOf(id));
+ id++;
+ }
+ result.put(s.getKey(), Joiner.on(',').join(ids));
+ }
+}
diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/SettingsLoader.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/SettingsLoader.java
new file mode 100644
index 00000000000..eeebeb6b52b
--- /dev/null
+++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/SettingsLoader.java
@@ -0,0 +1,26 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact AT sonarsource DOT com
+ *
+ * This program 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.
+ *
+ * This program 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.scanner.repository.settings;
+
+import java.util.Map;
+
+public interface SettingsLoader {
+ Map<String, String> load(String componentKey);
+}
diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/package-info.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/package-info.java
new file mode 100644
index 00000000000..f508b39ceac
--- /dev/null
+++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/package-info.java
@@ -0,0 +1,23 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact AT sonarsource DOT com
+ *
+ * This program 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.
+ *
+ * This program 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.
+ */
+@ParametersAreNonnullByDefault
+package org.sonar.scanner.repository.settings;
+
+import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/GlobalSettingsTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/GlobalSettingsTest.java
index b4613a837b3..a3b68bacf73 100644
--- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/GlobalSettingsTest.java
+++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/GlobalSettingsTest.java
@@ -19,8 +19,8 @@
*/
package org.sonar.scanner.bootstrap;
+import com.google.common.collect.ImmutableMap;
import java.util.Collections;
-
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -28,13 +28,11 @@ import org.junit.rules.ExpectedException;
import org.sonar.api.config.PropertyDefinitions;
import org.sonar.api.utils.log.LogTester;
import org.sonar.api.utils.log.LoggerLevel;
-import org.sonar.scanner.bootstrap.GlobalMode;
-import org.sonar.scanner.bootstrap.GlobalProperties;
-import org.sonar.scanner.bootstrap.GlobalSettings;
-import org.sonar.scanner.protocol.input.GlobalRepositories;
+import org.sonar.scanner.repository.settings.SettingsLoader;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
public class GlobalSettingsTest {
@@ -44,39 +42,38 @@ public class GlobalSettingsTest {
@Rule
public LogTester logTester = new LogTester();
- GlobalRepositories globalRef;
+ SettingsLoader settingsLoader;
GlobalProperties bootstrapProps;
private GlobalMode mode;
@Before
public void prepare() {
- globalRef = new GlobalRepositories();
+ settingsLoader = mock(SettingsLoader.class);
bootstrapProps = new GlobalProperties(Collections.<String, String>emptyMap());
mode = mock(GlobalMode.class);
}
@Test
public void should_load_global_settings() {
- globalRef.globalSettings().put("sonar.cpd.cross", "true");
+ when(settingsLoader.load(null)).thenReturn(ImmutableMap.of("sonar.cpd.cross", "true"));
- GlobalSettings batchSettings = new GlobalSettings(bootstrapProps, new PropertyDefinitions(), globalRef, mode);
+ GlobalSettings batchSettings = new GlobalSettings(bootstrapProps, new PropertyDefinitions(), settingsLoader, mode);
assertThat(batchSettings.getBoolean("sonar.cpd.cross")).isTrue();
}
@Test
public void should_log_warn_msg_for_each_jdbc_property_if_present() {
- globalRef.globalSettings().put("sonar.jdbc.url", SOME_VALUE);
- globalRef.globalSettings().put("sonar.jdbc.username", SOME_VALUE);
- globalRef.globalSettings().put("sonar.jdbc.password", SOME_VALUE);
+ when(settingsLoader.load(null)).thenReturn(ImmutableMap.of("sonar.jdbc.url", SOME_VALUE,
+ "sonar.jdbc.username", SOME_VALUE,
+ "sonar.jdbc.password", SOME_VALUE));
- new GlobalSettings(bootstrapProps, new PropertyDefinitions(), globalRef, mode);
+ new GlobalSettings(bootstrapProps, new PropertyDefinitions(), settingsLoader, mode);
assertThat(logTester.logs(LoggerLevel.WARN)).containsOnly(
"Property 'sonar.jdbc.url' is not supported any more. It will be ignored. There is no longer any DB connection to the SQ database.",
"Property 'sonar.jdbc.username' is not supported any more. It will be ignored. There is no longer any DB connection to the SQ database.",
- "Property 'sonar.jdbc.password' is not supported any more. It will be ignored. There is no longer any DB connection to the SQ database."
- );
+ "Property 'sonar.jdbc.password' is not supported any more. It will be ignored. There is no longer any DB connection to the SQ database.");
}
}
diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java
index c64259117c0..e6b475f7515 100644
--- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java
+++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java
@@ -30,6 +30,7 @@ import java.io.Reader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
@@ -62,6 +63,7 @@ import org.sonar.scanner.repository.ProjectRepositories;
import org.sonar.scanner.repository.ProjectRepositoriesLoader;
import org.sonar.scanner.repository.QualityProfileLoader;
import org.sonar.scanner.repository.ServerIssuesLoader;
+import org.sonar.scanner.repository.settings.SettingsLoader;
import org.sonar.scanner.rule.ActiveRulesLoader;
import org.sonar.scanner.rule.LoadedActiveRule;
import org.sonar.scanner.rule.RulesLoader;
@@ -283,7 +285,8 @@ public class ScannerMediumTester {
builder.rulesLoader,
builder.projectRefProvider,
builder.activeRules,
- new DefaultDebtModel())
+ new DefaultDebtModel(),
+ new FakeSettingsLoader())
.setBootstrapProperties(builder.bootstrapProperties)
.setLogOutput(builder.logOutput);
@@ -474,6 +477,14 @@ public class ScannerMediumTester {
}
}
+ private static class FakeSettingsLoader implements SettingsLoader {
+
+ @Override
+ public Map<String, String> load(String componentKey) {
+ return Collections.emptyMap();
+ }
+ }
+
private static class FakeServerLineHashesLoader implements ServerLineHashesLoader {
private Map<String, String[]> byKey = new HashMap<>();
diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/log/ExceptionHandlingMediumTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/log/ExceptionHandlingMediumTest.java
index f552f33f421..918ac2c1dd6 100644
--- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/log/ExceptionHandlingMediumTest.java
+++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/log/ExceptionHandlingMediumTest.java
@@ -20,30 +20,29 @@
package org.sonar.scanner.mediumtest.log;
import java.util.Collections;
-
-import org.hamcrest.Matchers;
+import java.util.Map;
import org.hamcrest.Description;
+import org.hamcrest.Matchers;
import org.hamcrest.TypeSafeMatcher;
import org.junit.BeforeClass;
-import org.sonar.api.utils.MessageException;
-import org.sonar.batch.bootstrapper.Batch;
-import org.sonar.batch.bootstrapper.EnvironmentInformation;
-import org.sonar.scanner.protocol.input.GlobalRepositories;
-import org.sonar.scanner.repository.GlobalRepositoriesLoader;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
+import org.sonar.api.utils.MessageException;
+import org.sonar.batch.bootstrapper.Batch;
+import org.sonar.batch.bootstrapper.EnvironmentInformation;
+import org.sonar.scanner.repository.settings.SettingsLoader;
public class ExceptionHandlingMediumTest {
@Rule
public ExpectedException thrown = ExpectedException.none();
private Batch batch;
- private static ErrorGlobalRepositoriesLoader loader;
+ private static ErrorSettingsLoader loader;
@BeforeClass
public static void beforeClass() {
- loader = new ErrorGlobalRepositoriesLoader();
+ loader = new ErrorSettingsLoader();
}
public void setUp(boolean verbose) {
@@ -64,7 +63,7 @@ public class ExceptionHandlingMediumTest {
setUp(false);
loader.withCause = false;
thrown.expect(MessageException.class);
- thrown.expectMessage("Error loading repository");
+ thrown.expectMessage("Error loading settings");
thrown.expectCause(Matchers.nullValue(Throwable.class));
batch.start();
@@ -76,7 +75,7 @@ public class ExceptionHandlingMediumTest {
loader.withCause = true;
thrown.expect(MessageException.class);
- thrown.expectMessage("Error loading repository");
+ thrown.expectMessage("Error loading settings");
thrown.expectCause(new TypeSafeMatcher<Throwable>() {
@Override
public void describeTo(Description description) {
@@ -99,16 +98,16 @@ public class ExceptionHandlingMediumTest {
batch.start();
}
- private static class ErrorGlobalRepositoriesLoader implements GlobalRepositoriesLoader {
+ private static class ErrorSettingsLoader implements SettingsLoader {
boolean withCause = false;
@Override
- public GlobalRepositories load() {
+ public Map<String, String> load(String componentKey) {
if (withCause) {
IllegalStateException cause = new IllegalStateException("Code 401");
- throw MessageException.of("Error loading repository", cause);
+ throw MessageException.of("Error loading settings", cause);
} else {
- throw MessageException.of("Error loading repository");
+ throw MessageException.of("Error loading settings");
}
}
}
diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/settings/DefaultSettingsLoaderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/settings/DefaultSettingsLoaderTest.java
new file mode 100644
index 00000000000..8f9be5cf33d
--- /dev/null
+++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/settings/DefaultSettingsLoaderTest.java
@@ -0,0 +1,63 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact AT sonarsource DOT com
+ *
+ * This program 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.
+ *
+ * This program 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.scanner.repository.settings;
+
+import org.junit.Test;
+import org.sonarqube.ws.Settings.FieldValues;
+import org.sonarqube.ws.Settings.FieldValues.Value;
+import org.sonarqube.ws.Settings.FieldValues.Value.Builder;
+import org.sonarqube.ws.Settings.Setting;
+import org.sonarqube.ws.Settings.Values;
+
+import static java.util.Arrays.asList;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.entry;
+
+public class DefaultSettingsLoaderTest {
+
+ @Test
+ public void should_load_global_multivalue_settings() {
+ assertThat(DefaultSettingsLoader.toMap(asList(Setting.newBuilder()
+ .setKey("sonar.preview.supportedPlugins")
+ .setValues(Values.newBuilder().addValues("java").addValues("php")).build())))
+ .containsExactly(entry("sonar.preview.supportedPlugins", "java,php"));
+ }
+
+ @Test
+ public void should_load_global_propertyset_settings() {
+ Builder valuesBuilder = Value.newBuilder();
+ valuesBuilder.getMutableValue().put("filepattern", "**/*.xml");
+ valuesBuilder.getMutableValue().put("rulepattern", "*:S12345");
+ Value value1 = valuesBuilder.build();
+ valuesBuilder.clear();
+ valuesBuilder.getMutableValue().put("filepattern", "**/*.java");
+ valuesBuilder.getMutableValue().put("rulepattern", "*:S456");
+ Value value2 = valuesBuilder.build();
+
+ assertThat(DefaultSettingsLoader.toMap(asList(Setting.newBuilder()
+ .setKey("sonar.issue.exclusions.multicriteria")
+ .setFieldValues(FieldValues.newBuilder().addFieldValues(value1).addFieldValues(value2)).build())))
+ .containsOnly(entry("sonar.issue.exclusions.multicriteria", "1,2"),
+ entry("sonar.issue.exclusions.multicriteria.1.filepattern", "**/*.xml"),
+ entry("sonar.issue.exclusions.multicriteria.1.rulepattern", "*:S12345"),
+ entry("sonar.issue.exclusions.multicriteria.2.filepattern", "**/*.java"),
+ entry("sonar.issue.exclusions.multicriteria.2.rulepattern", "*:S456"));
+ }
+}
diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleSettingsTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleSettingsTest.java
index f779b0d80f4..034bf4304a7 100644
--- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleSettingsTest.java
+++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleSettingsTest.java
@@ -36,10 +36,10 @@ import org.sonar.scanner.analysis.DefaultAnalysisMode;
import org.sonar.scanner.bootstrap.GlobalMode;
import org.sonar.scanner.bootstrap.GlobalProperties;
import org.sonar.scanner.bootstrap.GlobalSettings;
-import org.sonar.scanner.protocol.input.GlobalRepositories;
import org.sonar.scanner.report.AnalysisContextReportPublisher;
import org.sonar.scanner.repository.FileData;
import org.sonar.scanner.repository.ProjectRepositories;
+import org.sonar.scanner.repository.settings.SettingsLoader;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
@@ -157,6 +157,6 @@ public class ModuleSettingsTest {
private GlobalSettings newGlobalSettings(Map<String, String> props) {
GlobalProperties globalProps = new GlobalProperties(props);
return new GlobalSettings(globalProps, new PropertyDefinitions(),
- new GlobalRepositories(), new GlobalMode(globalProps));
+ mock(SettingsLoader.class), new GlobalMode(globalProps));
}
}
diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectSettingsTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectSettingsTest.java
index 5b889fb1340..6ec64aab7ed 100644
--- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectSettingsTest.java
+++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectSettingsTest.java
@@ -37,9 +37,9 @@ import org.sonar.scanner.analysis.DefaultAnalysisMode;
import org.sonar.scanner.bootstrap.GlobalMode;
import org.sonar.scanner.bootstrap.GlobalProperties;
import org.sonar.scanner.bootstrap.GlobalSettings;
-import org.sonar.scanner.protocol.input.GlobalRepositories;
import org.sonar.scanner.repository.FileData;
import org.sonar.scanner.repository.ProjectRepositories;
+import org.sonar.scanner.repository.settings.SettingsLoader;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
@@ -68,7 +68,7 @@ public class ProjectSettingsTest {
project = ProjectDefinition.create().setKey("struts");
globalMode = mock(GlobalMode.class);
mode = mock(DefaultAnalysisMode.class);
- bootstrapProps = new GlobalSettings(new GlobalProperties(Collections.<String, String>emptyMap()), new PropertyDefinitions(), new GlobalRepositories(), globalMode);
+ bootstrapProps = new GlobalSettings(new GlobalProperties(Collections.<String, String>emptyMap()), new PropertyDefinitions(), mock(SettingsLoader.class), globalMode);
}
@Test