package org.codehaus.plexus.util.cli;

/*
 * Copyright The Codehaus Foundation.
 *
 * 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.
 */

/********************************************************************************
 * CruiseControl, a Continuous Integration Toolkit
 * Copyright (c) 2001-2003, ThoughtWorks, Inc.
 * 651 W Washington Ave. Suite 500
 * Chicago, IL 60661 USA
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *     + Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *
 *     + Redistributions in binary form must reproduce the above
 *       copyright notice, this list of conditions and the following
 *       disclaimer in the documentation and/or other materials provided
 *       with the distribution.
 *
 *     + Neither the name of ThoughtWorks, Inc., CruiseControl, nor the
 *       names of its contributors may be used to endorse or promote
 *       products derived from this software without specific prior
 *       written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 ********************************************************************************/

/* ====================================================================
 * Copyright 2003-2004 The Apache Software Foundation.
 *
 * 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.
 * ====================================================================
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;

Class to pump the error stream during Process's runtime. Copied from the Ant built-in task.
Author:Florin Vancea , Paul Julius
Version:$Id$
Since:June 11, 2001
/** * Class to pump the error stream during Process's runtime. Copied from the Ant built-in task. * * @author <a href="mailto:fvancea@maxiq.com">Florin Vancea </a> * @author <a href="mailto:pj@thoughtworks.com">Paul Julius </a> * @version $Id$ * @since June 11, 2001 */
public class StreamPumper extends AbstractStreamHandler { private final BufferedReader in; private final StreamConsumer consumer; private final PrintWriter out; private volatile Exception exception = null; private static final int SIZE = 1024; public StreamPumper( InputStream in ) { this( in, (StreamConsumer) null ); } public StreamPumper( InputStream in, StreamConsumer consumer ) { this( in, null, consumer ); } public StreamPumper( InputStream in, PrintWriter writer ) { this( in, writer, null ); } public StreamPumper( InputStream in, PrintWriter writer, StreamConsumer consumer ) { super(); this.in = new BufferedReader( new InputStreamReader( in ), SIZE ); this.out = writer; this.consumer = consumer; } @Override public void run() { boolean outError = out != null ? out.checkError() : false; try { for ( String line = in.readLine(); line != null; line = in.readLine() ) { try { if ( exception == null && consumer != null && !isDisabled() ) { consumer.consumeLine( line ); } } catch ( Exception t ) { exception = t; } if ( out != null && !outError ) { out.println( line ); out.flush(); if ( out.checkError() ) { outError = true; try { // Thrown to fill in stack trace elements. throw new IOException( String.format( "Failure printing line '%s'.", line ) ); } catch ( final IOException e ) { exception = e; } } } } } catch ( IOException e ) { exception = e; } finally { try { in.close(); } catch ( final IOException e2 ) { if ( exception == null ) { exception = e2; } } synchronized ( this ) { setDone(); this.notifyAll(); } } } public void flush() { if ( out != null ) { out.flush(); if ( out.checkError() && exception == null ) { try { // Thrown to fill in stack trace elements. throw new IOException( "Failure flushing output." ); } catch ( final IOException e ) { exception = e; } } } } public void close() { if ( out != null ) { out.close(); if ( out.checkError() && exception == null ) { try { // Thrown to fill in stack trace elements. throw new IOException( "Failure closing output." ); } catch ( final IOException e ) { exception = e; } } } } public Exception getException() { return exception; } }