From e1084ab0bee42625105ff332365b05ab30654d47 Mon Sep 17 00:00:00 2001 From: Alban Auzeill Date: Mon, 23 Dec 2019 14:38:46 +0100 Subject: Send file content to NodeJS process if encoding not UFT-8 (#224) --- .../src/main/java/org/sonar/css/plugin/CssRuleSensor.java | 13 ++++++++++--- .../org/sonar/css/plugin/server/AnalyzerBridgeServer.java | 11 ++++++++++- 2 files changed, 20 insertions(+), 4 deletions(-) (limited to 'sonar-css-plugin/src/main/java') diff --git a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRuleSensor.java b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRuleSensor.java index 644ece8..3b32501 100644 --- a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRuleSensor.java +++ b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRuleSensor.java @@ -35,6 +35,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.StreamSupport; import javax.annotation.Nullable; +import org.sonar.api.SonarProduct; import org.sonar.api.batch.fs.FilePredicate; import org.sonar.api.batch.fs.FilePredicates; import org.sonar.api.batch.fs.FileSystem; @@ -51,8 +52,8 @@ import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; import org.sonar.css.plugin.CssRules.StylelintConfig; import org.sonar.css.plugin.server.AnalyzerBridgeServer.Issue; -import org.sonar.css.plugin.server.CssAnalyzerBridgeServer; import org.sonar.css.plugin.server.AnalyzerBridgeServer.Request; +import org.sonar.css.plugin.server.CssAnalyzerBridgeServer; import org.sonar.css.plugin.server.exception.ServerAlreadyFailedException; import org.sonarsource.analyzer.commons.ProgressReport; import org.sonarsource.nodejs.NodeCommandException; @@ -140,7 +141,7 @@ public class CssRuleSensor implements Sensor { try { analyzeFile(context, inputFile, configFile); } catch (IOException | RuntimeException e) { - throw new IOException("Failure during analysis of " + inputFile.uri() + ": " + e.getMessage()); + throw new IOException("Failure during analysis of " + inputFile.uri() + ": " + e.getMessage(), e); } progressReport.nextFile(); } else { @@ -164,13 +165,19 @@ public class CssRuleSensor implements Sensor { LOG.debug("Skipping {} as it has not 'file' scheme", uri); return; } - Request request = new Request(new File(uri).getAbsolutePath(), configFile.toString()); + String fileContent = shouldSendFileContent(context, inputFile) ? inputFile.contents() : null; + Request request = new Request(new File(uri).getAbsolutePath(), fileContent, configFile.toString()); LOG.debug("Analyzing " + request.filePath); Issue[] issues = cssAnalyzerBridgeServer.analyze(request); LOG.debug("Found {} issue(s)", issues.length); saveIssues(context, inputFile, issues); } + private static boolean shouldSendFileContent(SensorContext context, InputFile file) { + return context.runtime().getProduct() == SonarProduct.SONARLINT + || !StandardCharsets.UTF_8.equals(file.charset()); + } + private void saveIssues(SensorContext context, InputFile inputFile, Issue[] issues) { for (Issue issue : issues) { NewIssue sonarIssue = context.newIssue(); diff --git a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/server/AnalyzerBridgeServer.java b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/server/AnalyzerBridgeServer.java index 0656b06..56481ec 100644 --- a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/server/AnalyzerBridgeServer.java +++ b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/server/AnalyzerBridgeServer.java @@ -20,6 +20,7 @@ package org.sonar.css.plugin.server; import java.io.IOException; +import javax.annotation.Nullable; import org.sonar.api.Startable; import org.sonar.api.batch.sensor.SensorContext; import org.sonar.api.scanner.ScannerSide; @@ -41,10 +42,18 @@ public interface AnalyzerBridgeServer extends Startable { class Request { public final String filePath; + /** + * The fileContent is sent only in the SonarLint context or when the encoding + * of the file is not utf-8. Otherwise, for performance reason, it's more efficient to + * not have the fileContent and let the server getting it using filePath. + */ + @Nullable + public final String fileContent; public final String configFile; - public Request(String filePath, String configFile) { + public Request(String filePath, @Nullable String fileContent, String configFile) { this.filePath = filePath; + this.fileContent = fileContent; this.configFile = configFile; } } -- cgit v1.2.3