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 result= new Hashtable(100);
		Enumeration e= roots.elements();
		while (e.hasMoreElements()) 
			gatherFiles(new File((String)e.nextElement()), "", result);
		return result;
	}

	void gatherFiles(File classRoot, String classFileName, Hashtable 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 result= new Vector();
		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;
	}	
}
