aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDamien Urruty <damien.urruty@sonarsource.com>2022-03-01 09:43:18 +0100
committersonartech <sonartech@sonarsource.com>2022-03-03 09:54:42 +0000
commit042825ec38a115983cbdced7a8b5b1d56aa05e74 (patch)
tree2a542ee829f55c4dc0047d7ba2c235bcc35dc069
parentbb4cc98d5f0b52c3caeb52fc4f772248be8d95fa (diff)
downloadsonarqube-042825ec38a115983cbdced7a8b5b1d56aa05e74.tar.gz
sonarqube-042825ec38a115983cbdced7a8b5b1d56aa05e74.zip
SONAR-15919 Send only rule keys for deactivated rules in RuleSetChanged
-rw-r--r--server/sonar-webserver-pushapi/src/main/java/org/sonar/server/pushapi/qualityprofile/QualityProfileChangeEventServiceImpl.java53
-rw-r--r--server/sonar-webserver-pushapi/src/main/java/org/sonar/server/pushapi/sonarlint/SonarLintClientsRegistry.java6
-rw-r--r--server/sonar-webserver-pushapi/src/test/java/org/sonar/server/pushapi/sonarlint/SonarLintClientsRegistryTest.java26
-rw-r--r--server/sonar-webserver-pushapi/src/test/java/org/sonar/server/qualityprofile/builtin/QualityProfileChangeEventServiceImplTest.java11
-rw-r--r--server/sonar-webserver-pushapi/src/test/resources/org/sonar/server/pushapi/sonarlint/rule-change-event-data.json13
-rw-r--r--sonar-core/src/main/java/org/sonar/core/util/RuleSetChangedEvent.java8
-rw-r--r--sonar-core/src/test/java/org/sonar/core/util/RuleSetChangedEventTest.java12
7 files changed, 66 insertions, 63 deletions
diff --git a/server/sonar-webserver-pushapi/src/main/java/org/sonar/server/pushapi/qualityprofile/QualityProfileChangeEventServiceImpl.java b/server/sonar-webserver-pushapi/src/main/java/org/sonar/server/pushapi/qualityprofile/QualityProfileChangeEventServiceImpl.java
index c5386a36ef7..75cd84956f5 100644
--- a/server/sonar-webserver-pushapi/src/main/java/org/sonar/server/pushapi/qualityprofile/QualityProfileChangeEventServiceImpl.java
+++ b/server/sonar-webserver-pushapi/src/main/java/org/sonar/server/pushapi/qualityprofile/QualityProfileChangeEventServiceImpl.java
@@ -24,12 +24,14 @@ import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
+import org.sonar.api.rule.RuleKey;
import org.sonar.api.server.ServerSide;
import org.sonar.core.util.ParamChange;
import org.sonar.core.util.RuleChange;
@@ -45,6 +47,11 @@ import org.sonar.db.qualityprofile.QProfileDto;
import org.sonar.db.rule.RuleDto;
import org.sonar.server.qualityprofile.ActiveRuleChange;
+import static java.util.function.Predicate.not;
+import static org.sonar.server.qualityprofile.ActiveRuleChange.Type.ACTIVATED;
+import static org.sonar.server.qualityprofile.ActiveRuleChange.Type.DEACTIVATED;
+import static org.sonar.server.qualityprofile.ActiveRuleChange.Type.UPDATED;
+
@ServerSide
public class QualityProfileChangeEventServiceImpl implements QualityProfileChangeEventService {
@@ -59,21 +66,23 @@ public class QualityProfileChangeEventServiceImpl implements QualityProfileChang
@Override
public void publishRuleActivationToSonarLintClients(ProjectDto project, @Nullable QProfileDto activatedProfile, @Nullable QProfileDto deactivatedProfile) {
List<RuleChange> activatedRules = new ArrayList<>();
- List<RuleChange> deactivatedRules = new ArrayList<>();
+ Set<String> deactivatedRules = new HashSet<>();
if (activatedProfile != null) {
activatedRules.addAll(createRuleChanges(activatedProfile));
}
if (deactivatedProfile != null) {
- deactivatedRules.addAll(createRuleChanges(deactivatedProfile));
+ deactivatedRules.addAll(getRuleKeys(deactivatedProfile));
}
if (activatedRules.isEmpty() && deactivatedRules.isEmpty()) {
return;
}
- RuleSetChangedEvent event = new RuleSetChangedEvent(new String[] {project.getKey()}, activatedRules.toArray(new RuleChange[0]), deactivatedRules.toArray(new RuleChange[0]));
+ String language = activatedProfile != null ? activatedProfile.getLanguage() : deactivatedProfile.getLanguage();
+ RuleSetChangedEvent event = new RuleSetChangedEvent(new String[] {project.getKey()}, activatedRules.toArray(new RuleChange[0]), deactivatedRules.toArray(new String[0]),
+ language);
eventsDistributor.pushEvent(event);
}
@@ -102,6 +111,22 @@ public class QualityProfileChangeEventServiceImpl implements QualityProfileChang
return ruleChanges;
}
+ private Set<String> getRuleKeys(@NotNull QProfileDto profileDto) {
+ Set<String> ruleKeys = new HashSet<>();
+
+ try (DbSession dbSession = dbClient.openSession(false)) {
+ List<OrgActiveRuleDto> activeRuleDtos = dbClient.activeRuleDao().selectByProfile(dbSession, profileDto);
+
+ List<String> ruleUuids = activeRuleDtos.stream().map(ActiveRuleDto::getRuleUuid).collect(Collectors.toList());
+ List<RuleDto> ruleDtos = dbClient.ruleDao().selectByUuids(dbSession, ruleUuids);
+
+ for (RuleDto ruleDto : ruleDtos) {
+ ruleKeys.add(ruleDto.getRuleKey());
+ }
+ }
+ return ruleKeys;
+ }
+
@NotNull
private RuleChange toRuleChange(RuleDto ruleDto, List<ActiveRuleParamDto> activeRuleParamDtos) {
RuleChange ruleChange = new RuleChange();
@@ -133,7 +158,6 @@ public class QualityProfileChangeEventServiceImpl implements QualityProfileChang
}
Set<RuleChange> activatedRules = new HashSet<>();
- Set<RuleChange> deactivatedRules = new HashSet<>();
for (ActiveRuleChange arc : activeRuleChanges) {
ActiveRuleDto activeRule = arc.getActiveRule();
@@ -156,24 +180,27 @@ public class QualityProfileChangeEventServiceImpl implements QualityProfileChang
}
ruleChange.setParams(paramChanges.toArray(new ParamChange[0]));
- switch (arc.getType()) {
- case ACTIVATED:
- case UPDATED:
- activatedRules.add(ruleChange);
- break;
- case DEACTIVATED:
- deactivatedRules.add(ruleChange);
- break;
+ if (ACTIVATED.equals(arc.getType()) || UPDATED.equals(arc.getType())) {
+ activatedRules.add(ruleChange);
}
}
+ Set<String> deactivatedRules = activeRuleChanges.stream()
+ .filter(r -> DEACTIVATED.equals(r.getType()))
+ .map(ActiveRuleChange::getActiveRule)
+ .filter(not(Objects::isNull))
+ .map(ActiveRuleDto::getRuleKey)
+ .map(RuleKey::rule)
+ .collect(Collectors.toSet());
+
Set<String> projectKeys = getProjectKeys(profiles);
if (activatedRules.isEmpty() && deactivatedRules.isEmpty()) {
return;
}
- RuleSetChangedEvent event = new RuleSetChangedEvent(projectKeys.toArray(new String[0]), activatedRules.toArray(new RuleChange[0]), deactivatedRules.toArray(new RuleChange[0]));
+ RuleSetChangedEvent event = new RuleSetChangedEvent(projectKeys.toArray(new String[0]), activatedRules.toArray(new RuleChange[0]), deactivatedRules.toArray(new String[0]),
+ language);
eventsDistributor.pushEvent(event);
}
diff --git a/server/sonar-webserver-pushapi/src/main/java/org/sonar/server/pushapi/sonarlint/SonarLintClientsRegistry.java b/server/sonar-webserver-pushapi/src/main/java/org/sonar/server/pushapi/sonarlint/SonarLintClientsRegistry.java
index fa712ace19c..88d87433773 100644
--- a/server/sonar-webserver-pushapi/src/main/java/org/sonar/server/pushapi/sonarlint/SonarLintClientsRegistry.java
+++ b/server/sonar-webserver-pushapi/src/main/java/org/sonar/server/pushapi/sonarlint/SonarLintClientsRegistry.java
@@ -109,7 +109,7 @@ public class SonarLintClientsRegistry implements RuleActivationListener {
try {
sonarLintClientPermissionsValidator.validateUserCanReceivePushEventForProjects(c.getUserUuid(), projectKeysInterestingForClient);
RuleSetChangedEvent personalizedEvent = new RuleSetChangedEvent(projectKeysInterestingForClient.toArray(String[]::new), event.getActivatedRules(),
- event.getDeactivatedRules());
+ event.getDeactivatedRules(), event.getLanguage());
String message = getMessage(personalizedEvent);
c.writeAndFlush(message);
} catch (ForbiddenException forbiddenException) {
@@ -137,8 +137,8 @@ public class SonarLintClientsRegistry implements RuleActivationListener {
data.put("activatedRules", activatedRulesJson);
JSONArray deactivatedRulesJson = new JSONArray();
- for (RuleChange rule : ruleSetChangedEvent.getDeactivatedRules()) {
- deactivatedRulesJson.put(toJson(rule));
+ for (String ruleKey : ruleSetChangedEvent.getDeactivatedRules()) {
+ deactivatedRulesJson.put(ruleKey);
}
data.put("deactivatedRules", deactivatedRulesJson);
diff --git a/server/sonar-webserver-pushapi/src/test/java/org/sonar/server/pushapi/sonarlint/SonarLintClientsRegistryTest.java b/server/sonar-webserver-pushapi/src/test/java/org/sonar/server/pushapi/sonarlint/SonarLintClientsRegistryTest.java
index d82e71a2fcb..f423dd7096b 100644
--- a/server/sonar-webserver-pushapi/src/test/java/org/sonar/server/pushapi/sonarlint/SonarLintClientsRegistryTest.java
+++ b/server/sonar-webserver-pushapi/src/test/java/org/sonar/server/pushapi/sonarlint/SonarLintClientsRegistryTest.java
@@ -104,8 +104,8 @@ public class SonarLintClientsRegistryTest {
RuleChange javaRule = createRuleChange();
RuleChange[] activatedRules = {javaRule};
- RuleChange[] deactivatedRules = {javaRule};
- RuleSetChangedEvent ruleSetChangedEvent = new RuleSetChangedEvent(exampleKeys.toArray(String[]::new), activatedRules, deactivatedRules);
+ String[] deactivatedRules = {"rule-key"};
+ RuleSetChangedEvent ruleSetChangedEvent = new RuleSetChangedEvent(exampleKeys.toArray(String[]::new), activatedRules, deactivatedRules, "java");
underTest.listen(ruleSetChangedEvent);
ArgumentCaptor<byte[]> captor = ArgumentCaptor.forClass(byte[].class);
@@ -125,11 +125,9 @@ public class SonarLintClientsRegistryTest {
underTest.registerClient(sonarLintClient);
- RuleChange javaRuleChange = createRuleChange();
-
RuleChange[] activatedRules = {};
- RuleChange[] deactivatedRules = {javaRuleChange};
- RuleSetChangedEvent ruleSetChangedEvent = new RuleSetChangedEvent(exampleKeys.toArray(String[]::new), activatedRules, deactivatedRules);
+ String[] deactivatedRules = {"rule-key"};
+ RuleSetChangedEvent ruleSetChangedEvent = new RuleSetChangedEvent(exampleKeys.toArray(String[]::new), activatedRules, deactivatedRules, "java");
underTest.listen(ruleSetChangedEvent);
verifyNoInteractions(outputStream);
@@ -145,11 +143,9 @@ public class SonarLintClientsRegistryTest {
underTest.registerClient(sonarLintClient);
- RuleChange javaRuleChange = createRuleChange();
-
RuleChange[] activatedRules = {};
- RuleChange[] deactivatedRules = {javaRuleChange};
- RuleSetChangedEvent ruleSetChangedEvent = new RuleSetChangedEvent(eventProjectKeys.toArray(String[]::new), activatedRules, deactivatedRules);
+ String[] deactivatedRules = {"rule-key"};
+ RuleSetChangedEvent ruleSetChangedEvent = new RuleSetChangedEvent(eventProjectKeys.toArray(String[]::new), activatedRules, deactivatedRules, "java");
underTest.listen(ruleSetChangedEvent);
ArgumentCaptor<Set<String>> argument = ArgumentCaptor.forClass(Set.class);
@@ -159,10 +155,9 @@ public class SonarLintClientsRegistryTest {
@Test
public void listen_givenUserNotPermittedToReceiveEvent_closeConnection() {
- RuleChange javaRuleChange = createRuleChange();
RuleChange[] activatedRules = {};
- RuleChange[] deactivatedRules = {javaRuleChange};
- RuleSetChangedEvent ruleSetChangedEvent = new RuleSetChangedEvent(exampleKeys.toArray(String[]::new), activatedRules, deactivatedRules);
+ String[] deactivatedRules = {"rule-key"};
+ RuleSetChangedEvent ruleSetChangedEvent = new RuleSetChangedEvent(exampleKeys.toArray(String[]::new), activatedRules, deactivatedRules, "java");
SonarLintClient sonarLintClient = createSampleSLClient();
underTest.registerClient(sonarLintClient);
@@ -175,10 +170,9 @@ public class SonarLintClientsRegistryTest {
@Test
public void listen_givenUnregisteredClient_closeConnection() throws IOException {
- RuleChange javaRuleChange = createRuleChange();
RuleChange[] activatedRules = {};
- RuleChange[] deactivatedRules = {javaRuleChange};
- RuleSetChangedEvent ruleSetChangedEvent = new RuleSetChangedEvent(exampleKeys.toArray(String[]::new), activatedRules, deactivatedRules);
+ String[] deactivatedRules = {"rule-key"};
+ RuleSetChangedEvent ruleSetChangedEvent = new RuleSetChangedEvent(exampleKeys.toArray(String[]::new), activatedRules, deactivatedRules, "java");
SonarLintClient sonarLintClient = createSampleSLClient();
underTest.registerClient(sonarLintClient);
diff --git a/server/sonar-webserver-pushapi/src/test/java/org/sonar/server/qualityprofile/builtin/QualityProfileChangeEventServiceImplTest.java b/server/sonar-webserver-pushapi/src/test/java/org/sonar/server/qualityprofile/builtin/QualityProfileChangeEventServiceImplTest.java
index b72c6961979..79900642530 100644
--- a/server/sonar-webserver-pushapi/src/test/java/org/sonar/server/qualityprofile/builtin/QualityProfileChangeEventServiceImplTest.java
+++ b/server/sonar-webserver-pushapi/src/test/java/org/sonar/server/qualityprofile/builtin/QualityProfileChangeEventServiceImplTest.java
@@ -115,6 +115,7 @@ public class QualityProfileChangeEventServiceImplTest {
public void publishRuleActivationToSonarLintClients() {
ProjectDto projectDao = new ProjectDto();
QProfileDto activatedQualityProfile = QualityProfileTesting.newQualityProfileDto();
+ activatedQualityProfile.setLanguage("xoo");
db.qualityProfiles().insert(activatedQualityProfile);
RuleDefinitionDto rule1 = db.rules().insert(r -> r.setLanguage("xoo"));
RuleParamDto rule1Param = db.rules().insertRuleParam(rule1);
@@ -159,15 +160,7 @@ public class QualityProfileChangeEventServiceImplTest {
// deactivated rule
assertThat(ruleSetChangedEvent.getDeactivatedRules())
- .extracting(RuleChange::getKey, RuleChange::getLanguage,
- RuleChange::getSeverity, RuleChange::getTemplateKey)
- .containsExactly(tuple(rule2.getRuleKey(), "xoo", rule2.getSeverityString(), null));
-
- assertThat(ruleSetChangedEvent.getDeactivatedRules()[0].getParams()).hasSize(1);
- ParamChange actualParamChangeDeactivated = ruleSetChangedEvent.getDeactivatedRules()[0].getParams()[0];
- assertThat(actualParamChangeDeactivated)
- .extracting(ParamChange::getKey, ParamChange::getValue)
- .containsExactly(activeRuleParam2.getKey(), activeRuleParam2.getValue());
+ .containsExactly(rule2.getRuleKey());
}
}
diff --git a/server/sonar-webserver-pushapi/src/test/resources/org/sonar/server/pushapi/sonarlint/rule-change-event-data.json b/server/sonar-webserver-pushapi/src/test/resources/org/sonar/server/pushapi/sonarlint/rule-change-event-data.json
index b70bd0dd2ab..9f157f28479 100644
--- a/server/sonar-webserver-pushapi/src/test/resources/org/sonar/server/pushapi/sonarlint/rule-change-event-data.json
+++ b/server/sonar-webserver-pushapi/src/test/resources/org/sonar/server/pushapi/sonarlint/rule-change-event-data.json
@@ -19,17 +19,6 @@
}
],
"deactivatedRules": [
- {
- "key": "rule-key",
- "templateKey": "template-key",
- "severity": "CRITICAL",
- "language": "java",
- "params": [
- {
- "value": "param-value",
- "key": "param-key"
- }
- ]
- }
+ "rule-key"
]
}
diff --git a/sonar-core/src/main/java/org/sonar/core/util/RuleSetChangedEvent.java b/sonar-core/src/main/java/org/sonar/core/util/RuleSetChangedEvent.java
index 5f3c3f95982..a37b7633233 100644
--- a/sonar-core/src/main/java/org/sonar/core/util/RuleSetChangedEvent.java
+++ b/sonar-core/src/main/java/org/sonar/core/util/RuleSetChangedEvent.java
@@ -28,16 +28,16 @@ public class RuleSetChangedEvent implements Serializable {
private final String[] projects;
private final String language;
private final RuleChange[] activatedRules;
- private final RuleChange[] deactivatedRules;
+ private final String[] deactivatedRules;
- public RuleSetChangedEvent(String[] projects, RuleChange[] activatedRules, RuleChange[] deactivatedRules) {
+ public RuleSetChangedEvent(String[] projects, RuleChange[] activatedRules, String[] deactivatedRules, String language) {
this.projects = projects;
this.activatedRules = activatedRules;
this.deactivatedRules = deactivatedRules;
if (activatedRules.length == 0 && deactivatedRules.length == 0) {
throw new IllegalArgumentException("Can't create RuleSetChangedEvent without any rules that have changed");
}
- this.language = activatedRules.length > 0 ? activatedRules[0].getLanguage() : deactivatedRules[0].getLanguage();
+ this.language = language;
}
public String getEvent() {
@@ -56,7 +56,7 @@ public class RuleSetChangedEvent implements Serializable {
return activatedRules;
}
- public RuleChange[] getDeactivatedRules() {
+ public String[] getDeactivatedRules() {
return deactivatedRules;
}
}
diff --git a/sonar-core/src/test/java/org/sonar/core/util/RuleSetChangedEventTest.java b/sonar-core/src/test/java/org/sonar/core/util/RuleSetChangedEventTest.java
index 637d324ef5b..174788d8c4f 100644
--- a/sonar-core/src/test/java/org/sonar/core/util/RuleSetChangedEventTest.java
+++ b/sonar-core/src/test/java/org/sonar/core/util/RuleSetChangedEventTest.java
@@ -30,8 +30,8 @@ public class RuleSetChangedEventTest {
public void getLanguage_givenNoDeactivatedRules_languageIsCorrectlyIdentified() {
String[] projects = {"sonarqube"};
RuleChange[] activatedRules = {createRuleChange("java")};
- RuleChange[] deactivatedRules = {};
- RuleSetChangedEvent event = new RuleSetChangedEvent(projects, activatedRules, deactivatedRules);
+ String[] deactivatedRules = {};
+ RuleSetChangedEvent event = new RuleSetChangedEvent(projects, activatedRules, deactivatedRules, "java");
String language = event.getLanguage();
@@ -42,8 +42,8 @@ public class RuleSetChangedEventTest {
public void getLanguage_givenNoActivatedRules_languageIsCorrectlyIdentified() {
String[] projects = {"sonarqube"};
RuleChange[] activatedRules = {};
- RuleChange[] deactivatedRules = {createRuleChange("java")};
- RuleSetChangedEvent event = new RuleSetChangedEvent(projects, activatedRules, deactivatedRules);
+ String[] deactivatedRules = {"ruleKey"};
+ RuleSetChangedEvent event = new RuleSetChangedEvent(projects, activatedRules, deactivatedRules, "java");
String language = event.getLanguage();
@@ -54,9 +54,9 @@ public class RuleSetChangedEventTest {
public void getLanguage_givenBothArraysEmpty_throwException() {
String[] projects = {"sonarqube"};
RuleChange[] activatedRules = {};
- RuleChange[] deactivatedRules = {};
+ String[] deactivatedRules = {};
- assertThatThrownBy(() -> new RuleSetChangedEvent(projects, activatedRules, deactivatedRules))
+ assertThatThrownBy(() -> new RuleSetChangedEvent(projects, activatedRules, deactivatedRules, "java"))
.isInstanceOf(IllegalArgumentException.class);
}