package pl.touk.sputnik.processor.jshint;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import pl.gildur.jshint4j.Error;
import pl.gildur.jshint4j.JsHint;
import pl.touk.sputnik.configuration.Configuration;
import pl.touk.sputnik.configuration.GeneralOption;
import pl.touk.sputnik.review.Review;
import pl.touk.sputnik.review.ReviewException;
import pl.touk.sputnik.review.ReviewProcessor;
import pl.touk.sputnik.review.ReviewResult;
import pl.touk.sputnik.review.Severity;
import pl.touk.sputnik.review.Violation;
import pl.touk.sputnik.review.filter.JavaScriptFilter;
import pl.touk.sputnik.review.transformer.IOFileTransformer;
import com.google.common.base.Strings;
import com.google.common.io.CharStreams;
@Slf4j
@AllArgsConstructor
public class JsHintProcessor implements ReviewProcessor {
private static final String SOURCE_NAME = "JSHint";
@NotNull
private final Configuration config;
@Override
public ReviewResult process(Review review) {
String configuration = readConfiguration();
ReviewResult result = new ReviewResult();
List<File> files = review.getFiles(new JavaScriptFilter(), new IOFileTransformer());
for (File file : files) {
processFile(result, file, configuration);
}
return result;
}
private void processFile(ReviewResult result, File file, String configuration) {
for (Error issue : lintFile(file, configuration)) {
result.add(new Violation(file.getAbsolutePath(), issue.getLine(), issue.getReason(), Severity.INFO));
}
}
private List<Error> lintFile(File file, String configuration) {
JsHint jsHint = new JsHint();
try (FileReader fileReader = new FileReader(file)) {
return jsHint.lint(CharStreams.toString(fileReader), configuration);
} catch (IOException e) {
throw new ReviewException("IO exception when running JSHint.", e);
}
}
private String readConfiguration() {
String configurationFileName = getConfigurationFileName();
if (Strings.isNullOrEmpty(configurationFileName)) {
return null;
}
try (FileReader configurationFileReader = new FileReader(configurationFileName)) {
return CharStreams.toString(configurationFileReader);
} catch (IOException e) {
throw new ReviewException("IO exception when reading JSHint configuration.", e);
}
}
private String getConfigurationFileName() {
String configurationFile = config.getProperty(GeneralOption.JSHINT_CONFIGURATION_FILE);
log.info("Using JSHint configuration file {}", configurationFile);
return configurationFile;
}
@Override
public String getName() {
return SOURCE_NAME;
}
}