1 package groovy.lang;
2
3 import java.io.IOException;
4 import java.io.PrintWriter;
5 import java.io.Writer;
6
7 public class TracingInterceptor implements Interceptor {
8
9 protected Writer writer = new PrintWriter(System.out);
10 private int indent = 0;
11
12 public Writer getWriter() {
13 return writer;
14 }
15
16 public void setWriter(Writer writer) {
17 this.writer = writer;
18 }
19
20 public Object beforeInvoke(Object object, String methodName, Object[] arguments) {
21 write(object, methodName, arguments, "before");
22 indent++ ;
23 return null;
24 }
25
26 public Object afterInvoke(Object object, String methodName, Object[] arguments, Object result) {
27 indent--;
28 write(object, methodName, arguments, "after ");
29 return result;
30 }
31
32 public boolean doInvoke() {
33 return true;
34 }
35 private String indent(){
36 StringBuffer result = new StringBuffer();
37 for (int i=0; i<indent;i++){
38 result.append(" ");
39 }
40 return result.toString();
41 }
42
43 protected void write(Object object, String methodName, Object[] arguments, final String origin) {
44 try {
45 writer.write(indent());
46 writer.write(origin);
47 writer.write(" ");
48 Class theClass = object instanceof Class ? (Class) object: object.getClass();
49 writeInfo(theClass, methodName, arguments);
50 writer.write("\n");
51 writer.flush();
52 } catch (IOException e) {
53 e.printStackTrace();
54 }
55 }
56
57 protected void writeInfo(final Class aClass, String methodName, Object[] arguments) throws IOException {
58 writer.write(aClass.getName());
59 writer.write(".");
60 writer.write(methodName);
61 writer.write("(");
62 for (int i = 0; i < arguments.length; i++) {
63 if (i > 0) writer.write(", ");
64 Object argument = arguments[i];
65 writer.write(argument.getClass().getName());
66 }
67 writer.write(")");
68 }
69 }