From edb91b7b723cd7edf2a42e9126099e561efd41fd Mon Sep 17 00:00:00 2001 From: s5260822 Date: Sat, 22 Mar 2025 22:48:14 +0100 Subject: [PATCH] added export for list of speeches --- .../project/gruppe_05_1/export/TeXUtil.java | 15 ++++++ .../project/gruppe_05_1/rest/RESTHandler.java | 1 + .../rest/SpeechesExportController.java | 52 +++++++++++++++++++ 3 files changed, 68 insertions(+) diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/export/TeXUtil.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/export/TeXUtil.java index 3e4318b..c02aa14 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/export/TeXUtil.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/export/TeXUtil.java @@ -122,6 +122,21 @@ public class TeXUtil { return convertTexToBase64PDF(tex.toString()); } + public static String getBulkExportedSpeechesBase64String(List speechIds) throws IOException, InterruptedException { + StringBuilder tex = new StringBuilder(); + + tex.append(PREAMBLE.replace("$$EXPORTCATEGORY$$", "selected speeches")); + tex.append(BEGIN_DOCUMENT); + tex.append(TABLEOFCONTENTS); + for (String speechId : speechIds) { + tex.append(getSpeechToTexComponent(speechId)); + tex.append(NEWPAGE); + } + tex.append(END_DOCUMENT); + + return convertTexToBase64PDF(tex.toString()); + } + public static String convertTexToBase64PDF(String tex) throws IOException, InterruptedException { // Create a temporary directory File tempDir = new File(TEMP_EXPORT_DIR); diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandler.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandler.java index f30d669..7db4d8d 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandler.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandler.java @@ -70,5 +70,6 @@ public class RESTHandler { app.get("/export/speaker/{id}", SpeechesExportController::exportSpeechesFromSpeaker); // exportiere alle Reden eines Parlamentariers als PDF app.get("/export/topic/{topic}", SpeechesExportController::exportSpeechesWithTopic); // exportiere alle Reden zu einem Thema als PDF app.get("/export/all", SpeechesExportController::exportAllSpeeches); // exportiere alle Reden als PDF CAUTION!!!: This will take forever but is required in the exercise + app.get("/export/speeches/{speechIds}", SpeechesExportController::exportSpeeches); // exportiere eine Liste von Reden als PDF } } diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/SpeechesExportController.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/SpeechesExportController.java index 2930fc7..d053b38 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/SpeechesExportController.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/SpeechesExportController.java @@ -10,6 +10,7 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.Arrays; import java.util.Base64; +import java.util.List; import static org.texttechnologylab.project.gruppe_05_1.export.TeXUtil.*; @@ -188,4 +189,55 @@ public class SpeechesExportController { Logger.debug(Arrays.toString(e.getStackTrace())); } } + + @OpenApi( + summary = "Get speeches by IDs as a PDF", + description = "Returns a LaTeX-generated PDF of the speeches specified by their IDs", + operationId = "getSpeechesByIds", + path = "/export/speeches/{speechIds}", // Comma-separated IDs + methods = HttpMethod.GET, + tags = {"Export", "Speeches", "PDF"}, + responses = { + @OpenApiResponse(status = "200") + }) + public static void exportSpeeches(Context ctx) { + byte[] pdfBytes = new byte[0]; + + try { + // Extract speech IDs from the path + String speechIdsParam = ctx.pathParam("speechIds"); + List speechIds = Arrays.asList(speechIdsParam.split(",")); + + // Generate PDF for given speech IDs + pdfBytes = Base64.getDecoder().decode(getBulkExportedSpeechesBase64String(speechIds)); + } catch (Exception e) { + Logger.error("Failed to generate export for speeches: " + ctx.pathParam("speechIds")); + Logger.error(e.getMessage()); + Logger.debug(Arrays.toString(e.getStackTrace())); + } + + // Set response content type + ctx.contentType("application/pdf"); + + ByteArrayInputStream stream = new ByteArrayInputStream(pdfBytes); + if (stream.available() == 0) { + Logger.error("PDF stream is empty."); + ctx.result("Internal Server Error"); + ctx.status(500); + return; + } + + // Send the PDF as response + ctx.result(stream); + + try { + // Clean up temporary files + deleteTeXTempDirContents(); + Logger.debug("Temporary folder deleted."); + } catch (IOException e) { + Logger.error("Failed to delete temporary folder."); + Logger.error(e.getMessage()); + Logger.debug(Arrays.toString(e.getStackTrace())); + } + } }