From b49f4a0e2dc098099f2172e24a48768a983f96f5 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Mon, 9 Feb 2015 12:06:35 +0100 Subject: [PATCH] SONAR-6162 Return template rule key in /batch/projects WS --- .../batch/ProjectReferentialsLoader.java | 3 ++ .../ProjectReferentialsLoaderMediumTest.java | 34 +++++++++++++++++++ .../org/sonar/server/rule/RuleTesting.java | 1 + .../batch/protocol/input/ActiveRule.java | 10 ++++-- .../input/ProjectReferentialsTest.java | 7 ++-- .../mediumtest/issues/IssuesMediumTest.java | 2 +- .../issues/IssuesOnDirMediumTest.java | 2 +- 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; @@ -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 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 params = new HashMap(); - 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(); -- 2.39.5