1 package junit.runner; 2 3 import java.util.*; 4 import java.io.*; 5 6 /** 7 * An implementation of a TestCollector that consults the 8 * class path. It considers all classes on the class path 9 * excluding classes in JARs. It leaves it up to subclasses 10 * to decide whether a class is a runnable Test. 11 * 12 * @see TestCollector 13 */ 14 public abstract class ClassPathTestCollector implements TestCollector { 15 16 static final int SUFFIX_LENGTH= ".class".length(); 17 18 public ClassPathTestCollector() { 19 } 20 21 public Enumeration collectTests() { 22 String classPath= System.getProperty("java.class.path"); 23 Hashtable result = collectFilesInPath(classPath); 24 return result.elements(); 25 } 26 27 public Hashtable collectFilesInPath(String classPath) { 28 Hashtable result= collectFilesInRoots(splitClassPath(classPath)); 29 return result; 30 } 31 32 Hashtable collectFilesInRoots(Vector roots) { 33 Hashtable<String,String> result= new Hashtable<String,String>(100); 34 Enumeration e= roots.elements(); 35 while (e.hasMoreElements()) 36 gatherFiles(new File((String)e.nextElement()), "", result); 37 return result; 38 } 39 40 void gatherFiles(File classRoot, String classFileName, Hashtable<String,String> result) { 41 File thisRoot= new File(classRoot, classFileName); 42 if (thisRoot.isFile()) { 43 if (isTestClass(classFileName)) { 44 String className= classNameFromFile(classFileName); 45 result.put(className, className); 46 } 47 return; 48 } 49 String[] contents= thisRoot.list(); 50 if (contents != null) { 51 for (int i= 0; i < contents.length; i++) 52 gatherFiles(classRoot, classFileName+File.separatorChar+contents[i], result); 53 } 54 } 55 56 Vector splitClassPath(String classPath) { 57 Vector<String> result= new Vector<String>(); 58 String separator= System.getProperty("path.separator"); 59 StringTokenizer tokenizer= new StringTokenizer(classPath, separator); 60 while (tokenizer.hasMoreTokens()) 61 result.addElement(tokenizer.nextToken()); 62 return result; 63 } 64 65 protected boolean isTestClass(String classFileName) { 66 return 67 classFileName.endsWith(".class") && 68 classFileName.indexOf('$') < 0 && 69 classFileName.indexOf("Test") > 0; 70 } 71 72 protected String classNameFromFile(String classFileName) { 73 // convert /a/b.class to a.b 74 String s= classFileName.substring(0, classFileName.length()-SUFFIX_LENGTH); 75 String s2= s.replace(File.separatorChar, '.'); 76 if (s2.startsWith(".")) 77 return s2.substring(1); 78 return s2; 79 } 80 } 81