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    
011        public Writer getWriter() {
012            return writer;
013        }
014    
015        public void setWriter(Writer writer) {
016            this.writer = writer;
017        }
018    
019        public Object beforeInvoke(Object object, String methodName, Object[] arguments) {
020            write(object, methodName, arguments, "before");
021            return null;
022        }
023    
024        public Object afterInvoke(Object object, String methodName, Object[] arguments, Object result) {
025            write(object, methodName, arguments, "after");
026            return result;
027        }
028    
029        public boolean doInvoke() {
030            return true;
031        }
032    
033        protected void write(Object object, String methodName, Object[] arguments, final String origin) {
034            try {
035                writer.write("Interceptor ");
036                writer.write(origin);
037                writer.write(" ");
038                Class theClass = object instanceof Class ? (Class) object: object.getClass();
039                writeInfo(theClass, methodName, arguments);
040                writer.write("\n");
041                writer.flush();
042            } catch (IOException e) {
043                e.printStackTrace();
044            }
045        }
046    
047        protected void writeInfo(final Class aClass, String methodName, Object[] arguments) throws IOException {
048            writer.write(aClass.getName());
049            writer.write(".");
050            writer.write(methodName);
051            writer.write("(");
052            for (int i = 0; i < arguments.length; i++) {
053                if (i > 0) writer.write(", ");
054                Object argument = arguments[i];
055                writer.write(argument.getClass().getName());
056            }
057            writer.write(")");
058        }
059    }