package junit.runner;

import java.util.*;
import java.io.*;

/**
 * An implementation of a TestCollector that consults the
 * class path. It considers all classes on the class path
 * excluding classes in JARs. It leaves it up to subclasses
 * to decide whether a class is a runnable Test.
 *
 * @see TestCollector
 */
public abstract class ClassPathTestCollector implements TestCollector {
	
	static final int SUFFIX_LENGTH= ".class".length();
	
	public ClassPathTestCollector() {
	}
	
	public Enumeration collectTests() {
		String classPath= System.getProperty("java.class.path");
		Hashtable result = collectFilesInPath(classPath);
		return result.elements();
	}

	public Hashtable collectFilesInPath(String classPath) {
		Hashtable result= collectFilesInRoots(splitClassPath(classPath));
		return result;
	}
	
	Hashtable collectFilesInRoots(Vector roots) {
                Hashtable<String,String> result= new Hashtable<String,String>(100);
		Enumeration e= roots.elements();
		while (e.hasMoreElements()) 
			gatherFiles(new File((String)e.nextElement()), "", result);
		return result;
	}

    void gatherFiles(File classRoot, String classFileName, Hashtable<String,String> result) {
		File thisRoot= new File(classRoot, classFileName);
		if (thisRoot.isFile()) {
			if (isTestClass(classFileName)) {
				String className= classNameFromFile(classFileName);
				result.put(className, className);
			}
			return;
		}		
		String[] contents= thisRoot.list();
		if (contents != null) { 
			for (int i= 0; i < contents.length; i++) 
				gatherFiles(classRoot, classFileName+File.separatorChar+contents[i], result);		
		}
	}
	
	Vector splitClassPath(String classPath) {
		Vector<String> result= new Vector<String>();
		String separator= System.getProperty("path.separator");
		StringTokenizer tokenizer= new StringTokenizer(classPath, separator);
		while (tokenizer.hasMoreTokens()) 
			result.addElement(tokenizer.nextToken());
		return result;
	}
	
	protected boolean isTestClass(String classFileName) {
		return 
			classFileName.endsWith(".class") && 
			classFileName.indexOf('$') < 0 &&
			classFileName.indexOf("Test") > 0;
	}
	
	protected String classNameFromFile(String classFileName) {
		// convert /a/b.class to a.b
		String s= classFileName.substring(0, classFileName.length()-SUFFIX_LENGTH);
		String s2= s.replace(File.separatorChar, '.');
		if (s2.startsWith("."))
			return s2.substring(1);
		return s2;
	}	
}
