/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ /* * $Id$ */ package org.apache.qetest; import java.io.BufferedReader; import java.io.IOException; /** * Utility class for reading buffered streams on a thread. * *

Common usage case: *

 * ThreadedStreamReader errReader = new ThreadedStreamReader();
 * Process p = Runtime.exec(cmdLine, environment);
 * errReader.setInputStream(
 *     new BufferedReader(
 *         new InputStreamReader(proc.getErrorStream()), bufSize));
 * errReader.start();
 * proc.waitFor();
 * errReader.join();
 * String sysErr = errReader.getBuffer().toString();
 * 
* * @author Shane_Curcuru@lotus.com * @version $Id$ */ public class ThreadedStreamReader extends Thread { /** Reader we pull data from. */ BufferedReader is = null; /** Buffer we store the data in. */ StringBuffer sb = null; /** * Asks us to capture data from the provided stream. * @param set BufferedReader we should pull data from */ public void setInputStream(BufferedReader set) { is = set; } /** * Implement Thread.run(). * This asks us to start reading data from our setInputStream() * and storing it in our getBuffer() area. Note you probably * should have called setInputStream() first. */ public void run() { sb = new StringBuffer(); sb.append(READER_START_MARKER); if (null == is) { sb.append("ERROR! setInputStream(null)"); sb.append(READER_END_MARKER); return; } String i = null; try { i = is.readLine(); } catch (IOException ioe1) { sb.append("ERROR! no data to read, threw: " + ioe1.toString()); i = null; } while (i != null) { sb.append(i); // Note: also append the implicit newline that readLine grabbed sb.append('\n'); try { i = is.readLine(); } catch (IOException ioe2) { sb.append("WARNING! readLine() threw: " + ioe2.toString()); i = null; } } sb.append(READER_END_MARKER); } /** * Get the buffer of data we've captured. * * @return our internal StringBuffer; will be null if we * have not been run yet. */ public StringBuffer getBuffer() { return sb; } public static final String READER_START_MARKER = "\n"; public static final String READER_END_MARKER = "\n"; } // end of class ThreadedStreamReader