Add pipe response for the metadata web-service.

Change-Id: I072525f6edfe3850f15da1326d7483eb45f93185
diff --git a/Changes b/Changes
index 71ce573..6b8d71c 100644
--- a/Changes
+++ b/Changes
@@ -1,6 +1,7 @@
 # version 1.1-SNAPSHOT
 - Change VC and query names to lowercase
 - Implemented pipe response rewriting for match info API (#814)
+- Add pipe response for the metadata web-service.
 
 # version 1.0.1
 
diff --git a/src/main/java/de/ids_mannheim/korap/core/service/SearchService.java b/src/main/java/de/ids_mannheim/korap/core/service/SearchService.java
index a139a4d..b2857f2 100644
--- a/src/main/java/de/ids_mannheim/korap/core/service/SearchService.java
+++ b/src/main/java/de/ids_mannheim/korap/core/service/SearchService.java
@@ -574,7 +574,8 @@
     }
 
     public String retrieveDocMetadata (String corpusId, String docId,
-            String textId, String fields, String username, HttpHeaders headers)
+            String textId, String fields, String username, HttpHeaders headers, 
+            String responsePipes)
             throws KustvaktException {
         List<String> fieldList = null;
         if (fields != null && !fields.isEmpty()) {
@@ -588,6 +589,8 @@
         String textSigle = searchKrill.getTextSigle(corpusId, docId, textId);
         String results = searchKrill.getFields(textSigle, fieldList, p);
         
+        results = runPipes(results, responsePipes);
+        
         return results;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/core/web/controller/SearchController.java b/src/main/java/de/ids_mannheim/korap/core/web/controller/SearchController.java
index 6f40ba2..a5903f1 100644
--- a/src/main/java/de/ids_mannheim/korap/core/web/controller/SearchController.java
+++ b/src/main/java/de/ids_mannheim/korap/core/web/controller/SearchController.java
@@ -418,12 +418,14 @@
             @PathParam("docId") String docId,
             @PathParam("textId") String textId,
             @QueryParam("fields") String fields, 
+            @QueryParam("response-pipes") String responsePipes,
             @Context SecurityContext ctx,
             @Context HttpHeaders headers) throws KustvaktException {
         TokenContext tokenContext = (TokenContext) ctx.getUserPrincipal();
         try {
             String results = searchService.retrieveDocMetadata(corpusId, docId,
-                    textId, fields, tokenContext.getUsername(), headers);
+                    textId, fields, tokenContext.getUsername(), headers, 
+                    responsePipes);
             return Response.ok(results).build();
         }
         catch (KustvaktException e) {
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 41fe378..0ffa391 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
@@ -46,6 +46,8 @@
     private String glemmUri = "http://localhost:" + port + "/glemm";
 	private String termMapperUri = "http://localhost:" + port
 			+ "/term-mapper?foundry=corenlp";
+	private String termMapperUri2 = "http://localhost:" + port
+			+ "/term-mapper?fields=@all";
 
     public SearchPipeTest () throws URISyntaxException, IOException {
         pipeJson = IOUtils.toString(
@@ -139,6 +141,40 @@
 				+ "\"corenlp/p:ADJA\">freie</span> <span title="
 				+ "\"corenlp/p:NN\">Weg</span>"));
 	}
+	
+	@Test
+	public void testRetrieveMetadataWithResponsePipe ()
+			throws KustvaktException {
+		
+		mockClient.reset()
+        .when(request().withMethod("POST")
+        		.withPath("/term-mapper")
+        		.withQueryStringParameter("fields", "@all")
+                .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")
+				.queryParam("fields", "@all")
+				.queryParam("response-pipes", termMapperUri2)
+				.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 ()