aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2017-03-24 08:17:49 +0100
committerJulien Lancelot <julien.lancelot@sonarsource.com>2017-03-24 08:17:49 +0100
commit70d52b56bb19ef9725b3cb598563e6684bc3327a (patch)
tree44eece10ec53ad6d8f17cd6b9d7b0742968a547b
parenta90da315099b208300f6dd3dc5b5f822d21b4ab1 (diff)
parent62c010110229b99c4125a961453deadbd45d6814 (diff)
downloadsonarqube-70d52b56bb19ef9725b3cb598563e6684bc3327a.tar.gz
sonarqube-70d52b56bb19ef9725b3cb598563e6684bc3327a.zip
Merge remote-tracking branch 'origin/branch-6.3'
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesDao.java6
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesMapper.java11
-rw-r--r--server/sonar-db-dao/src/main/resources/org/sonar/db/property/PropertiesMapper.xml10
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/property/PropertiesDaoTest.java18
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/setting/ws/ScannerSettings.java36
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/setting/ws/ValuesAction.java12
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/setting/ws/ScannerSettingsTest.java28
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/setting/ws/ValuesActionTest.java11
8 files changed, 71 insertions, 61 deletions
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesDao.java
index ee33f445c83..a7f0c203216 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesDao.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesDao.java
@@ -36,8 +36,10 @@ import org.sonar.db.Dao;
import org.sonar.db.DatabaseUtils;
import org.sonar.db.DbSession;
import org.sonar.db.MyBatis;
+import org.sonar.db.WildcardPosition;
import static com.google.common.base.Preconditions.checkArgument;
+import static org.sonar.db.DaoDatabaseUtils.buildLikeValue;
import static org.sonar.db.DatabaseUtils.executeLargeInputs;
import static org.sonar.db.DatabaseUtils.executeLargeInputsWithoutOutput;
@@ -171,6 +173,10 @@ public class PropertiesDao implements Dao {
return executeLargeInputs(keys, partitionKeys -> getMapper(session).selectByKeys(partitionKeys, componentId));
}
+ public List<PropertyDto> selectGlobalPropertiesByKeyQuery(DbSession session, String keyQuery) {
+ return getMapper(session).selectGlobalPropertiesByKeyQuery(buildLikeValue(keyQuery, WildcardPosition.BEFORE_AND_AFTER));
+ }
+
/**
* Saves the specified property and its value.
* <p>
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesMapper.java
index a18113ecd3d..452479a6ee6 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesMapper.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesMapper.java
@@ -46,6 +46,13 @@ public interface PropertiesMapper {
List<PropertyDto> selectDescendantModuleProperties(@Param("moduleUuid") String moduleUuid, @Param(value = "scope") String scope,
@Param(value = "excludeDisabled") boolean excludeDisabled);
+ List<Long> selectIdsByOrganizationAndUser(@Param("organizationUuid") String organizationUuid, @Param("userId") int userId);
+
+ List<Long> selectIdsByOrganizationAndMatchingLogin(@Param("organizationUuid") String organizationUuid, @Param("login") String login,
+ @Param("propertyKeys") List<String> propertyKeys);
+
+ List<PropertyDto> selectGlobalPropertiesByKeyQuery(@Param("textQuery") String textQuery);
+
void insertAsEmpty(@Param("key") String key, @Nullable @Param("userId") Integer userId, @Nullable @Param("componentId") Long componentId,
@Param("now") long now);
@@ -71,8 +78,4 @@ public interface PropertiesMapper {
int renamePropertyKey(@Param("oldKey") String oldKey, @Param("newKey") String newKey);
- List<Long> selectIdsByOrganizationAndUser(@Param("organizationUuid") String organizationUuid, @Param("userId") int userId);
-
- List<Long> selectIdsByOrganizationAndMatchingLogin(@Param("organizationUuid") String organizationUuid, @Param("login") String login,
- @Param("propertyKeys") List<String> propertyKeys);
}
diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/property/PropertiesMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/property/PropertiesMapper.xml
index 8c6d0fd1456..d9fdda52f84 100644
--- a/server/sonar-db-dao/src/main/resources/org/sonar/db/property/PropertiesMapper.xml
+++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/property/PropertiesMapper.xml
@@ -181,6 +181,16 @@
</where>
</select>
+ <select id="selectGlobalPropertiesByKeyQuery" resultType="ScrapProperty">
+ select
+ <include refid="columnsToScrapPropertyDto"/>
+ from
+ properties p
+ where
+ p.resource_id is null
+ and p.user_id is null
+ and p.prop_key like #{textQuery,jdbcType=VARCHAR}
+ </select>
<select id="selectIdsByOrganizationAndUser" parameterType="map" resultType="long">
select py.id
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/property/PropertiesDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/property/PropertiesDaoTest.java
index 733811d8ea9..3a2df05cc96 100644
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/property/PropertiesDaoTest.java
+++ b/server/sonar-db-dao/src/test/java/org/sonar/db/property/PropertiesDaoTest.java
@@ -486,6 +486,24 @@ public class PropertiesDaoTest {
}
@Test
+ public void select_global_properties_by_key_query() throws SQLException {
+ // global
+ insertProperty("sonar.plugin1.licenseHash.secured", "one", null, null);
+ insertProperty("sonar.plugin2.licenseHash.secured", "two", null, null);
+ // on component and user
+ insertProperty("sonar.plugin1.licenseHash.secure", "one", 10L, null);
+ insertProperty("sonar.plugin1.licenseHash.secure", "two", 10L, 100);
+
+ assertThat(underTest.selectGlobalPropertiesByKeyQuery(dbTester.getSession(), ".licenseHash.secured")).extracting(PropertyDto::getKey, PropertyDto::getValue)
+ .containsOnly(tuple("sonar.plugin1.licenseHash.secured", "one"), tuple("sonar.plugin2.licenseHash.secured", "two"));
+ assertThat(underTest.selectGlobalPropertiesByKeyQuery(dbTester.getSession(), "plugin1.licenseHash.secured")).extracting(PropertyDto::getKey, PropertyDto::getValue)
+ .containsOnly(tuple("sonar.plugin1.licenseHash.secured", "one"));
+ assertThat(underTest.selectGlobalPropertiesByKeyQuery(dbTester.getSession(), "plugin1")).extracting(PropertyDto::getKey, PropertyDto::getValue)
+ .containsOnly(tuple("sonar.plugin1.licenseHash.secured", "one"));
+ assertThat(underTest.selectGlobalPropertiesByKeyQuery(dbTester.getSession(), "unknown")).isEmpty();
+ }
+
+ @Test
public void saveProperty_inserts_global_properties_when_they_do_not_exist_in_db() {
when(system2.now()).thenReturn(DATE_1, DATE_2, DATE_3, DATE_4, DATE_5);
diff --git a/server/sonar-server/src/main/java/org/sonar/server/setting/ws/ScannerSettings.java b/server/sonar-server/src/main/java/org/sonar/server/setting/ws/ScannerSettings.java
index f0ffeb902d0..6fadbf2ad93 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/setting/ws/ScannerSettings.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/setting/ws/ScannerSettings.java
@@ -22,11 +22,11 @@ package org.sonar.server.setting.ws;
import com.google.common.collect.ImmutableSet;
import java.util.Set;
import java.util.stream.Stream;
-import org.sonar.api.Startable;
import org.sonar.api.config.PropertyDefinition;
import org.sonar.api.config.PropertyDefinitions;
-import org.sonar.core.platform.PluginInfo;
-import org.sonar.core.platform.PluginRepository;
+import org.sonar.db.DbClient;
+import org.sonar.db.DbSession;
+import org.sonar.db.property.PropertyDto;
import static java.util.stream.Collectors.toSet;
import static java.util.stream.Stream.concat;
@@ -39,31 +39,25 @@ import static org.sonar.server.setting.ws.SettingsWsSupport.LICENSE_HASH_SUFFIX;
/**
* This class returns the list of settings required on scanner side (licenses, license hashes, server ids, etc.)
*/
-public class ScannerSettings implements Startable {
+public class ScannerSettings {
- private static final String SONAR_PREFIX = "sonar.";
private static final Set<String> SERVER_SETTING_KEYS = ImmutableSet.of(PERMANENT_SERVER_ID, SERVER_STARTTIME, SERVER_ID);
+ private final DbClient dbClient;
private final PropertyDefinitions propertyDefinitions;
- private final PluginRepository pluginRepository;
- private Set<String> scannerSettingKeys;
-
- public ScannerSettings(PropertyDefinitions propertyDefinitions, PluginRepository pluginRepository) {
+ public ScannerSettings(DbClient dbClient, PropertyDefinitions propertyDefinitions) {
+ this.dbClient = dbClient;
this.propertyDefinitions = propertyDefinitions;
- this.pluginRepository = pluginRepository;
}
- @Override
- public void start() {
- this.scannerSettingKeys = concat(concat(loadLicenseKeys(), loadLicenseHashKeys()),
+ Set<String> getScannerSettingKeys(DbSession dbSession) {
+ return concat(concat(loadLicenseKeys(), loadLicenseHashKeys(dbSession)),
SERVER_SETTING_KEYS.stream()).collect(toSet());
}
- private Stream<String> loadLicenseHashKeys() {
- return pluginRepository.getPluginInfos().stream()
- .map(PluginInfo::getKey)
- .map(key -> SONAR_PREFIX + key + LICENSE_HASH_SUFFIX);
+ private Stream<String> loadLicenseHashKeys(DbSession dbSession) {
+ return dbClient.propertiesDao().selectGlobalPropertiesByKeyQuery(dbSession, LICENSE_HASH_SUFFIX).stream().map(PropertyDto::getKey);
}
private Stream<String> loadLicenseKeys() {
@@ -73,12 +67,4 @@ public class ScannerSettings implements Startable {
.map(PropertyDefinition::key);
}
- Set<String> getScannerSettingKeys() {
- return scannerSettingKeys;
- }
-
- @Override
- public void stop() {
- // nothing to do
- }
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/setting/ws/ValuesAction.java b/server/sonar-server/src/main/java/org/sonar/server/setting/ws/ValuesAction.java
index bbf39457fea..836e944cb1b 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/setting/ws/ValuesAction.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/setting/ws/ValuesAction.java
@@ -69,7 +69,7 @@ public class ValuesAction implements SettingsWsAction {
private final ScannerSettings scannerSettings;
public ValuesAction(DbClient dbClient, ComponentFinder componentFinder, UserSession userSession, PropertyDefinitions propertyDefinitions, SettingsFinder settingsFinder,
- SettingsWsSupport settingsWsSupport, ScannerSettings scannerSettings) {
+ SettingsWsSupport settingsWsSupport, ScannerSettings scannerSettings) {
this.dbClient = dbClient;
this.componentFinder = componentFinder;
this.userSession = userSession;
@@ -113,7 +113,7 @@ public class ValuesAction implements SettingsWsAction {
ValuesRequest valuesRequest = toWsRequest(request);
Optional<ComponentDto> component = loadComponent(dbSession, valuesRequest);
- Set<String> keys = loadKeys(valuesRequest);
+ Set<String> keys = loadKeys(dbSession, valuesRequest);
Map<String, String> keysToDisplayMap = getKeysToDisplayMap(keys);
List<Setting> settings = loadSettings(dbSession, component, keysToDisplayMap.keySet());
return new ValuesResponseBuilder(settings, component, keysToDisplayMap).build();
@@ -129,12 +129,12 @@ public class ValuesAction implements SettingsWsAction {
return builder.build();
}
- private Set<String> loadKeys(ValuesRequest valuesRequest) {
+ private Set<String> loadKeys(DbSession dbSession, ValuesRequest valuesRequest) {
List<String> keys = valuesRequest.getKeys();
- if (!keys.isEmpty()) {
- return new HashSet<>(keys);
+ if (keys.isEmpty()) {
+ return concat(propertyDefinitions.getAll().stream().map(PropertyDefinition::key), scannerSettings.getScannerSettingKeys(dbSession).stream()).collect(Collectors.toSet());
}
- return concat(propertyDefinitions.getAll().stream().map(PropertyDefinition::key), scannerSettings.getScannerSettingKeys().stream()).collect(Collectors.toSet());
+ return new HashSet<>(keys);
}
private Optional<ComponentDto> loadComponent(DbSession dbSession, ValuesRequest valuesRequest) {
diff --git a/server/sonar-server/src/test/java/org/sonar/server/setting/ws/ScannerSettingsTest.java b/server/sonar-server/src/test/java/org/sonar/server/setting/ws/ScannerSettingsTest.java
index 8b8dcfd9957..034d81e613c 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/setting/ws/ScannerSettingsTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/setting/ws/ScannerSettingsTest.java
@@ -19,44 +19,41 @@
*/
package org.sonar.server.setting.ws;
+import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.config.PropertyDefinition;
import org.sonar.api.config.PropertyDefinitions;
-import org.sonar.core.platform.PluginInfo;
-import org.sonar.core.platform.PluginRepository;
+import org.sonar.api.utils.System2;
+import org.sonar.db.DbTester;
import static java.util.Arrays.asList;
-import static java.util.Collections.singletonList;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
import static org.sonar.api.PropertyType.LICENSE;
+import static org.sonar.db.property.PropertyTesting.newGlobalPropertyDto;
public class ScannerSettingsTest {
+ @Rule
+ public DbTester db = DbTester.create(System2.INSTANCE);
+
private PropertyDefinitions definitions = new PropertyDefinitions();
- private PluginRepository repository = mock(PluginRepository.class);
- private ScannerSettings underTest = new ScannerSettings(definitions, repository);
+ private ScannerSettings underTest = new ScannerSettings(db.getDbClient(), definitions);
@Test
public void return_license_keys() throws Exception {
definitions.addComponents(asList(
PropertyDefinition.builder("foo").build(),
PropertyDefinition.builder("myplugin.license.secured").type(LICENSE).build()));
- underTest.start();
- assertThat(underTest.getScannerSettingKeys()).contains("myplugin.license.secured");
+ assertThat(underTest.getScannerSettingKeys(db.getSession())).contains("myplugin.license.secured");
}
@Test
public void return_license_hash_keys() throws Exception {
- PluginInfo pluginInfo = mock(PluginInfo.class);
- when(pluginInfo.getKey()).thenReturn("myplugin");
- when(repository.getPluginInfos()).thenReturn(singletonList(pluginInfo));
- underTest.start();
+ db.properties().insertProperty(newGlobalPropertyDto("sonar.myplugin.licenseHash.secured", "hash"));
- assertThat(underTest.getScannerSettingKeys()).contains("sonar.myplugin.licenseHash.secured");
+ assertThat(underTest.getScannerSettingKeys(db.getSession())).contains("sonar.myplugin.licenseHash.secured");
}
@Test
@@ -64,8 +61,7 @@ public class ScannerSettingsTest {
definitions.addComponents(asList(
PropertyDefinition.builder("foo").build(),
PropertyDefinition.builder("myplugin.license.secured").type(LICENSE).build()));
- underTest.start();
- assertThat(underTest.getScannerSettingKeys()).contains("sonar.server_id", "sonar.core.id", "sonar.core.startTime");
+ assertThat(underTest.getScannerSettingKeys(db.getSession())).contains("sonar.server_id", "sonar.core.id", "sonar.core.startTime");
}
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/setting/ws/ValuesActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/setting/ws/ValuesActionTest.java
index 85174ecdd5b..72107ab9576 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/setting/ws/ValuesActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/setting/ws/ValuesActionTest.java
@@ -34,8 +34,6 @@ import org.sonar.api.config.PropertyDefinitions;
import org.sonar.api.config.PropertyFieldDefinition;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.core.platform.PluginInfo;
-import org.sonar.core.platform.PluginRepository;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDbTester;
@@ -58,8 +56,6 @@ import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.groups.Tuple.tuple;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
import static org.sonar.api.PropertyType.LICENSE;
import static org.sonar.api.resources.Qualifiers.MODULE;
import static org.sonar.api.resources.Qualifiers.PROJECT;
@@ -94,8 +90,7 @@ public class ValuesActionTest {
private ComponentDbTester componentDb = new ComponentDbTester(db);
private PropertyDefinitions definitions = new PropertyDefinitions();
private SettingsFinder settingsFinder = new SettingsFinder(dbClient, definitions);
- private PluginRepository repository = mock(PluginRepository.class);
- private ScannerSettings scannerSettings = new ScannerSettings(definitions, repository);
+ private ScannerSettings scannerSettings = new ScannerSettings(db.getDbClient(), definitions);
private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db);
private SettingsWsSupport support = new SettingsWsSupport(defaultOrganizationProvider, userSession);
private ComponentDto project;
@@ -105,10 +100,6 @@ public class ValuesActionTest {
@Before
public void setUp() throws Exception {
- PluginInfo pluginInfo = mock(PluginInfo.class);
- when(pluginInfo.getKey()).thenReturn("plugin");
- when(repository.getPluginInfos()).thenReturn(singletonList(pluginInfo));
- scannerSettings.start();
OrganizationDto organizationDto = db.organizations().insert();
project = componentDb.insertComponent(newProjectDto(organizationDto));
}