package japicmp.filter; import javassist.*; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; public class Filters { private static final Logger LOGGER = Logger.getLogger(Filters.class.getName()); private final List<Filter> includes = new ArrayList<>(); private final List<Filter> excludes = new ArrayList<>(); public List<Filter> getIncludes() { return includes; } public List<Filter> getExcludes() { return excludes; } public boolean includeClass(CtClass ctClass) { String name = ctClass.getName(); for (Filter filter : excludes) { if (filter instanceof ClassFilter) { ClassFilter classFilter = (ClassFilter) filter; if (classFilter.matches(ctClass)) { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.log(Level.FINE, "Excluding class '" + name + "' because class filter '" + filter + "' matches."); } return false; } } } int includeCount = 0; for (Filter filter : includes) { includeCount++; if (filter instanceof BehaviorFilter) { BehaviorFilter behaviorFilter = (BehaviorFilter) filter; CtMethod[] methods = ctClass.getDeclaredMethods(); for (CtMethod method : methods) { if (behaviorFilter.matches(method)) { return true; } } CtConstructor[] constructors = ctClass.getDeclaredConstructors(); for (CtConstructor constructor : constructors) { if (behaviorFilter.matches(constructor)) { return true; } } } else if (filter instanceof FieldFilter) { FieldFilter fieldFilter = (FieldFilter) filter; CtField[] fields = ctClass.getDeclaredFields(); for (CtField field : fields) { if (fieldFilter.matches(field)) { return true; } } } else { ClassFilter classFilter = (ClassFilter) filter; if (classFilter.matches(ctClass)) { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.log(Level.FINE, "Including class '" + name + "' because class filter '" + filter + "' matches."); } return true; } } } if (includeCount > 0) { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.log(Level.FINE, "Excluding class '" + name + "' because no include matched."); } return false; } return true; } public boolean includeBehavior(CtBehavior ctMethod) { for (Filter filter : excludes) { if (filter instanceof BehaviorFilter) { BehaviorFilter behaviorFilter = (BehaviorFilter) filter; if (behaviorFilter.matches(ctMethod)) { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.log(Level.FINE, "Excluding method '" + ctMethod.getLongName() + "' because exclude method filter did match."); } return false; } } } int includesCount = 0; for (Filter filter : includes) { if (filter instanceof BehaviorFilter) { includesCount++; BehaviorFilter behaviorFilter = (BehaviorFilter) filter; if (behaviorFilter.matches(ctMethod)) { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.log(Level.FINE, "Including method '" + ctMethod.getLongName() + "' because include method filter matched."); } return true; } } } if (includesCount > 0) { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.log(Level.FINE, "Excluding method '" + ctMethod.getLongName() + "' because no include matched."); } return false; } return true; } public boolean includeField(CtField ctField) { for (Filter filter : excludes) { if (filter instanceof FieldFilter) { FieldFilter fieldFilter = (FieldFilter) filter; if (fieldFilter.matches(ctField)) { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.log(Level.FINE, "Excluding field '" + ctField.getName() + "' because exclude field filter did match."); } return false; } } } int includesCount = 0; for (Filter filter : includes) { if (filter instanceof FieldFilter) { FieldFilter fieldFilter = (FieldFilter) filter; includesCount++; if (fieldFilter.matches(ctField)) { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.log(Level.FINE, "Including field '" + ctField.getName() + "' because include field filter matched."); } return true; } } } if (includesCount > 0) { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.log(Level.FINE, "Excluding field '" + ctField.getName() + "' because no include matched."); } return false; } return true; } }