diff options
author | Léo Geoffroy <leo.geoffroy@sonarsource.com> | 2023-08-09 16:49:35 +0200 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2023-08-18 20:02:49 +0000 |
commit | dddfee0f55914f56d168ae830038bd58fe9e1e8a (patch) | |
tree | f765f6a2ad6dcdf26106d39805c6404f7bb1c6e4 /sonar-plugin-api-impl/src | |
parent | 8b704e7f10a5525071975340cf97d0e5849beaaa (diff) | |
download | sonarqube-dddfee0f55914f56d168ae830038bd58fe9e1e8a.tar.gz sonarqube-dddfee0f55914f56d168ae830038bd58fe9e1e8a.zip |
SONAR-20021 Manage external issues and adhoc rules
Diffstat (limited to 'sonar-plugin-api-impl/src')
2 files changed, 41 insertions, 30 deletions
diff --git a/sonar-plugin-api-impl/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultExternalIssue.java b/sonar-plugin-api-impl/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultExternalIssue.java index b8cd113e0b7..43da50257ab 100644 --- a/sonar-plugin-api-impl/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultExternalIssue.java +++ b/sonar-plugin-api-impl/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultExternalIssue.java @@ -19,7 +19,7 @@ */ package org.sonar.api.batch.sensor.issue.internal; -import java.util.Collections; +import java.util.EnumMap; import java.util.Map; import javax.annotation.CheckForNull; import javax.annotation.Nullable; @@ -44,6 +44,8 @@ public class DefaultExternalIssue extends AbstractDefaultIssue<DefaultExternalIs private RuleType type; private String engineId; private String ruleId; + private Map<SoftwareQuality, org.sonar.api.issue.impact.Severity> impacts = new EnumMap<>(SoftwareQuality.class); + private CleanCodeAttribute cleanCodeAttribute; public DefaultExternalIssue(DefaultInputProject project) { this(project, null); @@ -67,7 +69,8 @@ public class DefaultExternalIssue extends AbstractDefaultIssue<DefaultExternalIs } @Override - public NewExternalIssue addImpact(SoftwareQuality softwareQuality, org.sonar.api.issue.impact.Severity severity) { + public DefaultExternalIssue addImpact(SoftwareQuality softwareQuality, org.sonar.api.issue.impact.Severity severity) { + this.impacts.put(softwareQuality, severity); return this; } @@ -97,8 +100,6 @@ public class DefaultExternalIssue extends AbstractDefaultIssue<DefaultExternalIs requireNonNull(this.ruleId, "Rule id is mandatory on external issue"); checkState(primaryLocation != null, "Primary location is mandatory on every external issue"); checkState(primaryLocation.message() != null, "External issues must have a message"); - checkState(severity != null, "Severity is mandatory on every external issue"); - checkState(type != null, "Type is mandatory on every external issue"); storage.store(this); } @@ -109,13 +110,13 @@ public class DefaultExternalIssue extends AbstractDefaultIssue<DefaultExternalIs @Override public Map<SoftwareQuality, org.sonar.api.issue.impact.Severity> impacts() { - return Collections.emptyMap(); + return impacts; } @CheckForNull @Override public CleanCodeAttribute cleanCodeAttribute() { - return null; + return cleanCodeAttribute; } @Override @@ -152,7 +153,8 @@ public class DefaultExternalIssue extends AbstractDefaultIssue<DefaultExternalIs } @Override - public NewExternalIssue cleanCodeAttribute(CleanCodeAttribute attribute) { + public DefaultExternalIssue cleanCodeAttribute(CleanCodeAttribute attribute) { + this.cleanCodeAttribute = attribute; return this; } diff --git a/sonar-plugin-api-impl/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultExternalIssueTest.java b/sonar-plugin-api-impl/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultExternalIssueTest.java index 3047ab7415b..db9e3dfe457 100644 --- a/sonar-plugin-api-impl/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultExternalIssueTest.java +++ b/sonar-plugin-api-impl/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultExternalIssueTest.java @@ -20,6 +20,7 @@ package org.sonar.api.batch.sensor.issue.internal; import java.io.IOException; +import java.util.Map; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -30,6 +31,7 @@ import org.sonar.api.batch.fs.internal.DefaultInputProject; import org.sonar.api.batch.fs.internal.TestInputFileBuilder; import org.sonar.api.batch.rule.Severity; import org.sonar.api.batch.sensor.internal.SensorStorage; +import org.sonar.api.issue.impact.SoftwareQuality; import org.sonar.api.rule.RuleKey; import org.sonar.api.rules.RuleType; @@ -86,6 +88,27 @@ public class DefaultExternalIssueTest { } @Test + public void build_file_issue_with_only_impacts() { + SensorStorage storage = mock(SensorStorage.class); + DefaultExternalIssue issue = new DefaultExternalIssue(project, storage) + .at(new DefaultIssueLocation() + .on(inputFile) + .at(inputFile.selectLine(1)) + .message("Wrong way!")) + .forRule(RuleKey.of("repo", "rule")) + .remediationEffortMinutes(10L) + .addImpact(SoftwareQuality.MAINTAINABILITY, org.sonar.api.issue.impact.Severity.LOW); + + assertThat(issue.type()).isNull(); + assertThat(issue.severity()).isNull(); + assertThat(issue.impacts()).containsExactlyEntriesOf(Map.of(SoftwareQuality.MAINTAINABILITY, org.sonar.api.issue.impact.Severity.LOW)); + + issue.save(); + + verify(storage).store(issue); + } + + @Test public void build_project_issue() { SensorStorage storage = mock(SensorStorage.class); DefaultExternalIssue issue = new DefaultExternalIssue(project, storage) @@ -113,7 +136,7 @@ public class DefaultExternalIssueTest { } @Test - public void fail_to_store_if_no_type() { + public void build_file_issues_with_no_severity_type_and_impacts() { SensorStorage storage = mock(SensorStorage.class); DefaultExternalIssue issue = new DefaultExternalIssue(project, storage) .at(new DefaultIssueLocation() @@ -121,12 +144,15 @@ public class DefaultExternalIssueTest { .at(inputFile.selectLine(1)) .message("Wrong way!")) .forRule(RuleKey.of("repo", "rule")) - .remediationEffortMinutes(10L) - .severity(Severity.BLOCKER); + .remediationEffortMinutes(10L); - assertThatThrownBy(() -> issue.save()) - .isInstanceOf(IllegalStateException.class) - .hasMessageContaining("Type is mandatory"); + assertThat(issue.type()).isNull(); + assertThat(issue.severity()).isNull(); + assertThat(issue.impacts()).isEmpty(); + + issue.save(); + + verify(storage).store(issue); } @Test @@ -145,21 +171,4 @@ public class DefaultExternalIssueTest { .isInstanceOf(IllegalStateException.class) .hasMessage("External issues must have a message"); } - - @Test - public void fail_to_store_if_no_severity() { - SensorStorage storage = mock(SensorStorage.class); - DefaultExternalIssue issue = new DefaultExternalIssue(project, storage) - .at(new DefaultIssueLocation() - .on(inputFile) - .at(inputFile.selectLine(1)) - .message("Wrong way!")) - .forRule(RuleKey.of("repo", "rule")) - .remediationEffortMinutes(10L) - .type(RuleType.BUG); - - assertThatThrownBy(() -> issue.save()) - .isInstanceOf(IllegalStateException.class) - .hasMessageContaining("Severity is mandatory"); - } } |