View Javadoc

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; // TODO: how can I convert a JavaClass to the corresponding Type?
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          // TODO: move code from ScopeHelper here
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(); // FIXME
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 }