Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 7 additions & 27 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<groupId>com.stepstone.sonar.plugin</groupId>
<artifactId>sonar-coldfusion-plugin</artifactId>
<packaging>sonar-plugin</packaging>
<version>2.2.0</version>
<version>2.3.0</version>

<name>SonarQube Coldfusion Plugin</name>
<description>Enables scanning of ColdFusion source files</description>
Expand Down Expand Up @@ -97,6 +97,12 @@
<version>${sonar.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.github.cflint</groupId>
<artifactId>CFLint</artifactId>
<version>${cflint.version}</version>
</dependency>
</dependencies>

<build>
Expand All @@ -113,32 +119,6 @@
<pluginSourcesUrl>https://github.com/stepstone-tech/sonar-coldfusion</pluginSourcesUrl>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>include-cflint</id>
<phase>generate-resources</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.github.cflint</groupId>
<artifactId>CFLint</artifactId>
<version>${cflint.version}</version>
<classifier>all</classifier>
<destFileName>cflint.jar</destFileName>
</artifactItem>
</artifactItems>
<outputDirectory>${project.build.outputDirectory}/META-INF/runner</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>de.jutzig</groupId>
<artifactId>github-release-plugin</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,5 @@ public void define(Context context) {
ColdFusionSonarWayProfile.class,
ColdFusionProfileExporter.class
);

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<String> 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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand All @@ -48,38 +63,28 @@ public CFLintAnalyzer(SensorContext sensorContext) {
}

public void analyze(File configFile) throws IOException, XMLStreamException {
File executableJar = null;
List<String> 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 {
Expand All @@ -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("<?xml version=\"1.0\" encoding=\"%s\" ?>%n", encoding));
} catch (final IOException e) {
throw new IOException(e);
}
return out;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> ruleKeys;
public CFLintConfigExporter(Collection<String> ruleKeys) {
public CFlintJSONConfigExporter(Collection<String> ruleKeys) {
this.ruleKeys = ruleKeys;
}

Expand All @@ -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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -41,7 +43,7 @@ public void exportProfile(RulesProfile ruleProfile, Writer writer) {
Collection<String> 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);
}
Expand Down