diff --git a/compilation/src/main/java/App.java b/compilation/src/main/java/App.java index e9bbbe83b00aa3f1717828b5a1be9fa3e88d9216..3362f9de816a3fdcf24f40316b8834351f6c08ed 100644 --- a/compilation/src/main/java/App.java +++ b/compilation/src/main/java/App.java @@ -1,89 +1,10 @@ import io.javalin.Javalin; import org.json.JSONObject; -import java.io.*; import java.util.Map; -import java.util.stream.Collectors; import static java.lang.System.out; -interface ExecutableCode { - Map<String, Serializable> execute(); -} -interface DockerExecutableCode extends ExecutableCode { - - String command(); - Map<String, String> filesToExecute(); - - default void writeFile(String filename, String content) { - File file = new File(filename); - try (PrintWriter writer = new PrintWriter( new FileWriter(file, true) )) { - writer.write(content); - } catch (IOException e) { - e.printStackTrace(); - } - } - default void writeFiles(Map<String, String> files) { - files.forEach( this::writeFile ); - } - default void deleteFiles(Map<String, String> files) { - files.keySet().forEach( filename -> new File(filename).delete() ); - } - default Map<String, Serializable> executeFiles() { - Process cmdProc; - long elapsed = 0; - try { - long start = System.currentTimeMillis(); - cmdProc = Runtime.getRuntime().exec( command() ); - cmdProc.waitFor(); - elapsed = System.currentTimeMillis() - start; - } catch (IOException | InterruptedException e) { - e.printStackTrace(); - return Map.of("error", e.toString(), "exit", 1, "elapsed", elapsed); - } - - String in = new BufferedReader( new InputStreamReader( cmdProc.getInputStream() )).lines().collect(Collectors.joining()); - String err = new BufferedReader( new InputStreamReader( cmdProc.getErrorStream() )).lines().collect(Collectors.joining()); - - return Map.of("exit", err.isEmpty(), "output", in, "error", err, "time", elapsed); - } - default Map<String, Serializable> execute() { - writeFiles( filesToExecute() ); - Map<String, Serializable> res = executeFiles(); - deleteFiles( filesToExecute() ); - return res; - } -} - -class JavaDockerCode implements DockerExecutableCode { - private Map<String, String> filesWithContent; - public JavaDockerCode(Map<String, String> filesWithContent) { - this.filesWithContent = filesWithContent; - } - - public String command() { - return "docker run --rm --mount type=bind,source=" + System.getProperty("user.dir") + "/share_docker_file,dst=/env/ freakency/java:1.0 ./java_test.sh"; - } - - public Map<String, String> filesToExecute() { - return this.filesWithContent; - } -} -class PythonDockerCode implements DockerExecutableCode { - private Map<String, String> filesWithContent; - public PythonDockerCode(Map<String, String> filesWithContent) { - this.filesWithContent = filesWithContent; - } - - public String command() { - return "docker run --rm --mount type=bind,source=" + System.getProperty("user.dir") + "/share_docker_file,dst=/env/ freakency/python:3.0 python assert.py"; - } - - public Map<String, String> filesToExecute() { - return this.filesWithContent; - } -} - public class App { public static void main(String[] args) { @@ -97,10 +18,17 @@ public class App { String userCode = res.getString("stream"); String assertion = res.getString("assert"); - - ExecutableCode ec = language.equals("java") ? - new JavaDockerCode(Map.of("share_docker_file/Kata.java", userCode, "share_docker_file/Main.java", assertion)) : - new PythonDockerCode(Map.of("share_docker_file/sample.py", userCode, "share_docker_file/assert.py", assertion)); + ExecutableCode ec; + switch( language ) { + case "java": + ec = new JavaDockerCode(Map.of("share_docker_file/Kata.java", userCode, "share_docker_file/Main.java", assertion)); + break; + case "python": + ec = new PythonDockerCode(Map.of("share_docker_file/sample.py", userCode, "share_docker_file/assert.py", assertion)); + break; + default: + throw new IllegalArgumentException("Language unkown"); + } out.println(language); out.println(userCode); diff --git a/compilation/src/main/java/CompilationService.java b/compilation/src/main/java/CompilationService.java deleted file mode 100644 index d54209be8b5681f6325370a829c6a9cc1370c200..0000000000000000000000000000000000000000 --- a/compilation/src/main/java/CompilationService.java +++ /dev/null @@ -1,8 +0,0 @@ -import java.io.Serializable; -import java.util.Map; - -public interface CompilationService { - - Map<String, Serializable> executeKata(String language, String userCode, String assertion); - -} diff --git a/compilation/src/main/java/DockerCompilation.java b/compilation/src/main/java/DockerCompilation.java deleted file mode 100644 index 8bf78324bc731e70d70be5b266477a1840dba1fb..0000000000000000000000000000000000000000 --- a/compilation/src/main/java/DockerCompilation.java +++ /dev/null @@ -1,94 +0,0 @@ -import org.json.JSONObject; - -import java.io.*; -import java.util.HashMap; -import java.util.Map; - -public class DockerCompilation implements CompilationService { - - private Map<String, Map<String, String>> filenameDic = new HashMap<>(); - - DockerCompilation() { - - String userDir = System.getProperty("user.dir"); - Map<String, String> python = new HashMap<>(); - python.put("filename", "share_docker_file/sample.py"); - python.put("test", "share_docker_file/assert.py"); - python.put("cmd", "docker run --rm --mount type=bind,source=" + userDir + "/share_docker_file,dst=/env/ freakency/python:3.0 python assert.py"); - - Map<String, String> java = new HashMap<>(); - - java.put("filename", "share_docker_file/kata.java"); - java.put("test", "share_docker_file/Main.java"); - java.put("cmd", "docker run --rm --mount type=bind,source=" + userDir + "/share_docker_file,dst=/env/ freakency/java:1.0 ./java_test.sh"); - - this.filenameDic.put("python", python); - this.filenameDic.put("java", java); - } - - public Map<String, Serializable> executeKata(String language, String userCode, String assertion) { - - - String line; - String output = ""; - String error = ""; - - Map<String, String> languages = this.filenameDic.get(language); - - try (PrintWriter filenameWriter = new PrintWriter(languages.get("filename"), "UTF-8"); PrintWriter filenameTestWriter = new PrintWriter(languages.get("test"), "UTF-8")) { - filenameWriter.println(userCode); - filenameTestWriter.println(assertion); - } catch (FileNotFoundException | UnsupportedEncodingException e) { - e.printStackTrace(); - } - - long start, elapsed = 0; - Process cmdProc = null; - - try { - start = System.currentTimeMillis(); - cmdProc = Runtime.getRuntime().exec(languages.get("cmd")); - cmdProc.waitFor(); - - elapsed = System.currentTimeMillis() - start; - - } catch (IOException | InterruptedException e) { - e.printStackTrace(); - } - - // Create Array lists that will contain output and error values of the executed program - /**************************/ - - try (BufferedReader stdoutReader = new BufferedReader(new InputStreamReader(cmdProc.getInputStream())); - BufferedReader stderrReader = new BufferedReader(new InputStreamReader(cmdProc.getErrorStream()))) { - while ((line = stdoutReader.readLine()) != null) - output += line + "\n"; - while ((line = stderrReader.readLine()) != null) - error += line + "\n"; - } catch (IOException e) { - e.printStackTrace(); - } - - /**************************/ - - Map<String, Serializable> json = new HashMap<>(); - - //exit value of the ran program - if (error.equals("")) - json.put("exit", 0); - else - json.put("exit", 1); - json.put("output", output); - json.put("error", error); - json.put("time", elapsed); - - // For delete purpose, create a File object also targeting sample.py - File file = new File(languages.get("filename")); - file.delete(); - - file = new File(languages.get("test")); - file.delete(); - - return json; - } -} diff --git a/compilation/src/main/java/DockerExecutableCode.java b/compilation/src/main/java/DockerExecutableCode.java new file mode 100644 index 0000000000000000000000000000000000000000..30ccc15548cf16c59760f247e1c67bfa34949939 --- /dev/null +++ b/compilation/src/main/java/DockerExecutableCode.java @@ -0,0 +1,53 @@ +import java.io.*; +import java.util.Map; +import java.util.stream.Collectors; + +interface DockerExecutableCode extends ExecutableCode { + + String[] command(); + + Map<String, String> filesToExecute(); + + default Map<String, Serializable> execute() { + writeFiles( filesToExecute() ); + Map<String, Serializable> res = executeFiles(); + deleteFiles( filesToExecute() ); + return res; + } + + default void writeFile(String filename, String content) { + File file = new File(filename); + try (PrintWriter writer = new PrintWriter( new FileWriter(file, false) )) { + writer.write(content); + } catch (IOException e) { + e.printStackTrace(); + } + } + + default void writeFiles(Map<String, String> files) { + files.forEach( this::writeFile ); + } + + default void deleteFiles(Map<String, String> files) { + files.keySet().forEach( filename -> new File(filename).delete() ); + } + + default Map<String, Serializable> executeFiles() { + Process cmdProc; + long elapsed = 0; + try { + long start = System.currentTimeMillis(); + cmdProc = Runtime.getRuntime().exec( command() ); + cmdProc.waitFor(); + elapsed = System.currentTimeMillis() - start; + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + return Map.of("error", e.toString(), "exit", 1, "elapsed", elapsed); + } + + String in = new BufferedReader( new InputStreamReader( cmdProc.getInputStream() )).lines().collect(Collectors.joining()); + String err = new BufferedReader( new InputStreamReader( cmdProc.getErrorStream() )).lines().collect(Collectors.joining()); + + return Map.of("exit", err.isEmpty() ? 0 : 1, "output", in, "error", err, "time", elapsed); + } +} diff --git a/compilation/src/main/java/ExecutableCode.java b/compilation/src/main/java/ExecutableCode.java new file mode 100644 index 0000000000000000000000000000000000000000..236fc31a2068dc43137ae4846d29a87bb2cda8b2 --- /dev/null +++ b/compilation/src/main/java/ExecutableCode.java @@ -0,0 +1,23 @@ +import java.io.Serializable; +import java.util.Map; + +public interface ExecutableCode { + Map<String, Serializable> execute(); + + /* + enum Language { + Java, Python3 + } + + static ExecutableCode of(Language language, Map<String, String> filesWithContent ) { + switch (language) { + case Java: + return new JavaDockerCode(filesWithContent); + case Python3: + return new PythonDockerCode(filesWithContent); + default: + throw new IllegalArgumentException("Need a implementation for this language"); + } + } + */ +} diff --git a/compilation/src/main/java/JavaDockerCode.java b/compilation/src/main/java/JavaDockerCode.java new file mode 100644 index 0000000000000000000000000000000000000000..589cea56155963f711878df8ab77853124706dbb --- /dev/null +++ b/compilation/src/main/java/JavaDockerCode.java @@ -0,0 +1,17 @@ +import java.util.Map; + +final class JavaDockerCode implements DockerExecutableCode { + private Map<String, String> filesWithContent; + + public JavaDockerCode(Map<String, String> filesWithContent) { + this.filesWithContent = filesWithContent; + } + + public String[] command() { + return new String[]{"docker", "run", "--rm", "--mount", "type=bind,source=" + System.getProperty("user.dir") + "/share_docker_file,dst=/env/", "freakency/java:1.0", "/bin/bash", "-c", "./java_test.sh"}; + } + + public Map<String, String> filesToExecute() { + return this.filesWithContent; + } +} diff --git a/compilation/src/main/java/PythonDockerCode.java b/compilation/src/main/java/PythonDockerCode.java new file mode 100644 index 0000000000000000000000000000000000000000..2a81e64c5a04abdceb530efba5680d71786c410d --- /dev/null +++ b/compilation/src/main/java/PythonDockerCode.java @@ -0,0 +1,16 @@ +import java.util.Map; + +final class PythonDockerCode implements DockerExecutableCode { + private Map<String, String> filesWithContent; + public PythonDockerCode(Map<String, String> filesWithContent) { + this.filesWithContent = filesWithContent; + } + + public String[] command() { + return new String[]{"docker", "run", "--rm", "--mount", "type=bind,source=" + System.getProperty("user.dir") + "/share_docker_file,dst=/env/", "freakency/python:3.0", "/bin/bash", "-c", "python sample.py && python assert.py"}; + } + + public Map<String, String> filesToExecute() { + return this.filesWithContent; + } +}