blob: 31fbf1a231d98559b784873fa037bf6569bd3153 [file] [log] [blame]
/*
* Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package nsk.share;
import java.io.*;
/**
* This class implements a thread transfering bytes from
* a given InputStream to a given OutputStream.
*/
public class IORedirector extends Thread {
private BufferedReader bin = null;
private PrintStream pout = null;
private Log log = null;
/**
* Few symbols to precede every text line being redirected.
*/
private String prefix = "";
/**
* Input and output streams must be specified.
*/
private IORedirector() {
super("IORedirector");
}
/**
* Redirect <code>in</code> to <code>out</code>.
*
* @deprecated Use newer constructor.
*
* @see #IORedirector(BufferedReader,Log,String)
*/
public IORedirector(InputStream in, OutputStream out) {
this();
bin = new BufferedReader(new InputStreamReader(in));
pout = new PrintStream(out);
}
/**
* Redirect <code>in</code> to <code>log</code>; and assign
* few <code>prefix</code> symbols to precede each text line
* being redirected.
*/
public IORedirector(BufferedReader in, Log log, String prefix) {
this();
this.prefix = prefix;
this.bin = in;
this.log = log;
}
/**
* Set the prefix for redirected messages;
*/
public void setPrefix(String prefix) {
this.prefix = prefix;
}
private boolean cancelled = false;
private boolean stopped = false;
private boolean started = false;
/**
* Signal to <code>run()</code> method that it should terminate,
* and wait until it is finished.
*/
public void cancel () {
cancelled = true;
while (this.isAlive())
try {
this.join();
} catch (InterruptedException ie) {
throw new Failure(ie);
};
// stopped==true here.
}
/**
* Pass data bytes from <code>in</code> to <code>out</code> stream
* until EOF is read, or this IORedirector is cancelled.
*/
public void run () {
started = true;
String logPrefix = "IORedirector-" + prefix;
if (bin == null || (pout == null && log == null))
return;
try {
while (!cancelled) {
String line = bin.readLine();
if (line == null)
break; //EOF
String message = prefix + line;
if (log != null) {
// It's synchronized and auto-flushed:
log.println(message);
} else if (pout != null) {
synchronized (pout) {
pout.println(message);
pout.flush();
}
}
}
} catch (IOException e) {
// e.printStackTrace(log.getOutStream());
String msg = "# WARNING: Caught IOException while redirecting output stream:\n\t" + e;
if (log != null) {
log.println(msg);
} else if (pout != null) {
synchronized (pout) {
pout.println(msg);
pout.flush();
}
} else {
System.err.println(msg);
System.err.flush();
}
};
stopped = true;
}
}