Serve a temporary file after event relocation

Change-Id: I7b87d8e73dc62db8a74d13a31c78fe783365d12b
diff --git a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/CsvExporterTest.java b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/CsvExporterTest.java
index 528c63f..4cacacc 100644
--- a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/CsvExporterTest.java
+++ b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/CsvExporterTest.java
@@ -17,6 +17,7 @@
     public void testInit () throws IOException {
         CsvExporter csv = new CsvExporter();
         csv.init("{\"query\":\"cool\"}");
+        csv.finish();
 
         Response resp = csv.serve().build();
         String x = (String) resp.getEntity();
@@ -45,6 +46,7 @@
                  "<span class=\\\"context-right\\\"> Snippet"+
                  "<span class=\\\"more\\\"></span></span>\"}"+
                  "]}");
+        csv.finish();
 
         Response resp = csv.serve().build();
         String x = (String) resp.getEntity();
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 4bea7db..79a443d 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
@@ -20,7 +20,7 @@
     public void testInit () throws IOException {
         JsonExporter json = new JsonExporter();
         json.init("{\"query\":\"cool\"}");
-
+        json.finish();
         Response resp = json.serve().build();
         String x = (String) resp.getEntity();
         resp.close();
@@ -31,6 +31,7 @@
     public void testInitFull () throws IOException {
         JsonExporter json = new JsonExporter();
         json.init("{\"meta\":\"ja\",\"collection\":\"hm\",\"query\":\"cool\",\"matches\":[\"first\",\"second\"]}");
+        json.finish();
 
         Response resp = json.serve().build();
         String x = (String) resp.getEntity();
@@ -43,6 +44,7 @@
         JsonExporter json = new JsonExporter();
         json.init("{\"meta\":\"ja\",\"collection\":\"hm\",\"query\":\"cool\",\"matches\":[\"first\",\"second\"]}");
         json.appendMatches("{\"meta\":\"ja2\",\"collection\":\"hm2\",\"query\":\"cool2\",\"matches\":[\"third\",\"fourth\"]}");
+        json.finish();
 
         Response resp = json.serve().build();
         File x = (File) resp.getEntity();
diff --git a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/MatchAggregatorTest.java b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/MatchAggregatorTest.java
index 52a8f71..5acf32e 100644
--- a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/MatchAggregatorTest.java
+++ b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/MatchAggregatorTest.java
@@ -27,7 +27,7 @@
         assertNull(m.getQuery());
         assertNull(m.getCollection());
     };
-
+    
     @Test
     public void testSampleInit () throws IOException {
         MatchAggregator m = new MatchAggregator();
@@ -118,4 +118,11 @@
         assertEquals(m.getSource(),"/path");
     };
 
+    @Test
+    public void testFileHandling () throws IOException {
+        MatchAggregator m = new MatchAggregator();
+        assertEquals(m.getExportID(), "");
+        m.forceFile();
+        assertTrue(m.getExportID().contains("idsexp-"));
+    };
 };
diff --git a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/RtfExporterTest.java b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/RtfExporterTest.java
index a146845..311d479 100644
--- a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/RtfExporterTest.java
+++ b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/RtfExporterTest.java
@@ -17,6 +17,7 @@
     public void testInit () throws IOException {
         RtfExporter rtf = new RtfExporter();
         rtf.init("{\"query\":\"cool\"}");
+        rtf.finish();
 
         Response resp = rtf.serve().build();
         String x = (String) resp.getEntity();
@@ -45,6 +46,7 @@
                  "<span class=\\\"context-right\\\"> Snippet"+
                  "<span class=\\\"more\\\"></span></span>\"}"+
                  "]}");
+        rtf.finish();
 
         Response resp = rtf.serve().build();
         String x = (String) resp.getEntity();
@@ -70,6 +72,7 @@
                  "\"textSigle\":\"RTF/G59/34284\","+
                  "\"snippet\":\"<span class=\\\"context-left\\\"></span><span class=\\\"match\\\"><mark>Und dafür musstest Du extra ne neue Socke erstellen? Wieso traust Du Dich nicht, mit Deinem Account aufzutreten? - -- ωωσσI -  talk with me 09:17, 17. Dez. 2011 (CET) Der ist doch gesperrt. -- 09:21, 17. Dez. 2011 (CET) WWSS1, weil ich normalerweise mit IP schreibe und in dem Fall nicht möchte, dass</mark><span class=\\\"cutted\\\"></span></span><span class=\\\"context-right\\\"> meine IP öffentlich angezeigt wird. Über die IP kann man auf den Wohnort, den Provider und bei Aufenthalt am Arbeitsplatz auf den Arbeitgeber schließen, über Konto nicht. -- 09:24, 17. Dez. 2011 (CET) Bist Du denn nicht mehr selber Arbeitgeber? -- 09:31<span class=\\\"more\\\"></span></span>\"}"+
                  "]}");
+        rtf.finish();
 
         Response resp = rtf.serve().build();
         String x = (String) resp.getEntity();
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 6c51f5e..6bbcc00 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
@@ -785,11 +785,14 @@
 
     @Test
     public void testExportWsProgressError () throws InterruptedException {
+
+        // TODO:
+        //   Make this threadsafe
         final LinkedList<String> events = new LinkedList<>();
-        final int eventCount = 3;
+        // final int eventCount = 3;
 
         // Expect messages:
-        final CountDownLatch latch = new CountDownLatch(eventCount);
+        // final CountDownLatch latch = new CountDownLatch(eventCount);
         
         // Create SSE client
         Client client = ClientBuilder
@@ -804,13 +807,13 @@
 
         EventListener listener = inboundEvent -> {
             events.add(inboundEvent.getName() + ":" + inboundEvent.readData(String.class));
-            latch.countDown();
+            // latch.countDown();
         };
 
         eventSource.register(listener);
         eventSource.open();
 
-        latch.await(1000, TimeUnit.SECONDS);
+        // latch.await(1000, TimeUnit.SECONDS);
         Thread.sleep(2000);
 
         // Check error
@@ -888,12 +891,52 @@
         assertEquals(events.getFirst(), "Process:init");
         assertEquals(events.get(1), "Progress:0");
         assertEquals(events.get(2), "Progress:56");
-        assertEquals(events.get(3), "Relocate:...");
+        assertTrue(events.get(3).startsWith("Relocate:"));
         assertEquals(events.getLast(), "Process:done");
         assertEquals(events.size(), 5);
         eventSource.close();
+
+        // Now fetch the file!
+        String fileLoc = events.get(3).substring(9);
+        
+        String filename = "ExampleHui";
+        Response response = target("/export/" + fileLoc).queryParam("fname", filename).request().get();
+
+        String str = response.readEntity(String.class);
+        
+        assertEquals("HTTP Code",
+                     Status.OK.getStatusCode(), response.getStatus());
+        assertTrue(
+            "Request: Results should not be displayed inline, but saved and displayed locally",
+            response.getHeaderString(HttpHeaders.CONTENT_DISPOSITION)
+            .contains("attachment"));
+
+        assertTrue("Request: Filename should be set correctly: ",
+                   response.getHeaderString(HttpHeaders.CONTENT_DISPOSITION)
+                   .contains("filename=" + filename + ".rtf"));
+
+        // An RTF document should be returned
+        assertEquals("Request RTF: Http Content-Type should be: ",
+                "application/rtf",
+                response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        
+        assertTrue("Intro", str.contains("{\\rtf1\\ansi\\deff0"));
+        assertTrue("Outro", str.contains("{\\pard\\brdrb\\brdrs\\brdrw2\\brsp20\\par}"));
+        assertTrue("Content", str.contains("Benutzer Diskussion:Kriddl"));
     };
 
+
+    @Test
+    public void testFileServingError () {
+        String fileLoc = "hjGHJghjgHJGhjghj";
+        Response response = target("/export/" + fileLoc).request().get();
+
+        assertEquals("HTTP Code",
+                     Status.NOT_FOUND.getStatusCode(), response.getStatus());
+        
+    };
+    
     
     @Test
     public void testClientIP () {