001 package groovy.lang; 002 003 import java.io.IOException; 004 import java.io.PrintWriter; 005 import java.io.Writer; 006 007 public class TracingInterceptor implements Interceptor { 008 009 protected Writer writer = new PrintWriter(System.out); 010 private int indent = 0; 011 012 public Writer getWriter() { 013 return writer; 014 } 015 016 public void setWriter(Writer writer) { 017 this.writer = writer; 018 } 019 020 public Object beforeInvoke(Object object, String methodName, Object[] arguments) { 021 write(object, methodName, arguments, "before"); 022 indent++ ; 023 return null; 024 } 025 026 public Object afterInvoke(Object object, String methodName, Object[] arguments, Object result) { 027 indent--; 028 write(object, methodName, arguments, "after "); 029 return result; 030 } 031 032 public boolean doInvoke() { 033 return true; 034 } 035 private String indent(){ 036 StringBuffer result = new StringBuffer(); 037 for (int i=0; i<indent;i++){ 038 result.append(" "); 039 } 040 return result.toString(); 041 } 042 043 protected void write(Object object, String methodName, Object[] arguments, final String origin) { 044 try { 045 writer.write(indent()); 046 writer.write(origin); 047 writer.write(" "); 048 Class theClass = object instanceof Class ? (Class) object: object.getClass(); 049 writeInfo(theClass, methodName, arguments); 050 writer.write("\n"); 051 writer.flush(); 052 } catch (IOException e) { 053 e.printStackTrace(); 054 } 055 } 056 057 protected void writeInfo(final Class aClass, String methodName, Object[] arguments) throws IOException { 058 writer.write(aClass.getName()); 059 writer.write("."); 060 writer.write(methodName); 061 writer.write("("); 062 for (int i = 0; i < arguments.length; i++) { 063 if (i > 0) writer.write(", "); 064 Object argument = arguments[i]; 065 writer.write(argument.getClass().getName()); 066 } 067 writer.write(")"); 068 } 069 }