/* * FindBugs - Find Bugs in Java programs * Copyright (C) 2006, University of Maryland * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package edu.umd.cs.findbugs.classfile.analysis; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Set; import javax.annotation.Nonnull; import org.objectweb.asm.Opcodes; import edu.umd.cs.findbugs.classfile.ClassDescriptor; import edu.umd.cs.findbugs.classfile.IClassConstants; import edu.umd.cs.findbugs.classfile.ICodeBaseEntry; /** * Represents the class name, superclass name, and interface list of a class. * * @author David Hovemeyer */ public class ClassNameAndSuperclassInfo extends ClassDescriptor { private final ClassDescriptor superclassDescriptor; private final ClassDescriptor[] interfaceDescriptorList; private final ICodeBaseEntry codeBaseEntry; private final int accessFlags; private final Set<ClassDescriptor> calledClassDescriptors; private final int majorVersion, minorVersion; public static class Builder { ClassDescriptor classDescriptor; ClassDescriptor superclassDescriptor; ClassDescriptor[] interfaceDescriptorList; ICodeBaseEntry codeBaseEntry; int accessFlags; int majorVersion, minorVersion; Collection<ClassDescriptor> referencedClassDescriptorList; Set<ClassDescriptor> calledClassDescriptors = Collections.<ClassDescriptor> emptySet(); public ClassNameAndSuperclassInfo build() { return new ClassNameAndSuperclassInfo(classDescriptor, superclassDescriptor, interfaceDescriptorList, codeBaseEntry, accessFlags, referencedClassDescriptorList, calledClassDescriptors, majorVersion, minorVersion); } /** * @param accessFlags * The accessFlags to set. */ public void setAccessFlags(int accessFlags) { this.accessFlags = accessFlags; } /** * @param classDescriptor * The classDescriptor to set. */ public void setClassDescriptor(ClassDescriptor classDescriptor) { this.classDescriptor = classDescriptor; } /** * @param codeBaseEntry * The codeBaseEntry to set. */ public void setCodeBaseEntry(ICodeBaseEntry codeBaseEntry) { this.codeBaseEntry = codeBaseEntry; } /** * @param interfaceDescriptorList * The interfaceDescriptorList to set. */ public void setInterfaceDescriptorList(ClassDescriptor[] interfaceDescriptorList) { this.interfaceDescriptorList = interfaceDescriptorList; } /** * @param superclassDescriptor * The superclassDescriptor to set. */ public void setSuperclassDescriptor(ClassDescriptor superclassDescriptor) { this.superclassDescriptor = superclassDescriptor; } public void setClassfileVersion(int majorVersion, int minorVersion) { this.majorVersion = majorVersion; this.minorVersion = minorVersion; } /** * @param referencedClassDescriptorList * The referencedClassDescriptorList to set. */ public void setReferencedClassDescriptors(Collection<ClassDescriptor> referencedClassDescriptorList) { if (referencedClassDescriptorList.size() == 0) this.referencedClassDescriptorList = Collections.emptyList(); else this.referencedClassDescriptorList = new ArrayList<ClassDescriptor>(referencedClassDescriptorList); } public void setCalledClassDescriptors(Collection<ClassDescriptor> calledClassDescriptorList) { if (calledClassDescriptorList.size() == 0) this.calledClassDescriptors = Collections.emptySet(); else this.calledClassDescriptors = new HashSet<ClassDescriptor>(calledClassDescriptorList); } } ClassNameAndSuperclassInfo(ClassDescriptor classDescriptor, ClassDescriptor superclassDescriptor, ClassDescriptor[] interfaceDescriptorList, ICodeBaseEntry codeBaseEntry, int accessFlags, /* TODO: We aren't doing anything with this */ Collection<ClassDescriptor> referencedClassDescriptorList, @Nonnull Set<ClassDescriptor> calledClassDescriptors, int majorVersion, int minorVersion) { super(classDescriptor.getClassName()); this.superclassDescriptor = superclassDescriptor; this.interfaceDescriptorList = interfaceDescriptorList; this.codeBaseEntry = codeBaseEntry; this.accessFlags = accessFlags; if (calledClassDescriptors == null) throw new NullPointerException("calledClassDescriptors must not be null"); this.calledClassDescriptors = calledClassDescriptors; this.majorVersion = majorVersion; this.minorVersion = minorVersion; } /** * @return Returns the accessFlags. */ public int getAccessFlags() { return accessFlags; } /** * @return Returns the majorVersion. */ public int getMajorVersion() { return majorVersion; } /** * @return Returns the minorVersion. */ public int getMinorVersion() { return minorVersion; } /** * @return Returns the classDescriptor. */ public ClassDescriptor getClassDescriptor() { return this; } /** * @return Returns the codeBaseEntry. */ public ICodeBaseEntry getCodeBaseEntry() { return codeBaseEntry; } /** * @return Returns the interfaceDescriptorList. */ public ClassDescriptor[] getInterfaceDescriptorList() { return interfaceDescriptorList; } /** * @return Returns the called class descriptors. */ public Set<ClassDescriptor> getCalledClassDescriptors() { return calledClassDescriptors; } /** * @return Returns the superclassDescriptor. */ public ClassDescriptor getSuperclassDescriptor() { return superclassDescriptor; } private boolean isFlagSet(int flag) { return (getAccessFlags() & flag) != 0; } public boolean isFinal() { return isFlagSet(IClassConstants.ACC_FINAL); } public boolean isPrivate() { return isFlagSet(IClassConstants.ACC_PRIVATE); } public boolean isProtected() { return isFlagSet(IClassConstants.ACC_PROTECTED); } public boolean isPublic() { return isFlagSet(IClassConstants.ACC_PUBLIC); } public boolean isStatic() { return isFlagSet(IClassConstants.ACC_STATIC); } public boolean isInterface() { return isFlagSet(IClassConstants.ACC_INTERFACE); } public boolean isAbstract() { return isFlagSet(IClassConstants.ACC_ABSTRACT); } public boolean isAnnotation() { return isFlagSet(IClassConstants.ACC_ANNOTATION); } public boolean isSynthetic() { return isFlagSet(IClassConstants.ACC_SYNTHETIC); } public boolean isDeprecated() { return isFlagSet(Opcodes.ACC_DEPRECATED); } }