Add apiVersion to rewrite (#806).

Change-Id: I393fb9397dd143e6026e8c17ebed61cb10ac5652
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 97bcc70..4624720 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
@@ -102,11 +102,12 @@
         // return ss.toJSON();
 
         String query = ss.toJSON();
-        query = rewriteHandler.processQuery(ss.toJSON(), null);
+        query = rewriteHandler.processQuery(ss.toJSON(), null, apiVersion);
         return query;
     }
 
-    public String search (String jsonld, String username, HttpHeaders headers)
+    public String search (String jsonld, String username, HttpHeaders headers, 
+    		double apiVersion)
             throws KustvaktException {
 
         User user = createUser(username, headers);
@@ -117,7 +118,7 @@
             user.setCorpusAccess(CorpusAccess.ALL);
         }
 
-        String query = this.rewriteHandler.processQuery(jsonld, user);
+        String query = this.rewriteHandler.processQuery(jsonld, user, apiVersion);
         // MH: todo: should be possible to add the meta part to
         // the query serialization
         // User user = controller.getUser(ctx.getUsername());
@@ -178,7 +179,7 @@
         // Query pipe rewrite
         query = runPipes(query, pipes);
 
-        query = this.rewriteHandler.processQuery(query, user);
+        query = this.rewriteHandler.processQuery(query, user, apiVersion);
         if (DEBUG) {
             jlog.debug("the serialized query " + query);
         }
diff --git a/src/main/java/de/ids_mannheim/korap/core/service/StatisticService.java b/src/main/java/de/ids_mannheim/korap/core/service/StatisticService.java
index aae79dd..173981b 100644
--- a/src/main/java/de/ids_mannheim/korap/core/service/StatisticService.java
+++ b/src/main/java/de/ids_mannheim/korap/core/service/StatisticService.java
@@ -25,7 +25,7 @@
 		//System.out.println("Before:" + json + "\n");
 		if (!cqList.isEmpty() && !combineMultipleCorpusQuery(cqList).isEmpty()) {
 			User user = createUser(username, headers);
-			json = statisticsRewriteHandler.processQuery(json, user);
+			json = statisticsRewriteHandler.processQuery(json, user, apiVersion);
 		}
 		//System.out.println("After:" + json);
 		String stats = searchKrill.getStatistics(json);
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 6dc08d6..e2613ce 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
@@ -166,6 +166,7 @@
     @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
     //@SearchResourceFilters
     public Response searchPost (@Context SecurityContext context,
+    		@Context ContainerRequestContext requestContext,
             @Context Locale locale, @Context HttpHeaders headers,
             String jsonld) {
 
@@ -173,11 +174,16 @@
             jlog.debug("Serialized search: " + jsonld);
         }
 
+        List<PathSegment> pathSegments = requestContext.getUriInfo()
+    			.getPathSegments();
+        String version = pathSegments.get(0).getPath();
+        double requestedVersion = Double.parseDouble(version.substring(1));
+        
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
         try {
             scopeService.verifyScope(ctx, OAuth2Scope.SEARCH);
             String result = searchService.search(jsonld, ctx.getUsername(),
-                    headers);
+                    headers, requestedVersion);
             return Response.ok(result).build();
         }
         catch (KustvaktException e) {
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/AvailabilityRewrite.java b/src/main/java/de/ids_mannheim/korap/rewrite/AvailabilityRewrite.java
index d0c0f38..764abc8 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/AvailabilityRewrite.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/AvailabilityRewrite.java
@@ -44,8 +44,6 @@
 
     public static Logger jlog = LogManager.getLogger(AvailabilityRewrite.class);
     
-    private double apiVersion = 1.1; 
-
     public AvailabilityRewrite () {
         super();
     }
@@ -107,7 +105,8 @@
 
 	@Override
 	public KoralNode rewriteQuery (KoralNode koralNode,
-			KustvaktConfiguration config, User user) throws KustvaktException {
+			KustvaktConfiguration config, User user, double apiVersion) 
+			throws KustvaktException {
 		JsonNode jsonNode = koralNode.rawNode();
 
         FullConfiguration fullConfig = (FullConfiguration) config;
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/CollectionCleanRewrite.java b/src/main/java/de/ids_mannheim/korap/rewrite/CollectionCleanRewrite.java
index 0ac1de3..3955209 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/CollectionCleanRewrite.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/CollectionCleanRewrite.java
@@ -22,7 +22,7 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-            User user) {
+            User user, double apiVersion) {
         JsonNode jsonNode = process(node.rawNode());
         return node.wrapNode(jsonNode);
     }
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/CollectionConstraint.java b/src/main/java/de/ids_mannheim/korap/rewrite/CollectionConstraint.java
index 6342dbb..cc9b774 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/CollectionConstraint.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/CollectionConstraint.java
@@ -19,7 +19,7 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-            User user) {
+            User user, double apiVersion) {
         if (node.get("@type").equals("koral:doc")) {
             if (node.get("key").equals(Attributes.CORPUS_SIGLE)) {
                 String id = node.get("value");
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/FoundryInject.java b/src/main/java/de/ids_mannheim/korap/rewrite/FoundryInject.java
index 846d2e5..f57bbeb 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/FoundryInject.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/FoundryInject.java
@@ -20,14 +20,14 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode koralNode, KustvaktConfiguration config,
-            User user) throws KustvaktException {
+            User user, double apiVersion) throws KustvaktException {
 
     	// EM: I don't know the purpose of the following code and it is not 
     	// tested
         if (koralNode.get("@type").equals("koral:span")) {
             if (!koralNode.isMissingNode("/wrap")) {
                 koralNode = koralNode.at("/wrap");
-                JsonNode term = rewriteQuery(koralNode, config, user).rawNode();
+                JsonNode term = rewriteQuery(koralNode, config, user, apiVersion).rawNode();
                 koralNode.replaceAt("/wrap", term,
                         new RewriteIdentifier("koral:term", "replace", ""));
             }
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/FoundryRewrite.java b/src/main/java/de/ids_mannheim/korap/rewrite/FoundryRewrite.java
index c59097c..743daf0 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/FoundryRewrite.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/FoundryRewrite.java
@@ -19,7 +19,7 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-            User user) throws KustvaktException {
+            User user, double apiVersion) throws KustvaktException {
         String username = user.getUsername();
         String jsonSettings = settingService.retrieveDefaultSettings(username);
         if (jsonSettings != null) {
@@ -27,6 +27,6 @@
                     jsonSettings);
             user.setUserSettingProcessor(processor);
         }
-        return super.rewriteQuery(node, config, user);
+        return super.rewriteQuery(node, config, user, apiVersion);
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/IdWriter.java b/src/main/java/de/ids_mannheim/korap/rewrite/IdWriter.java
index 113c176..bc98530 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/IdWriter.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/IdWriter.java
@@ -1,8 +1,7 @@
 package de.ids_mannheim.korap.rewrite;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import de.ids_mannheim.korap.config.BeanInjectable;
-import de.ids_mannheim.korap.config.ContextHolder;
+
 import de.ids_mannheim.korap.config.KustvaktConfiguration;
 import de.ids_mannheim.korap.user.User;
 
@@ -20,7 +19,7 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-            User user) {
+            User user, double apiVersion) {
         if (node.get("@type").equals("koral:token")) {
             String s = extractToken(node.rawNode());
             if (s != null && !s.isEmpty())
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/MetaConstraint.java b/src/main/java/de/ids_mannheim/korap/rewrite/MetaConstraint.java
index 2838f67..a3c17d9 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/MetaConstraint.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/MetaConstraint.java
@@ -1,7 +1,7 @@
 package de.ids_mannheim.korap.rewrite;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import de.ids_mannheim.korap.config.BeanInjectable;
+
 import de.ids_mannheim.korap.config.KustvaktConfiguration;
 import de.ids_mannheim.korap.user.User;
 
@@ -13,7 +13,7 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-            User user) {
+            User user, double apiVersion) {
         // redundant
         if (node.rawNode().has("meta")) {
             JsonNode meta = node.rawNode().path("meta");
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/QueryContextRewrite.java b/src/main/java/de/ids_mannheim/korap/rewrite/QueryContextRewrite.java
index e5f3bee..6e7fa1c 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/QueryContextRewrite.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/QueryContextRewrite.java
@@ -19,7 +19,7 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-            User user) throws KustvaktException {
+            User user, double apiVersion) throws KustvaktException {
         
         if (config.getMaxTokenContext() > 0) {
             boolean isContextCut = false;
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/QueryReferenceRewrite.java b/src/main/java/de/ids_mannheim/korap/rewrite/QueryReferenceRewrite.java
index e5f6a36..7b4d2b3 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/QueryReferenceRewrite.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/QueryReferenceRewrite.java
@@ -31,7 +31,7 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-            User user) throws KustvaktException {
+            User user, double apiVersion) throws KustvaktException {
         if (node.has("query")) {
             node = node.at("/query");
             findQueryRef(user.getUsername(), node);
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/RewriteHandler.java b/src/main/java/de/ids_mannheim/korap/rewrite/RewriteHandler.java
index 6bad856..29e27cb 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/RewriteHandler.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/RewriteHandler.java
@@ -99,7 +99,7 @@
      * @return boolean if rewriter class was successfully added to
      *         rewrite handler!
      */
-    @Deprecated
+    // EM: MH marked this as @Deprecated
     public boolean add (Class<? extends RewriteTask> rewriter) {
         RewriteTask task;
         try {
@@ -114,27 +114,27 @@
         return addProcessor(task);
     }
 
-    public String processQuery (JsonNode root, User user)
+    public String processQuery (JsonNode root, User user, double apiVersion)
             throws KustvaktException {
         RewriteProcess process = new RewriteProcess(root, user);
-        JsonNode pre = process.start(false);
+        JsonNode pre = process.start(false, apiVersion);
         return JsonUtils.toJSON(pre);
     }
 
-    public String processQuery (String json, User user)
+    public String processQuery (String json, User user, double apiVersion)
             throws KustvaktException {
-        return processQuery(JsonUtils.readTree(json), user);
+        return processQuery(JsonUtils.readTree(json), user, apiVersion);
     }
 
-    public String processResult (String json, User user)
+    public String processResult (String json, User user, double apiVersion)
             throws KustvaktException {
-        return processResult(JsonUtils.readTree(json), user);
+        return processResult(JsonUtils.readTree(json), user, apiVersion);
     }
 
-    public String processResult (JsonNode node, User user)
+    public String processResult (JsonNode node, User user, double apiVersion)
             throws KustvaktException {
         RewriteProcess process = new RewriteProcess(node, user);
-        JsonNode pre = process.start(true);
+        JsonNode pre = process.start(true, apiVersion);
         return JsonUtils.toJSON(pre);
     }
 
@@ -161,7 +161,7 @@
         }
 
         private KoralNode processNode (String key, JsonNode value,
-                boolean result) throws KustvaktException {
+                boolean result, double apiVersion) throws KustvaktException {
             KoralNode kroot = KoralNode.wrapNode(value);
             if (value.isObject()) {
                 if (value.has("operands")) {
@@ -169,7 +169,7 @@
                     Iterator<JsonNode> it = ops.elements();
                     while (it.hasNext()) {
                         JsonNode next = it.next();
-                        KoralNode kn = processNode(key, next, result);
+                        KoralNode kn = processNode(key, next, result, apiVersion);
                         if (kn.isRemove())
                             it.remove();
                     }
@@ -177,19 +177,19 @@
                 else if (value.path("@type").asText().equals("koral:token")) {
                     // todo: koral:token nodes cannot be flagged for deletion --> creates the possibility for empty koral:token nodes
                     rewrite(key, kroot,
-                            RewriteHandler.this.token_node_processors, result);
-                    return processNode(key, value.path("wrap"), result);
+                            RewriteHandler.this.token_node_processors, result, apiVersion);
+                    return processNode(key, value.path("wrap"), result, apiVersion);
                 }
                 else {
                     return rewrite(key, kroot,
-                            RewriteHandler.this.node_processors, result);
+                            RewriteHandler.this.node_processors, result, apiVersion);
                 }
             }
             else if (value.isArray()) {
                 Iterator<JsonNode> it = value.elements();
                 while (it.hasNext()) {
                     JsonNode next = it.next();
-                    KoralNode kn = processNode(key, next, result);
+                    KoralNode kn = processNode(key, next, result, apiVersion);
                     if (kn.isRemove())
                         it.remove();
                 }
@@ -197,7 +197,7 @@
             return kroot;
         }
 
-        private JsonNode start (boolean result) throws KustvaktException {
+        private JsonNode start (boolean result, double apiVersion) throws KustvaktException {
             if (DEBUG) {
                 jlog.debug("Running rewrite process on query " + root);
             }
@@ -205,10 +205,10 @@
                 Iterator<Map.Entry<String, JsonNode>> it = root.fields();
                 while (it.hasNext()) {
                     Map.Entry<String, JsonNode> next = it.next();
-                    processNode(next.getKey(), next.getValue(), result);
+                    processNode(next.getKey(), next.getValue(), result, apiVersion);
                 }
                 processFixedNode(root, RewriteHandler.this.query_processors,
-                        result);
+                        result, apiVersion);
             }
             return root;
         }
@@ -216,12 +216,13 @@
         /**
          * @param node
          * @param tasks
+         * @param apiVersion 
          * @return boolean true if node is to be removed from parent!
          *         Only
          *         applies if parent is an array node
          */
         private KoralNode rewrite (String rootNode, KoralNode node,
-                Collection<? extends RewriteTask> tasks, boolean result)
+                Collection<? extends RewriteTask> tasks, boolean result, double apiVersion)
                 throws KustvaktException {
             if (RewriteHandler.this.config == null)
                 throw new RuntimeException(
@@ -249,7 +250,7 @@
                 }
                 if (!result && task instanceof RewriteTask.RewriteQuery) {
                     ((RewriteTask.RewriteQuery) task).rewriteQuery(node,
-                            RewriteHandler.this.config, this.user);
+                            RewriteHandler.this.config, this.user, apiVersion);
                 }
                 else if (task instanceof RewriteTask.RewriteResult) {
                     ((RewriteTask.RewriteResult) task).rewriteResult(node);
@@ -267,7 +268,7 @@
 
         // fixme: merge with processNode!
         private void processFixedNode (JsonNode node,
-                Collection<RewriteTask> tasks, boolean post)
+                Collection<RewriteTask> tasks, boolean post, double apiVersion)
                 throws KustvaktException {
             for (RewriteTask task : tasks) {
                 KoralNode next = KoralNode.wrapNode(node);
@@ -280,7 +281,7 @@
 
                 if (!post & task instanceof RewriteTask.RewriteQuery)
                     next = ((RewriteTask.RewriteQuery) task).rewriteQuery(next,
-                            RewriteHandler.this.config, user);
+                            RewriteHandler.this.config, user, apiVersion);
                 else if (task instanceof RewriteTask.RewriteResult)
                     ((RewriteTask.RewriteResult) task).rewriteResult(next);
                 next.buildRewrites();
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/RewriteTask.java b/src/main/java/de/ids_mannheim/korap/rewrite/RewriteTask.java
index b015c0e..feec93a 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/RewriteTask.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/RewriteTask.java
@@ -26,10 +26,12 @@
          *            injected by rewrite handler if available. Might
          *            cause {@link NullPointerException} if not
          *            checked properly
+         * @param apiVersion
+         *            the version of the API
          * @return
          */
         KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-                User user) throws KustvaktException;
+                User user, double apiVersion) throws KustvaktException;
 
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/TimeoutRewrite.java b/src/main/java/de/ids_mannheim/korap/rewrite/TimeoutRewrite.java
index 1cdfd2f..eddfcd3 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/TimeoutRewrite.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/TimeoutRewrite.java
@@ -9,7 +9,7 @@
 
 	@Override
 	public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-			User user) throws KustvaktException {
+			User user, double apiVersion) throws KustvaktException {
 		CorpusAccess access = user.getCorpusAccess();
 		if (node.has("meta")) {
             node = node.at("/meta");
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/TreeConstraint.java b/src/main/java/de/ids_mannheim/korap/rewrite/TreeConstraint.java
index 81f254a..a7d0983 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/TreeConstraint.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/TreeConstraint.java
@@ -59,7 +59,7 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-            User user) {
+            User user, double apiVersion) {
         System.out.println("FIND PATH " + node.rawNode().findParent(pointer));
 
         return node;
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/VirtualCorpusRewrite.java b/src/main/java/de/ids_mannheim/korap/rewrite/VirtualCorpusRewrite.java
index ccdc704..7792c88 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/VirtualCorpusRewrite.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/VirtualCorpusRewrite.java
@@ -31,7 +31,7 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-            User user) throws KustvaktException {
+            User user, double apiVersion) throws KustvaktException {
     	if (node.has("corpus")) {
             node = node.at("/corpus");
             findVCRef(user.getUsername(), node);