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);
}