summaryrefslogtreecommitdiff
path: root/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java
diff options
context:
space:
mode:
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.java410
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;