1 /**************************************************************************************
2 * Copyright (c) Jonas BonŽr, Alexandre Vasseur. All rights reserved. *
3 * http://aspectwerkz.codehaus.org *
4 * ---------------------------------------------------------------------------------- *
5 * The software in this package is published under the terms of the LGPL license *
6 * a copy of which has been included with this distribution in the license.txt file. *
7 **************************************************************************************/
8 package org.codehaus.aspectwerkz.hook;
9
10 import java.io.InputStream;
11 import java.io.OutputStream;
12
13 /***
14 * Redirects stream using an internal buffer of size 2048 Used to redirect std(in/out/err) streams of the target VM
15 * <p/>Inspired from Ant StreamPumper class, which seems better than the JPDA Sun demo
16 *
17 * @author <a href="mailto:alex@gnilux.com">Alexandre Vasseur </a>
18 */
19 class StreamRedirectThread extends Thread {
20 private static final int BUFFER_SIZE = 2048;
21
22 private static final int SLEEP = 5;
23
24 private InputStream is;
25
26 private OutputStream os;
27
28 public StreamRedirectThread(String name, InputStream is, OutputStream os) {
29 super(name);
30 setPriority(Thread.MAX_PRIORITY - 1);
31 this.is = is;
32 this.os = os;
33 }
34
35 public void run() {
36 byte[] buf = new byte[BUFFER_SIZE];
37 int i;
38 try {
39 while ((i = is.read(buf)) > 0) {
40 os.write(buf, 0, i);
41 try {
42 Thread.sleep(SLEEP);
43 } catch (InterruptedException e) {
44 ;
45 }
46 }
47 } catch (Exception e) {
48 ;
49 } finally {
50 ; //notify();
51 }
52 }
53
54 /*
55 * public StreamRedirectThread(String name, InputStream in, OutputStream out) { super(name); this.in = new
56 * InputStreamReader(in); this.out = new OutputStreamWriter(out); setPriority(Thread.MAX_PRIORITY-1); } public void
57 * run() { try { char[] cbuf = new char[BUFFER_SIZE]; int count; System.out.println("read" + this.getName()); while
58 * ((count = in.read(cbuf, 0, BUFFER_SIZE)) >= 0) { System.out.println("write" + this.getName()); out.write(cbuf, 0,
59 * count); out.flush(); } out.flush(); } catch (IOException e) { System.err.println("Child I/O Transfer failed - " +
60 * e); } finally { try { out.close(); in.close(); } catch(IOException e) { ; } } }
61 */
62 }