From 508a57d1154f1ec3d0b49bbcf27f7589d55ec8ed Mon Sep 17 00:00:00 2001 From: Nadya Zabrodina Date: Tue, 19 May 2015 16:32:07 +0400 Subject: [PATCH] refactoring hg command execution process * process Listener changed tp CapturingProcessAdapter; * string writers changed to String to reuse standard process adapter and to simplify HgCommandResult --- .../hg4idea/execution/HgCommandResult.java | 41 ++++++++----------- .../zmlx/hg4idea/execution/ShellCommand.java | 41 +++++-------------- .../zmlx/hg4idea/push/HgPushParseTest.java | 8 ++-- 3 files changed, 31 insertions(+), 59 deletions(-) diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/execution/HgCommandResult.java b/plugins/hg4idea/src/org/zmlx/hg4idea/execution/HgCommandResult.java index dd9b00ed990e..7085388e1c16 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/execution/HgCommandResult.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/execution/HgCommandResult.java @@ -12,52 +12,43 @@ // limitations under the License. package org.zmlx.hg4idea.execution; -import com.intellij.openapi.util.text.LineTokenizer; +import com.intellij.execution.process.ProcessOutput; +import org.jetbrains.annotations.NotNull; -import java.io.StringWriter; -import java.util.Arrays; import java.util.List; public final class HgCommandResult { - public static final HgCommandResult CANCELLED = new HgCommandResult(new StringWriter(), new StringWriter(), 1); + //should be deleted and use ProcessOutput without wrapper - private final StringWriter out; - private final StringWriter err; - private final int exitValue; + public static final HgCommandResult CANCELLED = new HgCommandResult(new ProcessOutput(1)); + @NotNull ProcessOutput myOutput; - private List outLines; - private List errLines; - - public HgCommandResult(StringWriter out, StringWriter err, int exitValue) { - this.out = out; - this.err = err; - this.exitValue = exitValue; + public HgCommandResult(@NotNull ProcessOutput processOutput) { + myOutput = processOutput; } + @NotNull public List getOutputLines() { - if (outLines == null) { - outLines = Arrays.asList(LineTokenizer.tokenize(out.getBuffer(), false)); - } - return outLines; + return myOutput.getStdoutLines(); } + @NotNull public List getErrorLines() { - if (errLines == null) { - errLines = Arrays.asList(LineTokenizer.tokenize(err.getBuffer(), false)); - } - return errLines; + return myOutput.getStderrLines(); } + @NotNull public String getRawOutput() { - return out.toString(); + return myOutput.getStdout(); } + @NotNull public String getRawError() { - return err.toString(); + return myOutput.getStderr(); } public int getExitValue() { - return exitValue; + return myOutput.getExitCode(); } } diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/execution/ShellCommand.java b/plugins/hg4idea/src/org/zmlx/hg4idea/execution/ShellCommand.java index 7e15327cf642..49333a44e9af 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/execution/ShellCommand.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/execution/ShellCommand.java @@ -14,10 +14,7 @@ package org.zmlx.hg4idea.execution; import com.intellij.execution.ExecutionException; import com.intellij.execution.configurations.GeneralCommandLine; -import com.intellij.execution.process.OSProcessHandler; -import com.intellij.execution.process.ProcessEvent; -import com.intellij.execution.process.ProcessListener; -import com.intellij.execution.process.ProcessOutputTypes; +import com.intellij.execution.process.*; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; @@ -27,7 +24,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; -import java.io.StringWriter; import java.nio.charset.Charset; import java.util.Iterator; import java.util.List; @@ -35,7 +31,6 @@ import java.util.List; public final class ShellCommand { private final GeneralCommandLine myCommandLine; - private int myExitCode; public ShellCommand(@Nullable List commandLine, @Nullable String dir, @Nullable Charset charset) { if (commandLine == null || commandLine.isEmpty()) { @@ -56,24 +51,11 @@ public final class ShellCommand { @NotNull public HgCommandResult execute(final boolean showTextOnIndicator) throws ShellCommandException, InterruptedException { - final StringWriter out = new StringWriter(); - final StringWriter err = new StringWriter(); final ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); try { final Process process = myCommandLine.createProcess(); - final OSProcessHandler processHandler = new OSProcessHandler(process, myCommandLine.toString(), myCommandLine.getCharset()); - - processHandler.addProcessListener(new ProcessListener() { - public void startNotified(final ProcessEvent event) { - } - - public void processTerminated(final ProcessEvent event) { - myExitCode = event.getExitCode(); - } - - @Override - public void processWillTerminate(ProcessEvent event, boolean willBeDestroyed) { - } + OSProcessHandler processHandler = new OSProcessHandler(process, myCommandLine.toString(), myCommandLine.getCharset()); + CapturingProcessAdapter outputAdapter = new CapturingProcessAdapter() { @Override public void onTextAvailable(ProcessEvent event, Key outputType) { @@ -84,26 +66,25 @@ public final class ShellCommand { if (indicator != null && showTextOnIndicator) { indicator.setText2(line); } - out.write(line); + addToOutput(line, ProcessOutputTypes.STDOUT); } } - else if (ProcessOutputTypes.STDERR == outputType) { - while (lines.hasNext()) { - err.write(lines.next()); - } + else { + super.onTextAvailable(event, outputType); } } - }); - + }; + processHandler.addProcessListener(outputAdapter); processHandler.startNotify(); while (!processHandler.waitFor(300)) { if (indicator != null && indicator.isCanceled()) { processHandler.destroyProcess(); - myExitCode = 255; + outputAdapter.getOutput().setExitCode(255); break; } } - return new HgCommandResult(out, err, myExitCode); + ProcessOutput output = outputAdapter.getOutput(); + return new HgCommandResult(output); } catch (ExecutionException e) { throw new ShellCommandException(e); diff --git a/plugins/hg4idea/testSrc/org/zmlx/hg4idea/push/HgPushParseTest.java b/plugins/hg4idea/testSrc/org/zmlx/hg4idea/push/HgPushParseTest.java index 5b1774caa2fd..d6217b9f405d 100644 --- a/plugins/hg4idea/testSrc/org/zmlx/hg4idea/push/HgPushParseTest.java +++ b/plugins/hg4idea/testSrc/org/zmlx/hg4idea/push/HgPushParseTest.java @@ -15,6 +15,7 @@ */ package org.zmlx.hg4idea.push; +import com.intellij.execution.process.ProcessOutput; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.junit.Test; @@ -22,7 +23,6 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.zmlx.hg4idea.execution.HgCommandResult; -import java.io.StringWriter; import java.util.Collection; import static org.junit.Assert.assertEquals; @@ -67,9 +67,9 @@ public class HgPushParseTest { @Test public void testValid() { - StringWriter outWriter = new StringWriter(); - outWriter.write(myOutput); + ProcessOutput processOutput = new ProcessOutput(0); + processOutput.appendStdout(myOutput); assertEquals(" Wrong commits number for " + myOutput, myExpected, - HgPusher.getNumberOfPushedCommits(new HgCommandResult(outWriter, new StringWriter(), 0))); + HgPusher.getNumberOfPushedCommits(new HgCommandResult(processOutput))); } }