/*
* Copyright 2011 Jon S Akhtar (Sylvanaar)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.sylvanaar.idea.Lua.console;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.configuration.EnvironmentVariablesComponent;
import com.intellij.execution.configurations.GeneralCommandLine;
import com.intellij.execution.console.ConsoleHistoryController;
import com.intellij.execution.console.LanguageConsoleViewImpl;
import com.intellij.execution.process.CommandLineArgumentsProvider;
import com.intellij.execution.process.OSProcessHandler;
import com.intellij.execution.runners.AbstractConsoleRunnerWithHistory;
import com.intellij.execution.runners.ConsoleExecuteActionHandler;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.util.ArrayUtil;
import com.sylvanaar.idea.Lua.sdk.LuaSdkType;
import com.sylvanaar.idea.Lua.util.LuaSystemUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
/**
* Created by IntelliJ IDEA.
* User: Jon S Akhtar
* Date: 2/20/11
* Time: 4:51 PM
*/
public class LuaConsoleRunner extends AbstractConsoleRunnerWithHistory {
public LuaConsoleRunner(@NotNull Project project, @NotNull String consoleTitle,
@NotNull CommandLineArgumentsProvider provider,
@org.jetbrains.annotations.Nullable String workingDir) {
super(project, consoleTitle, provider, workingDir);
}
@Override
protected LanguageConsoleViewImpl createConsoleView() {
return new LuaLanguageConsoleView(getProject(), getConsoleTitle());
}
@Override
protected Process createProcess(CommandLineArgumentsProvider provider) throws ExecutionException {
return createLuaProcess(getWorkingDir(), provider);
}
@Override
protected OSProcessHandler createProcessHandler(Process process, String commandLine) {
return new LuaConsoleProcessHandler(process, getConsoleView().getConsole(), commandLine,
CharsetToolkit.UTF8_CHARSET);
}
@NotNull
@Override
protected ConsoleExecuteActionHandler createConsoleExecuteActionHandler() {
return new LuaConsoleExecuteActionHandler(getProcessHandler(), false);
}
public static void run(Project project, Sdk sdk, String consoleTitle, String projectRoot,
String statements2execute[]) {
LuaConsoleRunner runner = new LuaConsoleRunner(project, consoleTitle, new MyCommandLineArgumentsProvider(sdk), projectRoot);
try {
runner.initAndRun();
ConsoleHistoryController chc =
new ConsoleHistoryController(consoleTitle, null, runner.getConsoleView().getConsole(),
runner.getConsoleExecuteActionHandler().getConsoleHistoryModel());
chc.install();
} catch (ExecutionException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
public static Process createLuaProcess(String workingDir,
CommandLineArgumentsProvider provider) throws ExecutionException {
String[] command = provider.getArguments();
assert command != null;
String arguments[];
if (command.length > 1) {
arguments = new String[command.length - 1];
System.arraycopy(command, 1, arguments, 0, command.length - 1);
} else {
arguments = ArrayUtil.EMPTY_STRING_ARRAY;
}
GeneralCommandLine cmdLine = createAndSetupCmdLine(null, workingDir, provider.getAdditionalEnvs(), true,
command[0], arguments);
return cmdLine.createProcess();
}
public static GeneralCommandLine createAndSetupCmdLine(String additionalLoadPath, String workingDir,
Map userDefinedEnvs, boolean passParentEnvs,
String executablePath, String arguments[]) {
assert executablePath != null;
assert arguments != null;
GeneralCommandLine cmdLine = new GeneralCommandLine();
List fixedArguments = new ArrayList();
Collections.addAll(fixedArguments, arguments);
cmdLine.setExePath(FileUtil.toSystemDependentName(executablePath));
if (workingDir != null) cmdLine.setWorkDirectory(FileUtil.toSystemDependentName(workingDir));
cmdLine.addParameters(fixedArguments);
Map customEnvVariables;
if (userDefinedEnvs == null) customEnvVariables = new HashMap();
else customEnvVariables = new HashMap(userDefinedEnvs);
cmdLine.setPassParentEnvs(passParentEnvs);
EnvironmentVariablesComponent.inlineParentOccurrences(customEnvVariables);
Map envParams = new HashMap();
if (passParentEnvs) envParams.putAll(System.getenv());
envParams.putAll(customEnvVariables);
String PATH_KEY = LuaSystemUtil.getPATHenvVariableName();
if(!StringUtil.isEmpty(additionalLoadPath))
{
String path = (String)envParams.get(PATH_KEY);
envParams.put(PATH_KEY, LuaSystemUtil.appendToPATHenvVariable(path, additionalLoadPath));
}
cmdLine.setEnvParams(envParams);
return cmdLine;
}
private static class MyCommandLineArgumentsProvider extends CommandLineArgumentsProvider {
private Sdk mySdk;
public MyCommandLineArgumentsProvider(Sdk sdk) {
mySdk = sdk;
}
@Override
public String[] getArguments() {
return new String[]{LuaSdkType.getTopLevelExecutable(mySdk.getHomePath()).getAbsolutePath(), "-i", "-e",
"io.stdout:setvbuf([[no]])"};
}
@Override
public boolean passParentEnvs() { return false; }
@Override
@Nullable
public Map<String, String> getAdditionalEnvs() { return Collections.emptyMap(); }
}
}