IDEA-108320 Restart action is broken

This commit is contained in:
Vassiliy Kudryashov
2013-06-13 16:19:58 +04:00
parent 753a50e890
commit 069b22c0cc
6 changed files with 69 additions and 40 deletions
@@ -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);
@@ -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);
}
@@ -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<RunContentDescriptor> descriptorsToStop = new ArrayList<RunContentDescriptor>();
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) {
@@ -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
@@ -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() {
@@ -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());
}