aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-plugin-api-impl/src
diff options
context:
space:
mode:
authorLéo Geoffroy <leo.geoffroy@sonarsource.com>2023-08-09 16:49:35 +0200
committersonartech <sonartech@sonarsource.com>2023-08-18 20:02:49 +0000
commitdddfee0f55914f56d168ae830038bd58fe9e1e8a (patch)
treef765f6a2ad6dcdf26106d39805c6404f7bb1c6e4 /sonar-plugin-api-impl/src
parent8b704e7f10a5525071975340cf97d0e5849beaaa (diff)
downloadsonarqube-dddfee0f55914f56d168ae830038bd58fe9e1e8a.tar.gz
sonarqube-dddfee0f55914f56d168ae830038bd58fe9e1e8a.zip
SONAR-20021 Manage external issues and adhoc rules
Diffstat (limited to 'sonar-plugin-api-impl/src')
-rw-r--r--sonar-plugin-api-impl/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultExternalIssue.java16
-rw-r--r--sonar-plugin-api-impl/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultExternalIssueTest.java55
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");
- }
}