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    }