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;
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";
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
@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();
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);
}
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;
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;
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;
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 {
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
.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();