From 8305ff20174aee249f2bdd2cf2a6e157b25ca5fc Mon Sep 17 00:00:00 2001 From: Steve Marion Date: Fri, 26 Jul 2024 11:13:16 +0200 Subject: [PATCH] SONAR-22537 add support for short and full description in adhoc rule created from SARIF import. --- .../externalissue/sarif/RuleMapper.java | 17 ++++++++-- .../externalissue/sarif/RuleMapperTest.java | 31 +++++++++++++++---- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/externalissue/sarif/RuleMapper.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/externalissue/sarif/RuleMapper.java index 5638088fd11..1c4f387fc20 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/externalissue/sarif/RuleMapper.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/externalissue/sarif/RuleMapper.java @@ -20,6 +20,7 @@ package org.sonar.scanner.externalissue.sarif; import javax.annotation.Nullable; +import org.apache.commons.lang3.StringUtils; import org.sonar.api.batch.sensor.SensorContext; import org.sonar.api.batch.sensor.rule.NewAdHocRule; import org.sonar.api.scanner.ScannerSide; @@ -38,13 +39,25 @@ public class RuleMapper { } NewAdHocRule mapRule(ReportingDescriptor rule, String driverName, @Nullable Result.Level ruleSeverity, @Nullable Result.Level ruleSeverityForNewTaxonomy) { - return sensorContext.newAdHocRule() + + NewAdHocRule newAdHocRule = sensorContext.newAdHocRule() .severity(ResultMapper.toSonarQubeSeverity(ruleSeverity)) .type(ResultMapper.DEFAULT_TYPE) .ruleId(rule.getId()) .engineId(driverName) - .name(join(":", driverName, rule.getId())) .cleanCodeAttribute(ResultMapper.DEFAULT_CLEAN_CODE_ATTRIBUTE) .addDefaultImpact(ResultMapper.DEFAULT_SOFTWARE_QUALITY, ResultMapper.toSonarQubeImpactSeverity(ruleSeverityForNewTaxonomy)); + + if (rule.getShortDescription() != null && !StringUtils.isBlank(rule.getShortDescription().getText())) { + newAdHocRule.name(rule.getShortDescription().getText()); + } else { + newAdHocRule.name(join(":", driverName, rule.getId())); + } + + if (rule.getFullDescription() != null && !StringUtils.isBlank(rule.getFullDescription().getText())) { + newAdHocRule.description(rule.getFullDescription().getText()); + } + + return newAdHocRule; } } diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/externalissue/sarif/RuleMapperTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/externalissue/sarif/RuleMapperTest.java index da6cb4137f2..5dbf2c36aad 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/externalissue/sarif/RuleMapperTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/externalissue/sarif/RuleMapperTest.java @@ -29,6 +29,7 @@ import org.mockito.MockitoAnnotations; import org.sonar.api.batch.sensor.SensorContext; import org.sonar.api.batch.sensor.rule.NewAdHocRule; import org.sonar.api.batch.sensor.rule.internal.DefaultAdHocRule; +import org.sonar.sarif.pojo.MultiformatMessageString; import org.sonar.sarif.pojo.ReportingDescriptor; import static org.assertj.core.api.Assertions.assertThat; @@ -40,6 +41,8 @@ public class RuleMapperTest { private static final String RULE_ID = "test_rules_id"; private static final String DRIVER_NAME = "driverName"; + private static final String SHORT_DESCRIPTION = "short_description"; + private static final String LONG_DESCRIPTION = "loooooooooooooooooooooong description of the rule"; @Mock private SensorContext sensorContext; @@ -56,7 +59,28 @@ public class RuleMapperTest { @Test public void mapRule_shouldCorrectlyMapToNewAdHocRule() { ReportingDescriptor rule = new ReportingDescriptor().withId(RULE_ID); - NewAdHocRule expected = new DefaultAdHocRule() + NewAdHocRule expected = buildDefaultExpected(); + + NewAdHocRule result = ruleMapper.mapRule(rule, DRIVER_NAME, WARNING, WARNING); + assertThat(result).usingRecursiveComparison().isEqualTo(expected); + } + + @Test + public void bbmapRule_shouldCorrectlyMapToNewAdHocRuleWithDescription() { + ReportingDescriptor rule = new ReportingDescriptor() + .withId(RULE_ID) + .withShortDescription(new MultiformatMessageString().withText(SHORT_DESCRIPTION)) + .withFullDescription(new MultiformatMessageString().withText(LONG_DESCRIPTION)); + NewAdHocRule expected = buildDefaultExpected() + .name(SHORT_DESCRIPTION) + .description(LONG_DESCRIPTION); + + NewAdHocRule result = ruleMapper.mapRule(rule, DRIVER_NAME, WARNING, WARNING); + assertThat(result).usingRecursiveComparison().isEqualTo(expected); + } + + private static DefaultAdHocRule buildDefaultExpected() { + return new DefaultAdHocRule() .severity(ResultMapper.DEFAULT_SEVERITY) .type(ResultMapper.DEFAULT_TYPE) .ruleId(RULE_ID) @@ -64,10 +88,5 @@ public class RuleMapperTest { .name(String.join(":", DRIVER_NAME, RULE_ID)) .cleanCodeAttribute(ResultMapper.DEFAULT_CLEAN_CODE_ATTRIBUTE) .addDefaultImpact(ResultMapper.DEFAULT_SOFTWARE_QUALITY, org.sonar.api.issue.impact.Severity.MEDIUM); - - NewAdHocRule result = ruleMapper.mapRule(rule, DRIVER_NAME, WARNING, WARNING); - - assertThat(result).usingRecursiveComparison().isEqualTo(expected); } - } -- 2.39.5