From 3ef9154d768fa557c6f65e11c2753a57aa51cf2e Mon Sep 17 00:00:00 2001 From: lianafinaritra Date: Fri, 8 Nov 2024 11:31:12 +0300 Subject: [PATCH] feat: implement fileCompiler who compile drive file --- .../hei/patrimoine/compiler/FileCompiler.java | 68 +++++++++++++++++++ ...moineCompiler.java => StringCompiler.java} | 2 +- .../hei/patrimoine/google/GoogleApi.java | 23 ++++++- .../ihm/google/GoogleLinkVerifierScreen.java | 31 +++++++-- ...pilerTest.java => StringCompilerTest.java} | 6 +- 5 files changed, 117 insertions(+), 13 deletions(-) create mode 100644 src/main/java/school/hei/patrimoine/compiler/FileCompiler.java rename src/main/java/school/hei/patrimoine/compiler/{PatrimoineCompiler.java => StringCompiler.java} (95%) rename src/test/java/school/hei/patrimoine/compiler/{PatrimoineCompilerTest.java => StringCompilerTest.java} (94%) diff --git a/src/main/java/school/hei/patrimoine/compiler/FileCompiler.java b/src/main/java/school/hei/patrimoine/compiler/FileCompiler.java new file mode 100644 index 00000000..3d3aa7f3 --- /dev/null +++ b/src/main/java/school/hei/patrimoine/compiler/FileCompiler.java @@ -0,0 +1,68 @@ +package school.hei.patrimoine.compiler; + +import lombok.SneakyThrows; +import school.hei.patrimoine.modele.Patrimoine; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.file.Path; +import java.util.function.Function; +import java.util.function.Supplier; + +import static javax.tools.ToolProvider.getSystemJavaCompiler; + +public class FileCompiler implements Function { + + private static final String COMPILE_DIR_NAME = + System.getProperty("user.home") + "/.patrimoine/compile"; + + static { + new File(COMPILE_DIR_NAME).mkdirs(); + } + + @SneakyThrows + @Override + public Patrimoine apply(String filePath) { + var ioDirPath = Path.of(COMPILE_DIR_NAME); + var sourcePath = Path.of(filePath); + var className = getClassNameFromPath(filePath); + + compile(ioDirPath, sourcePath); + + var dynamicClass = loadClass(className, ioDirPath); + var patrimoineSupplier = + (Supplier) dynamicClass.getDeclaredConstructor().newInstance(); + return patrimoineSupplier.get(); + } + + private Class loadClass(String className, Path ioDirPath) + throws MalformedURLException, ClassNotFoundException { + var classLoader = URLClassLoader.newInstance(new URL[] {ioDirPath.toUri().toURL()}); + + return Class.forName(className, true, classLoader); + } + + private static String getClassNameFromPath(String filePath) { + var path = Path.of(filePath); + String fileName = path.getFileName().toString(); + return fileName.substring(0, fileName.lastIndexOf('.')); + } + + private void compile(Path ioDirPath, Path sourcePath) { + var compiler = getSystemJavaCompiler(); + int result = + compiler.run( + null, + null, + null, + "-d", + ioDirPath.toFile().getAbsolutePath(), + sourcePath.toFile().getAbsolutePath()); + + if (result != 0) { + throw new RuntimeException("Compilation failed. Error code=" + result); + } + } +} diff --git a/src/main/java/school/hei/patrimoine/compiler/PatrimoineCompiler.java b/src/main/java/school/hei/patrimoine/compiler/StringCompiler.java similarity index 95% rename from src/main/java/school/hei/patrimoine/compiler/PatrimoineCompiler.java rename to src/main/java/school/hei/patrimoine/compiler/StringCompiler.java index aeec497f..63860ec9 100644 --- a/src/main/java/school/hei/patrimoine/compiler/PatrimoineCompiler.java +++ b/src/main/java/school/hei/patrimoine/compiler/StringCompiler.java @@ -13,7 +13,7 @@ import lombok.SneakyThrows; import school.hei.patrimoine.modele.Patrimoine; -public class PatrimoineCompiler implements BiFunction { +public class StringCompiler implements BiFunction { private static final String COMPILE_DIR_NAME = System.getProperty("user.home") + "/.patrimoine/compile"; diff --git a/src/main/java/school/hei/patrimoine/google/GoogleApi.java b/src/main/java/school/hei/patrimoine/google/GoogleApi.java index 02bca45b..a5aeb705 100644 --- a/src/main/java/school/hei/patrimoine/google/GoogleApi.java +++ b/src/main/java/school/hei/patrimoine/google/GoogleApi.java @@ -22,6 +22,8 @@ import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.List; import com.google.api.services.drive.Drive; @@ -57,11 +59,11 @@ public boolean isTokenExpired() { private static final String CREDENTIALS_FILE_PATH = System.getProperty("user.home") + "/.patrimoine/google/client.json"; - private static final String DOWNLOADS_DIRECTORY_PATH = + public static final String DOWNLOADS_DIRECTORY_PATH = System.getProperty("user.home") + "/Downloads/drive"; static { - new File(DOWNLOADS_DIRECTORY_PATH).mkdirs(); + createOrResetDirectory(DOWNLOADS_DIRECTORY_PATH); } /** @@ -142,6 +144,23 @@ public String readDocsContent(GoogleAuthenticationDetails authDetails, String do } } + public static void createOrResetDirectory(String directoryPath) { + Path path = Paths.get(directoryPath); + File directory = path.toFile(); + + try { + // Deletes existing directory if present + if (directory.exists()) { + Files.walk(path) + .map(Path::toFile) + .forEach(File::delete); + } + Files.createDirectories(path); + } catch (IOException e) { + throw new RuntimeException("Directory reset error : " + directoryPath, e); + } + } + public void downloadFile(GoogleAuthenticationDetails authDetails, String fileId) { Drive driveService = new Drive.Builder(authDetails.httpTransport(), JSON_FACTORY, authDetails.credential()) .setApplicationName(APPLICATION_NAME) diff --git a/src/main/java/school/hei/patrimoine/visualisation/swing/ihm/google/GoogleLinkVerifierScreen.java b/src/main/java/school/hei/patrimoine/visualisation/swing/ihm/google/GoogleLinkVerifierScreen.java index 6f19359b..e70e5836 100644 --- a/src/main/java/school/hei/patrimoine/visualisation/swing/ihm/google/GoogleLinkVerifierScreen.java +++ b/src/main/java/school/hei/patrimoine/visualisation/swing/ihm/google/GoogleLinkVerifierScreen.java @@ -9,16 +9,20 @@ import static javax.swing.SwingUtilities.invokeLater; import static javax.swing.WindowConstants.DISPOSE_ON_CLOSE; import static javax.swing.WindowConstants.EXIT_ON_CLOSE; +import static school.hei.patrimoine.google.GoogleApi.DOWNLOADS_DIRECTORY_PATH; import java.awt.*; import java.awt.event.ActionListener; +import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.concurrent.ExecutionException; import javax.swing.*; import lombok.extern.slf4j.Slf4j; import school.hei.patrimoine.compiler.ClassNameExtractor; -import school.hei.patrimoine.compiler.PatrimoineCompiler; +import school.hei.patrimoine.compiler.FileCompiler; +import school.hei.patrimoine.compiler.StringCompiler; import school.hei.patrimoine.google.GoogleApi; import school.hei.patrimoine.google.GoogleApi.GoogleAuthenticationDetails; import school.hei.patrimoine.google.GoogleDocsLinkIdParser; @@ -200,20 +204,27 @@ protected List doInBackground() { List codePatrimoinesVisualisables = new ArrayList<>(); List patrimoinesVisualisables = new ArrayList<>(); - System.out.println("...traitement"); + for (var id : ids.docsLinkList()) { + codePatrimoinesVisualisables.add(extractSnippet(id)); + } for(var namedId : ids.driveLinkList()) { googleApi.downloadFile(authDetails, namedId.id()); } - for (var id : ids.docsLinkList()) { - codePatrimoinesVisualisables.add(extractSnippet(id)); - } + File driveDirectory = new File(DOWNLOADS_DIRECTORY_PATH); + File[] driveFiles = driveDirectory.listFiles((dir, name) -> name.endsWith(".java")); for (NamedSnippet codePatrimoine : codePatrimoinesVisualisables) { patrimoinesVisualisables.add(compilePatrimoine(codePatrimoine)); } + System.out.println(Arrays.toString(driveFiles)); + + for (File driveFile : driveFiles) { + patrimoinesVisualisables.add(compilePatrimoine(driveFile.getAbsolutePath())); + } + return patrimoinesVisualisables; } @@ -282,10 +293,16 @@ private void showErrorPage(String errorMessage) { } private Patrimoine compilePatrimoine(NamedSnippet namedSnippet) { - PatrimoineCompiler patrimoineCompiler = new PatrimoineCompiler(); + StringCompiler stringCompiler = new StringCompiler(); String className = new ClassNameExtractor().apply(namedSnippet.snippet()); - return (patrimoineCompiler.apply(className, namedSnippet.snippet())); + return (stringCompiler.apply(className, namedSnippet.snippet())); + } + + private Patrimoine compilePatrimoine(String filePath){ + FileCompiler fileCompiler = new FileCompiler(); + + return (fileCompiler.apply(filePath)); } private void openResultFrame(List patrimoinesVisualisables) { diff --git a/src/test/java/school/hei/patrimoine/compiler/PatrimoineCompilerTest.java b/src/test/java/school/hei/patrimoine/compiler/StringCompilerTest.java similarity index 94% rename from src/test/java/school/hei/patrimoine/compiler/PatrimoineCompilerTest.java rename to src/test/java/school/hei/patrimoine/compiler/StringCompilerTest.java index 57a563c1..65833224 100644 --- a/src/test/java/school/hei/patrimoine/compiler/PatrimoineCompilerTest.java +++ b/src/test/java/school/hei/patrimoine/compiler/StringCompilerTest.java @@ -6,7 +6,7 @@ import school.hei.patrimoine.cas.example.PatrimoineRicheSupplier; import school.hei.patrimoine.modele.Patrimoine; -class PatrimoineCompilerTest { +class StringCompilerTest { @Test void convert_a_string_to_patrimoine() { @@ -97,8 +97,8 @@ public Patrimoine get() { PatrimoineRicheSupplier patrimoineRicheSupplier = new PatrimoineRicheSupplier(); Patrimoine patrimoineRiche = patrimoineRicheSupplier.get(); - PatrimoineCompiler patrimoineCompiler = new PatrimoineCompiler(); - Patrimoine patrimoine = patrimoineCompiler.apply("PatrimoineRicheSupplier", code); + StringCompiler stringCompiler = new StringCompiler(); + Patrimoine patrimoine = stringCompiler.apply("PatrimoineRicheSupplier", code); assertEquals(patrimoineRiche.getValeurComptable(), patrimoine.getValeurComptable()); }