]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-9132 disable template rules and custom rules, when enabling orgs
authorDaniel Schwarz <daniel.schwarz@sonarsource.com>
Tue, 18 Apr 2017 14:06:52 +0000 (16:06 +0200)
committerDaniel Schwarz <bartfastiel@users.noreply.github.com>
Thu, 20 Apr 2017 11:23:39 +0000 (13:23 +0200)
server/sonar-server/src/main/java/org/sonar/server/organization/ws/EnableSupportAction.java
server/sonar-server/src/test/java/org/sonar/server/organization/ws/EnableSupportActionTest.java

index 5d14c944ba7892ee6714ee893e38862afbc4a5a1..4d36a6721266c18900727d87d6ab17ec4f6b60ef 100644 (file)
@@ -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<RuleKey> 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<RuleKey> disableTemplateRulesAndCustomRules(DbSession dbSession) {
+    List<RuleDefinitionDto> 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);
   }
index 12df1741e2dfa2fedac7b4ab533d5783687c567e..ad1f8e94a40dad75d669702498b3e6b52b2a0a11 100644 (file)
@@ -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<ArrayList<RuleKey>> listClass = (Class<ArrayList<RuleKey>>)(Class)ArrayList.class;
+    ArgumentCaptor<ArrayList<RuleKey>> 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();