Fixed init() to respect already initialized file writer

Change-Id: I387e0e11a05c0a14319dbf3f663f8f86ee0b4a4e
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 2346d43..ca924e1 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
@@ -40,8 +40,6 @@
 
     private ObjectMapper mapper = new ObjectMapper();
 
-    private LinkedList<JsonNode> matches;
-
     private Writer writer;
 
     private File file;
@@ -268,10 +266,6 @@
      */
     public boolean init (String resp) throws IOException, JsonParseException {
 
-        this.file = null;
-
-        matches = new LinkedList();
-
         if (resp == null)
             return false;
 
@@ -295,7 +289,12 @@
             };
         };
 
-        writer = new StringWriter();
+        // In case the writer is already set (e.g. forceFile() was issued),
+        // write in the header
+        if (writer == null) {
+            this.file = null;
+            writer = new StringWriter();
+        };
 
         this.writeHeader(writer);
 
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 df3e53c..59f6807 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
@@ -383,9 +383,11 @@
 
                         if (eventOutput.isClosed())
                             return;
+                        
                         eventBuilder.name("Relocate");
-                        eventBuilder.data(exp.getExportID());
+                        eventBuilder.data(exp.getExportID() + ";" + exp.getFileName());
                         eventOutput.write(eventBuilder.build());
+                        
                     } catch (Exception e) {
                         try {
                             if (eventOutput.isClosed())
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 6bbcc00..594df85 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
@@ -892,14 +892,15 @@
         assertEquals(events.get(1), "Progress:0");
         assertEquals(events.get(2), "Progress:56");
         assertTrue(events.get(3).startsWith("Relocate:"));
+        assertTrue(events.get(3).contains(";"));
         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";
+        String[] splits = events.get(3).substring(9).split(";");
+        String fileLoc = splits[0];        
+        String filename = splits[1];
         Response response = target("/export/" + fileLoc).queryParam("fname", filename).request().get();
 
         String str = response.readEntity(String.class);
@@ -928,6 +929,60 @@
 
 
     @Test
+    public void testExportWsProgressSinglePage () throws InterruptedException {
+        mockClient.reset().when(
+            request()
+            .withMethod("GET")
+            .withPath("/api/v1.0/search")
+            )
+            .respond(
+                response()
+                .withHeader("Content-Type: application/json; charset=utf-8")
+                .withBody(getFixture("response_water.json"))
+                .withStatusCode(200)
+                );
+
+        final LinkedList<String> events = new LinkedList<>();
+
+        // Create SSE client
+        Client client = ClientBuilder
+            .newBuilder()
+            .register(SseFeature.class)
+            .build();
+
+        EventSource eventSource = EventSource
+            .target(target("/export")
+                    .queryParam("q", "Wasser")
+                    .queryParam("ql","poliqarp")
+                    .queryParam("hitc","1")
+                    .queryParam("format","json"))
+            .reconnectingEvery(300, TimeUnit.SECONDS)
+            .build();
+
+        EventListener listener = inboundEvent -> {
+            events.add(inboundEvent.getName() + ":" + inboundEvent.readData(String.class));
+        };
+
+        eventSource.register(listener);
+        eventSource.open();
+
+        Thread.sleep(3000);
+
+        // Check error
+        assertEquals(events.getFirst(), "Process:init");
+        assertEquals(events.get(1), "Progress:0");
+        assertTrue(events.get(2).startsWith("Relocate:"));       
+        assertEquals(events.getLast(), "Process:done");
+        assertEquals(events.size(), 4);
+        eventSource.close();
+
+        String fileLoc = events.get(2).substring(9);
+        assertTrue(fileLoc.length() > 5);
+        assertTrue(fileLoc.contains(";"));
+    };
+    
+
+    @Test
     public void testFileServingError () {
         String fileLoc = "hjGHJghjgHJGhjghj";
         Response response = target("/export/" + fileLoc).request().get();