package net.sf.cotta.utils;
import net.sf.cotta.TDirectory;
import net.sf.cotta.TFile;
import net.sf.cotta.TFileFilter;
import net.sf.cotta.TIoException;
import java.util.ArrayList;
import java.util.List;
public class ClassCollector {
private TDirectory directory;
private String packageNamePrefix;
private TFileFilter filter;
public ClassCollector(TDirectory directory, String packageName) {
this(directory, packageName, new TFileFilter() {
public boolean accept(TFile file) {
return file.name().endsWith("Behaviour.class");
}
});
}
public ClassCollector(TDirectory directory, String packageName, TFileFilter filter) {
this.directory = directory;
this.packageNamePrefix = packageName.length() == 0 ? "" : packageName + ".";
this.filter = filter;
}
public List<String> collectNames() throws TIoException {
ArrayList<String> result = new ArrayList<String>();
collectClasses(result);
collectSubDirectories(result);
return result;
}
private void collectClasses(ArrayList<String> result) throws TIoException {
for (TFile file : directory.list().files()) {
if (looksLikeBehaviourClassFile(file)) {
result.add(fullClassName(shortClassName(file.name())));
}
}
}
private void collectSubDirectories(List<String> result) throws TIoException {
for (TDirectory directory : this.directory.list().dirs()) {
ClassCollector classCollector = new ClassCollector(directory, packageNamePrefix + directory.name(), filter);
result.addAll(classCollector.collectNames());
}
}
private boolean looksLikeBehaviourClassFile(TFile file) {
return filter.accept(file);
}
private String fullClassName(String shortClassName) {
return new StringBuffer(packageNamePrefix).append(shortClassName).toString();
}
private String shortClassName(String fileName) {
return fileName.substring(0, fileName.length() - ".class".length());
}
}