From 5053107fc465f952e63d42308ee621023db855e8 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Mon, 9 Feb 2015 11:41:55 +0100 Subject: [PATCH] SONAR-6162 Return template rule key in /batch/projects WS --- .../server/batch/ProjectRepositoryLoader.java | 10 +++--- .../ProjectRepositoryLoaderMediumTest.java | 33 +++++++++++++++++++ .../org/sonar/server/rule/RuleTesting.java | 3 ++ .../batch/protocol/input/ActiveRule.java | 11 +++++-- .../input/ProjectRepositoriesTest.java | 7 ++-- .../mediumtest/issues/IssuesMediumTest.java | 2 +- .../issues/IssuesOnDirMediumTest.java | 2 +- .../mediumtest/preview/ReportsMediumTest.java | 2 +- 8 files changed, 56 insertions(+), 14 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/batch/ProjectRepositoryLoader.java b/server/sonar-server/src/main/java/org/sonar/server/batch/ProjectRepositoryLoader.java index a224c4894af..83eb56ee2cc 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/batch/ProjectRepositoryLoader.java +++ b/server/sonar-server/src/main/java/org/sonar/server/batch/ProjectRepositoryLoader.java @@ -53,11 +53,7 @@ import org.sonar.server.user.UserSession; import javax.annotation.Nullable; -import java.util.Collections; -import java.util.Date; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Maps.newHashMap; @@ -230,9 +226,11 @@ public class ProjectRepositoryLoader 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 templateKey = rule.templateKey(); org.sonar.batch.protocol.input.ActiveRule inputActiveRule = new org.sonar.batch.protocol.input.ActiveRule( activeRule.key().ruleKey().repository(), activeRule.key().ruleKey().rule(), + templateKey != null ? templateKey.rule() : null, rule.name(), activeRule.severity(), rule.internalKey(), @@ -254,7 +252,7 @@ public class ProjectRepositoryLoader implements ServerComponent { ref.addActiveRule(new org.sonar.batch.protocol.input.ActiveRule( RuleKey.MANUAL_REPOSITORY_KEY, rule.key().rule(), - rule.name(), + null, rule.name(), null, null, null)); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/batch/ProjectRepositoryLoaderMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/batch/ProjectRepositoryLoaderMediumTest.java index 17fa759880e..3ab97eb09b6 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/batch/ProjectRepositoryLoaderMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/batch/ProjectRepositoryLoaderMediumTest.java @@ -613,6 +613,39 @@ public class ProjectRepositoryLoaderMediumTest { 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).addComponentUuidPermission(UserRole.USER, project.uuid(), project.uuid()); + 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(); + + ProjectRepositories ref = loader.load(ProjectRepositoryQuery.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 return_manual_rules() throws Exception { ComponentDto project = ComponentTesting.newProjectDto(); 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 c25b9b8dc98..274aec5de5b 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 @@ -19,6 +19,7 @@ */ package org.sonar.server.rule; +import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.RuleStatus; @@ -89,7 +90,9 @@ public class RuleTesting { } public static RuleDto newCustomRule(RuleDto templateRule){ + Preconditions.checkNotNull(templateRule.getId(), "The template rule need to be persisted before creating this custom rule."); return newDto(RuleKey.of(templateRule.getRepositoryKey(), templateRule.getRuleKey() + "_" + System.currentTimeMillis())) + .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 d9bf2e3bea7..ab6e6c64192 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,15 @@ 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, @Nullable String severity, @Nullable String internalKey, @Nullable String language) { + public ActiveRule(String repositoryKey, String ruleKey, @Nullable String templateRuleKey, String name, @Nullable String severity, + @Nullable String internalKey, @Nullable String language) { this.repositoryKey = repositoryKey; this.ruleKey = ruleKey; + this.templateRuleKey = templateRuleKey; this.name = name; this.severity = severity; this.internalKey = internalKey; @@ -47,6 +49,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/ProjectRepositoriesTest.java b/sonar-batch-protocol/src/test/java/org/sonar/batch/protocol/input/ProjectRepositoriesTest.java index e4eb540d291..cfb584f97e7 100644 --- a/sonar-batch-protocol/src/test/java/org/sonar/batch/protocol/input/ProjectRepositoriesTest.java +++ b/sonar-batch-protocol/src/test/java/org/sonar/batch/protocol/input/ProjectRepositoriesTest.java @@ -44,7 +44,7 @@ public class ProjectRepositoriesTest { 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")); @@ -56,7 +56,7 @@ public class ProjectRepositoriesTest { .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,needBlame:true,scmLastCommitDatetimesByLine:\"1\u003d12345,2\u003d3456\",scmRevisionsByLine:\"1\u003d345,2\u003d345\",scmAuthorsByLine:\"1\u003dhenryju,2\u003dgaudin\"}," + "\"src/main/java/Foo2.java\":{hash:xyz,needBlame:false,scmLastCommitDatetimesByLine:\"1\u003d12345,2\u003d3456\",scmRevisionsByLine:\"1\u003d345,2\u003d345\",scmAuthorsByLine:\"1\u003dhenryju,2\u003dgaudin\"}}}," @@ -69,7 +69,7 @@ public class ProjectRepositoriesTest { ProjectRepositories ref = ProjectRepositories .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,needBlame:true,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 ProjectRepositoriesTest { 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 994fdaa676c..22f8a339f13 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 @@ -44,7 +44,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")) .build(); @Before 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 c6156e4cecc..10aef4cb60d 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 @@ -43,7 +43,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")) .build(); @Before diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/preview/ReportsMediumTest.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/preview/ReportsMediumTest.java index 16d4f7350fb..d3500431180 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/preview/ReportsMediumTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/preview/ReportsMediumTest.java @@ -56,7 +56,7 @@ public class ReportsMediumTest { .bootstrapProperties(ImmutableMap.of(CoreProperties.ANALYSIS_MODE, CoreProperties.ANALYSIS_MODE_PREVIEW)) .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")) // Existing issue .addPreviousIssue(new PreviousIssue().setKey("xyz") .setComponentKey("sample:xources/hello/HelloJava.xoo") -- 2.39.5