aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-server-common
diff options
context:
space:
mode:
authorLéo Geoffroy <99647462+leo-geoffroy-sonarsource@users.noreply.github.com>2022-04-27 10:53:10 +0200
committersonartech <sonartech@sonarsource.com>2022-05-06 20:02:43 +0000
commit63c72abe86c9b5a9fa15a40406ede811128d075c (patch)
treed611d907ce780e4a36a6c9938f5c4dfbe52e8a81 /server/sonar-server-common
parentc333b3ae6984bf1b402d3398fa71de7f0a75b817 (diff)
downloadsonarqube-63c72abe86c9b5a9fa15a40406ede811128d075c.tar.gz
sonarqube-63c72abe86c9b5a9fa15a40406ede811128d075c.zip
SONAR-16302 add management of indexing for rules description sections
Diffstat (limited to 'server/sonar-server-common')
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/rule/HotspotRuleDescription.java2
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/rule/RuleDescriptionFormatter.java27
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleDoc.java10
-rw-r--r--server/sonar-server-common/src/test/java/org/sonar/server/rule/RuleDescriptionFormatterTest.java40
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;
+ }
}