From fd0139f0673ceaeabab4db3112cf18fff69f3c81 Mon Sep 17 00:00:00 2001 From: Elena Vilchik Date: Wed, 12 Jun 2019 11:53:55 +0200 Subject: Support stylelint report in different encoding (#176) --- .../org/sonar/css/plugin/StylelintReportSensor.java | 15 +++++++++++---- .../sonar/css/plugin/StylelintReportSensorTest.java | 20 +++++++++++++++++++- .../resources/stylelint-report/report-utf16.json | Bin 0 -> 668 bytes .../resources/stylelint-report/report-utf8-bom.json | 17 +++++++++++++++++ 4 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 sonar-css-plugin/src/test/resources/stylelint-report/report-utf16.json create mode 100644 sonar-css-plugin/src/test/resources/stylelint-report/report-utf8-bom.json diff --git a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/StylelintReportSensor.java b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/StylelintReportSensor.java index 106f9a3..c694d9d 100644 --- a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/StylelintReportSensor.java +++ b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/StylelintReportSensor.java @@ -22,12 +22,14 @@ package org.sonar.css.plugin; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.List; import javax.annotation.Nullable; +import org.apache.commons.io.ByteOrderMark; +import org.apache.commons.io.input.BOMInputStream; import org.sonar.api.batch.fs.FilePredicates; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.rule.CheckFactory; @@ -50,9 +52,9 @@ public class StylelintReportSensor implements Sensor { public static final String STYLELINT = "stylelint"; - private static final Logger LOG = Loggers.get(StylelintReportSensor.class); private static final String FILE_EXCEPTION_MESSAGE = "No issues information will be saved as the report file can't be read."; + private static final ByteOrderMark[] BYTE_ORDER_MARKS = {ByteOrderMark.UTF_8, ByteOrderMark.UTF_16LE, ByteOrderMark.UTF_16BE, ByteOrderMark.UTF_32LE, ByteOrderMark.UTF_32BE}; private final CssRules cssRules; private ExternalRuleLoader stylelintRuleLoader = getStylelintRuleLoader(); @@ -78,8 +80,13 @@ public class StylelintReportSensor implements Sensor { private void importReport(File report, SensorContext context) { LOG.info("Importing {}", report.getAbsoluteFile()); - try (InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(report), StandardCharsets.UTF_8)) { - IssuesPerFile[] issues = new Gson().fromJson(inputStreamReader, IssuesPerFile[].class); + try (BOMInputStream bomInputStream = new BOMInputStream(Files.newInputStream(report.toPath()), BYTE_ORDER_MARKS)) { + String charsetName = bomInputStream.getBOMCharsetName(); + if (charsetName == null) { + charsetName = StandardCharsets.UTF_8.name(); + } + + IssuesPerFile[] issues = new Gson().fromJson(new InputStreamReader(bomInputStream, charsetName), IssuesPerFile[].class); for (IssuesPerFile issuesPerFile : issues) { InputFile inputFile = getInputFile(context, issuesPerFile.source); if (inputFile != null) { diff --git a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/StylelintReportSensorTest.java b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/StylelintReportSensorTest.java index 295cf7f..62974d9 100644 --- a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/StylelintReportSensorTest.java +++ b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/StylelintReportSensorTest.java @@ -71,7 +71,7 @@ public class StylelintReportSensorTest { } @Test - public void should_add_issues_from_report() throws Exception { + public void should_add_issues_from_report() { setReport("report.json"); stylelintReportSensor.execute(context); @@ -90,6 +90,24 @@ public class StylelintReportSensorTest { assertThat(first.primaryLocation().textRange().start().line()).isEqualTo(1); } + @Test + public void should_read_report_utf8_bom() { + setReport("report-utf8-bom.json"); + stylelintReportSensor.execute(context); + + Collection externalIssues = context.allExternalIssues(); + assertThat(externalIssues).hasSize(2); + } + + @Test + public void should_read_report_utf16() { + setReport("report-utf16.json"); + stylelintReportSensor.execute(context); + + Collection externalIssues = context.allExternalIssues(); + assertThat(externalIssues).hasSize(2); + } + @Test public void should_support_absolute_file_paths_in_report() throws Exception { String report = "[\n" + diff --git a/sonar-css-plugin/src/test/resources/stylelint-report/report-utf16.json b/sonar-css-plugin/src/test/resources/stylelint-report/report-utf16.json new file mode 100644 index 0000000..1fd449a Binary files /dev/null and b/sonar-css-plugin/src/test/resources/stylelint-report/report-utf16.json differ diff --git a/sonar-css-plugin/src/test/resources/stylelint-report/report-utf8-bom.json b/sonar-css-plugin/src/test/resources/stylelint-report/report-utf8-bom.json new file mode 100644 index 0000000..4f685c4 --- /dev/null +++ b/sonar-css-plugin/src/test/resources/stylelint-report/report-utf8-bom.json @@ -0,0 +1,17 @@ +[ + { + "source": "file.css", + "warnings": [ + { + "line": 1, + "rule": "color-no-invalid-hex", + "text": "external issue message (color-no-invalid-hex)" + }, + { + "line": 1, + "rule": "comment-no-empty", + "text": "external issue message (comment-no-empty)" + } + ] + } +] -- cgit v1.2.3