summaryrefslogtreecommitdiff
path: root/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java')
-rw-r--r--platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java135
1 files changed, 122 insertions, 13 deletions
diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java
index 969c5b2c5815..786f96ffd8c2 100644
--- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java
+++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java
@@ -19,9 +19,13 @@ import com.intellij.execution.*;
import com.intellij.execution.configurations.ConfigurationType;
import com.intellij.execution.executors.DefaultDebugExecutor;
import com.intellij.execution.executors.DefaultRunExecutor;
+import com.intellij.execution.process.ProcessAdapter;
+import com.intellij.execution.process.ProcessEvent;
+import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.rmi.RemoteUtil;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.runners.ProgramRunner;
+import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.DataKey;
import com.intellij.openapi.actionSystem.DataProvider;
import com.intellij.openapi.application.Application;
@@ -58,6 +62,7 @@ import com.intellij.openapi.externalSystem.service.task.ui.ExternalSystemRecentT
import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemLocalSettings;
import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemSettings;
import com.intellij.openapi.externalSystem.settings.ExternalProjectSettings;
+import com.intellij.openapi.externalSystem.task.TaskCallback;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.progress.PerformInBackgroundOption;
import com.intellij.openapi.progress.ProgressIndicator;
@@ -67,7 +72,9 @@ import com.intellij.openapi.roots.ex.ProjectRootManagerEx;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.LibraryTable;
import com.intellij.openapi.ui.DialogWrapper;
+import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Pair;
+import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
@@ -83,6 +90,7 @@ import com.intellij.ui.content.Content;
import com.intellij.ui.content.ContentManager;
import com.intellij.util.Consumer;
import com.intellij.util.Function;
+import com.intellij.util.concurrency.Semaphore;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.ContainerUtilRt;
import com.intellij.util.ui.UIUtil;
@@ -539,23 +547,120 @@ public class ExternalSystemUtil {
@NotNull String executorId,
@NotNull Project project,
@NotNull ProjectSystemId externalSystemId) {
- runTask(taskSettings, executorId, project, externalSystemId, null);
+ runTask(taskSettings, executorId, project, externalSystemId, null, ProgressExecutionMode.IN_BACKGROUND_ASYNC);
}
- public static void runTask(@NotNull ExternalSystemTaskExecutionSettings taskSettings,
- @NotNull String executorId,
- @NotNull Project project,
- @NotNull ProjectSystemId externalSystemId,
- @Nullable ProgramRunner.Callback callback) {
+ public static void runTask(@NotNull final ExternalSystemTaskExecutionSettings taskSettings,
+ @NotNull final String executorId,
+ @NotNull final Project project,
+ @NotNull final ProjectSystemId externalSystemId,
+ @Nullable final TaskCallback callback,
+ @NotNull final ProgressExecutionMode progressExecutionMode) {
final Pair<ProgramRunner, ExecutionEnvironment> pair = createRunner(taskSettings, executorId, project, externalSystemId);
if (pair == null) return;
- try {
- pair.first.execute(pair.second, callback);
- }
- catch (ExecutionException e) {
- LOG.warn("Can't execute task " + taskSettings, e);
- }
+ final ProgramRunner runner = pair.first;
+ final ExecutionEnvironment environment = pair.second;
+
+ final TaskUnderProgress task = new TaskUnderProgress() {
+ @Override
+ public void execute(@NotNull ProgressIndicator indicator) {
+ final Semaphore targetDone = new Semaphore();
+ final Ref<Boolean> result = new Ref<Boolean>(false);
+ final Disposable disposable = Disposer.newDisposable();
+
+ project.getMessageBus().connect(disposable).subscribe(ExecutionManager.EXECUTION_TOPIC, new ExecutionAdapter() {
+ public void processStartScheduled(final String executorIdLocal, final ExecutionEnvironment environmentLocal) {
+ if (executorId.equals(executorIdLocal) && environment.equals(environmentLocal)) {
+ targetDone.down();
+ }
+ }
+
+ public void processNotStarted(final String executorIdLocal, @NotNull final ExecutionEnvironment environmentLocal) {
+ if (executorId.equals(executorIdLocal) && environment.equals(environmentLocal)) {
+ targetDone.up();
+ }
+ }
+
+ public void processStarted(final String executorIdLocal,
+ @NotNull final ExecutionEnvironment environmentLocal,
+ @NotNull final ProcessHandler handler) {
+ if (executorId.equals(executorIdLocal) && environment.equals(environmentLocal)) {
+ handler.addProcessListener(new ProcessAdapter() {
+ public void processTerminated(ProcessEvent event) {
+ result.set(event.getExitCode() == 0);
+ targetDone.up();
+ }
+ });
+ }
+ }
+ });
+
+ try {
+ ApplicationManager.getApplication().invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ runner.execute(environment);
+ }
+ catch (ExecutionException e) {
+ targetDone.up();
+ LOG.error(e);
+ }
+ }
+ }, ModalityState.NON_MODAL);
+ }
+ catch (Exception e) {
+ LOG.error(e);
+ Disposer.dispose(disposable);
+ return;
+ }
+
+ targetDone.waitFor();
+ Disposer.dispose(disposable);
+
+ if (callback != null) {
+ if (result.get()) {
+ callback.onSuccess();
+ }
+ else {
+ callback.onFailure();
+ }
+ }
+ }
+ };
+
+ UIUtil.invokeAndWaitIfNeeded(new Runnable() {
+ @Override
+ public void run() {
+ final String title = AbstractExternalSystemTaskConfigurationType.generateName(project, taskSettings);
+ switch (progressExecutionMode) {
+ case MODAL_SYNC:
+ new Task.Modal(project, title, true) {
+ @Override
+ public void run(@NotNull ProgressIndicator indicator) {
+ task.execute(indicator);
+ }
+ }.queue();
+ break;
+ case IN_BACKGROUND_ASYNC:
+ new Task.Backgroundable(project, title) {
+ @Override
+ public void run(@NotNull ProgressIndicator indicator) {
+ task.execute(indicator);
+ }
+ }.queue();
+ break;
+ case START_IN_FOREGROUND_ASYNC:
+ new Task.Backgroundable(project, title, true, PerformInBackgroundOption.DEAF) {
+ @Override
+ public void run(@NotNull ProgressIndicator indicator) {
+ task.execute(indicator);
+ }
+ }.queue();
+ }
+ }
+ });
}
@Nullable
@@ -579,7 +684,11 @@ public class ExternalSystemUtil {
RunnerAndConfigurationSettings settings = RunManager.getInstance(project).createRunConfiguration(name, configurationType.getFactory());
ExternalSystemRunConfiguration runConfiguration = (ExternalSystemRunConfiguration)settings.getConfiguration();
runConfiguration.getSettings().setExternalProjectPath(taskSettings.getExternalProjectPath());
- runConfiguration.getSettings().setTaskNames(taskSettings.getTaskNames());
+ runConfiguration.getSettings().setTaskNames(ContainerUtil.newArrayList(taskSettings.getTaskNames()));
+ runConfiguration.getSettings().setTaskDescriptions(ContainerUtil.newArrayList(taskSettings.getTaskDescriptions()));
+ runConfiguration.getSettings().setVmOptions(taskSettings.getVmOptions());
+ runConfiguration.getSettings().setScriptParameters(taskSettings.getScriptParameters());
+ runConfiguration.getSettings().setExecutionName(taskSettings.getExecutionName());
return Pair.create(runner, new ExecutionEnvironment(executor, runner, settings, project));
}