package com.coffeelint.cli; import com.intellij.execution.ExecutionException; import com.intellij.execution.configurations.GeneralCommandLine; import com.intellij.execution.process.ProcessOutput; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.text.StringUtil; import com.wix.nodejs.NodeRunner; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.concurrent.TimeUnit; public final class CoffeeLintRunner { private CoffeeLintRunner() { } private static final Logger LOG = Logger.getInstance(CoffeeLintRunner.class); private static final int TIME_OUT = (int) TimeUnit.SECONDS.toMillis(120L); public static class CoffeeLintSettings { public String node; public String executablePath; public String rules; public String extensions; public String config; public String cwd; public String targetFile; } public static CoffeeLintSettings buildSettings(@NotNull String cwd, @NotNull String path, @NotNull String node, @NotNull String executable, @Nullable String configFile, @Nullable String rulesdir, @Nullable String extensions) { CoffeeLintSettings settings = new CoffeeLintSettings(); settings.cwd = cwd; settings.executablePath = executable; settings.node = node; settings.rules = rulesdir; settings.extensions = extensions; settings.config = configFile; settings.targetFile = path; return settings; } public static LintResult lint(@NotNull String cwd, @NotNull String path, @NotNull String node, @NotNull String executable, @Nullable String configFile, @Nullable String rulesdir, @Nullable String extensions) { return lint(buildSettings(cwd, path, node, executable, configFile, rulesdir, extensions)); } public static LintResult lint(@NotNull CoffeeLintSettings settings) { LintResult result = new LintResult(); try { GeneralCommandLine commandLine = createCommandLineLint(settings); addParam(commandLine, "--reporter", "checkstyle"); ProcessOutput out = NodeRunner.execute(commandLine, TIME_OUT); // if (out.getExitCode() != 0) { result.errorOutput = out.getStderr(); try { result.coffeeLint = CoffeeLint.read(out.getStdout()); } catch (Exception e) { LOG.error(e); //result.errorOutput = out.getStdout(); } // } else { // LOG.debug(""); // } } catch (Exception e) { e.printStackTrace(); result.errorOutput = e.toString(); } return result; } @NotNull private static ProcessOutput version(@NotNull CoffeeLintSettings settings) throws ExecutionException { GeneralCommandLine commandLine = createCommandLine(settings); commandLine.addParameter("-v"); return NodeRunner.execute(commandLine, TIME_OUT); } @NotNull public static String runVersion(@NotNull CoffeeLintSettings settings) throws ExecutionException { if (!new File(settings.executablePath).exists()) { LOG.warn("Calling version with invalid coffeelint exe " + settings.executablePath); return ""; } ProcessOutput out = version(settings); if (out.getExitCode() == 0) { return out.getStdout().trim(); } return ""; } @NotNull private static GeneralCommandLine createCommandLine(@NotNull CoffeeLintSettings settings) { return NodeRunner.createCommandLine(settings.cwd, settings.node, settings.executablePath); } @NotNull private static GeneralCommandLine createCommandLineLint(@NotNull CoffeeLintSettings settings) { GeneralCommandLine commandLine = createCommandLine(settings); // TODO validate arguments (file exist etc) commandLine.addParameter(settings.targetFile); addParamIfNotEmpty(commandLine, "-f", settings.config); addParamIfNotEmpty(commandLine, "--rules", settings.rules); addParamIfNotEmpty(commandLine, "--ext", settings.extensions); return commandLine; } private static void addParam(GeneralCommandLine commandLine, String name, String value) { commandLine.addParameter(name); commandLine.addParameter(value); } private static void addParamIfNotEmpty(GeneralCommandLine commandLine, String name, String value) { if (StringUtil.isNotEmpty(value)) { addParam(commandLine, name, value); } } }