/*
* Copyright 2010 the original author or authors.
*
* 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.gradle.api.internal.tasks.testing.processors;
import org.gradle.api.Nullable;
import org.gradle.api.logging.StandardOutputListener;
import org.gradle.internal.io.TextStream;
import org.gradle.internal.logging.StandardOutputCapture;
import org.gradle.internal.io.LinePerThreadBufferingOutputStream;
import java.io.PrintStream;
public class DefaultStandardOutputRedirector implements StandardOutputRedirector {
private PrintStream originalStdOut;
private PrintStream originalStdErr;
private final WriteAction stdOut = new WriteAction();
private final WriteAction stdErr = new WriteAction();
private final PrintStream redirectedStdOut = new LinePerThreadBufferingOutputStream(stdOut);
private final PrintStream redirectedStdErr = new LinePerThreadBufferingOutputStream(stdErr);
@Override
public void redirectStandardOutputTo(StandardOutputListener stdOutDestination) {
stdOut.setDestination(stdOutDestination);
}
@Override
public void redirectStandardErrorTo(StandardOutputListener stdErrDestination) {
stdErr.setDestination(stdErrDestination);
}
@Override
public StandardOutputCapture start() {
if (stdOut.destination != null) {
originalStdOut = System.out;
System.setOut(redirectedStdOut);
}
if (stdErr.destination != null) {
originalStdErr = System.err;
System.setErr(redirectedStdErr);
}
return this;
}
@Override
public StandardOutputCapture stop() {
try {
if (originalStdOut != null) {
System.setOut(originalStdOut);
}
if (originalStdErr != null) {
System.setErr(originalStdErr);
}
redirectedStdOut.flush();
redirectedStdErr.flush();
} finally {
originalStdOut = null;
originalStdErr = null;
stdOut.setDestination(new DiscardAction());
stdErr.setDestination(new DiscardAction());
}
return this;
}
private static class DiscardAction implements StandardOutputListener {
@Override
public void onOutput(CharSequence output) {
}
}
private static class WriteAction implements TextStream {
private StandardOutputListener destination;
@Override
public void text(String message) {
destination.onOutput(message);
}
@Override
public void endOfStream(@Nullable Throwable failure) {
}
public void setDestination(StandardOutputListener destination) {
this.destination = destination;
}
}
}