package dml;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class CompilerArgs {
boolean generateFinals = false;
File destDirectoryBase = null;
File destDirectory = null;
String packageName = "";
List<URL> dmls = new ArrayList<URL>();
Class<? extends CodeGenerator> generatorClass = CodeGenerator.class;
Class<? extends DomainModel> domainModelClass = DomainModel.class;
public CompilerArgs(File destDirectory, File destDirectoryBase, String packageName, Boolean generateFinals,
Class<? extends CodeGenerator> generatorClass, Class<? extends DomainModel> domainModelClass, List<URL> dmls) {
this.destDirectory = destDirectory;
this.destDirectoryBase = destDirectoryBase;
this.packageName = packageName;
this.generateFinals = generateFinals;
this.generatorClass = generatorClass != null ? generatorClass : CodeGenerator.class;
this.domainModelClass = domainModelClass != null ? domainModelClass : DomainModel.class;
this.dmls.addAll(dmls);
checkArguments();
}
public CompilerArgs(String[] args) throws Exception {
processCommandLineArgs(args);
checkArguments();
}
void checkArguments() {
if (destDirectory == null) {
error("destination directory is not specified");
}
if (!destDirectory.isDirectory()) {
error(destDirectory.toString() + " is not a readable directory");
}
if (dmls.isEmpty()) {
error("no domainSpec files given");
}
}
void processCommandLineArgs(String[] args) throws Exception {
boolean processingOptions = true;
int num = 0;
while (num < args.length) {
if (processingOptions) {
int newNum = processOption(args, num);
processingOptions = (newNum != num);
num = newNum;
} else {
dmls.add(new File(args[num]).toURI().toURL());
num++;
}
}
}
int processOption(String[] args, int pos) throws Exception {
if (args[pos].equals("-d")) {
destDirectory = new File(getNextArgument(args, pos));
return pos + 2;
} else if (args[pos].equals("-db")) {
destDirectoryBase = new File(getNextArgument(args, pos));
return pos + 2;
} else if (args[pos].equals("-p")) {
packageName = getNextArgument(args, pos);
return pos + 2;
} else if (args[pos].equals("-f")) {
error("option -f no longer exists (use -generator and -domainModelClass instead)");
} else if (args[pos].equals("-gf")) {
generateFinals = true;
return pos + 1;
} else if (args[pos].equals("-generator")) {
generatorClass = (Class<? extends CodeGenerator>) Class.forName(getNextArgument(args, pos));
return pos + 2;
} else if (args[pos].equals("-domainModelClass")) {
domainModelClass = (Class<? extends DomainModel>) Class.forName(getNextArgument(args, pos));
return pos + 2;
}
return pos;
}
String getNextArgument(String[] args, int pos) {
int nextPos = pos + 1;
if (nextPos < args.length) {
return args[nextPos];
} else {
error("option " + args[pos] + " requires argument");
}
return null;
}
void error(String msg) {
System.err.println("DmlCompiler: " + msg);
System.exit(1);
}
public Class<? extends CodeGenerator> getCodeGenerator() {
return generatorClass;
}
}