/*
* Copyright (C) 2008 Universidade Federal de Campina Grande
*
* This file is part of OurGrid.
*
* OurGrid is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option)
* any later version.
*
* This program 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 Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.ourgrid.common.executor;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* This class creates a thread to read inputStream
*/
public class OutputCatcher implements Runnable {
/** The input stream will be consumed */
private InputStream stream;
/** The buffered reader to get the bytes in the buffer when reading */
private BufferedReader buffer;
/** An string buffer to stored the read chars */
private StringBuffer output = new StringBuffer();
/** The thread will consume the stream */
private Thread reader;
/**
* Constructs the OutputCatcher object based on a stream to consume.
*
* @param isr The stream will be consumed by the thread.
*/
public OutputCatcher( InputStream isr ) {
/** The input stream of process */
this.stream = isr;
try {
/** Just to check the stream availability */
this.stream.available();
/** Create the trhead to read the stream and close it */
this.reader = new Thread( this, "OutputCatcher: Stream [" + isr + "]" );
this.reader.start();
} catch ( IOException e ) {
System.err.println( "[Warning] The stream is closed." );
}
}
/**
* The main method for the OutputCatcher thread. The idea is to consume the
* data generated by the stream and close it in the end.
*/
public void run( ) {
String line = null;
try {
/** Create a buffer to read the stream */
buffer = new BufferedReader( new InputStreamReader( this.stream ) );
while ( ( line = buffer.readLine() ) != null ) {
output.append( line + "\n" );
}
} catch ( IOException ioe ) {
System.err.println( "[ERROR] " + getClass().getName() + ".run() - " + ioe.getMessage() );
} finally {
if ( buffer != null ) {
try {
buffer.close();
} catch ( IOException e ) {
}
}
}
}
/**
* This method provides access to the information read from stream.
*
* @return What has been read.
* @throws InterruptedException If the thread has been interrupted
*/
public String getResult( ) throws InterruptedException {
if ( reader != null ) {
while ( reader.isAlive() ) {
Thread.sleep( 100 );
}
}
return output.toString();
}
}