Implemented pipe response rewriting for match info API (close #814)

Change-Id: I09cb78e1557aa589a576edc37fecb997ef1229ed
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/SearchPipeTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/SearchPipeTest.java
index 8c938b5..41fe378 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/SearchPipeTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/SearchPipeTest.java
@@ -41,9 +41,11 @@
 
     private int port = 6071;
 
-    private String pipeJson, pipeWithParamJson, pipeTimeout;
+    private String pipeJson, pipeWithParamJson, pipeTimeout, termMapperJson;
 
     private String glemmUri = "http://localhost:" + port + "/glemm";
+	private String termMapperUri = "http://localhost:" + port
+			+ "/term-mapper?foundry=corenlp";
 
     public SearchPipeTest () throws URISyntaxException, IOException {
         pipeJson = IOUtils.toString(
@@ -58,6 +60,11 @@
                 ClassLoader.getSystemResourceAsStream(
                         "pipe-output/with-param.jsonld"),
                 StandardCharsets.UTF_8);
+        
+        termMapperJson = IOUtils.toString(
+                ClassLoader.getSystemResourceAsStream(
+                        "pipe-output/term-mapper.jsonld"),
+                StandardCharsets.UTF_8);
     }
 
     @BeforeEach
@@ -99,6 +106,40 @@
         assertEquals("{test}", br.readLine());
     }
 
+	@Test
+	public void testRetrieveMatchInfoWithResponsePipe ()
+			throws KustvaktException {
+		
+		mockClient.reset()
+        .when(request().withMethod("POST")
+        		.withPath("/term-mapper")
+        		.withQueryStringParameter("foundry", "corenlp")
+                .withHeaders(
+                        new Header("Content-Type",
+                                "application/json; charset=utf-8"),
+                        new Header("Accept", "application/json")))
+        .respond(response()
+                .withHeader(new Header("Content-Type",
+                        "application/json; charset=utf-8"))
+                .withBody(termMapperJson).withStatusCode(200));
+
+		Response response = target().path(API_VERSION).path("corpus")
+				.path("GOE").path("AGA").path("01784").path("p36-37")
+				.queryParam("foundry", "tt")
+				.queryParam("response-pipes", termMapperUri)
+				.request().get();
+		assertEquals(Status.OK.getStatusCode(), response.getStatus());
+		String entity = response.readEntity(String.class);
+		JsonNode node = JsonUtils.readTree(entity);
+		
+		assertTrue(node.at("/snippet").asText().startsWith(
+				"<span class=\"context-left\"></span><span class=\"match\">"
+				+ "<span title=\"corenlp/p:ART\">der</span> <span title="
+				+ "\"corenlp/p:ADJA\">alte</span> <span title="
+				+ "\"corenlp/p:ADJA\">freie</span> <span title="
+				+ "\"corenlp/p:NN\">Weg</span>"));
+	}
+    
     @Test
     public void testSearchWithPipes ()
             throws IOException, KustvaktException, URISyntaxException {
diff --git a/src/test/resources/pipe-output/term-mapper.jsonld b/src/test/resources/pipe-output/term-mapper.jsonld
new file mode 100644
index 0000000..63d5b4a
--- /dev/null
+++ b/src/test/resources/pipe-output/term-mapper.jsonld
@@ -0,0 +1,81 @@
+{
+  "@context" : "http://korap.ids-mannheim.de/ns/KoralQuery/v0.3/context.jsonld",
+  "meta" : {
+    "version" : "Krill-0.64.1"
+  },
+  "hasSnippet" : true,
+  "hasTokens" : false,
+  "matchID" : "match-GOE/AGA/01784-p36-37",
+  "context" : {
+    "left" : [ "token", 0 ],
+    "right" : [ "token", 0 ]
+  },
+  "snippet" : "<span class=\"context-left\"></span><span class=\"match\"><span title=\"corenlp/p:ART\">der</span> <span title=\"corenlp/p:ADJA\">alte</span> <span title=\"corenlp/p:ADJA\">freie</span> <span title=\"corenlp/p:NN\">Weg</span> <span title=\"corenlp/p:APPR\">nach</span> <span title=\"corenlp/p:NE\">Mainz</span> <span title=\"corenlp/p:VAFIN\">war</span> <span title=\"corenlp/p:VVPP\">gesperrt</span>, <span title=\"corenlp/p:PPER\">ich</span> <span title=\"corenlp/p:VMFIN\">mußte</span> <span title=\"corenlp/p:APPR\">über</span> <span title=\"corenlp/p:ART\">die</span> <span title=\"corenlp/p:NN\">Schiffbrücke</span> <span title=\"corenlp/p:APPR\">bei</span> <span title=\"corenlp/p:NE\">Rüsselsheim</span>; <span title=\"corenlp/p:APPR\">in</span> <span title=\"corenlp/p:NE\">Ginsheim</span> <span title=\"corenlp/p:VVFIN\">ward</span> <mark><span title=\"corenlp/p:VVPP\">gefüttert</span></mark>; <span title=\"corenlp/p:ART\">der</span> <span title=\"corenlp/p:NN\">Ort</span> <span title=\"corenlp/p:VAFIN\">ist</span> <span title=\"corenlp/p:ADV\">sehr</span> <span title=\"corenlp/p:ADJA\">zerschossen</span>; <span title=\"corenlp/p:ADV\">dann</span> <span title=\"corenlp/p:APPR\">über</span> <span title=\"corenlp/p:ART\">die</span> <span title=\"corenlp/p:NN\">Schiffbrücke</span> <span title=\"corenlp/p:APPR\">auf</span> <span title=\"corenlp/p:ART\">die</span> <span title=\"corenlp/p:NN\">Nonnenaue</span>, <span title=\"corenlp/p:PWAV\">wo</span> <span title=\"corenlp/p:PIDAT\">viele</span> <span title=\"corenlp/p:NN\">Bäume</span> <span title=\"corenlp/p:VVINF\">niedergehauen</span> <span title=\"corenlp/p:VVFIN\">lagen</span>, <span title=\"corenlp/p:ADV\">sofort</span> <span title=\"corenlp/p:APPR\">auf</span> <span title=\"corenlp/p:ART\">dem</span> <span title=\"corenlp/p:ADJA\">zweiten</span> <span title=\"corenlp/p:NN\">Teil</span> <span title=\"corenlp/p:ART\">der</span> <span title=\"corenlp/p:NN\">Schiffbrücke</span> <span title=\"corenlp/p:APPR\">über</span> <span title=\"corenlp/p:ART\">den</span> <span title=\"corenlp/p:ADJA\">größern</span> <span title=\"corenlp/p:NN\">Arm</span> <span title=\"corenlp/p:ART\">des</span> <span title=\"corenlp/p:NE\">Rheins</span>.</span><span class=\"context-right\"></span>",
+  "fields" : [ {
+    "@type" : "koral:field",
+    "key" : "ID"
+  }, {
+    "@type" : "koral:field",
+    "key" : "textSigle",
+    "type" : "type:string",
+    "value" : "GOE/AGA/01784"
+  }, {
+    "@type" : "koral:field",
+    "key" : "corpusID"
+  }, {
+    "@type" : "koral:field",
+    "key" : "author",
+    "type" : "type:text",
+    "value" : "Goethe, Johann Wolfgang von"
+  }, {
+    "@type" : "koral:field",
+    "key" : "title",
+    "type" : "type:text",
+    "value" : "Belagerung von Mainz"
+  }, {
+    "@type" : "koral:field",
+    "key" : "subTitle"
+  }, {
+    "@type" : "koral:field",
+    "key" : "textClass"
+  }, {
+    "@type" : "koral:field",
+    "key" : "pubPlace",
+    "type" : "type:string",
+    "value" : "München"
+  }, {
+    "@type" : "koral:field",
+    "key" : "pubDate",
+    "type" : "type:date",
+    "value" : "1982"
+  }, {
+    "@type" : "koral:field",
+    "key" : "availability",
+    "type" : "type:string",
+    "value" : "CC-BY-SA"
+  }, {
+    "@type" : "koral:field",
+    "key" : "layerInfos",
+    "type" : "type:store",
+    "value" : "corenlp/c=spans corenlp/p=tokens corenlp/s=spans dereko/s=spans malt/d=rels marmot/m=tokens marmot/p=tokens opennlp/p=tokens opennlp/s=spans tt/l=tokens tt/p=tokens"
+  }, {
+    "@type" : "koral:field",
+    "key" : "docSigle",
+    "type" : "type:string",
+    "value" : "GOE/AGA"
+  }, {
+    "@type" : "koral:field",
+    "key" : "corpusSigle",
+    "type" : "type:string",
+    "value" : "GOE"
+  } ],
+  "textSigle" : "GOE/AGA/01784",
+  "author" : "Goethe, Johann Wolfgang von",
+  "title" : "Belagerung von Mainz",
+  "pubPlace" : "München",
+  "pubDate" : "1982",
+  "availability" : "CC-BY-SA",
+  "layerInfos" : "corenlp/c=spans corenlp/p=tokens corenlp/s=spans dereko/s=spans malt/d=rels marmot/m=tokens marmot/p=tokens opennlp/p=tokens opennlp/s=spans tt/l=tokens tt/p=tokens",
+  "docSigle" : "GOE/AGA",
+  "corpusSigle" : "GOE"
+}
\ No newline at end of file