001/*
002@license.text@ 
003 */
004
005package com.hammurapi.common;
006
007import java.io.IOException;
008import java.io.InputStream;
009import java.io.OutputStream;
010import java.io.Reader;
011import java.io.Writer;
012import java.util.concurrent.Callable;
013
014/**
015 * 
016 * Copies all data from an input stream to an output stream.
017 * @author Pavel Vlasov
018 * @version $Revision: 1.3 $
019 */
020public class Pumper implements Callable<Long> {
021
022    private final static int SIZE = 1024;
023    private InputStream is;
024    private OutputStream os;
025    
026    private boolean closeStreams=false;
027        private Reader reader;
028        private Writer writer;
029    
030    /**
031     * Create a new pumper.
032     *
033     * @param is input stream to read data from
034     * @param os output stream to write data to.
035     */
036    public Pumper(InputStream is, OutputStream os, boolean closeStreams) {
037        this.is = is;
038        this.os = os;
039        this.closeStreams=closeStreams;
040    }
041
042    /**
043     * Create a new pumper.
044     *
045     * @param reader Reader to read data from
046     * @param writer Writer to write data to.
047     */
048    public Pumper(Reader reader, Writer writer, boolean closeStreams) {
049        this.reader = reader;
050        this.writer = writer;
051        this.closeStreams=closeStreams;
052    }
053
054    /**
055     * Copies data from the input stream to the output stream.
056     * Terminates as soon as the input stream is closed or an error occurs.
057     */
058        public Long call() throws Exception {
059                if (is==null) {
060                        return pump(reader, writer, closeStreams);
061                }
062                
063                return pump(is, os, closeStreams);
064    }
065
066    /**
067     * Copies data from the input stream to the output stream.
068     */
069    public static long pump(InputStream in, OutputStream out, boolean closeStreams) throws IOException {
070        try {
071                try {
072                    final byte[] buf = new byte[SIZE];
073                    int length;
074                        long ret = 0;
075                    while ((length = in.read(buf)) != -1) {
076                        out.write(buf, 0, length);
077                        ret+=length;
078                    }
079                    return ret;
080                } finally {
081                    if (closeStreams) {
082                       in.close();
083                    }
084                }
085        } finally {
086            if (closeStreams) {
087               out.close();
088            }                   
089        }
090    }
091
092    /**
093     * Copies data from the reader to the writer.
094     */
095    public static long pump(Reader in, Writer out, boolean closeStreams) throws IOException {
096        try {
097                try {
098                    final char[] buf = new char[SIZE];
099                    int length;
100                        long ret = 0;
101                    while ((length = in.read(buf)) != -1) {
102                        out.write(buf, 0, length);
103                        ret+=length;
104                    }
105                    return ret;
106                } finally {
107                    if (closeStreams) {
108                       in.close();
109                    }
110                }
111        } finally {
112            if (closeStreams) {
113               out.close();
114            }                   
115        }
116    }
117        
118}