EA-359528: ApplicationImpl.assertReadAccessAllowed() in MavenExternalParameters.createJavaParameters()

This commit is contained in:
Sergey Evdokimov
2012-04-18 15:50:01 +04:00
parent 7c56c449ce
commit 990dde0d1c
4 changed files with 70 additions and 41 deletions
@@ -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);
}
@@ -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()) {
@@ -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<MavenRunnerSettings
public void run(final MavenRunnerParameters parameters, final MavenRunnerSettings settings, final Runnable onComplete) {
FileDocumentManager.getInstance().saveAllDocuments();
final MavenConsole console = createConsole(getGeneralSettings(),
Pair.create(parameters, settings));
final MavenConsole console = createConsole();
try {
final MavenExecutor[] executor = new MavenExecutor[]{createExecutor(parameters, getGeneralSettings(), settings, console)};
final MavenExecutor[] executor = new MavenExecutor[]{createExecutor(parameters, null, settings, console)};
ProgressManager.getInstance().run(new Task.Backgroundable(myProject, executor[0].getCaption(), true) {
public void run(@NotNull ProgressIndicator indicator) {
@@ -114,21 +114,26 @@ public class MavenRunner implements PersistentStateComponent<MavenRunnerSettings
}
}
private MavenGeneralSettings getGeneralSettings() {
return MavenProjectsManager.getInstance(myProject).getGeneralSettings();
}
public boolean runBatch(List<MavenRunnerParameters> 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<MavenRunnerSettings
indicator.setFraction(((double)count++) / commands.size());
}
MavenExecutor executor = createExecutor(command, effectiveCoreSettings, effectiveRunnerSettings, console);
MavenExecutor executor;
accessToken = ReadAction.start();
try {
if (myProject.isDisposed()) break;
executor = createExecutor(command, coreSettings, runnerSettings, console);
}
finally {
accessToken.finish();
}
executor.setAction(action);
if (!executor.execute(indicator)) {
updateTargetFolders();
@@ -158,8 +173,7 @@ public class MavenRunner implements PersistentStateComponent<MavenRunnerSettings
MavenProjectsManager.getInstance(myProject).updateProjectTargetFolders();
}
private MavenConsole createConsole(MavenGeneralSettings coreSettings,
Pair<MavenRunnerParameters, MavenRunnerSettings> parametersAndSettings) {
private MavenConsole createConsole() {
if (ApplicationManager.getApplication().isUnitTestMode()) {
return new SoutMavenConsole();
}
@@ -167,8 +181,8 @@ public class MavenRunner implements PersistentStateComponent<MavenRunnerSettings
}
private MavenExecutor createExecutor(MavenRunnerParameters taskParameters,
MavenGeneralSettings coreSettings,
MavenRunnerSettings runnerSettings,
@Nullable MavenGeneralSettings coreSettings,
@Nullable MavenRunnerSettings runnerSettings,
MavenConsole console) {
return new MavenExternalExecutor(myProject, taskParameters, coreSettings, runnerSettings, console);
}
@@ -31,6 +31,7 @@ import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.concurrency.Semaphore;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.execution.MavenRunner;
import org.jetbrains.idea.maven.execution.MavenRunnerParameters;
import org.jetbrains.idea.maven.navigator.SelectMavenGoalDialog;
@@ -40,6 +41,7 @@ import org.jetbrains.idea.maven.utils.MavenIcons;
import org.jetbrains.idea.maven.utils.MavenLog;
import javax.swing.*;
import java.util.Collection;
import java.util.Collections;
public class MavenBeforeRunTasksProvider extends BeforeRunTaskProvider<MavenBeforeRunTask> {
@@ -76,6 +78,7 @@ public class MavenBeforeRunTasksProvider extends BeforeRunTaskProvider<MavenBefo
: TasksBundle.message("maven.tasks.before.run", desc);
}
@Nullable
private Pair<MavenProject, String> getProjectAndGoalChecked(MavenBeforeRunTask task) {
String path = task.getProjectPath();
String goal = task.getGoal();
@@ -129,6 +132,9 @@ public class MavenBeforeRunTasksProvider extends BeforeRunTaskProvider<MavenBefo
FileDocumentManager.getInstance().saveAllDocuments();
final Collection<String> 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<MavenBefo
true,
projectAndGoal.first.getDirectory(),
Collections.singletonList(projectAndGoal.second),
MavenProjectsManager.getInstance(project).getExplicitProfiles());
explicitProfiles);
result[0] = MavenRunner.getInstance(project).runBatch(Collections.singletonList(params),
null,
null,
TasksBundle.message("maven.tasks.executing"),
indicator);
result[0] = mavenRunner.runBatch(Collections.singletonList(params),
null,
null,
TasksBundle.message("maven.tasks.executing"),
indicator);
}
finally {
targetDone.up();