From 46b79bfce4eb035c48ee3bf9ba699c396e9329fd Mon Sep 17 00:00:00 2001 From: Stephane Gamard Date: Tue, 3 Jun 2014 16:28:18 +0200 Subject: [PATCH] SONAR-5245 - Added severity param for bulk activation --- .../server/qualityprofile/RuleActivator.java | 17 ++++++++-- .../ws/BulkRuleActivationActions.java | 21 +++++++----- .../ws/QProfileRecreateBuiltInActionTest.java | 7 ++-- .../ws/QProfilesWsMediumTest.java | 33 +++++++++++++++++++ .../qualityprofile/ws/QProfilesWsTest.java | 4 ++- 5 files changed, 66 insertions(+), 16 deletions(-) diff --git a/sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivator.java b/sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivator.java index e8abe2e0f81..19701f3d022 100644 --- a/sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivator.java +++ b/sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivator.java @@ -30,7 +30,11 @@ import org.sonar.api.server.rule.RuleParamType; import org.sonar.core.permission.GlobalPermissions; import org.sonar.core.persistence.DbSession; import org.sonar.core.preview.PreviewCache; -import org.sonar.core.qualityprofile.db.*; +import org.sonar.core.qualityprofile.db.ActiveRuleDto; +import org.sonar.core.qualityprofile.db.ActiveRuleKey; +import org.sonar.core.qualityprofile.db.ActiveRuleParamDto; +import org.sonar.core.qualityprofile.db.QualityProfileDto; +import org.sonar.core.qualityprofile.db.QualityProfileKey; import org.sonar.core.rule.RuleParamDto; import org.sonar.server.db.DbClient; import org.sonar.server.qualityprofile.db.ActiveRuleDao; @@ -45,7 +49,6 @@ import org.sonar.server.user.UserSession; import org.sonar.server.util.TypeValidations; import javax.annotation.Nullable; - import java.util.List; import java.util.Map; @@ -283,6 +286,10 @@ public class RuleActivator implements ServerComponent { } public Multimap bulkActivate(RuleQuery ruleQuery, QualityProfileKey profile) { + return bulkActivate(ruleQuery, profile, null); + } + + public Multimap bulkActivate(RuleQuery ruleQuery, QualityProfileKey profile, @Nullable String severity) { verifyPermission(UserSession.get()); RuleIndex ruleIndex = index.get(RuleIndex.class); Multimap results = ArrayListMultimap.create(); @@ -300,7 +307,11 @@ public class RuleActivator implements ServerComponent { if (!rule.isTemplate()) { ActiveRuleKey key = ActiveRuleKey.of(profile, rule.key()); RuleActivation activation = new RuleActivation(key); - activation.setSeverity(rule.severity()); + if(severity != null && !severity.isEmpty()){ + activation.setSeverity(severity); + } else { + activation.setSeverity(rule.severity()); + } for (ActiveRuleChange active : this.activate(dbSession, activation)) { results.put("activated", active.getKey().ruleKey().toString()); } diff --git a/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/BulkRuleActivationActions.java b/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/BulkRuleActivationActions.java index 954ff4ef965..101f39eb842 100644 --- a/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/BulkRuleActivationActions.java +++ b/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/BulkRuleActivationActions.java @@ -41,11 +41,11 @@ public class BulkRuleActivationActions implements ServerComponent { public static final String BULK_ACTIVATE_ACTION = "activate_rules"; public static final String BULK_DEACTIVATE_ACTION = "deactivate_rules"; - private final QProfileService service; + private final RuleActivator activation; private final RuleService ruleService; - public BulkRuleActivationActions(QProfileService service, RuleService ruleService) { - this.service = service; + public BulkRuleActivationActions(QProfileService service, RuleActivator activation, RuleService ruleService) { + this.activation = activation; this.ruleService = ruleService; } @@ -70,8 +70,8 @@ public class BulkRuleActivationActions implements ServerComponent { SearchAction.defineRuleSearchParameters(activate); defineProfileKeyParameters(activate); - activate.createParam("activation_severity") - .setDescription(SEVERITY) + activate.createParam(SEVERITY) + .setDescription("Set severity of rules activated in bulk") .setPossibleValues(Severity.ALL); } @@ -100,14 +100,17 @@ public class BulkRuleActivationActions implements ServerComponent { } private void bulkActivate(Request request, Response response) throws Exception { - Multimap results = service.bulkActivate( - SearchAction.createRuleQuery(ruleService.newRuleQuery(), request), readKey(request)); + Multimap results = activation.bulkActivate( + SearchAction.createRuleQuery(ruleService.newRuleQuery(), request), + readKey(request), + request.param(SEVERITY)); writeResponse(results, response); } private void bulkDeactivate(Request request, Response response) throws Exception { - Multimap results = service.bulkDeactivate( - SearchAction.createRuleQuery(ruleService.newRuleQuery(), request), readKey(request)); + Multimap results = activation.bulkDeactivate( + SearchAction.createRuleQuery(ruleService.newRuleQuery(), request), + readKey(request)); writeResponse(results, response); } diff --git a/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileRecreateBuiltInActionTest.java b/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileRecreateBuiltInActionTest.java index 95908d26fbb..6bcf40c9605 100644 --- a/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileRecreateBuiltInActionTest.java +++ b/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileRecreateBuiltInActionTest.java @@ -25,10 +25,10 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import org.sonar.server.qualityprofile.QProfileService; -import org.sonar.server.qualityprofile.RuleActivator; import org.sonar.server.qualityprofile.QProfileBackup; import org.sonar.server.qualityprofile.QProfileResult; +import org.sonar.server.qualityprofile.QProfileService; +import org.sonar.server.qualityprofile.RuleActivator; import org.sonar.server.rule.RuleService; import org.sonar.server.ws.WsTester; @@ -48,10 +48,11 @@ public class QProfileRecreateBuiltInActionTest { public void setUp() throws Exception { QProfileService profileService = mock(QProfileService.class); RuleService ruleService = mock(RuleService.class); + RuleActivator activation = mock(RuleActivator.class); tester = new WsTester(new QProfilesWs( new QProfileRecreateBuiltInAction(qProfileBackup), new RuleActivationActions(profileService), - new BulkRuleActivationActions(profileService, ruleService))); + new BulkRuleActivationActions(profileService, activation, ruleService))); } @Test diff --git a/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsMediumTest.java b/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsMediumTest.java index c7902d68be9..b195aef8a80 100644 --- a/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsMediumTest.java +++ b/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsMediumTest.java @@ -19,6 +19,7 @@ */ package org.sonar.server.qualityprofile.ws; +import com.google.common.collect.ImmutableSet; import org.junit.After; import org.junit.Before; import org.junit.ClassRule; @@ -35,7 +36,11 @@ import org.sonar.core.qualityprofile.db.ActiveRuleKey; import org.sonar.core.qualityprofile.db.QualityProfileDto; import org.sonar.core.rule.RuleDto; import org.sonar.server.db.DbClient; +import org.sonar.server.qualityprofile.index.ActiveRuleIndex; +import org.sonar.server.rule.index.RuleIndex; +import org.sonar.server.rule.index.RuleQuery; import org.sonar.server.rule.ws.SearchAction; +import org.sonar.server.search.QueryOptions; import org.sonar.server.search.ws.SearchOptions; import org.sonar.server.tester.ServerTester; import org.sonar.server.user.MockUserSession; @@ -359,6 +364,34 @@ public class QProfilesWsMediumTest { assertThat(db.activeRuleDao().findByProfileKey(session, profile.getKey())).hasSize(1); } + @Test + public void bulk_activate_rule_by_query_with_severity() throws Exception { + QualityProfileDto profile = getProfile("java"); + RuleDto rule0 = getRule(profile.getLanguage(), "toto"); + RuleDto rule1 = getRule(profile.getLanguage(), "tata"); + session.commit(); + + // 0. Assert No Active Rule for profile + assertThat(db.activeRuleDao().findByProfileKey(session, profile.getKey())).isEmpty(); + assertThat(db.activeRuleDao().findByProfileKey(session, profile.getKey())).hasSize(0); + + // 2. Assert ActiveRule with BLOCKER severity + assertThat(tester.get(RuleIndex.class).search( + new RuleQuery().setSeverities(ImmutableSet.of("BLOCKER")), + QueryOptions.DEFAULT).getHits()).hasSize(2); + + // 1. Activate Rule with query returning 2 hits + WsTester.TestRequest request = wsTester.newGetRequest(QProfilesWs.API_ENDPOINT, BulkRuleActivationActions.BULK_ACTIVATE_ACTION); + request.setParam(RuleActivationActions.PROFILE_KEY, profile.getKey().toString()); + request.setParam(RuleActivationActions.SEVERITY, "MINOR"); + request.execute(); + session.clearCache(); + + // 2. Assert ActiveRule with MINOR severity + assertThat(tester.get(ActiveRuleIndex.class).findByRule(rule0.getKey()).get(0).severity()).isEqualTo("MINOR"); + + } + @Test public void reset() throws Exception { diff --git a/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsTest.java b/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsTest.java index 5b35c3c8896..7fc2fa6f1ef 100644 --- a/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsTest.java +++ b/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsTest.java @@ -25,6 +25,7 @@ import org.junit.Test; import org.sonar.api.server.ws.WebService; import org.sonar.server.qualityprofile.QProfileBackup; import org.sonar.server.qualityprofile.QProfileService; +import org.sonar.server.qualityprofile.RuleActivator; import org.sonar.server.rule.RuleService; import org.sonar.server.ws.WsTester; @@ -39,10 +40,11 @@ public class QProfilesWsTest { public void setUp() { QProfileService profileService = mock(QProfileService.class); RuleService ruleService = mock(RuleService.class); + RuleActivator activation = mock(RuleActivator.class); controller = new WsTester(new QProfilesWs(new QProfileRecreateBuiltInAction( mock(QProfileBackup.class)), new RuleActivationActions(profileService), - new BulkRuleActivationActions(profileService, ruleService) + new BulkRuleActivationActions(profileService, activation, ruleService) )).controller(QProfilesWs.API_ENDPOINT); } -- 2.39.5