Add apiVersion to rewrite (#806).

Change-Id: I393fb9397dd143e6026e8c17ebed61cb10ac5652
diff --git a/Changes b/Changes
index 122a8d9..a3b03af 100644
--- a/Changes
+++ b/Changes
@@ -14,6 +14,7 @@
 - Clean up collection node from Krill response (#806)
 - Add API version to NamedVCLoader (#806)
 - Add corpus support at VirtualCorpusRewrite (#806)
+- Add apiVersion to rewrite (#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 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);
diff --git a/src/test/java/de/ids_mannheim/korap/config/SpringJerseyTest.java b/src/test/java/de/ids_mannheim/korap/config/SpringJerseyTest.java
index cd8c0b2..dc2e429 100644
--- a/src/test/java/de/ids_mannheim/korap/config/SpringJerseyTest.java
+++ b/src/test/java/de/ids_mannheim/korap/config/SpringJerseyTest.java
@@ -26,7 +26,10 @@
     public final static String API_VERSION = "v1.1";
     public final static String API_VERSION_V1_0 = "v1.0";
     
-    protected final static double API_VERSION_DOUBLE = Double.parseDouble(API_VERSION.substring(1));
+    protected final static double API_VERSION_DOUBLE = 
+    		Double.parseDouble(API_VERSION.substring(1));
+    protected final static String COLLECTION_NODE_NAME = 
+    		(API_VERSION_DOUBLE >= 1.1) ? "corpus" : "collection";
 
     protected final static String allCorpusAccess = "All corpus access policy "
 			+ "has been added.";
diff --git a/src/test/java/de/ids_mannheim/korap/rewrite/AvailabilityRewriteTest.java b/src/test/java/de/ids_mannheim/korap/rewrite/AvailabilityRewriteTest.java
index 5e07b05..92c9976 100644
--- a/src/test/java/de/ids_mannheim/korap/rewrite/AvailabilityRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/rewrite/AvailabilityRewriteTest.java
@@ -39,7 +39,7 @@
         s.setCollection("textClass=politik & corpusSigle=WPD");
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(result,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
         assertEquals(1, node.at("/"+collectionNodeName+"/operands").size());
     }
@@ -58,7 +58,7 @@
         s.setCollection("corpusSigle=BRZ13 & corpusSigle=WPD");
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(result,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
         assertEquals(0, node.at("/"+collectionNodeName+"/operands").size());
         assertEquals("koral:rewrite", 
@@ -77,7 +77,7 @@
                 "(corpusSigle=BRZ13 & textClass=Wissenschaft) & corpusSigle=WPD");
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(result,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
         assertEquals("koral:docGroup",
         		node.at("/"+collectionNodeName+"/operands/0/@type").asText());
@@ -101,7 +101,7 @@
                 "(corpusSigle=BRZ13 & corpusSigle=WPD) & textClass=Wissenschaft & textClass=Sport");
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(result,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
         assertEquals("koral:docGroup", node.at("/"+collectionNodeName+"/@type").asText());
         assertEquals(2, node.at("/"+collectionNodeName+"/operands").size());
@@ -125,7 +125,7 @@
         s.setCollection("(corpusSigle=BRZ13 & textClass=wissenschaft)");
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(result,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
         assertEquals("koral:doc", node.at("/"+collectionNodeName+"/@type").asText());
         assertEquals("textClass", 
@@ -149,7 +149,7 @@
                 "(corpusSigle=BRZ13 & corpusSigle=WPD) & textClass=Wissenschaft");
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(result,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
         assertEquals("koral:doc", node.at("/"+collectionNodeName+"/@type").asText());
         assertEquals("textClass", node.at("/"+collectionNodeName+"/key").asText());
@@ -170,7 +170,7 @@
                 "(docID=random & textClass=Wissenschaft) & corpusSigle=WPD");
         String org = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(org,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
         assertEquals("koral:docGroup",
         		node.at("/"+collectionNodeName+"/@type").asText());
@@ -192,7 +192,7 @@
         s.setCollection("(docSigle=WPD_AAA & textClass=wissenschaft)");
         String org = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(org,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
         assertEquals(2, node.at("/"+collectionNodeName+"/operands").size());
         assertEquals("availability",
@@ -218,7 +218,7 @@
         s.setQuery(TestVariables.SIMPLE_ADD_QUERY, "poliqarp");
         String org = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(org,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
         assertEquals(node.at("/"+collectionNodeName+"/key").asText(), "availability");
         assertEquals(node.at("/"+collectionNodeName+"/value").asText(), "CC.*");
@@ -241,7 +241,7 @@
                 "(corpusSigle=BRZ14 & textClass=wissenschaft) | (corpusSigle=AZPR | textClass=freizeit)");
         String org = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(org,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
         assertEquals("koral:docGroup", 
         		node.at("/"+collectionNodeName+"/@type").asText());
@@ -272,7 +272,7 @@
                 "(corpusSigle=BRZ14 & textClass=wissenschaft) | (corpusSigle=AZPR | textClass=freizeit)");
         String org = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(org,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
 
         assertEquals("koral:docGroup", node.at("/"+collectionNodeName+"/@type").asText());
diff --git a/src/test/java/de/ids_mannheim/korap/rewrite/FoundryRewriteTest.java b/src/test/java/de/ids_mannheim/korap/rewrite/FoundryRewriteTest.java
index 4590149..bdc5ba6 100644
--- a/src/test/java/de/ids_mannheim/korap/rewrite/FoundryRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/rewrite/FoundryRewriteTest.java
@@ -88,7 +88,7 @@
         QuerySerializer s = new QuerySerializer(1.1);;
         s.setQuery("[pos=ADJA]", "poliqarp");
         String result = rewriteHandler.processQuery(s.toJSON(),
-                new KorAPUser(username));
+                new KorAPUser(username), API_VERSION_DOUBLE);
         JsonNode node = JsonUtils.readTree(result);
         assertEquals("corenlp", node.at("/query/wrap/foundry").asText());
         assertEquals("foundry",
@@ -103,7 +103,7 @@
         QuerySerializer s = new QuerySerializer(1.1);;
         s.setQuery("[base=Haus]", "poliqarp");
         String result = rewriteHandler.processQuery(s.toJSON(),
-                new KorAPUser(username));
+                new KorAPUser(username), API_VERSION_DOUBLE);
         JsonNode node = JsonUtils.readTree(result);
         // EM: only for testing, in fact, opennlp lemma does not
         // exist!
@@ -126,7 +126,8 @@
             throws KustvaktException {
         QuerySerializer s = new QuerySerializer(1.1);;
         s.setQuery("[base=Haus]", "poliqarp");
-        String result = rewriteHandler.processQuery(s.toJSON(), new KorAPUser("test"));
+        String result = rewriteHandler.processQuery(s.toJSON(), 
+        		new KorAPUser("test"), API_VERSION_DOUBLE);
         JsonNode node = JsonUtils.readTree(result);
         assertNotNull(node);
         assertFalse(node.at("/query/wrap/foundry").isMissingNode());
@@ -143,7 +144,8 @@
             throws KustvaktException {
         QuerySerializer s = new QuerySerializer(1.1);;
         s.setQuery("[pos=ADJA]", "poliqarp");
-        String result = rewriteHandler.processQuery(s.toJSON(), new KorAPUser("test"));
+        String result = rewriteHandler.processQuery(s.toJSON(), 
+        		new KorAPUser("test"), API_VERSION_DOUBLE);
         JsonNode node = JsonUtils.readTree(result);
         assertNotNull(node);
         assertFalse(node.at("/query/wrap/foundry").isMissingNode());
@@ -160,7 +162,8 @@
             throws KustvaktException {
         QuerySerializer s = new QuerySerializer(1.1);;
         s.setQuery("[orth=laufe/i & base!=Lauf]", "poliqarp");
-        String result = rewriteHandler.processQuery(s.toJSON(), new KorAPUser("test"));
+        String result = rewriteHandler.processQuery(s.toJSON(), 
+        		new KorAPUser("test"), API_VERSION_DOUBLE);
         JsonNode node = JsonUtils.readTree(result);
         assertNotNull(node);
         assertEquals("koral:termGroup", node.at("/query/wrap/@type").asText());
@@ -175,7 +178,8 @@
             throws KustvaktException {
         QuerySerializer s = new QuerySerializer(1.1);;
         s.setQuery("[(base=laufen | tt/pos=VVFIN)]", "poliqarp");
-        String result = rewriteHandler.processQuery(s.toJSON(), new KorAPUser("test"));
+        String result = rewriteHandler.processQuery(s.toJSON(), 
+        		new KorAPUser("test"), API_VERSION_DOUBLE);
         JsonNode node = JsonUtils.readTree(result);
         assertNotNull(node);
         assertEquals("koral:termGroup", node.at("/query/wrap/@type").asText());
@@ -189,7 +193,8 @@
     public void testFoundryBaseRewrite () throws KustvaktException {
         QuerySerializer s = new QuerySerializer(1.1);;
         s.setQuery("[orth=laufen]", "poliqarp");
-        String result = rewriteHandler.processQuery(s.toJSON(), new KorAPUser("test"));
+        String result = rewriteHandler.processQuery(s.toJSON(), 
+        		new KorAPUser("test"), API_VERSION_DOUBLE);
         JsonNode node = JsonUtils.readTree(result);
         assertEquals("koral:term", node.at("/query/wrap/@type").asText());
         assertFalse(node.at("/query/wrap/foundry").isMissingNode());
diff --git a/src/test/java/de/ids_mannheim/korap/rewrite/IdRewriteTest.java b/src/test/java/de/ids_mannheim/korap/rewrite/IdRewriteTest.java
index bd32d0c..4f28de8 100644
--- a/src/test/java/de/ids_mannheim/korap/rewrite/IdRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/rewrite/IdRewriteTest.java
@@ -6,13 +6,13 @@
 
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
+
 import com.fasterxml.jackson.databind.JsonNode;
+
 import de.ids_mannheim.korap.config.KustvaktConfiguration;
 import de.ids_mannheim.korap.config.SpringJerseyTest;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.query.serialize.QuerySerializer;
-import de.ids_mannheim.korap.rewrite.IdWriter;
-import de.ids_mannheim.korap.rewrite.RewriteHandler;
 import de.ids_mannheim.korap.user.KorAPUser;
 import de.ids_mannheim.korap.utils.JsonUtils;
 
@@ -32,7 +32,8 @@
         String query = "[surface=Wort]";
         QuerySerializer s = new QuerySerializer(API_VERSION_DOUBLE);
         s.setQuery(query, "poliqarp");
-        String value = handler.processQuery(s.toJSON(), new KorAPUser());
+        String value = handler.processQuery(s.toJSON(), new KorAPUser(), 
+        		API_VERSION_DOUBLE);
         JsonNode result = JsonUtils.readTree(value);
         assertNotNull(result);
         assertTrue(result.path("query").has("idn"));
@@ -44,7 +45,8 @@
         assertTrue(handler.add(IdWriter.class));
         QuerySerializer s = new QuerySerializer(API_VERSION_DOUBLE);
         s.setQuery("[base=Haus]", "poliqarp");
-        String result = handler.processQuery(s.toJSON(), new KorAPUser());
+        String result = handler.processQuery(s.toJSON(), new KorAPUser(), 
+        		API_VERSION_DOUBLE);
         JsonNode node = JsonUtils.readTree(result);
         assertNotNull(node);
         assertFalse(node.at("/query/wrap").isMissingNode());
diff --git a/src/test/java/de/ids_mannheim/korap/rewrite/QueryContextRewriteTest.java b/src/test/java/de/ids_mannheim/korap/rewrite/QueryContextRewriteTest.java
index 138b117..5a596c2 100644
--- a/src/test/java/de/ids_mannheim/korap/rewrite/QueryContextRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/rewrite/QueryContextRewriteTest.java
@@ -61,7 +61,8 @@
         assertEquals(60, context.at("/left/1").asInt());
         assertEquals(60, context.at("/right/1").asInt());
         
-        String result = rewriteHandler.processQuery(s.toJSON(), new KorAPUser("test"));
+        String result = rewriteHandler.processQuery(s.toJSON(), 
+        		new KorAPUser("test"), API_VERSION_DOUBLE);
         JsonNode node = JsonUtils.readTree(result);
         
         context = node.at("/meta/context");
diff --git a/src/test/java/de/ids_mannheim/korap/rewrite/ResultRewriteTest.java b/src/test/java/de/ids_mannheim/korap/rewrite/ResultRewriteTest.java
index a7507fd..92a07bf 100644
--- a/src/test/java/de/ids_mannheim/korap/rewrite/ResultRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/rewrite/ResultRewriteTest.java
@@ -4,11 +4,10 @@
 
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
+
 import de.ids_mannheim.korap.config.SpringJerseyTest;
 import de.ids_mannheim.korap.config.TestVariables;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.rewrite.AvailabilityRewrite;
-import de.ids_mannheim.korap.rewrite.RewriteHandler;
 import de.ids_mannheim.korap.utils.JsonUtils;
 
 /**
@@ -24,7 +23,8 @@
     public void testPostRewriteNothingToDo () throws KustvaktException {
         assertEquals(true, rewriteHandler.add(AvailabilityRewrite.class),
                 "Handler could not be added to rewrite handler instance!");
-        String v = rewriteHandler.processResult(TestVariables.RESULT, null);
+        String v = rewriteHandler.processResult(TestVariables.RESULT, null, 
+        		API_VERSION_DOUBLE);
         assertEquals(JsonUtils.readTree(TestVariables.RESULT),
                 JsonUtils.readTree(v), "results do not match");
     }
diff --git a/src/test/java/de/ids_mannheim/korap/rewrite/RewriteHandlerTest.java b/src/test/java/de/ids_mannheim/korap/rewrite/RewriteHandlerTest.java
index fe64c18..45d9dc3 100644
--- a/src/test/java/de/ids_mannheim/korap/rewrite/RewriteHandlerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/rewrite/RewriteHandlerTest.java
@@ -1,16 +1,15 @@
 package de.ids_mannheim.korap.rewrite;
 
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
+
 import de.ids_mannheim.korap.config.KustvaktConfiguration;
 import de.ids_mannheim.korap.config.SpringJerseyTest;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.query.serialize.QuerySerializer;
 
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
 /**
  * EM: to do: Fix tests
  * New DB does not save users.
@@ -95,7 +94,7 @@
             s.setQuery("[(base=laufen | base=gehen) & tt/pos=VVFIN]",
                     "poliqarp");
             assertTrue(handler.add(FoundryInject.class));
-            handler.processQuery(s.toJSON(), null);
+            handler.processQuery(s.toJSON(), null, API_VERSION_DOUBLE);
         });
     }
     // @Deprecated
diff --git a/src/test/java/de/ids_mannheim/korap/rewrite/TimeoutRewriteTest.java b/src/test/java/de/ids_mannheim/korap/rewrite/TimeoutRewriteTest.java
index 3ce9cee..99563a2 100644
--- a/src/test/java/de/ids_mannheim/korap/rewrite/TimeoutRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/rewrite/TimeoutRewriteTest.java
@@ -37,7 +37,7 @@
         s.setMeta(map);
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(result,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         
         node = node.at("/meta"); 
         assertEquals(1000, node.at("/timeout").asInt());
@@ -57,7 +57,7 @@
         s.setMeta(map);
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(result,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         
         node = node.at("/meta"); 
         assertEquals(10000, node.at("/timeout").asInt());
@@ -76,7 +76,7 @@
         s.setMeta(map);
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(result,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         
         node = node.at("/meta"); 
         assertEquals(10000, node.at("/timeout").asInt());
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 e047793..55a31b6 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
@@ -140,7 +140,7 @@
         assertEquals(302, node.at("/errors/0/0").asInt());
         assertEquals(302, node.at("/errors/1/0").asInt());
         assertTrue(node.at("/errors/2").isMissingNode());
-        assertFalse(node.at("/corpus").isMissingNode());
+        assertFalse(node.at("/"+COLLECTION_NODE_NAME).isMissingNode());
         assertEquals(13, node.at("/meta/count").asInt());
     }
 
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusControllerTest.java
index 7a0554a..95085c6 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusControllerTest.java
@@ -439,39 +439,40 @@
                 node.at("/errors/0/0").asInt());
     }
 
-    @Test
-    public void testEditCorpusQuery ()
-            throws ProcessingException, KustvaktException {
-    	createDoryVC();
-        JsonNode node = testRetrieveKoralQuery("dory", "dory-vc");
-        node = node.at("/corpus");
-        assertEquals("koral:docGroup", node.at("/@type").asText());
-        assertEquals(
-                "operation:and",node.at("/operation").asText());
-        assertEquals(2, node.at("/operands").size());
-        String json = "{\"corpusQuery\": \"corpusSigle=WPD17\"}";
-        editVC("dory", "dory", "dory-vc", json);
-        
-        node = testRetrieveKoralQuery("dory", "dory-vc");
-        node = node.at("/corpus");
-        assertEquals("koral:doc",node.at("/@type").asText());
-        assertEquals("corpusSigle",node.at("/key").asText());
-        assertEquals("WPD17",node.at("/value").asText());
-        
-        json = "{\"corpusQuery\": \"corpusSigle=GOE AND creationDate since "
-                + "1820\"}";
-        editVC("dory", "dory", "dory-vc", json);
-        node = testRetrieveKoralQuery("dory", "dory-vc");
-        node = node.at("/corpus");
-        assertEquals("koral:docGroup", node.at("/@type").asText());
-        assertEquals("operation:and", node.at("/operation").asText());
-        assertEquals("corpusSigle",node.at("/operands/0/key").asText());
-        assertEquals("GOE",node.at("/operands/0/value").asText());
-        assertEquals("creationDate", node.at("/operands/1/key").asText());
-        assertEquals("1820", node.at("/operands/1/value").asText());
-        
-        deleteVC("dory-vc", "dory", "dory");
-    }
+	@Test
+	public void testEditCorpusQuery ()
+			throws ProcessingException, KustvaktException {
+		createDoryVC();
+		JsonNode node = testRetrieveKoralQuery("dory", "dory-vc");
+		node = node.at("/" + COLLECTION_NODE_NAME);
+		assertEquals("koral:docGroup", node.at("/@type").asText());
+		assertEquals("operation:and", node.at("/operation").asText());
+		assertEquals(2, node.at("/operands").size());
+		String json = "{\"corpusQuery\": \"corpusSigle=WPD17\"}";
+		editVC("dory", "dory", "dory-vc", json);
+
+		node = testRetrieveKoralQuery("dory", "dory-vc");
+
+		node = node.at("/" + COLLECTION_NODE_NAME);
+		assertEquals("koral:doc", node.at("/@type").asText());
+		assertEquals("corpusSigle", node.at("/key").asText());
+		assertEquals("WPD17", node.at("/value").asText());
+
+		json = "{\"corpusQuery\": \"corpusSigle=GOE AND creationDate since "
+				+ "1820\"}";
+		editVC("dory", "dory", "dory-vc", json);
+		node = testRetrieveKoralQuery("dory", "dory-vc");
+
+		node = node.at("/" + COLLECTION_NODE_NAME);
+		assertEquals("koral:docGroup", node.at("/@type").asText());
+		assertEquals("operation:and", node.at("/operation").asText());
+		assertEquals("corpusSigle", node.at("/operands/0/key").asText());
+		assertEquals("GOE", node.at("/operands/0/value").asText());
+		assertEquals("creationDate", node.at("/operands/1/key").asText());
+		assertEquals(node.at("/operands/1/value").asText(), "1820");
+
+		deleteVC("dory-vc", "dory", "dory");
+	}
 
     private JsonNode testRetrieveKoralQuery (String username, String vcName)
             throws ProcessingException, KustvaktException {