KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tirsen > nanning > samples > prevayler > ObjectGraphVisitor


1 package com.tirsen.nanning.samples.prevayler;
2
3 import java.lang.reflect.Array JavaDoc;
4 import java.lang.reflect.Field JavaDoc;
5 import java.lang.reflect.Modifier JavaDoc;
6 import java.util.HashSet JavaDoc;
7 import java.util.Set JavaDoc;
8
9 import org.apache.commons.logging.Log;
10 import org.apache.commons.logging.LogFactory;
11
12 public class ObjectGraphVisitor {
13     private static final Log logger = LogFactory.getLog(ObjectGraphVisitor.class);
14     protected Set JavaDoc visited = new HashSet JavaDoc();
15
16     public Set JavaDoc getVisited() {
17         return visited;
18     }
19
20     public static void visit(Object JavaDoc o, ObjectGraphVisitor visitor) {
21         visitor.visited.add(o);
22         visitor.visit(o);
23     }
24
25     protected void visit(Object JavaDoc o) {
26         visitInClass(o.getClass(), o);
27     }
28
29     private void visitInClass(Class JavaDoc aClass, Object JavaDoc o) {
30         if (aClass != null && aClass != Object JavaDoc.class) {
31             visitInClass(aClass.getSuperclass(), o);
32             Field JavaDoc[] fields = aClass.getDeclaredFields();
33             for (int fieldIndex = 0; fieldIndex < fields.length; fieldIndex++) {
34                 visitField(fields[fieldIndex], o);
35             }
36         }
37     }
38
39     protected void visitField(Field JavaDoc field, Object JavaDoc container) {
40         if (!Modifier.isStatic(field.getModifiers())) {
41             field.setAccessible(true);
42             try {
43                 Object JavaDoc nested = field.get(container);
44                 if (nested != null && nested.getClass().isArray()) {
45                     for (int arrayIndex = 0; arrayIndex < Array.getLength(nested); arrayIndex++) {
46                         Object JavaDoc arrayNested = Array.get(nested, arrayIndex);
47                         visitNested(arrayNested);
48                     }
49                 } else {
50                     visitNested(nested);
51                 }
52
53             } catch (IllegalAccessException JavaDoc e) {
54                 logger.warn("could not enter field " + field + " on object " + container, e);
55             }
56         }
57     }
58
59     private void visitNested(Object JavaDoc nested) {
60         if (nested != null && !visited.contains(nested)) {
61             visited.add(nested);
62             visit(nested);
63         }
64     }
65
66 }
67
Popular Tags