1 package groovy.ui; 2 3 import groovy.lang.Closure; 4 5 import java.io.FilterOutputStream; 6 import java.io.IOException; 7 import java.io.PrintStream; 8 9 /*** 10 * Intercepts System.out. Implementation helper for Console.groovy. 11 */ 12 class SystemOutputInterceptor extends FilterOutputStream { 13 14 private Closure callback; 15 16 /*** 17 * Constructor 18 * 19 * @param callback 20 * accepts a string to be sent to std out and returns a Boolean. 21 * If the return value is true, output will be sent to 22 * System.out, otherwise it will not. 23 */ 24 public SystemOutputInterceptor(Closure callback) { 25 super(System.out); 26 this.callback = callback; 27 } 28 29 /*** 30 * Starts intercepting System.out 31 */ 32 public void start() { 33 System.setOut(new PrintStream(this)); 34 } 35 36 /*** 37 * Stops intercepting System.out, sending output to whereever it was 38 * going when this interceptor was created. 39 */ 40 public void stop() { 41 System.setOut((PrintStream) out); 42 } 43 44 /*** 45 * Intercepts output - moret common case of byte[] 46 */ 47 public void write(byte[] b, int off, int len) throws IOException { 48 Boolean result = (Boolean) callback.call(new String(b, off, len)); 49 if (result.booleanValue()) { 50 out.write(b, off, len); 51 } 52 } 53 54 /*** 55 * Intercepts output - single characters 56 */ 57 public void write(int b) throws IOException { 58 Boolean result = (Boolean) callback.call(String.valueOf((char) b)); 59 if (result.booleanValue()) { 60 out.write(b); 61 } 62 } 63 }