Skip to content

Commit

Permalink
feat: implement fileCompiler who compile drive file
Browse files Browse the repository at this point in the history
  • Loading branch information
lianafinaritra committed Nov 8, 2024
1 parent 373fc20 commit 3ef9154
Show file tree
Hide file tree
Showing 5 changed files with 117 additions and 13 deletions.
68 changes: 68 additions & 0 deletions src/main/java/school/hei/patrimoine/compiler/FileCompiler.java
Original file line number Diff line number Diff line change
@@ -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<String, Patrimoine> {

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<Patrimoine>) 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);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import lombok.SneakyThrows;
import school.hei.patrimoine.modele.Patrimoine;

public class PatrimoineCompiler implements BiFunction<String, String, Patrimoine> {
public class StringCompiler implements BiFunction<String, String, Patrimoine> {

private static final String COMPILE_DIR_NAME =
System.getProperty("user.home") + "/.patrimoine/compile";
Expand Down
23 changes: 21 additions & 2 deletions src/main/java/school/hei/patrimoine/google/GoogleApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}

/**
Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -200,20 +204,27 @@ protected List<Patrimoine> doInBackground() {
List<NamedSnippet> codePatrimoinesVisualisables = new ArrayList<>();
List<Patrimoine> 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;
}

Expand Down Expand Up @@ -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<Patrimoine> patrimoinesVisualisables) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -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());
}
Expand Down

0 comments on commit 3ef9154

Please sign in to comment.