diff --git a/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGen.java b/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGen.java index 5091af5e..04f408af 100644 --- a/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGen.java +++ b/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGen.java @@ -1,5 +1,6 @@ package de.dhbwstuttgart.bytecode; +import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -88,7 +89,7 @@ public class BytecodeGen implements ASTVisitor { private Collection<ResultSet> listOfResultSets; private ResultSet resultSet; private SourceFile sf; - private String path; + private File path; private Optional<Constructor> fieldInitializations; @@ -122,7 +123,7 @@ public class BytecodeGen implements ASTVisitor { private final ClassLoader classLoader; public BytecodeGen(HashMap<JavaClassName, byte[]> classFiles, Collection<ResultSet> listOfResultSets, List<GenericGenratorResultForSourceFile> simplifyResultsForAllSourceFiles, SourceFile sf, - String path, ClassLoader classLoader) { + File path, ClassLoader classLoader) { this.classFiles = classFiles; this.listOfResultSets = listOfResultSets; this.simplifyResultsForAllSourceFiles = simplifyResultsForAllSourceFiles; diff --git a/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java b/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java index 1c32748d..102438f8 100644 --- a/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java +++ b/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java @@ -57,7 +57,7 @@ public class BytecodeGenMethod implements StatementVisitor { private HashMap<String, String> genericsAndBounds; public boolean isBinaryExp = false; private String superClass; - private String path; + private File path; private SourceFile sf; private IStatement statement = null; private boolean isReturnStmt = false; @@ -85,7 +85,7 @@ public class BytecodeGenMethod implements StatementVisitor { public BytecodeGenMethod(JavaClassName className, String superClass, ResultSet resultSet, Method m, MethodVisitor mv, HashMap<String, Integer> paramsAndLocals, ClassWriter cw, HashMap<String, String> genericsAndBoundsMethod, HashMap<String, String> genericsAndBounds, boolean isInterface, HashMap<JavaClassName, byte[]> classFiles, - SourceFile sf, String path, Block block, int constructorPos, ClassLoader classLoader) { + SourceFile sf, File path, Block block, int constructorPos, ClassLoader classLoader) { this.className = className; this.superClass = superClass; @@ -111,7 +111,7 @@ public class BytecodeGenMethod implements StatementVisitor { public BytecodeGenMethod(JavaClassName className, String superClass,ResultSet resultSet, Method m, MethodVisitor mv, HashMap<String, Integer> paramsAndLocals, ClassWriter cw, HashMap<String, String> genericsAndBoundsMethod, - HashMap<String, String> genericsAndBounds, boolean isInterface, HashMap<JavaClassName, byte[]> classFiles, SourceFile sf,String path, ClassLoader classLoader) { + HashMap<String, String> genericsAndBounds, boolean isInterface, HashMap<JavaClassName, byte[]> classFiles, SourceFile sf,File path, ClassLoader classLoader) { this.className = className; this.superClass = superClass; @@ -134,7 +134,7 @@ public class BytecodeGenMethod implements StatementVisitor { } public BytecodeGenMethod(JavaClassName className, ClassWriter cw, LambdaExpression lambdaExpression, ArrayList<String> usedVars, ResultSet resultSet, MethodVisitor mv, - int indexOfFirstParamLam, boolean isInterface, HashMap<JavaClassName, byte[]> classFiles, String path, int lamCounter, SourceFile sf,HashMap<String, String> genericsAndBoundsMethod, + int indexOfFirstParamLam, boolean isInterface, HashMap<JavaClassName, byte[]> classFiles, File path, int lamCounter, SourceFile sf,HashMap<String, String> genericsAndBoundsMethod, HashMap<String, String> genericsAndBounds, ClassLoader classLoader) { this.className = className; this.cw = cw; @@ -816,7 +816,7 @@ public class BytecodeGenMethod implements StatementVisitor { // mDesc = helper.generateBCForFunN(methCallType,typesOfParams); }else { try { - cLoader2 = new DirectoryClassLoader(new File(path), classLoader); + cLoader2 = new DirectoryClassLoader(path, classLoader); java.lang.reflect.Method[] methods = cLoader2.loadClass(clazz).getMethods(); System.out.println("Methods of " + receiverName + " "); for(int i = 0; i<methods.length; i++) { diff --git a/src/main/java/de/dhbwstuttgart/bytecode/utilities/ByteCodeForFunNGenerator.java b/src/main/java/de/dhbwstuttgart/bytecode/utilities/ByteCodeForFunNGenerator.java index 2de61726..24b5f627 100644 --- a/src/main/java/de/dhbwstuttgart/bytecode/utilities/ByteCodeForFunNGenerator.java +++ b/src/main/java/de/dhbwstuttgart/bytecode/utilities/ByteCodeForFunNGenerator.java @@ -20,7 +20,7 @@ import java.util.Iterator; public class ByteCodeForFunNGenerator { - public static void generateBCForFunN(LambdaExpression lambdaExpression, String methDesc, String path) { + public static void generateBCForFunN(LambdaExpression lambdaExpression, String methDesc, File path) { ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); SignatureWriter methSig = new SignatureWriter(); @@ -46,7 +46,7 @@ public class ByteCodeForFunNGenerator { writeClassFile(classWriter.toByteArray(), name, path); } - public static void generateBCForFunN(ArgumentList argumentList, String methDesc, String path) { + public static void generateBCForFunN(ArgumentList argumentList, String methDesc, File path) { ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); SignatureWriter methSig = new SignatureWriter(); @@ -75,12 +75,12 @@ public class ByteCodeForFunNGenerator { } - public static void writeClassFile(byte[] bytecode, String name, String path) { + public static void writeClassFile(byte[] bytecode, String name, File path) { FileOutputStream output; try { System.out.println("generating " + name + ".class file..."); output = new FileOutputStream( - new File(path + name + CONSTANTS.EXTENSIONCLASS)); + new File(path , name + CONSTANTS.EXTENSIONCLASS)); output.write(bytecode); output.close(); System.out.println(name + ".class file generated"); diff --git a/src/main/java/de/dhbwstuttgart/bytecode/utilities/MethodCallHelper.java b/src/main/java/de/dhbwstuttgart/bytecode/utilities/MethodCallHelper.java index 00d6e308..ad3e28fa 100644 --- a/src/main/java/de/dhbwstuttgart/bytecode/utilities/MethodCallHelper.java +++ b/src/main/java/de/dhbwstuttgart/bytecode/utilities/MethodCallHelper.java @@ -16,6 +16,7 @@ import javassist.NotFoundException; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; +import java.io.File; import java.util.*; /** @@ -26,7 +27,7 @@ public class MethodCallHelper { private MethodCall methCall; private SourceFile sourceFile; private ResultSet resultSet; - private String path; + private File path; /** * @param methCall @@ -34,7 +35,7 @@ public class MethodCallHelper { * @param resultSet * @param path TODO */ - public MethodCallHelper(MethodCall methCall, SourceFile sourceFile, ResultSet resultSet, String path) { + public MethodCallHelper(MethodCall methCall, SourceFile sourceFile, ResultSet resultSet, File path) { this.methCall = methCall; this.sourceFile = sourceFile; this.resultSet = resultSet; diff --git a/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java b/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java index a24a94d5..ffae2c9b 100644 --- a/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java +++ b/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java @@ -740,7 +740,7 @@ public class JavaTXCompiler { return ret; } - public void generateBytecodForFile(String path, HashMap<JavaClassName, byte[]> classFiles, SourceFile sf, + public void generateBytecodForFile(File path, HashMap<JavaClassName, byte[]> classFiles, SourceFile sf, List<ResultSet> typeinferenceResult) throws IOException { try { List<GenericGenratorResultForSourceFile> genericResults = getGeneratedGenericResultsForAllSourceFiles(typeinferenceResult); @@ -780,13 +780,23 @@ public class JavaTXCompiler { } public void generateBytecode() throws ClassNotFoundException, IOException, BytecodeGeneratorError { - generateBytecode(null); + generateBytecode((File) null); } /** * @param path - can be null, then class file output is in the same directory as the parsed source files */ public void generateBytecode(String path) throws ClassNotFoundException, IOException, BytecodeGeneratorError { + if(path != null) + generateBytecode(new File(path)); + else + generateBytecode(); + } + + /** + * @param path - can be null, then class file output is in the same directory as the parsed source files + */ + public void generateBytecode(File path) throws ClassNotFoundException, IOException, BytecodeGeneratorError { List<ResultSet> typeinferenceResult = this.typeInference(); List<GenericGenratorResultForSourceFile> simplifyResultsForAllSourceFiles = getGeneratedGenericResultsForAllSourceFiles( typeinferenceResult); @@ -799,16 +809,16 @@ public class JavaTXCompiler { * @param simplifyResultsForAllSourceFiles * @throws IOException */ - public void generateBytecode(String outputPath, List<ResultSet> typeinferenceResult, + public void generateBytecode(File outputPath, List<ResultSet> typeinferenceResult, List<GenericGenratorResultForSourceFile> simplifyResultsForAllSourceFiles) throws IOException { for (File f : sourceFiles.keySet()) { HashMap<JavaClassName, byte[]> classFiles = new HashMap<>(); SourceFile sf = sourceFiles.get(f); - String path; + File path; if(outputPath == null){ - path = f.getParent(); //Set path to path of the parsed .jav file + path = f.getParentFile(); //Set path to path of the parsed .jav file }else{ - path = outputPath + sf.getPkgName().replace(".","/"); //add package path to root path + path = new File(outputPath ,sf.getPkgName().replace(".","/")); //add package path to root path } BytecodeGen bytecodeGen = new BytecodeGen(classFiles, typeinferenceResult, simplifyResultsForAllSourceFiles, sf, path, classLoader); @@ -817,15 +827,15 @@ public class JavaTXCompiler { } } - private void writeClassFile(HashMap<JavaClassName, byte[]> classFiles, String path) throws IOException { + private void writeClassFile(HashMap<JavaClassName, byte[]> classFiles, File path) throws IOException { FileOutputStream output; for (JavaClassName name : classFiles.keySet()) { byte[] bytecode = classFiles.get(name); System.out.println("generating " + name + ".class file ..."); // output = new FileOutputStream(new File(System.getProperty("user.dir") + // "/testBytecode/generatedBC/" +name+".class")); - File outputFile = new File(path + File.separator + name.getClassName() + ".class"); - outputFile.getParentFile().mkdirs(); + File outputFile = new File(path, name.getClassName() + ".class"); + outputFile.getAbsoluteFile().getParentFile().mkdirs(); output = new FileOutputStream(outputFile); output.write(bytecode); output.close(); diff --git a/src/main/java/de/dhbwstuttgart/environment/CompilationEnvironment.java b/src/main/java/de/dhbwstuttgart/environment/CompilationEnvironment.java index ca879cfd..746d1e85 100644 --- a/src/main/java/de/dhbwstuttgart/environment/CompilationEnvironment.java +++ b/src/main/java/de/dhbwstuttgart/environment/CompilationEnvironment.java @@ -74,7 +74,7 @@ public class CompilationEnvironment { List<Class> ret = new ArrayList<>(); String packageName = getPackageName(JavaTXParser.parse(forSourceFile)); //Set classLoader to include default package for this specific source file - File dir = new File(forSourceFile.getParent()); + File dir = new File(forSourceFile.getAbsoluteFile().getParent()); String dirPath = dir.toString() + "/"; if(packageName.length()>0)dirPath = dirPath.substring(0,dirPath.length() - packageName.length()); String path = dirPath; diff --git a/src/test/java/bytecode/OLTest.java b/src/test/java/bytecode/OLTest.java index d9de9f25..5b98c7ff 100644 --- a/src/test/java/bytecode/OLTest.java +++ b/src/test/java/bytecode/OLTest.java @@ -35,7 +35,7 @@ public class OLTest { pathToClassFile = System.getProperty("user.dir")+"/src/test/resources/testBytecode/generatedBC/"; List<ResultSet> typeinferenceResult = compiler.typeInference(); List<GenericGenratorResultForSourceFile> simplifyResultsForAllSourceFiles = compiler.getGeneratedGenericResultsForAllSourceFiles(typeinferenceResult); - compiler.generateBytecode(pathToClassFile,typeinferenceResult,simplifyResultsForAllSourceFiles); + compiler.generateBytecode(new File(pathToClassFile),typeinferenceResult,simplifyResultsForAllSourceFiles); loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)}); classToTest = loader.loadClass("OL"); instanceOfClass = classToTest.getDeclaredConstructor().newInstance(); diff --git a/src/test/java/packages/Bytecode.java b/src/test/java/packages/Bytecode.java index 3fabed05..7b5bb958 100644 --- a/src/test/java/packages/Bytecode.java +++ b/src/test/java/packages/Bytecode.java @@ -21,7 +21,7 @@ public class Bytecode extends TestCase { if(f.exists() && !f.isDirectory()) { f.delete(); } - compiler.generateBytecode(null); + compiler.generateBytecode(); f = new File(rootDirectory + "de/test/TestClass.class"); assertTrue(f.exists()); diff --git a/src/test/java/packages/ConsoleInterfaceTest.java b/src/test/java/packages/ConsoleInterfaceTest.java index 32fffe0d..c92bc8a9 100644 --- a/src/test/java/packages/ConsoleInterfaceTest.java +++ b/src/test/java/packages/ConsoleInterfaceTest.java @@ -39,6 +39,38 @@ public class ConsoleInterfaceTest extends TestCase { assertTrue(f.exists()); } + @Test + public void testCpNotEndsWithSlash() throws Exception { + JavaTXCompiler compiler = new JavaTXCompiler(new File(rootDirectory+"/de/test/ToImport.jav")); + compiler.typeInference(); + compiler.generateBytecode(rootDirectory + "output/"); + File f = new File(rootDirectory + "output/de/test/ToImport.class"); + assertTrue(f.exists()); + + f = new File(rootDirectory + "de/test/ImportTest.class"); + if(f.exists() && !f.isDirectory()) { + f.delete(); + } + + ConsoleInterface.main(new String[]{"-cp", rootDirectory + "de/test/output" , rootDirectory + "de/test/ImportTest.jav"}); + + f = new File(rootDirectory + "de/test/ImportTest.class"); + assertTrue(f.exists()); + } + + @Test + public void testOutputDirNotEndsWithSlash() throws Exception { + File f = new File(rootDirectory + "de/test/output/de/test/TestClass.class"); + if(f.exists() && !f.isDirectory()) { + f.delete(); + } + + ConsoleInterface.main(new String[]{"-d", rootDirectory + "de/test/output" ,rootDirectory + "de/test/TestClass.jav"}); + + f = new File(rootDirectory + "de/test/output/de/test/TestClass.class"); + assertTrue(f.exists()); + } + @Test public void testCompileSingleJavFileWithClassPath() throws Exception { JavaTXCompiler compiler = new JavaTXCompiler(new File(rootDirectory+"/de/test/ToImport.jav")); diff --git a/src/test/java/packages/ImportTest.java b/src/test/java/packages/ImportTest.java index 92d3f5bb..dc459629 100644 --- a/src/test/java/packages/ImportTest.java +++ b/src/test/java/packages/ImportTest.java @@ -27,7 +27,7 @@ public class ImportTest extends TestCase { compiler = new JavaTXCompiler(new File(rootDirectory+"ToImport.jav")); compiler.typeInference(); - compiler.generateBytecode(null); + compiler.generateBytecode(); f = new File(rootDirectory + "ToImport.class"); assertTrue(f.exists()); @@ -69,7 +69,7 @@ public class ImportTest extends TestCase { if(f.exists() && !f.isDirectory()) { f.delete(); } - compiler.generateBytecode(null); + compiler.generateBytecode(); f = new File(rootDirectory + "ImportTest.class"); assertTrue(f.exists()); } @@ -85,7 +85,7 @@ public class ImportTest extends TestCase { if(f.exists() && !f.isDirectory()) { f.delete(); } - compiler.generateBytecode(null); + compiler.generateBytecode(); f = new File(rootDirectory + "ImportTest2.class"); assertTrue(f.exists()); } @@ -99,7 +99,7 @@ public class ImportTest extends TestCase { if(f.exists() && !f.isDirectory()) { f.delete(); } - compiler.generateBytecode(null); + compiler.generateBytecode(); f = new File(rootDirectory + "ImportTestDefault.class"); assertTrue(f.exists()); } diff --git a/src/test/resources/bytecode/javFiles/VectorAdd.jav b/src/test/resources/bytecode/javFiles/VectorAdd.jav index bb14aa21..252c322c 100644 --- a/src/test/resources/bytecode/javFiles/VectorAdd.jav +++ b/src/test/resources/bytecode/javFiles/VectorAdd.jav @@ -37,5 +37,5 @@ public class VectorAdd { // var y; // x.add(y); // z = x; -} +// } }