1 | /* |
2 | @license.text@ |
3 | */ |
4 | package com.hammurapi.common; |
5 | |
6 | import java.util.HashSet; |
7 | import java.util.LinkedList; |
8 | import java.util.Set; |
9 | |
10 | /** |
11 | * Visits class hierarchy in the order: class, implemented |
12 | * interfaces, superclass, superclass implemented interfaces, ... |
13 | * java.lang.Object is always visited last. |
14 | * @author Pavel Vlasov |
15 | * @revision $Revision$ |
16 | */ |
17 | public class ClassHierarchyVisitable implements Visitable<Class<?>> { |
18 | private Class<?> clazz; |
19 | |
20 | public ClassHierarchyVisitable(Class<?> clazz) { |
21 | this.clazz=clazz; |
22 | } |
23 | |
24 | public boolean accept(Visitor<Class<?>> visitor) { |
25 | LinkedList<Class<?>> queue=new LinkedList<Class<?>>(); |
26 | queue.add(clazz); |
27 | Set<Class<?>> visited=new HashSet<Class<?>>(); |
28 | visited.add(Object.class); |
29 | |
30 | while (!queue.isEmpty()) { |
31 | Class<?> currentClazz = queue.removeFirst(); |
32 | if (visitor.visit(currentClazz)) { |
33 | Class<?>[] interfaces = currentClazz.getInterfaces(); |
34 | for (int i=0; i<interfaces.length; i++) { |
35 | if (visited.add(interfaces[i])) { |
36 | queue.add(interfaces[i]); |
37 | } |
38 | } |
39 | |
40 | Class<?> superclass = currentClazz.getSuperclass(); |
41 | if (superclass!=null && visited.add(superclass)) { |
42 | queue.add(superclass); |
43 | } |
44 | } else { |
45 | return false; |
46 | } |
47 | } |
48 | |
49 | return visitor.visit(Object.class); |
50 | } |
51 | |
52 | } |