001    package org.codehaus.plexus.util.cli;
002    
003    import java.io.BufferedReader;
004    import java.io.IOException;
005    import java.io.InputStream;
006    import java.io.InputStreamReader;
007    import java.io.PrintWriter;
008    
009    import org.codehaus.plexus.util.IOUtil;
010    
011    /**
012     * Class to pump the error stream during Process's runtime. Copied from the Ant built-in task.
013     */
014    public class StreamPumper extends AbstractStreamHandler {
015    
016            private final BufferedReader in;
017            private final StreamConsumer consumer;
018            private final PrintWriter out;
019            private volatile Exception exception = null;
020            private static final int SIZE = 1024;
021    
022            public StreamPumper(InputStream in) {
023                    this(in, (StreamConsumer) null);
024            }
025    
026            public StreamPumper(InputStream in, StreamConsumer consumer) {
027                    this(in, null, consumer);
028            }
029    
030            public StreamPumper(InputStream in, PrintWriter writer) {
031                    this(in, writer, null);
032            }
033    
034            public StreamPumper(InputStream in, PrintWriter writer, StreamConsumer consumer) {
035                    this.in = new BufferedReader(new InputStreamReader(in), SIZE);
036                    this.out = writer;
037                    this.consumer = consumer;
038            }
039    
040            @Override
041            public void run() {
042                    try {
043                            for (String line = in.readLine(); line != null; line = in.readLine()) {
044                                    try {
045                                            if (exception == null) {
046                                                    consumeLine(line);
047                                            }
048                                    } catch (Exception t) {
049                                            exception = t;
050                                    }
051    
052                                    if (out != null) {
053                                            out.println(line);
054                                            out.flush();
055                                    }
056                            }
057                    } catch (IOException e) {
058                            exception = e;
059                    } finally {
060                            IOUtil.close(in);
061                            synchronized (this) {
062                                    setDone();
063                                    this.notifyAll();
064                            }
065                    }
066            }
067    
068            public void flush() {
069                    if (out != null) {
070                            out.flush();
071                    }
072            }
073    
074            public void close() {
075                    IOUtil.close(out);
076            }
077    
078            public Exception getException() {
079                    return exception;
080            }
081    
082            private void consumeLine(String line) {
083                    if (consumer != null && !isDisabled()) {
084                            consumer.consumeLine(line);
085                    }
086            }
087    }