From 069b22c0ccbdaf9faa05e12f81a29545b75c2546 Mon Sep 17 00:00:00 2001 From: Vassiliy Kudryashov Date: Thu, 13 Jun 2013 16:16:41 +0400 Subject: [PATCH] IDEA-108320 Restart action is broken --- .../debugger/DefaultDebugUIEnvironment.java | 2 - .../intellij/execution/ExecutionManager.java | 7 ++ .../execution/impl/ExecutionManagerImpl.java | 73 +++++++++++++++---- .../execution/runners/RestartAction.java | 21 +----- .../execution/runners/RunContentBuilder.java | 3 +- .../xdebugger/impl/ui/XDebugSessionTab.java | 3 +- 6 files changed, 69 insertions(+), 40 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/DefaultDebugUIEnvironment.java b/java/debugger/impl/src/com/intellij/debugger/DefaultDebugUIEnvironment.java index 5c1b585391d4..bc7915f62a47 100644 --- a/java/debugger/impl/src/com/intellij/debugger/DefaultDebugUIEnvironment.java +++ b/java/debugger/impl/src/com/intellij/debugger/DefaultDebugUIEnvironment.java @@ -114,10 +114,8 @@ public class DefaultDebugUIEnvironment implements DebugUIEnvironment { @Override public void initActions(RunContentDescriptor content, DefaultActionGroup actionGroup) { - ProcessHandler processHandler = content.getProcessHandler(); RestartAction restartAction = new RestartAction(myExecutor, myRunner, - processHandler, content, myExecutionEnvironment); actionGroup.add(restartAction, Constraints.FIRST); diff --git a/platform/lang-api/src/com/intellij/execution/ExecutionManager.java b/platform/lang-api/src/com/intellij/execution/ExecutionManager.java index e51b46d73805..c8554e8a413f 100644 --- a/platform/lang-api/src/com/intellij/execution/ExecutionManager.java +++ b/platform/lang-api/src/com/intellij/execution/ExecutionManager.java @@ -18,6 +18,7 @@ package com.intellij.execution; import com.intellij.execution.configurations.RunProfileState; import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.runners.ExecutionEnvironment; +import com.intellij.execution.runners.ProgramRunner; import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.execution.ui.RunContentManager; import com.intellij.openapi.project.Project; @@ -60,4 +61,10 @@ public abstract class ExecutionManager { @NotNull ExecutionTarget target, @Nullable RunnerAndConfigurationSettings configuration, @Nullable RunContentDescriptor currentDescriptor); + + public abstract void restartRunProfile(@NotNull Project project, + @NotNull Executor executor, + @Nullable ProgramRunner runner, + @NotNull ExecutionEnvironment environment, + @Nullable RunContentDescriptor currentDescriptor); } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java index e4fa66d6dc29..2cf5a48594a2 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java @@ -18,10 +18,7 @@ package com.intellij.execution.impl; import com.intellij.CommonBundle; import com.intellij.execution.*; -import com.intellij.execution.configurations.ConfigurationPerRunnerSettings; -import com.intellij.execution.configurations.RunConfiguration; -import com.intellij.execution.configurations.RunProfile; -import com.intellij.execution.configurations.RunProfileState; +import com.intellij.execution.configurations.*; import com.intellij.execution.process.ProcessAdapter; import com.intellij.execution.process.ProcessEvent; import com.intellij.execution.process.ProcessHandler; @@ -269,28 +266,55 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom for (RunContentDescriptor descriptor : getContentManager().getAllDescriptors()) { final ProcessHandler handler = descriptor.getProcessHandler(); if (handler == processHandler) { - restartRunProfile(project, executor, target, configuration, descriptor); + restartRunProfile(project, null, null, null, null, executor, target, configuration, descriptor); return; } } } - restartRunProfile(project, executor, target, configuration, (RunContentDescriptor)null); + restartRunProfile(project, null, null, null, null, executor, target, configuration, null); } @Override - public void restartRunProfile(@NotNull final Project project, + public void restartRunProfile(@NotNull Project project, + @NotNull Executor executor, + @NotNull ExecutionTarget target, + @Nullable RunnerAndConfigurationSettings configuration, + @Nullable RunContentDescriptor currentDescriptor) { + restartRunProfile(project, null, null, null, null, executor, target, configuration, currentDescriptor); + } + + @Override + public void restartRunProfile(@NotNull Project project, + @NotNull Executor executor, + @Nullable ProgramRunner runner, + @NotNull ExecutionEnvironment environment, + @Nullable RunContentDescriptor currentDescriptor) { + restartRunProfile(project, + runner, + environment.getRunProfile(), + environment.getRunnerSettings(), + environment.getConfigurationSettings(), + executor, + environment.getExecutionTarget(), + environment.getRunnerAndConfigurationSettings(), currentDescriptor); + } + + + private void restartRunProfile(@NotNull final Project project, + @Nullable ProgramRunner r, + @Nullable final RunProfile runProfile, + @Nullable final RunnerSettings runnerSettings, + @Nullable final ConfigurationPerRunnerSettings configurationPerRunnerSettings, @NotNull final Executor executor, @NotNull final ExecutionTarget target, @Nullable final RunnerAndConfigurationSettings configuration, @Nullable final RunContentDescriptor currentDescriptor) { - if (configuration != null && ProgramRunnerUtil.getRunner(executor.getId(), configuration) == null) { + final ProgramRunner runner = r != null ? r : ProgramRunnerUtil.getRunner(executor.getId(), configuration); + if (configuration != null && runner == null) { LOG.error("Cannot find runner for " + configuration.getName()); return; } - if (configuration == null && (currentDescriptor == null || currentDescriptor.getRestarter() == null)) { - LOG.error("Nothing to restart for descriptor ["+currentDescriptor+"]"); - return; - } + final List descriptorsToStop = new ArrayList(); if (configuration != null && configuration.isSingleton()) { descriptorsToStop.addAll(getRunningDescriptors(configuration)); @@ -312,7 +336,6 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom Runnable runnable = new Runnable() { @Override public void run() { - ProgramRunner runner = ProgramRunnerUtil.getRunner(executor.getId(), configuration); if (runner != null && ExecutorRegistry.getInstance().isStarting(project, executor.getId(), runner.getRunnerId())) { awaitingTerminationAlarm.addRequest(this, 100); return; @@ -324,19 +347,39 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom return; } } - start(project, configuration, executor, target, currentDescriptor); + start(project, runner, runProfile, runnerSettings, configurationPerRunnerSettings, configuration, executor, target, currentDescriptor); } }; awaitingTerminationAlarm.addRequest(runnable, 50); } private static void start(@NotNull Project project, + @Nullable ProgramRunner runner, + @Nullable RunProfile runProfile, + @Nullable RunnerSettings runnerSettings, + @Nullable ConfigurationPerRunnerSettings configurationPerRunnerSettings, @Nullable RunnerAndConfigurationSettings configuration, @NotNull Executor executor, @NotNull ExecutionTarget target, @Nullable RunContentDescriptor descriptor) { Runnable restarter = descriptor != null ? descriptor.getRestarter() : null; - if (configuration != null) { + if (runner != null && runProfile != null) { + try { + runner.execute(executor, new ExecutionEnvironment(runProfile, + target, + project, + runnerSettings, + configurationPerRunnerSettings, + descriptor, + configuration)); + } + catch (RunCanceledByUserException ignore) { + } + catch (ExecutionException e1) { + Messages.showErrorDialog(project, e1.getMessage(), ExecutionBundle.message("restart.error.message.title")); + } + } + else if (configuration != null) { ProgramRunnerUtil.executeConfiguration(project, configuration, executor, target, descriptor, true); } else if (restarter != null) { diff --git a/platform/lang-impl/src/com/intellij/execution/runners/RestartAction.java b/platform/lang-impl/src/com/intellij/execution/runners/RestartAction.java index 2d53816dd245..126aa490f172 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/RestartAction.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/RestartAction.java @@ -43,7 +43,6 @@ import java.util.List; */ public class RestartAction extends FakeRerunAction implements DumbAware, AnAction.TransparentUpdate, Disposable { - private final ProcessHandler myProcessHandler; private final ProgramRunner myRunner; @NotNull private final RunContentDescriptor myDescriptor; @NotNull private final Executor myExecutor; @@ -51,7 +50,6 @@ public class RestartAction extends FakeRerunAction implements DumbAware, AnActio public RestartAction(@NotNull final Executor executor, final ProgramRunner runner, - final ProcessHandler processHandler,//todo kill ProcessHandler here, use descriptor.getProcessHandler() is need @NotNull final RunContentDescriptor descriptor, @NotNull final ExecutionEnvironment env) { Disposer.register(descriptor, this); @@ -59,7 +57,6 @@ public class RestartAction extends FakeRerunAction implements DumbAware, AnActio myEnvironment = env; getTemplatePresentation().setEnabled(false); - myProcessHandler = processHandler; myRunner = runner; myDescriptor = descriptor; myExecutor = executor; @@ -108,22 +105,8 @@ public class RestartAction extends FakeRerunAction implements DumbAware, AnActio public void restart() { Project project = myEnvironment.getProject(); - if (project == null) - return; - if (myProcessHandler != null) { - ExecutionManager.getInstance(project).restartRunProfile(project, - myExecutor, - myEnvironment.getExecutionTarget(), - myEnvironment.getRunnerAndConfigurationSettings(), - myProcessHandler); - } - else { - ExecutionManager.getInstance(project).restartRunProfile(project, - myExecutor, - myEnvironment.getExecutionTarget(), - myEnvironment.getRunnerAndConfigurationSettings(), - myDescriptor); - } + if (project != null && !ExecutorRegistry.getInstance().isStarting(project, myExecutor.getId(), myRunner.getRunnerId())) + ExecutionManager.getInstance(project).restartRunProfile(project, myExecutor, myRunner, myEnvironment, myDescriptor); } @Override diff --git a/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java b/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java index 2600fa4f3268..ecea85eeff3d 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java @@ -205,8 +205,7 @@ public class RunContentBuilder extends LogConsoleManagerBase { private ActionGroup createActionToolbar(final RunContentDescriptor contentDescriptor, final JComponent component) { final DefaultActionGroup actionGroup = new DefaultActionGroup(); - final RestartAction restartAction = new RestartAction(myExecutor, myRunner, getProcessHandler(), - contentDescriptor, getEnvironment()); + final RestartAction restartAction = new RestartAction(myExecutor, myRunner, contentDescriptor, getEnvironment()); restartAction.registerShortcut(component); actionGroup.add(restartAction); contentDescriptor.setRestarter(new Runnable() { diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java index 3fcadb528cba..68d56641c7a3 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java @@ -160,8 +160,7 @@ public class XDebugSessionTab extends DebuggerSessionTabBase { DefaultActionGroup leftToolbar = new DefaultActionGroup(); final Executor executor = DefaultDebugExecutor.getDebugExecutorInstance(); if (runner != null && env != null) { - RestartAction restartAction = new RestartAction(executor, runner, myRunContentDescriptor.getProcessHandler(), - myRunContentDescriptor, env); + RestartAction restartAction = new RestartAction(executor, runner, myRunContentDescriptor, env); leftToolbar.add(restartAction); restartAction.registerShortcut(myUi.getComponent()); }