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 }