From 533146247454128709675a98c7959b6bea079fcd Mon Sep 17 00:00:00 2001 From: Filipe Esperandio Date: Fri, 13 Oct 2017 15:59:42 -0300 Subject: [PATCH 1/4] Override workdir to avoid having to copy files into a RW directory --- Dockerfile | 2 +- src/main/java/cc/App.java | 4 +- src/main/java/cc/Config.java | 10 +++++ .../java/cc/analysis/SonarLintFactory.java | 34 ++++++++++++++++ .../java/cc/analysis/StandaloneSonarLint.java | 39 +++++++++++++++++++ .../cli/analysis/LogOutputWrapper.java | 9 +++++ .../cli/analysis/SonarLintFactoryWrapper.java | 20 ++++++++++ src/test/java/cc/ConfigTest.java | 13 +++++++ 8 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 src/main/java/cc/analysis/SonarLintFactory.java create mode 100644 src/main/java/cc/analysis/StandaloneSonarLint.java create mode 100644 src/main/java/org/sonarlint/cli/analysis/LogOutputWrapper.java create mode 100644 src/main/java/org/sonarlint/cli/analysis/SonarLintFactoryWrapper.java diff --git a/Dockerfile b/Dockerfile index a32d82e..7e501eb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -39,4 +39,4 @@ RUN gradle clean build -x test USER app WORKDIR /code -CMD cp -R /code /tmp/ && /usr/src/app/build/codeclimate-sonar /tmp/code /config.json \ No newline at end of file +CMD /usr/src/app/build/codeclimate-sonar /code /config.json diff --git a/src/main/java/cc/App.java b/src/main/java/cc/App.java index 0700474..668fcc9 100644 --- a/src/main/java/cc/App.java +++ b/src/main/java/cc/App.java @@ -1,10 +1,10 @@ package cc; +import cc.analysis.SonarLintFactory; import cc.files.Finder; import org.sonarlint.cli.EngineWrapper; import org.sonarlint.cli.InputFileFinder; import org.sonarlint.cli.Options; -import org.sonarlint.cli.analysis.SonarLintFactory; import org.sonarlint.cli.config.ConfigurationReader; import org.sonarlint.cli.report.ReportFactory; import org.sonarlint.cli.util.System2; @@ -30,7 +30,7 @@ public static void execute(System2 system) { InputFileFinder fileFinder = new Finder(config.getIncludePaths(), config.getTestsPatterns(), charset); ReportFactory reportFactory = new cc.report.ReportFactory(charset); ConfigurationReader reader = new ConfigurationReader(); - SonarLintFactory sonarLintFactory = new SonarLintFactory(reader); + org.sonarlint.cli.analysis.SonarLintFactory sonarLintFactory = new SonarLintFactory(reader, config.getWorkdir()); Path projectHome = getProjectHome(system); int exitCode = new EngineWrapper(new Options(), sonarLintFactory, reportFactory, fileFinder, projectHome).run(); diff --git a/src/main/java/cc/Config.java b/src/main/java/cc/Config.java index ab48993..bc3d761 100644 --- a/src/main/java/cc/Config.java +++ b/src/main/java/cc/Config.java @@ -7,6 +7,8 @@ import java.io.FileReader; import java.nio.charset.Charset; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Arrays; import java.util.List; @@ -17,6 +19,7 @@ public class Config { private class EngineConfig { String charset; List testsPatterns; + String workDir; } public List getIncludePaths() { @@ -31,6 +34,13 @@ public String getTestsPatterns() { return joinPatterns(config.testsPatterns); } + public Path getWorkdir() { + if (config.workDir == null) { + return Paths.get("/tmp/sonarlint"); + } + return Paths.get(config.workDir); + } + String joinPatterns(List patterns) { if (patterns == null) { return null; diff --git a/src/main/java/cc/analysis/SonarLintFactory.java b/src/main/java/cc/analysis/SonarLintFactory.java new file mode 100644 index 0000000..7cad59d --- /dev/null +++ b/src/main/java/cc/analysis/SonarLintFactory.java @@ -0,0 +1,34 @@ +package cc.analysis; + +import org.sonarlint.cli.analysis.LogOutputWrapper; +import org.sonarlint.cli.analysis.SonarLint; +import org.sonarlint.cli.config.ConfigurationReader; +import org.sonarlint.cli.util.Logger; +import org.sonarsource.sonarlint.core.StandaloneSonarLintEngineImpl; +import org.sonarsource.sonarlint.core.client.api.standalone.StandaloneGlobalConfiguration; +import org.sonarsource.sonarlint.core.client.api.standalone.StandaloneSonarLintEngine; + +import java.nio.file.Path; + +public class SonarLintFactory extends org.sonarlint.cli.analysis.SonarLintFactoryWrapper { + private static final Logger LOGGER = Logger.get(); + private Path workDir; + + public SonarLintFactory(ConfigurationReader reader, Path workDir) { + super(reader); + this.workDir = workDir; + } + + @Override + public SonarLint createSonarLint(Path projectHome, boolean mustBeConnected, boolean verbose) { + LOGGER.info("Standalone mode"); + + StandaloneGlobalConfiguration config = StandaloneGlobalConfiguration.builder() + .addPlugins(plugins()) + .setLogOutput(new LogOutputWrapper(LOGGER, verbose)) + .build(); + + StandaloneSonarLintEngine engine = new StandaloneSonarLintEngineImpl(config); + return new StandaloneSonarLint(engine, workDir); + } +} diff --git a/src/main/java/cc/analysis/StandaloneSonarLint.java b/src/main/java/cc/analysis/StandaloneSonarLint.java new file mode 100644 index 0000000..dd5ecd8 --- /dev/null +++ b/src/main/java/cc/analysis/StandaloneSonarLint.java @@ -0,0 +1,39 @@ +package cc.analysis; + +import org.sonarlint.cli.analysis.IssueCollector; +import org.sonarlint.cli.report.ReportFactory; +import org.sonarsource.sonarlint.core.client.api.common.analysis.AnalysisResults; +import org.sonarsource.sonarlint.core.client.api.common.analysis.ClientInputFile; +import org.sonarsource.sonarlint.core.client.api.standalone.StandaloneAnalysisConfiguration; +import org.sonarsource.sonarlint.core.client.api.standalone.StandaloneSonarLintEngine; +import org.sonarsource.sonarlint.core.tracking.IssueTrackable; +import org.sonarsource.sonarlint.core.tracking.Trackable; + +import java.nio.file.Path; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class StandaloneSonarLint extends org.sonarlint.cli.analysis.StandaloneSonarLint { + private StandaloneSonarLintEngine engine; + private Path workDir; + + public StandaloneSonarLint(StandaloneSonarLintEngine engine, Path workDir) { + super(engine); + this.engine = engine; + this.workDir = workDir; + } + + @Override + protected void doAnalysis(Map properties, ReportFactory reportFactory, List inputFiles, Path baseDirPath) { + Date start = new Date(); + + IssueCollector collector = new IssueCollector(); + StandaloneAnalysisConfiguration config = new StandaloneAnalysisConfiguration(baseDirPath, workDir, inputFiles, properties); + AnalysisResults result = engine.analyze(config, collector); + Collection trackables = collector.get().stream().map(IssueTrackable::new).collect(Collectors.toList()); + generateReports(trackables, result, reportFactory, baseDirPath.getFileName().toString(), baseDirPath, start); + } +} diff --git a/src/main/java/org/sonarlint/cli/analysis/LogOutputWrapper.java b/src/main/java/org/sonarlint/cli/analysis/LogOutputWrapper.java new file mode 100644 index 0000000..8ada1ac --- /dev/null +++ b/src/main/java/org/sonarlint/cli/analysis/LogOutputWrapper.java @@ -0,0 +1,9 @@ +package org.sonarlint.cli.analysis; + +import org.sonarlint.cli.util.Logger; + +public class LogOutputWrapper extends DefaultLogOutput { + public LogOutputWrapper(Logger logger, boolean verbose) { + super(logger, verbose); + } +} diff --git a/src/main/java/org/sonarlint/cli/analysis/SonarLintFactoryWrapper.java b/src/main/java/org/sonarlint/cli/analysis/SonarLintFactoryWrapper.java new file mode 100644 index 0000000..353e0be --- /dev/null +++ b/src/main/java/org/sonarlint/cli/analysis/SonarLintFactoryWrapper.java @@ -0,0 +1,20 @@ +package org.sonarlint.cli.analysis; + +import org.sonarlint.cli.config.ConfigurationReader; + +import java.net.URL; + +public class SonarLintFactoryWrapper extends SonarLintFactory { + public SonarLintFactoryWrapper(ConfigurationReader configurationReader) { + super(configurationReader); + } + + public URL[] plugins() { + try { + return loadPlugins(); + } catch (Exception e) { + throw new IllegalStateException("Error loading plugins", e); + } + + } +} diff --git a/src/test/java/cc/ConfigTest.java b/src/test/java/cc/ConfigTest.java index 3f33e3b..10e8e54 100644 --- a/src/test/java/cc/ConfigTest.java +++ b/src/test/java/cc/ConfigTest.java @@ -3,6 +3,7 @@ import org.junit.Test; import java.nio.charset.Charset; +import java.nio.file.Paths; import static org.assertj.core.api.Assertions.assertThat; @@ -43,4 +44,16 @@ public void null_tests_patterns_does_not_cause_error() throws Exception { Config config = Config.gson().fromJson("{\"config\":{}}", Config.class); assertThat(config.getTestsPatterns()).isNull(); } + + @Test + public void override_work_dir() throws Exception { + Config config = Config.gson().fromJson("{\"config\":{\"work_dir\":\"/tmp/wd\"}}", Config.class); + assertThat(config.getWorkdir()).isEqualTo(Paths.get("/tmp/wd")); + } + + @Test + public void has_default_work_dir() throws Exception { + Config config = Config.gson().fromJson("{}", Config.class); + assertThat(config.getWorkdir()).isEqualTo(Paths.get("/tmp/sonarlint")); + } } \ No newline at end of file From 1d3a2c9c9ae8d1129a481ce3304918c4dfce930d Mon Sep 17 00:00:00 2001 From: Filipe Esperandio Date: Fri, 13 Oct 2017 16:04:37 -0300 Subject: [PATCH 2/4] Remove line --- .../java/org/sonarlint/cli/analysis/SonarLintFactoryWrapper.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/sonarlint/cli/analysis/SonarLintFactoryWrapper.java b/src/main/java/org/sonarlint/cli/analysis/SonarLintFactoryWrapper.java index 353e0be..5e680f9 100644 --- a/src/main/java/org/sonarlint/cli/analysis/SonarLintFactoryWrapper.java +++ b/src/main/java/org/sonarlint/cli/analysis/SonarLintFactoryWrapper.java @@ -15,6 +15,5 @@ public URL[] plugins() { } catch (Exception e) { throw new IllegalStateException("Error loading plugins", e); } - } } From 8243c0bb52750e6b303023fe7ab941911d360041 Mon Sep 17 00:00:00 2001 From: Filipe Esperandio Date: Fri, 13 Oct 2017 16:13:19 -0300 Subject: [PATCH 3/4] Review adjustments --- Dockerfile | 2 +- src/main/java/cc/App.java | 2 +- src/main/java/cc/Config.java | 2 +- src/test/java/cc/ConfigTest.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 7e501eb..77b95e0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -39,4 +39,4 @@ RUN gradle clean build -x test USER app WORKDIR /code -CMD /usr/src/app/build/codeclimate-sonar /code /config.json +CMD ["/usr/src/app/build/codeclimate-sonar", "/code", "/config.json"] diff --git a/src/main/java/cc/App.java b/src/main/java/cc/App.java index 668fcc9..11d54c8 100644 --- a/src/main/java/cc/App.java +++ b/src/main/java/cc/App.java @@ -30,7 +30,7 @@ public static void execute(System2 system) { InputFileFinder fileFinder = new Finder(config.getIncludePaths(), config.getTestsPatterns(), charset); ReportFactory reportFactory = new cc.report.ReportFactory(charset); ConfigurationReader reader = new ConfigurationReader(); - org.sonarlint.cli.analysis.SonarLintFactory sonarLintFactory = new SonarLintFactory(reader, config.getWorkdir()); + SonarLintFactory sonarLintFactory = new SonarLintFactory(reader, config.getWorkdir()); Path projectHome = getProjectHome(system); int exitCode = new EngineWrapper(new Options(), sonarLintFactory, reportFactory, fileFinder, projectHome).run(); diff --git a/src/main/java/cc/Config.java b/src/main/java/cc/Config.java index bc3d761..22d81d1 100644 --- a/src/main/java/cc/Config.java +++ b/src/main/java/cc/Config.java @@ -36,7 +36,7 @@ public String getTestsPatterns() { public Path getWorkdir() { if (config.workDir == null) { - return Paths.get("/tmp/sonarlint"); + return Paths.get("/tmp/workspace"); } return Paths.get(config.workDir); } diff --git a/src/test/java/cc/ConfigTest.java b/src/test/java/cc/ConfigTest.java index 10e8e54..f880d65 100644 --- a/src/test/java/cc/ConfigTest.java +++ b/src/test/java/cc/ConfigTest.java @@ -54,6 +54,6 @@ public void override_work_dir() throws Exception { @Test public void has_default_work_dir() throws Exception { Config config = Config.gson().fromJson("{}", Config.class); - assertThat(config.getWorkdir()).isEqualTo(Paths.get("/tmp/sonarlint")); + assertThat(config.getWorkdir()).isEqualTo(Paths.get("/tmp/workspace")); } } \ No newline at end of file From 93276c7567d6fd59a11d57a3b21f63a79f045488 Mon Sep 17 00:00:00 2001 From: Filipe Esperandio Date: Fri, 13 Oct 2017 16:28:55 -0300 Subject: [PATCH 4/4] No need for sonarlint dir to be configureable --- src/main/java/cc/App.java | 2 +- src/main/java/cc/Config.java | 9 +++------ src/test/java/cc/ConfigTest.java | 10 ++-------- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/src/main/java/cc/App.java b/src/main/java/cc/App.java index 11d54c8..70cf379 100644 --- a/src/main/java/cc/App.java +++ b/src/main/java/cc/App.java @@ -30,7 +30,7 @@ public static void execute(System2 system) { InputFileFinder fileFinder = new Finder(config.getIncludePaths(), config.getTestsPatterns(), charset); ReportFactory reportFactory = new cc.report.ReportFactory(charset); ConfigurationReader reader = new ConfigurationReader(); - SonarLintFactory sonarLintFactory = new SonarLintFactory(reader, config.getWorkdir()); + SonarLintFactory sonarLintFactory = new SonarLintFactory(reader, config.getSonarlintDir()); Path projectHome = getProjectHome(system); int exitCode = new EngineWrapper(new Options(), sonarLintFactory, reportFactory, fileFinder, projectHome).run(); diff --git a/src/main/java/cc/Config.java b/src/main/java/cc/Config.java index 22d81d1..0986d89 100644 --- a/src/main/java/cc/Config.java +++ b/src/main/java/cc/Config.java @@ -19,7 +19,7 @@ public class Config { private class EngineConfig { String charset; List testsPatterns; - String workDir; + String sonarlintDir; } public List getIncludePaths() { @@ -34,11 +34,8 @@ public String getTestsPatterns() { return joinPatterns(config.testsPatterns); } - public Path getWorkdir() { - if (config.workDir == null) { - return Paths.get("/tmp/workspace"); - } - return Paths.get(config.workDir); + public Path getSonarlintDir() { + return Paths.get("/tmp/sonarlint"); } String joinPatterns(List patterns) { diff --git a/src/test/java/cc/ConfigTest.java b/src/test/java/cc/ConfigTest.java index f880d65..ff66859 100644 --- a/src/test/java/cc/ConfigTest.java +++ b/src/test/java/cc/ConfigTest.java @@ -44,16 +44,10 @@ public void null_tests_patterns_does_not_cause_error() throws Exception { Config config = Config.gson().fromJson("{\"config\":{}}", Config.class); assertThat(config.getTestsPatterns()).isNull(); } - - @Test - public void override_work_dir() throws Exception { - Config config = Config.gson().fromJson("{\"config\":{\"work_dir\":\"/tmp/wd\"}}", Config.class); - assertThat(config.getWorkdir()).isEqualTo(Paths.get("/tmp/wd")); - } - + @Test public void has_default_work_dir() throws Exception { Config config = Config.gson().fromJson("{}", Config.class); - assertThat(config.getWorkdir()).isEqualTo(Paths.get("/tmp/workspace")); + assertThat(config.getSonarlintDir()).isEqualTo(Paths.get("/tmp/sonarlint")); } } \ No newline at end of file