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());
     };