Add API version to the search service (#806)

Change-Id: I1ce7bb90d0f10efc91ae694a4fb043916bdefc1d
diff --git a/Changes b/Changes
index a1d8465..ffa748b 100644
--- a/Changes
+++ b/Changes
@@ -7,6 +7,7 @@
 - Remove deprecated vc web-services for API v1.1 (#771)
 - Remove deprecated authorized_only parameter in the client list API for v1.1 (#760)
 - Add API version to the QueryService (#806)
+- Add API version to the search service (#806)
 
 # version 0.79.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 4f96816..13db3ac 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
@@ -80,9 +80,10 @@
     @SuppressWarnings("unchecked")
     public String serializeQuery (String q, String ql, String v, String cq,
             Integer pageIndex, Integer startPage, Integer pageLength,
-            String context, Boolean cutoff, boolean accessRewriteDisabled)
+            String context, Boolean cutoff, boolean accessRewriteDisabled,
+            double apiVersion)
             throws KustvaktException {
-        QuerySerializer ss = new QuerySerializer().setQuery(q, ql, v);
+        QuerySerializer ss = new QuerySerializer(apiVersion).setQuery(q, ql, v);
         if (cq != null)
             ss.setCollection(cq);
 
@@ -125,7 +126,8 @@
     }
 
     @SuppressWarnings("unchecked")
-	public String search (String engine, String username, HttpHeaders headers,
+	public String search (double requestedVersion, String engine, 
+			String username, HttpHeaders headers,
 			String q, String ql, String v, List<String> cqList, String fields,
 			String pipes, String responsePipes, Integer pageIndex,
 			Integer pageInteger, String ctx, Integer pageLength, Boolean cutoff,
@@ -147,7 +149,7 @@
             user.setCorpusAccess(CorpusAccess.ALL);
         }
 
-        QuerySerializer serializer = new QuerySerializer();
+        QuerySerializer serializer = new QuerySerializer(requestedVersion);
         serializer.setQuery(q, ql, v);
         String cq = combineMultipleCorpusQuery(cqList);
         if (cq != null)
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 cc02588..6dc08d6 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
@@ -38,9 +38,11 @@
 import jakarta.ws.rs.PathParam;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.container.ContainerRequestContext;
 import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.HttpHeaders;
 import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.PathSegment;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.SecurityContext;
 
@@ -127,6 +129,7 @@
     //    @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
     public Response serializeQuery (@Context Locale locale,
             @Context SecurityContext securityContext, @QueryParam("q") String q,
+            @Context ContainerRequestContext requestContext,
             @QueryParam("ql") String ql, @QueryParam("v") String v,
             @QueryParam("context") String context,
             @QueryParam("cutoff") Boolean cutoff,
@@ -135,12 +138,18 @@
             @QueryParam("page") Integer startPage,
             @QueryParam("access-rewrite-disabled") boolean accessRewriteDisabled,
             @QueryParam("cq") String cq) {
+    	
+    	List<PathSegment> pathSegments = requestContext.getUriInfo()
+    			.getPathSegments();
+        String version = pathSegments.get(0).getPath();
+        double apiVersion = Double.parseDouble(version.substring(1));
+        
         TokenContext ctx = (TokenContext) securityContext.getUserPrincipal();
         try {
             scopeService.verifyScope(ctx, OAuth2Scope.SERIALIZE_QUERY);
             String result = searchService.serializeQuery(q, ql, v, cq,
                     pageIndex, startPage, pageLength, context, cutoff,
-                    accessRewriteDisabled);
+                    accessRewriteDisabled, apiVersion);
             if (DEBUG) {
                 jlog.debug("Query: " + result);
             }
@@ -217,6 +226,7 @@
     @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
     //@SearchResourceFilters
     public Response searchGet (@Context SecurityContext securityContext,
+    		@Context ContainerRequestContext requestContext,
             @Context HttpServletRequest request, @Context HttpHeaders headers,
             @Context Locale locale, @QueryParam("q") String q,
             @QueryParam("ql") String ql, @QueryParam("v") String v,
@@ -234,13 +244,19 @@
             @QueryParam("cq") List<String> cq,
             @QueryParam("engine") String engine) {
 
+    	List<PathSegment> pathSegments = requestContext.getUriInfo()
+    			.getPathSegments();
+        String version = pathSegments.get(0).getPath();
+        double requestedVersion = Double.parseDouble(version.substring(1));
+        
         TokenContext context = (TokenContext) securityContext
                 .getUserPrincipal();
 
         String result;
         try {
             scopeService.verifyScope(context, OAuth2Scope.SEARCH);
-            result = searchService.search(engine, context.getUsername(),
+            result = searchService.search(requestedVersion, 
+            		engine, context.getUsername(),
                     headers, q, ql, v, cq, fields, pipes, responsePipes, 
                     pageIndex, pageInteger, ctx, pageLength, cutoff, 
                     accessRewriteDisabled, showTokens, showSnippet);
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/SearchControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/SearchControllerTest.java
index 538833e..90ec30a 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/SearchControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/SearchControllerTest.java
@@ -6,16 +6,12 @@
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response.Status;
-
-import de.ids_mannheim.korap.config.KustvaktConfiguration;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.net.HttpHeaders;
-import jakarta.ws.rs.core.Response;
 
 import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
 import de.ids_mannheim.korap.config.Attributes;
@@ -25,7 +21,10 @@
 import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.query.serialize.QuerySerializer;
 import de.ids_mannheim.korap.utils.JsonUtils;
-import org.springframework.beans.factory.annotation.Autowired;
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response.Status;
 
 /**
  * @author hanl, margaretha
@@ -35,6 +34,8 @@
 
     @Autowired
     private FullConfiguration config;
+    
+    private double apiVersion = Double.parseDouble(API_VERSION.substring(1));
 
     private JsonNode requestSearchWithFields (String fields)
             throws KustvaktException {
@@ -49,7 +50,7 @@
     }
 
     private String createJsonQuery () {
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery("[orth=der]", "poliqarp");
         s.setCollection("corpusSigle=GOE");
         s.setQuery("Wasser", "poliqarp");
@@ -397,7 +398,7 @@
     @Disabled
     @Test
     public void testSearchSimpleCQL () throws KustvaktException {
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery("(der) or (das)", "CQL");
         Response response = target().path(API_VERSION).path("search").request()
                 .post(Entity.json(s.toJSON()));
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/SearchPublicMetadataTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/SearchPublicMetadataTest.java
index 31abd44..db5b538 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/SearchPublicMetadataTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/SearchPublicMetadataTest.java
@@ -22,6 +22,8 @@
 
 public class SearchPublicMetadataTest extends VirtualCorpusTestBase {
 
+	private double apiVersion = Double.parseDouble(API_VERSION.substring(1));
+
     @Test
     public void testSearchPublicMetadata () throws KustvaktException {
         Response response = target().path(API_VERSION).path("search")
@@ -92,7 +94,7 @@
     @Disabled
     @Test
     public void testSearchPostPublicMetadata () throws KustvaktException {
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery("[orth=der]", "poliqarp");
         s.setCollection("corpusSigle=GOE");
         s.setQuery("Wasser", "poliqarp");
diff --git a/src/test/java/de/ids_mannheim/korap/web/lite/LiteSearchControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/lite/LiteSearchControllerTest.java
index 5cf6774..e15f9aa 100644
--- a/src/test/java/de/ids_mannheim/korap/web/lite/LiteSearchControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/lite/LiteSearchControllerTest.java
@@ -39,6 +39,9 @@
 
     @Autowired
     private KustvaktConfiguration config;
+    
+    private double apiVersion = Double.parseDouble(API_VERSION.substring(1));
+
 
     // EM: The API is disabled
     @Disabled
@@ -139,7 +142,7 @@
     @Test
     @Disabled
     public void testQueryPost () throws KustvaktException {
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery("[orth=das]", "poliqarp");
         Response response = target().path(API_VERSION).path("search").request()
                 .post(Entity.json(s.toJSON()));