1 package net.sf.clirr.core.internal.bcel;
2
3 import net.sf.clirr.core.spi.Field;
4 import net.sf.clirr.core.spi.JavaType;
5 import net.sf.clirr.core.spi.Method;
6 import net.sf.clirr.core.spi.Scope;
7
8 import org.apache.bcel.classfile.JavaClass;
9 import org.apache.bcel.generic.ObjectType;
10 import org.apache.bcel.generic.Type;
11 import org.apache.bcel.util.Repository;
12
13 /***
14 *
15 */
16 public final class BcelJavaType implements JavaType
17 {
18 private Type type;
19 private JavaClass clazz;
20 private Repository repository;
21
22
23 public BcelJavaType(Type bcelType, Repository repository)
24 {
25 this.type = bcelType;
26 this.repository = repository;
27 this.clazz = findJavaClass(type);
28 }
29
30 public BcelJavaType(JavaClass clazz)
31 {
32 this.type = null;
33 this.repository = clazz.getRepository();
34 this.clazz = clazz;
35 }
36
37 public String getName() {
38 if (clazz != null)
39 {
40 return clazz.getClassName();
41 }
42 else
43 {
44 return type.toString();
45 }
46 }
47
48 public JavaType getContainingClass() {
49
50
51
52 return null;
53 }
54
55 private JavaClass findJavaClass(Type type) {
56 if (!(type instanceof ObjectType))
57 {
58 return null;
59 }
60 ObjectType ot = (ObjectType) type;
61 return repository.findClass(ot.getClassName());
62 }
63
64 public JavaType[] getSuperClasses() {
65 if (clazz == null)
66 {
67 return new JavaType[0];
68 }
69 final JavaClass[] superClasses = clazz.getSuperClasses();
70 return convertToJavaTypeArray(superClasses);
71 }
72
73 public JavaType[] getAllInterfaces() {
74 if (clazz == null)
75 {
76 return new JavaType[0];
77 }
78 final JavaClass[] interfaces = clazz.getAllInterfaces();
79 return convertToJavaTypeArray(interfaces);
80 }
81
82 public JavaType[] getInnerClasses() {
83 return new JavaType[0];
84 }
85
86 public Method[] getMethods() {
87 if (clazz == null)
88 {
89 return new Method[0];
90 }
91 final org.apache.bcel.classfile.Method[] methods = clazz.getMethods();
92 Method[] ret = new Method[methods.length];
93 for (int i = 0; i < ret.length; i++) {
94 ret[i] = new BcelMethod(clazz, methods[i]);
95 }
96 return ret;
97 }
98
99 public Field[] getFields() {
100 if (clazz == null)
101 {
102 return new Field[0];
103 }
104 final org.apache.bcel.classfile.Field[] fields = clazz.getFields();
105 Field[] ret = new Field[fields.length];
106 for (int i = 0; i < ret.length; i++) {
107 ret[i] = new BcelField(clazz, fields[i]);
108 }
109 return ret;
110 }
111
112 public boolean isPrimitive() {
113 return clazz == null;
114 }
115
116 public boolean isArray() {
117 return false;
118 }
119
120 public boolean isFinal() {
121 if (clazz == null)
122 {
123 return false;
124 }
125 return clazz.isFinal();
126 }
127
128 public boolean isAbstract() {
129 if (clazz == null)
130 {
131 return false;
132 }
133 return clazz.isAbstract();
134 }
135
136 public boolean isInterface() {
137 return clazz.isInterface();
138 }
139
140 public Scope getDeclaredScope() {
141 return BcelScopeHelper.getClassScope(clazz);
142 }
143
144 public Scope getEffectiveScope() {
145 return getDeclaredScope();
146 }
147
148 public String toString()
149 {
150 return getName();
151 }
152
153 /***
154 * @param bcelClasses
155 * @return
156 */
157 private JavaType[] convertToJavaTypeArray(final JavaClass[] bcelClasses) {
158 JavaType[] ret = new JavaType[bcelClasses.length];
159 for (int i = 0; i < ret.length; i++) {
160 ret[i] = new BcelJavaType(bcelClasses[i]);
161 }
162 return ret;
163 }
164
165
166 }