diff options
author | Léo Geoffroy <99647462+leo-geoffroy-sonarsource@users.noreply.github.com> | 2022-04-27 10:53:10 +0200 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2022-05-06 20:02:43 +0000 |
commit | 63c72abe86c9b5a9fa15a40406ede811128d075c (patch) | |
tree | d611d907ce780e4a36a6c9938f5c4dfbe52e8a81 /server/sonar-server-common | |
parent | c333b3ae6984bf1b402d3398fa71de7f0a75b817 (diff) | |
download | sonarqube-63c72abe86c9b5a9fa15a40406ede811128d075c.tar.gz sonarqube-63c72abe86c9b5a9fa15a40406ede811128d075c.zip |
SONAR-16302 add management of indexing for rules description sections
Diffstat (limited to 'server/sonar-server-common')
4 files changed, 65 insertions, 14 deletions
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/rule/HotspotRuleDescription.java b/server/sonar-server-common/src/main/java/org/sonar/server/rule/HotspotRuleDescription.java index b3b27628cb0..c59cb3cb362 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/rule/HotspotRuleDescription.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/rule/HotspotRuleDescription.java @@ -53,7 +53,7 @@ public class HotspotRuleDescription { } public static HotspotRuleDescription from(RuleForIndexingDto dto) { - return from(dto.getDescription()); + return from(RuleDescriptionFormatter.getDescriptionAsHtml(dto)); } private static HotspotRuleDescription from(@Nullable String description) { diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/rule/RuleDescriptionFormatter.java b/server/sonar-server-common/src/main/java/org/sonar/server/rule/RuleDescriptionFormatter.java index 2cae26e2695..f4a61eec7cd 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/rule/RuleDescriptionFormatter.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/rule/RuleDescriptionFormatter.java @@ -25,6 +25,7 @@ import java.util.Optional; import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.rule.RuleDescriptionSectionDto; import org.sonar.db.rule.RuleDto; +import org.sonar.db.rule.RuleForIndexingDto; import org.sonar.markdown.Markdown; import static com.google.common.collect.MoreCollectors.toOptional; @@ -39,28 +40,42 @@ public class RuleDescriptionFormatter { return null; } Collection<RuleDescriptionSectionDto> ruleDescriptionSectionDtos = ruleDefinitionDto.getRuleDescriptionSectionDtos(); + return retrieveDescription(ruleDescriptionSectionDtos, ruleDefinitionDto.getRuleKey(), ruleDefinitionDto.getDescriptionFormat()); + } + + public static String getDescriptionAsHtml(RuleForIndexingDto ruleForIndexingDto) { + if (ruleForIndexingDto.getDescriptionFormat() == null) { + return null; + } + Collection<RuleDescriptionSectionDto> ruleDescriptionSectionDtos = ruleForIndexingDto.getRuleDescriptionSectionsDtos(); + return retrieveDescription(ruleDescriptionSectionDtos, ruleForIndexingDto.getRuleKey().toString(), ruleForIndexingDto.getDescriptionFormat()); + } + + private static String retrieveDescription(Collection<RuleDescriptionSectionDto> ruleDescriptionSectionDtos, + String ruleKey, RuleDto.Format descriptionFormat) { Optional<RuleDescriptionSectionDto> ruleDescriptionSectionDto = findDefaultDescription(ruleDescriptionSectionDtos); return ruleDescriptionSectionDto - .map(ruleDescriptionSection -> toHtml(ruleDefinitionDto, ruleDescriptionSection)) + .map(ruleDescriptionSection -> toHtml(ruleKey, descriptionFormat, ruleDescriptionSection)) .orElse(null); } + private static Optional<RuleDescriptionSectionDto> findDefaultDescription(Collection<RuleDescriptionSectionDto> ruleDescriptionSectionDtos) { return ruleDescriptionSectionDtos.stream() .filter(RuleDescriptionSectionDto::isDefault) .collect(toOptional()); } - private static String toHtml(RuleDefinitionDto ruleDefinitionDto, RuleDescriptionSectionDto ruleDescriptionSectionDto) { - RuleDto.Format descriptionFormat = Objects.requireNonNull(ruleDefinitionDto.getDescriptionFormat(), - "Rule " + ruleDefinitionDto.getDescriptionFormat() + " contains section(s) but has no format set"); - switch (descriptionFormat) { + private static String toHtml(String ruleKey, RuleDto.Format descriptionFormat, RuleDescriptionSectionDto ruleDescriptionSectionDto) { + RuleDto.Format nonNullDescriptionFormat = Objects.requireNonNull(descriptionFormat, + "Rule " + descriptionFormat + " contains section(s) but has no format set"); + switch (nonNullDescriptionFormat) { case MARKDOWN: return Markdown.convertToHtml(ruleDescriptionSectionDto.getDescription()); case HTML: return ruleDescriptionSectionDto.getDescription(); default: - throw new IllegalStateException(format("Rule description section format '%s' is unknown for rule key '%s'", descriptionFormat, ruleDefinitionDto.getKey())); + throw new IllegalStateException(format("Rule description section format '%s' is unknown for rule key '%s'", descriptionFormat, ruleKey)); } } diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleDoc.java b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleDoc.java index 5ce56bdec82..292dbfb30a8 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleDoc.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleDoc.java @@ -37,6 +37,7 @@ import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleForIndexingDto; import org.sonar.markdown.Markdown; import org.sonar.server.es.BaseDoc; +import org.sonar.server.rule.RuleDescriptionFormatter; import org.sonar.server.security.SecurityStandards; import org.sonar.server.security.SecurityStandards.SQCategory; @@ -318,13 +319,8 @@ public class RuleDoc extends BaseDoc { ruleDoc.setTemplateKey(null); } - if (dto.getDescription() != null && dto.getDescriptionFormat() != null) { - if (RuleDto.Format.HTML == dto.getDescriptionFormat()) { - ruleDoc.setHtmlDescription(dto.getDescription()); - } else { - ruleDoc.setHtmlDescription(Markdown.convertToHtml(dto.getDescription())); - } - } + String descriptionAsHtml = RuleDescriptionFormatter.getDescriptionAsHtml(dto); + ruleDoc.setHtmlDescription(descriptionAsHtml); return ruleDoc; } } diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/rule/RuleDescriptionFormatterTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/rule/RuleDescriptionFormatterTest.java index ca8ca7d6da2..25e492ebb80 100644 --- a/server/sonar-server-common/src/test/java/org/sonar/server/rule/RuleDescriptionFormatterTest.java +++ b/server/sonar-server-common/src/test/java/org/sonar/server/rule/RuleDescriptionFormatterTest.java @@ -19,10 +19,15 @@ */ package org.sonar.server.rule; +import com.google.common.collect.Sets; +import java.util.Collections; +import java.util.Set; +import org.jetbrains.annotations.NotNull; import org.junit.Test; import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.rule.RuleDescriptionSectionDto; import org.sonar.db.rule.RuleDto; +import org.sonar.db.rule.RuleForIndexingDto; import static org.assertj.core.api.Assertions.assertThat; import static org.sonar.db.rule.RuleDescriptionSectionDto.createDefaultRuleDescriptionSection; @@ -60,4 +65,39 @@ public class RuleDescriptionFormatterTest { String result = RuleDescriptionFormatter.getDescriptionAsHtml(rule); assertThat(result).isNull(); } + + @Test + public void getHtmlDescriptionForRuleForIndexingDtoAsIs() { + Set<RuleDescriptionSectionDto> sectionsDtos = Sets.newHashSet( + createDefaultRuleDescriptionSection("uuid", HTML_SECTION.getDescription())); + RuleForIndexingDto rule = createRuleForIndexingDto(sectionsDtos, RuleDto.Format.HTML); + String html = RuleDescriptionFormatter.getDescriptionAsHtml(rule); + assertThat(html).isEqualTo(HTML_SECTION.getDescription()); + } + + @Test + public void handleEmptyDescriptionForRuleForIndexingDto() { + RuleForIndexingDto rule = createRuleForIndexingDto(Collections.emptySet(), RuleDto.Format.HTML); + String result = RuleDescriptionFormatter.getDescriptionAsHtml(rule); + assertThat(result).isNull(); + } + + @Test + public void handleNullDescriptionFormatForRuleForIndexingDto() { + Set<RuleDescriptionSectionDto> sectionsDtos = Sets.newHashSet( + createDefaultRuleDescriptionSection("uuid", HTML_SECTION.getDescription())); + RuleForIndexingDto rule = createRuleForIndexingDto(sectionsDtos, null); + String result = RuleDescriptionFormatter.getDescriptionAsHtml(rule); + assertThat(result).isNull(); + } + + @NotNull + private static RuleForIndexingDto createRuleForIndexingDto(Set<RuleDescriptionSectionDto> sectionsDtos, RuleDto.Format format) { + RuleForIndexingDto rule = new RuleForIndexingDto(); + rule.setRuleDescriptionSectionsDtos(sectionsDtos); + rule.setDescriptionFormat(format); + rule.setRepository("repository"); + rule.setPluginRuleKey("pluginKey"); + return rule; + } } |