package org.enumerable.lambda.weaving; import java.util.HashSet; import java.util.Set; import java.util.regex.Pattern; import static java.lang.System.getProperty; /** * Filters the classes to be instrumented, based on a blacklist or a white list * and a regexp pattern. */ public class ClassFilter { @SuppressWarnings("serial") private Set<String> packagesToSkip = new HashSet<String>() { { add("java."); add("javax."); add("sun."); add("$Proxy"); add("org.eclipse.jdt.internal."); add("org.junit."); add("junit."); add("com.sun."); add("clojure."); add("org.jruby."); add("org.codehaus.groovy."); add("org.osgi."); add("org.enumerable.lambda.weaving."); add("org.enumerable.lambda.asm."); add("groovy."); add("scala."); add("Script"); add("org.enumerable.lambda.enumerable.jruby."); add("Enumerable"); } }; private Set<String> packagesToInclude = new HashSet<String>(); private Pattern excludePattern; public ClassFilter(String skippedPackages, String includedPackages, String excludePatternString) { addSkippedPackages(skippedPackages); addIncludedPackages(includedPackages); if (!"".equals(excludePatternString.trim())) { this.excludePattern = Pattern.compile(excludePatternString); } } public static ClassFilter createClassFilter() { return new ClassFilter(getProperty("lambda.weaving.skipped.packages", ""), getProperty("lambda.weaving.included.packages", ""), getProperty("lambda.weaving.exclude.pattern", "")); } private void addIncludedPackages(String agentArgs) { for (String prefix : agentArgs.split(",")) { String trim = prefix.trim(); if (trim.length() > 0) packagesToInclude.add(trim); } } private void addSkippedPackages(String agentArgs) { for (String prefix : agentArgs.split(",")) { String trim = prefix.trim(); if (trim.length() > 0) packagesToSkip.add(trim); } } public boolean isToBeInstrumented(String name) { return packageIncluded(name) && (excludePattern == null || !excludePattern.matcher(name).find()); } private boolean packageIncluded(String name) { if (packagesToInclude.size() > 0) { for (String prefix : packagesToInclude) if (name.startsWith(prefix)) return true; return false; } for (String prefix : packagesToSkip) if (name.startsWith(prefix)) return false; return true; } }