Class ClassEnvy

java.lang.Object
edu.umd.cs.findbugs.visitclass.BetterVisitor
edu.umd.cs.findbugs.visitclass.PreorderVisitor
edu.umd.cs.findbugs.visitclass.AnnotationVisitor
edu.umd.cs.findbugs.visitclass.DismantleBytecode
edu.umd.cs.findbugs.BytecodeScanningDetector
com.mebigfatguy.fbcontrib.detect.ClassEnvy
All Implemented Interfaces:
edu.umd.cs.findbugs.Detector, edu.umd.cs.findbugs.Priorities, org.apache.bcel.classfile.Visitor

public class ClassEnvy extends edu.umd.cs.findbugs.BytecodeScanningDetector
finds methods that excessively use methods from another class. This probably means these methods should be defined in that other class.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    private static final Comparator<Map.Entry<String,BitSet>>
     
    private final edu.umd.cs.findbugs.BugReporter
     
    private Map<String,BitSet>
     
    private String
     
    private static final double
     
    private static final int
     
    private static final String
     
    private double
     
    private static final Set<String>
     
    private boolean
     
    private String
     
    private int
     
    private String
     
    private String
     
    private edu.umd.cs.findbugs.OpcodeStack
     
    private int
     

    Fields inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode

    codeBytes, lineNumberTable, M_BR, M_CP, M_INT, M_PAD, M_R, M_UINT

    Fields inherited from interface edu.umd.cs.findbugs.Priorities

    EXP_PRIORITY, HIGH_PRIORITY, IGNORE_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITY
  • Constructor Summary

    Constructors
    Constructor
    Description
    ClassEnvy(edu.umd.cs.findbugs.BugReporter bugReporter)
    constructs a CE detector given the reporter to report bugs on
  • Method Summary

    Modifier and Type
    Method
    Description
    private void
    addLineNumber(BitSet lineNumbers)
    add the current line number to a set of line numbers
    private boolean
    countClassAccess(int classAtStackIndex)
    increment the count of class access of the class on the stack
    private void
    countClassAccess(String calledClass)
    increment the count of class access of the specified class if it is in a similar package to the caller, and is not general purpose
    private boolean
    checks to see if the specified class is a built in class, or implements a simple interface
    private boolean
    return whether or not a class implements a common or marker interface
    private boolean
    returns whether the called class is an inner class, or super class of the current class
    void
    sawOpcode(int seen)
    overrides the visitor to look for method calls, and populate a class access count map based on the owning class of methods called.
    void
    visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext)
    overrides the visitor to collect package and class names
    void
    visitCode(org.apache.bcel.classfile.Code obj)
    overrides the visitor to look for the method that uses another class the most, and if it exceeds the threshold reports it
    void
    visitMethod(org.apache.bcel.classfile.Method obj)
    overrides the visitor to check whether the method is static

    Methods inherited from class edu.umd.cs.findbugs.BytecodeScanningDetector

    getClassContext, report, shouldVisitCode

    Methods inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode

    afterOpcode, areOppositeBranches, atCatchBlock, beforeOpcode, getBranchFallThrough, getBranchOffset, getBranchTarget, getClassConstantOperand, getClassDescriptorOperand, getCodeByte, getConstantRefOperand, getDefaultSwitchOffset, getDottedClassConstantOperand, getFieldDescriptorOperand, getIntConstant, getLongConstant, getMaxPC, getMethodDescriptorOperand, getNameConstantOperand, getNextCodeByte, getNextOpcode, getNextPC, getOpcode, getPC, getPrevOpcode, getRefConstantOperand, getRefFieldIsStatic, getRegisterOperand, getSigConstantOperand, getStringConstantOperand, getSwitchLabels, getSwitchOffsets, getXClassOperand, getXFieldOperand, getXMethodOperand, isBranch, isMethodCall, isRegisterLoad, isRegisterStore, isRegisterStore, isReturn, isShift, isSwitch, isWideOpcode, printOpCode, sawBranchTo, sawClass, sawDouble, sawField, sawFloat, sawIMethod, sawInt, sawLong, sawMethod, sawRegister, sawString, visit

    Methods inherited from class edu.umd.cs.findbugs.visitclass.AnnotationVisitor

    getAnnotationParameterAsEnum, getAnnotationParameterAsString, getAnnotationParameterAsStringArray, visitAnnotation, visitAnnotation, visitParameterAnnotation, visitParameterAnnotation, visitSyntheticParameterAnnotation

    Methods inherited from class edu.umd.cs.findbugs.visitclass.PreorderVisitor

    amVisitingMainMethod, asUnsignedByte, doVisitMethod, getClassDescriptor, getClassName, getCode, getConstantPool, getDottedClassName, getDottedFieldSig, getDottedMethodSig, getDottedSuperclassName, getField, getFieldDescriptor, getFieldIsStatic, getFieldName, getFieldSig, getFullyQualifiedFieldName, getFullyQualifiedMethodName, getMethod, getMethodDescriptor, getMethodName, getMethodSig, getMethodVisitOrder, getNumberArguments, getNumberMethodArguments, getPackageName, getSizeOfSurroundingTryBlock, getSizeOfSurroundingTryBlock, getSourceFile, getStringFromIndex, getSuperclassName, getSurroundingCaughtExceptions, getSurroundingCaughtExceptions, getSurroundingCaughtExceptionTypes, getSurroundingTryBlock, getSurroundingTryBlock, getThisClass, getXClass, getXField, getXMethod, hasInterestingClass, hasInterestingMethod, isVisitMethodsInCallOrder, setupVisitorForClass, setVisitMethodsInCallOrder, shouldVisit, toString, visitAfter, visitAfter, visitAnnotationDefault, visitAnnotationEntry, visitBootstrapMethods, visitConstantInvokeDynamic, visitConstantMethodHandle, visitConstantMethodType, visitConstantModule, visitConstantPackage, visitConstantPool, visitEnclosingMethod, visitingField, visitingMethod, visitInnerClasses, visitJavaClass, visitLineNumberTable, visitLocalVariableTable, visitMethodParameters, visitParameterAnnotationEntry, visitStackMap, visitStackMapEntry

    Methods inherited from class edu.umd.cs.findbugs.visitclass.BetterVisitor

    clone, report, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visitCodeException, visitConstantClass, visitConstantDouble, visitConstantFieldref, visitConstantFloat, visitConstantInteger, visitConstantInterfaceMethodref, visitConstantLong, visitConstantMethodref, visitConstantNameAndType, visitConstantString, visitConstantUtf8, visitConstantValue, visitDeprecated, visitExceptionTable, visitField, visitInnerClass, visitLineNumber, visitLocalVariable, visitLocalVariableTypeTable, visitSignature, visitSourceFile, visitSynthetic, visitUnknown

    Methods inherited from class java.lang.Object

    equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

    Methods inherited from interface org.apache.bcel.classfile.Visitor

    visitConstantDynamic, visitMethodParameter, visitModule, visitModuleExports, visitModuleMainClass, visitModuleOpens, visitModulePackages, visitModuleProvides, visitModuleRequires, visitNestHost, visitNestMembers, visitRecord, visitRecordComponent, visitStackMapType
  • Field Details

    • DEFAULT_ENVY_PERCENT

      private static final double DEFAULT_ENVY_PERCENT
      See Also:
    • DEFAULT_MIN_ENVY

      private static final int DEFAULT_MIN_ENVY
      See Also:
    • ENVY_PERCENT_PROPERTY

      private static final String ENVY_PERCENT_PROPERTY
      See Also:
    • ignorableInterfaces

      private static final Set<String> ignorableInterfaces
    • ACCESS_COUNT_COMPARATOR

      private static final Comparator<Map.Entry<String,BitSet>> ACCESS_COUNT_COMPARATOR
    • bugReporter

      private final edu.umd.cs.findbugs.BugReporter bugReporter
    • stack

      private edu.umd.cs.findbugs.OpcodeStack stack
    • packageName

      private String packageName
    • clsName

      @DottedClassName private String clsName
    • parentClassName

      @DottedClassName private String parentClassName
    • clsAccessCount

      private Map<String,BitSet> clsAccessCount
    • thisClsAccessCount

      private int thisClsAccessCount
    • methodName

      private String methodName
    • methodIsStatic

      private boolean methodIsStatic
    • envyPercent

      private double envyPercent
    • minEnvy

      private int minEnvy
  • Constructor Details

    • ClassEnvy

      public ClassEnvy(edu.umd.cs.findbugs.BugReporter bugReporter)
      constructs a CE detector given the reporter to report bugs on
      Parameters:
      bugReporter - the sync of bug reports
  • Method Details

    • visitClassContext

      public void visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext)
      overrides the visitor to collect package and class names
      Specified by:
      visitClassContext in interface edu.umd.cs.findbugs.Detector
      Overrides:
      visitClassContext in class edu.umd.cs.findbugs.BytecodeScanningDetector
      Parameters:
      classContext - the context object that holds the JavaClass being parsed
    • visitMethod

      public void visitMethod(org.apache.bcel.classfile.Method obj)
      overrides the visitor to check whether the method is static
      Specified by:
      visitMethod in interface org.apache.bcel.classfile.Visitor
      Overrides:
      visitMethod in class edu.umd.cs.findbugs.visitclass.BetterVisitor
      Parameters:
      obj - the method currently being parsed
    • visitCode

      public void visitCode(org.apache.bcel.classfile.Code obj)
      overrides the visitor to look for the method that uses another class the most, and if it exceeds the threshold reports it
      Specified by:
      visitCode in interface org.apache.bcel.classfile.Visitor
      Overrides:
      visitCode in class edu.umd.cs.findbugs.visitclass.PreorderVisitor
      Parameters:
      obj - the code that is currently being parsed
    • sawOpcode

      public void sawOpcode(int seen)
      overrides the visitor to look for method calls, and populate a class access count map based on the owning class of methods called.
      Overrides:
      sawOpcode in class edu.umd.cs.findbugs.visitclass.DismantleBytecode
      Parameters:
      seen - the opcode currently being parsed
    • implementsCommonInterface

      private boolean implementsCommonInterface(String name)
      return whether or not a class implements a common or marker interface
      Parameters:
      name - the class name to check
      Returns:
      if this class implements a common or marker interface
    • countClassAccess

      private boolean countClassAccess(int classAtStackIndex)
      increment the count of class access of the class on the stack
      Parameters:
      classAtStackIndex - the position on the stack of the class in question
      Returns:
      true if the class is counted
    • countClassAccess

      private void countClassAccess(@DottedClassName String calledClass)
      increment the count of class access of the specified class if it is in a similar package to the caller, and is not general purpose
      Parameters:
      calledClass - the class to check
    • isAssociatedClass

      private boolean isAssociatedClass(@DottedClassName String calledClass)
      returns whether the called class is an inner class, or super class of the current class
      Parameters:
      calledClass - the class to check
      Returns:
      if the class is related to this class
    • addLineNumber

      private void addLineNumber(BitSet lineNumbers)
      add the current line number to a set of line numbers
      Parameters:
      lineNumbers - the current set of line numbers
    • generalPurpose

      private boolean generalPurpose(String className)
      checks to see if the specified class is a built in class, or implements a simple interface
      Parameters:
      className - the class in question
      Returns:
      whether or not the class is general purpose