/**
* Copyright (c) 2009-2011, The HATS Consortium. All rights reserved.
* This file is licensed under the terms of the Modified BSD License.
*/
package abs.backend.java.codegeneration;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class JavaCode {
private final File srcDir;
private final List<File> files = new ArrayList<File>();
private final List<String> mainClasses = new ArrayList<String>();
public JavaCode() throws IOException {
srcDir = File.createTempFile("absjavabackend", Long.toString(System.nanoTime()));
srcDir.delete();
srcDir.mkdir();
}
public JavaCode(File srcDir) {
this.srcDir = srcDir;
}
public void addFile(File file) {
files.add(file);
}
public String[] getFileNames() {
String[] res = new String[files.size()];
int i = 0;
for (File f : files) {
res[i++] = f.getAbsolutePath();
}
return res;
}
public Package createPackage(String packageName) {
return new Package(packageName);
}
public class Package {
public final String packageName;
public final File packageDir;
private String firstPackagePart;
public Package(String packageName) {
this.packageName = packageName;
this.packageDir = new File(srcDir, packageName.replace('.', File.separatorChar));
this.firstPackagePart = packageName.split("\\.")[0];
packageDir.mkdirs();
}
public File createJavaFile(String name) throws IOException, JavaCodeGenerationException {
if (name.equals(firstPackagePart)) {
if (name.equals("Main")) {
throw new JavaCodeGenerationException("The Java backend does not support main blocks in " +
"modules with name 'Main'. Please try to use a different name.");
}
throw new JavaCodeGenerationException("The Java backend does not support using the name " +
name + " as module name, because it collides with a generated classname. " +
"Please try to use a different name.");
}
File file = new File(packageDir, name + ".java");
addFile(file);
file.createNewFile();
return file;
}
public void addMainClass(String s) {
mainClasses.add(packageName + "." + s);
}
}
public File getSrcDir() {
return srcDir;
}
public void deleteCode() {
deleteDir(srcDir);
}
private void deleteDir(File dir) {
for (File f : dir.listFiles()) {
if (f.isDirectory()) {
deleteDir(f);
} else {
f.delete();
}
}
dir.delete();
}
public void compile() throws JavaCodeGenerationException {
compile(srcDir);
}
public void compile(File destDir) throws JavaCodeGenerationException {
compile("-classpath", System.getProperty("java.class.path"), "-d", destDir.getAbsolutePath());
}
public void compile(String... args) throws JavaCodeGenerationException {
ArrayList<String> args2 = new ArrayList<String>();
args2.addAll(Arrays.asList(args));
args2.addAll(Arrays.asList(getFileNames()));
JavaCompiler.compile(args2.toArray(new String[0]));
}
public String getFirstMainClass() {
if (mainClasses.isEmpty())
throw new IllegalStateException("There is no main class");
return mainClasses.get(0);
}
public String toString() {
StringBuilder res = new StringBuilder();
for (File f : files) {
append(res, f);
}
return res.toString();
}
private void append(StringBuilder res, File f) {
try {
BufferedReader reader = new BufferedReader(new FileReader(f));
try {
while (reader.ready()) {
res.append(reader.readLine() + "\n");
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}