package org.jetbrains.plugins.ruby.motion.run; import com.intellij.execution.ExecutionException; import com.intellij.execution.Location; import com.intellij.execution.configurations.GeneralCommandLine; import com.intellij.execution.configurations.RunnerSettings; import com.intellij.execution.process.ProcessHandler; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.Key; import com.jetbrains.cidr.execution.ProcessOutputReaders; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.ruby.ruby.debugger.RubyDebugRunner; import org.jetbrains.plugins.ruby.ruby.run.RubyProcessHandler; import org.jetbrains.plugins.ruby.ruby.run.configuration.AbstractRubyRunConfiguration; import org.jetbrains.plugins.ruby.ruby.run.configuration.RubyRunConfigurationExtension; import org.jetbrains.plugins.ruby.tasks.rake.runConfigurations.RakeConsoleModifier; import org.jetbrains.plugins.ruby.tasks.rake.runConfigurations.RakeRunConfiguration; import java.util.Map; /** * @author Dennis.Ushakov */ public class MotionSimulatorRunExtension extends RubyRunConfigurationExtension { public static final Key<MotionProcessOutputReaders> FILE_OUTPUT_READERS = Key.create("RubyMotion.FileOutputReaders"); @NotNull @Override protected String getSerializationId() { return MotionSimulatorRunExtension.class.getName(); } @Override protected void readExternal(@NotNull AbstractRubyRunConfiguration runConfiguration, @NotNull Element element) throws InvalidDataException {} @Override protected boolean isApplicableFor(@NotNull AbstractRubyRunConfiguration configuration) { return true; } @Override protected boolean isEnabledFor(@NotNull AbstractRubyRunConfiguration configuration, @Nullable RunnerSettings runnerSettings) { if (configuration instanceof RakeRunConfiguration) { for (RakeConsoleModifier modifier : RakeConsoleModifier.EP_NAME.getExtensions()) { if (modifier.isApplicable((RakeRunConfiguration)configuration)) { return true; } } } return false; } @Override protected void patchCommandLine(@NotNull AbstractRubyRunConfiguration configuration, RunnerSettings runnerSettings, @NotNull GeneralCommandLine cmdLine, @NotNull String runnerId) throws ExecutionException { final Map<String, String> env = cmdLine.getEnvironment(); final String originalRunnerId = cmdLine.getUserData(RakeConsoleModifier.ORIGINAL_RUNNER_ID); if (RubyDebugRunner.ID.equals(originalRunnerId)) { env.put("SIM_WAIT_FOR_DEBUGGER", "1"); } if (configuration instanceof RakeRunConfiguration && ((RakeRunConfiguration)configuration).getTaskName().contains("device")) { final boolean enableDebugger = RubyDebugRunner.ID.equals(originalRunnerId); if (enableDebugger) { env.put("debug", "1"); env.put("no_start", "1"); } } final MotionProcessOutputReaders readers = new MotionProcessOutputReaders(cmdLine); env.put("SIM_STDOUT_PATH", readers.getOutFileAbsolutePath()); env.put("SIM_STDERR_PATH", readers.getErrFileAbsolutePath()); env.put("output", "rubymine"); cmdLine.putUserData(FILE_OUTPUT_READERS, readers); } @Override protected void validateConfiguration(@NotNull AbstractRubyRunConfiguration configuration, boolean isExecution) throws Exception {} @Override protected void extendCreatedConfiguration(@NotNull AbstractRubyRunConfiguration configuration, @NotNull Location location) {} @Override protected void extendTemplateConfiguration(@NotNull AbstractRubyRunConfiguration configuration) {} @Override protected void attachToProcess(@NotNull AbstractRubyRunConfiguration configuration, @NotNull ProcessHandler handler, RunnerSettings runnerSettings) { } static class MotionProcessOutputReaders extends ProcessOutputReaders { private RubyProcessHandler myHandler; public MotionProcessOutputReaders(@NotNull GeneralCommandLine commandLine) throws ExecutionException { init(commandLine, true); } @Override protected void onTextAvailable(@NotNull String text, @NotNull Key type) { if (myHandler != null) { myHandler.notifyTextAvailable(text, type); } } public void setHandler(RubyProcessHandler handler) { myHandler = handler; } } }