1 package com.lexicalscope.fluentreflection;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import java.util.ArrayList;
20 import java.util.LinkedList;
21 import java.util.List;
22
23 import com.google.inject.TypeLiteral;
24
25 final class TypeHierarchyCalculation {
26 private final List<TypeLiteral<?>> done = new ArrayList<TypeLiteral<?>>();
27 private final List<FluentClass<?>> result = new ArrayList<FluentClass<?>>();
28 private final List<TypeLiteral<?>> pending = new LinkedList<TypeLiteral<?>>();
29 private final ReflectedTypeFactory reflectedTypeFactory;
30
31 public TypeHierarchyCalculation(final ReflectedTypeFactory reflectedTypeFactory) {
32 this.reflectedTypeFactory = reflectedTypeFactory;
33 }
34
35 List<FluentClass<?>> interfacesAndSuperClass(final TypeLiteral<?> typeLiteral) {
36 queueSuperclassAndInterfaces(typeLiteral);
37 processesPendingTypes();
38 return result;
39 }
40
41 private void processesPendingTypes() {
42 while (!pending.isEmpty()) {
43 processClass(pending.remove(0));
44 }
45 }
46
47 private void processClass(final TypeLiteral<?> klassToReflect) {
48 queueSuperclassAndInterfaces(klassToReflect);
49 if (done.contains(klassToReflect)) {
50 return;
51 }
52 done.add(klassToReflect);
53 result.add(reflectedTypeFactory.reflect(klassToReflect));
54 }
55
56 private void queueSuperclassAndInterfaces(final TypeLiteral<?> typeLiteralToReflect) {
57 final Class<?> rawSuperclass = typeLiteralToReflect.getRawType().getSuperclass();
58 if (rawSuperclass != null && !rawSuperclass.equals(Object.class)) {
59 pending.add(typeLiteralToReflect.getSupertype(rawSuperclass));
60 }
61 final Class<?>[] interfaces = typeLiteralToReflect.getRawType().getInterfaces();
62 for (final Class<?> interfac3 : interfaces) {
63 pending.add(typeLiteralToReflect.getSupertype(interfac3));
64 }
65 }
66 }