package jdepend.metadata; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import jdepend.metadata.annotation.AnnotationParse; import jdepend.metadata.annotation.AnnotationRefs; import jdepend.metadata.annotation.Autowired; import jdepend.metadata.annotation.Qualifier; import jdepend.metadata.util.JavaClassCollection; import jdepend.metadata.util.ParseUtil; import jdepend.metadata.util.SignatureUtil; import org.apache.bcel.classfile.AnnotationEntry; import org.apache.bcel.classfile.Field; public class Attribute extends AccessFlags { private static final long serialVersionUID = 5330876838708287382L; private String javaClassId; private String info; private String name; private String staticValue; private String signature; private List<String> types; private AnnotationRefs annotationRefs; private transient JavaClass javaClass; private transient Collection<JavaClass> typeClasses; public Attribute(JavaClass javaClass, Field field, boolean isParseAnnotation) { this.javaClass = javaClass; this.javaClassId = javaClass.getId(); this.access_flags = field.getAccessFlags(); this.info = field.toString(); this.name = field.getName(); this.signature = SignatureUtil.getSignature(field); this.types = new ArrayList<String>(); for (String type : ParseUtil.signatureToTypes(this.signature)) { this.types.add(type); } if (field.isStatic() && field.getConstantValue() != null) { staticValue = field.getConstantValue().toString(); } this.annotationRefs = new AnnotationRefs(); // 处理Annotation if (isParseAnnotation) { for (AnnotationEntry annotationEntry : field.getAnnotationEntries()) { if (annotationEntry.getAnnotationType().equals(AnnotationParse.Autowired)) { this.annotationRefs.setAutowired(AnnotationParse.parseAutowired(annotationEntry)); } else if (annotationEntry.getAnnotationType().equals(AnnotationParse.Qualifier)) { this.annotationRefs.setQualifier(AnnotationParse.parseQualifier(annotationEntry)); } } } } public Attribute(String javaClassId, Attribute attribute) { this.javaClassId = javaClassId; this.access_flags = attribute.access_flags; this.info = attribute.info; this.name = attribute.name; this.signature = attribute.signature; this.types = new ArrayList<String>(); for (String type : attribute.types) { this.types.add(type); } this.staticValue = attribute.staticValue; this.annotationRefs = attribute.annotationRefs; } public JavaClass getJavaClass() { return javaClass; } public void setJavaClass(JavaClass javaClass) { this.javaClass = javaClass; } public String getInfo() { return info; } public String getSignature() { return signature; } public String getName() { return name; } public List<String> getTypes() { return types; } public Collection<JavaClass> getTypeClasses() { return this.typeClasses; } public void setTypeClasses(Collection<JavaClass> typeClasses) { this.typeClasses = typeClasses; } public boolean existCollectionType() { return ParseUtil.existCollectionType(signature); } public String getStaticValue() { return staticValue; } public void setStaticValue(String staticValue) { this.staticValue = staticValue; } public Autowired getAutowired() { return this.annotationRefs.getAutowired(); } public Qualifier getQualifier() { return this.annotationRefs.getQualifier(); } public boolean isInterface() { for (JavaClass javaClass : this.typeClasses) { if (javaClass.isInterface()) { return true; } } return false; } public boolean isAbstract() { for (JavaClass javaClass : this.typeClasses) { if (javaClass.isAbstract()) { return true; } } return false; } public boolean isEnum() { for (JavaClass javaClass : this.typeClasses) { if (javaClass.isEnum()) { return true; } } return false; } public void supply(JavaClassCollection javaClasses) { Collection<JavaClass> attributeTypes; JavaClass attributeTypeClass; // 填充JavaClass if (this.javaClass == null) { this.javaClass = javaClasses.getTheClass(this.javaClassId); } attributeTypes = new HashSet<JavaClass>(); for (String type : this.getTypes()) { attributeTypeClass = javaClasses.getTheClass(javaClass.getPlace(), type); if (attributeTypeClass != null) { attributeTypes.add(attributeTypeClass); } } this.setTypeClasses(attributeTypes); } public void filterExternalJavaClass(Collection<JavaClass> javaClasses) { for (JavaClass typeClass : this.typeClasses) { if (!javaClasses.contains(typeClass)) { this.typeClasses.remove(typeClass); } } } @Override public String toString() { StringBuilder rtn = new StringBuilder(); rtn.append("Attribute [info="); rtn.append(info); if (this.isStatic() && this.staticValue != null && info.indexOf('=') == -1) { rtn.append(" = "); rtn.append(staticValue); } rtn.append("]"); if (this.annotationRefs.getAutowired() != null) { rtn.append(" "); rtn.append(this.annotationRefs.getAutowired()); } if (this.annotationRefs.getQualifier() != null) { rtn.append(" "); rtn.append(this.annotationRefs.getQualifier()); } return rtn.toString(); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((this.javaClassId == null) ? 0 : this.javaClassId.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (getClass() != obj.getClass()) return false; Attribute other = (Attribute) obj; if (!javaClassId.equals(other.javaClassId)) return false; if (!name.equals(other.name)) return false; return true; } }