blob: dee6065e8e34500290e089d861daf525462c112e [file] [log] [blame]
/* ==========================================================================
* Copyright 2006 Mevenide Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =========================================================================
*/
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;
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;
public class MavenExternalExecutor extends MavenExecutor {
private OSProcessHandler myProcessHandler;
@NonNls private static final String PHASE_INFO_REGEXP = "\\[INFO\\] \\[.*:.*\\]";
@NonNls private static final int INFO_PREFIX_SIZE = "[INFO] ".length();
private JavaParameters myJavaParameters;
private ExecutionException myParameterCreationError;
public MavenExternalExecutor(Project 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(myJavaParameters) {
public void notifyTextAvailable(String text, Key outputType) {
// todo move this logic to ConsoleAdapter class
if (!myConsole.isSuppressed(text)) {
super.notifyTextAvailable(text, outputType);
}
updateProgress(indicator, text);
}
};
myConsole.attachToProcess(myProcessHandler);
}
catch (ExecutionException e) {
myConsole.systemMessage(MavenServerConsole.LEVEL_FATAL, RunnerBundle.message("external.startup.failed", e.getMessage()), null);
return false;
}
start();
readProcessOutput();
stop();
return printExitSummary();
}
void stop() {
if (myProcessHandler != null) {
myProcessHandler.destroyProcess();
myProcessHandler.waitFor();
setExitCode(myProcessHandler.getProcess().exitValue());
}
super.stop();
}
private void readProcessOutput() {
myProcessHandler.startNotify();
myProcessHandler.waitFor();
}
private void updateProgress(@Nullable final ProgressIndicator indicator, final String text) {
if (indicator != null) {
if (indicator.isCanceled()) {
if (!isCancelled()) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
public void run() {
cancel();
}
});
}
}
if (text.matches(PHASE_INFO_REGEXP)) {
indicator.setText2(text.substring(INFO_PREFIX_SIZE));
}
}
}
}