package ee.edio.garmin.runconfig;
import com.google.common.collect.ImmutableList;
import com.intellij.execution.DefaultExecutionResult;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.ExecutionResult;
import com.intellij.execution.Executor;
import com.intellij.execution.configurations.CommandLineState;
import com.intellij.execution.configurations.EncodingEnvironmentUtil;
import com.intellij.execution.configurations.GeneralCommandLine;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.execution.process.KillableColoredProcessHandler;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.runners.ProgramRunner;
import com.intellij.execution.ui.ConsoleView;
import com.intellij.execution.util.ProgramParametersUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.vfs.CharsetToolkit;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.IOException;
import java.util.List;
// Starts app in simulator
public class MonkeyRunningState extends CommandLineState {
private MonkeyParameters monkeyParameters;
protected MonkeyRunningState(ExecutionEnvironment environment) {
super(environment);
}
public MonkeyParameters getMonkeyParameters() throws ExecutionException {
if (monkeyParameters == null) {
monkeyParameters = createMcParameters();
}
return monkeyParameters;
}
private MonkeyParameters createMcParameters() throws ExecutionException {
final MonkeyParameters params = new MonkeyParameters();
final MonkeyModuleBasedConfiguration runConfig = getConfiguration();
final MonkeyRunConfigurationModule configurationModule = runConfig.getConfigurationModule();
final int classPathType = MonkeyParameters.SDK_AND_CLASSES;
params.configureByModule(configurationModule.getModule(), classPathType);
ProgramParametersUtil.configureConfiguration(params, runConfig);
return params;
}
@Override
@NotNull
public ExecutionResult execute(@NotNull final Executor executor, @NotNull final ProgramRunner runner) throws ExecutionException {
GeneralCommandLine runSimulatorCmd = createRunSimulatorCmd();
ProcessBuilder pb = new ProcessBuilder(runSimulatorCmd.getExePath())
.directory(runSimulatorCmd.getWorkDirectory());
try {
pb.start();
} catch (IOException e) {
throw new ExecutionException(e.getMessage());
}
final ProcessHandler runInSimHandler = startProcess();
final ConsoleView console = createConsole(executor);
if (console != null) {
console.attachToProcess(runInSimHandler);
}
return new DefaultExecutionResult(console, runInSimHandler);
}
@NotNull
@Override
protected ProcessHandler startProcess() throws ExecutionException {
GeneralCommandLine runInSimulatorCmd = createRunInSimulatorCmd();
return new KillableColoredProcessHandler(runInSimulatorCmd);
}
private MonkeyModuleBasedConfiguration getConfiguration() {
if (getEnvironment().getRunnerAndConfigurationSettings() == null) {
throw new RuntimeException("runnerAndConfigurationSettings is null");
}
final RunConfiguration configuration = getEnvironment().getRunnerAndConfigurationSettings().getConfiguration();
if (configuration == null || !(configuration instanceof MonkeyModuleBasedConfiguration)) {
throw new RuntimeException("runnerAndConfigurationSettings.getConfiguration() is null or wrong type");
}
return (MonkeyModuleBasedConfiguration) configuration;
}
private GeneralCommandLine createRunSimulatorCmd() throws ExecutionException {
final MonkeyParameters monkeyParameters = getMonkeyParameters();
final Sdk sdk = monkeyParameters.getSdk();
String sdkPath = sdk.getHomePath() + File.separator;
String sdkBinPath = sdkPath + "bin" + File.separator;
GeneralCommandLine commandLine = new GeneralCommandLine()
.withWorkDirectory(sdkBinPath);
commandLine.setExePath(sdkBinPath + "connectiq.bat");
return commandLine;
}
private GeneralCommandLine createRunInSimulatorCmd() throws ExecutionException {
final MonkeyParameters monkeyParameters = getMonkeyParameters();
final Sdk sdk = monkeyParameters.getSdk();
String sdkPath = sdk.getHomePath() + File.separator;
final List<String> pathList = monkeyParameters.getClassPath().getPathList();
if (pathList.isEmpty()) {
throw new ExecutionException("pathlist is empty");
}
final String outputDir = pathList.get(0) + File.separator;
// e.g C:\Users\xyz\workspace\esimene\aabb\production\esimene
Project project = getEnvironment().getProject();
String sdkBinPath = sdkPath + "bin" + File.separator;
String outputName = project.getName() + ".prg";
String prgPath = outputDir + outputName;
final MonkeyModuleBasedConfiguration runConfig = getConfiguration();
final String deviceId = runConfig.getTargetDeviceId();
ImmutableList.Builder<String> parameters = ImmutableList.<String>builder()
.add(prgPath)
.add(deviceId);
GeneralCommandLine commandLine = new GeneralCommandLine()
.withWorkDirectory(sdkBinPath)
.withCharset(CharsetToolkit.UTF8_CHARSET);
EncodingEnvironmentUtil.setLocaleEnvironmentIfMac(commandLine);
commandLine.setExePath(sdkBinPath + "monkeydo.bat");
commandLine.addParameters(parameters.build());
return commandLine;
}
}