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  * {@hide} - Not needed for 1.0 SDK
14  */
15 public abstract class ClassPathTestCollector implements TestCollector {
16 
17     static final int SUFFIX_LENGTH= ".class".length();
18 
ClassPathTestCollector()19     public ClassPathTestCollector() {
20     }
21 
collectTests()22     public Enumeration collectTests() {
23         String classPath= System.getProperty("java.class.path");
24         Hashtable result = collectFilesInPath(classPath);
25         return result.elements();
26     }
27 
collectFilesInPath(String classPath)28     public Hashtable collectFilesInPath(String classPath) {
29         Hashtable result= collectFilesInRoots(splitClassPath(classPath));
30         return result;
31     }
32 
collectFilesInRoots(Vector roots)33     Hashtable collectFilesInRoots(Vector roots) {
34         Hashtable result= new Hashtable(100);
35         Enumeration e= roots.elements();
36         while (e.hasMoreElements())
37             gatherFiles(new File((String)e.nextElement()), "", result);
38         return result;
39     }
40 
gatherFiles(File classRoot, String classFileName, Hashtable result)41     void gatherFiles(File classRoot, String classFileName, Hashtable result) {
42         File thisRoot= new File(classRoot, classFileName);
43         if (thisRoot.isFile()) {
44             if (isTestClass(classFileName)) {
45                 String className= classNameFromFile(classFileName);
46                 result.put(className, className);
47             }
48             return;
49         }
50         String[] contents= thisRoot.list();
51         if (contents != null) {
52             for (int i= 0; i < contents.length; i++)
53                 gatherFiles(classRoot, classFileName+File.separatorChar+contents[i], result);
54         }
55     }
56 
splitClassPath(String classPath)57     Vector splitClassPath(String classPath) {
58         Vector result= new Vector();
59         String separator= System.getProperty("path.separator");
60         StringTokenizer tokenizer= new StringTokenizer(classPath, separator);
61         while (tokenizer.hasMoreTokens())
62             result.addElement(tokenizer.nextToken());
63         return result;
64     }
65 
isTestClass(String classFileName)66     protected boolean isTestClass(String classFileName) {
67         return
68                 classFileName.endsWith(".class") &&
69                 classFileName.indexOf('$') < 0 &&
70                 classFileName.indexOf("Test") > 0;
71     }
72 
classNameFromFile(String classFileName)73     protected String classNameFromFile(String classFileName) {
74         // convert /a/b.class to a.b
75         String s= classFileName.substring(0, classFileName.length()-SUFFIX_LENGTH);
76         String s2= s.replace(File.separatorChar, '.');
77         if (s2.startsWith("."))
78             return s2.substring(1);
79         return s2;
80     }
81 }
82