diff --git a/pom.xml b/pom.xml index 5fab0f0..b5cef53 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.stepstone.sonar.plugin sonar-coldfusion-plugin sonar-plugin - 2.2.0 + 2.3.0 SonarQube Coldfusion Plugin Enables scanning of ColdFusion source files @@ -97,6 +97,12 @@ ${sonar.version} test + + + com.github.cflint + CFLint + ${cflint.version} + @@ -113,32 +119,6 @@ https://github.com/stepstone-tech/sonar-coldfusion - - org.apache.maven.plugins - maven-dependency-plugin - 2.10 - - - include-cflint - generate-resources - - copy - - - - - com.github.cflint - CFLint - ${cflint.version} - all - cflint.jar - - - ${project.build.outputDirectory}/META-INF/runner - - - - de.jutzig github-release-plugin diff --git a/src/main/java/com/stepstone/sonar/plugin/coldfusion/ColdFusionPlugin.java b/src/main/java/com/stepstone/sonar/plugin/coldfusion/ColdFusionPlugin.java index f9cd74e..4cb1a24 100644 --- a/src/main/java/com/stepstone/sonar/plugin/coldfusion/ColdFusionPlugin.java +++ b/src/main/java/com/stepstone/sonar/plugin/coldfusion/ColdFusionPlugin.java @@ -74,6 +74,5 @@ public void define(Context context) { ColdFusionSonarWayProfile.class, ColdFusionProfileExporter.class ); - } } diff --git a/src/main/java/com/stepstone/sonar/plugin/coldfusion/ColdFusionSensor.java b/src/main/java/com/stepstone/sonar/plugin/coldfusion/ColdFusionSensor.java index 5ff79b0..8b0de3b 100644 --- a/src/main/java/com/stepstone/sonar/plugin/coldfusion/ColdFusionSensor.java +++ b/src/main/java/com/stepstone/sonar/plugin/coldfusion/ColdFusionSensor.java @@ -19,7 +19,8 @@ import com.google.common.base.Preconditions; import com.stepstone.sonar.plugin.coldfusion.cflint.CFLintAnalyzer; import com.stepstone.sonar.plugin.coldfusion.cflint.CFLintAnalysisResultImporter; -import com.stepstone.sonar.plugin.coldfusion.cflint.CFLintConfigExporter; +import com.stepstone.sonar.plugin.coldfusion.cflint.CFlintJSONConfigExporter; + import org.sonar.api.batch.fs.FileSystem; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.sensor.Sensor; @@ -90,10 +91,10 @@ private void analyze(SensorContext context) throws IOException, XMLStreamExcepti } private File generateCflintConfig() throws IOException, XMLStreamException { - final File configFile = new File(fs.workDir(), "cflint-config.xml"); + final File configFile = new File(fs.workDir(), "cflint-config.json"); Collection ruleKeys = ruleProfile.findByRepository(ColdFusionPlugin.REPOSITORY_KEY) .stream().map(rule -> rule.ruleKey().toString()).collect(Collectors.toList()); - new CFLintConfigExporter(ruleKeys).save(configFile); + new CFlintJSONConfigExporter(ruleKeys).save(configFile); return configFile; } diff --git a/src/main/java/com/stepstone/sonar/plugin/coldfusion/cflint/CFLintAnalyzer.java b/src/main/java/com/stepstone/sonar/plugin/coldfusion/cflint/CFLintAnalyzer.java index ff8a43d..321a427 100644 --- a/src/main/java/com/stepstone/sonar/plugin/coldfusion/cflint/CFLintAnalyzer.java +++ b/src/main/java/com/stepstone/sonar/plugin/coldfusion/cflint/CFLintAnalyzer.java @@ -16,23 +16,38 @@ package com.stepstone.sonar.plugin.coldfusion.cflint; -import com.stepstone.sonar.plugin.coldfusion.ColdFusionPlugin; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; -import com.google.common.base.Preconditions; -import com.google.common.base.Strings; +import javax.xml.stream.XMLStreamException; import org.sonar.api.batch.fs.FileSystem; +import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.sensor.SensorContext; import org.sonar.api.config.Configuration; import org.sonar.api.utils.command.Command; -import org.sonar.api.utils.command.CommandExecutor; import org.sonar.api.utils.command.StreamConsumer; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; -import java.io.File; -import java.io.IOException; -import javax.xml.stream.XMLStreamException; +import com.cflint.api.CFLintAPI; +import com.cflint.api.CFLintResult; +import com.cflint.config.CFLintConfiguration; +import com.cflint.config.CFLintPluginInfo; +import com.cflint.config.ConfigBuilder; +import com.cflint.exception.CFLintConfigurationException; +import com.cflint.exception.CFLintScanException; +import com.google.common.base.Preconditions; +import com.google.common.base.Strings; +import com.stepstone.sonar.plugin.coldfusion.ColdFusionPlugin; public class CFLintAnalyzer { @@ -48,38 +63,28 @@ public CFLintAnalyzer(SensorContext sensorContext) { } public void analyze(File configFile) throws IOException, XMLStreamException { - File executableJar = null; + List filesToScan = new ArrayList<>(); + + for (InputFile file : fs.inputFiles(fs.predicates().hasLanguage(ColdFusionPlugin.LANGUAGE_KEY))) + filesToScan.add(file.absolutePath()); + try { - Command command = Command.create(settings.get(ColdFusionPlugin.CFLINT_JAVA).orElseThrow( - IllegalStateException::new - )); - addCflintJavaOpts(command); - executableJar = extractCflintJar(); - command.addArgument("-jar") - .addArgument(executableJar.getPath()) - .addArgument("-xml") - .addArgument("-folder") - .addArgument(settings.get("sonar.projectBaseDir").orElseThrow( - IllegalStateException::new - )) - .addArgument("-xmlfile") - .addArgument(fs.workDir() + File.separator + "cflint-result.xml") - .addArgument("-configfile") - .addArgument(configFile.getPath()); - - CommandExecutor executor = CommandExecutor.create(); - int exitCode = executor.execute(command, new LogInfoStreamConsumer(), new LogErrorStreamConsumer(), Integer.MAX_VALUE); - - if (exitCode != 0) { - throw new IllegalStateException("The CFLint analyzer failed with exit code: " + exitCode); - } - } finally { - //cleanup - if(executableJar!= null && executableJar.exists()) { - executableJar.deleteOnExit(); + ConfigBuilder cflintConfigBuilder = new ConfigBuilder(new CFLintPluginInfo()); + cflintConfigBuilder.addCustomConfig(configFile.getPath()); + + CFLintAPI linter = new CFLintAPI( + cflintConfigBuilder.build() + ); + linter.setVerbose(true); + + CFLintResult lintResult = linter.scan(filesToScan); + + try (final Writer xmlwriter = createXMLWriter(fs.workDir() + File.separator + "cflint-result.xml", StandardCharsets.UTF_8)) { + lintResult.writeXml(xmlwriter); } + } catch(Exception ce) { + throw new IOException(ce); } - } protected File extractCflintJar() throws IOException { @@ -96,21 +101,14 @@ protected void addCflintJavaOpts(Command command) { } } - private class LogInfoStreamConsumer implements StreamConsumer { - - @Override - public void consumeLine(String line) { - logger.info("Consuming line {}", line); - } - - } - - private class LogErrorStreamConsumer implements StreamConsumer { - - @Override - public void consumeLine(String line) { - logger.error("Error consuming line {}", line); + private Writer createXMLWriter(final String xmlOutFile, final Charset encoding) throws IOException { + final OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(xmlOutFile), encoding); + try { + out.append(String.format("%n", encoding)); + } catch (final IOException e) { + throw new IOException(e); } + return out; } } diff --git a/src/main/java/com/stepstone/sonar/plugin/coldfusion/cflint/CFLintConfigExporter.java b/src/main/java/com/stepstone/sonar/plugin/coldfusion/cflint/CFlintJSONConfigExporter.java similarity index 58% rename from src/main/java/com/stepstone/sonar/plugin/coldfusion/cflint/CFLintConfigExporter.java rename to src/main/java/com/stepstone/sonar/plugin/coldfusion/cflint/CFlintJSONConfigExporter.java index bd9036f..c321fd2 100644 --- a/src/main/java/com/stepstone/sonar/plugin/coldfusion/cflint/CFLintConfigExporter.java +++ b/src/main/java/com/stepstone/sonar/plugin/coldfusion/cflint/CFlintJSONConfigExporter.java @@ -16,19 +16,18 @@ package com.stepstone.sonar.plugin.coldfusion.cflint; -import javax.xml.stream.XMLOutputFactory; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.Collection; -public class CFLintConfigExporter { +import javax.xml.stream.XMLStreamException; + +public class CFlintJSONConfigExporter { private final Collection ruleKeys; - public CFLintConfigExporter(Collection ruleKeys) { + public CFlintJSONConfigExporter(Collection ruleKeys) { this.ruleKeys = ruleKeys; } @@ -39,27 +38,17 @@ public void save(File configFile) throws IOException, XMLStreamException { } public void save(Writer writer) throws IOException, XMLStreamException { - final XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance(); - XMLStreamWriter xtw=null; - try { - xtw = xmlOutputFactory.createXMLStreamWriter(writer); - - xtw.writeStartDocument(); - xtw.writeStartElement("config"); + writer.append("{ \"includes\": ["); - for (String ruleKey: ruleKeys) { - xtw.writeStartElement("includes"); - xtw.writeAttribute("code", ruleKey); - xtw.writeEndElement(); - } + boolean first = true; + for (String ruleKey : ruleKeys) { + if (first) first=false; + else writer.append(","); - xtw.writeEndElement(); - xtw.writeEndDocument(); - } finally { - if(xtw!=null) { - xtw.close(); - } + writer.append(" {\"code\":\"" + ruleKey + "\"}"); } + writer.append(" ] }"); + writer.close(); } } diff --git a/src/main/java/com/stepstone/sonar/plugin/coldfusion/profile/ColdFusionProfileExporter.java b/src/main/java/com/stepstone/sonar/plugin/coldfusion/profile/ColdFusionProfileExporter.java index 6d82701..719ee72 100644 --- a/src/main/java/com/stepstone/sonar/plugin/coldfusion/profile/ColdFusionProfileExporter.java +++ b/src/main/java/com/stepstone/sonar/plugin/coldfusion/profile/ColdFusionProfileExporter.java @@ -16,18 +16,20 @@ package com.stepstone.sonar.plugin.coldfusion.profile; -import com.google.common.base.Throwables; -import com.stepstone.sonar.plugin.coldfusion.ColdFusionPlugin; -import com.stepstone.sonar.plugin.coldfusion.cflint.CFLintConfigExporter; -import org.sonar.api.profiles.ProfileExporter; -import org.sonar.api.profiles.RulesProfile; - -import javax.xml.stream.XMLStreamException; import java.io.IOException; import java.io.Writer; import java.util.Collection; import java.util.stream.Collectors; +import javax.xml.stream.XMLStreamException; + +import org.sonar.api.profiles.ProfileExporter; +import org.sonar.api.profiles.RulesProfile; + +import com.google.common.base.Throwables; +import com.stepstone.sonar.plugin.coldfusion.ColdFusionPlugin; +import com.stepstone.sonar.plugin.coldfusion.cflint.CFlintJSONConfigExporter; + public class ColdFusionProfileExporter extends ProfileExporter { public ColdFusionProfileExporter() { @@ -41,7 +43,7 @@ public void exportProfile(RulesProfile ruleProfile, Writer writer) { Collection ruleKeys = ruleProfile.getActiveRulesByRepository(ColdFusionPlugin.REPOSITORY_KEY) .stream().map(rule -> rule.getRule().ruleKey().rule()) .collect(Collectors.toList()); - new CFLintConfigExporter(ruleKeys).save(writer); + new CFlintJSONConfigExporter(ruleKeys).save(writer); } catch (IOException | XMLStreamException e) { Throwables.propagate(e); }