package xtc.translator.translation;
import java.io.File;
import java.io.FileReader;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import xtc.lang.JavaFiveParser;
import xtc.parser.ParseException;
import xtc.parser.Result;
import xtc.tree.Node;
public class PackageResolver {
private String mainClass;
private ProtoClass mainProtoClass;
private String classpath;
private ArrayList<ProtoClass> protoClasses;
private FilenameFilter javaSrcFilter;
public PackageResolver(String mainClass, String classpath){
this.mainClass = mainClass;
this.mainProtoClass = null;
this.classpath = classpath;
this.protoClasses = new ArrayList<ProtoClass>();
this.javaSrcFilter = new FilenameFilter() {
public boolean accept(File dir, String name) {
String lowercaseName = name.toLowerCase();
if (lowercaseName.endsWith(".java")) {
return true;
} else {
return false;
}
}
};
}
/**
* Visable method.
*
* @throws IOException
* @throws ParseException
*/
public void collect() throws IOException, ParseException{
collect(classpath);
}
/**
* Recursive version for traversing directories
* @param path
*/
private void collect(String path) throws IOException, ParseException {
//TODO: might wanna remove the ./ before things if there is one
File src = new File(path);
for (File file : src.listFiles()) {
if (file.isDirectory()) {
collect(file.toString());
}
}
// Get java files
for (File javaFile : src.listFiles(javaSrcFilter)) {
String packageName = javaFile.getParent().toString().replace("/", ".");
FileReader in = new FileReader(javaFile);
JavaFiveParser parser = new JavaFiveParser(in, javaFile.toString(), (int) javaFile.length());
Result result = parser.pCompilationUnit(0);
Node node = (Node) parser.value(result);
ProtoClass protoClass = new ProtoClass(packageName, node);
if (path.equals(mainClass)) {
this.mainProtoClass = protoClass;
}
protoClasses.add(new ProtoClass(packageName, node));
}
}
public ArrayList<ProtoClass> getProtoClasses() {
return protoClasses;
}
public ProtoClass getMainProtoClass() {
return mainProtoClass;
}
public void setMainProtoClass(ProtoClass mainProtoClass) {
this.mainProtoClass = mainProtoClass;
}
}