Remove temporary file after serving
Change-Id: I90a064f339be6da3bd92cc5b88a9e672d1213f83
diff --git a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/MatchAggregator.java b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/MatchAggregator.java
index 8535262..032bd6b 100644
--- a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/MatchAggregator.java
+++ b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/MatchAggregator.java
@@ -6,6 +6,9 @@
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.FileInputStream;
import java.util.Collection;
import java.util.ArrayList;
@@ -23,6 +26,7 @@
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.core.StreamingOutput;
import org.glassfish.jersey.media.sse.EventOutput;
import org.glassfish.jersey.media.sse.OutboundEvent;
@@ -426,8 +430,39 @@
}
else if (this.file.exists()) {
- // Serve file
- rb = Response.ok(this.file);
+ // Serve the file and delete after serving
+ final File expFile = this.file;
+ try {
+ final InputStream in = new FileInputStream(this.file);
+
+ // Remove file after output is streamed
+ StreamingOutput output = new StreamingOutput() {
+ @Override
+ public void write(OutputStream out)
+ throws IOException {
+
+ // Write file data in output stream
+ int length;
+ byte[] buffer = new byte[1024];
+ while ((length = in.read(buffer)) != -1) {
+ out.write(buffer, 0, length);
+ }
+ out.flush(); // Important!
+ in.close();
+
+ // When done, delete the file
+ expFile.delete();
+ }
+ };
+
+ // Serve file
+ rb = Response.ok(output);
+ }
+
+ catch (Exception e) {
+ // File problematic
+ return Response.status(Status.NOT_FOUND);
+ };
}
else {
// File doesn't exist
diff --git a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Service.java b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Service.java
index af935cf..be090b0 100644
--- a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Service.java
+++ b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Service.java
@@ -60,17 +60,18 @@
* TODO for release:
* - Rename to "Kalamar-Plugin-Export".
* - Remove 'plugin' root folder.
- * - Localize RTF export.
- * - Change "count" to "number of results" in RTF.
- * - Delete the temp file of the export at the end
- * of serving.
- * - Add date info.
- * - Add opaque source, in case source is an internal IP.
- * - Improve Readme.
* - 100 matches as default for export form.
- * - Test ExWsConf.
+ * - Improve Readme.
+ * - Add opaque source, in case source is an internal IP.
+ * - Include limitation to form.
*
* TODO:
+ * - Localize RTF export.
+ * - Change "count" to "number of results" in RTF.
+ * - Add date info.
+ * - Switch Cookie mechanism to container req for
+ * better testing capabilities.
+ * - Test ExWsConf.
* - Abort processing when eventsource is closed.
* - Do not expect all meta data per match.
* - Upgrade default pageSize to 50.
diff --git a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/JsonExporterTest.java b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/JsonExporterTest.java
index 79a443d..c68c63c 100644
--- a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/JsonExporterTest.java
+++ b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/JsonExporterTest.java
@@ -4,9 +4,16 @@
import java.io.File;
import java.io.BufferedReader;
import java.io.FileReader;
+import java.io.InputStream;
+
+
+
+import javax.ws.rs.core.StreamingOutput;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.fail;
@@ -46,10 +53,11 @@
json.appendMatches("{\"meta\":\"ja2\",\"collection\":\"hm2\",\"query\":\"cool2\",\"matches\":[\"third\",\"fourth\"]}");
json.finish();
+ // This is not testable outside the service
Response resp = json.serve().build();
- File x = (File) resp.getEntity();
- resp.close();
- assertEquals(slurp(x),"{\"query\":\"cool\",\"meta\":\"ja\",\"collection\":\"hm\",\"matches\":[\"first\",\"second\",\"third\",\"fourth\"]}");
+ StreamingOutput x = (StreamingOutput) resp.getEntity();
+ resp.close();
+ assertNotNull(x);
};
@Test
diff --git a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/ServiceTest.java b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/ServiceTest.java
index 4e574d8..00742a3 100644
--- a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/ServiceTest.java
+++ b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/ServiceTest.java
@@ -932,6 +932,11 @@
assertTrue("Intro", str.contains("{\\rtf1\\ansi\\deff0"));
assertTrue("Outro", str.contains("{\\pard\\brdrb\\brdrs\\brdrw2\\brsp20\\par}"));
assertTrue("Content", str.contains("Benutzer Diskussion:Kriddl"));
+
+
+ // Check, that the file was succesfully removed after downloading
+ response = target("/export/" + fileLoc).queryParam("fname", filename).request().get();
+ assertEquals("HTTP Code", Status.NOT_FOUND.getStatusCode(), response.getStatus());
};