package oop;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Reader;
import java.util.HashSet;
import java.util.Properties;
import xtc.parser.ParseException;
import xtc.parser.Result;
import xtc.tree.GNode;
import xtc.tree.Node;
import xtc.tree.Visitor;
import xtc.lang.JavaFiveParser;
/**
* A tool to check dependencies when translating files from Java to C++
*
* -Checks to see if argument files exist
* -Checks to see if all dependencies are accounted for
*
* @author Justin Bernegger
* @version 1.0
*/
public class DependencyMaster extends xtc.util.Tool {
private HashSet<String> qualifiedFileNames;
public String currentFileName;
public DependencyMaster() {
}
public String getName() {
return "Dependency Master";
}
public String copy(){
return "Justin Bernegger";
}
/**
* @param String[] args, the list of filenames
* @return boolean, all the dependencies are accounted for
*/
public boolean checkDependencies(String[] args){
qualifiedFileNames = new HashSet<String>();
qualifiedFileNames.add("String");
qualifiedFileNames.add("Class");
qualifiedFileNames.add("Object");
for(String s : args){
if (s.contains("/")){
qualifiedFileNames.add(s.substring(s.lastIndexOf('/')+1,s.indexOf(".java")));
}
else{
qualifiedFileNames.add(s.substring(0,s.indexOf(".java")));
}
}
for(String s : args){
try {
currentFileName = s;
process(s);
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
};
}
return true;
}
/**
* @param String[] args, the list of filenames
* @return boolean, all the files exist
*/
public boolean checkForFiles(String[] args){
String currentDir = System.getProperty("user.dir");
for(String s : args){
try{
if(!((new File(s).exists())||(new File(currentDir + '/' + s).exists()))){
throw new FileNotFoundException(s);
}
}
catch(FileNotFoundException e){
System.out.println("File required for translation: " + s + "cannot be found.");
e.printStackTrace();
}
}
return true;
}
public Node parse(Reader in, File file) throws IOException, ParseException {
JavaFiveParser parser =
new JavaFiveParser(in, file.toString(), (int)file.length());
Result result = parser.pCompilationUnit(0);
return (Node)parser.value(result);
}
public void process(Node node) {
new Visitor() {
private HashSet<Node> packagesAndImports;
public void visitCompilationUnit(GNode n){
packagesAndImports = new HashSet<Node>();
visit(n);
}
public void visitPackageDeclaration(GNode n){
packagesAndImports.add(n.getNode(1));
visit(n);
}
public void visitImportDeclaration(GNode n){
packagesAndImports.add(n.getNode(1));
visit(n);
}
public void visitQualifiedIdentifier(GNode n){
try{
if (!packagesAndImports.contains(n)){
if (!qualifiedFileNames.contains(n.getString(n.size()-1))){
throw new ClassNotFoundException();
}
}
}
catch(ClassNotFoundException e){
System.out.println("Error in " + currentFileName + ": Class " + (n.getString(n.size()-1)) + " not found in argument list." );
//e.printStackTrace();
}
visit(n);
}
public void visit(Node n) {
for(Object o : n) if (o instanceof Node){
dispatch((Node)o);
}
}
}.dispatch(node);
}
}