/******************************************************************************
* Copyright (C) 2013 Fabio Zadrozny and others
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Fabio Zadrozny <fabiofz@gmail.com> - initial API and implementation
* Andrew Ferrazzutti <aferrazz@redhat.com> - ongoing maintenance
******************************************************************************/
package junit3.runner;
import java.io.File;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.StringTokenizer;
import java.util.Vector;
/**
* 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() {
}
@Override
public Enumeration<String> collectTests() {
String classPath= System.getProperty("java.class.path");
Hashtable<String, String> result = collectFilesInPath(classPath);
return result.elements();
}
public Hashtable<String, String> collectFilesInPath(String classPath) {
Hashtable<String, String> result= collectFilesInRoots(splitClassPath(classPath));
return result;
}
Hashtable<String, String> collectFilesInRoots(Vector roots) {
Hashtable<String, String> result= new Hashtable(100);
Enumeration<String> 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<String> 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;
}
}