Browse Source

SONAR-9478 Replace Settings by Configuration

tags/6.5-M2
Julien HENRY 7 years ago
parent
commit
5694a472f1
100 changed files with 578 additions and 644 deletions
  1. 4
    5
      server/sonar-ce-api/src/main/java/org/sonar/ce/configuration/CeConfigurationImpl.java
  2. 12
    13
      server/sonar-ce-api/src/test/java/org/sonar/ce/configuration/CeConfigurationImplTest.java
  3. 6
    6
      server/sonar-ce/src/main/java/org/sonar/ce/cluster/HazelcastClientWrapperImpl.java
  4. 6
    6
      server/sonar-ce/src/main/java/org/sonar/ce/container/ComputeEngineContainerImpl.java
  5. 25
    31
      server/sonar-ce/src/test/java/org/sonar/ce/cluster/HazelcastClientWrapperImplTest.java
  6. 1
    1
      server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java
  7. 1
    1
      server/sonar-db-core/src/test/java/org/sonar/db/CoreTestDb.java
  8. 1
    1
      server/sonar-db-core/src/test/java/org/sonar/db/DefaultDatabaseTest.java
  9. 0
    1
      server/sonar-db-core/src/test/java/org/sonar/db/ResultSetIteratorTest.java
  10. 2
    2
      server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentDao.java
  11. 0
    1
      server/sonar-db-dao/src/main/java/org/sonar/db/permission/UserPermissionDao.java
  12. 4
    4
      server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeConfiguration.java
  13. 3
    5
      server/sonar-db-dao/src/main/java/org/sonar/db/purge/period/DefaultPeriodCleaner.java
  14. 10
    10
      server/sonar-db-dao/src/main/java/org/sonar/db/purge/period/Filters.java
  15. 1
    1
      server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleDao.java
  16. 1
    1
      server/sonar-db-dao/src/main/java/org/sonar/db/user/GroupDao.java
  17. 1
    1
      server/sonar-db-dao/src/test/java/org/sonar/db/BatchSessionTest.java
  18. 1
    1
      server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java
  19. 1
    2
      server/sonar-db-dao/src/test/java/org/sonar/db/duplication/DuplicationDaoTest.java
  20. 7
    6
      server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeConfigurationTest.java
  21. 2
    2
      server/sonar-db-dao/src/test/java/org/sonar/db/purge/period/DefaultPeriodCleanerTest.java
  22. 1
    0
      server/sonar-db-dao/src/test/java/org/sonar/db/qualityprofile/QProfileChangeDaoTest.java
  23. 2
    2
      server/sonar-db-dao/src/test/java/org/sonar/db/user/UserDtoTest.java
  24. 3
    3
      server/sonar-server/src/main/java/org/sonar/ce/http/CeHttpClient.java
  25. 6
    4
      server/sonar-server/src/main/java/org/sonar/ce/settings/ProjectConfigurationFactory.java
  26. 6
    11
      server/sonar-server/src/main/java/org/sonar/server/app/ProcessCommandWrapperImpl.java
  27. 6
    11
      server/sonar-server/src/main/java/org/sonar/server/authentication/JwtHttpHandler.java
  28. 9
    9
      server/sonar-server/src/main/java/org/sonar/server/authentication/JwtSerializer.java
  29. 6
    6
      server/sonar-server/src/main/java/org/sonar/server/authentication/RealmAuthenticator.java
  30. 7
    8
      server/sonar-server/src/main/java/org/sonar/server/authentication/SsoAuthenticator.java
  31. 8
    8
      server/sonar-server/src/main/java/org/sonar/server/authentication/UserSessionInitializer.java
  32. 5
    5
      server/sonar-server/src/main/java/org/sonar/server/authentication/ws/ValidateAction.java
  33. 5
    5
      server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndexDefinition.java
  34. 9
    9
      server/sonar-server/src/main/java/org/sonar/server/computation/dbcleaner/ProjectCleaner.java
  35. 14
    12
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/api/measurecomputer/MeasureComputerContextImpl.java
  36. 4
    4
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ConfigurationRepository.java
  37. 11
    11
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ConfigurationRepositoryImpl.java
  38. 2
    2
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java
  39. 6
    11
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/duplication/IntegrateCrossProjectDuplications.java
  40. 5
    5
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/DefaultAssignee.java
  41. 10
    11
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/filter/IssueFilter.java
  42. 3
    3
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/measure/MeasureComputersVisitor.java
  43. 19
    21
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/qualitymodel/RatingSettings.java
  44. 7
    7
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/LoadPeriodsStep.java
  45. 9
    9
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/LoadQualityGateStep.java
  46. 5
    5
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PeriodResolver.java
  47. 5
    5
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PurgeDatastoresStep.java
  48. 14
    14
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookPostTask.java
  49. 7
    7
      server/sonar-server/src/main/java/org/sonar/server/es/EsClientProvider.java
  50. 5
    4
      server/sonar-server/src/main/java/org/sonar/server/es/IndexDefinitions.java
  51. 5
    5
      server/sonar-server/src/main/java/org/sonar/server/es/IndexerStartupTask.java
  52. 6
    10
      server/sonar-server/src/main/java/org/sonar/server/es/NewIndex.java
  53. 5
    5
      server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndexDefinition.java
  54. 5
    5
      server/sonar-server/src/main/java/org/sonar/server/measure/index/ProjectMeasuresIndexDefinition.java
  55. 4
    4
      server/sonar-server/src/main/java/org/sonar/server/notification/NotificationDaemon.java
  56. 5
    5
      server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationCreationImpl.java
  57. 5
    5
      server/sonar-server/src/main/java/org/sonar/server/organization/ws/CreateAction.java
  58. 5
    7
      server/sonar-server/src/main/java/org/sonar/server/platform/ServerFileSystemImpl.java
  59. 15
    20
      server/sonar-server/src/main/java/org/sonar/server/platform/ServerIdLoader.java
  60. 6
    6
      server/sonar-server/src/main/java/org/sonar/server/platform/ServerImpl.java
  61. 8
    8
      server/sonar-server/src/main/java/org/sonar/server/platform/ServerLogging.java
  62. 10
    11
      server/sonar-server/src/main/java/org/sonar/server/platform/UrlSettings.java
  63. 4
    4
      server/sonar-server/src/main/java/org/sonar/server/platform/cluster/ClusterImpl.java
  64. 6
    6
      server/sonar-server/src/main/java/org/sonar/server/platform/db/EmbeddedDatabase.java
  65. 6
    6
      server/sonar-server/src/main/java/org/sonar/server/platform/db/EmbeddedDatabaseFactory.java
  66. 14
    17
      server/sonar-server/src/main/java/org/sonar/server/platform/monitoring/SonarQubeMonitor.java
  67. 2
    0
      server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel1.java
  68. 2
    2
      server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java
  69. 5
    5
      server/sonar-server/src/main/java/org/sonar/server/platform/ws/RestartAction.java
  70. 4
    4
      server/sonar-server/src/main/java/org/sonar/server/plugins/UpdateCenterClient.java
  71. 9
    9
      server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexDefinition.java
  72. 6
    7
      server/sonar-server/src/main/java/org/sonar/server/test/index/TestIndexDefinition.java
  73. 8
    8
      server/sonar-server/src/main/java/org/sonar/server/ui/ws/GlobalAction.java
  74. 5
    5
      server/sonar-server/src/main/java/org/sonar/server/ui/ws/SettingsAction.java
  75. 11
    11
      server/sonar-server/src/main/java/org/sonar/server/user/SecurityRealmFactory.java
  76. 5
    5
      server/sonar-server/src/main/java/org/sonar/server/user/UserUpdater.java
  77. 5
    5
      server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndexDefinition.java
  78. 4
    4
      server/sonar-server/src/main/java/org/sonar/server/util/OkHttpClientProvider.java
  79. 5
    5
      server/sonar-server/src/main/java/org/sonar/server/view/index/ViewIndexDefinition.java
  80. 2
    3
      server/sonar-server/src/test/java/org/sonar/ce/http/CeHttpClientTest.java
  81. 9
    10
      server/sonar-server/src/test/java/org/sonar/server/app/ProcessCommandWrapperImplTest.java
  82. 7
    8
      server/sonar-server/src/test/java/org/sonar/server/authentication/JwtHttpHandlerTest.java
  83. 4
    5
      server/sonar-server/src/test/java/org/sonar/server/authentication/JwtSerializerTest.java
  84. 3
    4
      server/sonar-server/src/test/java/org/sonar/server/authentication/RealmAuthenticatorTest.java
  85. 4
    5
      server/sonar-server/src/test/java/org/sonar/server/authentication/SsoAuthenticatorTest.java
  86. 3
    3
      server/sonar-server/src/test/java/org/sonar/server/authentication/UserIdentityAuthenticatorTest.java
  87. 4
    5
      server/sonar-server/src/test/java/org/sonar/server/authentication/UserSessionInitializerTest.java
  88. 2
    3
      server/sonar-server/src/test/java/org/sonar/server/authentication/ws/ValidateActionTest.java
  89. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/batch/IssuesActionTest.java
  90. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/component/index/ComponentIndexTest.java
  91. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/component/index/ComponentIndexerTest.java
  92. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/component/ws/SearchProjectsActionTest.java
  93. 3
    3
      server/sonar-server/src/test/java/org/sonar/server/component/ws/SuggestionsActionTest.java
  94. 14
    12
      server/sonar-server/src/test/java/org/sonar/server/computation/dbcleaner/ProjectCleanerTest.java
  95. 6
    6
      server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/api/measurecomputer/MeasureComputerContextImplTest.java
  96. 13
    14
      server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ConfigurationRepositoryTest.java
  97. 9
    9
      server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/TestSettingsRepository.java
  98. 20
    39
      server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/duplication/IntegrateCrossProjectDuplicationsTest.java
  99. 3
    4
      server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/issue/DefaultAssigneeTest.java
  100. 0
    0
      server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/issue/ScmAccountToUserLoaderTest.java

+ 4
- 5
server/sonar-ce-api/src/main/java/org/sonar/ce/configuration/CeConfigurationImpl.java View File

@@ -20,7 +20,7 @@
package org.sonar.ce.configuration;

import org.picocontainer.Startable;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.utils.MessageException;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
@@ -47,8 +47,8 @@ public class CeConfigurationImpl implements CeConfiguration, Startable {

private final int workerCount;

public CeConfigurationImpl(Settings settings) {
String workerCountAsStr = settings.getString(CE_WORKERS_COUNT_PROPERTY);
public CeConfigurationImpl(Configuration config) {
String workerCountAsStr = config.get(CE_WORKERS_COUNT_PROPERTY).orElse(null);
if (workerCountAsStr == null || workerCountAsStr.isEmpty()) {
this.workerCount = DEFAULT_WORKER_COUNT;
} else {
@@ -72,8 +72,7 @@ public class CeConfigurationImpl implements CeConfiguration, Startable {
return MessageException.of(format(
"value '%s' of property %s is invalid. It must an integer strictly greater than 0.",
workerCountAsStr,
CE_WORKERS_COUNT_PROPERTY)
);
CE_WORKERS_COUNT_PROPERTY));
}

@Override

+ 12
- 13
server/sonar-ce-api/src/test/java/org/sonar/ce/configuration/CeConfigurationImplTest.java View File

@@ -23,8 +23,7 @@ import java.util.Random;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.sonar.api.config.MapSettings;
import org.sonar.api.config.Settings;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.utils.MessageException;

import static java.lang.Math.abs;
@@ -36,32 +35,32 @@ public class CeConfigurationImplTest {
@Rule
public ExpectedException expectedException = ExpectedException.none();

private Settings settings = new MapSettings();
private MapSettings settings = new MapSettings();

@Test
public void getWorkerCount_returns_1_when_worker_property_is_not_defined() {
assertThat(new CeConfigurationImpl(settings).getWorkerCount()).isEqualTo(1);
assertThat(new CeConfigurationImpl(settings.asConfig()).getWorkerCount()).isEqualTo(1);
}

@Test
public void getWorkerCount_returns_1_when_worker_property_is_empty() {
settings.setProperty(CE_WORKERS_COUNT_PROPERTY, "");

assertThat(new CeConfigurationImpl(settings).getWorkerCount()).isEqualTo(1);
assertThat(new CeConfigurationImpl(settings.asConfig()).getWorkerCount()).isEqualTo(1);
}

@Test
public void getWorkerCount_returns_1_when_worker_property_is_space_chars() {
settings.setProperty(CE_WORKERS_COUNT_PROPERTY, " \n ");

assertThat(new CeConfigurationImpl(settings).getWorkerCount()).isEqualTo(1);
assertThat(new CeConfigurationImpl(settings.asConfig()).getWorkerCount()).isEqualTo(1);
}

@Test
public void getWorkerCount_returns_1_when_worker_property_is_1() {
settings.setProperty(CE_WORKERS_COUNT_PROPERTY, 1);

assertThat(new CeConfigurationImpl(settings).getWorkerCount()).isEqualTo(1);
assertThat(new CeConfigurationImpl(settings.asConfig()).getWorkerCount()).isEqualTo(1);
}

@Test
@@ -69,7 +68,7 @@ public class CeConfigurationImplTest {
int value = abs(new Random().nextInt()) + 2;
settings.setProperty(CE_WORKERS_COUNT_PROPERTY, value);

assertThat(new CeConfigurationImpl(settings).getWorkerCount()).isEqualTo(value);
assertThat(new CeConfigurationImpl(settings.asConfig()).getWorkerCount()).isEqualTo(value);
}

@Test
@@ -79,7 +78,7 @@ public class CeConfigurationImplTest {

expectMessageException(value);

new CeConfigurationImpl(settings);
new CeConfigurationImpl(settings.asConfig());
}

@Test
@@ -89,7 +88,7 @@ public class CeConfigurationImplTest {

expectMessageException(value);

new CeConfigurationImpl(settings);
new CeConfigurationImpl(settings.asConfig());
}

@Test
@@ -101,7 +100,7 @@ public class CeConfigurationImplTest {
expectedException.expectMessage("value '" + value + "' of property " + CE_WORKERS_COUNT_PROPERTY + " is invalid. " +
"It must an integer strictly greater than 0");

new CeConfigurationImpl(settings);
new CeConfigurationImpl(settings.asConfig());
}

private void expectMessageException(int value) {
@@ -112,13 +111,13 @@ public class CeConfigurationImplTest {

@Test
public void getCleanCeTasksInitialDelay_returns_1() {
assertThat(new CeConfigurationImpl(settings).getCleanCeTasksInitialDelay())
assertThat(new CeConfigurationImpl(settings.asConfig()).getCleanCeTasksInitialDelay())
.isEqualTo(1L);
}

@Test
public void getCleanCeTasksDelay_returns_10() {
assertThat(new CeConfigurationImpl(settings).getCleanCeTasksDelay())
assertThat(new CeConfigurationImpl(settings.asConfig()).getCleanCeTasksDelay())
.isEqualTo(10L);
}
}

+ 6
- 6
server/sonar-ce/src/main/java/org/sonar/ce/cluster/HazelcastClientWrapperImpl.java View File

@@ -29,7 +29,7 @@ import java.util.Map;
import java.util.Set;
import java.util.concurrent.locks.Lock;
import org.picocontainer.Startable;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.process.ProcessProperties;

import static com.google.common.base.Preconditions.checkState;
@@ -46,10 +46,10 @@ public class HazelcastClientWrapperImpl implements Startable, HazelcastClientWra
@VisibleForTesting
protected HazelcastInstance hzInstance;

public HazelcastClientWrapperImpl(Settings settings) {
boolean clusterEnabled = settings.getBoolean(ProcessProperties.CLUSTER_ENABLED);
String clusterName = settings.getString(ProcessProperties.CLUSTER_NAME);
String clusterLocalEndPoint = settings.getString(ProcessProperties.CLUSTER_LOCALENDPOINT);
public HazelcastClientWrapperImpl(Configuration config) {
boolean clusterEnabled = config.getBoolean(ProcessProperties.CLUSTER_ENABLED).orElse(false);
String clusterName = config.get(ProcessProperties.CLUSTER_NAME).orElse(null);
String clusterLocalEndPoint = config.get(ProcessProperties.CLUSTER_LOCALENDPOINT).orElse(null);

checkState(clusterEnabled, "Cluster is not enabled");
checkState(isNotEmpty(clusterLocalEndPoint), "LocalEndPoint have not been set");
@@ -85,7 +85,7 @@ public class HazelcastClientWrapperImpl implements Startable, HazelcastClientWra
}

@Override
public <K,V> Map<K,V> getReplicatedMap(String name) {
public <K, V> Map<K, V> getReplicatedMap(String name) {
return hzInstance.getReplicatedMap(name);
}


+ 6
- 6
server/sonar-ce/src/main/java/org/sonar/ce/container/ComputeEngineContainerImpl.java View File

@@ -52,10 +52,11 @@ import org.sonar.ce.log.CeProcessLogging;
import org.sonar.ce.platform.ComputeEngineExtensionInstaller;
import org.sonar.ce.queue.CeQueueCleaner;
import org.sonar.ce.queue.PurgeCeActivities;
import org.sonar.ce.settings.ProjectSettingsFactory;
import org.sonar.ce.settings.ProjectConfigurationFactory;
import org.sonar.ce.taskprocessor.CeTaskProcessorModule;
import org.sonar.ce.user.CeUserSession;
import org.sonar.core.component.DefaultResourceTypes;
import org.sonar.core.config.ConfigurationProvider;
import org.sonar.core.config.CorePropertyDefinitions;
import org.sonar.core.i18n.DefaultI18n;
import org.sonar.core.i18n.RuleI18nManager;
@@ -181,12 +182,10 @@ public class ComputeEngineContainerImpl implements ComputeEngineContainer {
if (props.valueAsBoolean("sonar.cluster.enabled")) {
this.level4.add(
HazelcastClientWrapperImpl.class,
CeDistributedInformationImpl.class
);
CeDistributedInformationImpl.class);
} else {
this.level4.add(
StandaloneCeDistributedInformation.class
);
StandaloneCeDistributedInformation.class);
}
configureFromModules(this.level4);
ServerExtensionInstaller extensionInstaller = this.level4.getComponentByType(ServerExtensionInstaller.class);
@@ -225,6 +224,7 @@ public class ComputeEngineContainerImpl implements ComputeEngineContainer {
Version apiVersion = ApiVersion.load(System2.INSTANCE);
return new Object[] {
ThreadLocalSettings.class,
new ConfigurationProvider(),
new SonarQubeVersion(apiVersion),
SonarRuntimeImpl.forSonarQube(ApiVersion.load(System2.INSTANCE), SonarQubeSide.COMPUTE_ENGINE),
CeProcessLogging.class,
@@ -406,7 +406,7 @@ public class ComputeEngineContainerImpl implements ComputeEngineContainer {
CeTaskProcessorModule.class,

InternalPropertiesImpl.class,
ProjectSettingsFactory.class,
ProjectConfigurationFactory.class,

// cleaning
CeCleaningModule.class

+ 25
- 31
server/sonar-ce/src/test/java/org/sonar/ce/cluster/HazelcastClientWrapperImplTest.java View File

@@ -36,7 +36,6 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -51,7 +50,6 @@ import org.junit.rules.TestRule;
import org.junit.rules.Timeout;
import org.slf4j.LoggerFactory;
import org.sonar.api.config.PropertyDefinitions;
import org.sonar.api.config.Settings;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.process.NetworkUtils;
import org.sonar.process.ProcessProperties;
@@ -74,8 +72,8 @@ public class HazelcastClientWrapperImplTest {
int port = NetworkUtils.getNextAvailablePort(InetAddress.getLoopbackAddress());
hzCluster = HazelcastTestHelper.createHazelcastCluster("cluster_with_client", port);

Settings settings = createClusterSettings("cluster_with_client", "localhost:" + port);
hzClient = new HazelcastClientWrapperImpl(settings);
MapSettings settings = createClusterSettings("cluster_with_client", "localhost:" + port);
hzClient = new HazelcastClientWrapperImpl(settings.asConfig());
}

@AfterClass
@@ -94,8 +92,8 @@ public class HazelcastClientWrapperImplTest {

@Test
public void start_throws_ISE_if_LOCALENDPOINT_is_incorrect() {
Settings settings = createClusterSettings("sonarqube", "\u4563\u1432\u1564");
HazelcastClientWrapperImpl hzClient = new HazelcastClientWrapperImpl(settings);
MapSettings settings = createClusterSettings("sonarqube", "\u4563\u1432\u1564");
HazelcastClientWrapperImpl hzClient = new HazelcastClientWrapperImpl(settings.asConfig());

expectedException.expect(IllegalStateException.class);
expectedException.expectMessage("Unable to connect to any address in the config! The following addresses were tried:");
@@ -105,56 +103,56 @@ public class HazelcastClientWrapperImplTest {

@Test
public void constructor_throws_ISE_if_LOCALENDPOINT_is_empty() {
Settings settings = createClusterSettings("sonarqube", "");
MapSettings settings = createClusterSettings("sonarqube", "");

expectedException.expect(IllegalStateException.class);
expectedException.expectMessage("LocalEndPoint have not been set");

new HazelcastClientWrapperImpl(settings);
new HazelcastClientWrapperImpl(settings.asConfig());
}

@Test
public void constructor_throws_ISE_if_CLUSTER_ENABLED_is_false() {
Settings settings = createClusterSettings("sonarqube", "localhost:9003");
MapSettings settings = createClusterSettings("sonarqube", "localhost:9003");
settings.setProperty(ProcessProperties.CLUSTER_ENABLED, false);

expectedException.expect(IllegalStateException.class);
expectedException.expectMessage("Cluster is not enabled");

new HazelcastClientWrapperImpl(settings);
new HazelcastClientWrapperImpl(settings.asConfig());
}

@Test
public void constructor_throws_ISE_if_missing_CLUSTER_ENABLED() {
Settings settings = createClusterSettings("sonarqube", "localhost:9003");
MapSettings settings = createClusterSettings("sonarqube", "localhost:9003");
settings.removeProperty(ProcessProperties.CLUSTER_ENABLED);

expectedException.expect(IllegalStateException.class);
expectedException.expectMessage("Cluster is not enabled");

new HazelcastClientWrapperImpl(settings);
new HazelcastClientWrapperImpl(settings.asConfig());
}

@Test
public void constructor_throws_ISE_if_missing_CLUSTER_NAME() {
Settings settings = createClusterSettings("sonarqube", "localhost:9003");
MapSettings settings = createClusterSettings("sonarqube", "localhost:9003");
settings.removeProperty(ProcessProperties.CLUSTER_NAME);

expectedException.expect(IllegalStateException.class);
expectedException.expectMessage("sonar.cluster.name is missing");

new HazelcastClientWrapperImpl(settings);
new HazelcastClientWrapperImpl(settings.asConfig());
}

@Test
public void constructor_throws_ISE_if_missing_CLUSTER_LOCALENDPOINT() {
Settings settings = createClusterSettings("sonarqube", "localhost:9003");
MapSettings settings = createClusterSettings("sonarqube", "localhost:9003");
settings.removeProperty(ProcessProperties.CLUSTER_LOCALENDPOINT);

expectedException.expect(IllegalStateException.class);
expectedException.expectMessage("LocalEndPoint have not been set");

new HazelcastClientWrapperImpl(settings);
new HazelcastClientWrapperImpl(settings.asConfig());
}

@Test
@@ -162,9 +160,9 @@ public class HazelcastClientWrapperImplTest {
int port = NetworkUtils.getNextAvailablePort(InetAddress.getLoopbackAddress());
// Launch a fake Hazelcast instance
HazelcastInstance hzInstance = HazelcastTestHelper.createHazelcastCluster("client_must_connect_to_hazelcast", port);
Settings settings = createClusterSettings("client_must_connect_to_hazelcast", "localhost:" + port);
MapSettings settings = createClusterSettings("client_must_connect_to_hazelcast", "localhost:" + port);

HazelcastClientWrapperImpl hazelcastClientWrapperImpl = new HazelcastClientWrapperImpl(settings);
HazelcastClientWrapperImpl hazelcastClientWrapperImpl = new HazelcastClientWrapperImpl(settings.asConfig());
ClientListenerImpl clientListener = new ClientListenerImpl();
hzInstance.getClientService().addClientListener(clientListener);
try {
@@ -184,9 +182,8 @@ public class HazelcastClientWrapperImplTest {

Set<String> setTest = new HashSet<>();
setTest.addAll(
Arrays.asList(RandomStringUtils.randomAlphanumeric(10), RandomStringUtils.randomAlphanumeric(10))
);
Map<String, Set<String>> replicatedMap = hzClient.getReplicatedMap("TEST1");
Arrays.asList(RandomStringUtils.randomAlphanumeric(10), RandomStringUtils.randomAlphanumeric(10)));
Map<String, Set<String>> replicatedMap = hzClient.getReplicatedMap("TEST1");
replicatedMap.put("KEY1", ImmutableSet.copyOf(setTest));
assertThat(hzCluster.getReplicatedMap("TEST1"))
.containsOnlyKeys("KEY1");
@@ -235,8 +232,7 @@ public class HazelcastClientWrapperImplTest {
mapTest.put("a", Arrays.asList("123", "456"));
hzCluster.getMap("TEST3").putAll(mapTest);
assertThat(hzClient.getMap("TEST3")).containsExactly(
entry("a", Arrays.asList("123", "456"))
);
entry("a", Arrays.asList("123", "456")));
} finally {
hzClient.stop();
}
@@ -272,8 +268,7 @@ public class HazelcastClientWrapperImplTest {
}
assertThat(memoryAppender.events).isNotEmpty();
memoryAppender.events.stream().forEach(
e -> assertThat(e.getLoggerName()).startsWith("com.hazelcast")
);
e -> assertThat(e.getLoggerName()).startsWith("com.hazelcast"));
}

private class ClientListenerImpl implements ClientListener {
@@ -290,12 +285,11 @@ public class HazelcastClientWrapperImplTest {
}
}

private static Settings createClusterSettings(String name, String localEndPoint) {
Properties properties = new Properties();
properties.setProperty(ProcessProperties.CLUSTER_NAME, name);
properties.setProperty(ProcessProperties.CLUSTER_LOCALENDPOINT, localEndPoint);
properties.setProperty(ProcessProperties.CLUSTER_ENABLED, "true");
return new MapSettings(new PropertyDefinitions()).addProperties(properties);
private static MapSettings createClusterSettings(String name, String localEndPoint) {
return new MapSettings(new PropertyDefinitions())
.setProperty(ProcessProperties.CLUSTER_NAME, name)
.setProperty(ProcessProperties.CLUSTER_LOCALENDPOINT, localEndPoint)
.setProperty(ProcessProperties.CLUSTER_ENABLED, "true");
}

private class MemoryAppender<E> extends AppenderBase<E> {

+ 1
- 1
server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java View File

@@ -134,7 +134,7 @@ public class ComputeEngineContainerImplTest {
);
assertThat(picoContainer.getParent().getParent().getParent().getComponentAdapters()).hasSize(
COMPONENTS_IN_LEVEL_1_AT_CONSTRUCTION
+ 23 // level 1
+ 24 // level 1
+ 46 // content of DaoModule
+ 3 // content of EsSearchModule
+ 58 // content of CorePropertyDefinitions

+ 1
- 1
server/sonar-db-core/src/test/java/org/sonar/db/CoreTestDb.java View File

@@ -37,7 +37,7 @@ import org.dbunit.IDatabaseTester;
import org.dbunit.dataset.datatype.IDataTypeFactory;
import org.junit.AssumptionViolatedException;
import org.sonar.api.config.Settings;
import org.sonar.api.config.MapSettings;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import org.sonar.db.dialect.H2;

+ 1
- 1
server/sonar-db-core/src/test/java/org/sonar/db/DefaultDatabaseTest.java View File

@@ -23,7 +23,7 @@ import java.util.Properties;
import org.apache.commons.dbcp.BasicDataSource;
import org.junit.Test;
import org.sonar.api.config.Settings;
import org.sonar.api.config.MapSettings;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.db.dialect.PostgreSql;
import org.sonar.process.logging.LogbackHelper;


+ 0
- 1
server/sonar-db-core/src/test/java/org/sonar/db/ResultSetIteratorTest.java View File

@@ -26,7 +26,6 @@ import java.sql.SQLException;
import java.util.NoSuchElementException;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.utils.System2;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;

+ 2
- 2
server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentDao.java View File

@@ -44,8 +44,8 @@ import static java.util.Collections.emptyList;
import static java.util.Objects.requireNonNull;
import static org.apache.commons.lang.StringUtils.isBlank;
import static org.sonar.db.DaoDatabaseUtils.buildLikeValue;
import static org.sonar.db.DaoDatabaseUtils.executeLargeInputs;
import static org.sonar.db.DaoDatabaseUtils.executeLargeUpdates;
import static org.sonar.db.DatabaseUtils.executeLargeInputs;
import static org.sonar.db.DatabaseUtils.executeLargeUpdates;
import static org.sonar.db.WildcardPosition.BEFORE_AND_AFTER;

public class ComponentDao implements Dao {

+ 0
- 1
server/sonar-db-dao/src/main/java/org/sonar/db/permission/UserPermissionDao.java View File

@@ -26,7 +26,6 @@ import org.sonar.core.util.stream.MoreCollectors;
import org.sonar.db.Dao;
import org.sonar.db.DatabaseUtils;
import org.sonar.db.DbSession;
import org.sonar.db.Pagination;
import org.sonar.db.component.ComponentMapper;

import static com.google.common.base.Preconditions.checkArgument;

+ 4
- 4
server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeConfiguration.java View File

@@ -24,7 +24,7 @@ import java.util.Collection;
import java.util.Date;
import javax.annotation.CheckForNull;
import org.apache.commons.lang.time.DateUtils;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.resources.Scopes;
import org.sonar.api.utils.System2;
import org.sonar.core.config.PurgeConstants;
@@ -46,12 +46,12 @@ public class PurgeConfiguration {
this.disabledComponentUuids = disabledComponentUuids;
}

public static PurgeConfiguration newDefaultPurgeConfiguration(Settings settings, IdUuidPair idUuidPair, Collection<String> disabledComponentUuids) {
public static PurgeConfiguration newDefaultPurgeConfiguration(Configuration config, IdUuidPair idUuidPair, Collection<String> disabledComponentUuids) {
String[] scopes = new String[] {Scopes.FILE};
if (settings.getBoolean(PurgeConstants.PROPERTY_CLEAN_DIRECTORY)) {
if (config.getBoolean(PurgeConstants.PROPERTY_CLEAN_DIRECTORY).orElse(false)) {
scopes = new String[] {Scopes.DIRECTORY, Scopes.FILE};
}
return new PurgeConfiguration(idUuidPair, scopes, settings.getInt(PurgeConstants.DAYS_BEFORE_DELETING_CLOSED_ISSUES), System2.INSTANCE, disabledComponentUuids);
return new PurgeConfiguration(idUuidPair, scopes, config.getInt(PurgeConstants.DAYS_BEFORE_DELETING_CLOSED_ISSUES).get(), System2.INSTANCE, disabledComponentUuids);
}

public IdUuidPair rootProjectIdUuid() {

+ 3
- 5
server/sonar-db-dao/src/main/java/org/sonar/db/purge/period/DefaultPeriodCleaner.java View File

@@ -23,7 +23,7 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Joiner;
import java.util.ArrayList;
import java.util.List;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
@@ -34,8 +34,6 @@ import org.sonar.db.purge.PurgeDao;
import org.sonar.db.purge.PurgeProfiler;
import org.sonar.db.purge.PurgeableAnalysisDto;

import static org.sonar.core.util.stream.MoreCollectors.toList;

public class DefaultPeriodCleaner {

private static final Logger LOG = Loggers.get(DefaultPeriodCleaner.class);
@@ -47,8 +45,8 @@ public class DefaultPeriodCleaner {
this.profiler = profiler;
}

public void clean(DbSession session, String rootUuid, Settings settings) {
doClean(rootUuid, new Filters(settings).all(), session);
public void clean(DbSession session, String rootUuid, Configuration config) {
doClean(rootUuid, new Filters(config).all(), session);
}

@VisibleForTesting

+ 10
- 10
server/sonar-db-dao/src/main/java/org/sonar/db/purge/period/Filters.java View File

@@ -24,17 +24,17 @@ import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.time.DateUtils;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.core.config.PurgeConstants;

class Filters {
private final List<Filter> all = Lists.newArrayList();

Filters(Settings settings) {
Date dateToStartKeepingOneSnapshotByDay = getDateFromHours(settings, PurgeConstants.HOURS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_DAY);
Date dateToStartKeepingOneSnapshotByWeek = getDateFromWeeks(settings, PurgeConstants.WEEKS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_WEEK);
Date dateToStartKeepingOneSnapshotByMonth = getDateFromWeeks(settings, PurgeConstants.WEEKS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_MONTH);
Date dateToStartDeletingAllSnapshots = getDateFromWeeks(settings, PurgeConstants.WEEKS_BEFORE_DELETING_ALL_SNAPSHOTS);
Filters(Configuration config) {
Date dateToStartKeepingOneSnapshotByDay = getDateFromHours(config, PurgeConstants.HOURS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_DAY);
Date dateToStartKeepingOneSnapshotByWeek = getDateFromWeeks(config, PurgeConstants.WEEKS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_WEEK);
Date dateToStartKeepingOneSnapshotByMonth = getDateFromWeeks(config, PurgeConstants.WEEKS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_MONTH);
Date dateToStartDeletingAllSnapshots = getDateFromWeeks(config, PurgeConstants.WEEKS_BEFORE_DELETING_ALL_SNAPSHOTS);

all.add(new KeepOneFilter(dateToStartKeepingOneSnapshotByWeek, dateToStartKeepingOneSnapshotByDay, Calendar.DAY_OF_YEAR, "day"));
all.add(new KeepOneFilter(dateToStartKeepingOneSnapshotByMonth, dateToStartKeepingOneSnapshotByWeek, Calendar.WEEK_OF_YEAR, "week"));
@@ -42,13 +42,13 @@ class Filters {
all.add(new DeleteAllFilter(dateToStartDeletingAllSnapshots));
}

static Date getDateFromWeeks(Settings settings, String propertyKey) {
int weeks = settings.getInt(propertyKey);
static Date getDateFromWeeks(Configuration config, String propertyKey) {
int weeks = config.getInt(propertyKey).get();
return DateUtils.addWeeks(new Date(), -weeks);
}

static Date getDateFromHours(Settings settings, String propertyKey) {
int hours = settings.getInt(propertyKey);
static Date getDateFromHours(Configuration config, String propertyKey) {
int hours = config.getInt(propertyKey).get();
return DateUtils.addHours(new Date(), -hours);
}


+ 1
- 1
server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleDao.java View File

@@ -32,7 +32,7 @@ import org.sonar.db.RowNotFoundException;
import org.sonar.db.organization.OrganizationDto;

import static com.google.common.base.Preconditions.checkNotNull;
import static java.util.Optional.*;
import static java.util.Optional.ofNullable;
import static org.sonar.db.DatabaseUtils.executeLargeInputs;

public class RuleDao implements Dao {

+ 1
- 1
server/sonar-db-dao/src/main/java/org/sonar/db/user/GroupDao.java View File

@@ -30,8 +30,8 @@ import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.session.RowBounds;
import org.sonar.api.utils.System2;
import org.sonar.db.Dao;
import org.sonar.db.DbSession;
import org.sonar.db.DaoDatabaseUtils;
import org.sonar.db.DbSession;
import org.sonar.db.WildcardPosition;

import static org.sonar.db.DatabaseUtils.executeLargeInputs;

+ 1
- 1
server/sonar-db-dao/src/test/java/org/sonar/db/BatchSessionTest.java View File

@@ -21,7 +21,7 @@ package org.sonar.db;

import org.junit.Test;

import static org.mockito.Mockito.anyBoolean;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;

+ 1
- 1
server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java View File

@@ -53,8 +53,8 @@ import static org.assertj.guava.api.Assertions.assertThat;
import static org.sonar.db.component.ComponentTesting.newDirectory;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.db.component.ComponentTesting.newModuleDto;
import static org.sonar.db.component.ComponentTesting.newProjectCopy;
import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto;
import static org.sonar.db.component.ComponentTesting.newProjectCopy;
import static org.sonar.db.component.ComponentTesting.newSubView;
import static org.sonar.db.component.ComponentTesting.newView;
import static org.sonar.db.component.ComponentTreeQuery.Strategy.CHILDREN;

+ 1
- 2
server/sonar-db-dao/src/test/java/org/sonar/db/duplication/DuplicationDaoTest.java View File

@@ -19,14 +19,13 @@
*/
package org.sonar.db.duplication;

import java.util.List;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.utils.System2;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;

import java.util.List;

import static java.util.Collections.singletonList;
import static org.assertj.core.api.Assertions.assertThat;


+ 7
- 6
server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeConfigurationTest.java View File

@@ -22,12 +22,13 @@ package org.sonar.db.purge;
import java.util.Collections;
import java.util.Date;
import org.junit.Test;
import org.sonar.api.config.Settings;
import org.sonar.api.config.MapSettings;
import org.sonar.api.config.PropertyDefinitions;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.resources.Scopes;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.utils.System2;
import org.sonar.core.config.PurgeConstants;
import org.sonar.core.config.PurgeProperties;

import static org.assertj.core.api.Assertions.assertThat;

@@ -55,12 +56,12 @@ public class PurgeConfigurationTest {

@Test
public void do_not_delete_directory_by_default() {
Settings settings = new MapSettings();
MapSettings settings = new MapSettings(new PropertyDefinitions(PurgeProperties.all()));
settings.setProperty(PurgeConstants.PROPERTY_CLEAN_DIRECTORY, false);
settings.setProperty(PurgeConstants.DAYS_BEFORE_DELETING_CLOSED_ISSUES, 5);
Date now = new Date();

PurgeConfiguration underTest = PurgeConfiguration.newDefaultPurgeConfiguration(settings, new IdUuidPair(42L, "any-uuid"), Collections.emptyList());
PurgeConfiguration underTest = PurgeConfiguration.newDefaultPurgeConfiguration(settings.asConfig(), new IdUuidPair(42L, "any-uuid"), Collections.emptyList());

assertThat(underTest.scopesWithoutHistoricalData()).contains(Scopes.FILE)
.doesNotContain(Scopes.DIRECTORY);
@@ -69,10 +70,10 @@ public class PurgeConfigurationTest {

@Test
public void delete_directory_if_in_settings() {
Settings settings = new MapSettings();
MapSettings settings = new MapSettings(new PropertyDefinitions(PurgeProperties.all()));
settings.setProperty(PurgeConstants.PROPERTY_CLEAN_DIRECTORY, true);

PurgeConfiguration underTest = PurgeConfiguration.newDefaultPurgeConfiguration(settings, new IdUuidPair(42L, "any-uuid"), Collections.emptyList());
PurgeConfiguration underTest = PurgeConfiguration.newDefaultPurgeConfiguration(settings.asConfig(), new IdUuidPair(42L, "any-uuid"), Collections.emptyList());

assertThat(underTest.scopesWithoutHistoricalData()).contains(Scopes.DIRECTORY, Scopes.FILE);
}

+ 2
- 2
server/sonar-db-dao/src/test/java/org/sonar/db/purge/period/DefaultPeriodCleanerTest.java View File

@@ -33,8 +33,8 @@ import org.sonar.db.purge.PurgeDao;
import org.sonar.db.purge.PurgeProfiler;
import org.sonar.db.purge.PurgeableAnalysisDto;

import static org.mockito.Mockito.anyListOf;
import static org.mockito.Mockito.eq;
import static org.mockito.Matchers.anyListOf;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.when;

+ 1
- 0
server/sonar-db-dao/src/test/java/org/sonar/db/qualityprofile/QProfileChangeDaoTest.java View File

@@ -33,6 +33,7 @@ import org.sonar.db.DbSession;
import org.sonar.db.DbTester;

import static java.util.Arrays.asList;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;

public class QProfileChangeDaoTest {

+ 2
- 2
server/sonar-db-dao/src/test/java/org/sonar/db/user/UserDtoTest.java View File

@@ -19,14 +19,14 @@
*/
package org.sonar.db.user;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.Arrays;
import java.util.Collections;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;

import static org.assertj.core.api.Assertions.assertThat;

public class UserDtoTest {

@Rule

+ 3
- 3
server/sonar-server/src/main/java/org/sonar/ce/http/CeHttpClient.java View File

@@ -26,7 +26,7 @@ import java.util.Optional;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import org.apache.commons.io.IOUtils;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.utils.log.LoggerLevel;
import org.sonar.process.DefaultProcessCommands;
import org.sonar.process.systeminfo.protobuf.ProtobufSystemInfo;
@@ -45,8 +45,8 @@ public class CeHttpClient {

private final File ipcSharedDir;

public CeHttpClient(Settings props) {
this.ipcSharedDir = new File(props.getString(PROPERTY_SHARED_PATH));
public CeHttpClient(Configuration config) {
this.ipcSharedDir = new File(config.get(PROPERTY_SHARED_PATH).get());
}

/**

server/sonar-server/src/main/java/org/sonar/ce/settings/ProjectSettingsFactory.java → server/sonar-server/src/main/java/org/sonar/ce/settings/ProjectConfigurationFactory.java View File

@@ -20,25 +20,27 @@
package org.sonar.ce.settings;

import org.sonar.api.ce.ComputeEngineSide;
import org.sonar.api.config.Configuration;
import org.sonar.api.config.Settings;
import org.sonar.api.config.internal.ConfigurationBridge;
import org.sonar.db.DbClient;

@ComputeEngineSide
public class ProjectSettingsFactory {
public class ProjectConfigurationFactory {

private final Settings globalSettings;
private final DbClient dbClient;

public ProjectSettingsFactory(Settings globalSettings, DbClient dbClient) {
public ProjectConfigurationFactory(Settings globalSettings, DbClient dbClient) {
this.globalSettings = globalSettings;
this.dbClient = dbClient;
}

public Settings newProjectSettings(String projectKey) {
public Configuration newProjectConfiguration(String projectKey) {
Settings projectSettings = new ProjectSettings(globalSettings);
dbClient.propertiesDao()
.selectProjectProperties(projectKey)
.forEach(property -> projectSettings.setProperty(property.getKey(), property.getValue()));
return projectSettings;
return new ConfigurationBridge(projectSettings);
}
}

+ 6
- 11
server/sonar-server/src/main/java/org/sonar/server/app/ProcessCommandWrapperImpl.java View File

@@ -20,19 +20,18 @@
package org.sonar.server.app;

import java.io.File;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.process.DefaultProcessCommands;
import org.sonar.process.ProcessCommands;

import static com.google.common.base.Preconditions.checkArgument;
import static org.sonar.process.ProcessEntryPoint.PROPERTY_PROCESS_INDEX;
import static org.sonar.process.ProcessEntryPoint.PROPERTY_SHARED_PATH;

public class ProcessCommandWrapperImpl implements ProcessCommandWrapper {
private final Settings settings;
private final Configuration config;

public ProcessCommandWrapperImpl(Settings settings) {
this.settings = settings;
public ProcessCommandWrapperImpl(Configuration config) {
this.config = config;
}

@Override
@@ -87,14 +86,10 @@ public class ProcessCommandWrapperImpl implements ProcessCommandWrapper {
}

private int nonNullAsInt(String key) {
String s = settings.getString(key);
checkArgument(s != null, "Property %s is not set", key);
return Integer.parseInt(s);
return config.getInt(key).orElseThrow(() -> new IllegalArgumentException(String.format("Property %s is not set", key)));
}

private File nonNullValueAsFile(String key) {
String s = settings.getString(key);
checkArgument(s != null, "Property %s is not set", key);
return new File(s);
return new File(config.get(key).orElseThrow(() -> new IllegalArgumentException(String.format("Property %s is not set", key))));
}
}

+ 6
- 11
server/sonar-server/src/main/java/org/sonar/server/authentication/JwtHttpHandler.java View File

@@ -29,7 +29,7 @@ import javax.annotation.Nullable;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.server.ServerSide;
import org.sonar.api.utils.System2;
import org.sonar.db.DbClient;
@@ -70,11 +70,11 @@ public class JwtHttpHandler {
private final int sessionTimeoutInSeconds;
private final JwtCsrfVerifier jwtCsrfVerifier;

public JwtHttpHandler(System2 system2, DbClient dbClient, Settings settings, JwtSerializer jwtSerializer, JwtCsrfVerifier jwtCsrfVerifier) {
public JwtHttpHandler(System2 system2, DbClient dbClient, Configuration config, JwtSerializer jwtSerializer, JwtCsrfVerifier jwtCsrfVerifier) {
this.jwtSerializer = jwtSerializer;
this.dbClient = dbClient;
this.system2 = system2;
this.sessionTimeoutInSeconds = getSessionTimeoutInSeconds(settings);
this.sessionTimeoutInSeconds = getSessionTimeoutInSeconds(config);
this.jwtCsrfVerifier = jwtCsrfVerifier;
}

@@ -176,14 +176,9 @@ public class JwtHttpHandler {
}
}

private static int getSessionTimeoutInSeconds(Settings settings) {
int minutes;
if (settings.hasKey(SESSION_TIMEOUT_IN_MINUTES_PROPERTY)) {
minutes = settings.getInt(SESSION_TIMEOUT_IN_MINUTES_PROPERTY);
checkArgument(minutes > 0, "Property %s must be strictly positive. Got %s", SESSION_TIMEOUT_IN_MINUTES_PROPERTY, minutes);
} else {
minutes = SESSION_TIMEOUT_DEFAULT_VALUE_IN_MINUTES;
}
private static int getSessionTimeoutInSeconds(Configuration config) {
int minutes = config.getInt(SESSION_TIMEOUT_IN_MINUTES_PROPERTY).orElse(SESSION_TIMEOUT_DEFAULT_VALUE_IN_MINUTES);
checkArgument(minutes > 0, "Property %s must be strictly positive. Got %s", SESSION_TIMEOUT_IN_MINUTES_PROPERTY, minutes);
checkArgument(minutes <= MAX_SESSION_TIMEOUT_IN_MINUTES, "Property %s must not be greater than 3 months (%s minutes). Got %s minutes",
SESSION_TIMEOUT_IN_MINUTES_PROPERTY, MAX_SESSION_TIMEOUT_IN_MINUTES, minutes);
return minutes * 60;

+ 9
- 9
server/sonar-server/src/main/java/org/sonar/server/authentication/JwtSerializer.java View File

@@ -35,16 +35,16 @@ import javax.annotation.concurrent.Immutable;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.sonar.api.Startable;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.server.ServerSide;
import org.sonar.api.utils.System2;
import org.sonar.core.util.UuidFactory;
import org.sonar.server.authentication.event.AuthenticationEvent.Source;
import org.sonar.server.authentication.event.AuthenticationException;

import static com.google.common.base.Preconditions.checkNotNull;
import static io.jsonwebtoken.impl.crypto.MacProvider.generateKey;
import static java.util.Objects.requireNonNull;
import static org.sonar.server.authentication.event.AuthenticationEvent.Source;

/**
* This class can be used to encode or decode a JWT token
@@ -56,14 +56,14 @@ public class JwtSerializer implements Startable {

private static final SignatureAlgorithm SIGNATURE_ALGORITHM = SignatureAlgorithm.HS256;

private final Settings settings;
private final Configuration config;
private final System2 system2;
private final UuidFactory uuidFactory;

private SecretKey secretKey;

public JwtSerializer(Settings settings, System2 system2, UuidFactory uuidFactory) {
this.settings = settings;
public JwtSerializer(Configuration config, System2 system2, UuidFactory uuidFactory) {
this.config = config;
this.system2 = system2;
this.uuidFactory = uuidFactory;
}
@@ -75,11 +75,11 @@ public class JwtSerializer implements Startable {

@Override
public void start() {
String encodedKey = settings.getString(SECRET_KEY_PROPERTY);
if (encodedKey == null) {
this.secretKey = generateSecretKey();
Optional<String> encodedKey = config.get(SECRET_KEY_PROPERTY);
if (encodedKey.isPresent()) {
this.secretKey = decodeSecretKeyProperty(encodedKey.get());
} else {
this.secretKey = decodeSecretKeyProperty(encodedKey);
this.secretKey = generateSecretKey();
}
}


+ 6
- 6
server/sonar-server/src/main/java/org/sonar/server/authentication/RealmAuthenticator.java View File

@@ -25,7 +25,7 @@ import java.util.Locale;
import java.util.Optional;
import javax.servlet.http.HttpServletRequest;
import org.sonar.api.Startable;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.security.Authenticator;
import org.sonar.api.security.ExternalGroupsProvider;
import org.sonar.api.security.ExternalUsersProvider;
@@ -38,20 +38,20 @@ import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import org.sonar.db.user.UserDto;
import org.sonar.server.authentication.event.AuthenticationEvent;
import org.sonar.server.authentication.event.AuthenticationEvent.Source;
import org.sonar.server.authentication.event.AuthenticationException;
import org.sonar.server.user.SecurityRealmFactory;

import static java.util.Objects.requireNonNull;
import static org.apache.commons.lang.StringUtils.isEmpty;
import static org.apache.commons.lang.StringUtils.trimToNull;
import static org.sonar.server.authentication.event.AuthenticationEvent.Source;
import static org.sonar.server.user.ExternalIdentity.SQ_AUTHORITY;

public class RealmAuthenticator implements Startable {

private static final Logger LOG = Loggers.get(RealmAuthenticator.class);

private final Settings settings;
private final Configuration config;
private final SecurityRealmFactory securityRealmFactory;
private final UserIdentityAuthenticator userIdentityAuthenticator;
private final AuthenticationEvent authenticationEvent;
@@ -61,9 +61,9 @@ public class RealmAuthenticator implements Startable {
private ExternalUsersProvider externalUsersProvider;
private ExternalGroupsProvider externalGroupsProvider;

public RealmAuthenticator(Settings settings, SecurityRealmFactory securityRealmFactory,
public RealmAuthenticator(Configuration config, SecurityRealmFactory securityRealmFactory,
UserIdentityAuthenticator userIdentityAuthenticator, AuthenticationEvent authenticationEvent) {
this.settings = settings;
this.config = config;
this.securityRealmFactory = securityRealmFactory;
this.userIdentityAuthenticator = userIdentityAuthenticator;
this.authenticationEvent = authenticationEvent;
@@ -142,7 +142,7 @@ public class RealmAuthenticator implements Startable {
}

private String getLogin(String userLogin) {
if (settings.getBoolean("sonar.authenticator.downcase")) {
if (config.getBoolean("sonar.authenticator.downcase").orElse(false)) {
return userLogin.toLowerCase(Locale.ENGLISH);
}
return userLogin;

+ 7
- 8
server/sonar-server/src/main/java/org/sonar/server/authentication/SsoAuthenticator.java View File

@@ -32,7 +32,7 @@ import javax.annotation.CheckForNull;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.sonar.api.Startable;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.server.authentication.Display;
import org.sonar.api.server.authentication.IdentityProvider;
import org.sonar.api.server.authentication.UserIdentity;
@@ -41,12 +41,11 @@ import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import org.sonar.db.user.UserDto;
import org.sonar.server.authentication.event.AuthenticationEvent;
import org.sonar.server.authentication.event.AuthenticationEvent.Source;
import org.sonar.server.authentication.event.AuthenticationException;
import org.sonar.server.exceptions.BadRequestException;

import static org.apache.commons.lang.StringUtils.defaultIfBlank;
import static org.apache.commons.lang.time.DateUtils.addMinutes;
import static org.sonar.server.authentication.event.AuthenticationEvent.Source;
import static org.sonar.server.user.ExternalIdentity.SQ_AUTHORITY;

public class SsoAuthenticator implements Startable {
@@ -82,7 +81,7 @@ public class SsoAuthenticator implements Startable {
REFRESH_INTERVAL_PARAM, REFRESH_INTERVAL_DEFAULT_VALUE);

private final System2 system2;
private final Settings settings;
private final Configuration config;
private final UserIdentityAuthenticator userIdentityAuthenticator;
private final JwtHttpHandler jwtHttpHandler;
private final AuthenticationEvent authenticationEvent;
@@ -90,10 +89,10 @@ public class SsoAuthenticator implements Startable {
private boolean enabled = false;
private Map<String, String> settingsByKey = new HashMap<>();

public SsoAuthenticator(System2 system2, Settings settings, UserIdentityAuthenticator userIdentityAuthenticator,
public SsoAuthenticator(System2 system2, Configuration config, UserIdentityAuthenticator userIdentityAuthenticator,
JwtHttpHandler jwtHttpHandler, AuthenticationEvent authenticationEvent) {
this.system2 = system2;
this.settings = settings;
this.config = config;
this.userIdentityAuthenticator = userIdentityAuthenticator;
this.jwtHttpHandler = jwtHttpHandler;
this.authenticationEvent = authenticationEvent;
@@ -101,11 +100,11 @@ public class SsoAuthenticator implements Startable {

@Override
public void start() {
if (settings.getBoolean(ENABLE_PARAM)) {
if (config.getBoolean(ENABLE_PARAM).orElse(false)) {
LOG.info("SSO Authentication enabled");
enabled = true;
DEFAULT_VALUES_BY_SETTING_KEYS.entrySet()
.forEach(entry -> settingsByKey.put(entry.getKey(), defaultIfBlank(settings.getString(entry.getKey()), DEFAULT_VALUES_BY_SETTING_KEYS.get(entry.getKey()))));
.forEach(entry -> settingsByKey.put(entry.getKey(), config.get(entry.getKey()).orElse(DEFAULT_VALUES_BY_SETTING_KEYS.get(entry.getKey()))));
}
}


+ 8
- 8
server/sonar-server/src/main/java/org/sonar/server/authentication/UserSessionInitializer.java View File

@@ -24,10 +24,13 @@ import java.util.Optional;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.server.ServerSide;
import org.sonar.api.web.ServletFilter.UrlPattern;
import org.sonar.db.user.UserDto;
import org.sonar.server.authentication.event.AuthenticationEvent;
import org.sonar.server.authentication.event.AuthenticationEvent.Method;
import org.sonar.server.authentication.event.AuthenticationEvent.Source;
import org.sonar.server.authentication.event.AuthenticationException;
import org.sonar.server.user.ThreadLocalUserSession;
import org.sonar.server.user.UserSession;
@@ -35,11 +38,8 @@ import org.sonar.server.user.UserSessionFactory;

import static java.net.HttpURLConnection.HTTP_UNAUTHORIZED;
import static org.sonar.api.CoreProperties.CORE_FORCE_AUTHENTICATION_PROPERTY;
import static org.sonar.api.web.ServletFilter.UrlPattern;
import static org.sonar.api.web.ServletFilter.UrlPattern.Builder.staticResourcePatterns;
import static org.sonar.server.authentication.AuthenticationError.handleAuthenticationError;
import static org.sonar.server.authentication.event.AuthenticationEvent.Method;
import static org.sonar.server.authentication.event.AuthenticationEvent.Source;
import static org.sonar.server.authentication.ws.LoginAction.LOGIN_URL;
import static org.sonar.server.authentication.ws.LogoutAction.LOGOUT_URL;
import static org.sonar.server.authentication.ws.ValidateAction.VALIDATE_URL;
@@ -70,7 +70,7 @@ public class UserSessionInitializer {
.excludes(SKIPPED_URLS)
.build();

private final Settings settings;
private final Configuration config;
private final JwtHttpHandler jwtHttpHandler;
private final BasicAuthenticator basicAuthenticator;
private final SsoAuthenticator ssoAuthenticator;
@@ -78,10 +78,10 @@ public class UserSessionInitializer {
private final AuthenticationEvent authenticationEvent;
private final UserSessionFactory userSessionFactory;

public UserSessionInitializer(Settings settings, JwtHttpHandler jwtHttpHandler, BasicAuthenticator basicAuthenticator,
public UserSessionInitializer(Configuration config, JwtHttpHandler jwtHttpHandler, BasicAuthenticator basicAuthenticator,
SsoAuthenticator ssoAuthenticator, ThreadLocalUserSession threadLocalSession, AuthenticationEvent authenticationEvent,
UserSessionFactory userSessionFactory) {
this.settings = settings;
this.config = config;
this.jwtHttpHandler = jwtHttpHandler;
this.basicAuthenticator = basicAuthenticator;
this.ssoAuthenticator = ssoAuthenticator;
@@ -127,7 +127,7 @@ public class UserSessionInitializer {
threadLocalSession.set(session);
request.setAttribute(ACCESS_LOG_LOGIN, session.getLogin());
} else {
if (settings.getBoolean(CORE_FORCE_AUTHENTICATION_PROPERTY)) {
if (config.getBoolean(CORE_FORCE_AUTHENTICATION_PROPERTY).orElse(false)) {
throw AuthenticationException.newBuilder()
.setSource(Source.local(Method.BASIC))
.setMessage("User must be authenticated")

+ 5
- 5
server/sonar-server/src/main/java/org/sonar/server/authentication/ws/ValidateAction.java View File

@@ -29,7 +29,7 @@ import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.text.JsonWriter;
import org.sonar.api.web.ServletFilter;
@@ -48,12 +48,12 @@ public class ValidateAction extends ServletFilter implements AuthenticationWsAct
private static final String VALIDATE_ACTION = "validate";
public static final String VALIDATE_URL = "/" + AUTHENTICATION_CONTROLLER + "/" + VALIDATE_ACTION;

private final Settings settings;
private final Configuration config;
private final JwtHttpHandler jwtHttpHandler;
private final BasicAuthenticator basicAuthenticator;

public ValidateAction(Settings settings, BasicAuthenticator basicAuthenticator, JwtHttpHandler jwtHttpHandler) {
this.settings = settings;
public ValidateAction(Configuration config, BasicAuthenticator basicAuthenticator, JwtHttpHandler jwtHttpHandler) {
this.config = config;
this.basicAuthenticator = basicAuthenticator;
this.jwtHttpHandler = jwtHttpHandler;
}
@@ -97,7 +97,7 @@ public class ValidateAction extends ServletFilter implements AuthenticationWsAct
if (user.isPresent()) {
return true;
}
return !settings.getBoolean(CORE_FORCE_AUTHENTICATION_PROPERTY);
return !config.getBoolean(CORE_FORCE_AUTHENTICATION_PROPERTY).orElse(false);
} catch (AuthenticationException e) {
return false;
}

+ 5
- 5
server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndexDefinition.java View File

@@ -19,7 +19,7 @@
*/
package org.sonar.server.component.index;

import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.server.es.DefaultIndexSettingsElement;
import org.sonar.server.es.IndexDefinition;
import org.sonar.server.es.IndexType;
@@ -42,17 +42,17 @@ public class ComponentIndexDefinition implements IndexDefinition {

static final DefaultIndexSettingsElement[] NAME_ANALYZERS = {SORTABLE_ANALYZER, SEARCH_PREFIX_ANALYZER, SEARCH_PREFIX_CASE_INSENSITIVE_ANALYZER, SEARCH_GRAMS_ANALYZER};

private final Settings settings;
private final Configuration config;

public ComponentIndexDefinition(Settings settings) {
this.settings = settings;
public ComponentIndexDefinition(Configuration config) {
this.config = config;
}

@Override
public void define(IndexDefinitionContext context) {
NewIndex index = context.create(INDEX_TYPE_COMPONENT.getIndex());
index.refreshHandledByIndexer();
index.configureShards(settings, DEFAULT_NUMBER_OF_SHARDS);
index.configureShards(config, DEFAULT_NUMBER_OF_SHARDS);

NewIndex.NewIndexType mapping = index.createType(INDEX_TYPE_COMPONENT.getType())
.requireProjectAuthorization();

+ 9
- 9
server/sonar-server/src/main/java/org/sonar/server/computation/dbcleaner/ProjectCleaner.java View File

@@ -22,7 +22,7 @@ package org.sonar.server.computation.dbcleaner;
import java.util.Collection;
import org.sonar.api.CoreProperties;
import org.sonar.api.ce.ComputeEngineSide;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.server.ServerSide;
import org.sonar.api.utils.TimeUtils;
import org.sonar.api.utils.log.Logger;
@@ -54,22 +54,22 @@ public class ProjectCleaner {
this.purgeListener = purgeListener;
}

public ProjectCleaner purge(DbSession session, IdUuidPair idUuidPair, Settings projectSettings, Collection<String> disabledComponentUuids) {
public ProjectCleaner purge(DbSession session, IdUuidPair idUuidPair, Configuration projectConfig, Collection<String> disabledComponentUuids) {
long start = System.currentTimeMillis();
profiler.reset();

PurgeConfiguration configuration = newDefaultPurgeConfiguration(projectSettings, idUuidPair, disabledComponentUuids);
PurgeConfiguration configuration = newDefaultPurgeConfiguration(projectConfig, idUuidPair, disabledComponentUuids);

cleanHistoricalData(session, configuration.rootProjectIdUuid().getUuid(), projectSettings);
cleanHistoricalData(session, configuration.rootProjectIdUuid().getUuid(), projectConfig);
doPurge(session, configuration);

session.commit();
logProfiling(start, projectSettings);
logProfiling(start, projectConfig);
return this;
}

private void logProfiling(long start, Settings settings) {
if (settings.getBoolean(CoreProperties.PROFILING_LOG_PROPERTY)) {
private void logProfiling(long start, Configuration config) {
if (config.getBoolean(CoreProperties.PROFILING_LOG_PROPERTY).orElse(false)) {
long duration = System.currentTimeMillis() - start;
LOG.info("\n -------- Profiling for purge: " + TimeUtils.formatDuration(duration) + " --------\n");
profiler.dump(duration, LOG);
@@ -77,9 +77,9 @@ public class ProjectCleaner {
}
}

private void cleanHistoricalData(DbSession session, String rootUuid, Settings settings) {
private void cleanHistoricalData(DbSession session, String rootUuid, Configuration config) {
try {
periodCleaner.clean(session, rootUuid, settings);
periodCleaner.clean(session, rootUuid, config);
} catch (Exception e) {
// purge errors must no fail the batch
LOG.error("Fail to clean historical data [uuid=" + rootUuid + "]", e);

+ 14
- 12
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/api/measurecomputer/MeasureComputerContextImpl.java View File

@@ -32,22 +32,23 @@ import javax.annotation.Nullable;
import org.sonar.api.ce.measure.Component;
import org.sonar.api.ce.measure.Issue;
import org.sonar.api.ce.measure.Measure;
import org.sonar.api.ce.measure.MeasureComputer.MeasureComputerContext;
import org.sonar.api.ce.measure.MeasureComputer.MeasureComputerDefinition;
import org.sonar.api.ce.measure.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.server.computation.task.projectanalysis.component.SettingsRepository;
import org.sonar.server.computation.task.projectanalysis.component.ConfigurationRepository;
import org.sonar.server.computation.task.projectanalysis.issue.ComponentIssuesRepository;
import org.sonar.server.computation.task.projectanalysis.measure.MeasureRepository;
import org.sonar.server.computation.task.projectanalysis.metric.Metric;
import org.sonar.server.computation.task.projectanalysis.metric.MetricRepository;

import static com.google.common.base.Preconditions.checkArgument;
import static org.sonar.api.ce.measure.MeasureComputer.MeasureComputerContext;
import static org.sonar.api.ce.measure.MeasureComputer.MeasureComputerDefinition;
import static org.sonar.server.computation.task.projectanalysis.measure.Measure.newMeasureBuilder;

public class MeasureComputerContextImpl implements MeasureComputerContext {

private final SettingsRepository settings;
private final ConfigurationRepository config;
private final MeasureRepository measureRepository;
private final MetricRepository metricRepository;

@@ -58,9 +59,9 @@ public class MeasureComputerContextImpl implements MeasureComputerContext {
private MeasureComputerDefinition definition;
private Set<String> allowedMetrics;

public MeasureComputerContextImpl(org.sonar.server.computation.task.projectanalysis.component.Component component, SettingsRepository settings,
public MeasureComputerContextImpl(org.sonar.server.computation.task.projectanalysis.component.Component component, ConfigurationRepository config,
MeasureRepository measureRepository, MetricRepository metricRepository, ComponentIssuesRepository componentIssuesRepository) {
this.settings = settings;
this.config = config;
this.internalComponent = component;
this.measureRepository = measureRepository;
this.metricRepository = metricRepository;
@@ -96,7 +97,7 @@ public class MeasureComputerContextImpl implements MeasureComputerContext {
@Override
@CheckForNull
public String getString(String key) {
return getComponentSettings().getString(key);
return getComponentSettings().get(key).orElse(null);
}

@Override
@@ -106,8 +107,8 @@ public class MeasureComputerContextImpl implements MeasureComputerContext {
};
}

private org.sonar.api.config.Settings getComponentSettings() {
return settings.getSettings(internalComponent);
private Configuration getComponentSettings() {
return config.getConfiguration(internalComponent);
}

@Override
@@ -187,11 +188,12 @@ public class MeasureComputerContextImpl implements MeasureComputerContext {
component.getKey(),
Component.Type.valueOf(component.getType().name()),
component.getType() == org.sonar.server.computation.task.projectanalysis.component.Component.Type.FILE
? new ComponentImpl.FileAttributesImpl(component.getFileAttributes().getLanguageKey(), component.getFileAttributes().isUnitTest()) : null);
? new ComponentImpl.FileAttributesImpl(component.getFileAttributes().getLanguageKey(), component.getFileAttributes().isUnitTest())
: null);
}

private class ComponentToMeasure implements Function<org.sonar.server.computation.task.projectanalysis.component.Component,
Optional<org.sonar.server.computation.task.projectanalysis.measure.Measure>> {
private class ComponentToMeasure
implements Function<org.sonar.server.computation.task.projectanalysis.component.Component, Optional<org.sonar.server.computation.task.projectanalysis.measure.Measure>> {

private final Metric metric;


server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/SettingsRepository.java → server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ConfigurationRepository.java View File

@@ -19,14 +19,14 @@
*/
package org.sonar.server.computation.task.projectanalysis.component;

import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;

/**
* Repository of component settings.
*/
public interface SettingsRepository {
public interface ConfigurationRepository {
/**
* Returns the settings for the specified Component.
* Returns the configuration for the specified Component.
*/
Settings getSettings(Component component);
Configuration getConfiguration(Component component);
}

server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/SettingsRepositoryImpl.java → server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ConfigurationRepositoryImpl.java View File

@@ -21,35 +21,35 @@ package org.sonar.server.computation.task.projectanalysis.component;

import java.util.Collection;
import java.util.Map;
import org.sonar.api.config.Settings;
import org.sonar.ce.settings.ProjectSettingsFactory;
import org.sonar.api.config.Configuration;
import org.sonar.ce.settings.ProjectConfigurationFactory;
import org.sonar.server.util.cache.CacheLoader;
import org.sonar.server.util.cache.MemoryCache;

/**
* Repository of component settings implementation based on a memory cache.
*/
public class SettingsRepositoryImpl implements SettingsRepository {
public class ConfigurationRepositoryImpl implements ConfigurationRepository {

private final ProjectSettingsFactory projectSettingsFactory;
private final MemoryCache<String, Settings> cache = new MemoryCache<>(new CacheLoader<String, Settings>() {
private final ProjectConfigurationFactory projectConfigurationFactory;
private final MemoryCache<String, Configuration> cache = new MemoryCache<>(new CacheLoader<String, Configuration>() {
@Override
public Settings load(String key) {
return projectSettingsFactory.newProjectSettings(key);
public Configuration load(String key) {
return projectConfigurationFactory.newProjectConfiguration(key);
}

@Override
public Map<String, Settings> loadAll(Collection<? extends String> keys) {
public Map<String, Configuration> loadAll(Collection<? extends String> keys) {
throw new UnsupportedOperationException("loadAll is not supported");
}
});

public SettingsRepositoryImpl(ProjectSettingsFactory projectSettingsFactory) {
this.projectSettingsFactory = projectSettingsFactory;
public ConfigurationRepositoryImpl(ProjectConfigurationFactory projectSettingsFactory) {
this.projectConfigurationFactory = projectSettingsFactory;
}

@Override
public Settings getSettings(Component component){
public Configuration getConfiguration(Component component) {
return cache.get(component.getKey());
}


+ 2
- 2
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java View File

@@ -35,7 +35,7 @@ import org.sonar.server.computation.task.projectanalysis.batch.BatchReportDirect
import org.sonar.server.computation.task.projectanalysis.batch.BatchReportReaderImpl;
import org.sonar.server.computation.task.projectanalysis.component.DbIdsRepositoryImpl;
import org.sonar.server.computation.task.projectanalysis.component.DisabledComponentsHolderImpl;
import org.sonar.server.computation.task.projectanalysis.component.SettingsRepositoryImpl;
import org.sonar.server.computation.task.projectanalysis.component.ConfigurationRepositoryImpl;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolderImpl;
import org.sonar.server.computation.task.projectanalysis.duplication.CrossProjectDuplicationStatusHolderImpl;
import org.sonar.server.computation.task.projectanalysis.duplication.DuplicationRepositoryImpl;
@@ -166,7 +166,7 @@ public final class ProjectAnalysisTaskContainerPopulator implements ContainerPop
LanguageRepositoryImpl.class,
MeasureRepositoryImpl.class,
EventRepositoryImpl.class,
SettingsRepositoryImpl.class,
ConfigurationRepositoryImpl.class,
DbIdsRepositoryImpl.class,
DisabledComponentsHolderImpl.class,
QualityGateServiceImpl.class,

+ 6
- 11
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/duplication/IntegrateCrossProjectDuplications.java View File

@@ -27,7 +27,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Nonnull;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import org.sonar.duplications.block.Block;
@@ -52,13 +52,13 @@ public class IntegrateCrossProjectDuplications {
private static final int MAX_CLONE_GROUP_PER_FILE = 100;
private static final int MAX_CLONE_PART_PER_GROUP = 100;

private final Settings settings;
private final Configuration config;
private final DuplicationRepository duplicationRepository;

private Map<String, NumberOfUnitsNotLessThan> numberOfUnitsByLanguage = new HashMap<>();

public IntegrateCrossProjectDuplications(Settings settings, DuplicationRepository duplicationRepository) {
this.settings = settings;
public IntegrateCrossProjectDuplications(Configuration config, DuplicationRepository duplicationRepository) {
this.config = config;
this.duplicationRepository = duplicationRepository;
}

@@ -96,8 +96,7 @@ public class IntegrateCrossProjectDuplications {
if (!Iterables.isEmpty(duplicates)) {
duplicationRepository.add(
file,
new Duplication(new TextBlock(originPart.getStartLine(), originPart.getEndLine()), duplicates)
);
new Duplication(new TextBlock(originPart.getStartLine(), originPart.getEndLine()), duplicates));
}
}

@@ -123,11 +122,7 @@ public class IntegrateCrossProjectDuplications {
if (languageKey.equalsIgnoreCase(JAVA_KEY)) {
return 0;
}
int minimumTokens = settings.getInt("sonar.cpd." + languageKey + ".minimumTokens");
if (minimumTokens == 0) {
return 100;
}
return minimumTokens;
return config.getInt("sonar.cpd." + languageKey + ".minimumTokens").orElse(100);
}

private static class NumberOfUnitsNotLessThan implements Predicate<CloneGroup> {

+ 5
- 5
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/DefaultAssignee.java View File

@@ -27,7 +27,7 @@ import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.user.UserDto;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolder;
import org.sonar.server.computation.task.projectanalysis.component.SettingsRepository;
import org.sonar.server.computation.task.projectanalysis.component.ConfigurationRepository;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolder;

import static org.sonar.api.CoreProperties.DEFAULT_ISSUE_ASSIGNEE;
@@ -42,16 +42,16 @@ public class DefaultAssignee {

private final DbClient dbClient;
private final TreeRootHolder treeRootHolder;
private final SettingsRepository settingsRepository;
private final ConfigurationRepository configRepository;
private final AnalysisMetadataHolder analysisMetadataHolder;

private boolean loaded = false;
private String login = null;

public DefaultAssignee(DbClient dbClient, TreeRootHolder treeRootHolder, SettingsRepository settingsRepository, AnalysisMetadataHolder analysisMetadataHolder) {
public DefaultAssignee(DbClient dbClient, TreeRootHolder treeRootHolder, ConfigurationRepository configRepository, AnalysisMetadataHolder analysisMetadataHolder) {
this.dbClient = dbClient;
this.treeRootHolder = treeRootHolder;
this.settingsRepository = settingsRepository;
this.configRepository = configRepository;
this.analysisMetadataHolder = analysisMetadataHolder;
}

@@ -60,7 +60,7 @@ public class DefaultAssignee {
if (loaded) {
return login;
}
String configuredLogin = settingsRepository.getSettings(treeRootHolder.getRoot()).getString(DEFAULT_ISSUE_ASSIGNEE);
String configuredLogin = configRepository.getConfiguration(treeRootHolder.getRoot()).get(DEFAULT_ISSUE_ASSIGNEE).orElse(null);
if (!Strings.isNullOrEmpty(configuredLogin) && isValidLogin(configuredLogin)) {
this.login = configuredLogin;
}

+ 10
- 11
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/filter/IssueFilter.java View File

@@ -24,18 +24,17 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.sonar.api.ce.ComputeEngineSide;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.server.computation.task.projectanalysis.component.Component;
import org.sonar.server.computation.task.projectanalysis.component.SettingsRepository;
import org.sonar.server.computation.task.projectanalysis.component.ConfigurationRepository;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolder;

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Strings.isNullOrEmpty;
import static java.lang.String.format;
import static org.apache.commons.lang.StringUtils.defaultIfBlank;
import static org.sonar.core.config.IssueExclusionProperties.PATTERNS_MULTICRITERIA_EXCLUSION_KEY;
import static org.sonar.core.config.IssueExclusionProperties.PATTERNS_MULTICRITERIA_INCLUSION_KEY;
import static org.sonar.core.config.IssueExclusionProperties.RESOURCE_KEY;
@@ -50,10 +49,10 @@ public class IssueFilter {
private final List<IssuePattern> exclusionPatterns;
private final List<IssuePattern> inclusionPatterns;

public IssueFilter(TreeRootHolder treeRootHolder, SettingsRepository settingsRepository) {
Settings settings = settingsRepository.getSettings(treeRootHolder.getRoot());
this.exclusionPatterns = loadPatterns(PATTERNS_MULTICRITERIA_EXCLUSION_KEY, settings);
this.inclusionPatterns = loadPatterns(PATTERNS_MULTICRITERIA_INCLUSION_KEY, settings);
public IssueFilter(TreeRootHolder treeRootHolder, ConfigurationRepository configRepository) {
Configuration config = configRepository.getConfiguration(treeRootHolder.getRoot());
this.exclusionPatterns = loadPatterns(PATTERNS_MULTICRITERIA_EXCLUSION_KEY, config);
this.inclusionPatterns = loadPatterns(PATTERNS_MULTICRITERIA_INCLUSION_KEY, config);
}

public boolean accept(DefaultIssue issue, Component component) {
@@ -108,14 +107,14 @@ public class IssueFilter {
}
}

private static List<IssuePattern> loadPatterns(String propertyKey, Settings settings) {
private static List<IssuePattern> loadPatterns(String propertyKey, Configuration settings) {
List<IssuePattern> patterns = new ArrayList<>();
String patternConf = defaultIfBlank(settings.getString(propertyKey), "");
String patternConf = settings.get(propertyKey).orElse("");
for (String id : Splitter.on(",").omitEmptyStrings().split(patternConf)) {
String propPrefix = propertyKey + "." + id + ".";
String componentPathPattern = settings.getString(propPrefix + RESOURCE_KEY);
String componentPathPattern = settings.get(propPrefix + RESOURCE_KEY).orElse(null);
checkArgument(!isNullOrEmpty(componentPathPattern), format("File path pattern cannot be empty. Please check '%s' settings", propertyKey));
String ruleKeyPattern = settings.getString(propPrefix + RULE_KEY);
String ruleKeyPattern = settings.get(propPrefix + RULE_KEY).orElse(null);
checkArgument(!isNullOrEmpty(ruleKeyPattern), format("Rule key pattern cannot be empty. Please check '%s' settings", propertyKey));
patterns.add(new IssuePattern(componentPathPattern, ruleKeyPattern));
}

+ 3
- 3
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/measure/MeasureComputersVisitor.java View File

@@ -23,7 +23,7 @@ import org.sonar.api.ce.measure.MeasureComputer;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import org.sonar.server.computation.task.projectanalysis.component.CrawlerDepthLimit;
import org.sonar.server.computation.task.projectanalysis.component.SettingsRepository;
import org.sonar.server.computation.task.projectanalysis.component.ConfigurationRepository;
import org.sonar.server.computation.task.projectanalysis.component.TypeAwareVisitorAdapter;
import org.sonar.server.computation.task.projectanalysis.issue.ComponentIssuesRepository;
import org.sonar.server.computation.task.projectanalysis.api.measurecomputer.MeasureComputerContextImpl;
@@ -40,12 +40,12 @@ public class MeasureComputersVisitor extends TypeAwareVisitorAdapter {

private final MetricRepository metricRepository;
private final MeasureRepository measureRepository;
private final SettingsRepository settings;
private final ConfigurationRepository settings;

private final MeasureComputersHolder measureComputersHolder;
private final ComponentIssuesRepository componentIssuesRepository;

public MeasureComputersVisitor(MetricRepository metricRepository, MeasureRepository measureRepository, SettingsRepository settings,
public MeasureComputersVisitor(MetricRepository metricRepository, MeasureRepository measureRepository, ConfigurationRepository settings,
MeasureComputersHolder measureComputersHolder, ComponentIssuesRepository componentIssuesRepository) {
super(CrawlerDepthLimit.reportMaxDepth(FILE).withViewsMaxDepth(SUBVIEW), POST_ORDER);
this.metricRepository = metricRepository;

+ 19
- 21
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/qualitymodel/RatingSettings.java View File

@@ -24,7 +24,7 @@ import java.util.Map;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.utils.MessageException;

import static java.lang.String.format;
@@ -38,32 +38,30 @@ import static org.sonar.api.CoreProperties.RATING_GRID_DEF_VALUES;

public class RatingSettings {

private final Settings settings;
private final Configuration config;
private final Map<String, LanguageSpecificConfiguration> languageSpecificConfigurationByLanguageKey;

public RatingSettings(Settings settings) {
this.settings = settings;
this.languageSpecificConfigurationByLanguageKey = buildLanguageSpecificConfigurationByLanguageKey(settings);
public RatingSettings(Configuration config) {
this.config = config;
this.languageSpecificConfigurationByLanguageKey = buildLanguageSpecificConfigurationByLanguageKey(config);
}

private static Map<String, LanguageSpecificConfiguration> buildLanguageSpecificConfigurationByLanguageKey(Settings settings) {
private static Map<String, LanguageSpecificConfiguration> buildLanguageSpecificConfigurationByLanguageKey(Configuration config) {
ImmutableMap.Builder<String, LanguageSpecificConfiguration> builder = ImmutableMap.builder();
String[] languageConfigIndexes = settings.getStringArray(LANGUAGE_SPECIFIC_PARAMETERS);
String[] languageConfigIndexes = config.getStringArray(LANGUAGE_SPECIFIC_PARAMETERS);
for (String languageConfigIndex : languageConfigIndexes) {
String languagePropertyKey = LANGUAGE_SPECIFIC_PARAMETERS + "." + languageConfigIndex + "." + LANGUAGE_SPECIFIC_PARAMETERS_LANGUAGE_KEY;
String languageKey = settings.getString(languagePropertyKey);
if (languageKey == null) {
throw MessageException.of("Technical debt configuration is corrupted. At least one language specific parameter has no Language key. " +
"Contact your administrator to update this configuration in the global administration section of SonarQube.");
}
builder.put(languageKey, LanguageSpecificConfiguration.create(settings, languageConfigIndex));
String languageKey = config.get(languagePropertyKey)
.orElseThrow(() -> MessageException.of("Technical debt configuration is corrupted. At least one language specific parameter has no Language key. " +
"Contact your administrator to update this configuration in the global administration section of SonarQube."));
builder.put(languageKey, LanguageSpecificConfiguration.create(config, languageConfigIndex));
}
return builder.build();
}

public RatingGrid getRatingGrid() {
try {
String[] ratingGrades = settings.getStringArray(RATING_GRID);
String[] ratingGrades = config.getStringArray(RATING_GRID);
double[] grid = new double[4];
for (int i = 0; i < 4; i++) {
grid[i] = Double.parseDouble(ratingGrades[i]);
@@ -72,7 +70,7 @@ public class RatingSettings {
} catch (Exception e) {
throw new IllegalArgumentException("The rating grid is incorrect. Expected something similar to '"
+ RATING_GRID_DEF_VALUES + "' and got '"
+ settings.getString(RATING_GRID) + "'", e);
+ config.get(RATING_GRID).get() + "'", e);
}
}

@@ -93,10 +91,10 @@ public class RatingSettings {

private long getDefaultDevelopmentCost() {
try {
return Long.parseLong(settings.getString(DEVELOPMENT_COST));
return Long.parseLong(config.get(DEVELOPMENT_COST).get());
} catch (NumberFormatException e) {
throw new IllegalArgumentException("The value of the development cost property '" + DEVELOPMENT_COST
+ "' is incorrect. Expected long but got '" + settings.getString(DEVELOPMENT_COST) + "'", e);
+ "' is incorrect. Expected long but got '" + config.get(DEVELOPMENT_COST).get() + "'", e);
}
}

@@ -117,13 +115,13 @@ public class RatingSettings {
this.metricKey = metricKey;
}

static LanguageSpecificConfiguration create(Settings settings, String configurationId) {
static LanguageSpecificConfiguration create(Configuration config, String configurationId) {

String configurationPrefix = LANGUAGE_SPECIFIC_PARAMETERS + "." + configurationId + ".";

String language = settings.getString(configurationPrefix + LANGUAGE_SPECIFIC_PARAMETERS_LANGUAGE_KEY);
String manDays = settings.getString(configurationPrefix + LANGUAGE_SPECIFIC_PARAMETERS_MAN_DAYS_KEY);
String metric = settings.getString(configurationPrefix + LANGUAGE_SPECIFIC_PARAMETERS_SIZE_METRIC_KEY);
String language = config.get(configurationPrefix + LANGUAGE_SPECIFIC_PARAMETERS_LANGUAGE_KEY).orElse(null);
String manDays = config.get(configurationPrefix + LANGUAGE_SPECIFIC_PARAMETERS_MAN_DAYS_KEY).orElse(null);
String metric = config.get(configurationPrefix + LANGUAGE_SPECIFIC_PARAMETERS_SIZE_METRIC_KEY).orElse(null);

return new LanguageSpecificConfiguration(language, manDays, metric);
}

+ 7
- 7
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/LoadPeriodsStep.java View File

@@ -21,14 +21,14 @@ package org.sonar.server.computation.task.projectanalysis.step;

import com.google.common.base.Optional;
import javax.annotation.CheckForNull;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.ComponentDto;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolder;
import org.sonar.server.computation.task.projectanalysis.component.Component;
import org.sonar.server.computation.task.projectanalysis.component.ConfigurationRepository;
import org.sonar.server.computation.task.projectanalysis.component.DepthTraversalTypeAwareCrawler;
import org.sonar.server.computation.task.projectanalysis.component.SettingsRepository;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolder;
import org.sonar.server.computation.task.projectanalysis.component.TypeAwareVisitorAdapter;
import org.sonar.server.computation.task.projectanalysis.period.Period;
@@ -52,15 +52,15 @@ import static org.sonar.server.computation.task.projectanalysis.component.Crawle
public class LoadPeriodsStep implements ComputationStep {

private final DbClient dbClient;
private final SettingsRepository settingsRepository;
private final ConfigurationRepository configRepository;
private final TreeRootHolder treeRootHolder;
private final AnalysisMetadataHolder analysisMetadataHolder;
private final PeriodHolderImpl periodsHolder;

public LoadPeriodsStep(DbClient dbClient, SettingsRepository settingsRepository, TreeRootHolder treeRootHolder, AnalysisMetadataHolder analysisMetadataHolder,
public LoadPeriodsStep(DbClient dbClient, ConfigurationRepository settingsRepository, TreeRootHolder treeRootHolder, AnalysisMetadataHolder analysisMetadataHolder,
PeriodHolderImpl periodsHolder) {
this.dbClient = dbClient;
this.settingsRepository = settingsRepository;
this.configRepository = settingsRepository;
this.treeRootHolder = treeRootHolder;
this.analysisMetadataHolder = analysisMetadataHolder;
this.periodsHolder = periodsHolder;
@@ -100,8 +100,8 @@ public class LoadPeriodsStep implements ComputationStep {
PeriodResolver periodResolver = new PeriodResolver(dbClient, session, projectDto.get().uuid(), analysisMetadataHolder.getAnalysisDate(),
isReportType ? projectOrView.getReportAttributes().getVersion() : null);

Settings settings = settingsRepository.getSettings(projectOrView);
Period period = periodResolver.resolve(settings);
Configuration config = configRepository.getConfiguration(projectOrView);
Period period = periodResolver.resolve(config);
// SONAR-4700 Add a past snapshot only if it exists
if (period != null) {
return period;

+ 9
- 9
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/LoadQualityGateStep.java View File

@@ -21,13 +21,13 @@ package org.sonar.server.computation.task.projectanalysis.step;

import com.google.common.base.Optional;
import org.apache.commons.lang.StringUtils;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import org.sonar.server.computation.task.projectanalysis.component.Component;
import org.sonar.server.computation.task.projectanalysis.component.ConfigurationRepository;
import org.sonar.server.computation.task.projectanalysis.component.CrawlerDepthLimit;
import org.sonar.server.computation.task.projectanalysis.component.DepthTraversalTypeAwareCrawler;
import org.sonar.server.computation.task.projectanalysis.component.SettingsRepository;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolder;
import org.sonar.server.computation.task.projectanalysis.component.TypeAwareVisitorAdapter;
import org.sonar.server.computation.task.projectanalysis.qualitygate.MutableQualityGateHolder;
@@ -47,14 +47,14 @@ public class LoadQualityGateStep implements ComputationStep {
private static final String PROPERTY_QUALITY_GATE = "sonar.qualitygate";

private final TreeRootHolder treeRootHolder;
private final SettingsRepository settingsRepository;
private final ConfigurationRepository configRepository;
private final QualityGateService qualityGateService;
private final MutableQualityGateHolder qualityGateHolder;

public LoadQualityGateStep(TreeRootHolder treeRootHolder, SettingsRepository settingsRepository,
QualityGateService qualityGateService, MutableQualityGateHolder qualityGateHolder) {
public LoadQualityGateStep(TreeRootHolder treeRootHolder, ConfigurationRepository settingsRepository,
QualityGateService qualityGateService, MutableQualityGateHolder qualityGateHolder) {
this.treeRootHolder = treeRootHolder;
this.settingsRepository = settingsRepository;
this.configRepository = settingsRepository;
this.qualityGateService = qualityGateService;
this.qualityGateHolder = qualityGateHolder;
}
@@ -72,10 +72,10 @@ public class LoadQualityGateStep implements ComputationStep {

private void executeForProject(Component project) {
String projectKey = project.getKey();
Settings settings = settingsRepository.getSettings(project);
String qualityGateSetting = settings.getString(PROPERTY_QUALITY_GATE);
Configuration config = configRepository.getConfiguration(project);
String qualityGateSetting = config.get(PROPERTY_QUALITY_GATE).orElse(null);

if (qualityGateSetting == null || StringUtils.isBlank(qualityGateSetting)) {
if (StringUtils.isBlank(qualityGateSetting)) {
LOGGER.debug("No quality gate is configured for project " + projectKey);
qualityGateHolder.setNoQualityGate();
return;

+ 5
- 5
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PeriodResolver.java View File

@@ -25,7 +25,7 @@ import java.util.List;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
import org.apache.commons.lang.StringUtils;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
@@ -65,8 +65,8 @@ public class PeriodResolver {
}

@CheckForNull
public Period resolve(Settings settings) {
String propertyValue = getPropertyValue(settings);
public Period resolve(Configuration config) {
String propertyValue = getPropertyValue(config);
if (StringUtils.isBlank(propertyValue)) {
return null;
}
@@ -207,7 +207,7 @@ public class PeriodResolver {
return DateUtils.formatDate(Date.from(new Date(date).toInstant().truncatedTo(ChronoUnit.SECONDS)));
}

private static String getPropertyValue(Settings settings) {
return settings.getString(LEAK_PERIOD);
private static String getPropertyValue(Configuration config) {
return config.get(LEAK_PERIOD).get();
}
}

+ 5
- 5
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PurgeDatastoresStep.java View File

@@ -26,7 +26,7 @@ import org.sonar.server.computation.task.projectanalysis.component.Component;
import org.sonar.server.computation.task.projectanalysis.component.DbIdsRepository;
import org.sonar.server.computation.task.projectanalysis.component.DepthTraversalTypeAwareCrawler;
import org.sonar.server.computation.task.projectanalysis.component.DisabledComponentsHolder;
import org.sonar.server.computation.task.projectanalysis.component.SettingsRepository;
import org.sonar.server.computation.task.projectanalysis.component.ConfigurationRepository;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolder;
import org.sonar.server.computation.task.projectanalysis.component.TypeAwareVisitorAdapter;
import org.sonar.server.computation.dbcleaner.ProjectCleaner;
@@ -43,16 +43,16 @@ public class PurgeDatastoresStep implements ComputationStep {
private final DbClient dbClient;
private final DbIdsRepository dbIdsRepository;
private final TreeRootHolder treeRootHolder;
private final SettingsRepository settingsRepository;
private final ConfigurationRepository configRepository;
private final DisabledComponentsHolder disabledComponentsHolder;

public PurgeDatastoresStep(DbClient dbClient, ProjectCleaner projectCleaner, DbIdsRepository dbIdsRepository, TreeRootHolder treeRootHolder,
SettingsRepository settingsRepository, DisabledComponentsHolder disabledComponentsHolder) {
ConfigurationRepository configRepository, DisabledComponentsHolder disabledComponentsHolder) {
this.projectCleaner = projectCleaner;
this.dbClient = dbClient;
this.dbIdsRepository = dbIdsRepository;
this.treeRootHolder = treeRootHolder;
this.settingsRepository = settingsRepository;
this.configRepository = configRepository;
this.disabledComponentsHolder = disabledComponentsHolder;
}

@@ -75,7 +75,7 @@ public class PurgeDatastoresStep implements ComputationStep {
private void execute(Component root) {
try (DbSession dbSession = dbClient.openSession(true)) {
IdUuidPair idUuidPair = new IdUuidPair(dbIdsRepository.getComponentId(root), root.getUuid());
projectCleaner.purge(dbSession, idUuidPair, settingsRepository.getSettings(root), disabledComponentsHolder.getUuids());
projectCleaner.purge(dbSession, idUuidPair, configRepository.getConfiguration(root), disabledComponentsHolder.getUuids());
dbSession.commit();
}
}

+ 14
- 14
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookPostTask.java View File

@@ -24,12 +24,12 @@ import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import org.sonar.api.ce.posttask.PostProjectAnalysisTask;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import org.sonar.core.config.WebhookProperties;
import org.sonar.core.util.stream.MoreCollectors;
import org.sonar.server.computation.task.projectanalysis.component.SettingsRepository;
import org.sonar.server.computation.task.projectanalysis.component.ConfigurationRepository;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolder;

import static java.lang.String.format;
@@ -40,15 +40,15 @@ public class WebhookPostTask implements PostProjectAnalysisTask {
private static final Logger LOGGER = Loggers.get(WebhookPostTask.class);

private final TreeRootHolder rootHolder;
private final SettingsRepository settingsRepository;
private final ConfigurationRepository configRepository;
private final WebhookPayloadFactory payloadFactory;
private final WebhookCaller caller;
private final WebhookDeliveryStorage deliveryStorage;

public WebhookPostTask(TreeRootHolder rootHolder, SettingsRepository settingsRepository, WebhookPayloadFactory payloadFactory,
public WebhookPostTask(TreeRootHolder rootHolder, ConfigurationRepository settingsRepository, WebhookPayloadFactory payloadFactory,
WebhookCaller caller, WebhookDeliveryStorage deliveryStorage) {
this.rootHolder = rootHolder;
this.settingsRepository = settingsRepository;
this.configRepository = settingsRepository;
this.payloadFactory = payloadFactory;
this.caller = caller;
this.deliveryStorage = deliveryStorage;
@@ -56,30 +56,30 @@ public class WebhookPostTask implements PostProjectAnalysisTask {

@Override
public void finished(ProjectAnalysis analysis) {
Settings settings = settingsRepository.getSettings(rootHolder.getRoot());
Configuration config = configRepository.getConfiguration(rootHolder.getRoot());

Iterable<String> webhookProps = Iterables.concat(
getWebhookProperties(settings, WebhookProperties.GLOBAL_KEY),
getWebhookProperties(settings, WebhookProperties.PROJECT_KEY));
getWebhookProperties(config, WebhookProperties.GLOBAL_KEY),
getWebhookProperties(config, WebhookProperties.PROJECT_KEY));
if (!Iterables.isEmpty(webhookProps)) {
process(settings, analysis, webhookProps);
process(config, analysis, webhookProps);
deliveryStorage.purge(analysis.getProject().getUuid());
}
}

private static List<String> getWebhookProperties(Settings settings, String propertyKey) {
String[] webhookIds = settings.getStringArray(propertyKey);
private static List<String> getWebhookProperties(Configuration config, String propertyKey) {
String[] webhookIds = config.getStringArray(propertyKey);
return Arrays.stream(webhookIds)
.map(webhookId -> format("%s.%s", propertyKey, webhookId))
.limit(MAX_WEBHOOKS_PER_TYPE)
.collect(MoreCollectors.toList(webhookIds.length));
}

private void process(Settings settings, ProjectAnalysis analysis, Iterable<String> webhookProperties) {
private void process(Configuration config, ProjectAnalysis analysis, Iterable<String> webhookProperties) {
WebhookPayload payload = payloadFactory.create(analysis);
for (String webhookProp : webhookProperties) {
String name = settings.getString(format("%s.%s", webhookProp, WebhookProperties.NAME_FIELD));
String url = settings.getString(format("%s.%s", webhookProp, WebhookProperties.URL_FIELD));
String name = config.get(format("%s.%s", webhookProp, WebhookProperties.NAME_FIELD)).orElse(null);
String url = config.get(format("%s.%s", webhookProp, WebhookProperties.URL_FIELD)).orElse(null);
// as webhooks are defined as property sets, we can't ensure validity of fields on creation.
if (name != null && url != null) {
Webhook webhook = new Webhook(analysis.getProject().getUuid(), analysis.getCeTask().getId(), name, url);

+ 7
- 7
server/sonar-server/src/main/java/org/sonar/server/es/EsClientProvider.java View File

@@ -29,7 +29,7 @@ import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.transport.TransportAddress;
import org.picocontainer.injectors.ProviderAdapter;
import org.sonar.api.ce.ComputeEngineSide;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.server.ServerSide;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
@@ -43,25 +43,25 @@ public class EsClientProvider extends ProviderAdapter {

private EsClient cache;

public EsClient provide(Settings settings) {
public EsClient provide(Configuration config) {
if (cache == null) {
TransportClient nativeClient;
org.elasticsearch.common.settings.Settings.Builder esSettings = org.elasticsearch.common.settings.Settings.builder();

// mandatory property defined by bootstrap process
esSettings.put("cluster.name", settings.getString(ProcessProperties.CLUSTER_NAME));
esSettings.put("cluster.name", config.get(ProcessProperties.CLUSTER_NAME).get());

boolean clusterEnabled = settings.getBoolean(ProcessProperties.CLUSTER_ENABLED);
if (clusterEnabled && settings.getBoolean(ProcessProperties.CLUSTER_SEARCH_DISABLED)) {
boolean clusterEnabled = config.getBoolean(ProcessProperties.CLUSTER_ENABLED).orElse(false);
if (clusterEnabled && config.getBoolean(ProcessProperties.CLUSTER_SEARCH_DISABLED).orElse(false)) {
esSettings.put("client.transport.sniff", true);
nativeClient = TransportClient.builder().settings(esSettings).build();
Arrays.stream(settings.getStringArray(ProcessProperties.CLUSTER_SEARCH_HOSTS))
Arrays.stream(config.getStringArray(ProcessProperties.CLUSTER_SEARCH_HOSTS))
.map(HostAndPort::fromString)
.forEach(h -> addHostToClient(h, nativeClient));
LOGGER.info("Connected to remote Elasticsearch: [{}]", displayedAddresses(nativeClient));
} else {
nativeClient = TransportClient.builder().settings(esSettings).build();
HostAndPort host = HostAndPort.fromParts(settings.getString(ProcessProperties.SEARCH_HOST), settings.getInt(ProcessProperties.SEARCH_PORT));
HostAndPort host = HostAndPort.fromParts(config.get(ProcessProperties.SEARCH_HOST).get(), config.getInt(ProcessProperties.SEARCH_PORT).get());
addHostToClient(host, nativeClient);
LOGGER.info("Connected to local Elasticsearch: [{}]", displayedAddresses(nativeClient));
}

+ 5
- 4
server/sonar-server/src/main/java/org/sonar/server/es/IndexDefinitions.java View File

@@ -24,6 +24,7 @@ import com.google.common.collect.Maps;
import java.util.Map;
import org.elasticsearch.common.settings.Settings;
import org.picocontainer.Startable;
import org.sonar.api.config.Configuration;
import org.sonar.api.server.ServerSide;

/**
@@ -87,11 +88,11 @@ public class IndexDefinitions implements Startable {

private final Map<String, Index> byKey = Maps.newHashMap();
private final IndexDefinition[] defs;
private final org.sonar.api.config.Settings settings;
private final Configuration config;

public IndexDefinitions(IndexDefinition[] defs, org.sonar.api.config.Settings settings) {
public IndexDefinitions(IndexDefinition[] defs, Configuration config) {
this.defs = defs;
this.settings = settings;
this.config = config;
}

public Map<String, Index> getIndices() {
@@ -103,7 +104,7 @@ public class IndexDefinitions implements Startable {
// collect definitions
IndexDefinition.IndexDefinitionContext context = new IndexDefinition.IndexDefinitionContext();

if (!settings.getBoolean("sonar.internal.es.disableIndexes")) {
if (!config.getBoolean("sonar.internal.es.disableIndexes").orElse(false)) {
for (IndexDefinition definition : defs) {
definition.define(context);
}

+ 5
- 5
server/sonar-server/src/main/java/org/sonar/server/es/IndexerStartupTask.java View File

@@ -27,7 +27,7 @@ import org.elasticsearch.action.admin.indices.open.OpenIndexAction;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.settings.Settings.Builder;
import org.elasticsearch.common.unit.TimeValue;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import org.sonar.api.utils.log.Profiler;
@@ -41,12 +41,12 @@ public class IndexerStartupTask {
private static final String SETTING_PREFIX_INITIAL_INDEXING_FINISHED = "sonarqube_initial_indexing_finished.";

private final EsClient esClient;
private final Settings settings;
private final Configuration config;
private final StartupIndexer[] indexers;

public IndexerStartupTask(EsClient esClient, Settings settings, StartupIndexer... indexers) {
public IndexerStartupTask(EsClient esClient, Configuration config, StartupIndexer... indexers) {
this.esClient = esClient;
this.settings = settings;
this.config = config;
this.indexers = indexers;
}

@@ -58,7 +58,7 @@ public class IndexerStartupTask {
}

private boolean indexesAreEnabled() {
return !settings.getBoolean("sonar.internal.es.disableIndexes");
return !config.getBoolean("sonar.internal.es.disableIndexes").orElse(false);
}

private void indexEmptyTypes(StartupIndexer indexer) {

+ 6
- 10
server/sonar-server/src/main/java/org/sonar/server/es/NewIndex.java View File

@@ -32,6 +32,7 @@ import javax.annotation.CheckForNull;
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.common.settings.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.process.ProcessProperties;
import org.sonar.server.permission.index.AuthorizationTypeSupport;

@@ -77,17 +78,12 @@ public class NewIndex {
return types;
}

public void configureShards(org.sonar.api.config.Settings settings, int defaultNbOfShards) {
boolean clusterMode = settings.getBoolean(ProcessProperties.CLUSTER_ENABLED);
int shards = settings.getInt(format("sonar.search.%s.shards", indexName));
if (shards == 0) {
shards = defaultNbOfShards;
}
public void configureShards(Configuration config, int defaultNbOfShards) {
boolean clusterMode = config.getBoolean(ProcessProperties.CLUSTER_ENABLED).orElse(false);
int shards = config.getInt(format("sonar.search.%s.shards", indexName)).orElse(defaultNbOfShards);

int replicas = config.getInt(ProcessProperties.SEARCH_REPLICAS).orElse(clusterMode ? 1 : 0);

int replicas = settings.getInt(ProcessProperties.SEARCH_REPLICAS);
if (replicas == 0 && settings.getString(ProcessProperties.SEARCH_REPLICAS) == null) {
replicas = clusterMode ? 1 : 0;
}
getSettings().put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, shards);
getSettings().put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, replicas);
}

+ 5
- 5
server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndexDefinition.java View File

@@ -19,7 +19,7 @@
*/
package org.sonar.server.issue.index;

import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.server.es.IndexDefinition;
import org.sonar.server.es.IndexType;
import org.sonar.server.es.NewIndex;
@@ -74,10 +74,10 @@ public class IssueIndexDefinition implements IndexDefinition {
*/
public static final String FIELD_ISSUE_TECHNICAL_UPDATED_AT = "updatedAt";

private final Settings settings;
private final Configuration config;

public IssueIndexDefinition(Settings settings) {
this.settings = settings;
public IssueIndexDefinition(Configuration config) {
this.config = config;
}

@Override
@@ -85,7 +85,7 @@ public class IssueIndexDefinition implements IndexDefinition {
NewIndex index = context.create(INDEX_TYPE_ISSUE.getIndex());

index.refreshHandledByIndexer();
index.configureShards(settings, 5);
index.configureShards(config, 5);

NewIndex.NewIndexType type = index.createType(INDEX_TYPE_ISSUE.getType());
type.requireProjectAuthorization();

+ 5
- 5
server/sonar-server/src/main/java/org/sonar/server/measure/index/ProjectMeasuresIndexDefinition.java View File

@@ -19,7 +19,7 @@
*/
package org.sonar.server.measure.index;

import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.server.es.IndexDefinition;
import org.sonar.server.es.IndexType;
import org.sonar.server.es.NewIndex;
@@ -41,17 +41,17 @@ public class ProjectMeasuresIndexDefinition implements IndexDefinition {
public static final String FIELD_MEASURES_VALUE = "value";
public static final String FIELD_LANGUAGES = "languages";

private final Settings settings;
private final Configuration config;

public ProjectMeasuresIndexDefinition(Settings settings) {
this.settings = settings;
public ProjectMeasuresIndexDefinition(Configuration settings) {
this.config = settings;
}

@Override
public void define(IndexDefinitionContext context) {
NewIndex index = context.create(INDEX_TYPE_PROJECT_MEASURES.getIndex());
index.refreshHandledByIndexer();
index.configureShards(settings, 5);
index.configureShards(config, 5);

NewIndex.NewIndexType mapping = index.createType(INDEX_TYPE_PROJECT_MEASURES.getType())
.requireProjectAuthorization();

+ 4
- 4
server/sonar-server/src/main/java/org/sonar/server/notification/NotificationDaemon.java View File

@@ -27,7 +27,7 @@ import java.util.concurrent.TimeUnit;
import org.picocontainer.Startable;
import org.sonar.api.Properties;
import org.sonar.api.Property;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.notifications.Notification;
import org.sonar.api.server.ServerSide;
import org.sonar.api.utils.log.Logger;
@@ -62,9 +62,9 @@ public class NotificationDaemon implements Startable {
private ScheduledExecutorService executorService;
private boolean stopping = false;

public NotificationDaemon(Settings settings, DefaultNotificationManager manager, NotificationService service) {
this.delayInSeconds = settings.getLong(PROPERTY_DELAY);
this.delayBeforeReportingStatusInSeconds = settings.getLong(PROPERTY_DELAY_BEFORE_REPORTING_STATUS);
public NotificationDaemon(Configuration config, DefaultNotificationManager manager, NotificationService service) {
this.delayInSeconds = config.getLong(PROPERTY_DELAY).get();
this.delayBeforeReportingStatusInSeconds = config.getLong(PROPERTY_DELAY_BEFORE_REPORTING_STATUS).get();
this.manager = manager;
this.service = service;
}

+ 5
- 5
server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationCreationImpl.java View File

@@ -26,7 +26,7 @@ import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;
import javax.annotation.Nullable;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.utils.System2;
import org.sonar.core.config.CorePropertyDefinitions;
import org.sonar.core.util.UuidFactory;
@@ -68,20 +68,20 @@ public class OrganizationCreationImpl implements OrganizationCreation {
private final System2 system2;
private final UuidFactory uuidFactory;
private final OrganizationValidation organizationValidation;
private final Settings settings;
private final Configuration config;
private final BuiltInQProfileRepository builtInQProfileRepository;
private final DefaultGroupCreator defaultGroupCreator;
private final UserIndexer userIndexer;

public OrganizationCreationImpl(DbClient dbClient, System2 system2, UuidFactory uuidFactory,
OrganizationValidation organizationValidation, Settings settings, UserIndexer userIndexer,
OrganizationValidation organizationValidation, Configuration config, UserIndexer userIndexer,
BuiltInQProfileRepository builtInQProfileRepository,
DefaultGroupCreator defaultGroupCreator) {
this.dbClient = dbClient;
this.system2 = system2;
this.uuidFactory = uuidFactory;
this.organizationValidation = organizationValidation;
this.settings = settings;
this.config = config;
this.userIndexer = userIndexer;
this.builtInQProfileRepository = builtInQProfileRepository;
this.defaultGroupCreator = defaultGroupCreator;
@@ -170,7 +170,7 @@ public class OrganizationCreationImpl implements OrganizationCreation {
}

private boolean isCreatePersonalOrgEnabled() {
return settings.getBoolean(CorePropertyDefinitions.ORGANIZATIONS_CREATE_PERSONAL_ORG);
return config.getBoolean(CorePropertyDefinitions.ORGANIZATIONS_CREATE_PERSONAL_ORG).orElse(false);
}

private void validate(NewOrganization newOrganization) {

+ 5
- 5
server/sonar-server/src/main/java/org/sonar/server/organization/ws/CreateAction.java View File

@@ -21,7 +21,7 @@ package org.sonar.server.organization.ws;

import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
@@ -44,7 +44,7 @@ import static org.sonar.server.ws.WsUtils.writeProtobuf;
public class CreateAction implements OrganizationsWsAction {
private static final String ACTION = "create";

private final Settings settings;
private final Configuration config;
private final UserSession userSession;
private final DbClient dbClient;
private final OrganizationsWsSupport wsSupport;
@@ -52,9 +52,9 @@ public class CreateAction implements OrganizationsWsAction {
private final OrganizationCreation organizationCreation;
private final OrganizationFlags organizationFlags;

public CreateAction(Settings settings, UserSession userSession, DbClient dbClient, OrganizationsWsSupport wsSupport,
public CreateAction(Configuration config, UserSession userSession, DbClient dbClient, OrganizationsWsSupport wsSupport,
OrganizationValidation organizationValidation, OrganizationCreation organizationCreation, OrganizationFlags organizationFlags) {
this.settings = settings;
this.config = config;
this.userSession = userSession;
this.dbClient = dbClient;
this.wsSupport = wsSupport;
@@ -87,7 +87,7 @@ public class CreateAction implements OrganizationsWsAction {

@Override
public void handle(Request request, Response response) throws Exception {
if (settings.getBoolean(CorePropertyDefinitions.ORGANIZATIONS_ANYONE_CAN_CREATE)) {
if (config.getBoolean(CorePropertyDefinitions.ORGANIZATIONS_ANYONE_CAN_CREATE).orElse(false)) {
userSession.checkLoggedIn();
} else {
userSession.checkIsSystemAdministrator();

+ 5
- 7
server/sonar-server/src/main/java/org/sonar/server/platform/ServerFileSystemImpl.java View File

@@ -21,14 +21,12 @@ package org.sonar.server.platform;

import java.io.File;
import org.picocontainer.Startable;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import org.sonar.process.ProcessProperties;
import org.sonar.server.app.TomcatContexts;

import static java.util.Objects.requireNonNull;

public class ServerFileSystemImpl implements ServerFileSystem, org.sonar.api.platform.ServerFileSystem, Startable {

private static final Logger LOGGER = Loggers.get(ServerFileSystemImpl.class);
@@ -38,10 +36,10 @@ public class ServerFileSystemImpl implements ServerFileSystem, org.sonar.api.pla
private final File dataDir;
private final File deployDir;

public ServerFileSystemImpl(Settings settings) {
this.homeDir = new File(requireNonNull(settings.getString(ProcessProperties.PATH_HOME)));
this.tempDir = new File(requireNonNull(settings.getString(ProcessProperties.PATH_TEMP)));
this.dataDir = new File(requireNonNull(settings.getString(ProcessProperties.PATH_DATA)));
public ServerFileSystemImpl(Configuration config) {
this.homeDir = new File(config.get(ProcessProperties.PATH_HOME).get());
this.tempDir = new File(config.get(ProcessProperties.PATH_TEMP).get());
this.dataDir = new File(config.get(ProcessProperties.PATH_DATA).get());
this.deployDir = new File(this.dataDir, TomcatContexts.WEB_DEPLOY_PATH_RELATIVE_TO_DATA_DIR);
}


+ 15
- 20
server/sonar-server/src/main/java/org/sonar/server/platform/ServerIdLoader.java View File

@@ -19,38 +19,33 @@
*/
package org.sonar.server.platform;

import com.google.common.base.Optional;
import java.util.Optional;
import org.sonar.api.CoreProperties;
import org.sonar.api.config.Settings;

import static com.google.common.base.Optional.fromNullable;
import org.sonar.api.config.Configuration;

public class ServerIdLoader {

private final Settings settings;
private final Configuration config;
private final ServerIdGenerator idGenerator;

public ServerIdLoader(Settings settings, ServerIdGenerator idGenerator) {
this.settings = settings;
public ServerIdLoader(Configuration config, ServerIdGenerator idGenerator) {
this.config = config;
this.idGenerator = idGenerator;
}

public Optional<String> getRaw() {
return fromNullable(settings.getString(CoreProperties.PERMANENT_SERVER_ID));
return config.get(CoreProperties.PERMANENT_SERVER_ID);
}

public Optional<ServerId> get() {
Optional<String> rawId = getRaw();
if (!rawId.isPresent()) {
return Optional.absent();
}

String organization = settings.getString(CoreProperties.ORGANISATION);
String ipAddress = settings.getString(CoreProperties.SERVER_ID_IP_ADDRESS);
boolean validated = organization != null
&& ipAddress != null
&& idGenerator.validate(organization, ipAddress, rawId.get());

return Optional.of(new ServerId(rawId.get(), validated));
return getRaw().map(rawId -> {
Optional<String> organization = config.get(CoreProperties.ORGANISATION);
Optional<String> ipAddress = config.get(CoreProperties.SERVER_ID_IP_ADDRESS);
boolean validated = organization.isPresent()
&& ipAddress.isPresent()
&& idGenerator.validate(organization.get(), ipAddress.get(), rawId);

return new ServerId(rawId, validated);
});
}
}

+ 6
- 6
server/sonar-server/src/main/java/org/sonar/server/platform/ServerImpl.java View File

@@ -24,7 +24,7 @@ import java.util.Date;
import org.sonar.api.CoreProperties;
import org.sonar.api.SonarRuntime;
import org.sonar.api.ce.ComputeEngineSide;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.platform.Server;
import org.sonar.api.server.ServerSide;

@@ -32,14 +32,14 @@ import org.sonar.api.server.ServerSide;
@ServerSide
public class ServerImpl extends Server {

private final Settings settings;
private final Configuration config;
private final StartupMetadata state;
private final ServerFileSystem fs;
private final UrlSettings urlSettings;
private final SonarRuntime runtime;

public ServerImpl(Settings settings, StartupMetadata state, ServerFileSystem fs, UrlSettings urlSettings, SonarRuntime runtime) {
this.settings = settings;
public ServerImpl(Configuration config, StartupMetadata state, ServerFileSystem fs, UrlSettings urlSettings, SonarRuntime runtime) {
this.config = config;
this.state = state;
this.fs = fs;
this.urlSettings = urlSettings;
@@ -48,12 +48,12 @@ public class ServerImpl extends Server {

@Override
public String getId() {
return settings.getString(CoreProperties.SERVER_ID);
return config.get(CoreProperties.SERVER_ID).get();
}

@Override
public String getPermanentServerId() {
return settings.getString(CoreProperties.PERMANENT_SERVER_ID);
return config.get(CoreProperties.PERMANENT_SERVER_ID).orElse(null);
}

@Override

+ 8
- 8
server/sonar-server/src/main/java/org/sonar/server/platform/ServerLogging.java View File

@@ -25,12 +25,12 @@ import com.google.common.annotations.VisibleForTesting;
import java.io.File;
import org.slf4j.LoggerFactory;
import org.sonar.api.ce.ComputeEngineSide;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.server.ServerSide;
import org.sonar.api.utils.log.LoggerLevel;
import org.sonar.api.utils.log.Loggers;
import org.sonar.process.logging.LogbackHelper;
import org.sonar.process.ProcessProperties;
import org.sonar.process.logging.LogbackHelper;
import org.sonar.server.app.ServerProcessLogging;

@ServerSide
@@ -38,16 +38,16 @@ import org.sonar.server.app.ServerProcessLogging;
public class ServerLogging {

private final LogbackHelper helper;
private final Settings settings;
private final Configuration config;

public ServerLogging(Settings settings) {
this(new LogbackHelper(), settings);
public ServerLogging(Configuration config) {
this(new LogbackHelper(), config);
}

@VisibleForTesting
ServerLogging(LogbackHelper helper, Settings settings) {
ServerLogging(LogbackHelper helper, Configuration config) {
this.helper = helper;
this.settings = settings;
this.config = config;
}

public void changeLevel(ServerProcessLogging serverProcessLogging, LoggerLevel level) {
@@ -64,7 +64,7 @@ public class ServerLogging {
* The directory that contains log files. May not exist.
*/
public File getLogsDir() {
return new File(settings.getString(ProcessProperties.PATH_LOGS));
return new File(config.get(ProcessProperties.PATH_LOGS).get());
}

}

+ 10
- 11
server/sonar-server/src/main/java/org/sonar/server/platform/UrlSettings.java View File

@@ -20,10 +20,9 @@
package org.sonar.server.platform;

import org.sonar.api.ce.ComputeEngineSide;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.server.ServerSide;

import static org.apache.commons.lang.StringUtils.defaultIfBlank;
import static org.apache.commons.lang.StringUtils.isEmpty;
import static org.apache.commons.lang.StringUtils.isNotEmpty;
import static org.sonar.api.CoreProperties.SERVER_BASE_URL;
@@ -37,19 +36,19 @@ public class UrlSettings {
private static final int DEFAULT_HTTP_PORT = 80;
private static final String ALL_IPS_HOST = "0.0.0.0";

private final Settings settings;
private final Configuration config;
// cached, so can't change at runtime
private final String contextPath;

public UrlSettings(Settings settings) {
this.settings = settings;
this.contextPath = defaultIfBlank(settings.getString(PROPERTY_CONTEXT), "")
public UrlSettings(Configuration config) {
this.config = config;
this.contextPath = config.get(PROPERTY_CONTEXT).orElse("")
// Remove trailing slashes
.replaceFirst("(\\/+)$", "");
}

public String getBaseUrl() {
String url = settings.getString(SERVER_BASE_URL);
String url = config.get(SERVER_BASE_URL).orElse("");
if (isEmpty(url)) {
url = computeBaseUrl();
}
@@ -61,7 +60,7 @@ public class UrlSettings {
}

public boolean isDev() {
return settings.getBoolean("sonar.web.dev");
return config.getBoolean("sonar.web.dev").orElse(false);
}

public boolean isSecured() {
@@ -69,9 +68,9 @@ public class UrlSettings {
}

private String computeBaseUrl() {
String host = settings.getString("sonar.web.host");
int port = settings.getInt("sonar.web.port");
String context = settings.getString("sonar.web.context");
String host = config.get("sonar.web.host").orElse("");
int port = config.getInt("sonar.web.port").orElse(0);
String context = config.get("sonar.web.context").orElse("");

StringBuilder res = new StringBuilder();
res.append("http://");

+ 4
- 4
server/sonar-server/src/main/java/org/sonar/server/platform/cluster/ClusterImpl.java View File

@@ -19,7 +19,7 @@
*/
package org.sonar.server.platform.cluster;

import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.utils.log.Loggers;
import org.sonar.process.ProcessProperties;

@@ -30,10 +30,10 @@ public class ClusterImpl implements Cluster {
private final boolean enabled;
private final boolean startupLeader;

public ClusterImpl(Settings settings) {
this.enabled = settings.getBoolean(ProcessProperties.CLUSTER_ENABLED);
public ClusterImpl(Configuration config) {
this.enabled = config.getBoolean(ProcessProperties.CLUSTER_ENABLED).orElse(false);
if (this.enabled) {
this.startupLeader = settings.getBoolean(CLUSTER_WEB_LEADER);
this.startupLeader = config.getBoolean(CLUSTER_WEB_LEADER).orElse(false);
Loggers.get(ClusterImpl.class).info("Cluster enabled (startup {})", startupLeader ? "leader" : "follower");
} else {
this.startupLeader = true;

+ 6
- 6
server/sonar-server/src/main/java/org/sonar/server/platform/db/EmbeddedDatabase.java View File

@@ -27,7 +27,7 @@ import org.apache.commons.lang.StringUtils;
import org.h2.Driver;
import org.h2.tools.Server;
import org.picocontainer.Startable;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.utils.System2;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
@@ -46,12 +46,12 @@ import static org.sonar.process.ProcessProperties.PATH_DATA;
public class EmbeddedDatabase implements Startable {
private static final Logger LOG = Loggers.get(EmbeddedDatabase.class);

private final Settings settings;
private final Configuration config;
private final System2 system2;
private Server server;

public EmbeddedDatabase(Settings settings, System2 system2) {
this.settings = settings;
public EmbeddedDatabase(Configuration config, System2 system2) {
this.config = config;
this.system2 = system2;
}

@@ -101,13 +101,13 @@ public class EmbeddedDatabase implements Startable {
}

private String getRequiredSetting(String property) {
String value = settings.getString(property);
String value = config.get(property).orElse("");
checkArgument(isNotEmpty(value), "Missing property %s", property);
return value;
}

private String getSetting(String name, String defaultValue) {
return StringUtils.defaultIfBlank(settings.getString(name), defaultValue);
return StringUtils.defaultIfBlank(config.get(name).orElse(""), defaultValue);
}

private static void createDatabase(File dbHome, String user, String password) throws SQLException {

+ 6
- 6
server/sonar-server/src/main/java/org/sonar/server/platform/db/EmbeddedDatabaseFactory.java View File

@@ -21,7 +21,7 @@ package org.sonar.server.platform.db;

import com.google.common.annotations.VisibleForTesting;
import org.picocontainer.Startable;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.database.DatabaseProperties;
import org.sonar.api.utils.System2;

@@ -31,19 +31,19 @@ public class EmbeddedDatabaseFactory implements Startable {

private static final String URL_PREFIX = "jdbc:h2:tcp:";

private final Settings settings;
private final Configuration config;
private final System2 system2;
private EmbeddedDatabase embeddedDatabase;

public EmbeddedDatabaseFactory(Settings settings, System2 system2) {
this.settings = settings;
public EmbeddedDatabaseFactory(Configuration config, System2 system2) {
this.config = config;
this.system2 = system2;
}

@Override
public void start() {
if (embeddedDatabase == null) {
String jdbcUrl = settings.getString(DatabaseProperties.PROP_URL);
String jdbcUrl = config.get(DatabaseProperties.PROP_URL).get();
if (startsWith(jdbcUrl, URL_PREFIX)) {
embeddedDatabase = createEmbeddedDatabase();
embeddedDatabase.start();
@@ -61,6 +61,6 @@ public class EmbeddedDatabaseFactory implements Startable {

@VisibleForTesting
EmbeddedDatabase createEmbeddedDatabase() {
return new EmbeddedDatabase(settings, system2);
return new EmbeddedDatabase(config, system2);
}
}

+ 14
- 17
server/sonar-server/src/main/java/org/sonar/server/platform/monitoring/SonarQubeMonitor.java View File

@@ -20,7 +20,6 @@
package org.sonar.server.platform.monitoring;

import com.google.common.base.Joiner;
import com.google.common.base.Optional;
import java.io.File;
import java.util.LinkedHashMap;
import java.util.List;
@@ -28,14 +27,13 @@ import java.util.Map;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
import org.sonar.api.CoreProperties;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.platform.Server;
import org.sonar.api.security.SecurityRealm;
import org.sonar.api.server.authentication.IdentityProvider;
import org.sonar.core.util.stream.MoreCollectors;
import org.sonar.process.ProcessProperties;
import org.sonar.server.authentication.IdentityProviderRepository;
import org.sonar.server.platform.ServerId;
import org.sonar.server.platform.ServerIdLoader;
import org.sonar.server.platform.ServerLogging;
import org.sonar.server.user.SecurityRealmFactory;
@@ -46,17 +44,17 @@ public class SonarQubeMonitor extends BaseMonitorMBean implements SonarQubeMonit

static final String BRANDING_FILE_PATH = "web/WEB-INF/classes/com/sonarsource/branding";

private final Settings settings;
private final Configuration config;
private final SecurityRealmFactory securityRealmFactory;
private final IdentityProviderRepository identityProviderRepository;
private final Server server;
private final ServerLogging serverLogging;
private final ServerIdLoader serverIdLoader;

public SonarQubeMonitor(Settings settings, SecurityRealmFactory securityRealmFactory,
public SonarQubeMonitor(Configuration config, SecurityRealmFactory securityRealmFactory,
IdentityProviderRepository identityProviderRepository, Server server, ServerLogging serverLogging,
ServerIdLoader serverIdLoader) {
this.settings = settings;
this.config = config;
this.securityRealmFactory = securityRealmFactory;
this.identityProviderRepository = identityProviderRepository;
this.server = server;
@@ -66,7 +64,7 @@ public class SonarQubeMonitor extends BaseMonitorMBean implements SonarQubeMonit

@Override
public String getServerId() {
return serverIdLoader.getRaw().orNull();
return serverIdLoader.getRaw().orElse(null);
}

@Override
@@ -103,7 +101,7 @@ public class SonarQubeMonitor extends BaseMonitorMBean implements SonarQubeMonit
}

private boolean getForceAuthentication() {
return settings.getBoolean(CoreProperties.CORE_FORCE_AUTHENTICATION_PROPERTY);
return config.getBoolean(CoreProperties.CORE_FORCE_AUTHENTICATION_PROPERTY).orElse(false);
}

private boolean isOfficialDistribution() {
@@ -129,20 +127,19 @@ public class SonarQubeMonitor extends BaseMonitorMBean implements SonarQubeMonit
addIfNotEmpty("External identity providers whose users are allowed to sign themselves up", getAllowsToSignUpEnabledIdentityProviders(), attributes);
attributes.put("Force authentication", getForceAuthentication());
attributes.put("Official Distribution", isOfficialDistribution());
attributes.put("Home Dir", settings.getString(ProcessProperties.PATH_HOME));
attributes.put("Data Dir", settings.getString(ProcessProperties.PATH_DATA));
attributes.put("Temp Dir", settings.getString(ProcessProperties.PATH_TEMP));
attributes.put("Logs Dir", settings.getString(ProcessProperties.PATH_LOGS));
attributes.put("Home Dir", config.get(ProcessProperties.PATH_HOME).orElse(null));
attributes.put("Data Dir", config.get(ProcessProperties.PATH_DATA).orElse(null));
attributes.put("Temp Dir", config.get(ProcessProperties.PATH_TEMP).orElse(null));
attributes.put("Logs Dir", config.get(ProcessProperties.PATH_LOGS).orElse(null));
attributes.put("Logs Level", getLogLevel());
return attributes;
}

private void completeWithServerIdAttributes(Map<String, Object> attributes) {
Optional<ServerId> serverId = serverIdLoader.get();
if (serverId.isPresent()) {
attributes.put("Server ID", serverId.get().getId());
attributes.put("Server ID validated", serverId.get().isValid());
}
serverIdLoader.get().ifPresent(serverId -> {
attributes.put("Server ID", serverId.getId());
attributes.put("Server ID validated", serverId.isValid());
});
}

private static void addIfNotNull(String key, @Nullable String value, Map<String, Object> attributes) {

+ 2
- 0
server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel1.java View File

@@ -28,6 +28,7 @@ import org.sonar.api.internal.SonarRuntimeImpl;
import org.sonar.api.utils.System2;
import org.sonar.api.utils.Version;
import org.sonar.api.utils.internal.TempFolderCleaner;
import org.sonar.core.config.ConfigurationProvider;
import org.sonar.core.config.CorePropertyDefinitions;
import org.sonar.core.util.UuidFactoryImpl;
import org.sonar.db.DaoModule;
@@ -76,6 +77,7 @@ public class PlatformLevel1 extends PlatformLevel {
new SonarQubeVersion(apiVersion),
SonarRuntimeImpl.forSonarQube(apiVersion, SonarQubeSide.SERVER),
ThreadLocalSettings.class,
new ConfigurationProvider(),
LogServerVersion.class,
ProcessCommandWrapperImpl.class,
RestartFlagHolderImpl.class,

+ 2
- 2
server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java View File

@@ -30,7 +30,7 @@ import org.sonar.api.rules.AnnotationRuleParser;
import org.sonar.api.rules.XMLRuleParser;
import org.sonar.api.server.rule.RulesDefinitionXmlLoader;
import org.sonar.ce.CeModule;
import org.sonar.ce.settings.ProjectSettingsFactory;
import org.sonar.ce.settings.ProjectConfigurationFactory;
import org.sonar.core.component.DefaultResourceTypes;
import org.sonar.core.timemachine.Periods;
import org.sonar.server.authentication.AuthenticationModule;
@@ -508,7 +508,7 @@ public class PlatformLevel4 extends PlatformLevel {
CeWsModule.class,

InternalPropertiesImpl.class,
ProjectSettingsFactory.class,
ProjectConfigurationFactory.class,

// UI
NavigationWsModule.class,

+ 5
- 5
server/sonar-server/src/main/java/org/sonar/server/platform/ws/RestartAction.java View File

@@ -19,7 +19,7 @@
*/
package org.sonar.server.platform.ws;

import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
@@ -38,14 +38,14 @@ public class RestartAction implements SystemWsAction {
private static final Logger LOGGER = Loggers.get(RestartAction.class);

private final UserSession userSession;
private final Settings settings;
private final Configuration config;
private final Platform platform;
private final ProcessCommandWrapper processCommandWrapper;
private final RestartFlagHolder restartFlagHolder;

public RestartAction(UserSession userSession, Settings settings, Platform platform, ProcessCommandWrapper processCommandWrapper, RestartFlagHolder restartFlagHolder) {
public RestartAction(UserSession userSession, Configuration config, Platform platform, ProcessCommandWrapper processCommandWrapper, RestartFlagHolder restartFlagHolder) {
this.userSession = userSession;
this.settings = settings;
this.config = config;
this.platform = platform;
this.processCommandWrapper = processCommandWrapper;
this.restartFlagHolder = restartFlagHolder;
@@ -62,7 +62,7 @@ public class RestartAction implements SystemWsAction {

@Override
public void handle(Request request, Response response) {
if (settings.getBoolean("sonar.web.dev")) {
if (config.getBoolean("sonar.web.dev").orElse(false)) {
LOGGER.info("Fast restarting WebServer...");
restartFlagHolder.set();
try {

+ 4
- 4
server/sonar-server/src/main/java/org/sonar/server/plugins/UpdateCenterClient.java View File

@@ -29,7 +29,7 @@ import org.apache.commons.io.IOUtils;
import org.sonar.api.Properties;
import org.sonar.api.Property;
import org.sonar.api.PropertyType;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.utils.UriReader;
import org.sonar.api.utils.log.Loggers;
import org.sonar.core.config.WebConstants;
@@ -72,10 +72,10 @@ public class UpdateCenterClient {
private UpdateCenter pluginCenter = null;
private long lastRefreshDate = 0;

public UpdateCenterClient(UriReader uriReader, Settings settings) throws URISyntaxException {
public UpdateCenterClient(UriReader uriReader, Configuration config) throws URISyntaxException {
this.uriReader = uriReader;
this.uri = new URI(settings.getString(URL_PROPERTY));
this.isActivated = settings.getBoolean(WebConstants.SONAR_UPDATECENTER_ACTIVATE);
this.uri = new URI(config.get(URL_PROPERTY).get());
this.isActivated = config.getBoolean(WebConstants.SONAR_UPDATECENTER_ACTIVATE).get();
Loggers.get(getClass()).info("Update center: " + uriReader.description(uri));
}


+ 9
- 9
server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexDefinition.java View File

@@ -23,7 +23,7 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedMap;
import java.util.Set;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.server.es.DefaultIndexSettings;
import org.sonar.server.es.IndexDefinition;
import org.sonar.server.es.IndexType;
@@ -77,15 +77,15 @@ public class RuleIndexDefinition implements IndexDefinition {
public static final String FIELD_ACTIVE_RULE_SEVERITY = "severity";
public static final String FIELD_ACTIVE_RULE_RULE_KEY = "ruleKey";

private final Settings settings;
private final Configuration config;
private final boolean enableSource;

public RuleIndexDefinition(Settings settings) {
this(settings, false);
public RuleIndexDefinition(Configuration config) {
this(config, false);
}

private RuleIndexDefinition(Settings settings, boolean enableSource) {
this.settings = settings;
private RuleIndexDefinition(Configuration config, boolean enableSource) {
this.config = config;
this.enableSource = enableSource;
}

@@ -93,8 +93,8 @@ public class RuleIndexDefinition implements IndexDefinition {
* Keep the document sources in index so that indexer tests can verify content
* of indexed documents.
*/
public static RuleIndexDefinition createForTest(Settings settings) {
return new RuleIndexDefinition(settings, true);
public static RuleIndexDefinition createForTest(Configuration config) {
return new RuleIndexDefinition(config, true);
}

@Override
@@ -105,7 +105,7 @@ public class RuleIndexDefinition implements IndexDefinition {
// Default nb of shards should be greater than 1 in order to
// easily detect routing misconfiguration.
// See https://jira.sonarsource.com/browse/SONAR-9489
index.configureShards(settings, 2);
index.configureShards(config, 2);

// Active rule type
NewIndex.NewIndexType activeRuleMapping = index.createType(INDEX_TYPE_ACTIVE_RULE.getType());

+ 6
- 7
server/sonar-server/src/main/java/org/sonar/server/test/index/TestIndexDefinition.java View File

@@ -20,7 +20,7 @@
package org.sonar.server.test.index;

import com.google.common.collect.ImmutableMap;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.server.es.IndexDefinition;
import org.sonar.server.es.IndexType;
import org.sonar.server.es.NewIndex;
@@ -41,10 +41,10 @@ public class TestIndexDefinition implements IndexDefinition {
public static final String FIELD_COVERED_FILE_LINES = "coveredLines";
public static final String FIELD_UPDATED_AT = "updatedAt";

private final Settings settings;
private final Configuration config;

public TestIndexDefinition(Settings settings) {
this.settings = settings;
public TestIndexDefinition(Configuration config) {
this.config = config;
}

@Override
@@ -52,7 +52,7 @@ public class TestIndexDefinition implements IndexDefinition {
NewIndex index = context.create(INDEX_TYPE_TEST.getIndex());

index.refreshHandledByIndexer();
index.configureShards(settings, 5);
index.configureShards(config, 5);

NewIndex.NewIndexType mapping = index.createType(INDEX_TYPE_TEST.getType());
mapping.setAttribute("_routing", ImmutableMap.of("required", true));
@@ -66,8 +66,7 @@ public class TestIndexDefinition implements IndexDefinition {
mapping.stringFieldBuilder(FIELD_STACKTRACE).disableNorms().disableSearch().build();
mapping.setProperty(FIELD_COVERED_FILES, ImmutableMap.of("type", "nested", "properties", ImmutableMap.of(
FIELD_COVERED_FILE_UUID, ImmutableMap.of("type", "string", "index", "not_analyzed"),
FIELD_COVERED_FILE_LINES, ImmutableMap.of("type", "integer")
)));
FIELD_COVERED_FILE_LINES, ImmutableMap.of("type", "integer"))));
mapping.createDateTimeField(FIELD_UPDATED_AT);
}
}

+ 8
- 8
server/sonar-server/src/main/java/org/sonar/server/ui/ws/GlobalAction.java View File

@@ -21,7 +21,7 @@ package org.sonar.server.ui.ws;

import com.google.common.collect.ImmutableSet;
import java.util.Set;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.platform.Server;
import org.sonar.api.resources.ResourceType;
import org.sonar.api.resources.ResourceTypes;
@@ -58,7 +58,7 @@ public class GlobalAction implements NavigationWsAction {
RATING_GRID);

private final PageRepository pageRepository;
private final Settings settings;
private final Configuration config;
private final ResourceTypes resourceTypes;
private final Server server;
private final DbClient dbClient;
@@ -66,10 +66,10 @@ public class GlobalAction implements NavigationWsAction {
private final DefaultOrganizationProvider defaultOrganizationProvider;
private final UserSession userSession;

public GlobalAction(PageRepository pageRepository, Settings settings, ResourceTypes resourceTypes, Server server,
DbClient dbClient, OrganizationFlags organizationFlags, DefaultOrganizationProvider defaultOrganizationProvider, UserSession userSession) {
public GlobalAction(PageRepository pageRepository, Configuration config, ResourceTypes resourceTypes, Server server,
DbClient dbClient, OrganizationFlags organizationFlags, DefaultOrganizationProvider defaultOrganizationProvider, UserSession userSession) {
this.pageRepository = pageRepository;
this.settings = settings;
this.config = config;
this.resourceTypes = resourceTypes;
this.server = server;
this.dbClient = dbClient;
@@ -120,14 +120,14 @@ public class GlobalAction implements NavigationWsAction {
private void writeSettings(JsonWriter json) {
json.name("settings").beginObject();
for (String settingKey : SETTING_KEYS) {
json.prop(settingKey, settings.getString(settingKey));
json.prop(settingKey, config.get(settingKey).orElse(null));
}
json.endObject();
}

private void writeDeprecatedLogoProperties(JsonWriter json) {
json.prop("logoUrl", settings.getString(SONAR_LF_LOGO_URL));
json.prop("logoWidth", settings.getString(SONAR_LF_LOGO_WIDTH_PX));
json.prop("logoUrl", config.get(SONAR_LF_LOGO_URL).orElse(null));
json.prop("logoWidth", config.get(SONAR_LF_LOGO_WIDTH_PX).orElse(null));
}

private void writeQualifiers(JsonWriter json) {

+ 5
- 5
server/sonar-server/src/main/java/org/sonar/server/ui/ws/SettingsAction.java View File

@@ -19,7 +19,7 @@
*/
package org.sonar.server.ui.ws;

import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService.NewController;
@@ -32,12 +32,12 @@ import org.sonar.server.user.UserSession;
public class SettingsAction implements NavigationWsAction {

private final PageRepository pageRepository;
private final Settings settings;
private final Configuration config;
private final UserSession userSession;

public SettingsAction(PageRepository pageRepository, Settings settings, UserSession userSession) {
public SettingsAction(PageRepository pageRepository, Configuration config, UserSession userSession) {
this.pageRepository = pageRepository;
this.settings = settings;
this.config = config;
this.userSession = userSession;
}

@@ -60,7 +60,7 @@ public class SettingsAction implements NavigationWsAction {
boolean isSysAdmin = userSession.isSystemAdministrator();

JsonWriter json = response.newJsonWriter().beginObject();
json.prop("showUpdateCenter", isSysAdmin && settings.getBoolean(WebConstants.SONAR_UPDATECENTER_ACTIVATE));
json.prop("showUpdateCenter", isSysAdmin && config.getBoolean(WebConstants.SONAR_UPDATECENTER_ACTIVATE).orElse(false));

json.name("extensions").beginArray();
if (isSysAdmin) {

+ 11
- 11
server/sonar-server/src/main/java/org/sonar/server/user/SecurityRealmFactory.java View File

@@ -23,7 +23,7 @@ import javax.annotation.Nullable;
import org.apache.commons.lang.StringUtils;
import org.picocontainer.Startable;
import org.sonar.api.CoreProperties;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.security.LoginPasswordAuthenticator;
import org.sonar.api.security.SecurityRealm;
import org.sonar.api.server.ServerSide;
@@ -40,10 +40,10 @@ public class SecurityRealmFactory implements Startable {
private final boolean ignoreStartupFailure;
private final SecurityRealm realm;

public SecurityRealmFactory(Settings settings, SecurityRealm[] realms, LoginPasswordAuthenticator[] authenticators) {
ignoreStartupFailure = settings.getBoolean(CoreProperties.CORE_AUTHENTICATOR_IGNORE_STARTUP_FAILURE);
String realmName = settings.getString(CoreProperties.CORE_AUTHENTICATOR_REALM);
String className = settings.getString(CoreProperties.CORE_AUTHENTICATOR_CLASS);
public SecurityRealmFactory(Configuration config, SecurityRealm[] realms, LoginPasswordAuthenticator[] authenticators) {
ignoreStartupFailure = config.getBoolean(CoreProperties.CORE_AUTHENTICATOR_IGNORE_STARTUP_FAILURE).orElse(false);
String realmName = config.get(CoreProperties.CORE_AUTHENTICATOR_REALM).orElse(null);
String className = config.get(CoreProperties.CORE_AUTHENTICATOR_CLASS).orElse(null);
SecurityRealm selectedRealm = null;
if (!StringUtils.isEmpty(realmName)) {
selectedRealm = selectRealm(realms, realmName);
@@ -63,16 +63,16 @@ public class SecurityRealmFactory implements Startable {
realm = selectedRealm;
}

public SecurityRealmFactory(Settings settings, LoginPasswordAuthenticator[] authenticators) {
this(settings, new SecurityRealm[0], authenticators);
public SecurityRealmFactory(Configuration config, LoginPasswordAuthenticator[] authenticators) {
this(config, new SecurityRealm[0], authenticators);
}

public SecurityRealmFactory(Settings settings, SecurityRealm[] realms) {
this(settings, realms, new LoginPasswordAuthenticator[0]);
public SecurityRealmFactory(Configuration config, SecurityRealm[] realms) {
this(config, realms, new LoginPasswordAuthenticator[0]);
}

public SecurityRealmFactory(Settings settings) {
this(settings, new SecurityRealm[0], new LoginPasswordAuthenticator[0]);
public SecurityRealmFactory(Configuration config) {
this(config, new SecurityRealm[0], new LoginPasswordAuthenticator[0]);
}

@Override

+ 5
- 5
server/sonar-server/src/main/java/org/sonar/server/user/UserUpdater.java View File

@@ -28,7 +28,7 @@ import java.util.Objects;
import java.util.Random;
import javax.annotation.Nullable;
import org.apache.commons.codec.digest.DigestUtils;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.platform.NewUserHandler;
import org.sonar.api.server.ServerSide;
import org.sonar.api.utils.System2;
@@ -78,10 +78,10 @@ public class UserUpdater {
private final DefaultOrganizationProvider defaultOrganizationProvider;
private final OrganizationCreation organizationCreation;
private final DefaultGroupFinder defaultGroupFinder;
private final Settings settings;
private final Configuration config;

public UserUpdater(NewUserNotifier newUserNotifier, DbClient dbClient, UserIndexer userIndexer, System2 system2, OrganizationFlags organizationFlags,
DefaultOrganizationProvider defaultOrganizationProvider, OrganizationCreation organizationCreation, DefaultGroupFinder defaultGroupFinder, Settings settings) {
DefaultOrganizationProvider defaultOrganizationProvider, OrganizationCreation organizationCreation, DefaultGroupFinder defaultGroupFinder, Configuration config) {
this.newUserNotifier = newUserNotifier;
this.dbClient = dbClient;
this.userIndexer = userIndexer;
@@ -90,7 +90,7 @@ public class UserUpdater {
this.defaultOrganizationProvider = defaultOrganizationProvider;
this.organizationCreation = organizationCreation;
this.defaultGroupFinder = defaultGroupFinder;
this.settings = settings;
this.config = config;
}

public UserDto create(DbSession dbSession, NewUser newUser) {
@@ -260,7 +260,7 @@ public class UserUpdater {
}

private void setOnboarded(UserDto userDto) {
boolean showOnboarding = settings.getBoolean(ONBOARDING_TUTORIAL_SHOW_TO_NEW_USERS);
boolean showOnboarding = config.getBoolean(ONBOARDING_TUTORIAL_SHOW_TO_NEW_USERS).orElse(false);
userDto.setOnboarded(!showOnboarding);
}


+ 5
- 5
server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndexDefinition.java View File

@@ -19,7 +19,7 @@
*/
package org.sonar.server.user.index;

import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.server.es.IndexDefinition;
import org.sonar.server.es.IndexType;
import org.sonar.server.es.NewIndex;
@@ -42,17 +42,17 @@ public class UserIndexDefinition implements IndexDefinition {
public static final String FIELD_SCM_ACCOUNTS = "scmAccounts";
public static final String FIELD_ORGANIZATION_UUIDS = "organizationUuids";

private final Settings settings;
private final Configuration config;

public UserIndexDefinition(Settings settings) {
this.settings = settings;
public UserIndexDefinition(Configuration config) {
this.config = config;
}

@Override
public void define(IndexDefinitionContext context) {
NewIndex index = context.create(INDEX_TYPE_USER.getIndex());

index.configureShards(settings, 1);
index.configureShards(config, 1);

// type "user"
NewIndex.NewIndexType mapping = index.createType(INDEX_TYPE_USER.getType());

+ 4
- 4
server/sonar-server/src/main/java/org/sonar/server/util/OkHttpClientProvider.java View File

@@ -23,7 +23,7 @@ import okhttp3.OkHttpClient;
import org.picocontainer.injectors.ProviderAdapter;
import org.sonar.api.SonarRuntime;
import org.sonar.api.ce.ComputeEngineSide;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.server.ServerSide;
import org.sonar.process.ProcessProperties;
import org.sonarqube.ws.client.OkHttpClientBuilder;
@@ -52,15 +52,15 @@ public class OkHttpClientProvider extends ProviderAdapter {
/**
* @return a {@link OkHttpClient} singleton
*/
public OkHttpClient provide(Settings settings, SonarRuntime runtime) {
public OkHttpClient provide(Configuration config, SonarRuntime runtime) {
if (okHttpClient == null) {
OkHttpClientBuilder builder = new OkHttpClientBuilder();
builder.setConnectTimeoutMs(DEFAULT_CONNECT_TIMEOUT_IN_MS);
builder.setReadTimeoutMs(DEFAULT_READ_TIMEOUT_IN_MS);
// no need to define proxy URL as system-wide proxy is used and properly
// configured by bootstrap process.
builder.setProxyLogin(settings.getString(ProcessProperties.HTTP_PROXY_USER));
builder.setProxyPassword(settings.getString(ProcessProperties.HTTP_PROXY_PASSWORD));
builder.setProxyLogin(config.get(ProcessProperties.HTTP_PROXY_USER).orElse(null));
builder.setProxyPassword(config.get(ProcessProperties.HTTP_PROXY_PASSWORD).orElse(null));
builder.setUserAgent(format("SonarQube/%s", runtime.getApiVersion().toString()));
okHttpClient = builder.build();
}

+ 5
- 5
server/sonar-server/src/main/java/org/sonar/server/view/index/ViewIndexDefinition.java View File

@@ -19,7 +19,7 @@
*/
package org.sonar.server.view.index;

import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.server.es.IndexDefinition;
import org.sonar.server.es.IndexType;
import org.sonar.server.es.NewIndex;
@@ -33,17 +33,17 @@ public class ViewIndexDefinition implements IndexDefinition {
public static final String FIELD_UUID = "uuid";
public static final String FIELD_PROJECTS = "projects";

private final Settings settings;
private final Configuration config;

public ViewIndexDefinition(Settings settings) {
this.settings = settings;
public ViewIndexDefinition(Configuration config) {
this.config = config;
}

@Override
public void define(IndexDefinitionContext context) {
NewIndex index = context.create(INDEX_TYPE_VIEW.getIndex());

index.configureShards(settings, 5);
index.configureShards(config, 5);

// type "view"
NewIndex.NewIndexType mapping = index.createType(INDEX_TYPE_VIEW.getType());

+ 2
- 3
server/sonar-server/src/test/java/org/sonar/ce/http/CeHttpClientTest.java View File

@@ -30,7 +30,6 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder;
import org.sonar.api.config.Settings;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.utils.log.LoggerLevel;
import org.sonar.process.DefaultProcessCommands;
@@ -56,9 +55,9 @@ public class CeHttpClientTest {
@Before
public void setUp() throws Exception {
ipcSharedDir = temp.newFolder();
Settings settings = new MapSettings();
MapSettings settings = new MapSettings();
settings.setProperty(ProcessEntryPoint.PROPERTY_SHARED_PATH, ipcSharedDir.getAbsolutePath());
underTest = new CeHttpClient(settings);
underTest = new CeHttpClient(settings.asConfig());
}

@Test

+ 9
- 10
server/sonar-server/src/test/java/org/sonar/server/app/ProcessCommandWrapperImplTest.java View File

@@ -25,7 +25,6 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder;
import org.sonar.api.config.Settings;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.process.DefaultProcessCommands;

@@ -41,11 +40,11 @@ public class ProcessCommandWrapperImplTest {
@Rule
public ExpectedException expectedException = ExpectedException.none();

private Settings settings = new MapSettings();
private MapSettings settings = new MapSettings();

@Test
public void requestSQRestart_throws_IAE_if_process_index_property_not_set() throws Exception {
ProcessCommandWrapperImpl processCommandWrapper = new ProcessCommandWrapperImpl(settings);
ProcessCommandWrapperImpl processCommandWrapper = new ProcessCommandWrapperImpl(settings.asConfig());

expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("Property process.index is not set");
@@ -56,7 +55,7 @@ public class ProcessCommandWrapperImplTest {
@Test
public void requestSQRestart_throws_IAE_if_process_shared_path_property_not_set() throws Exception {
settings.setProperty(PROPERTY_PROCESS_INDEX, 1);
ProcessCommandWrapperImpl processCommandWrapper = new ProcessCommandWrapperImpl(settings);
ProcessCommandWrapperImpl processCommandWrapper = new ProcessCommandWrapperImpl(settings.asConfig());

expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("Property process.sharedDir is not set");
@@ -70,7 +69,7 @@ public class ProcessCommandWrapperImplTest {
settings.setProperty(PROPERTY_SHARED_PATH, tmpDir.getAbsolutePath());
settings.setProperty(PROPERTY_PROCESS_INDEX, PROCESS_NUMBER);

ProcessCommandWrapperImpl underTest = new ProcessCommandWrapperImpl(settings);
ProcessCommandWrapperImpl underTest = new ProcessCommandWrapperImpl(settings.asConfig());
underTest.requestSQRestart();

try (DefaultProcessCommands processCommands = DefaultProcessCommands.secondary(tmpDir, PROCESS_NUMBER)) {
@@ -81,7 +80,7 @@ public class ProcessCommandWrapperImplTest {
@Test
public void requestSQStop_throws_IAE_if_process_shared_path_property_not_set() throws Exception {
settings.setProperty(PROPERTY_PROCESS_INDEX, 1);
ProcessCommandWrapperImpl processCommandWrapper = new ProcessCommandWrapperImpl(settings);
ProcessCommandWrapperImpl processCommandWrapper = new ProcessCommandWrapperImpl(settings.asConfig());

expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("Property process.sharedDir is not set");
@@ -95,7 +94,7 @@ public class ProcessCommandWrapperImplTest {
settings.setProperty(PROPERTY_SHARED_PATH, tmpDir.getAbsolutePath());
settings.setProperty(PROPERTY_PROCESS_INDEX, PROCESS_NUMBER);

ProcessCommandWrapperImpl underTest = new ProcessCommandWrapperImpl(settings);
ProcessCommandWrapperImpl underTest = new ProcessCommandWrapperImpl(settings.asConfig());
underTest.requestStop();

try (DefaultProcessCommands processCommands = DefaultProcessCommands.secondary(tmpDir, PROCESS_NUMBER)) {
@@ -106,7 +105,7 @@ public class ProcessCommandWrapperImplTest {
@Test
public void notifyOperational_throws_IAE_if_process_sharedDir_property_not_set() throws Exception {
settings.setProperty(PROPERTY_PROCESS_INDEX, 1);
ProcessCommandWrapperImpl processCommandWrapper = new ProcessCommandWrapperImpl(settings);
ProcessCommandWrapperImpl processCommandWrapper = new ProcessCommandWrapperImpl(settings.asConfig());

expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("Property process.sharedDir is not set");
@@ -116,7 +115,7 @@ public class ProcessCommandWrapperImplTest {

@Test
public void notifyOperational_throws_IAE_if_process_index_property_not_set() throws Exception {
ProcessCommandWrapperImpl processCommandWrapper = new ProcessCommandWrapperImpl(settings);
ProcessCommandWrapperImpl processCommandWrapper = new ProcessCommandWrapperImpl(settings.asConfig());

expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("Property process.index is not set");
@@ -130,7 +129,7 @@ public class ProcessCommandWrapperImplTest {
settings.setProperty(PROPERTY_SHARED_PATH, tmpDir.getAbsolutePath());
settings.setProperty(PROPERTY_PROCESS_INDEX, PROCESS_NUMBER);

ProcessCommandWrapperImpl underTest = new ProcessCommandWrapperImpl(settings);
ProcessCommandWrapperImpl underTest = new ProcessCommandWrapperImpl(settings.asConfig());
underTest.notifyOperational();

try (DefaultProcessCommands processCommands = DefaultProcessCommands.secondary(tmpDir, PROCESS_NUMBER)) {

+ 7
- 8
server/sonar-server/src/test/java/org/sonar/server/authentication/JwtHttpHandlerTest.java View File

@@ -33,7 +33,6 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.ArgumentCaptor;
import org.sonar.api.config.Settings;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.utils.System2;
import org.sonar.db.DbClient;
@@ -80,12 +79,12 @@ public class JwtHttpHandlerTest {
private HttpServletResponse response = mock(HttpServletResponse.class);
private HttpSession httpSession = mock(HttpSession.class);
private System2 system2 = spy(System2.INSTANCE);
private Settings settings = new MapSettings();
private MapSettings settings = new MapSettings();
private JwtSerializer jwtSerializer = mock(JwtSerializer.class);
private JwtCsrfVerifier jwtCsrfVerifier = mock(JwtCsrfVerifier.class);
private UserDto userDto = newUserDto().setLogin(USER_LOGIN);

private JwtHttpHandler underTest = new JwtHttpHandler(system2, dbClient, settings, jwtSerializer, jwtCsrfVerifier);
private JwtHttpHandler underTest = new JwtHttpHandler(system2, dbClient, settings.asConfig(), jwtSerializer, jwtCsrfVerifier);

@Before
public void setUp() throws Exception {
@@ -125,7 +124,7 @@ public class JwtHttpHandlerTest {
int sessionTimeoutInMinutes = 10;
settings.setProperty("sonar.web.sessionTimeoutInMinutes", sessionTimeoutInMinutes);

underTest = new JwtHttpHandler(system2, dbClient, settings, jwtSerializer, jwtCsrfVerifier);
underTest = new JwtHttpHandler(system2, dbClient, settings.asConfig(), jwtSerializer, jwtCsrfVerifier);
underTest.generateToken(userDto, request, response);

verify(jwtSerializer).encode(jwtArgumentCaptor.capture());
@@ -137,7 +136,7 @@ public class JwtHttpHandlerTest {
int firstSessionTimeoutInMinutes = 10;
settings.setProperty("sonar.web.sessionTimeoutInMinutes", firstSessionTimeoutInMinutes);

underTest = new JwtHttpHandler(system2, dbClient, settings, jwtSerializer, jwtCsrfVerifier);
underTest = new JwtHttpHandler(system2, dbClient, settings.asConfig(), jwtSerializer, jwtCsrfVerifier);
underTest.generateToken(userDto, request, response);

// The property is updated, but it won't be taking into account
@@ -155,7 +154,7 @@ public class JwtHttpHandlerTest {
expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("Property sonar.web.sessionTimeoutInMinutes must be strictly positive. Got 0");

new JwtHttpHandler(system2, dbClient, settings, jwtSerializer, jwtCsrfVerifier);
new JwtHttpHandler(system2, dbClient, settings.asConfig(), jwtSerializer, jwtCsrfVerifier);
}

@Test
@@ -165,7 +164,7 @@ public class JwtHttpHandlerTest {
expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("Property sonar.web.sessionTimeoutInMinutes must be strictly positive. Got -10");

new JwtHttpHandler(system2, dbClient, settings, jwtSerializer, jwtCsrfVerifier);
new JwtHttpHandler(system2, dbClient, settings.asConfig(), jwtSerializer, jwtCsrfVerifier);
}

@Test
@@ -175,7 +174,7 @@ public class JwtHttpHandlerTest {
expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("Property sonar.web.sessionTimeoutInMinutes must not be greater than 3 months (129600 minutes). Got 172800 minutes");

new JwtHttpHandler(system2, dbClient, settings, jwtSerializer, jwtCsrfVerifier);
new JwtHttpHandler(system2, dbClient, settings.asConfig(), jwtSerializer, jwtCsrfVerifier);
}

@Test

+ 4
- 5
server/sonar-server/src/test/java/org/sonar/server/authentication/JwtSerializerTest.java View File

@@ -32,16 +32,15 @@ import javax.crypto.spec.SecretKeySpec;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.sonar.api.config.Settings;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.utils.System2;
import org.sonar.core.util.UuidFactory;
import org.sonar.core.util.UuidFactoryImpl;
import org.sonar.server.authentication.JwtSerializer.JwtSession;
import org.sonar.server.authentication.event.AuthenticationEvent.Source;

import static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.server.authentication.JwtSerializer.JwtSession;
import static org.sonar.server.authentication.event.AuthenticationEvent.Source;
import static org.sonar.server.authentication.event.AuthenticationExceptionMatcher.authenticationException;

public class JwtSerializerTest {
@@ -52,10 +51,10 @@ public class JwtSerializerTest {
@Rule
public ExpectedException expectedException = ExpectedException.none();

private Settings settings = new MapSettings();
private MapSettings settings = new MapSettings();
private System2 system2 = System2.INSTANCE;
private UuidFactory uuidFactory = UuidFactoryImpl.INSTANCE;
private JwtSerializer underTest = new JwtSerializer(settings, system2, uuidFactory);
private JwtSerializer underTest = new JwtSerializer(settings.asConfig(), system2, uuidFactory);

@Test
public void generate_token() throws Exception {

+ 3
- 4
server/sonar-server/src/test/java/org/sonar/server/authentication/RealmAuthenticatorTest.java View File

@@ -25,7 +25,6 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.ArgumentCaptor;
import org.sonar.api.config.Settings;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.security.Authenticator;
import org.sonar.api.security.ExternalGroupsProvider;
@@ -36,6 +35,7 @@ import org.sonar.api.server.authentication.IdentityProvider;
import org.sonar.api.server.authentication.UserIdentity;
import org.sonar.db.user.UserDto;
import org.sonar.server.authentication.event.AuthenticationEvent;
import org.sonar.server.authentication.event.AuthenticationEvent.Source;
import org.sonar.server.user.SecurityRealmFactory;

import static java.util.Arrays.asList;
@@ -49,7 +49,6 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import static org.sonar.db.user.UserTesting.newUserDto;
import static org.sonar.server.authentication.event.AuthenticationEvent.Source;
import static org.sonar.server.authentication.event.AuthenticationEvent.Method.BASIC;
import static org.sonar.server.authentication.event.AuthenticationEvent.Method.BASIC_TOKEN;
import static org.sonar.server.authentication.event.AuthenticationExceptionMatcher.authenticationException;
@@ -69,7 +68,7 @@ public class RealmAuthenticatorTest {
private ArgumentCaptor<IdentityProvider> identityProviderArgumentCaptor = ArgumentCaptor.forClass(IdentityProvider.class);
private ArgumentCaptor<AuthenticationEvent.Source> sourceCaptor = ArgumentCaptor.forClass(Source.class);

private Settings settings = new MapSettings();
private MapSettings settings = new MapSettings();

private SecurityRealmFactory securityRealmFactory = mock(SecurityRealmFactory.class);
private SecurityRealm realm = mock(SecurityRealm.class);
@@ -82,7 +81,7 @@ public class RealmAuthenticatorTest {

private HttpServletRequest request = mock(HttpServletRequest.class);

private RealmAuthenticator underTest = new RealmAuthenticator(settings, securityRealmFactory, userIdentityAuthenticator, authenticationEvent);
private RealmAuthenticator underTest = new RealmAuthenticator(settings.asConfig(), securityRealmFactory, userIdentityAuthenticator, authenticationEvent);

@Before
public void setUp() throws Exception {

+ 4
- 5
server/sonar-server/src/test/java/org/sonar/server/authentication/SsoAuthenticatorTest.java View File

@@ -31,7 +31,6 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.sonar.api.config.Settings;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.utils.System2;
import org.sonar.api.utils.internal.AlwaysIncreasingSystem2;
@@ -40,6 +39,7 @@ import org.sonar.db.DbTester;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto;
import org.sonar.server.authentication.event.AuthenticationEvent;
import org.sonar.server.authentication.event.AuthenticationEvent.Source;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.organization.OrganizationCreation;
import org.sonar.server.organization.TestDefaultOrganizationProvider;
@@ -61,7 +61,6 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import static org.sonar.db.user.UserTesting.newUserDto;
import static org.sonar.server.authentication.event.AuthenticationEvent.Source;
import static org.sonar.server.authentication.event.AuthenticationExceptionMatcher.authenticationException;

public class SsoAuthenticatorTest {
@@ -94,7 +93,7 @@ public class SsoAuthenticatorTest {
private GroupDto sonarUsers;

private System2 system2 = mock(System2.class);
private Settings settings = new MapSettings();
private MapSettings settings = new MapSettings();
private OrganizationCreation organizationCreation = mock(OrganizationCreation.class);
private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db);
private TestOrganizationFlags organizationFlags = TestOrganizationFlags.standalone();
@@ -102,14 +101,14 @@ public class SsoAuthenticatorTest {
private UserIdentityAuthenticator userIdentityAuthenticator = new UserIdentityAuthenticator(
db.getDbClient(),
new UserUpdater(mock(NewUserNotifier.class), db.getDbClient(), mock(UserIndexer.class), System2.INSTANCE, organizationFlags, defaultOrganizationProvider, organizationCreation,
new DefaultGroupFinder(db.getDbClient()), settings),
new DefaultGroupFinder(db.getDbClient()), settings.asConfig()),
defaultOrganizationProvider, organizationFlags, new DefaultGroupFinder(db.getDbClient()));

private HttpServletResponse response = mock(HttpServletResponse.class);
private JwtHttpHandler jwtHttpHandler = mock(JwtHttpHandler.class);
private AuthenticationEvent authenticationEvent = mock(AuthenticationEvent.class);

private SsoAuthenticator underTest = new SsoAuthenticator(system2, settings, userIdentityAuthenticator, jwtHttpHandler, authenticationEvent);
private SsoAuthenticator underTest = new SsoAuthenticator(system2, settings.asConfig(), userIdentityAuthenticator, jwtHttpHandler, authenticationEvent);

@Before
public void setUp() throws Exception {

+ 3
- 3
server/sonar-server/src/test/java/org/sonar/server/authentication/UserIdentityAuthenticatorTest.java View File

@@ -33,6 +33,8 @@ import org.sonar.db.DbTester;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto;
import org.sonar.server.authentication.event.AuthenticationEvent.Method;
import org.sonar.server.authentication.event.AuthenticationEvent.Source;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.organization.OrganizationCreation;
import org.sonar.server.organization.TestDefaultOrganizationProvider;
@@ -48,8 +50,6 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.sonar.core.config.CorePropertyDefinitions.ONBOARDING_TUTORIAL_SHOW_TO_NEW_USERS;
import static org.sonar.db.user.UserTesting.newUserDto;
import static org.sonar.server.authentication.event.AuthenticationEvent.Method;
import static org.sonar.server.authentication.event.AuthenticationEvent.Source;
import static org.sonar.server.authentication.event.AuthenticationExceptionMatcher.authenticationException;

public class UserIdentityAuthenticatorTest {
@@ -89,7 +89,7 @@ public class UserIdentityAuthenticatorTest {
defaultOrganizationProvider,
organizationCreation,
new DefaultGroupFinder(db.getDbClient()),
settings);
settings.asConfig());
private UserIdentityAuthenticator underTest = new UserIdentityAuthenticator(db.getDbClient(), userUpdater, defaultOrganizationProvider, organizationFlags,
new DefaultGroupFinder(db.getDbClient()));


+ 4
- 5
server/sonar-server/src/test/java/org/sonar/server/authentication/UserSessionInitializerTest.java View File

@@ -26,7 +26,6 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.sonar.api.config.Settings;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.server.authentication.BaseIdentityProvider;
import org.sonar.api.utils.System2;
@@ -35,6 +34,8 @@ import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.user.UserDto;
import org.sonar.server.authentication.event.AuthenticationEvent;
import org.sonar.server.authentication.event.AuthenticationEvent.Method;
import org.sonar.server.authentication.event.AuthenticationEvent.Source;
import org.sonar.server.authentication.event.AuthenticationException;
import org.sonar.server.user.ServerUserSession;
import org.sonar.server.user.TestUserSessionFactory;
@@ -53,8 +54,6 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import static org.sonar.db.user.UserTesting.newUserDto;
import static org.sonar.server.authentication.event.AuthenticationEvent.Method;
import static org.sonar.server.authentication.event.AuthenticationEvent.Source;

public class UserSessionInitializerTest {

@@ -75,11 +74,11 @@ public class UserSessionInitializerTest {
private SsoAuthenticator ssoAuthenticator = mock(SsoAuthenticator.class);
private AuthenticationEvent authenticationEvent = mock(AuthenticationEvent.class);
private TestUserSessionFactory userSessionFactory = TestUserSessionFactory.standalone();
private Settings settings = new MapSettings();
private MapSettings settings = new MapSettings();

private UserDto user = newUserDto();

private UserSessionInitializer underTest = new UserSessionInitializer(settings, jwtHttpHandler, basicAuthenticator,
private UserSessionInitializer underTest = new UserSessionInitializer(settings.asConfig(), jwtHttpHandler, basicAuthenticator,
ssoAuthenticator, userSession, authenticationEvent, userSessionFactory);

@Before

+ 2
- 3
server/sonar-server/src/test/java/org/sonar/server/authentication/ws/ValidateActionTest.java View File

@@ -27,7 +27,6 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.junit.Before;
import org.junit.Test;
import org.sonar.api.config.Settings;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.server.authentication.BasicAuthenticator;
import org.sonar.server.authentication.JwtHttpHandler;
@@ -52,9 +51,9 @@ public class ValidateActionTest {
BasicAuthenticator basicAuthenticator = mock(BasicAuthenticator.class);
JwtHttpHandler jwtHttpHandler = mock(JwtHttpHandler.class);

Settings settings = new MapSettings();
MapSettings settings = new MapSettings();

ValidateAction underTest = new ValidateAction(settings, basicAuthenticator, jwtHttpHandler);
ValidateAction underTest = new ValidateAction(settings.asConfig(), basicAuthenticator, jwtHttpHandler);

@Before
public void setUp() throws Exception {

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/batch/IssuesActionTest.java View File

@@ -70,7 +70,7 @@ public class IssuesActionTest {
@Rule
public DbTester db = DbTester.create(system2);
@Rule
public EsTester es = new EsTester(new IssueIndexDefinition(new MapSettings()));
public EsTester es = new EsTester(new IssueIndexDefinition(new MapSettings().asConfig()));
@Rule
public UserSessionRule userSessionRule = UserSessionRule.standalone();


+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/component/index/ComponentIndexTest.java View File

@@ -48,7 +48,7 @@ import static org.sonar.api.resources.Qualifiers.PROJECT;
public abstract class ComponentIndexTest {

@Rule
public EsTester es = new EsTester(new ComponentIndexDefinition(new MapSettings()));
public EsTester es = new EsTester(new ComponentIndexDefinition(new MapSettings().asConfig()));

@Rule
public DbTester db = DbTester.create(System2.INSTANCE);

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/component/index/ComponentIndexerTest.java View File

@@ -48,7 +48,7 @@ public class ComponentIndexerTest {
private System2 system2 = System2.INSTANCE;

@Rule
public EsTester esTester = new EsTester(new ComponentIndexDefinition(new MapSettings()));
public EsTester esTester = new EsTester(new ComponentIndexDefinition(new MapSettings().asConfig()));

@Rule
public DbTester dbTester = DbTester.create(system2);

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/component/ws/SearchProjectsActionTest.java View File

@@ -111,7 +111,7 @@ public class SearchProjectsActionTest {
@Rule
public UserSessionRule userSession = UserSessionRule.standalone();
@Rule
public EsTester es = new EsTester(new ProjectMeasuresIndexDefinition(new MapSettings()));
public EsTester es = new EsTester(new ProjectMeasuresIndexDefinition(new MapSettings().asConfig()));
@Rule
public DbTester db = DbTester.create(System2.INSTANCE);


+ 3
- 3
server/sonar-server/src/test/java/org/sonar/server/component/ws/SuggestionsActionTest.java View File

@@ -53,6 +53,8 @@ import org.sonar.server.ws.WsActionTester;
import org.sonar.test.JsonAssert;
import org.sonarqube.ws.MediaTypes;
import org.sonarqube.ws.WsComponents.SuggestionsWsResponse;
import org.sonarqube.ws.WsComponents.SuggestionsWsResponse.Category;
import org.sonarqube.ws.WsComponents.SuggestionsWsResponse.Organization;
import org.sonarqube.ws.WsComponents.SuggestionsWsResponse.Project;
import org.sonarqube.ws.WsComponents.SuggestionsWsResponse.Suggestion;

@@ -80,8 +82,6 @@ import static org.sonar.server.component.ws.SuggestionsAction.PARAM_MORE;
import static org.sonar.server.component.ws.SuggestionsAction.PARAM_QUERY;
import static org.sonar.server.component.ws.SuggestionsAction.PARAM_RECENTLY_BROWSED;
import static org.sonar.server.component.ws.SuggestionsAction.SHORT_INPUT_WARNING;
import static org.sonarqube.ws.WsComponents.SuggestionsWsResponse.Category;
import static org.sonarqube.ws.WsComponents.SuggestionsWsResponse.Organization;

public class SuggestionsActionTest {
private static final String[] SUGGESTION_QUALIFIERS = Stream.of(SuggestionCategory.values())
@@ -91,7 +91,7 @@ public class SuggestionsActionTest {
@Rule
public DbTester db = DbTester.create(System2.INSTANCE);
@Rule
public EsTester es = new EsTester(new ComponentIndexDefinition(new MapSettings()));
public EsTester es = new EsTester(new ComponentIndexDefinition(new MapSettings().asConfig()));
@Rule
public UserSessionRule userSessionRule = UserSessionRule.standalone();
public ResourceTypesRule resourceTypes = new ResourceTypesRule();

+ 14
- 12
server/sonar-server/src/test/java/org/sonar/server/computation/dbcleaner/ProjectCleanerTest.java View File

@@ -22,10 +22,12 @@ package org.sonar.server.computation.dbcleaner;
import org.junit.Before;
import org.junit.Test;
import org.sonar.api.CoreProperties;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.config.PropertyDefinitions;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.utils.log.Logger;
import org.sonar.core.config.PurgeConstants;
import org.sonar.core.config.PurgeProperties;
import org.sonar.db.DbSession;
import org.sonar.db.purge.IdUuidPair;
import org.sonar.db.purge.PurgeConfiguration;
@@ -35,9 +37,9 @@ import org.sonar.db.purge.PurgeProfiler;
import org.sonar.db.purge.period.DefaultPeriodCleaner;

import static java.util.Collections.emptyList;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyLong;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -50,7 +52,7 @@ public class ProjectCleanerTest {
private PurgeProfiler profiler = mock(PurgeProfiler.class);
private DefaultPeriodCleaner periodCleaner = mock(DefaultPeriodCleaner.class);
private PurgeListener purgeListener = mock(PurgeListener.class);
private Settings settings = new MapSettings();
private MapSettings settings = new MapSettings(new PropertyDefinitions(PurgeProperties.all()));

@Before
public void before() {
@@ -61,7 +63,7 @@ public class ProjectCleanerTest {
public void no_profiling_when_property_is_false() {
settings.setProperty(CoreProperties.PROFILING_LOG_PROPERTY, false);

underTest.purge(mock(DbSession.class), mock(IdUuidPair.class), settings, emptyList());
underTest.purge(mock(DbSession.class), mock(IdUuidPair.class), settings.asConfig(), emptyList());

verify(profiler, never()).dump(anyLong(), any(Logger.class));
}
@@ -70,7 +72,7 @@ public class ProjectCleanerTest {
public void profiling_when_property_is_true() {
settings.setProperty(CoreProperties.PROFILING_LOG_PROPERTY, true);

underTest.purge(mock(DbSession.class), mock(IdUuidPair.class), settings, emptyList());
underTest.purge(mock(DbSession.class), mock(IdUuidPair.class), settings.asConfig(), emptyList());

verify(profiler).dump(anyLong(), any(Logger.class));
}
@@ -79,9 +81,9 @@ public class ProjectCleanerTest {
public void call_period_cleaner_index_client_and_purge_dao() {
settings.setProperty(PurgeConstants.DAYS_BEFORE_DELETING_CLOSED_ISSUES, 5);

underTest.purge(mock(DbSession.class), mock(IdUuidPair.class), settings, emptyList());
underTest.purge(mock(DbSession.class), mock(IdUuidPair.class), settings.asConfig(), emptyList());

verify(periodCleaner).clean(any(DbSession.class), anyString(), any(Settings.class));
verify(periodCleaner).clean(any(DbSession.class), anyString(), any(Configuration.class));
verify(dao).purge(any(DbSession.class), any(PurgeConfiguration.class), any(PurgeListener.class), any(PurgeProfiler.class));
}

@@ -89,17 +91,17 @@ public class ProjectCleanerTest {
public void if_dao_purge_fails_it_should_not_interrupt_program_execution() {
doThrow(RuntimeException.class).when(dao).purge(any(DbSession.class), any(PurgeConfiguration.class), any(PurgeListener.class), any(PurgeProfiler.class));

underTest.purge(mock(DbSession.class), mock(IdUuidPair.class), settings, emptyList());
underTest.purge(mock(DbSession.class), mock(IdUuidPair.class), settings.asConfig(), emptyList());

verify(dao).purge(any(DbSession.class), any(PurgeConfiguration.class), any(PurgeListener.class), any(PurgeProfiler.class));
}

@Test
public void if_profiler_cleaning_fails_it_should_not_interrupt_program_execution() {
doThrow(RuntimeException.class).when(periodCleaner).clean(any(DbSession.class), anyString(), any(Settings.class));
doThrow(RuntimeException.class).when(periodCleaner).clean(any(DbSession.class), anyString(), any(Configuration.class));

underTest.purge(mock(DbSession.class), mock(IdUuidPair.class), settings, emptyList());
underTest.purge(mock(DbSession.class), mock(IdUuidPair.class), settings.asConfig(), emptyList());

verify(periodCleaner).clean(any(DbSession.class), anyString(), any(Settings.class));
verify(periodCleaner).clean(any(DbSession.class), anyString(), any(Configuration.class));
}
}

+ 6
- 6
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/api/measurecomputer/MeasureComputerContextImplTest.java View File

@@ -33,7 +33,7 @@ import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.utils.Duration;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.server.computation.task.projectanalysis.component.SettingsRepository;
import org.sonar.server.computation.task.projectanalysis.component.ConfigurationRepository;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolderRule;
import org.sonar.server.computation.task.projectanalysis.issue.ComponentIssuesRepositoryRule;
import org.sonar.server.computation.task.projectanalysis.measure.Measure;
@@ -95,7 +95,7 @@ public class MeasureComputerContextImplTest {
@Rule
public ComponentIssuesRepositoryRule componentIssuesRepository = new ComponentIssuesRepositoryRule(treeRootHolder);

SettingsRepository settingsRepository = mock(SettingsRepository.class);
ConfigurationRepository settingsRepository = mock(ConfigurationRepository.class);

@Test
public void get_component() throws Exception {
@@ -105,9 +105,9 @@ public class MeasureComputerContextImplTest {

@Test
public void get_string_settings() throws Exception {
org.sonar.api.config.Settings serverSettings = new MapSettings();
MapSettings serverSettings = new MapSettings();
serverSettings.setProperty("prop", "value");
when(settingsRepository.getSettings(FILE_1)).thenReturn(serverSettings);
when(settingsRepository.getConfiguration(FILE_1)).thenReturn(serverSettings.asConfig());

MeasureComputerContextImpl underTest = newContext(FILE_1_REF);
assertThat(underTest.getSettings().getString("prop")).isEqualTo("value");
@@ -116,9 +116,9 @@ public class MeasureComputerContextImplTest {

@Test
public void get_string_array_settings() throws Exception {
org.sonar.api.config.Settings serverSettings = new MapSettings();
MapSettings serverSettings = new MapSettings();
serverSettings.setProperty("prop", "1,3.4,8,50");
when(settingsRepository.getSettings(FILE_1)).thenReturn(serverSettings);
when(settingsRepository.getConfiguration(FILE_1)).thenReturn(serverSettings.asConfig());

MeasureComputerContextImpl underTest = newContext(FILE_1_REF);
assertThat(underTest.getSettings().getStringArray("prop")).containsExactly("1", "3.4", "8", "50");

server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/SettingsRepositoryTest.java → server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ConfigurationRepositoryTest.java View File

@@ -23,10 +23,10 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.utils.System2;
import org.sonar.ce.settings.ProjectSettingsFactory;
import org.sonar.ce.settings.ProjectConfigurationFactory;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
@@ -37,8 +37,7 @@ import org.sonar.db.property.PropertyDto;
import static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.server.computation.task.projectanalysis.component.Component.Type.PROJECT;


public class SettingsRepositoryTest {
public class ConfigurationRepositoryTest {

private static final Component ROOT = ReportComponent.builder(PROJECT, 1).setKey("ROOT").build();

@@ -51,13 +50,13 @@ public class SettingsRepositoryTest {

MapSettings globalSettings;

SettingsRepository underTest;
ConfigurationRepository underTest;

@Before
public void createDao() {
globalSettings = new MapSettings();
session = dbClient.openSession(false);
underTest = new SettingsRepositoryImpl(new ProjectSettingsFactory(globalSettings, dbClient));
underTest = new ConfigurationRepositoryImpl(new ProjectConfigurationFactory(globalSettings, dbClient));
}

@After
@@ -69,9 +68,9 @@ public class SettingsRepositoryTest {
public void get_project_settings_from_global_settings() {
globalSettings.setProperty("key", "value");

Settings settings = underTest.getSettings(ROOT);
Configuration config = underTest.getConfiguration(ROOT);

assertThat(settings.getString("key")).isEqualTo("value");
assertThat(config.get("key")).hasValue("value");
}

@Test
@@ -81,19 +80,19 @@ public class SettingsRepositoryTest {
dbClient.propertiesDao().saveProperty(session, new PropertyDto().setResourceId(project.getId()).setKey("key").setValue("value"));
session.commit();

Settings settings = underTest.getSettings(ROOT);
Configuration config = underTest.getConfiguration(ROOT);

assertThat(settings.getString("key")).isEqualTo("value");
assertThat(config.get("key")).hasValue("value");
}

@Test
public void call_twice_get_project_settings() {
globalSettings.setProperty("key", "value");

Settings settings = underTest.getSettings(ROOT);
assertThat(settings.getString("key")).isEqualTo("value");
Configuration config = underTest.getConfiguration(ROOT);
assertThat(config.get("key")).hasValue("value");

settings = underTest.getSettings(ROOT);
assertThat(settings.getString("key")).isEqualTo("value");
config = underTest.getConfiguration(ROOT);
assertThat(config.get("key")).hasValue("value");
}
}

+ 9
- 9
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/TestSettingsRepository.java View File

@@ -19,22 +19,22 @@
*/
package org.sonar.server.computation.task.projectanalysis.component;

import org.sonar.api.config.Settings;
import org.sonar.api.config.Configuration;

/**
* Implementation of {@link SettingsRepository} that always return the
* same mutable {@link Settings}, whatever the component.
* Implementation of {@link ConfigurationRepository} that always return the
* same {@link Configuration}, whatever the component.
*/
public class TestSettingsRepository implements SettingsRepository {
public class TestSettingsRepository implements ConfigurationRepository {

private final Settings settings;
private final Configuration config;

public TestSettingsRepository(Settings settings) {
this.settings = settings;
public TestSettingsRepository(Configuration config) {
this.config = config;
}

@Override
public Settings getSettings(Component component) {
return settings;
public Configuration getConfiguration(Component component) {
return config;
}
}

+ 20
- 39
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/duplication/IntegrateCrossProjectDuplicationsTest.java View File

@@ -25,7 +25,6 @@ import java.util.Collection;
import java.util.Collections;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.config.Settings;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.utils.log.LogTester;
import org.sonar.api.utils.log.LoggerLevel;
@@ -59,9 +58,9 @@ public class IntegrateCrossProjectDuplicationsTest {

static final String OTHER_FILE_KEY = "OTHER_FILE_KEY";

Settings settings = new MapSettings();
MapSettings settings = new MapSettings();

IntegrateCrossProjectDuplications underTest = new IntegrateCrossProjectDuplications(settings, duplicationRepository);
IntegrateCrossProjectDuplications underTest = new IntegrateCrossProjectDuplications(settings.asConfig(), duplicationRepository);

@Test
public void add_duplications_from_two_blocks() {
@@ -81,8 +80,7 @@ public class IntegrateCrossProjectDuplicationsTest {
.setIndexInFile(1)
.setLines(32, 45)
.setUnit(5, 20)
.build()
);
.build());

Collection<Block> duplicatedBlocks = asList(
new Block.Builder()
@@ -102,8 +100,7 @@ public class IntegrateCrossProjectDuplicationsTest {

assertThat(duplicationRepository.getDuplications(ORIGIN_FILE))
.containsExactly(
crossProjectDuplication(new TextBlock(30, 45), OTHER_FILE_KEY, new TextBlock(40, 55))
);
crossProjectDuplication(new TextBlock(30, 45), OTHER_FILE_KEY, new TextBlock(40, 55)));
}

@Test
@@ -118,8 +115,7 @@ public class IntegrateCrossProjectDuplicationsTest {
.setIndexInFile(0)
.setLines(30, 45)
.setUnit(0, 10)
.build()
);
.build());

Collection<Block> duplicatedBlocks = singletonList(
new Block.Builder()
@@ -127,15 +123,13 @@ public class IntegrateCrossProjectDuplicationsTest {
.setBlockHash(new ByteArray("a8998353e96320ec"))
.setIndexInFile(0)
.setLines(40, 55)
.build()
);
.build());

underTest.computeCpd(ORIGIN_FILE, originBlocks, duplicatedBlocks);

assertThat(duplicationRepository.getDuplications(ORIGIN_FILE))
.containsExactly(
crossProjectDuplication(new TextBlock(30, 45), OTHER_FILE_KEY, new TextBlock(40, 55))
);
crossProjectDuplication(new TextBlock(30, 45), OTHER_FILE_KEY, new TextBlock(40, 55)));
}

@Test
@@ -157,8 +151,7 @@ public class IntegrateCrossProjectDuplicationsTest {
.setIndexInFile(0)
.setLines(46, 60)
.setUnit(0, 10)
.build()
);
.build());

Collection<Block> duplicatedBlocks = singletonList(
new Block.Builder()
@@ -166,8 +159,7 @@ public class IntegrateCrossProjectDuplicationsTest {
.setBlockHash(new ByteArray("a8998353e96320ed"))
.setIndexInFile(0)
.setLines(40, 55)
.build()
);
.build());

underTest.computeCpd(ORIGIN_FILE, originBlocks, duplicatedBlocks);

@@ -186,8 +178,7 @@ public class IntegrateCrossProjectDuplicationsTest {
.setIndexInFile(0)
.setLines(30, 45)
.setUnit(0, 4)
.build()
);
.build());

Collection<Block> duplicatedBlocks = singletonList(
new Block.Builder()
@@ -195,8 +186,7 @@ public class IntegrateCrossProjectDuplicationsTest {
.setBlockHash(new ByteArray("a8998353e96320ec"))
.setIndexInFile(0)
.setLines(40, 55)
.build()
);
.build());

underTest.computeCpd(ORIGIN_FILE, originBlocks, duplicatedBlocks);

@@ -214,8 +204,7 @@ public class IntegrateCrossProjectDuplicationsTest {
.setIndexInFile(0)
.setLines(30, 45)
.setUnit(0, 10)
.build()
);
.build());

underTest.computeCpd(ORIGIN_FILE, originBlocks, Collections.<Block>emptyList());

@@ -237,8 +226,7 @@ public class IntegrateCrossProjectDuplicationsTest {
.setIndexInFile(0)
.setLines(30, 45)
.setUnit(0, 0)
.build()
);
.build());

Collection<Block> duplicatedBlocks = singletonList(
new Block.Builder()
@@ -246,15 +234,13 @@ public class IntegrateCrossProjectDuplicationsTest {
.setBlockHash(new ByteArray("a8998353e96320ec"))
.setIndexInFile(0)
.setLines(40, 55)
.build()
);
.build());

underTest.computeCpd(javaFile, originBlocks, duplicatedBlocks);

assertThat(duplicationRepository.getDuplications(ORIGIN_FILE))
.containsExactly(
crossProjectDuplication(new TextBlock(30, 45), OTHER_FILE_KEY, new TextBlock(40, 55))
);
crossProjectDuplication(new TextBlock(30, 45), OTHER_FILE_KEY, new TextBlock(40, 55)));
}

@Test
@@ -268,8 +254,7 @@ public class IntegrateCrossProjectDuplicationsTest {
.setIndexInFile(0)
.setLines(30, 45)
.setUnit(0, 100)
.build()
);
.build());

Collection<Block> duplicatedBlocks = singletonList(
new Block.Builder()
@@ -277,15 +262,13 @@ public class IntegrateCrossProjectDuplicationsTest {
.setBlockHash(new ByteArray("a8998353e96320ec"))
.setIndexInFile(0)
.setLines(40, 55)
.build()
);
.build());

underTest.computeCpd(ORIGIN_FILE, originBlocks, duplicatedBlocks);

assertThat(duplicationRepository.getDuplications(ORIGIN_FILE))
.containsExactly(
crossProjectDuplication(new TextBlock(30, 45), OTHER_FILE_KEY, new TextBlock(40, 55))
);
crossProjectDuplication(new TextBlock(30, 45), OTHER_FILE_KEY, new TextBlock(40, 55)));
}

@Test
@@ -306,8 +289,7 @@ public class IntegrateCrossProjectDuplicationsTest {
duplicatedBlocks.add(
blockBuilder
.setResourceId(randomAlphanumeric(16))
.build()
);
.build());
}

underTest.computeCpd(ORIGIN_FILE, originBlocks, duplicatedBlocks);
@@ -341,8 +323,7 @@ public class IntegrateCrossProjectDuplicationsTest {
blockBuilder
.setResourceId("resource" + i)
.setBlockHash(new ByteArray(hash))
.build()
);
.build());
}

underTest.computeCpd(ORIGIN_FILE, originBlocks, duplicatedBlocks);

+ 3
- 4
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/issue/DefaultAssigneeTest.java View File

@@ -23,14 +23,13 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.CoreProperties;
import org.sonar.api.config.Settings;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.db.DbTester;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.user.UserDto;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolderImpl;
import org.sonar.server.computation.task.projectanalysis.analysis.Organization;
import org.sonar.server.computation.task.projectanalysis.component.SettingsRepository;
import org.sonar.server.computation.task.projectanalysis.component.ConfigurationRepository;
import org.sonar.server.computation.task.projectanalysis.component.TestSettingsRepository;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolderRule;

@@ -48,8 +47,8 @@ public class DefaultAssigneeTest {
@Rule
public TreeRootHolderRule rootHolder = new TreeRootHolderRule().setRoot(DUMB_PROJECT);

private Settings settings = new MapSettings();
private SettingsRepository settingsRepository = new TestSettingsRepository(settings);
private MapSettings settings = new MapSettings();
private ConfigurationRepository settingsRepository = new TestSettingsRepository(settings.asConfig());
private AnalysisMetadataHolderImpl analysisMetadataHolder = new AnalysisMetadataHolderImpl();
private OrganizationDto organizationDto;


+ 0
- 0
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/issue/ScmAccountToUserLoaderTest.java View File


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save