Fix KoralQuery and remove required access from query reference.

Change-Id: I04bf6c5c4bd80514e11a92347eda6677541051ef
diff --git a/Changes b/Changes
index b048dc5..27b711d 100644
--- a/Changes
+++ b/Changes
@@ -6,6 +6,7 @@
 - Fix datatype for query statistics (close #802)
 - Remove admin test data from database migration (close #808)
 - Remove user default settings from the database migration (close #810)
+- Fix KoralQuery and remove required access from query reference.
 
 # version 0.78.2
 
diff --git a/src/main/java/de/ids_mannheim/korap/dto/converter/QueryConverter.java b/src/main/java/de/ids_mannheim/korap/dto/converter/QueryConverter.java
index 3d469a9..12e5378 100644
--- a/src/main/java/de/ids_mannheim/korap/dto/converter/QueryConverter.java
+++ b/src/main/java/de/ids_mannheim/korap/dto/converter/QueryConverter.java
@@ -4,6 +4,7 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 
+import de.ids_mannheim.korap.constant.QueryType;
 import de.ids_mannheim.korap.dto.QueryDto;
 import de.ids_mannheim.korap.entity.QueryDO;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
@@ -27,7 +28,9 @@
         dto.setId(query.getId());
         dto.setName(query.getName());
         dto.setCreatedBy(query.getCreatedBy());
-        dto.setRequiredAccess(query.getRequiredAccess().name());
+        if (query.getQueryType().equals(QueryType.VIRTUAL_CORPUS)) {
+        	dto.setRequiredAccess(query.getRequiredAccess().name());
+        }
         dto.setStatus(query.getStatus());
         dto.setDescription(query.getDescription());
         dto.setType(query.getType().displayName());
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 cfa16fd..e3b0ce6 100644
--- a/src/main/java/de/ids_mannheim/korap/service/QueryService.java
+++ b/src/main/java/de/ids_mannheim/korap/service/QueryService.java
@@ -365,7 +365,7 @@
             }
         }
 
-        CorpusAccess requiredAccess = CorpusAccess.PUB;
+        CorpusAccess requiredAccess = CorpusAccess.FREE;
         if (queryType.equals(QueryType.VIRTUAL_CORPUS)) {
             requiredAccess = determineRequiredAccess(isCached, queryName,
                     koralQuery);
@@ -433,7 +433,8 @@
         if (DEBUG) {
             jlog.debug(koralQuery);
         }
-        return koralQuery;
+        JsonNode n = JsonUtils.readTree(koralQuery).get("query");
+        return n.toString();
     }
 
     public CorpusAccess determineRequiredAccess (boolean isCached, String name,
diff --git a/src/test/java/de/ids_mannheim/korap/config/TestBase.java b/src/test/java/de/ids_mannheim/korap/config/TestBase.java
index fab897b..449e447 100644
--- a/src/test/java/de/ids_mannheim/korap/config/TestBase.java
+++ b/src/test/java/de/ids_mannheim/korap/config/TestBase.java
@@ -4,6 +4,8 @@
 
 import java.util.Map;
 
+import org.apache.http.entity.ContentType;
+
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.net.HttpHeaders;
 
@@ -46,4 +48,28 @@
                 node.at("/errors/0/0").asInt());
         assertEquals(username, node.at("/errors/0/2").asText());
     }
+	
+	protected void createDoryQuery () throws KustvaktException {
+		String json = "{\"type\": \"PRIVATE\"" + ",\"queryType\": \"QUERY\""
+				+ ",\"queryLanguage\": \"poliqarp\""
+				+ ",\"query\": \"[]\"}";
+		String qName = "dory-q";
+		Response response = target().path(API_VERSION).path("query")
+				.path("~dory").path(qName).request()
+				.header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+						.createBasicAuthorizationHeaderValue("dory", "pass"))
+				.header(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON)
+				.put(Entity.json(json));
+		assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
+	}
+	
+	protected void deleteDoryQuery () throws KustvaktException {
+		Response response = target().path(API_VERSION).path("query")
+				.path("~dory").path("dory-q").request()
+				.header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+						.createBasicAuthorizationHeaderValue("dory", "pass"))
+				.delete();
+		assertEquals(Status.OK.getStatusCode(), response.getStatus());
+
+	}
 }
diff --git a/src/test/java/de/ids_mannheim/korap/rewrite/QueryReferenceRewriteTest.java b/src/test/java/de/ids_mannheim/korap/rewrite/QueryReferenceRewriteTest.java
index d6da757..9e3f334 100644
--- a/src/test/java/de/ids_mannheim/korap/rewrite/QueryReferenceRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/rewrite/QueryReferenceRewriteTest.java
@@ -4,11 +4,12 @@
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.junit.jupiter.api.Test;
+
 import com.fasterxml.jackson.databind.JsonNode;
 
 import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
 import de.ids_mannheim.korap.config.Attributes;
-import de.ids_mannheim.korap.config.SpringJerseyTest;
+import de.ids_mannheim.korap.config.TestBase;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.utils.JsonUtils;
 import jakarta.ws.rs.core.Response;
@@ -16,7 +17,7 @@
 /**
  * @author diewald
  */
-public class QueryReferenceRewriteTest extends SpringJerseyTest {
+public class QueryReferenceRewriteTest extends TestBase {
 
     @Test
     public void testRewriteRefNotFound () throws KustvaktException, Exception {
@@ -49,6 +50,8 @@
 
     @Test
     public void testRewriteRefRewrite () throws KustvaktException, Exception {
+    	createDoryQuery();
+    	
         // Added in the database migration sql for tests
         Response response = target().path(API_VERSION).path("search")
                 .queryParam("q", "{q}").queryParam("ql", "poliqarp")
@@ -68,5 +71,7 @@
         assertEquals("koral:queryRef", node.at("/0/original/@type").asText());
         assertEquals("dory/dory-q", node.at("/0/original/ref").asText());
         assertTrue(node.at("/0/scope").isMissingNode());
+        
+        deleteDoryQuery();
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/QueryReferenceControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/QueryReferenceControllerTest.java
index 57dc847..363b844 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/QueryReferenceControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/QueryReferenceControllerTest.java
@@ -4,33 +4,33 @@
 
 import org.apache.http.entity.ContentType;
 import org.junit.jupiter.api.Test;
+
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.net.HttpHeaders;
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.core.Response;
-import jakarta.ws.rs.core.Response.Status;
-import jakarta.ws.rs.client.Entity;
 
 import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
 import de.ids_mannheim.korap.config.Attributes;
-import de.ids_mannheim.korap.config.SpringJerseyTest;
+import de.ids_mannheim.korap.config.TestBase;
 import de.ids_mannheim.korap.constant.ResourceType;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.exceptions.StatusCodes;
-import de.ids_mannheim.korap.user.User.CorpusAccess;
 import de.ids_mannheim.korap.utils.JsonUtils;
+import jakarta.ws.rs.ProcessingException;
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response.Status;
 
-public class QueryReferenceControllerTest extends SpringJerseyTest {
+public class QueryReferenceControllerTest extends TestBase {
 
     private String testUser = "qRefControllerTest";
 
     private String adminUser = "admin";
 
     private String system = "system";
-
-    private void testRetrieveQueryByName (String qName, String query,
-            String queryCreator, String username, ResourceType resourceType,
-            CorpusAccess access) throws KustvaktException {
+    
+	private void testRetrieveQueryByName (String qName, String query,
+			String queryCreator, String username,
+			ResourceType resourceType) throws KustvaktException {
         Response response = target().path(API_VERSION).path("query")
                 .path("~" + queryCreator).path(qName).request()
                 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
@@ -45,7 +45,6 @@
         assertEquals(queryCreator, node.at("/createdBy").asText());
         assertEquals(query, node.at("/query").asText());
         assertEquals(node.at("/queryLanguage").asText(), "poliqarp");
-        assertEquals(access.name(), node.at("/requiredAccess").asText());
     }
 
     private void testUpdateQuery (String qName, String qCreator,
@@ -60,8 +59,7 @@
                 .header(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON)
                 .put(Entity.json(json));
         assertEquals(Status.NO_CONTENT.getStatusCode(), response.getStatus());
-        testRetrieveQueryByName(qName, "Sonne", qCreator, username, type,
-                CorpusAccess.PUB);
+        testRetrieveQueryByName(qName, "Sonne", qCreator, username, type);
     }
 
     @Test
@@ -77,7 +75,7 @@
                 .put(Entity.json(json));
         assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
         testRetrieveQueryByName(qName, "der", testUser, testUser,
-                ResourceType.PRIVATE, CorpusAccess.PUB);
+                ResourceType.PRIVATE);
         testUpdateQuery(qName, testUser, testUser, ResourceType.PRIVATE);
         testDeleteQueryByName(qName, testUser, testUser);
     }
@@ -95,7 +93,7 @@
                 .put(Entity.json(json));
         assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
         testRetrieveQueryByName(qName, "Regen", testUser, testUser,
-                ResourceType.PUBLISHED, CorpusAccess.PUB);
+                ResourceType.PUBLISHED);
         testDeleteQueryByName(qName, testUser, testUser);
         // check if hidden group has been created
     }
@@ -114,7 +112,7 @@
                 .put(Entity.json(json));
         assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
         testRetrieveQueryByName(qName, "Sommer", "marlin", adminUser,
-                ResourceType.PRIVATE, CorpusAccess.PUB);
+                ResourceType.PRIVATE);
         testUpdateQuery(qName, "marlin", adminUser, ResourceType.PRIVATE);
         testDeleteQueryByName(qName, "marlin", adminUser);
     }
@@ -133,7 +131,7 @@
                 .put(Entity.json(json));
         assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
         testRetrieveQueryByName(qName, "Sommer", system, adminUser,
-                ResourceType.SYSTEM, CorpusAccess.PUB);
+                ResourceType.SYSTEM);
         testUpdateQuery(qName, system, adminUser, ResourceType.SYSTEM);
         testDeleteSystemQueryUnauthorized(qName);
         testDeleteQueryByName(qName, system, adminUser);
@@ -172,7 +170,7 @@
                 .put(Entity.json(json));
         assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
         testRetrieveQueryByName(qName, "Sohn", testUser, testUser,
-                ResourceType.PRIVATE, CorpusAccess.PUB);
+                ResourceType.PRIVATE);
         testDeleteQueryByName(qName, testUser, testUser);
     }
 
@@ -249,6 +247,8 @@
 
     @Test
     public void testDeleteQueryUnauthorized () throws KustvaktException {
+    	createDoryQuery();
+    	
         Response response = target().path(API_VERSION).path("query")
                 .path("~dory").path("dory-q").request()
                 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
@@ -261,6 +261,9 @@
                 node.at("/errors/0/0").asInt());
         assertEquals("Unauthorized operation for user: " + testUser,
                 node.at("/errors/0/1").asText());
+        
+        testListAvailableQueryForDory();
+        deleteDoryQuery();
     }
 
     private void testDeleteSystemQueryUnauthorized (String qName)
@@ -297,7 +300,6 @@
                 "dory/non-existing-query");
     }
 
-    @Test
     public void testListAvailableQueryForDory ()
             throws ProcessingException, KustvaktException {
         JsonNode node = testListAvailableQuery("dory");
@@ -314,8 +316,6 @@
                 node.at("/0/type").asText());
         assertEquals(node.at("/0/description").asText(), "\"system\" query");
         assertEquals(node.at("/0/query").asText(), "[]");
-        assertEquals(CorpusAccess.FREE.name(),
-                node.at("/0/requiredAccess").asText());
         // assertEquals("koral:token", node.at("/0/koralQuery/@type").asText());
     }
 
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 9f53164..2dbf46f 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
@@ -331,6 +331,7 @@
         assertEquals(2, node.size());
         
         node = node.get(1);
+        System.out.println(node.toPrettyString());
         assertEquals(vcName, node.get("name").asText());
         assertEquals("ALL", node.get("requiredAccess").asText());
         deleteVC(vcName, testUser, testUser);