@@ -26,6 +26,7 @@ import com.google.common.collect.Multimap; | |||
import org.sonar.api.ServerComponent; | |||
import org.sonar.api.resources.Language; | |||
import org.sonar.api.resources.Languages; | |||
import org.sonar.api.rule.RuleKey; | |||
import org.sonar.batch.protocol.input.ProjectReferentials; | |||
import org.sonar.core.UtcDateUtils; | |||
import org.sonar.core.component.ComponentDto; | |||
@@ -203,9 +204,11 @@ public class ProjectReferentialsLoader implements ServerComponent { | |||
for (org.sonar.batch.protocol.input.QProfile qProfile : ref.qProfiles()) { | |||
for (ActiveRule activeRule : qProfileLoader.findActiveRulesByProfile(qProfile.key())) { | |||
Rule rule = ruleService.getNonNullByKey(activeRule.key().ruleKey()); | |||
RuleKey templateRuleKey = rule.templateKey(); | |||
org.sonar.batch.protocol.input.ActiveRule inputActiveRule = new org.sonar.batch.protocol.input.ActiveRule( | |||
activeRule.key().ruleKey().repository(), | |||
activeRule.key().ruleKey().rule(), | |||
templateRuleKey != null ? templateRuleKey.rule() : null, | |||
rule.name(), | |||
activeRule.severity(), | |||
rule.internalKey(), |
@@ -29,6 +29,7 @@ import org.sonar.api.rule.RuleKey; | |||
import org.sonar.api.rule.Severity; | |||
import org.sonar.api.server.rule.RuleParamType; | |||
import org.sonar.api.utils.DateUtils; | |||
import org.sonar.api.web.UserRole; | |||
import org.sonar.batch.protocol.input.ActiveRule; | |||
import org.sonar.batch.protocol.input.ProjectReferentials; | |||
import org.sonar.batch.protocol.input.QProfile; | |||
@@ -658,6 +659,39 @@ public class ProjectReferentialsLoaderMediumTest { | |||
assertThat(activeRules.get(0).params()).isEqualTo(ImmutableMap.of("max", "2")); | |||
} | |||
@Test | |||
public void return_custom_rule() throws Exception { | |||
Date ruleUpdatedAt = DateUtils.parseDateTime("2014-01-14T13:00:00+0100"); | |||
ComponentDto project = ComponentTesting.newProjectDto(); | |||
MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION).addComponentPermission(UserRole.USER, project.key(), project.key()); | |||
tester.get(DbClient.class).componentDao().insert(dbSession, project); | |||
QualityProfileDto profileDto = QProfileTesting.newDto(QProfileName.createFor(ServerTester.Xoo.KEY, "SonarQube way"), "abcd").setRulesUpdatedAt( | |||
DateUtils.formatDateTime(ruleUpdatedAt)); | |||
tester.get(DbClient.class).qualityProfileDao().insert(dbSession, profileDto); | |||
tester.get(DbClient.class).propertiesDao().setProperty(new PropertyDto().setKey("sonar.profile.xoo").setValue("SonarQube way"), dbSession); | |||
RuleKey ruleKey = RuleKey.of("squid", "ArchitecturalConstraint"); | |||
RuleDto templateRule = RuleTesting.newTemplateRule(ruleKey).setName("Architectural Constraint").setLanguage(ServerTester.Xoo.KEY); | |||
tester.get(DbClient.class).ruleDao().insert(dbSession, templateRule); | |||
RuleDto customRule = RuleTesting.newCustomRule(templateRule); | |||
tester.get(DbClient.class).ruleDao().insert(dbSession, customRule); | |||
tester.get(RuleActivator.class).activate(dbSession, new RuleActivation(customRule.getKey()).setSeverity(Severity.MINOR), profileDto.getKey()); | |||
dbSession.commit(); | |||
ProjectReferentials ref = loader.load(ProjectReferentialsQuery.create().setModuleKey(project.key())); | |||
List<ActiveRule> activeRules = newArrayList(ref.activeRules()); | |||
assertThat(activeRules).hasSize(1); | |||
assertThat(activeRules.get(0).repositoryKey()).isEqualTo("squid"); | |||
assertThat(activeRules.get(0).ruleKey()).startsWith("ArchitecturalConstraint_"); | |||
assertThat(activeRules.get(0).templateRuleKey()).isEqualTo("ArchitecturalConstraint"); | |||
assertThat(activeRules.get(0).language()).isEqualTo("xoo"); | |||
assertThat(activeRules.get(0).severity()).isEqualTo("MINOR"); | |||
} | |||
@Test | |||
public void fail_if_no_permission() throws Exception { | |||
MockUserSession.set().setLogin("john").setGlobalPermissions(); |
@@ -92,6 +92,7 @@ public class RuleTesting { | |||
public static RuleDto newCustomRule(RuleDto templateRule){ | |||
return newDto(RuleKey.of(templateRule.getRepositoryKey(), templateRule.getRuleKey() + "_" + new Date().getTime())) | |||
.setLanguage(templateRule.getLanguage()) | |||
.setTemplateId(templateRule.getId()); | |||
} | |||
@@ -26,13 +26,14 @@ import java.util.HashMap; | |||
import java.util.Map; | |||
public class ActiveRule { | |||
private final String repositoryKey, ruleKey; | |||
private final String repositoryKey, ruleKey, templateRuleKey; | |||
private final String name, severity, internalKey, language; | |||
private final Map<String, String> params = new HashMap<String, String>(); | |||
public ActiveRule(String repositoryKey, String ruleKey, String name, String severity, @Nullable String internalKey, String language) { | |||
public ActiveRule(String repositoryKey, String ruleKey, @Nullable String templateRuleKey, String name, String severity, @Nullable String internalKey, String language) { | |||
this.repositoryKey = repositoryKey; | |||
this.ruleKey = ruleKey; | |||
this.templateRuleKey = templateRuleKey; | |||
this.name = name; | |||
this.severity = severity; | |||
this.internalKey = internalKey; | |||
@@ -47,6 +48,11 @@ public class ActiveRule { | |||
return ruleKey; | |||
} | |||
@CheckForNull | |||
public String templateRuleKey() { | |||
return templateRuleKey; | |||
} | |||
public String name() { | |||
return name; | |||
} |
@@ -45,7 +45,7 @@ public class ProjectReferentialsTest { | |||
settings.put("prop2", "value2"); | |||
ref.addSettings("foo", settings); | |||
ref.settings("foo").put("prop", "value"); | |||
ActiveRule activeRule = new ActiveRule("repo", "rule", "Rule", "MAJOR", "rule", "java"); | |||
ActiveRule activeRule = new ActiveRule("repo", "rule", "templateRule", "Rule", "MAJOR", "rule", "java"); | |||
activeRule.addParam("param1", "value1"); | |||
ref.addActiveRule(activeRule); | |||
ref.setLastAnalysisDate(new SimpleDateFormat("dd/MM/yyyy").parse("31/10/2014")); | |||
@@ -57,7 +57,7 @@ public class ProjectReferentialsTest { | |||
.assertEquals( | |||
"{timestamp:10," | |||
+ "qprofilesByLanguage:{java:{key:\"squid-java\",name:Java,language:java,rulesUpdatedAt:\"1984-03-14T00:00:00+0100\"}}," | |||
+ "activeRules:[{repositoryKey:repo,ruleKey:rule,name:Rule,severity:MAJOR,internalKey:rule,language:java,params:{param1:value1}}]," | |||
+ "activeRules:[{repositoryKey:repo,ruleKey:rule,templateRuleKey:templateRule,name:Rule,severity:MAJOR,internalKey:rule,language:java,params:{param1:value1}}]," | |||
+ "settingsByModule:{foo:{prop1:value1,prop2:value2,prop:value}}," | |||
+ "fileDataByModuleAndPath:{foo:{\"src/main/java/Foo.java\":{hash:xyz,scmLastCommitDatetimesByLine:\"1\u003d12345,2\u003d3456\",scmRevisionsByLine:\"1\u003d345,2\u003d345\",scmAuthorsByLine:\"1\u003dhenryju,2\u003dgaudin\"}}}," | |||
+ "lastAnalysisDate:\"2014-10-31T00:00:00+0100\"}", | |||
@@ -69,7 +69,7 @@ public class ProjectReferentialsTest { | |||
ProjectReferentials ref = ProjectReferentials | |||
.fromJson("{timestamp:1," | |||
+ "qprofilesByLanguage:{java:{key:\"squid-java\",name:Java,language:java,rulesUpdatedAt:\"1984-03-14T00:00:00+0100\"}}," | |||
+ "activeRules:[{repositoryKey:repo,ruleKey:rule,name:Rule,severity:MAJOR,internalKey:rule1,language:java,params:{param1:value1}}]," | |||
+ "activeRules:[{repositoryKey:repo,ruleKey:rule,templateRuleKey:templateRule,name:Rule,severity:MAJOR,internalKey:rule1,language:java,params:{param1:value1}}]," | |||
+ "settingsByModule:{foo:{prop:value}}," | |||
+ "fileDataByModuleAndPath:{foo:{\"src/main/java/Foo.java\":{hash:xyz,scmLastCommitDatetimesByLine:\"1\u003d12345,2\u003d3456\",scmRevisionsByLine:\"1\u003d345,2\u003d345\",scmAuthorsByLine:\"1\u003dhenryju,2\u003dgaudin\"}}}," | |||
+ "lastAnalysisDate:\"2014-10-31T00:00:00+0100\"}"); | |||
@@ -79,6 +79,7 @@ public class ProjectReferentialsTest { | |||
ActiveRule activeRule = ref.activeRules().iterator().next(); | |||
assertThat(activeRule.ruleKey()).isEqualTo("rule"); | |||
assertThat(activeRule.repositoryKey()).isEqualTo("repo"); | |||
assertThat(activeRule.templateRuleKey()).isEqualTo("templateRule"); | |||
assertThat(activeRule.name()).isEqualTo("Rule"); | |||
assertThat(activeRule.severity()).isEqualTo("MAJOR"); | |||
assertThat(activeRule.internalKey()).isEqualTo("rule1"); |
@@ -46,7 +46,7 @@ public class IssuesMediumTest { | |||
public BatchMediumTester tester = BatchMediumTester.builder() | |||
.registerPlugin("xoo", new XooPlugin()) | |||
.addDefaultQProfile("xoo", "Sonar Way") | |||
.activateRule(new ActiveRule("xoo", "OneIssuePerLine", "One issue per line", "MAJOR", "OneIssuePerLine.internal", "xoo")) | |||
.activateRule(new ActiveRule("xoo", "OneIssuePerLine", null, "One issue per line", "MAJOR", "OneIssuePerLine.internal", "xoo")) | |||
.bootstrapProperties(ImmutableMap.of("sonar.analysis.mode", "sensor")) | |||
.build(); | |||
@@ -44,7 +44,7 @@ public class IssuesOnDirMediumTest { | |||
public BatchMediumTester tester = BatchMediumTester.builder() | |||
.registerPlugin("xoo", new XooPlugin()) | |||
.addDefaultQProfile("xoo", "Sonar Way") | |||
.activateRule(new ActiveRule("xoo", "OneIssueOnDirPerFile", "One issue per line", "MINOR", "xoo", "xoo")) | |||
.activateRule(new ActiveRule("xoo", "OneIssueOnDirPerFile", null, "One issue per line", "MINOR", "xoo", "xoo")) | |||
.bootstrapProperties(ImmutableMap.of("sonar.analysis.mode", "sensor")) | |||
.build(); | |||