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 }