diff options
Diffstat (limited to 'platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java')
-rw-r--r-- | platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java | 410 |
1 files changed, 187 insertions, 223 deletions
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 c017284f8e11..29808af0845d 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java @@ -13,13 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.intellij.execution.impl; import com.intellij.CommonBundle; import com.intellij.execution.*; import com.intellij.execution.configuration.CompatibilityAwareRunProfile; -import com.intellij.execution.configurations.*; +import com.intellij.execution.configurations.RunConfiguration; +import com.intellij.execution.configurations.RunProfile; +import com.intellij.execution.configurations.RunProfileState; import com.intellij.execution.process.ProcessAdapter; import com.intellij.execution.process.ProcessEvent; import com.intellij.execution.process.ProcessHandler; @@ -34,12 +35,12 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.impl.SimpleDataContext; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.components.ProjectComponent; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Trinity; @@ -47,21 +48,20 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.ui.docking.DockManager; import com.intellij.util.Alarm; +import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.containers.Predicate; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; -/** - * @author dyoma - */ -public class ExecutionManagerImpl extends ExecutionManager implements ProjectComponent { +public class ExecutionManagerImpl extends ExecutionManager implements Disposable { public static final Key<Object> EXECUTION_SESSION_ID_KEY = Key.create("EXECUTION_SESSION_ID_KEY"); - private static final Logger LOG = Logger.getInstance("com.intellij.execution.impl.ExecutionManagerImpl"); + + private static final Logger LOG = Logger.getInstance(ExecutionManagerImpl.class); + private static final ProcessHandler[] EMPTY_PROCESS_HANDLERS = new ProcessHandler[0]; private final Project myProject; @@ -70,28 +70,12 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom private final List<Trinity<RunContentDescriptor, RunnerAndConfigurationSettings, Executor>> myRunningConfigurations = ContainerUtil.createLockFreeCopyOnWriteList(); - /** - * reflection - */ - ExecutionManagerImpl(final Project project) { + ExecutionManagerImpl(@NotNull Project project) { myProject = project; } @Override - public void projectOpened() { - ((RunContentManagerImpl)getContentManager()).init(); - } - - @Override - public void projectClosed() { - } - - @Override - public void initComponent() { - } - - @Override - public void disposeComponent() { + public void dispose() { for (Trinity<RunContentDescriptor, RunnerAndConfigurationSettings, Executor> trinity : myRunningConfigurations) { Disposer.dispose(trinity.first); } @@ -108,112 +92,118 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom return myContentManager; } + @NotNull @Override public ProcessHandler[] getRunningProcesses() { - final List<ProcessHandler> handlers = new ArrayList<ProcessHandler>(); + if (myContentManager == null) return EMPTY_PROCESS_HANDLERS; + List<ProcessHandler> handlers = null; for (RunContentDescriptor descriptor : getContentManager().getAllDescriptors()) { - final ProcessHandler processHandler = descriptor.getProcessHandler(); + ProcessHandler processHandler = descriptor.getProcessHandler(); if (processHandler != null) { + if (handlers == null) { + handlers = new SmartList<ProcessHandler>(); + } handlers.add(processHandler); } } - return handlers.toArray(new ProcessHandler[handlers.size()]); + return handlers == null ? EMPTY_PROCESS_HANDLERS : handlers.toArray(new ProcessHandler[handlers.size()]); } @Override public void compileAndRun(@NotNull final Runnable startRunnable, - @NotNull final ExecutionEnvironment env, + @NotNull final ExecutionEnvironment environment, @Nullable final RunProfileState state, @Nullable final Runnable onCancelRunnable) { - long id = env.getExecutionId(); + long id = environment.getExecutionId(); if (id == 0) { - id = env.assignNewExecutionId(); + id = environment.assignNewExecutionId(); } - RunProfile profile = env.getRunProfile(); - - if (profile instanceof RunConfiguration) { - final RunConfiguration runConfiguration = (RunConfiguration)profile; - final RunManagerImpl runManager = RunManagerImpl.getInstanceImpl(myProject); - final List<BeforeRunTask> activeTasks = new ArrayList<BeforeRunTask>(); - activeTasks.addAll(runManager.getBeforeRunTasks(runConfiguration)); + RunProfile profile = environment.getRunProfile(); + if (!(profile instanceof RunConfiguration)) { + startRunnable.run(); + return; + } - DataContext context = env.getDataContext(); + final RunConfiguration runConfiguration = (RunConfiguration)profile; + final List<BeforeRunTask> beforeRunTasks = RunManagerEx.getInstanceEx(myProject).getBeforeRunTasks(runConfiguration); + if (beforeRunTasks.isEmpty()) { + startRunnable.run(); + } + else { + DataContext context = environment.getDataContext(); final DataContext projectContext = context != null ? context : SimpleDataContext.getProjectContext(myProject); - - if (!activeTasks.isEmpty()) { - final long finalId = id; - final Long executionSessionId = new Long(id); - ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { - /** @noinspection SSBasedInspection*/ - @Override - public void run() { - for (BeforeRunTask task : activeTasks) { - if (myProject.isDisposed()) { - return; - } - BeforeRunTaskProvider<BeforeRunTask> provider = BeforeRunTaskProvider.getProvider(myProject, task.getProviderId()); - if (provider == null) { - LOG.warn("Cannot find BeforeRunTaskProvider for id='" + task.getProviderId() + "'"); - continue; - } - ExecutionEnvironment taskEnvironment = new ExecutionEnvironmentBuilder(env).setContentToReuse(null).build(); - taskEnvironment.setExecutionId(finalId); - EXECUTION_SESSION_ID_KEY.set(taskEnvironment, executionSessionId); - if (!provider.executeTask(projectContext, runConfiguration, taskEnvironment, task)) { - if (onCancelRunnable != null) { - SwingUtilities.invokeLater(onCancelRunnable); - } - return; - } + final long finalId = id; + final Long executionSessionId = new Long(id); + ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { + /** @noinspection SSBasedInspection*/ + @Override + public void run() { + for (BeforeRunTask task : beforeRunTasks) { + if (myProject.isDisposed()) { + return; } - // important! Do not use DumbService.smartInvokelater here because it depends on modality state - // and execution of startRunnable could be skipped if modality state check fails - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - if (!myProject.isDisposed()) { - DumbService.getInstance(myProject).runWhenSmart(startRunnable); - } + @SuppressWarnings("unchecked") + BeforeRunTaskProvider<BeforeRunTask> provider = BeforeRunTaskProvider.getProvider(myProject, task.getProviderId()); + if (provider == null) { + LOG.warn("Cannot find BeforeRunTaskProvider for id='" + task.getProviderId() + "'"); + continue; + } + ExecutionEnvironment taskEnvironment = new ExecutionEnvironmentBuilder(environment).contentToReuse(null).build(); + taskEnvironment.setExecutionId(finalId); + EXECUTION_SESSION_ID_KEY.set(taskEnvironment, executionSessionId); + if (!provider.executeTask(projectContext, runConfiguration, taskEnvironment, task)) { + if (onCancelRunnable != null) { + SwingUtilities.invokeLater(onCancelRunnable); } - }); + return; + } } - }); - } - else { - startRunnable.run(); - } - } - else { - startRunnable.run(); + // important! Do not use DumbService.smartInvokeLater here because it depends on modality state + // and execution of startRunnable could be skipped if modality state check fails + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + if (!myProject.isDisposed()) { + DumbService.getInstance(myProject).runWhenSmart(startRunnable); + } + } + }); + } + }); } } @Override - public void startRunProfile(@NotNull final RunProfileStarter starter, @NotNull final RunProfileState state, - @NotNull final Project project, @NotNull final Executor executor, @NotNull final ExecutionEnvironment env) { - final RunContentDescriptor reuseContent = - ExecutionManager.getInstance(project).getContentManager().getReuseContent(env); + public void startRunProfile(@NotNull final RunProfileStarter starter, + @NotNull final RunProfileState state, + @NotNull final ExecutionEnvironment environment) { + final Project project = environment.getProject(); + final RunContentDescriptor reuseContent = getContentManager().getReuseContent(environment); if (reuseContent != null) { - reuseContent.setExecutionId(env.getExecutionId()); + reuseContent.setExecutionId(environment.getExecutionId()); } - final RunProfile profile = env.getRunProfile(); - project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processStartScheduled(executor.getId(), env); + final Executor executor = environment.getExecutor(); + project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processStartScheduled(executor.getId(), environment); Runnable startRunnable = new Runnable() { @Override public void run() { - if (project.isDisposed()) return; + if (project.isDisposed()) { + return; + } + + RunProfile profile = environment.getRunProfile(); boolean started = false; try { - project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processStarting(executor.getId(), env); - - final RunContentDescriptor descriptor = starter.execute(project, executor, state, reuseContent, env); + project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processStarting(executor.getId(), environment); + final RunContentDescriptor descriptor = starter.execute(project, executor, state, reuseContent, environment); if (descriptor != null) { + environment.setContentToReuse(descriptor); final Trinity<RunContentDescriptor, RunnerAndConfigurationSettings, Executor> trinity = - Trinity.create(descriptor, env.getRunnerAndConfigurationSettings(), executor); + Trinity.create(descriptor, environment.getRunnerAndConfigurationSettings(), executor); myRunningConfigurations.add(trinity); Disposer.register(descriptor, new Disposable() { @Override @@ -221,13 +211,13 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom myRunningConfigurations.remove(trinity); } }); - ExecutionManager.getInstance(project).getContentManager().showRunContent(executor, descriptor, reuseContent); + getContentManager().showRunContent(executor, descriptor, reuseContent); final ProcessHandler processHandler = descriptor.getProcessHandler(); if (processHandler != null) { if (!processHandler.isStartNotified()) { processHandler.startNotify(); } - project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processStarted(executor.getId(), env, processHandler); + project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processStarted(executor.getId(), environment, processHandler); started = true; processHandler.addProcessListener(new ProcessExecutionListener(project, profile, processHandler)); } @@ -239,7 +229,7 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom } finally { if (!started) { - project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processNotStarted(executor.getId(), env); + project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processNotStarted(executor.getId(), environment); } } } @@ -249,11 +239,11 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom startRunnable.run(); } else { - compileAndRun(startRunnable, env, state, new Runnable() { + compileAndRun(startRunnable, environment, state, new Runnable() { @Override public void run() { if (!project.isDisposed()) { - project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processNotStarted(executor.getId(), env); + project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processNotStarted(executor.getId(), environment); } } }); @@ -261,26 +251,36 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom } @Override - public void startRunProfile(@NotNull RunProfileStarter starter, @NotNull RunProfileState state, @NotNull ExecutionEnvironment env) { - startRunProfile(starter, state, env.getProject(), env.getExecutor(), env); - } - - @Override - public void restartRunProfile(@NotNull final Project project, - @NotNull final Executor executor, - @NotNull final ExecutionTarget target, - @Nullable final RunnerAndConfigurationSettings configuration, - @Nullable final ProcessHandler processHandler) { + public void restartRunProfile(@NotNull Project project, + @NotNull Executor executor, + @NotNull ExecutionTarget target, + @Nullable RunnerAndConfigurationSettings configuration, + @Nullable ProcessHandler processHandler) { + ExecutionEnvironmentBuilder builder = createEnvironmentBuilder(project, executor, configuration); if (processHandler != null) { for (RunContentDescriptor descriptor : getContentManager().getAllDescriptors()) { - final ProcessHandler handler = descriptor.getProcessHandler(); - if (handler == processHandler) { - restartRunProfile(project, null, null, null, null, null, executor, target, configuration, descriptor); - return; + if (descriptor.getProcessHandler() == processHandler) { + builder.contentToReuse(descriptor); + break; } } } - restartRunProfile(project, null, null, null, null, null, executor, target, configuration, null); + restartRunProfile(builder.target(target).build()); + } + + @NotNull + private static ExecutionEnvironmentBuilder createEnvironmentBuilder(@NotNull Project project, @NotNull Executor executor, @Nullable RunnerAndConfigurationSettings configuration) { + ExecutionEnvironmentBuilder builder = new ExecutionEnvironmentBuilder(project, executor); + + ProgramRunner runner = RunnerRegistry.getInstance().getRunner(executor.getId(), configuration != null ? configuration.getConfiguration() : null); + if (runner == null && configuration != null) { + LOG.error("Cannot find runner for " + configuration.getName()); + } + else if (runner != null) { + assert configuration != null; + builder.runnerAndSettings(runner, configuration); + } + return builder; } @Override @@ -289,123 +289,89 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom @NotNull ExecutionTarget target, @Nullable RunnerAndConfigurationSettings configuration, @Nullable RunContentDescriptor currentDescriptor) { - restartRunProfile(project, null, null, null, null, null, executor, target, configuration, currentDescriptor); + ExecutionEnvironmentBuilder builder = createEnvironmentBuilder(project, executor, configuration); + restartRunProfile(builder.target(target).contentToReuse(currentDescriptor).build()); } @Override public void restartRunProfile(@Nullable ProgramRunner runner, @NotNull ExecutionEnvironment environment, @Nullable RunContentDescriptor currentDescriptor) { - restartRunProfile(environment.getProject(), - environment.getDataContext(), - runner, - environment.getRunProfile(), - environment.getRunnerSettings(), - environment.getConfigurationSettings(), - environment.getExecutor(), - environment.getExecutionTarget(), - environment.getRunnerAndConfigurationSettings(), currentDescriptor); + ExecutionEnvironmentBuilder builder = new ExecutionEnvironmentBuilder(environment).contentToReuse(currentDescriptor); + if (runner != null) { + builder.runner(runner); + } + restartRunProfile(builder.build()); } + public static boolean isProcessRunning(@Nullable RunContentDescriptor descriptor) { + ProcessHandler processHandler = descriptor == null ? null : descriptor.getProcessHandler(); + return processHandler != null && !processHandler.isProcessTerminated(); + } - private void restartRunProfile(@NotNull final Project project, - @Nullable final DataContext context, - @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) { - final ProgramRunner runner = r != null ? - r : - RunnerRegistry.getInstance().getRunner(executor.getId(), - configuration != null && configuration.getConfiguration() != null - ? configuration.getConfiguration() - : runProfile - ); - if (configuration != null && runner == null) { - LOG.error("Cannot find runner for " + configuration.getName()); - return; - } - - final List<RunContentDescriptor> runningConfigurationsOfTheSameType = new ArrayList<RunContentDescriptor>(); - final List<RunContentDescriptor> runningIncompatibleConfigurations = new ArrayList<RunContentDescriptor>(); + @Override + public void restartRunProfile(@NotNull final ExecutionEnvironment environment) { + RunnerAndConfigurationSettings configuration = environment.getRunnerAndConfigurationSettings(); - if (configuration != null) { - runningIncompatibleConfigurations.addAll(getIncompatibleRunningDescriptors(configuration)); + List<RunContentDescriptor> runningIncompatible; + if (configuration == null) { + runningIncompatible = Collections.emptyList(); } + else { + runningIncompatible = getIncompatibleRunningDescriptors(configuration); + } + + RunContentDescriptor contentToReuse = environment.getContentToReuse(); + final List<RunContentDescriptor> runningOfTheSameType = new SmartList<RunContentDescriptor>(); if (configuration != null && configuration.isSingleton()) { - runningConfigurationsOfTheSameType.addAll(getRunningDescriptorsOfTheSameConfigType(configuration)); + runningOfTheSameType.addAll(getRunningDescriptorsOfTheSameConfigType(configuration)); } - else if (currentDescriptor != null) { - runningConfigurationsOfTheSameType.add(currentDescriptor); + else if (isProcessRunning(contentToReuse)) { + runningOfTheSameType.add(contentToReuse); } - final List<RunContentDescriptor> runningConfigurationsToStop = ContainerUtil.concat(runningConfigurationsOfTheSameType, - runningIncompatibleConfigurations); - if (!runningConfigurationsToStop.isEmpty()) { + List<RunContentDescriptor> runningToStop = ContainerUtil.concat(runningOfTheSameType, runningIncompatible); + if (!runningToStop.isEmpty()) { if (configuration != null) { - if (!runningConfigurationsOfTheSameType.isEmpty() - && (runningConfigurationsOfTheSameType.size() > 1 || - currentDescriptor == null || - runningConfigurationsOfTheSameType.get(0) != currentDescriptor) && - !userApprovesStopForSameTypeConfigurations(project, configuration.getName(), runningConfigurationsOfTheSameType.size())) { + if (!runningOfTheSameType.isEmpty() + && (runningOfTheSameType.size() > 1 || contentToReuse == null || runningOfTheSameType.get(0) != contentToReuse) && + !userApprovesStopForSameTypeConfigurations(environment.getProject(), configuration.getName(), runningOfTheSameType.size())) { return; } - if (!runningIncompatibleConfigurations.isEmpty() - && !userApprovesStopForIncompatibleConfigurations(myProject, configuration.getName(), runningIncompatibleConfigurations)) { + if (!runningIncompatible.isEmpty() + && !userApprovesStopForIncompatibleConfigurations(myProject, configuration.getName(), runningIncompatible)) { return; } } - for (RunContentDescriptor descriptor : runningConfigurationsToStop) { + + for (RunContentDescriptor descriptor : runningToStop) { stop(descriptor); } } - Runnable runnable = new Runnable() { + awaitingTerminationAlarm.addRequest(new Runnable() { @Override public void run() { - if (runner != null && ExecutorRegistry.getInstance().isStarting(project, executor.getId(), runner.getRunnerId())) { + if (ExecutorRegistry.getInstance().isStarting(environment)) { awaitingTerminationAlarm.addRequest(this, 100); return; } - for (RunContentDescriptor descriptor : runningConfigurationsOfTheSameType) { + + for (RunContentDescriptor descriptor : runningOfTheSameType) { ProcessHandler processHandler = descriptor.getProcessHandler(); if (processHandler != null && !processHandler.isProcessTerminated()) { awaitingTerminationAlarm.addRequest(this, 100); return; } } - start(project, context, runner, runProfile, runnerSettings, configurationPerRunnerSettings, configuration, executor, target, - currentDescriptor); + start(environment); } - }; - awaitingTerminationAlarm.addRequest(runnable, 50); + }, 50); } - private static void start(@NotNull Project project, - @Nullable DataContext context, - @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 (runner != null && runProfile != null) { - ProgramRunnerUtil.executeConfiguration(project, context, configuration, executor, target, descriptor, - configuration != null && configuration.isEditBeforeRun(), runner, runProfile, false); - } - else if (configuration != null) { - ProgramRunnerUtil.executeConfiguration(project, context, configuration, executor, target, descriptor, true); - } - else if (restarter != null) { - restarter.run(); - } + private static void start(@NotNull ExecutionEnvironment environment) { + RunnerAndConfigurationSettings settings = environment.getRunnerAndConfigurationSettings(); + ProgramRunnerUtil.executeConfiguration(environment, settings != null && settings.isEditBeforeRun(), true); } private static boolean userApprovesStopForSameTypeConfigurations(Project project, String configName, int instancesCount) { @@ -505,35 +471,36 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom Messages.getQuestionIcon(), option) == Messages.OK; } - private List<RunContentDescriptor> getRunningDescriptorsOfTheSameConfigType( - @NotNull final RunnerAndConfigurationSettings configurationAndSettings) { - return getRunningDescriptors(new Predicate<RunnerAndConfigurationSettings>() { + @NotNull + private List<RunContentDescriptor> getRunningDescriptorsOfTheSameConfigType(@NotNull final RunnerAndConfigurationSettings configurationAndSettings) { + return getRunningDescriptors(new Condition<RunnerAndConfigurationSettings>() { @Override - public boolean apply(@Nullable RunnerAndConfigurationSettings runningConfigurationAndSettings) { + public boolean value(@Nullable RunnerAndConfigurationSettings runningConfigurationAndSettings) { return configurationAndSettings == runningConfigurationAndSettings; } }); } - private List<RunContentDescriptor> getIncompatibleRunningDescriptors( - @NotNull final RunnerAndConfigurationSettings configurationAndSettings) { + @NotNull + private List<RunContentDescriptor> getIncompatibleRunningDescriptors(@NotNull RunnerAndConfigurationSettings configurationAndSettings) { final RunConfiguration configurationToCheckCompatibility = configurationAndSettings.getConfiguration(); - return getRunningDescriptors(new Predicate<RunnerAndConfigurationSettings>() { + return getRunningDescriptors(new Condition<RunnerAndConfigurationSettings>() { @Override - public boolean apply(@Nullable RunnerAndConfigurationSettings runningConfigurationAndSettings) { - if (runningConfigurationAndSettings == null) return false; - RunConfiguration runningConfiguration = runningConfigurationAndSettings.getConfiguration(); - if (runningConfiguration == null || !(runningConfiguration instanceof CompatibilityAwareRunProfile)) return false; + public boolean value(@Nullable RunnerAndConfigurationSettings runningConfigurationAndSettings) { + RunConfiguration runningConfiguration = runningConfigurationAndSettings == null ? null : runningConfigurationAndSettings.getConfiguration(); + if (runningConfiguration == null || !(runningConfiguration instanceof CompatibilityAwareRunProfile)) { + return false; + } return ((CompatibilityAwareRunProfile)runningConfiguration).mustBeStoppedToRun(configurationToCheckCompatibility); } }); } - private List<RunContentDescriptor> getRunningDescriptors( - Predicate<RunnerAndConfigurationSettings> condition) { - List<RunContentDescriptor> result = new ArrayList<RunContentDescriptor>(); + @NotNull + private List<RunContentDescriptor> getRunningDescriptors(@NotNull Condition<RunnerAndConfigurationSettings> condition) { + List<RunContentDescriptor> result = new SmartList<RunContentDescriptor>(); for (Trinity<RunContentDescriptor, RunnerAndConfigurationSettings, Executor> trinity : myRunningConfigurations) { - if (condition.apply(trinity.getSecond())) { + if (condition.value(trinity.getSecond())) { ProcessHandler processHandler = trinity.getFirst().getProcessHandler(); if (processHandler != null && !processHandler.isProcessTerminating() && !processHandler.isProcessTerminated()) { result.add(trinity.getFirst()); @@ -543,30 +510,27 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom return result; } - private static void stop(RunContentDescriptor runContentDescriptor) { - ProcessHandler processHandler = runContentDescriptor != null ? runContentDescriptor.getProcessHandler() : null; + private static void stop(@Nullable RunContentDescriptor descriptor) { + ProcessHandler processHandler = descriptor != null ? descriptor.getProcessHandler() : null; if (processHandler == null) { return; } + if (processHandler instanceof KillableProcess && processHandler.isProcessTerminating()) { ((KillableProcess)processHandler).killProcess(); return; } - if (processHandler.detachIsDefault()) { - processHandler.detachProcess(); - } - else { - processHandler.destroyProcess(); + if (!processHandler.isProcessTerminated()) { + if (processHandler.detachIsDefault()) { + processHandler.detachProcess(); + } + else { + processHandler.destroyProcess(); + } } } - @Override - @NotNull - public String getComponentName() { - return "ExecutionManager"; - } - private static class ProcessExecutionListener extends ProcessAdapter { private final Project myProject; private final RunProfile myProfile; |