diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExecutor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExecutor.java index 1ee28ac6c98e..451fe53d6074 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExecutor.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExecutor.java @@ -20,6 +20,7 @@ package org.jetbrains.idea.maven.execution; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; +import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.project.MavenConsole; import org.jetbrains.idea.maven.project.MavenGeneralSettings; import org.jetbrains.idea.maven.server.MavenServerConsole; @@ -28,8 +29,6 @@ import java.text.MessageFormat; public abstract class MavenExecutor { final MavenRunnerParameters myParameters; - final MavenGeneralSettings myCoreSettings; - final MavenRunnerSettings myRunnerSettings; private final String myCaption; protected MavenConsole myConsole; private String myAction; @@ -39,13 +38,9 @@ public abstract class MavenExecutor { private int exitCode = 0; public MavenExecutor(MavenRunnerParameters parameters, - MavenGeneralSettings coreSettings, - MavenRunnerSettings runnerSettings, String caption, MavenConsole console) { myParameters = parameters; - myCoreSettings = coreSettings; - myRunnerSettings = runnerSettings; myCaption = caption; myConsole = console; } @@ -58,7 +53,7 @@ public abstract class MavenExecutor { return myConsole; } - public void setAction(final String action) { + public void setAction(@Nullable final String action) { myAction = action; } @@ -113,5 +108,5 @@ public abstract class MavenExecutor { } } - public abstract boolean execute(ProgressIndicator indicator); + public abstract boolean execute(@Nullable ProgressIndicator indicator); } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalExecutor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalExecutor.java index 988ff62cf6b1..dee6065e8e34 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalExecutor.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalExecutor.java @@ -19,6 +19,7 @@ package org.jetbrains.idea.maven.execution; import com.intellij.execution.ExecutionException; +import com.intellij.execution.configurations.JavaParameters; import com.intellij.execution.process.DefaultJavaProcessHandler; import com.intellij.execution.process.OSProcessHandler; import com.intellij.openapi.application.ApplicationManager; @@ -26,6 +27,8 @@ import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.project.MavenConsole; import org.jetbrains.idea.maven.project.MavenGeneralSettings; import org.jetbrains.idea.maven.server.MavenServerConsole; @@ -36,24 +39,35 @@ public class MavenExternalExecutor extends MavenExecutor { @NonNls private static final String PHASE_INFO_REGEXP = "\\[INFO\\] \\[.*:.*\\]"; @NonNls private static final int INFO_PREFIX_SIZE = "[INFO] ".length(); - private final Project myProject; + + private JavaParameters myJavaParameters; + private ExecutionException myParameterCreationError; public MavenExternalExecutor(Project project, - MavenRunnerParameters parameters, - MavenGeneralSettings coreSettings, - MavenRunnerSettings runnerSettings, - MavenConsole console) { - super(parameters, coreSettings, runnerSettings, RunnerBundle.message("external.executor.caption"), console); - myProject = project; + @NotNull MavenRunnerParameters parameters, + @Nullable MavenGeneralSettings coreSettings, + @Nullable MavenRunnerSettings runnerSettings, + @NotNull MavenConsole console) { + super(parameters, RunnerBundle.message("external.executor.caption"), console); + + try { + myJavaParameters = MavenExternalParameters.createJavaParameters(project, myParameters, coreSettings, runnerSettings); + } + catch (ExecutionException e) { + myParameterCreationError = e; + } } public boolean execute(final ProgressIndicator indicator) { displayProgress(); try { + if (myParameterCreationError != null) { + throw myParameterCreationError; + } + myProcessHandler = - new DefaultJavaProcessHandler( - MavenExternalParameters.createJavaParameters(myProject, myParameters, myCoreSettings, myRunnerSettings)) { + new DefaultJavaProcessHandler(myJavaParameters) { public void notifyTextAvailable(String text, Key outputType) { // todo move this logic to ConsoleAdapter class if (!myConsole.isSuppressed(text)) { @@ -91,7 +105,7 @@ public class MavenExternalExecutor extends MavenExecutor { myProcessHandler.waitFor(); } - private void updateProgress(final ProgressIndicator indicator, final String text) { + private void updateProgress(@Nullable final ProgressIndicator indicator, final String text) { if (indicator != null) { if (indicator.isCanceled()) { if (!isCancelled()) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunner.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunner.java index d8372bf7f7c8..aa647520f110 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunner.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunner.java @@ -15,7 +15,9 @@ */ package org.jetbrains.idea.maven.execution; +import com.intellij.openapi.application.AccessToken; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.components.PersistentStateComponent; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.components.State; @@ -26,7 +28,6 @@ import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Pair; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.project.MavenConsole; @@ -65,10 +66,9 @@ public class MavenRunner implements PersistentStateComponent commands, @Nullable MavenGeneralSettings coreSettings, @Nullable MavenRunnerSettings runnerSettings, @Nullable final String action, - ProgressIndicator indicator) { + @Nullable ProgressIndicator indicator) { + assert !ApplicationManager.getApplication().isReadAccessAllowed(); + if (commands.isEmpty()) return true; - final MavenGeneralSettings effectiveCoreSettings = coreSettings != null ? coreSettings : getGeneralSettings(); - final MavenRunnerSettings effectiveRunnerSettings = runnerSettings != null ? runnerSettings : getState(); + MavenConsole console; + + AccessToken accessToken = ReadAction.start(); + try { + if (myProject.isDisposed()) return false; + console = createConsole(); + } + finally { + accessToken.finish(); + } - MavenConsole console = createConsole(effectiveCoreSettings, null); try { int count = 0; for (MavenRunnerParameters command : commands) { @@ -136,7 +141,17 @@ public class MavenRunner implements PersistentStateComponent parametersAndSettings) { + private MavenConsole createConsole() { if (ApplicationManager.getApplication().isUnitTestMode()) { return new SoutMavenConsole(); } @@ -167,8 +181,8 @@ public class MavenRunner implements PersistentStateComponent { @@ -76,6 +78,7 @@ public class MavenBeforeRunTasksProvider extends BeforeRunTaskProvider getProjectAndGoalChecked(MavenBeforeRunTask task) { String path = task.getProjectPath(); String goal = task.getGoal(); @@ -129,6 +132,9 @@ public class MavenBeforeRunTasksProvider extends BeforeRunTaskProvider explicitProfiles = MavenProjectsManager.getInstance(project).getExplicitProfiles(); + final MavenRunner mavenRunner = MavenRunner.getInstance(project); + targetDone.down(); new Task.Backgroundable(project, TasksBundle.message("maven.tasks.executing"), true) { public void run(@NotNull ProgressIndicator indicator) { @@ -137,13 +143,13 @@ public class MavenBeforeRunTasksProvider extends BeforeRunTaskProvider