01: /*
02: * Janino - An embedded Java[TM] compiler
03: *
04: * Copyright (c) 2006, Arno Unkrig
05: * All rights reserved.
06: *
07: * Redistribution and use in source and binary forms, with or without
08: * modification, are permitted provided that the following conditions
09: * are met:
10: *
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above
14: * copyright notice, this list of conditions and the following
15: * disclaimer in the documentation and/or other materials
16: * provided with the distribution.
17: * 3. The name of the author may not be used to endorse or promote
18: * products derived from this software without specific prior
19: * written permission.
20: *
21: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
25: * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
27: * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
29: * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30: * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
31: * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32: */
33:
34: package org.codehaus.janino.util;
35:
36: import java.io.*;
37:
38: /**
39: * A {@link java.io.FilterReader} that copies the bytes being passed through
40: * to a given {@link java.io.Writer}. This is in analogy with the UNIX "tee" command.
41: */
42: public class TeeReader extends FilterReader {
43: private final Writer out;
44: private final boolean closeWriterOnEOF;
45:
46: public TeeReader(Reader in, Writer out, boolean closeWriterOnEOF) {
47: super (in);
48: this .out = out;
49: this .closeWriterOnEOF = closeWriterOnEOF;
50: }
51:
52: public void close() throws IOException {
53: this .in.close();
54: this .out.close();
55: }
56:
57: public int read() throws IOException {
58: int c = this .in.read();
59: if (c == -1) {
60: if (this .closeWriterOnEOF) {
61: this .out.close();
62: } else {
63: this .out.flush();
64: }
65: } else {
66: this .out.write(c);
67: }
68: return c;
69: }
70:
71: public int read(char[] cbuf, int off, int len) throws IOException {
72: int bytesRead = this .in.read(cbuf, off, len);
73: if (bytesRead == -1) {
74: if (this.closeWriterOnEOF) {
75: this.out.close();
76: } else {
77: this.out.flush();
78: }
79: } else {
80: this.out.write(cbuf, off, bytesRead);
81: }
82: return bytesRead;
83: }
84: }
|