]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10543 Fix mandatory fields
authorDuarte Meneses <duarte.meneses@sonarsource.com>
Tue, 10 Apr 2018 13:41:07 +0000 (15:41 +0200)
committerSonarTech <sonartech@sonarsource.com>
Thu, 26 Apr 2018 18:20:50 +0000 (20:20 +0200)
plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/OneExternalIssuePerLineSensor.java
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/TrackerRawInputFactory.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/issue/ExternalIssue.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/issue/NewExternalIssue.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultExternalIssue.java
sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/internal/SensorContextTesterTest.java
sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultExternalIssueTest.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/ModuleIssues.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ModuleIssuesTest.java
sonar-scanner-protocol/src/main/protobuf/scanner_report.proto

index 4dbf744243b0e278bed7cb68e0643e1a3b65fa49..e47ddd4ef609d59afaa38744cb78d17a7c0cc64d 100644 (file)
@@ -40,11 +40,12 @@ public class OneExternalIssuePerLineSensor implements Sensor {
   public static final Long EFFORT = 10l;
   public static final RuleType type = RuleType.BUG;
   public static final String ACTIVATE_EXTERNAL_ISSUES = "sonar.oneExternalIssuePerLine.activate";
+  private static final String NAME = "One External Issue Per Line";
 
   @Override
   public void describe(SensorDescriptor descriptor) {
     descriptor
-      .name("One External Issue Per Line")
+      .name(NAME)
       .onlyOnLanguages(Xoo.KEY, Xoo2.KEY)
       .onlyWhenConfiguration(c -> c.getBoolean(ACTIVATE_EXTERNAL_ISSUES).orElse(false));
   }
@@ -73,6 +74,8 @@ public class OneExternalIssuePerLineSensor implements Sensor {
           .on(file)
           .at(file.selectLine(line))
           .message("This issue is generated on each line"))
+        .ruleTitle(NAME)
+        .descriptionUrl("http://oneexternalissueperline.xoo.net")
         .severity(Severity.valueOf(SEVERITY))
         .remediationEffort(EFFORT)
         .type(type)
index 0bc49a026d6773cf07881b53a3443ffe38144dc4..0154e69b0553fddcd6ea275e904a4600e3fb5f1f 100644 (file)
@@ -219,7 +219,7 @@ public class TrackerRawInputFactory {
         .setType(toRuleType(reportIssue.getType()))
         .setKey(RuleKey.of(RuleKey.EXTERNAL_RULE_REPO_PREFIX + reportIssue.getRuleRepository(), reportIssue.getRuleKey()))
         .setPluginKey(reportIssue.getRuleRepository())
-        .setName(reportIssue.getRuleName());
+        .setName(reportIssue.getRuleTitle());
 
       if (reportIssue.getSeverity() != Severity.UNSET_SEVERITY) {
         builder.setSeverity(reportIssue.getSeverity().name());
index cdc7d6df2f2a560fdc3e4e3f20c1578765c13323..ec72c49de1a78b9701458f85ebe57596f3adf76f 100644 (file)
@@ -48,4 +48,9 @@ public interface ExternalIssue extends IIssue {
    * Type of the issue.
    */
   RuleType type();
+  
+  /**
+   * Short description of the rule. Should not depend on the issue being raised.
+   */
+  String ruleTitle();
 }
index 2a3f41b4f603ecefa1db3fb702a4fdf37f8ae4a7..8049c44e1dc17cf37844c49ed50cb5e124231fc9 100644 (file)
@@ -79,6 +79,11 @@ public interface NewExternalIssue {
    */
   NewIssueLocation newLocation();
 
+  /**
+   * Add the description of the rule. Should not depend on the issue being raised.
+   */
+  NewExternalIssue ruleTitle(String title);
+  
   /**
    * Save the issue. If rule key is unknown or rule not enabled in the current quality profile then a warning is logged but no exception
    * is thrown.
index de3eed8b4e4b64a0fb23de20a9d2936ceb8f9755..6bbf40078e7c07a347dbe178ea2a7759c6b16555 100644 (file)
@@ -36,6 +36,7 @@ public class DefaultExternalIssue extends AbstractDefaultIssue<DefaultExternalIs
   private Severity severity;
   private String url;
   private RuleType type;
+  private String ruleTitle;
 
   public DefaultExternalIssue() {
     super(null);
@@ -70,12 +71,12 @@ public class DefaultExternalIssue extends AbstractDefaultIssue<DefaultExternalIs
 
   @Override
   public void doSave() {
-    requireNonNull(this.ruleKey, "ruleKey is mandatory on external issue");
+    requireNonNull(this.ruleKey, "Rule key is mandatory on external issue");
     checkState(primaryLocation != null, "Primary location is mandatory on every external issue");
     checkState(primaryLocation.inputComponent().isFile(), "External issues must be located in files");
-    checkState(type != null, "Type is mandatory on every external issue");
-    checkState(severity != null, "Severity is mandatory on every external issue");
+    checkState(ruleTitle != null, "Rule title is mandatory on every external issue");
     checkState(severity != null, "Severity is mandatory on every external issue");
+    checkState(type != null, "Type is mandatory on every external issue");
     storage.store(this);
   }
 
@@ -100,4 +101,15 @@ public class DefaultExternalIssue extends AbstractDefaultIssue<DefaultExternalIs
     this.type = type;
     return this;
   }
+
+  @Override
+  public String ruleTitle() {
+    return ruleTitle;
+  }
+
+  @Override
+  public DefaultExternalIssue ruleTitle(String ruleTitle) {
+    this.ruleTitle = ruleTitle;
+    return this;
+  }
 }
index 0cee9bc2a96fe806ac03f2ac78e160107e16c73e..b47ef208fedb1a882d0feabbe2a76d5a03b5646b 100644 (file)
@@ -117,6 +117,7 @@ public class SensorContextTesterTest {
       .forRule(RuleKey.of("repo", "rule"))
       .type(RuleType.BUG)
       .severity(Severity.BLOCKER)
+      .ruleTitle("title")
       .save();
     newExternalIssue = tester.newExternalIssue();
     newExternalIssue
@@ -124,6 +125,7 @@ public class SensorContextTesterTest {
       .type(RuleType.BUG)
       .severity(Severity.BLOCKER)
       .forRule(RuleKey.of("repo", "rule"))
+      .ruleTitle("title")
       .save();
     assertThat(tester.allExternalIssues()).hasSize(2);
   }
index d219cefc8ed55d04dc656ed5de0e7a4aab841e2c..57998dc4ba8e90d24f91f67416c44b474209d641 100644 (file)
@@ -54,6 +54,7 @@ public class DefaultExternalIssueTest {
       .remediationEffort(10l)
       .descriptionUrl("url")
       .type(RuleType.BUG)
+      .ruleTitle("rule")
       .severity(Severity.BLOCKER);
 
     assertThat(issue.primaryLocation().inputComponent()).isEqualTo(inputFile);
@@ -63,6 +64,7 @@ public class DefaultExternalIssueTest {
     assertThat(issue.descriptionUrl()).isEqualTo("url");
     assertThat(issue.type()).isEqualTo(RuleType.BUG);
     assertThat(issue.severity()).isEqualTo(Severity.BLOCKER);
+    assertThat(issue.ruleTitle()).isEqualTo("rule");
     assertThat(issue.primaryLocation().message()).isEqualTo("Wrong way!");
 
     issue.save();
@@ -81,6 +83,7 @@ public class DefaultExternalIssueTest {
       .forRule(RuleKey.of("repo", "rule"))
       .remediationEffort(10l)
       .descriptionUrl("url")
+      .ruleTitle("rule")
       .severity(Severity.BLOCKER);
 
     exception.expect(IllegalStateException.class);
@@ -98,6 +101,7 @@ public class DefaultExternalIssueTest {
       .forRule(RuleKey.of("repo", "rule"))
       .remediationEffort(10l)
       .descriptionUrl("url")
+      .ruleTitle("rule")
       .severity(Severity.BLOCKER);
 
     exception.expect(IllegalStateException.class);
@@ -116,6 +120,7 @@ public class DefaultExternalIssueTest {
       .forRule(RuleKey.of("repo", "rule"))
       .remediationEffort(10l)
       .descriptionUrl("url")
+      .ruleTitle("rule")
       .type(RuleType.BUG);
 
     exception.expect(IllegalStateException.class);
@@ -123,4 +128,23 @@ public class DefaultExternalIssueTest {
     issue.save();
   }
 
+  @Test
+  public void fail_to_store_if_no_rule_title() {
+    SensorStorage storage = mock(SensorStorage.class);
+    DefaultExternalIssue issue = new DefaultExternalIssue(storage)
+      .at(new DefaultIssueLocation()
+        .on(inputFile)
+        .at(inputFile.selectLine(1))
+        .message("Wrong way!"))
+      .forRule(RuleKey.of("repo", "rule"))
+      .remediationEffort(10l)
+      .descriptionUrl("url")
+      .severity(Severity.BLOCKER)
+      .type(RuleType.BUG);
+
+    exception.expect(IllegalStateException.class);
+    exception.expectMessage("Rule title is mandatory");
+    issue.save();
+  }
+
 }
index 40167c3c7696f2d4b833ebd32924104dde52e45a..a6bdaad62f23df0ae844c96f5b7e69a4fffbc0ce 100644 (file)
@@ -121,6 +121,7 @@ public class ModuleIssues {
     builder.setSeverity(severity);
     builder.setRuleRepository(issue.ruleKey().repository());
     builder.setRuleKey(issue.ruleKey().rule());
+    builder.setRuleTitle(issue.ruleTitle());
     builder.setMsg(primaryMessage);
     locationBuilder.setMsg(primaryMessage);
 
index 6309720339dd19d71488b9bb9c448b8a2bb8d48d..844f6edcfabb5632891d9fc4a73b17f5dab8af0a 100644 (file)
@@ -155,7 +155,8 @@ public class ModuleIssuesTest {
     DefaultExternalIssue issue = new DefaultExternalIssue()
       .at(new DefaultIssueLocation().on(file).at(file.selectLine(3)).message("Foo"))
       .forRule(SQUID_RULE_KEY)
-      .severity(org.sonar.api.batch.rule.Severity.CRITICAL);
+      .severity(org.sonar.api.batch.rule.Severity.CRITICAL)
+      .ruleTitle("title");
 
     moduleIssues.initAndAddExternalIssue(issue);
 
index 9bdb00bd4cf1fa5ba338a1b31019cb071618b4ed..13cf6dd56cc3f2946e5f6ed6ca3ef9e0cde1c168 100644 (file)
@@ -201,7 +201,6 @@ message ExternalIssue {
   string descriptionUrl = 8;
   IssueType type = 9;
   string rule_title = 10;
-  string rule_name = 11;
 }
 
 enum IssueType {