/*
* BioJava development code
*
* This code may be freely distributed and modified under the
* terms of the GNU Lesser General Public Licence. This should
* be distributed with the code. If you do not have a copy,
* see:
*
* http://www.gnu.org/copyleft/lesser.html
*
* Copyright for this code is held jointly by the individual
* authors. These should be listed in @author doc comments.
*
* For more information on the BioJava project and its aims,
* or to join the biojava-l mailing list, visit the home page
* at:
*
* http://www.biojava.org/
*
*/
/*
* StreamPipe.java
*/
package org.biojava.utils.process;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* A {@linkplain java.lang.Runnable multi threaded} class
* which pipes the contents of an input stream to an output stream.
* @author Martin Szugat
* @version $Revision: 3634 $
*/
public class StreamPipe implements Runnable {
/* STATIC FIELDS */
/**
* The class logger.
*/
private static final Logger LOGGER =
Logger.getLogger(StreamPipe.class.getName());
/* PRIVATE FIELDS */
/**
* The input stream from which to read.
*/
private InputStream input = null;
/**
* The output stream to which to write.
*/
private OutputStream output = null;
/**
* A tag for logging.
*/
private String tag = null;
/* PUBLIC CONSTRUCTORS */
/**
* Initializes the stream pipe.
* @param input the input stream from which to read.
* May be null
.
* @param output the output stream to which to write
* May be null
.
* @param tag a tag which is used for logging the in- and output
* May be null
.
*/
public StreamPipe(InputStream input, OutputStream output, String tag) {
setInput(input);
setOutput(output);
this.tag = tag;
}
/* PUBLIC PROPERTIES */
/**
* Gets the input stream
* @return the input from which to read. May be null
.
*/
public InputStream getInput() {
return input;
}
/**
* Sets the input stream
* @param input the input stream from which to read. May be
* null
.
*/
public void setInput(InputStream input) {
this.input = input;
}
/**
* Sets the output stream
* @param output the output stream to which to write. May be
* null
.
*/
public void setOutput(OutputStream output) {
this.output = output;
}
/**
* Gets the output stream.
* @return the output stream to which to write. May be null
.
*/
public OutputStream getOutput() {
return output;
}
/* INTERFACE Runnable */
/**
* {@inheritDoc}
*/
public void run() {
LOGGER.entering(getClass().getName(), "run");
if (input != null) {
try {
BufferedOutputStream bout = null;
if (output != null) {
bout = new BufferedOutputStream(output);
}
BufferedInputStream bin = new BufferedInputStream(input);
boolean log = LOGGER.isLoggable(Level.FINEST);
byte[] buffer = new byte[1024];
int len;
while ((len = bin.read(buffer)) != -1) {
if (log) {
String data = new String(buffer, 0, len);
if (tag == null) {
LOGGER.finest(data);
} else {
LOGGER.finest("<" + tag + "> " + data);
}
}
if (bout != null) {
bout.write(buffer, 0, len);
bout.flush();
}
}
} catch (Exception e) {
LOGGER.severe(e.toString());
}
}
LOGGER.exiting(getClass().getName(), "run");
}
}