Add API version to the QueryService.

Change-Id: Ie05d3b56a904e67f9c32a0dfab89f5e376c2489e
diff --git a/Changes b/Changes
index 5f1f4fe..a1d8465 100644
--- a/Changes
+++ b/Changes
@@ -6,6 +6,7 @@
 - Remove deprecated user-group web-services for API v1.1 (#769)
 - 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)
 
 # version 0.79.1
 
diff --git a/src/main/java/de/ids_mannheim/korap/init/Initializator.java b/src/main/java/de/ids_mannheim/korap/init/Initializator.java
index 02a141d..586f275 100644
--- a/src/main/java/de/ids_mannheim/korap/init/Initializator.java
+++ b/src/main/java/de/ids_mannheim/korap/init/Initializator.java
@@ -79,7 +79,7 @@
 		q.setQuery("[]");
 		q.setDescription("\"system\" query");
 		q.setQueryType(QueryType.QUERY);
-		queryService.handlePutRequest("system", "system", "system-q", q);
+		queryService.handlePutRequest("system", "system", "system-q", q, 1.1);
 	}
 
     public void initResourceTest () throws IOException, KustvaktException {
diff --git a/src/main/java/de/ids_mannheim/korap/service/QueryService.java b/src/main/java/de/ids_mannheim/korap/service/QueryService.java
index 344ba6f..faf5375 100644
--- a/src/main/java/de/ids_mannheim/korap/service/QueryService.java
+++ b/src/main/java/de/ids_mannheim/korap/service/QueryService.java
@@ -223,23 +223,27 @@
     }
 
     public Status handlePutRequest (String username, String queryCreator,
-            String queryName, QueryJson queryJson) throws KustvaktException {
+            String queryName, QueryJson queryJson, double apiVersion) 
+            		throws KustvaktException {
 
         verifyUsername(username, queryCreator);
         QueryDO query = queryDao.retrieveQueryByName(queryName, queryCreator);
 
         if (query == null) {
-            storeQuery(queryJson, queryName, queryCreator, username);
+            storeQuery(queryJson, queryName, queryCreator, username, 
+            		apiVersion);
             return Status.CREATED;
         }
         else {
-            editQuery(query, queryJson, queryName, username);
+            editQuery(query, queryJson, queryName, username, 
+            		apiVersion);
             return Status.NO_CONTENT;
         }
     }
 
     public void editQuery (QueryDO existingQuery, QueryJson newQuery,
-            String queryName, String username) throws KustvaktException {
+            String queryName, String username, double apiVersion) 
+    		throws KustvaktException {
 
         if (!username.equals(existingQuery.getCreatedBy())
                 && !adminDao.isAdmin(username)) {
@@ -253,13 +257,13 @@
         String query = newQuery.getQuery();
         String queryLanguage = newQuery.getQueryLanguage();
         if (corpusQuery != null && !corpusQuery.isEmpty()) {
-            koralQuery = serializeCorpusQuery(corpusQuery);
+            koralQuery = serializeCorpusQuery(corpusQuery, apiVersion);
             requiredAccess = determineRequiredAccess(newQuery.isCached(),
                     queryName, koralQuery);
         }
         else if (query != null && !query.isEmpty() && queryLanguage != null
                 && !queryLanguage.isEmpty()) {
-            koralQuery = serializeQuery(query, queryLanguage);
+            koralQuery = serializeQuery(query, queryLanguage, apiVersion);
         }
 
         ResourceType type = newQuery.getType();
@@ -311,7 +315,8 @@
     }
 
     public void storeQuery (QueryJson query, String queryName,
-            String queryCreator, String username) throws KustvaktException {
+            String queryCreator, String username, double apiVersion) 
+            		throws KustvaktException {
         QueryType queryType = query.getQueryType();
         if (!checkNumberOfQueryLimit(username, queryType)) {
             String type = queryType.displayName().toLowerCase();
@@ -320,7 +325,7 @@
                             + type + " has been reached.");
         }
 
-        String koralQuery = computeKoralQuery(query);
+        String koralQuery = computeKoralQuery(query, apiVersion);
         storeQuery(username, queryName, query.getType(), query.getQueryType(),
                 koralQuery, query.getDefinition(), query.getDescription(),
                 query.getStatus(), query.isCached(), queryCreator,
@@ -336,19 +341,20 @@
             return false;
     }
 
-    private String computeKoralQuery (QueryJson query)
+    private String computeKoralQuery (QueryJson query, double apiVersion)
             throws KustvaktException {
         if (query.getQueryType().equals(QueryType.VIRTUAL_CORPUS)) {
             ParameterChecker.checkStringValue(query.getCorpusQuery(),
                     "corpusQuery");
-            return serializeCorpusQuery(query.getCorpusQuery());
+            return serializeCorpusQuery(query.getCorpusQuery(), apiVersion);
         }
 
         if (query.getQueryType().equals(QueryType.QUERY)) {
             ParameterChecker.checkStringValue(query.getQuery(), "query");
             ParameterChecker.checkStringValue(query.getQueryLanguage(),
                     "queryLanguage");
-            return serializeQuery(query.getQuery(), query.getQueryLanguage());
+            return serializeQuery(query.getQuery(), query.getQueryLanguage(), 
+            		apiVersion);
         }
 
         return null;
@@ -434,9 +440,9 @@
         }
     }
 
-    public String serializeCorpusQuery (String corpusQuery)
+    public String serializeCorpusQuery (String corpusQuery, double apiVersion)
             throws KustvaktException {
-        QuerySerializer serializer = new QuerySerializer();
+        QuerySerializer serializer = new QuerySerializer(apiVersion);
         serializer.setCollection(corpusQuery);
         String koralQuery;
         try {
@@ -452,9 +458,10 @@
         return koralQuery;
     }
 
-    private String serializeQuery (String query, String queryLanguage)
+    private String serializeQuery (String query, String queryLanguage, double 
+    		apiVersion)
             throws KustvaktException {
-        QuerySerializer serializer = new QuerySerializer();
+        QuerySerializer serializer = new QuerySerializer(apiVersion);
         String koralQuery;
         koralQuery = serializer.setQuery(query, queryLanguage).toJSON();
         if (DEBUG) {
diff --git a/src/main/java/de/ids_mannheim/korap/web/controller/QueryReferenceController.java b/src/main/java/de/ids_mannheim/korap/web/controller/QueryReferenceController.java
index 0be121d..faf2a73 100644
--- a/src/main/java/de/ids_mannheim/korap/web/controller/QueryReferenceController.java
+++ b/src/main/java/de/ids_mannheim/korap/web/controller/QueryReferenceController.java
@@ -28,8 +28,10 @@
 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.MediaType;
+import jakarta.ws.rs.core.PathSegment;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.Response.Status;
 import jakarta.ws.rs.core.SecurityContext;
@@ -83,10 +85,16 @@
     @Path("/~{qCreator}/{qName}")
     @Consumes(MediaType.APPLICATION_JSON + ";charset=utf-8")
     public Response createQuery (@Context SecurityContext securityContext,
+    		@Context ContainerRequestContext requestContext,
             @PathParam("qCreator") String qCreator,
             @PathParam("qName") String qName, QueryJson query)
             throws KustvaktException {
 
+    	List<PathSegment> pathSegments = requestContext.getUriInfo()
+    			.getPathSegments();
+        String version = pathSegments.get(0).getPath();
+        double requestedVersion = Double.parseDouble(version.substring(1));
+        
         TokenContext context = (TokenContext) securityContext
                 .getUserPrincipal();
 
@@ -97,7 +105,7 @@
                 query.setQueryType(QueryType.QUERY);
             }
             Status status = service.handlePutRequest(context.getUsername(),
-                    qCreator, qName, query);
+                    qCreator, qName, query, requestedVersion);
             return Response.status(status).build();
         }
         catch (KustvaktException e) {
diff --git a/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusController.java b/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusController.java
index 522cedb..1374278 100644
--- a/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusController.java
+++ b/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusController.java
@@ -36,8 +36,10 @@
 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.MediaType;
+import jakarta.ws.rs.core.PathSegment;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.Response.Status;
 import jakarta.ws.rs.core.SecurityContext;
@@ -102,12 +104,18 @@
     @Path("/~{vcCreator}/{vcName}")
     @Consumes(MediaType.APPLICATION_JSON + ";charset=utf-8")
     public Response createUpdateVC (@Context SecurityContext securityContext,
+    		@Context ContainerRequestContext requestContext,
             @PathParam("vcCreator") String vcCreator,
             @PathParam("vcName") String vcName, QueryJson vc)
             throws KustvaktException {
         TokenContext context = (TokenContext) securityContext
                 .getUserPrincipal();
-
+        
+        List<PathSegment> pathSegments = requestContext.getUriInfo()
+    			.getPathSegments();
+        String version = pathSegments.get(0).getPath();
+        double apiVersion = Double.parseDouble(version.substring(1));
+        
         try {
             scopeService.verifyScope(context, OAuth2Scope.CREATE_VC);
             ParameterChecker.checkObjectValue(vc, "request entity");
@@ -115,7 +123,7 @@
                 vc.setQueryType(QueryType.VIRTUAL_CORPUS);
             }
             Status status = service.handlePutRequest(context.getUsername(),
-                    vcCreator, vcName, vc);
+                    vcCreator, vcName, vc, apiVersion);
             return Response.status(status).build();
         }
         catch (KustvaktException e) {