View Javadoc

1   /*
2    * Copyright (c) 2003-2008, by Henrik Arro and Contributors
3    *
4    * This file is part of JSeq, a tool to automatically create
5    * sequence diagrams by tracing program execution.
6    *
7    * See <http://jseq.sourceforge.net> for more information.
8    *
9    * JSeq is free software: you can redistribute it and/or modify
10   * it under the terms of the GNU Lesser General Public License as
11   * published by the Free Software Foundation, either version 3 of
12   * the License, or (at your option) any later version.
13   *
14   * JSeq is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17   * GNU Lesser General Public License for more details.
18   *
19   * You should have received a copy of the GNU Lesser General Public License
20   * along with JSeq. If not, see <http://www.gnu.org/licenses/>.
21   */
22  
23  package th.co.edge.jseq;
24  
25  import java.io.IOException;
26  import java.io.InputStream;
27  import java.io.InputStreamReader;
28  import java.io.OutputStream;
29  import java.io.OutputStreamWriter;
30  import java.io.Reader;
31  import java.io.Writer;
32  
33  /**
34   * A <code>StreamRedirectThread</code> redirects everything from one
35   * <code>InputStream</code> to another <code>OutputStream</code>.
36   * 
37   * <p>
38   * This class is used when launching and tracing a program to make sure that
39   * what is written to <code>System.out</code> and <code>System.err</code>
40   * shows up in the JSeq console windows.
41   */
42  
43  // TODO Add a CheckStyle or PMD rule to catch package private classes, methods
44  // and fields without a package comment.
45  class StreamRedirectThread extends Thread {
46      private static final int BUFFER_SIZE = 1024;
47  
48      private final Reader in;
49      private final Writer out;
50  
51      /**
52       * Creates a new <code>StreamRedirectThread</code> with a given name,
53       * redirecting input from the given <code>InputStream</code> to the given
54       * <code>OutputStream</code>.
55       * 
56       * @param name
57       *            the name of this <code>StreamRedirectThread</code>
58       * 
59       * @param in
60       *            the <code>InputStream</code> to read from
61       * 
62       * @param out
63       *            the <code>OutputStream</code> to write to
64       */
65      StreamRedirectThread(String name, InputStream in, OutputStream out) {
66          super(name);
67          this.in = new InputStreamReader(in);
68          this.out = new OutputStreamWriter(out);
69          setPriority(Thread.MAX_PRIORITY - 1);
70      }
71  
72      /**
73       * Executes in a separate Java thread, redirecting from an
74       * <code>InputStream</code> to an <code>OutputStream</code>.
75       */
76      @Override
77      public void run() {
78          try {
79              char[] cbuf = new char[BUFFER_SIZE];
80              int count;
81              while ((count = in.read(cbuf, 0, BUFFER_SIZE)) >= 0) {
82                  out.write(cbuf, 0, count);
83                  out.flush();
84              }
85          } catch (IOException exc) {
86              System.err.println("Child I/O Transfer - " + exc);
87          }
88      }
89  }