summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorMichal Duda <michal.duda@sonarsource.com>2021-03-11 20:52:24 +0100
committersonartech <sonartech@sonarsource.com>2021-03-17 20:08:34 +0000
commit4e76eae61a9cc708dde1e71d1895dfbb810f63ce (patch)
tree1b268245f8ebfb51e23f00e2588e87ed2661690b /server
parentb65f41e7553d520a095509d3db7fca15302547f3 (diff)
downloadsonarqube-4e76eae61a9cc708dde1e71d1895dfbb810f63ce.tar.gz
sonarqube-4e76eae61a9cc708dde1e71d1895dfbb810f63ce.zip
SONAR-14192 Add optional return field 'deprecatedKeys' to /api/rules/search
Diffstat (limited to 'server')
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleDao.java4
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleMapper.java3
-rw-r--r--server/sonar-db-dao/src/main/resources/org/sonar/db/rule/RuleMapper.xml18
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleDaoTest.java28
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RuleMapper.java36
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RulesWsParameters.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/SearchAction.java23
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/ShowAction.java3
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/UpdateAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/test/java/org/sonar/server/rule/ws/SearchActionTest.java33
-rw-r--r--server/sonar-webserver-webapi/src/test/java/org/sonar/server/rule/ws/ShowActionTest.java23
11 files changed, 155 insertions, 24 deletions
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleDao.java
index 4225bb87f4d..10a40db90cb 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleDao.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleDao.java
@@ -224,6 +224,10 @@ public class RuleDao implements Dao {
return mapper(session).selectAllDeprecatedRuleKeys();
}
+ public Set<DeprecatedRuleKeyDto> selectDeprecatedRuleKeysByRuleUuids(DbSession session, Collection<String> ruleUuids) {
+ return mapper(session).selectDeprecatedRuleKeysByRuleUuids(ruleUuids);
+ }
+
public void deleteDeprecatedRuleKeys(DbSession dbSession, Collection<String> uuids) {
if (uuids.isEmpty()) {
return;
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleMapper.java
index 31a0ef9be7b..d4d61573244 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleMapper.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleMapper.java
@@ -19,6 +19,7 @@
*/
package org.sonar.db.rule;
+import java.util.Collection;
import java.util.List;
import java.util.Set;
import org.apache.ibatis.annotations.Param;
@@ -86,6 +87,8 @@ public interface RuleMapper {
Set<DeprecatedRuleKeyDto> selectAllDeprecatedRuleKeys();
+ Set<DeprecatedRuleKeyDto> selectDeprecatedRuleKeysByRuleUuids(@Param("ruleUuids") Collection<String> ruleUuids);
+
void deleteDeprecatedRuleKeys(@Param("uuids") List<String> uuids);
void insertDeprecatedRuleKey(DeprecatedRuleKeyDto deprecatedRuleKeyDto);
diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/rule/RuleMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/rule/RuleMapper.xml
index e8967deffaa..fb4c67409a8 100644
--- a/server/sonar-db-dao/src/main/resources/org/sonar/db/rule/RuleMapper.xml
+++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/rule/RuleMapper.xml
@@ -553,6 +553,24 @@
LEFT OUTER JOIN rules r on r.uuid = drk.rule_uuid
</select>
+ <select id="selectDeprecatedRuleKeysByRuleUuids" resultType="org.sonar.db.rule.DeprecatedRuleKeyDto">
+ SELECT
+ drk.uuid,
+ drk.rule_uuid as "ruleUuid",
+ drk.old_repository_key as "oldRepositoryKey",
+ drk.old_rule_key as "oldRuleKey",
+ r.plugin_rule_key as "newRuleKey",
+ r.plugin_name as "newRepositoryKey",
+ drk.created_at as "createdAt"
+ FROM
+ deprecated_rule_keys drk
+ LEFT OUTER JOIN rules r on r.uuid = drk.rule_uuid
+ WHERE
+ <foreach item="uuid" index="index" collection="ruleUuids" open="(" separator=" or " close=")">
+ drk.rule_uuid=#{uuid,jdbcType=VARCHAR}
+ </foreach>
+ </select>
+
<delete id="deleteDeprecatedRuleKeys">
DELETE FROM
deprecated_rule_keys
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleDaoTest.java
index 3a2d3fe768f..5180c858067 100644
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleDaoTest.java
+++ b/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleDaoTest.java
@@ -19,6 +19,7 @@
*/
package org.sonar.db.rule;
+import com.google.common.collect.ImmutableSet;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -62,7 +63,7 @@ public class RuleDaoTest {
@Rule
public DbTester db = DbTester.create(System2.INSTANCE);
- private RuleDao underTest = db.getDbClient().ruleDao();
+ private final RuleDao underTest = db.getDbClient().ruleDao();
@Test
public void selectByKey() {
@@ -388,8 +389,8 @@ public class RuleDaoTest {
.setLanguage("java"));
db.rules().insertOrUpdateMetadata(rule1);
- assertThat(underTest.selectByTypeAndLanguages(db.getSession(),singletonList(RuleType.VULNERABILITY.getDbConstant()), singletonList("java")))
- .extracting( RuleDto::getUuid, RuleDto::getLanguage, RuleDto::getType)
+ assertThat(underTest.selectByTypeAndLanguages(db.getSession(), singletonList(RuleType.VULNERABILITY.getDbConstant()), singletonList("java")))
+ .extracting(RuleDto::getUuid, RuleDto::getLanguage, RuleDto::getType)
.isEmpty();
}
@@ -904,6 +905,27 @@ public class RuleDaoTest {
}
@Test
+ public void selectDeprecatedRuleKeysByRuleUuids() {
+ RuleDefinitionDto r1 = db.rules().insert();
+ RuleDefinitionDto r2 = db.rules().insert();
+ RuleDefinitionDto r3 = db.rules().insert();
+ RuleDefinitionDto r4 = db.rules().insert();
+
+ DeprecatedRuleKeyDto drk1 = db.rules().insertDeprecatedKey(r -> r.setRuleUuid(r1.getUuid()));
+ DeprecatedRuleKeyDto drk2 = db.rules().insertDeprecatedKey(r -> r.setRuleUuid(r1.getUuid()));
+ DeprecatedRuleKeyDto drk3 = db.rules().insertDeprecatedKey(r -> r.setRuleUuid(r2.getUuid()));
+ db.rules().insertDeprecatedKey(r -> r.setRuleUuid(r4.getUuid()));
+
+ db.getSession().commit();
+
+ Set<DeprecatedRuleKeyDto> deprecatedRuleKeyDtos = underTest.selectDeprecatedRuleKeysByRuleUuids(
+ db.getSession(), ImmutableSet.of(r1.getUuid(), r2.getUuid(), r3.getUuid()));
+ assertThat(deprecatedRuleKeyDtos)
+ .extracting(DeprecatedRuleKeyDto::getUuid)
+ .containsExactlyInAnyOrder(drk1.getUuid(), drk2.getUuid(), drk3.getUuid());
+ }
+
+ @Test
public void selectAllDeprecatedRuleKeys_return_values_even_if_there_is_no_rule() {
db.rules().insertDeprecatedKey();
db.rules().insertDeprecatedKey();
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RuleMapper.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RuleMapper.java
index c72f2de15f3..8209c953c78 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RuleMapper.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RuleMapper.java
@@ -20,16 +20,20 @@
package org.sonar.server.rule.ws;
import com.google.common.base.Function;
+import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
+import java.util.stream.Collectors;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import org.sonar.api.resources.Language;
import org.sonar.api.resources.Languages;
+import org.sonar.api.rule.RuleKey;
import org.sonar.api.server.debt.DebtRemediationFunction;
import org.sonar.api.server.debt.internal.DefaultDebtRemediationFunction;
+import org.sonar.db.rule.DeprecatedRuleKeyDto;
import org.sonar.db.rule.RuleDefinitionDto;
import org.sonar.db.rule.RuleDto;
import org.sonar.db.rule.RuleDto.Scope;
@@ -44,7 +48,6 @@ import org.sonarqube.ws.Common;
import org.sonarqube.ws.Common.RuleScope;
import org.sonarqube.ws.Rules;
-import static java.lang.String.format;
import static org.sonar.api.utils.DateUtils.formatDateTime;
import static org.sonar.core.util.stream.MoreCollectors.toList;
import static org.sonar.server.rule.ws.RulesWsParameters.FIELD_CREATED_AT;
@@ -52,6 +55,7 @@ import static org.sonar.server.rule.ws.RulesWsParameters.FIELD_DEBT_OVERLOADED;
import static org.sonar.server.rule.ws.RulesWsParameters.FIELD_DEBT_REM_FUNCTION;
import static org.sonar.server.rule.ws.RulesWsParameters.FIELD_DEFAULT_DEBT_REM_FUNCTION;
import static org.sonar.server.rule.ws.RulesWsParameters.FIELD_DEFAULT_REM_FUNCTION;
+import static org.sonar.server.rule.ws.RulesWsParameters.FIELD_DEPRECATED_KEYS;
import static org.sonar.server.rule.ws.RulesWsParameters.FIELD_EFFORT_TO_FIX_DESCRIPTION;
import static org.sonar.server.rule.ws.RulesWsParameters.FIELD_GAP_DESCRIPTION;
import static org.sonar.server.rule.ws.RulesWsParameters.FIELD_HTML_DESCRIPTION;
@@ -89,19 +93,21 @@ public class RuleMapper {
public Rules.Rule toWsRule(RuleDefinitionDto ruleDefinitionDto, SearchResult result, Set<String> fieldsToReturn) {
Rules.Rule.Builder ruleResponse = Rules.Rule.newBuilder();
- applyRuleDefinition(ruleResponse, ruleDefinitionDto, result, fieldsToReturn);
+ applyRuleDefinition(ruleResponse, ruleDefinitionDto, result, fieldsToReturn, Collections.emptyMap());
return ruleResponse.build();
}
- public Rules.Rule toWsRule(RuleDefinitionDto ruleDefinition, SearchResult result, Set<String> fieldsToReturn, RuleMetadataDto metadata, Map<String, UserDto> usersByUuid) {
+ public Rules.Rule toWsRule(RuleDefinitionDto ruleDefinition, SearchResult result, Set<String> fieldsToReturn, RuleMetadataDto metadata,
+ Map<String, UserDto> usersByUuid, Map<String, List<DeprecatedRuleKeyDto>> deprecatedRuleKeysByRuleUuid) {
Rules.Rule.Builder ruleResponse = Rules.Rule.newBuilder();
- applyRuleDefinition(ruleResponse, ruleDefinition, result, fieldsToReturn);
+ applyRuleDefinition(ruleResponse, ruleDefinition, result, fieldsToReturn, deprecatedRuleKeysByRuleUuid);
applyRuleMetadata(ruleResponse, ruleDefinition, metadata, usersByUuid, fieldsToReturn);
setDebtRemediationFunctionFields(ruleResponse, ruleDefinition, metadata, fieldsToReturn);
return ruleResponse.build();
}
- private Rules.Rule.Builder applyRuleDefinition(Rules.Rule.Builder ruleResponse, RuleDefinitionDto ruleDefinitionDto, SearchResult result, Set<String> fieldsToReturn) {
+ private Rules.Rule.Builder applyRuleDefinition(Rules.Rule.Builder ruleResponse, RuleDefinitionDto ruleDefinitionDto, SearchResult result,
+ Set<String> fieldsToReturn, Map<String, List<DeprecatedRuleKeyDto>> deprecatedRuleKeysByRuleUuid) {
// Mandatory fields
ruleResponse.setKey(ruleDefinitionDto.getKey().toString());
@@ -125,6 +131,7 @@ public class RuleMapper {
setDefaultDebtRemediationFunctionFields(ruleResponse, ruleDefinitionDto, fieldsToReturn);
setEffortToFixDescription(ruleResponse, ruleDefinitionDto, fieldsToReturn);
setScope(ruleResponse, ruleDefinitionDto, fieldsToReturn);
+ setDeprecatedKeys(ruleResponse, ruleDefinitionDto, fieldsToReturn, deprecatedRuleKeysByRuleUuid);
return ruleResponse;
}
@@ -181,6 +188,23 @@ public class RuleMapper {
}
}
+ private static void setDeprecatedKeys(Rules.Rule.Builder ruleResponse, RuleDefinitionDto ruleDto, Set<String> fieldsToReturn,
+ Map<String, List<DeprecatedRuleKeyDto>> deprecatedRuleKeysByRuleUuid) {
+ if (shouldReturnField(fieldsToReturn, FIELD_DEPRECATED_KEYS)) {
+ List<DeprecatedRuleKeyDto> deprecatedRuleKeyDtos = deprecatedRuleKeysByRuleUuid.get(ruleDto.getUuid());
+ if (deprecatedRuleKeyDtos == null) {
+ return;
+ }
+
+ List<String> deprecatedKeys = deprecatedRuleKeyDtos.stream()
+ .map(r -> RuleKey.of(r.getOldRepositoryKey(), r.getOldRuleKey()).toString())
+ .collect(Collectors.toList());
+ if (!deprecatedKeys.isEmpty()) {
+ ruleResponse.setDeprecatedKeys(Rules.DeprecatedKeys.newBuilder().addAllDeprecatedKey(deprecatedKeys).build());
+ }
+ }
+ }
+
private static RuleScope toWsRuleScope(Scope scope) {
switch (scope) {
case ALL:
@@ -375,7 +399,7 @@ public class RuleMapper {
}
}
- private static boolean shouldReturnField(Set<String> fieldsToReturn, String fieldName) {
+ public static boolean shouldReturnField(Set<String> fieldsToReturn, String fieldName) {
return fieldsToReturn.isEmpty() || fieldsToReturn.contains(fieldName);
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RulesWsParameters.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RulesWsParameters.java
index abcedd10cd2..b301e0d6faf 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RulesWsParameters.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RulesWsParameters.java
@@ -100,12 +100,14 @@ public class RulesWsParameters {
public static final String FIELD_PARAMS = "params";
public static final String FIELD_ACTIVES = "actives";
+ public static final String FIELD_DEPRECATED_KEYS = "deprecatedKeys";
+
public static final Set<String> OPTIONAL_FIELDS = ImmutableSet.of(FIELD_REPO, FIELD_NAME, FIELD_CREATED_AT, FIELD_UPDATED_AT, FIELD_SEVERITY, FIELD_STATUS, FIELD_INTERNAL_KEY,
FIELD_IS_EXTERNAL, FIELD_IS_TEMPLATE, FIELD_TEMPLATE_KEY, FIELD_TAGS, FIELD_SYSTEM_TAGS, FIELD_LANGUAGE, FIELD_LANGUAGE_NAME, FIELD_HTML_DESCRIPTION,
FIELD_MARKDOWN_DESCRIPTION, FIELD_NOTE_LOGIN, FIELD_MARKDOWN_NOTE, FIELD_HTML_NOTE,
FIELD_DEFAULT_DEBT_REM_FUNCTION, FIELD_EFFORT_TO_FIX_DESCRIPTION, FIELD_DEBT_OVERLOADED, FIELD_DEBT_REM_FUNCTION,
FIELD_DEFAULT_REM_FUNCTION, FIELD_GAP_DESCRIPTION, FIELD_REM_FUNCTION_OVERLOADED, FIELD_REM_FUNCTION,
- FIELD_PARAMS, FIELD_ACTIVES, FIELD_SCOPE);
+ FIELD_PARAMS, FIELD_ACTIVES, FIELD_SCOPE, FIELD_DEPRECATED_KEYS);
private RulesWsParameters() {
// prevent instantiation
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/SearchAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/SearchAction.java
index 22e2025522b..63f67a97384 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/SearchAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/SearchAction.java
@@ -27,6 +27,7 @@ import com.google.common.collect.Maps;
import com.google.common.collect.Ordering;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -46,6 +47,7 @@ import org.sonar.api.server.ws.WebService;
import org.sonar.core.util.stream.MoreCollectors;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
+import org.sonar.db.rule.DeprecatedRuleKeyDto;
import org.sonar.db.rule.RuleDefinitionDto;
import org.sonar.db.rule.RuleDto;
import org.sonar.db.rule.RuleParamDto;
@@ -78,6 +80,7 @@ import static org.sonar.server.rule.index.RuleIndex.FACET_SONARSOURCE_SECURITY;
import static org.sonar.server.rule.index.RuleIndex.FACET_STATUSES;
import static org.sonar.server.rule.index.RuleIndex.FACET_TAGS;
import static org.sonar.server.rule.index.RuleIndex.FACET_TYPES;
+import static org.sonar.server.rule.ws.RulesWsParameters.FIELD_DEPRECATED_KEYS;
import static org.sonar.server.rule.ws.RulesWsParameters.OPTIONAL_FIELDS;
import static org.sonar.server.rule.ws.RulesWsParameters.PARAM_ACTIVE_SEVERITIES;
import static org.sonar.server.rule.ws.RulesWsParameters.PARAM_CWE;
@@ -205,7 +208,25 @@ public class SearchAction implements RulesWsAction {
private void writeRules(DbSession dbSession, SearchResponse.Builder response, SearchResult result, SearchOptions context) {
Map<String, UserDto> usersByUuid = ruleWsSupport.getUsersByUuid(dbSession, result.rules);
- result.rules.forEach(rule -> response.addRules(mapper.toWsRule(rule.getDefinition(), result, context.getFields(), rule.getMetadata(), usersByUuid)));
+ Map<String, List<DeprecatedRuleKeyDto>> deprecatedRuleKeysByRuleUuid = getDeprecatedRuleKeysByRuleUuid(dbSession, result.rules, context);
+ result.rules.forEach(rule -> response.addRules(mapper.toWsRule(rule.getDefinition(), result, context.getFields(), rule.getMetadata(), usersByUuid,
+ deprecatedRuleKeysByRuleUuid)));
+ }
+
+ private Map<String, List<DeprecatedRuleKeyDto>> getDeprecatedRuleKeysByRuleUuid(DbSession dbSession, List<RuleDto> rules, SearchOptions context) {
+ if (!RuleMapper.shouldReturnField(context.getFields(), FIELD_DEPRECATED_KEYS)) {
+ return Collections.emptyMap();
+ }
+
+ Set<String> ruleUuidsSet = rules.stream()
+ .map(RuleDto::getUuid)
+ .collect(Collectors.toSet());
+ if (ruleUuidsSet.isEmpty()) {
+ return Collections.emptyMap();
+ } else {
+ return dbClient.ruleDao().selectDeprecatedRuleKeysByRuleUuids(dbSession, ruleUuidsSet).stream()
+ .collect(Collectors.groupingBy(DeprecatedRuleKeyDto::getRuleUuid));
+ }
}
private static SearchOptions buildSearchOptions(SearchRequest request) {
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/ShowAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/ShowAction.java
index c4e89e6df48..d5fa9c9cf54 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/ShowAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/ShowAction.java
@@ -35,6 +35,7 @@ import org.sonar.server.exceptions.NotFoundException;
import org.sonarqube.ws.Rules.ShowResponse;
import static java.lang.String.format;
+import static java.util.Collections.emptyMap;
import static java.util.Collections.singletonList;
import static java.util.Optional.ofNullable;
import static org.sonar.server.ws.WsUtils.writeProtobuf;
@@ -117,7 +118,7 @@ public class ShowAction implements RulesWsAction {
ShowResponse.Builder responseBuilder = ShowResponse.newBuilder();
RuleDto rule = searchResult.getRules().get(0);
responseBuilder.setRule(mapper.toWsRule(rule.getDefinition(), searchResult, Collections.emptySet(), rule.getMetadata(),
- ruleWsSupport.getUsersByUuid(dbSession, searchResult.getRules())));
+ ruleWsSupport.getUsersByUuid(dbSession, searchResult.getRules()), emptyMap()));
if (request.mandatoryParamAsBoolean(PARAM_ACTIVES)) {
activeRuleCompleter.completeShow(dbSession, rule.getDefinition()).forEach(responseBuilder::addActives);
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/UpdateAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/UpdateAction.java
index 65e86bab8bd..4439524e04c 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/UpdateAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/UpdateAction.java
@@ -47,6 +47,7 @@ import org.sonarqube.ws.Rules.UpdateResponse;
import static com.google.common.collect.Sets.newHashSet;
import static java.lang.String.format;
+import static java.util.Collections.emptyMap;
import static java.util.Collections.singletonList;
import static java.util.Optional.ofNullable;
import static org.sonar.server.rule.ws.CreateAction.KEY_MAXIMUM_LENGTH;
@@ -249,7 +250,8 @@ public class UpdateAction implements RulesWsAction {
.setRuleParameters(ruleParameters)
.setTotal(1L);
responseBuilder
- .setRule(mapper.toWsRule(rule.getDefinition(), searchResult, Collections.emptySet(), rule.getMetadata(), ruleWsSupport.getUsersByUuid(dbSession, singletonList(rule))));
+ .setRule(mapper.toWsRule(rule.getDefinition(), searchResult, Collections.emptySet(), rule.getMetadata(),
+ ruleWsSupport.getUsersByUuid(dbSession, singletonList(rule)), emptyMap()));
return responseBuilder.build();
}
diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/rule/ws/SearchActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/rule/ws/SearchActionTest.java
index a6b34dc482b..162ddbc1456 100644
--- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/rule/ws/SearchActionTest.java
+++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/rule/ws/SearchActionTest.java
@@ -298,6 +298,39 @@ public class SearchActionTest {
}
@Test
+ public void return_deprecatedKeys_in_response_on_demand() {
+ RuleDefinitionDto rule1 = db.rules().insert(r -> r.setLanguage("java"));
+ db.rules().insertDeprecatedKey(r -> r.setRuleUuid(rule1.getUuid()).setOldRuleKey("oldrulekey").setOldRepositoryKey("oldrepositorykey"));
+ db.rules().insertDeprecatedKey(r -> r.setRuleUuid(rule1.getUuid()).setOldRuleKey("oldrulekey2").setOldRepositoryKey("oldrepositorykey2"));
+ RuleDefinitionDto rule2 = db.rules().insert(r -> r.setLanguage("javascript"));
+
+ indexRules();
+
+ Rules.SearchResponse response = ws.newRequest()
+ .setParam(WebService.Param.FIELDS, "deprecatedKeys")
+ .executeProtobuf(Rules.SearchResponse.class);
+
+ System.err.println(response.getRulesList());
+
+ assertThat(response.getRulesList()).satisfies(l -> {
+ assertThat(l).hasSize(2);
+
+ assertThat(l).anySatisfy(e -> {
+ assertThat(e.getKey()).isEqualTo(rule1.getKey().toString());
+ assertThat(e.getType().getNumber()).isEqualTo(rule1.getType());
+ assertThat(e.getDeprecatedKeys()).isNotNull();
+ assertThat(e.getDeprecatedKeys().getDeprecatedKeyList()).contains("oldrepositorykey:oldrulekey", "oldrepositorykey2:oldrulekey2");
+ });
+ assertThat(l).anySatisfy(e -> {
+ assertThat(e.getKey()).isEqualTo(rule2.getKey().toString());
+ assertThat(e.getType().getNumber()).isEqualTo(rule2.getType());
+ assertThat(e.getDeprecatedKeys()).isNotNull();
+ assertThat(e.getDeprecatedKeys().getDeprecatedKeyList()).isEmpty();
+ });
+ });
+ }
+
+ @Test
public void should_filter_on_specific_tags() {
RuleDefinitionDto rule1 = db.rules().insert(r -> r.setLanguage("java"));
RuleMetadataDto metadata1 = insertMetadata(rule1, setTags("tag1", "tag2"));
diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/rule/ws/ShowActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/rule/ws/ShowActionTest.java
index 07c800955e0..05873d8f742 100644
--- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/rule/ws/ShowActionTest.java
+++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/rule/ws/ShowActionTest.java
@@ -22,7 +22,6 @@ package org.sonar.server.rule.ws;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
-import org.junit.rules.ExpectedException;
import org.sonar.api.resources.Languages;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.Severity;
@@ -69,13 +68,10 @@ public class ShowActionTest {
public UserSessionRule userSession = UserSessionRule.standalone();
@org.junit.Rule
public DbTester db = DbTester.create();
- @org.junit.Rule
- public ExpectedException thrown = ExpectedException.none();
-
- private MacroInterpreter macroInterpreter = mock(MacroInterpreter.class);
- private Languages languages = new Languages(newLanguage("xoo", "Xoo"));
- private WsActionTester ws = new WsActionTester(
+ private final MacroInterpreter macroInterpreter = mock(MacroInterpreter.class);
+ private final Languages languages = new Languages(newLanguage("xoo", "Xoo"));
+ private final WsActionTester ws = new WsActionTester(
new ShowAction(db.getDbClient(), new RuleMapper(languages, macroInterpreter),
new ActiveRuleCompleter(db.getDbClient(), languages),
new RuleWsSupport(db.getDbClient(), userSession)));
@@ -110,7 +106,7 @@ public class ShowActionTest {
assertThat(resultRule.getRepo()).isEqualTo(rule.getRepositoryKey());
assertThat(resultRule.getName()).isEqualTo(rule.getName());
assertThat(resultRule.getSeverity()).isEqualTo(rule.getSeverityString());
- assertThat(resultRule.getStatus().toString()).isEqualTo(rule.getStatus().toString());
+ assertThat(resultRule.getStatus()).hasToString(rule.getStatus().toString());
assertThat(resultRule.getInternalKey()).isEqualTo(rule.getConfigKey());
assertThat(resultRule.getIsTemplate()).isEqualTo(rule.isTemplate());
assertThat(resultRule.getLang()).isEqualTo(rule.getLanguage());
@@ -166,6 +162,7 @@ public class ShowActionTest {
assertThat(resultRule.getRemFnGapMultiplier()).isEqualTo("5d");
assertThat(resultRule.getRemFnBaseEffort()).isEqualTo("10h");
assertThat(resultRule.getRemFnOverloaded()).isFalse();
+ assertThat(resultRule.hasDeprecatedKeys()).isFalse();
}
@Test
@@ -193,6 +190,7 @@ public class ShowActionTest {
assertThat(resultRule.getRemFnGapMultiplier()).isEqualTo("5d");
assertThat(resultRule.getRemFnBaseEffort()).isEqualTo("10h");
assertThat(resultRule.getRemFnOverloaded()).isTrue();
+ assertThat(resultRule.hasDeprecatedKeys()).isFalse();
}
@Test
@@ -220,6 +218,7 @@ public class ShowActionTest {
assertThat(resultRule.hasRemFnGapMultiplier()).isFalse();
assertThat(resultRule.getRemFnBaseEffort()).isEqualTo("15h");
assertThat(resultRule.getRemFnOverloaded()).isTrue();
+ assertThat(resultRule.hasDeprecatedKeys()).isFalse();
}
@Test
@@ -246,6 +245,7 @@ public class ShowActionTest {
assertThat(resultRule.hasRemFnGapMultiplier()).isFalse();
assertThat(resultRule.hasRemFnBaseEffort()).isFalse();
assertThat(resultRule.getRemFnOverloaded()).isFalse();
+ assertThat(resultRule.hasDeprecatedKeys()).isFalse();
}
@Test
@@ -274,6 +274,7 @@ public class ShowActionTest {
assertThat(resultRule.hasDebtRemFnCoeff()).isFalse();
assertThat(resultRule.getDebtRemFnOffset()).isEqualTo("15h");
assertThat(resultRule.getDebtOverloaded()).isTrue();
+ assertThat(resultRule.hasDeprecatedKeys()).isFalse();
}
@Test
@@ -388,7 +389,7 @@ public class ShowActionTest {
public void show_rule_with_activation() {
RuleDefinitionDto rule = db.rules().insert();
RuleParamDto ruleParam = db.rules().insertRuleParam(rule, p -> p.setType("STRING").setDescription("Reg *exp*").setDefaultValue(".*"));
- RuleMetadataDto ruleMetadata = db.rules().insertOrUpdateMetadata(rule, m -> m.setNoteData(null).setNoteUserUuid(null));
+ db.rules().insertOrUpdateMetadata(rule, m -> m.setNoteData(null).setNoteUserUuid(null));
QProfileDto qProfile = db.qualityProfiles().insert();
ActiveRuleDto activeRule = db.qualityProfiles().activateRule(qProfile, rule);
db.getDbClient().activeRuleDao().insertParam(db.getSession(), activeRule, new ActiveRuleParamDto()
@@ -414,9 +415,9 @@ public class ShowActionTest {
@Test
public void show_rule_without_activation() {
RuleDefinitionDto rule = db.rules().insert();
- RuleMetadataDto ruleMetadata = db.rules().insertOrUpdateMetadata(rule, m -> m.setNoteData(null).setNoteUserUuid(null));
+ db.rules().insertOrUpdateMetadata(rule, m -> m.setNoteData(null).setNoteUserUuid(null));
QProfileDto qProfile = db.qualityProfiles().insert();
- ActiveRuleDto activeRule = db.qualityProfiles().activateRule(qProfile, rule);
+ db.qualityProfiles().activateRule(qProfile, rule);
ShowResponse result = ws.newRequest()
.setParam(PARAM_KEY, rule.getKey().toString())