package com.telerik.metadata.bcl;
import com.telerik.metadata.ClassUtil;
import com.telerik.metadata.desc.MetadataInfoAnnotationDescriptor;
import com.telerik.metadata.desc.ClassDescriptor;
import com.telerik.metadata.desc.FieldDescriptor;
import com.telerik.metadata.desc.MethodDescriptor;
import org.apache.bcel.classfile.Attribute;
import org.apache.bcel.classfile.ConstantUtf8;
import org.apache.bcel.classfile.Field;
import org.apache.bcel.classfile.InnerClass;
import org.apache.bcel.classfile.InnerClasses;
import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.classfile.Method;
public class ClassInfo implements ClassDescriptor {
private final JavaClass clazz;
public ClassInfo(JavaClass clazz) {
this.clazz = clazz;
init();
}
private void init() {
if (clazz.getClassName().contains("$")) {
String name = ClassUtil.getSimpleName(this);
boolean isAnonymousClass;
try {
Integer.parseInt(name);
isAnonymousClass = true;
} catch (Exception e) {
isAnonymousClass = false;
}
if (isAnonymousClass) {
return;
}
boolean found = false;
for (Attribute a : clazz.getAttributes()) {
if (a instanceof InnerClasses) {
InnerClass[] i = ((InnerClasses) a).getInnerClasses();
for (InnerClass ic : i) {
ConstantUtf8 cname = (ConstantUtf8) clazz
.getConstantPool().getConstant(ic.getInnerNameIndex());
if (cname == null) {
continue;
}
String innerClassname = cname.getBytes();
if (name.equals(innerClassname)) {
int flags = ic.getInnerAccessFlags();
clazz.setAccessFlags(flags);
found = true;
break;
}
}
}
if (found) {
break;
}
}
}
}
@Override
public boolean isClass() {
return clazz.isClass();
}
@Override
public boolean isInterface() {
return clazz.isInterface();
}
@Override
public boolean isEnum() {
return clazz.isEnum();
}
@Override
public boolean isStatic() {
return clazz.isStatic();
}
@Override
public boolean isPublic() {
return clazz.isPublic();
}
@Override
public boolean isProtected() {
return clazz.isProtected();
}
@Override
public MethodDescriptor[] getMethods() {
Method[] ms = clazz.getMethods();
MethodDescriptor[] methods = new MethodDescriptor[ms.length];
for (int i=0; i<methods.length; i++) {
methods[i] = new MethodInfo(ms[i]);
}
return methods;
}
@Override
public FieldDescriptor[] getFields() {
Field[] fs = clazz.getFields();
FieldDescriptor[] fields = new FieldDescriptor[fs.length];
for (int i=0; i<fields.length; i++) {
fields[i] = new FieldInfo(fs[i]);
}
return fields;
}
@Override
public MetadataInfoAnnotationDescriptor getMetadataInfoAnnotation() {
return null;
}
@Override
public String[] getInterfaceNames() {
return clazz.getInterfaceNames();
}
@Override
public String getPackageName() {
return clazz.getPackageName();
}
@Override
public String getClassName() {
return clazz.getClassName();
}
@Override
public String getSuperclassName() {
return clazz.getSuperclassName();
}
}