aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDuarte Meneses <duarte.meneses@sonarsource.com>2020-01-29 15:35:22 -0600
committerSonarTech <sonartech@sonarsource.com>2020-02-14 20:53:09 +0100
commitc502f859682071fc6d06776af77fc8866a9f57ca (patch)
treec0d0af87e6b19eb77ecee12dd5deadca1e23b9cb
parent7a976f685959816c3147a92e23e54b431d2ed6a5 (diff)
downloadsonarqube-c502f859682071fc6d06776af77fc8866a9f57ca.tar.gz
sonarqube-c502f859682071fc6d06776af77fc8866a9f57ca.zip
SONAR-13019 Keys of rules created from template are not renamed when template rule key is renamed
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java22
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java46
2 files changed, 57 insertions, 11 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java b/server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java
index 1b99932ed9b..081a12c8aba 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java
@@ -70,7 +70,6 @@ import org.sonar.server.rule.index.RuleIndexer;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Sets.difference;
import static com.google.common.collect.Sets.intersection;
import static java.lang.String.format;
@@ -163,16 +162,14 @@ public class RegisterRules implements Startable {
}
private RegisterRulesContext createRegisterRulesContext(DbSession dbSession) {
- Map<RuleKey, RuleDefinitionDto> allRules = dbClient.ruleDao().selectAllDefinitions(dbSession)
- .stream()
+ Map<RuleKey, RuleDefinitionDto> allRules = dbClient.ruleDao().selectAllDefinitions(dbSession).stream()
.collect(uniqueIndex(RuleDefinitionDto::getKey));
Map<Integer, Set<SingleDeprecatedRuleKey>> existingDeprecatedKeysById = loadDeprecatedRuleKeys(dbSession);
return new RegisterRulesContext(allRules, existingDeprecatedKeysById);
}
private Map<Integer, Set<SingleDeprecatedRuleKey>> loadDeprecatedRuleKeys(DbSession dbSession) {
- return dbClient.ruleDao().selectAllDeprecatedRuleKeys(dbSession)
- .stream()
+ return dbClient.ruleDao().selectAllDeprecatedRuleKeys(dbSession).stream()
.map(SingleDeprecatedRuleKey::from)
.collect(Collectors.groupingBy(SingleDeprecatedRuleKey::getRuleId, Collectors.toSet()));
}
@@ -224,7 +221,7 @@ public class RegisterRules implements Startable {
RuleDefinitionDto rule = dbRulesByRuleId.get(ruleId);
if (rule == null) {
LOG.warn("Could not retrieve rule with id %s referenced by a deprecated rule key. " +
- "The following deprecated rule keys seem to be referencing a non-existing rule",
+ "The following deprecated rule keys seem to be referencing a non-existing rule",
ruleId, entry.getValue());
} else {
entry.getValue().forEach(d -> builder.put(d.getOldRuleKeyAsRuleKey(), rule));
@@ -631,8 +628,6 @@ public class RegisterRules implements Startable {
} else if (dto.getSystemTags().size() != ruleDef.tags().size() ||
!dto.getSystemTags().containsAll(ruleDef.tags())) {
dto.setSystemTags(ruleDef.tags());
- // FIXME this can't be implemented easily with organization support: remove end-user tags that are now declared as system
- // RuleTagHelper.applyTags(dto, ImmutableSet.copyOf(dto.getTags()));
changed = true;
}
return changed;
@@ -654,7 +649,7 @@ public class RegisterRules implements Startable {
private void processRemainingDbRules(RegisterRulesContext recorder, DbSession dbSession) {
// custom rules check status of template, so they must be processed at the end
- List<RuleDefinitionDto> customRules = newArrayList();
+ List<RuleDefinitionDto> customRules = new ArrayList<>();
recorder.getRemaining().forEach(rule -> {
if (rule.isCustomRule()) {
@@ -670,6 +665,7 @@ public class RegisterRules implements Startable {
Optional<RuleDefinitionDto> template = dbClient.ruleDao().selectDefinitionById(templateId, dbSession);
if (template.isPresent() && template.get().getStatus() != RuleStatus.REMOVED) {
if (updateCustomRuleFromTemplateRule(customRule, template.get())) {
+ recorder.updated(customRule);
update(dbSession, customRule);
}
} else {
@@ -732,6 +728,10 @@ public class RegisterRules implements Startable {
customRule.setSeverity(templateRule.getSeverityString());
changed = true;
}
+ if (!StringUtils.equals(customRule.getRepositoryKey(), templateRule.getRepositoryKey())) {
+ customRule.setRepositoryKey(templateRule.getRepositoryKey());
+ changed = true;
+ }
return changed;
}
@@ -802,7 +802,7 @@ public class RegisterRules implements Startable {
.collect(Collectors.toSet());
checkState(incorrectRuleKeyMessage.isEmpty(), "An incorrect state of deprecated rule keys has been detected.\n %s",
- lazyToString(() -> incorrectRuleKeyMessage.stream().collect(Collectors.joining("\n"))));
+ lazyToString(() -> String.join("\n", incorrectRuleKeyMessage)));
}
private static Stream<String> filterInvalidDeprecatedRuleKeys(ImmutableMap<RuleKey, SingleDeprecatedRuleKey> dbDeprecatedRuleKeysByOldRuleKey,
@@ -844,7 +844,7 @@ public class RegisterRules implements Startable {
Set<T> duplicates = new HashSet<>();
Set<T> uniques = new HashSet<>();
- list.stream().forEach(t -> {
+ list.forEach(t -> {
if (!uniques.add(t)) {
duplicates.add(t);
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java
index a557963cee6..d875bf42807 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java
@@ -453,6 +453,45 @@ public class RegisterRulesTest {
}
@Test
+ public void update_template_rule_key_should_also_update_custom_rules() {
+ when(system.now()).thenReturn(DATE1.getTime());
+ execute(context -> {
+ NewRepository repo = context.createRepository("squid", "java");
+ repo.createRule("rule")
+ .setName("Name1")
+ .setHtmlDescription("Description")
+ .setTemplate(true);
+ repo.done();
+ });
+
+ RuleDto rule1 = dbClient.ruleDao().selectOrFailByKey(db.getSession(), defaultOrganization, RuleKey.of("squid", "rule"));
+
+ // insert custom rule
+ dbClient.ruleDao().insert(db.getSession(), new RuleDefinitionDto()
+ .setRuleKey(RuleKey.of("squid", "custom"))
+ .setLanguage("java")
+ .setScope(Scope.ALL)
+ .setTemplateId(rule1.getId())
+ .setName("custom1"));
+ db.commit();
+
+ // re-key rule
+ execute(context -> {
+ NewRepository repo = context.createRepository("java", "java");
+ repo.createRule("rule")
+ .setName("Name1")
+ .setHtmlDescription("Description")
+ .addDeprecatedRuleKey("squid", "rule")
+ .setTemplate(true);
+ repo.done();
+ });
+
+ // template rule and custom rule have been updated
+ rule1 = dbClient.ruleDao().selectOrFailByKey(db.getSession(), defaultOrganization, RuleKey.of("java", "rule"));
+ RuleDto custom = dbClient.ruleDao().selectOrFailByKey(db.getSession(), defaultOrganization, RuleKey.of("java", "custom"));
+ }
+
+ @Test
public void update_if_rule_key_renamed_and_deprecated_key_declared() {
String ruleKey1 = "rule1";
String ruleKey2 = "rule2";
@@ -1048,6 +1087,13 @@ public class RegisterRulesTest {
repo.done();
}
+ private void verifyIndicesMarkedAsInitialized() {
+ verify(metadataIndex).setInitialized(RuleIndexDefinition.TYPE_RULE, true);
+ verify(metadataIndex).setInitialized(RuleIndexDefinition.TYPE_RULE_EXTENSION, true);
+ verify(metadataIndex).setInitialized(RuleIndexDefinition.TYPE_ACTIVE_RULE, true);
+ reset(metadataIndex);
+ }
+
private RuleParamDto getParam(List<RuleParamDto> params, String key) {
for (RuleParamDto param : params) {
if (param.getName().equals(key)) {