From 7891bd3a71b0aec2d87a413f61e3c9859925717e Mon Sep 17 00:00:00 2001 From: Daniel Schwarz Date: Tue, 18 Apr 2017 16:06:52 +0200 Subject: [PATCH] SONAR-9132 disable template rules and custom rules, when enabling orgs --- .../organization/ws/EnableSupportAction.java | 25 ++++++++++- .../ws/EnableSupportActionTest.java | 45 ++++++++++++++++++- 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/organization/ws/EnableSupportAction.java b/server/sonar-server/src/main/java/org/sonar/server/organization/ws/EnableSupportAction.java index 5d14c944ba7..4d36a672126 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/organization/ws/EnableSupportAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/organization/ws/EnableSupportAction.java @@ -20,6 +20,8 @@ package org.sonar.server.organization.ws; import java.util.List; +import org.sonar.api.rule.RuleKey; +import org.sonar.api.rule.RuleStatus; import org.sonar.api.server.ws.Change; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; @@ -29,15 +31,18 @@ import org.sonar.db.DbSession; import org.sonar.db.permission.GroupPermissionDto; import org.sonar.db.permission.OrganizationPermission; import org.sonar.db.permission.template.PermissionTemplateGroupDto; +import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.user.GroupDto; import org.sonar.db.user.UserGroupDto; import org.sonar.server.organization.DefaultOrganizationProvider; import org.sonar.server.organization.OrganizationFlags; +import org.sonar.server.rule.index.RuleIndexer; import org.sonar.server.user.UserSession; import org.sonar.server.usergroups.DefaultGroupCreator; import org.sonar.server.usergroups.DefaultGroupFinder; import static java.util.Objects.requireNonNull; +import static org.sonar.core.util.stream.MoreCollectors.toList; public class EnableSupportAction implements OrganizationsWsAction { private static final String ACTION = "enable_support"; @@ -48,15 +53,17 @@ public class EnableSupportAction implements OrganizationsWsAction { private final OrganizationFlags organizationFlags; private final DefaultGroupCreator defaultGroupCreator; private final DefaultGroupFinder defaultGroupFinder; + private final RuleIndexer ruleIndexer; public EnableSupportAction(UserSession userSession, DbClient dbClient, DefaultOrganizationProvider defaultOrganizationProvider, - OrganizationFlags organizationFlags, DefaultGroupCreator defaultGroupCreator, DefaultGroupFinder defaultGroupFinder) { + OrganizationFlags organizationFlags, DefaultGroupCreator defaultGroupCreator, DefaultGroupFinder defaultGroupFinder, RuleIndexer ruleIndexer) { this.userSession = userSession; this.dbClient = dbClient; this.defaultOrganizationProvider = defaultOrganizationProvider; this.organizationFlags = organizationFlags; this.defaultGroupCreator = defaultGroupCreator; this.defaultGroupFinder = defaultGroupFinder; + this.ruleIndexer = ruleIndexer; } @Override @@ -74,13 +81,16 @@ public class EnableSupportAction implements OrganizationsWsAction { @Override public void handle(Request request, Response response) throws Exception { + verifySystemAdministrator(); + try (DbSession dbSession = dbClient.openSession(false)) { - verifySystemAdministrator(); if (isSupportDisabled(dbSession)) { flagCurrentUserAsRoot(dbSession); createDefaultMembersGroup(dbSession); + List disabledTemplateAndCustomRuleKeys = disableTemplateRulesAndCustomRules(dbSession); enableFeature(dbSession); dbSession.commit(); + ruleIndexer.indexRuleDefinitions(disabledTemplateAndCustomRuleKeys); } } response.noContent(); @@ -131,6 +141,17 @@ public class EnableSupportAction implements OrganizationsWsAction { permissionTemplateGroup.getTemplateId(), membersGroup.getId(), permissionTemplateGroup.getPermission())); } + public List disableTemplateRulesAndCustomRules(DbSession dbSession) { + List rules = dbClient.ruleDao().selectAllDefinitions(dbSession).stream() + .filter(r -> r.isTemplate() || r.isCustomRule()) + .collect(toList()); + rules.forEach(r -> { + r.setStatus(RuleStatus.REMOVED); + dbClient.ruleDao().update(dbSession, r); + }); + return rules.stream().map(RuleDefinitionDto::getKey).collect(toList()); + } + private void enableFeature(DbSession dbSession) { organizationFlags.enable(dbSession); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/EnableSupportActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/organization/ws/EnableSupportActionTest.java index 12df1741e2d..ad1f8e94a40 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/EnableSupportActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/organization/ws/EnableSupportActionTest.java @@ -26,6 +26,9 @@ import java.util.Optional; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.mockito.ArgumentCaptor; +import org.sonar.api.rule.RuleKey; +import org.sonar.api.rule.RuleStatus; import org.sonar.api.server.ws.WebService; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; @@ -33,6 +36,7 @@ import org.sonar.db.organization.OrganizationDto; import org.sonar.db.permission.GroupPermissionDto; import org.sonar.db.permission.template.PermissionTemplateDto; import org.sonar.db.permission.template.PermissionTemplateGroupDto; +import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.user.GroupDto; import org.sonar.db.user.UserDto; import org.sonar.server.exceptions.ForbiddenException; @@ -41,6 +45,7 @@ import org.sonar.server.organization.DefaultOrganizationProvider; import org.sonar.server.organization.OrganizationFlags; import org.sonar.server.organization.OrganizationFlagsImpl; import org.sonar.server.organization.TestDefaultOrganizationProvider; +import org.sonar.server.rule.index.RuleIndexer; import org.sonar.server.tester.UserSessionRule; import org.sonar.server.usergroups.DefaultGroupCreatorImpl; import org.sonar.server.usergroups.DefaultGroupFinder; @@ -49,6 +54,8 @@ import org.sonar.server.ws.WsActionTester; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.sonar.db.permission.OrganizationPermission.ADMINISTER; public class EnableSupportActionTest { @@ -62,8 +69,9 @@ public class EnableSupportActionTest { private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db); private OrganizationFlags organizationFlags = new OrganizationFlagsImpl(db.getDbClient()); + private RuleIndexer ruleIndexer = mock(RuleIndexer.class); private EnableSupportAction underTest = new EnableSupportAction(userSession, db.getDbClient(), defaultOrganizationProvider, organizationFlags, - new DefaultGroupCreatorImpl(db.getDbClient()), new DefaultGroupFinder(db.getDbClient())); + new DefaultGroupCreatorImpl(db.getDbClient()), new DefaultGroupFinder(db.getDbClient()), ruleIndexer); private WsActionTester tester = new WsActionTester(underTest); @Test @@ -153,6 +161,41 @@ public class EnableSupportActionTest { .containsOnly(tuple(defaultGroupId, "user"), tuple(defaultGroupId, "admin")); } + @Test + public void enabling_organizations_should_remove_template_rule_and_custom_rule() { + RuleDefinitionDto normal = db.rules().insert(); + RuleDefinitionDto template = db.rules().insert(r -> r.setIsTemplate(true)); + RuleDefinitionDto custom = db.rules().insert(r -> r.setTemplateId(template.getId())); + + UserDto user = db.users().insertUser(); + db.users().insertDefaultGroup(db.getDefaultOrganization(), "sonar-users"); + logInAsSystemAdministrator(user.getLogin()); + + assertThat(db.getDbClient().ruleDao().selectAllDefinitions(db.getSession())) + .extracting(RuleDefinitionDto::getKey, RuleDefinitionDto::getStatus) + .containsExactlyInAnyOrder( + tuple(normal.getKey(), RuleStatus.READY), + tuple(template.getKey(), RuleStatus.READY), + tuple(custom.getKey(), RuleStatus.READY) + ); + + call(); + + assertThat(db.getDbClient().ruleDao().selectAllDefinitions(db.getSession())) + .extracting(RuleDefinitionDto::getKey, RuleDefinitionDto::getStatus) + .containsExactlyInAnyOrder( + tuple(normal.getKey(), RuleStatus.READY), + tuple(template.getKey(), RuleStatus.REMOVED), + tuple(custom.getKey(), RuleStatus.REMOVED) + ); + + @SuppressWarnings("unchecked") + Class> listClass = (Class>)(Class)ArrayList.class; + ArgumentCaptor> indexedRuleKeys = ArgumentCaptor.forClass(listClass); + verify(ruleIndexer).indexRuleDefinitions(indexedRuleKeys.capture()); + assertThat(indexedRuleKeys.getValue()).containsExactlyInAnyOrder(template.getKey(), custom.getKey()); + } + @Test public void throw_IAE_when_members_group_already_exists() throws Exception { UserDto user = db.users().insertUser(); -- 2.39.5