import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
+import java.util.stream.Collectors;
import javax.annotation.Nullable;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
.stream()
.collect(MoreCollectors.uniqueIndex(RuleDefinitionDto::getKey));
+ List<RuleDefinitionDto> externalRules = ruleDefinitionsByKey.values().stream()
+ .filter(RuleDefinitionDto::isExternal)
+ .collect(Collectors.toList());
+
+ if (!externalRules.isEmpty()) {
+ throw new IllegalArgumentException("The quality profile cannot be restored as it contains rules from external rule engines: "
+ + externalRules.stream().map(r -> r.getKey().toString()).collect(Collectors.joining(", ")));
+ }
+
return rules.stream()
.map(r -> {
RuleDefinitionDto ruleDefinition = ruleDefinitionsByKey.get(r.ruleKey);
private RuleActivation readActivation(DbSession dbSession, Request request) {
RuleKey ruleKey = RuleKey.parse(request.mandatoryParam(PARAM_RULE));
- RuleDefinitionDto ruleDefinition = dbClient.ruleDao().selectDefinitionByKey(dbSession, ruleKey)
- .orElseThrow(() -> new IllegalArgumentException(format("Rule '%s' not found", ruleKey)));
+ RuleDefinitionDto ruleDefinition = wsSupport.getRule(dbSession, ruleKey);
boolean reset = Boolean.TRUE.equals(request.paramAsBoolean(PARAM_RESET));
if (reset) {
return RuleActivation.createReset(ruleDefinition.getId());
import org.sonar.db.qualityprofile.QProfileDto;
import org.sonar.server.qualityprofile.BulkChangeResult;
import org.sonar.server.qualityprofile.QProfileRules;
+import org.sonar.server.rule.index.RuleQuery;
import org.sonar.server.rule.ws.RuleQueryFactory;
import org.sonar.server.user.UserSession;
OrganizationDto organization = wsSupport.getOrganization(dbSession, profile);
wsSupport.checkCanEdit(dbSession, organization, profile);
wsSupport.checkNotBuiltInt(profile);
- result = qProfileRules.bulkActivateAndCommit(dbSession, profile, ruleQueryFactory.createRuleQuery(dbSession, request), request.param(PARAM_TARGET_SEVERITY));
+ RuleQuery ruleQuery = ruleQueryFactory.createRuleQuery(dbSession, request);
+ ruleQuery.setIsExternal(false);
+ result = qProfileRules.bulkActivateAndCommit(dbSession, profile, ruleQuery, request.param(PARAM_TARGET_SEVERITY));
}
writeResponse(result, response);
import org.sonar.db.qualityprofile.QProfileDto;
import org.sonar.server.qualityprofile.BulkChangeResult;
import org.sonar.server.qualityprofile.QProfileRules;
+import org.sonar.server.rule.index.RuleQuery;
import org.sonar.server.rule.ws.RuleQueryFactory;
import org.sonar.server.user.UserSession;
QProfileDto profile = wsSupport.getProfile(dbSession, QProfileReference.fromKey(qualityProfileKey));
OrganizationDto organization = wsSupport.getOrganization(dbSession, profile);
wsSupport.checkCanEdit(dbSession, organization, profile);
- result = ruleActivator.bulkDeactivateAndCommit(dbSession, profile, ruleQueryFactory.createRuleQuery(dbSession, request));
+ RuleQuery ruleQuery = ruleQueryFactory.createRuleQuery(dbSession, request);
+ ruleQuery.setIsExternal(false);
+ result = ruleActivator.bulkDeactivateAndCommit(dbSession, profile, ruleQuery);
}
writeResponse(result, response);
}
public RuleDefinitionDto getRule(DbSession dbSession, RuleKey ruleKey) {
Optional<RuleDefinitionDto> ruleDefinitionDto = dbClient.ruleDao().selectDefinitionByKey(dbSession, ruleKey);
- return checkFoundWithOptional(ruleDefinitionDto, "Rule with key '%s' not found", ruleKey);
+ RuleDefinitionDto rule = checkFoundWithOptional(ruleDefinitionDto, "Rule with key '%s' not found", ruleKey);
+ checkRequest(!rule.isExternal(), "Operation forbidden for rule '%s' imported from an external rule engine.", ruleKey);
+ return rule;
}
/**
}
}
+ @Test
+ public void fail_to_restore_external_rule() throws Exception {
+ db.rules().insert(RuleKey.of("sonarjs", "s001"), r -> r.setIsExternal(true)).getId();
+ OrganizationDto organization = db.organizations().insert();
+ Reader backup = new StringReader("<?xml version='1.0' encoding='UTF-8'?>" +
+ "<profile><name>foo</name>" +
+ "<language>js</language>" +
+ "<rules>" +
+ "<rule>" +
+ "<repositoryKey>sonarjs</repositoryKey>" +
+ "<key>s001</key>" +
+ "<priority>BLOCKER</priority>" +
+ "<parameters>" +
+ "<parameter><key>bar</key><value>baz</value></parameter>" +
+ "</parameters>" +
+ "</rule>" +
+ "</rules>" +
+ "</profile>");
+
+ expectedException.expect(IllegalArgumentException.class);
+ expectedException.expectMessage("The quality profile cannot be restored as it contains rules from external rule engines: sonarjs:s001");
+ underTest.restore(db.getSession(), backup, organization, null);
+ }
+
private RuleDefinitionDto createRule() {
return db.rules().insert();
}
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.MockitoAnnotations;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.Severity;
import org.sonar.api.server.ws.WebService;
public UserSessionRule userSession = UserSessionRule.standalone();
@Rule
public ExpectedException expectedException = ExpectedException.none();
+ @Captor
+ public ArgumentCaptor<Collection<RuleActivation>> ruleActivationCaptor;
private DbClient dbClient = db.getDbClient();
private QProfileRules qProfileRules = mock(QProfileRules.class);
@Before
public void before() {
+ MockitoAnnotations.initMocks(this);
defaultOrganization = db.getDefaultOrganization();
organization = db.organizations().insert();
}
.setParam(PARAM_KEY, randomAlphanumeric(UUID_SIZE));
expectedException.expect(UnauthorizedException.class);
-
+
request.execute();
}
QProfileDto qualityProfile = db.qualityProfiles().insert(organization);
TestRequest request = ws.newRequest()
.setMethod("POST")
- .setParam(PARAM_RULE, RuleTesting.newRuleDto().getKey().toString())
+ .setParam(PARAM_RULE, RuleTesting.newRule().getKey().toString())
.setParam(PARAM_KEY, qualityProfile.getKee());
expectedException.expect(ForbiddenException.class);
QProfileDto qualityProfile = db.qualityProfiles().insert(defaultOrganization, profile -> profile.setIsBuiltIn(true).setName("Xoo profile").setLanguage("xoo"));
TestRequest request = ws.newRequest()
.setMethod("POST")
- .setParam(PARAM_RULE, RuleTesting.newRuleDto().getKey().toString())
+ .setParam(PARAM_RULE, RuleTesting.newRule().getKey().toString())
.setParam(PARAM_KEY, qualityProfile.getKee());
expectedException.expect(BadRequestException.class);
request.execute();
}
+ @Test
+ public void fail_activate_external_rule() {
+ userSession.logIn(db.users().insertUser()).addPermission(OrganizationPermission.ADMINISTER_QUALITY_PROFILES, defaultOrganization);
+ QProfileDto qualityProfile = db.qualityProfiles().insert(defaultOrganization);
+ RuleDefinitionDto rule = db.rules().insert(r -> r.setIsExternal(true));
+
+ TestRequest request = ws.newRequest()
+ .setMethod("POST")
+ .setParam(PARAM_RULE, rule.getKey().toString())
+ .setParam(PARAM_KEY, qualityProfile.getKee());
+
+ expectedException.expect(BadRequestException.class);
+ expectedException.expectMessage(String.format("Operation forbidden for rule '%s' imported from an external rule engine.", rule.getKey()));
+
+ request.execute();
+ }
+
@Test
public void activate_rule_in_default_organization() {
userSession.logIn().addPermission(OrganizationPermission.ADMINISTER_QUALITY_PROFILES, defaultOrganization);
TestResponse response = request.execute();
assertThat(response.getStatus()).isEqualTo(HttpURLConnection.HTTP_NO_CONTENT);
- Class<Collection<RuleActivation>> collectionClass = (Class<Collection<RuleActivation>>) (Class) Collection.class;
- ArgumentCaptor<Collection<RuleActivation>> ruleActivationCaptor = ArgumentCaptor.forClass(collectionClass);
verify(qProfileRules).activateAndCommit(any(DbSession.class), any(QProfileDto.class), ruleActivationCaptor.capture());
Collection<RuleActivation> activations = ruleActivationCaptor.getValue();
TestResponse response = request.execute();
assertThat(response.getStatus()).isEqualTo(HttpURLConnection.HTTP_NO_CONTENT);
- Class<Collection<RuleActivation>> collectionClass = (Class<Collection<RuleActivation>>) (Class) Collection.class;
- ArgumentCaptor<Collection<RuleActivation>> ruleActivationCaptor = ArgumentCaptor.forClass(collectionClass);
verify(qProfileRules).activateAndCommit(any(DbSession.class), any(QProfileDto.class), ruleActivationCaptor.capture());
Collection<RuleActivation> activations = ruleActivationCaptor.getValue();
private DbClient dbClient = db.getDbClient();
private QProfileWsSupport wsSupport = new QProfileWsSupport(dbClient, userSession, TestDefaultOrganizationProvider.from(db));
- private RuleQueryFactory ruleQueryFactory = mock(RuleQueryFactory.class);
+ private RuleQueryFactory ruleQueryFactory = mock(RuleQueryFactory.class, Mockito.RETURNS_MOCKS);
private QProfileRules qProfileRules = mock(QProfileRules.class, Mockito.RETURNS_DEEP_STUBS);
private WsActionTester ws = new WsActionTester(new ActivateRulesAction(ruleQueryFactory, userSession, qProfileRules, wsSupport, dbClient));
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.MockitoAnnotations;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.server.ws.WebService;
import org.sonar.db.DbClient;
public UserSessionRule userSession = UserSessionRule.standalone();
@Rule
public ExpectedException expectedException = ExpectedException.none();
+ @Captor
+ public ArgumentCaptor<Collection<Integer>> ruleIdsCaptor;
private DbClient dbClient = db.getDbClient();
private QProfileRules qProfileRules = mock(QProfileRules.class);
@Before
public void before() {
+ MockitoAnnotations.initMocks(this);
defaultOrganization = db.getDefaultOrganization();
organization = db.organizations().insert();
}
TestResponse response = request.execute();
assertThat(response.getStatus()).isEqualTo(HttpURLConnection.HTTP_NO_CONTENT);
- ArgumentCaptor<Collection<Integer>> ruleIdCaptor = ruleIdCollectionCaptor();
ArgumentCaptor<QProfileDto> qProfileDtoCaptor = ArgumentCaptor.forClass(QProfileDto.class);
- verify(qProfileRules).deactivateAndCommit(any(DbSession.class), qProfileDtoCaptor.capture(), ruleIdCaptor.capture());
- assertThat(ruleIdCaptor.getValue()).containsExactly(rule.getId());
+ verify(qProfileRules).deactivateAndCommit(any(DbSession.class), qProfileDtoCaptor.capture(), ruleIdsCaptor.capture());
+ assertThat(ruleIdsCaptor.getValue()).containsExactly(rule.getId());
assertThat(qProfileDtoCaptor.getValue().getKee()).isEqualTo(qualityProfile.getKee());
}
TestResponse response = request.execute();
assertThat(response.getStatus()).isEqualTo(HttpURLConnection.HTTP_NO_CONTENT);
- ArgumentCaptor<Collection<Integer>> ruleIdCaptor = ruleIdCollectionCaptor();
ArgumentCaptor<QProfileDto> qProfileDtoCaptor = ArgumentCaptor.forClass(QProfileDto.class);
- verify(qProfileRules).deactivateAndCommit(any(DbSession.class), qProfileDtoCaptor.capture(), ruleIdCaptor.capture());
- assertThat(ruleIdCaptor.getValue()).containsExactly(rule.getId());
+ verify(qProfileRules).deactivateAndCommit(any(DbSession.class), qProfileDtoCaptor.capture(), ruleIdsCaptor.capture());
+ assertThat(ruleIdsCaptor.getValue()).containsExactly(rule.getId());
assertThat(qProfileDtoCaptor.getValue().getKee()).isEqualTo(qualityProfile.getKee());
}
public void fail_if_not_logged_in() {
TestRequest request = ws.newRequest()
.setMethod("POST")
- .setParam(PARAM_RULE, RuleTesting.newRuleDto().getKey().toString())
+ .setParam(PARAM_RULE, RuleTesting.newRule().getKey().toString())
.setParam(PARAM_KEY, randomAlphanumeric(UUID_SIZE));
expectedException.expect(UnauthorizedException.class);
request.execute();
}
+ @Test
+ public void fail_activate_external_rule() {
+ userSession.logIn(db.users().insertUser()).addPermission(OrganizationPermission.ADMINISTER_QUALITY_PROFILES, defaultOrganization);
+ QProfileDto qualityProfile = db.qualityProfiles().insert(defaultOrganization);
+ RuleDefinitionDto rule = db.rules().insert(r -> r.setIsExternal(true));
+
+ TestRequest request = ws.newRequest()
+ .setMethod("POST")
+ .setParam(PARAM_RULE, rule.getKey().toString())
+ .setParam(PARAM_KEY, qualityProfile.getKee());
+
+ expectedException.expect(BadRequestException.class);
+ expectedException.expectMessage(String.format("Operation forbidden for rule '%s' imported from an external rule engine.", rule.getKey()));
+
+ request.execute();
+ }
+
@Test
public void fail_deactivate_if_built_in_profile() {
RuleDefinitionDto rule = db.rules().insert();
request.execute();
}
-
- private static ArgumentCaptor<Collection<Integer>> ruleIdCollectionCaptor() {
- Class<Collection<Integer>> collectionClass = (Class<Collection<Integer>>) (Class) Collection.class;
- return ArgumentCaptor.forClass(collectionClass);
- }
}
private DbClient dbClient = db.getDbClient();
private QProfileRules qProfileRules = mock(QProfileRules.class, RETURNS_DEEP_STUBS);
private QProfileWsSupport wsSupport = new QProfileWsSupport(dbClient, userSession, TestDefaultOrganizationProvider.from(db));
- private RuleQueryFactory ruleQueryFactory = mock(RuleQueryFactory.class);
+ private RuleQueryFactory ruleQueryFactory = mock(RuleQueryFactory.class, RETURNS_DEEP_STUBS);
private DeactivateRulesAction underTest = new DeactivateRulesAction(ruleQueryFactory, userSession, qProfileRules, wsSupport, dbClient);
private WsActionTester ws = new WsActionTester(underTest);
private OrganizationDto defaultOrganization;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.qualityprofile.QProfileDto;
import org.sonar.db.qualityprofile.QualityProfileTesting;
+import org.sonar.db.rule.RuleDefinitionDto;
+import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.organization.TestDefaultOrganizationProvider;
underTest.getProfile(db.getSession(), QProfileReference.fromName(null, "java", "missing"));
}
+ @Test
+ public void getRule_throws_BadRequest_if_rule_is_external() {
+ RuleDefinitionDto rule = db.rules().insert(r -> r.setIsExternal(true));
+
+ expectedException.expect(BadRequestException.class);
+ expectedException.expectMessage(format("Operation forbidden for rule '%s' imported from an external rule engine.", rule.getKey()));
+
+ underTest.getRule(db.getSession(), rule.getKey());
+ }
+
@Test
public void getProfile_throws_NotFoundException_if_specified_name_does_not_exist_on_specified_organization() {
OrganizationDto org1 = db.organizations().insert();
OrganizationDto org2 = db.organizations().insert();
expectedException.expect(NotFoundException.class);
- expectedException.expectMessage(format("Quality Profile for language '%s' and name '%s' does not exist in organization '%s'", profile.getLanguage(), profile.getName(), org2.getKey()));
+ expectedException
+ .expectMessage(format("Quality Profile for language '%s' and name '%s' does not exist in organization '%s'", profile.getLanguage(), profile.getName(), org2.getKey()));
underTest.getProfile(db.getSession(), QProfileReference.fromName(org2.getKey(), profile.getLanguage(), profile.getName()));
}