001 /*
002 @license.text@
003 */
004 package biz.hammurapi.util;
005
006 import java.util.HashSet;
007 import java.util.LinkedList;
008 import java.util.Set;
009
010 /**
011 * Visits class hierarchy in the order: class, implemented
012 * interfaces, superclass, superclass implemented interfaces, ...
013 * java.lang.Object is always visited last.
014 * @author Pavel Vlasov
015 * @revision $Revision$
016 */
017 public class ClassHierarchyVisitable implements Visitable {
018 private Class clazz;
019
020 public ClassHierarchyVisitable(Class clazz) {
021 this.clazz=clazz;
022 }
023
024 public boolean accept(Visitor visitor) {
025 LinkedList queue=new LinkedList();
026 queue.add(clazz);
027 Set visited=new HashSet();
028 visited.add(Object.class);
029
030 while (!queue.isEmpty()) {
031 Class currentClazz=(Class) queue.removeFirst();
032 if (visitor.visit(currentClazz)) {
033 Class[] interfaces = currentClazz.getInterfaces();
034 for (int i=0; i<interfaces.length; i++) {
035 if (visited.add(interfaces[i])) {
036 queue.add(interfaces[i]);
037 }
038 }
039
040 Class superclass = currentClazz.getSuperclass();
041 if (superclass!=null && visited.add(superclass)) {
042 queue.add(superclass);
043 }
044 } else {
045 return false;
046 }
047 }
048
049 return visitor.visit(Object.class);
050 }
051
052 }