}
public static HotspotRuleDescription from(RuleDefinitionDto dto) {
- String description = dto.getDescription();
+ String description = dto.isCustomRule() ? RuleDescriptionFormatter.getDescriptionAsHtml(dto) : dto.getDescription();
return from(description);
}
if (endIndex == -1) {
endIndex = description.length();
}
- return new String[] {
+ return new String[]{
description.substring(0, beginningIndex) + description.substring(endIndex),
description.substring(beginningIndex, endIndex)
};
} else {
- return new String[] {description, ""};
+ return new String[]{description, ""};
}
}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2021 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.server.rule;
+
+import org.sonar.db.rule.RuleDefinitionDto;
+import org.sonar.db.rule.RuleDto;
+import org.sonar.markdown.Markdown;
+
+import static java.lang.String.format;
+
+public class RuleDescriptionFormatter {
+
+ private RuleDescriptionFormatter() { /* static helpers */ }
+
+ public static String getDescriptionAsHtml(RuleDefinitionDto ruleDto) {
+ String description = ruleDto.getDescription();
+ RuleDto.Format descriptionFormat = ruleDto.getDescriptionFormat();
+ if (description != null && descriptionFormat != null) {
+ switch (descriptionFormat) {
+ case MARKDOWN:
+ return Markdown.convertToHtml(description);
+ case HTML:
+ return description;
+ default:
+ throw new IllegalStateException(format("Rule description format '%s' is unknown for key '%s'", descriptionFormat, ruleDto.getKey().toString()));
+ }
+ }
+ return null;
+ }
+
+}
import org.junit.Test;
import org.junit.runner.RunWith;
import org.sonar.db.rule.RuleDefinitionDto;
+import org.sonar.db.rule.RuleDto;
import org.sonar.db.rule.RuleTesting;
import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic;
assertThat(result.getFixIt().get()).isEqualTo(RECOMMENTEDCODINGPRACTICE + SEE);
}
+ @Test
+ public void parse_custom_rule_description() {
+ String ruleDescription = "This is the custom rule description";
+ String exceptionsContent = "This the exceptions section content";
+ String askContent = "This is the ask section content";
+ String recommendedContent = "This is the recommended section content";
+
+ RuleDefinitionDto dto = RuleTesting.newRule()
+ .setTemplateUuid("123")
+ .setDescriptionFormat(RuleDto.Format.MARKDOWN)
+ .setDescription(
+ ruleDescription + "\n"
+ + "== Exceptions" + "\n"
+ + exceptionsContent + "\n"
+ + "== Ask Yourself Whether" + "\n"
+ + askContent + "\n"
+ + "== Recommended Secure Coding Practices" + "\n"
+ + recommendedContent + "\n"
+ );
+
+ HotspotRuleDescription result = HotspotRuleDescription.from(dto);
+
+ assertThat(result.getRisk().get()).hasToString(
+ ruleDescription + "<br/>"
+ + "<h2>Exceptions</h2>"
+ + exceptionsContent + "<br/>"
+ );
+ assertThat(result.getVulnerable().get()).hasToString(
+ "<h2>Ask Yourself Whether</h2>"
+ + askContent + "<br/>"
+ );
+ assertThat(result.getFixIt().get()).hasToString(
+ "<h2>Recommended Secure Coding Practices</h2>"
+ + recommendedContent + "<br/>"
+ );
+ }
+
/*
* Bunch of static constant to create rule description.
*/
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2021 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.server.rule;
+
+import org.junit.Test;
+import org.sonar.db.rule.RuleDefinitionDto;
+import org.sonar.db.rule.RuleDto;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class RuleDescriptionFormatterTest {
+
+ @Test
+ public void getMarkdownDescriptionAsHtml() {
+ RuleDefinitionDto rule = new RuleDefinitionDto().setDescription("*md* ``description``").setDescriptionFormat(RuleDto.Format.MARKDOWN);
+ String html = RuleDescriptionFormatter.getDescriptionAsHtml(rule);
+ assertThat(html).isEqualTo("<strong>md</strong> <code>description</code>");
+ }
+
+ @Test
+ public void getHtmlDescriptionAsIs() {
+ String description = "<span class=\"example\">*md* ``description``</span>";
+ RuleDefinitionDto rule = new RuleDefinitionDto().setDescription(description).setDescriptionFormat(RuleDto.Format.HTML);
+ String html = RuleDescriptionFormatter.getDescriptionAsHtml(rule);
+ assertThat(html).isEqualTo(description);
+ }
+
+ @Test
+ public void handleNullDescription() {
+ RuleDefinitionDto rule = new RuleDefinitionDto().setDescription(null).setDescriptionFormat(RuleDto.Format.HTML);
+ String result = RuleDescriptionFormatter.getDescriptionAsHtml(rule);
+ assertThat(result).isNull();
+ }
+
+ @Test
+ public void handleNullDescriptionFormat() {
+ RuleDefinitionDto rule = new RuleDefinitionDto().setDescription("whatever").setDescriptionFormat(null);
+ String result = RuleDescriptionFormatter.getDescriptionAsHtml(rule);
+ assertThat(result).isNull();
+ }
+}
import org.sonar.server.issue.TextRangeResponseFormatter;
import org.sonar.server.issue.ws.UserResponseFormatter;
import org.sonar.server.rule.HotspotRuleDescription;
-import org.sonar.server.rule.RuleDescriptionFormatter;
import org.sonar.server.security.SecurityStandards;
import org.sonar.server.text.MacroInterpreter;
import org.sonarqube.ws.Common;
.setSecurityCategory(sqCategory.getKey())
.setVulnerabilityProbability(sqCategory.getVulnerability().name());
- if (ruleDefinitionDto.isCustomRule()) {
- String htmlDescription = RuleDescriptionFormatter.getDescriptionAsHtml(ruleDefinitionDto);
- if (htmlDescription != null) {
- ruleBuilder.setRiskDescription(macroInterpreter.interpret(htmlDescription));
- }
- } else {
- HotspotRuleDescription hotspotRuleDescription = HotspotRuleDescription.from(ruleDefinitionDto);
- hotspotRuleDescription.getVulnerable().ifPresent(ruleBuilder::setVulnerabilityDescription);
- hotspotRuleDescription.getRisk().ifPresent(ruleBuilder::setRiskDescription);
- hotspotRuleDescription.getFixIt().ifPresent(ruleBuilder::setFixRecommendations);
- }
+ HotspotRuleDescription hotspotRuleDescription = HotspotRuleDescription.from(ruleDefinitionDto);
+ hotspotRuleDescription.getVulnerable().ifPresent(ruleBuilder::setVulnerabilityDescription);
+ hotspotRuleDescription.getRisk().ifPresent(ruleBuilder::setRiskDescription);
+ hotspotRuleDescription.getFixIt().ifPresent(ruleBuilder::setFixRecommendations);
responseBuilder.setRule(ruleBuilder.build());
}
boolean hotspotOnProject = Objects.equals(project.uuid(), componentUuid);
ComponentDto component = hotspotOnProject ? project
: dbClient.componentDao().selectByUuid(dbSession, componentUuid)
- .orElseThrow(() -> new NotFoundException(format("Component with uuid '%s' does not exist", componentUuid)));
+ .orElseThrow(() -> new NotFoundException(format("Component with uuid '%s' does not exist", componentUuid)));
return new Components(project, component);
}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2021 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.rule;
-
-import org.sonar.db.rule.RuleDefinitionDto;
-import org.sonar.db.rule.RuleDto;
-import org.sonar.markdown.Markdown;
-
-import static java.lang.String.format;
-
-public class RuleDescriptionFormatter {
-
- private RuleDescriptionFormatter() { /* static helpers */ }
-
- public static String getDescriptionAsHtml(RuleDefinitionDto ruleDto) {
- String description = ruleDto.getDescription();
- RuleDto.Format descriptionFormat = ruleDto.getDescriptionFormat();
- if (description != null && descriptionFormat != null) {
- switch (descriptionFormat) {
- case MARKDOWN:
- return Markdown.convertToHtml(description);
- case HTML:
- return description;
- default:
- throw new IllegalStateException(format("Rule description format '%s' is unknown for key '%s'", descriptionFormat, ruleDto.getKey().toString()));
- }
- }
- return null;
- }
-
-}
userSessionRule.logIn().addProjectPermission(UserRole.USER, project);
ComponentDto file = dbTester.components().insertComponent(newFileDto(project));
- String description = "<div>line1\nline2</div>";
- String parsedDescription = "<div>line1<br/>line2</div>";
- String resultingDescription = "!" + parsedDescription + "!";
+ String description = "== Title\n<div>line1\nline2</div>";
RuleDefinitionDto rule = newRule(SECURITY_HOTSPOT,
r -> r.setTemplateUuid("123")
.setDescription(description)
.setDescriptionFormat(MARKDOWN));
- doReturn(resultingDescription).when(macroInterpreter).interpret(parsedDescription);
-
IssueDto hotspot = dbTester.issues().insertHotspot(rule, project, file);
mockChangelogAndCommentsFormattingContext();
Hotspots.ShowWsResponse response = newRequest(hotspot)
.executeProtobuf(Hotspots.ShowWsResponse.class);
- assertThat(response.getRule().getRiskDescription()).isEqualTo(resultingDescription);
+ assertThat(response.getRule().getRiskDescription()).isEqualTo("<h2>Title</h2><div>line1<br/>line2</div>");
}
@Test
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2021 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.rule;
-
-import org.junit.Test;
-import org.sonar.db.rule.RuleDefinitionDto;
-import org.sonar.db.rule.RuleDto;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-public class RuleDescriptionFormatterTest {
-
- @Test
- public void getMarkdownDescriptionAsHtml() {
- RuleDefinitionDto rule = new RuleDefinitionDto().setDescription("*md* ``description``").setDescriptionFormat(RuleDto.Format.MARKDOWN);
- String html = RuleDescriptionFormatter.getDescriptionAsHtml(rule);
- assertThat(html).isEqualTo("<strong>md</strong> <code>description</code>");
- }
-
- @Test
- public void getHtmlDescriptionAsIs() {
- String description = "<span class=\"example\">*md* ``description``</span>";
- RuleDefinitionDto rule = new RuleDefinitionDto().setDescription(description).setDescriptionFormat(RuleDto.Format.HTML);
- String html = RuleDescriptionFormatter.getDescriptionAsHtml(rule);
- assertThat(html).isEqualTo(description);
- }
-
- @Test
- public void handleNullDescription() {
- RuleDefinitionDto rule = new RuleDefinitionDto().setDescription(null).setDescriptionFormat(RuleDto.Format.HTML);
- String result = RuleDescriptionFormatter.getDescriptionAsHtml(rule);
- assertThat(result).isNull();
- }
-
- @Test
- public void handleNullDescriptionFormat() {
- RuleDefinitionDto rule = new RuleDefinitionDto().setDescription("whatever").setDescriptionFormat(null);
- String result = RuleDescriptionFormatter.getDescriptionAsHtml(rule);
- assertThat(result).isNull();
- }
-}
CharSequence headingText = token.subSequence(index, token.length());
output.append("<h" + headingLevel + ">");
- output.append(headingText);
+ output.append(headingText.toString().trim());
output.append("</h" + headingLevel + ">");
}
}
@Test
public void shouldDecorateHeadings() {
- assertThat(Markdown.convertToHtml(" = Top\r== Sub\r\n=== Subsub\n ==== \n 1.five"))
- .isEqualTo("<h1>Top\r</h1><h2>Sub\r\n</h2><h3>Subsub\n</h3><h4></h4> 1.five");
+ assertThat(Markdown.convertToHtml(" = Top\r== Sub\r\n=== Sub sub\n ==== \n 1.five"))
+ .isEqualTo("<h1>Top</h1><h2>Sub</h2><h3>Sub sub</h3><h4></h4> 1.five");
}
@Test