1 package net.sf.clirr.core; 20 21 import org.apache.bcel.classfile.JavaClass; 22 23 import java.util.ArrayList ; 24 import java.util.Iterator ; 25 26 33 public final class ClassSelector implements ClassFilter 34 { 35 36 public static final class Mode 37 { 38 private Mode() 39 { 40 } 41 } 42 43 44 public static final Mode MODE_IF = new Mode(); 45 46 public static final Mode MODE_UNLESS = new Mode(); 47 48 private Mode mode; 49 50 private ArrayList packages = new ArrayList (); 51 private ArrayList packageTrees = new ArrayList (); 52 private ArrayList classes = new ArrayList (); 53 54 67 public ClassSelector(Mode mode) 68 { 69 this.mode = mode; 70 } 71 72 75 public void addPackage(String packageName) 76 { 77 packages.add(packageName); 78 } 79 80 83 public void addPackageTree(String packageName) 84 { 85 packages.add(packageName); 86 } 87 88 91 public void addClass(String classname) 92 { 93 classes.add(classname); 94 } 95 96 100 public boolean isSelected(JavaClass clazz) 101 { 102 if (isAnonymousInnerClass(clazz)) 103 { 104 return false; 105 } 106 107 boolean matches = matchesCriteria(clazz); 108 if (mode == MODE_IF) 109 { 110 return matches; 111 } 112 else { 114 return !matches; 115 } 116 } 117 118 123 private boolean isAnonymousInnerClass(JavaClass clazz) 124 { 125 String name = clazz.getClassName(); 126 int dollarPos = name.indexOf('$'); 127 if (dollarPos == -1) 128 { 129 return false; 130 } 131 132 for (int i = dollarPos + 1; i < name.length(); ++i) 133 { 134 if (!Character.isDigit(name.charAt(i))) 135 { 136 return false; 137 } 138 } 139 140 return true; 143 } 144 145 149 private boolean matchesCriteria(JavaClass clazz) 150 { 151 String packageName = clazz.getPackageName(); 152 if (packages.contains(packageName)) 153 { 154 return true; 155 } 156 157 for (Iterator i = packageTrees.iterator(); i.hasNext();) 158 { 159 String entry = (String ) i.next(); 160 if (packageName.startsWith(entry)) 161 { 162 if (packageName.length() == entry.length()) 163 { 164 return true; 166 } 167 168 if (packageName.charAt(entry.length()) == '.') 169 { 170 return true; 171 } 172 173 } 176 } 177 178 String className = clazz.getClassName(); 179 for (Iterator i = classes.iterator(); i.hasNext();) 180 { 181 String entry = (String ) i.next(); 182 183 if (className.startsWith(entry)) 184 { 185 if (className.length() == entry.length()) 186 { 187 return true; 189 } 190 191 if (className.charAt(entry.length()) == '$') 192 { 193 return true; 195 } 196 } 197 } 198 199 return false; 200 } 201 } 202 203 | Popular Tags |