summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/batch/ProjectReferentialsLoader.java3
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/batch/ProjectReferentialsLoaderMediumTest.java34
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/rule/RuleTesting.java1
-rw-r--r--sonar-batch-protocol/src/main/java/org/sonar/batch/protocol/input/ActiveRule.java10
-rw-r--r--sonar-batch-protocol/src/test/java/org/sonar/batch/protocol/input/ProjectReferentialsTest.java7
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/IssuesMediumTest.java2
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/IssuesOnDirMediumTest.java2
7 files changed, 52 insertions, 7 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/batch/ProjectReferentialsLoader.java b/server/sonar-server/src/main/java/org/sonar/server/batch/ProjectReferentialsLoader.java
index 4579670fe93..ab6d880301e 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/batch/ProjectReferentialsLoader.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/batch/ProjectReferentialsLoader.java
@@ -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(),
diff --git a/server/sonar-server/src/test/java/org/sonar/server/batch/ProjectReferentialsLoaderMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/batch/ProjectReferentialsLoaderMediumTest.java
index 42a8b6bec2b..4596c0e30c1 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/batch/ProjectReferentialsLoaderMediumTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/batch/ProjectReferentialsLoaderMediumTest.java
@@ -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;
@@ -659,6 +660,39 @@ public class ProjectReferentialsLoaderMediumTest {
}
@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();
diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleTesting.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleTesting.java
index 6cfd273bce4..bf0626faa8e 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleTesting.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleTesting.java
@@ -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());
}
diff --git a/sonar-batch-protocol/src/main/java/org/sonar/batch/protocol/input/ActiveRule.java b/sonar-batch-protocol/src/main/java/org/sonar/batch/protocol/input/ActiveRule.java
index 4fda09f8910..157253fa056 100644
--- a/sonar-batch-protocol/src/main/java/org/sonar/batch/protocol/input/ActiveRule.java
+++ b/sonar-batch-protocol/src/main/java/org/sonar/batch/protocol/input/ActiveRule.java
@@ -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;
}
diff --git a/sonar-batch-protocol/src/test/java/org/sonar/batch/protocol/input/ProjectReferentialsTest.java b/sonar-batch-protocol/src/test/java/org/sonar/batch/protocol/input/ProjectReferentialsTest.java
index 8d55f4054dc..c446e11aa9e 100644
--- a/sonar-batch-protocol/src/test/java/org/sonar/batch/protocol/input/ProjectReferentialsTest.java
+++ b/sonar-batch-protocol/src/test/java/org/sonar/batch/protocol/input/ProjectReferentialsTest.java
@@ -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");
diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/IssuesMediumTest.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/IssuesMediumTest.java
index 146761ad94f..97d62c238c8 100644
--- a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/IssuesMediumTest.java
+++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/IssuesMediumTest.java
@@ -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();
diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/IssuesOnDirMediumTest.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/IssuesOnDirMediumTest.java
index b75a46346a1..716bf2015bf 100644
--- a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/IssuesOnDirMediumTest.java
+++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/IssuesOnDirMediumTest.java
@@ -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();