Added listing available queries for users.

Change-Id: I8895226a3fe095f1d997e81fddf7428bb1e9c904
diff --git a/full/src/main/java/de/ids_mannheim/korap/config/NamedVCLoader.java b/full/src/main/java/de/ids_mannheim/korap/config/NamedVCLoader.java
index 57d1d9b..06f6ee5 100644
--- a/full/src/main/java/de/ids_mannheim/korap/config/NamedVCLoader.java
+++ b/full/src/main/java/de/ids_mannheim/korap/config/NamedVCLoader.java
@@ -90,7 +90,7 @@
                 cacheVC(json, filename);
                 try {
                     VirtualCorpus vc = vcService.searchVCByName("system",
-                            filename, "system");
+                            filename, "system", QueryType.VIRTUAL_CORPUS);
                     if (vc != null) {
                         if (DEBUG) {
                             jlog.debug("Delete existing vc: " + filename);
diff --git a/full/src/main/java/de/ids_mannheim/korap/constant/QueryType.java b/full/src/main/java/de/ids_mannheim/korap/constant/QueryType.java
index d223056..cd47332 100644
--- a/full/src/main/java/de/ids_mannheim/korap/constant/QueryType.java
+++ b/full/src/main/java/de/ids_mannheim/korap/constant/QueryType.java
@@ -1,7 +1,13 @@
 package de.ids_mannheim.korap.constant;
 
+import org.apache.commons.lang.StringUtils;
+
 public enum QueryType {
 
     QUERY,
     VIRTUAL_CORPUS;
+    
+    public String displayName () {
+        return StringUtils.capitalize(name().toLowerCase().replace("_", " "));
+    }
 }
diff --git a/full/src/main/java/de/ids_mannheim/korap/dao/VirtualCorpusDao.java b/full/src/main/java/de/ids_mannheim/korap/dao/VirtualCorpusDao.java
index bbd9f2c..fb1dc84 100644
--- a/full/src/main/java/de/ids_mannheim/korap/dao/VirtualCorpusDao.java
+++ b/full/src/main/java/de/ids_mannheim/korap/dao/VirtualCorpusDao.java
@@ -22,9 +22,9 @@
 
 import de.ids_mannheim.korap.constant.GroupMemberStatus;
 import de.ids_mannheim.korap.constant.QueryType;
+import de.ids_mannheim.korap.constant.ResourceType;
 import de.ids_mannheim.korap.constant.UserGroupStatus;
 import de.ids_mannheim.korap.constant.VirtualCorpusAccessStatus;
-import de.ids_mannheim.korap.constant.ResourceType;
 import de.ids_mannheim.korap.entity.UserGroup;
 import de.ids_mannheim.korap.entity.UserGroupMember;
 import de.ids_mannheim.korap.entity.UserGroupMember_;
@@ -75,9 +75,9 @@
     }
 
     public void editVirtualCorpus (VirtualCorpus vc, String name,
-            ResourceType type, CorpusAccess requiredAccess,
-            String koralQuery, String definition, String description,
-            String status, boolean isCached) throws KustvaktException {
+            ResourceType type, CorpusAccess requiredAccess, String koralQuery,
+            String definition, String description, String status,
+            boolean isCached) throws KustvaktException {
 
         if (name != null && !name.isEmpty()) {
             vc.setName(name);
@@ -131,31 +131,30 @@
      */
     @SuppressWarnings("unchecked")
     public List<VirtualCorpus> retrieveVCByType (ResourceType type,
-            String createdBy) throws KustvaktException {
+            String createdBy, QueryType queryType) throws KustvaktException {
 
         CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
         CriteriaQuery<VirtualCorpus> query =
                 criteriaBuilder.createQuery(VirtualCorpus.class);
         Root<VirtualCorpus> virtualCorpus = query.from(VirtualCorpus.class);
 
-        Predicate conditions = null;
+        Predicate conditions = criteriaBuilder
+                .equal(virtualCorpus.get(VirtualCorpus_.queryType), queryType);
         if (createdBy != null && !createdBy.isEmpty()) {
-            conditions = criteriaBuilder.equal(
-                    virtualCorpus.get(VirtualCorpus_.createdBy), createdBy);
+            conditions = criteriaBuilder.and(conditions, criteriaBuilder.equal(
+                    virtualCorpus.get(VirtualCorpus_.createdBy), createdBy));
             if (type != null) {
                 conditions = criteriaBuilder.and(conditions, criteriaBuilder
                         .equal(virtualCorpus.get(VirtualCorpus_.type), type));
             }
         }
         else if (type != null) {
-            conditions = criteriaBuilder
-                    .equal(virtualCorpus.get(VirtualCorpus_.type), type);
+            conditions = criteriaBuilder.and(conditions, criteriaBuilder
+                    .equal(virtualCorpus.get(VirtualCorpus_.type), type));
         }
 
         query.select(virtualCorpus);
-        if (conditions != null) {
-            query.where(conditions);
-        }
+        query.where(conditions);
         Query q = entityManager.createQuery(query);
         return q.getResultList();
     }
@@ -178,7 +177,7 @@
         }
         catch (NoResultException e) {
             throw new KustvaktException(StatusCodes.NO_RESOURCE_FOUND,
-                    "Virtual corpus with id: "+ id+" is not found",
+                    "Virtual corpus with id: " + id + " is not found",
                     String.valueOf(id), e);
         }
         return vc;
@@ -229,8 +228,8 @@
     }
 
     @SuppressWarnings("unchecked")
-    public List<VirtualCorpus> retrieveOwnerVC (String userId)
-            throws KustvaktException {
+    public List<VirtualCorpus> retrieveOwnerVC (String userId,
+            QueryType queryType) throws KustvaktException {
         ParameterChecker.checkStringValue(userId, "userId");
 
         CriteriaBuilder builder = entityManager.getCriteriaBuilder();
@@ -238,9 +237,14 @@
                 builder.createQuery(VirtualCorpus.class);
 
         Root<VirtualCorpus> virtualCorpus = query.from(VirtualCorpus.class);
+        Predicate conditions = builder.and(
+                builder.equal(virtualCorpus.get(VirtualCorpus_.createdBy),
+                        userId),
+                builder.equal(virtualCorpus.get(VirtualCorpus_.queryType),
+                        queryType));
+
         query.select(virtualCorpus);
-        query.where(builder.equal(virtualCorpus.get(VirtualCorpus_.createdBy),
-                userId));
+        query.where(conditions);
 
         Query q = entityManager.createQuery(query);
         return q.getResultList();
@@ -269,7 +273,7 @@
     }
 
     @SuppressWarnings("unchecked")
-    public List<VirtualCorpus> retrieveGroupVCByUser (String userId)
+    public List<VirtualCorpus> retrieveGroupVCByUser (String userId, QueryType queryType)
             throws KustvaktException {
         ParameterChecker.checkStringValue(userId, "userId");
 
@@ -287,6 +291,9 @@
         // builder.notEqual(access.get(VirtualCorpusAccess_.status),
         // VirtualCorpusAccessStatus.DELETED));
 
+        Predicate type = builder
+                .equal(virtualCorpus.get(VirtualCorpus_.queryType), queryType);
+                
         Predicate corpusStatus =
                 builder.notEqual(access.get(VirtualCorpusAccess_.status),
                         VirtualCorpusAccessStatus.DELETED);
@@ -305,26 +312,29 @@
 
         query.select(virtualCorpus);
         query.where(
-                builder.and(corpusStatus, userGroupStatus, memberStatus, user));
+                builder.and(type, corpusStatus, userGroupStatus, memberStatus, user));
 
         Query q = entityManager.createQuery(query);
         return q.getResultList();
     }
 
-    public List<VirtualCorpus> retrieveVCByUser (String userId)
-            throws KustvaktException {
+    public List<VirtualCorpus> retrieveVCByUser (String userId,
+            QueryType queryType) throws KustvaktException {
         ParameterChecker.checkStringValue(userId, "userId");
+        ParameterChecker.checkObjectValue(queryType, "queryType");
 
         CriteriaBuilder builder = entityManager.getCriteriaBuilder();
         CriteriaQuery<VirtualCorpus> query =
                 builder.createQuery(VirtualCorpus.class);
 
         Root<VirtualCorpus> virtualCorpus = query.from(VirtualCorpus.class);
-        Predicate predicate = builder.or(
-                builder.equal(virtualCorpus.get(VirtualCorpus_.createdBy),
-                        userId),
-                builder.equal(virtualCorpus.get(VirtualCorpus_.type),
-                        ResourceType.SYSTEM));
+        Predicate predicate = builder.and(
+                builder.equal(virtualCorpus.get(VirtualCorpus_.queryType),
+                        queryType),
+                builder.or(builder.equal(
+                        virtualCorpus.get(VirtualCorpus_.createdBy), userId),
+                        builder.equal(virtualCorpus.get(VirtualCorpus_.type),
+                                ResourceType.SYSTEM)));
 
         query.select(virtualCorpus);
         query.where(predicate);
@@ -333,7 +343,7 @@
 
         @SuppressWarnings("unchecked")
         List<VirtualCorpus> vcList = q.getResultList();
-        List<VirtualCorpus> groupVC = retrieveGroupVCByUser(userId);
+        List<VirtualCorpus> groupVC = retrieveGroupVCByUser(userId, queryType);
         Set<VirtualCorpus> vcSet = new HashSet<VirtualCorpus>();
         vcSet.addAll(vcList);
         vcSet.addAll(groupVC);
diff --git a/full/src/main/java/de/ids_mannheim/korap/rewrite/QueryReferenceRewrite.java b/full/src/main/java/de/ids_mannheim/korap/rewrite/QueryReferenceRewrite.java
index c4193ed..4b7e755 100644
--- a/full/src/main/java/de/ids_mannheim/korap/rewrite/QueryReferenceRewrite.java
+++ b/full/src/main/java/de/ids_mannheim/korap/rewrite/QueryReferenceRewrite.java
@@ -7,11 +7,13 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 import de.ids_mannheim.korap.config.KustvaktConfiguration;
+import de.ids_mannheim.korap.constant.QueryType;
+import de.ids_mannheim.korap.entity.VirtualCorpus;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.rewrite.KoralNode.RewriteIdentifier;
-import de.ids_mannheim.korap.service.QueryReferenceService;
+import de.ids_mannheim.korap.service.VirtualCorpusService;
 import de.ids_mannheim.korap.user.User;
-import de.ids_mannheim.korap.util.StatusCodes;
 import de.ids_mannheim.korap.utils.JsonUtils;
 
 /**
@@ -27,10 +29,7 @@
 public class QueryReferenceRewrite implements RewriteTask.RewriteQuery {
 
     @Autowired
-    private KustvaktConfiguration config;
-
-    @Autowired
-    private QueryReferenceService qService;
+    private VirtualCorpusService service;
 
     @Override
     public KoralNode rewriteQuery (KoralNode node,
@@ -49,28 +48,34 @@
             && koralNode.get("@type").equals("koral:queryRef")) {
             if (!koralNode.has("ref")) {
                 throw new KustvaktException(
-                    StatusCodes.MISSING_QUERY_REFERENCE,
+                    de.ids_mannheim.korap.util.StatusCodes.MISSING_QUERY_REFERENCE,
                     "ref is not found"
                     );
             }
             else {
                 String queryRefName = koralNode.get("ref");
                 String queryRefOwner = "system";
-                boolean ownerExist = false;
                 if (queryRefName.contains("/")) {
                     String[] names = queryRefName.split("/");
                     if (names.length == 2) {
                         queryRefOwner = names[0];
                         queryRefName = names[1];
-                        ownerExist = true;
                     }
                 }
 
-                JsonNode qref = qService.searchQueryByName(
-                    username,
-                    queryRefName,
-                    queryRefOwner);
+                VirtualCorpus qr = service.searchVCByName(username,
+                        queryRefName, queryRefOwner, QueryType.QUERY);
 
+                if (qr == null) {
+                    throw new KustvaktException(StatusCodes.NO_RESOURCE_FOUND,
+                            "Query reference " + queryRefName
+                                    + " is not found.",
+                            String.valueOf(queryRefName));
+                }
+
+                // TODO:
+                //   checkVCAcess(q, username);
+                JsonNode qref = JsonUtils.readTree(qr.getKoralQuery());;
                 rewriteQuery(qref,koralNode);
             }
         }
@@ -87,17 +92,6 @@
     }
 
 
-    private void removeOwner (String koralQuery,
-                              String queryRefOwner,
-                              KoralNode koralNode) throws KustvaktException {
-        JsonNode jsonNode = koralNode.rawNode();
-        String ref = jsonNode.at("/ref").asText();
-        koralNode.remove("ref", new RewriteIdentifier("ref", ref));
-
-        ref = ref.substring(queryRefOwner.length() + 1, ref.length());
-        koralNode.set("ref", ref, new RewriteIdentifier("ref", ref));
-    }
-
     private void rewriteQuery (JsonNode qref, KoralNode koralNode)
         throws KustvaktException {
         JsonNode jsonNode = koralNode.rawNode();
diff --git a/full/src/main/java/de/ids_mannheim/korap/rewrite/VirtualCorpusRewrite.java b/full/src/main/java/de/ids_mannheim/korap/rewrite/VirtualCorpusRewrite.java
index 3f25da1..297680e 100644
--- a/full/src/main/java/de/ids_mannheim/korap/rewrite/VirtualCorpusRewrite.java
+++ b/full/src/main/java/de/ids_mannheim/korap/rewrite/VirtualCorpusRewrite.java
@@ -7,6 +7,7 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 import de.ids_mannheim.korap.config.KustvaktConfiguration;
+import de.ids_mannheim.korap.constant.QueryType;
 import de.ids_mannheim.korap.entity.VirtualCorpus;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.rewrite.KoralNode.RewriteIdentifier;
@@ -71,10 +72,11 @@
                 }
                 
                 VirtualCorpus vc =
-                        vcService.searchVCByName(username, vcName, vcOwner);
+                        vcService.searchVCByName(username, vcName, vcOwner, QueryType.VIRTUAL_CORPUS);
                 if (!vc.isCached()) {
                     rewriteVC(vc, koralNode);
                 }
+                // required for named-vc since they are stored by filenames in the cache
                 else if (ownerExist) {
                     removeOwner(vc.getKoralQuery(), vcOwner, koralNode);
                 }
diff --git a/full/src/main/java/de/ids_mannheim/korap/service/VirtualCorpusService.java b/full/src/main/java/de/ids_mannheim/korap/service/VirtualCorpusService.java
index 9d5ea85..0dc9f84 100644
--- a/full/src/main/java/de/ids_mannheim/korap/service/VirtualCorpusService.java
+++ b/full/src/main/java/de/ids_mannheim/korap/service/VirtualCorpusService.java
@@ -91,15 +91,15 @@
         }
     }
 
-    public List<VirtualCorpusDto> listOwnerVC (String username, String vcCreator)
-            throws KustvaktException {
+    public List<VirtualCorpusDto> listOwnerVC (String username,
+            String vcCreator, QueryType queryType) throws KustvaktException {
         verifyUsername(username, vcCreator);
-        List<VirtualCorpus> vcList = vcDao.retrieveOwnerVC(username);
-        return createVCDtos(vcList);
+        List<VirtualCorpus> vcList = vcDao.retrieveOwnerVC(username, queryType);
+        return createVCDtos(vcList, queryType);
     }
 
     public List<VirtualCorpusDto> listAvailableVCForUser (
-            String authenticatedUsername, String username)
+            String authenticatedUsername, String username, QueryType queryType)
             throws KustvaktException {
 
         boolean isAdmin = adminDao.isAdmin(authenticatedUsername);
@@ -115,20 +115,22 @@
         else {
             username = authenticatedUsername;
         }
-        List<VirtualCorpus> vcList = vcDao.retrieveVCByUser(username);
-        return createVCDtos(vcList);
+        List<VirtualCorpus> vcList =
+                vcDao.retrieveVCByUser(username, queryType);
+        return createVCDtos(vcList, queryType);
     }
 
     public List<VirtualCorpusDto> listVCByType (String username,
-            String createdBy, ResourceType type) throws KustvaktException {
+            String createdBy, ResourceType type, QueryType queryType)
+            throws KustvaktException {
 
         boolean isAdmin = adminDao.isAdmin(username);
 
         if (isAdmin) {
             List<VirtualCorpus> virtualCorpora =
-                    vcDao.retrieveVCByType(type, createdBy);
+                    vcDao.retrieveVCByType(type, createdBy, queryType);
             Collections.sort(virtualCorpora);
-            return createVCDtos(virtualCorpora);
+            return createVCDtos(virtualCorpora, queryType);
         }
         else {
             throw new KustvaktException(StatusCodes.AUTHORIZATION_FAILED,
@@ -137,14 +139,18 @@
     }
 
     private ArrayList<VirtualCorpusDto> createVCDtos (
-            List<VirtualCorpus> vcList) throws KustvaktException {
+            List<VirtualCorpus> vcList, QueryType queryType)
+            throws KustvaktException {
         ArrayList<VirtualCorpusDto> dtos = new ArrayList<>(vcList.size());
         VirtualCorpus vc;
         Iterator<VirtualCorpus> i = vcList.iterator();
         while (i.hasNext()) {
             vc = i.next();
             String json = vc.getKoralQuery();
-            String statistics = krill.getStatistics(json);
+            String statistics = null;
+            if (queryType.equals(QueryType.VIRTUAL_CORPUS)) {
+                statistics = krill.getStatistics(json);
+            }
             VirtualCorpusDto vcDto =
                     converter.createVirtualCorpusDto(vc, statistics);
             dtos.add(vcDto);
@@ -204,7 +210,7 @@
         if (vc == null) {
             String vcCode = createdBy + "/" + vcName;
             throw new KustvaktException(StatusCodes.NO_RESOURCE_FOUND,
-                    "Virtual corpus "+ vcCode+" is not found.",
+                    "Virtual corpus " + vcCode + " is not found.",
                     String.valueOf(vcCode));
         }
         else if (vc.getCreatedBy().equals(username)
@@ -217,7 +223,7 @@
                 userGroupService.deleteAutoHiddenGroup(
                         access.getUserGroup().getId(), "system");
             }
-            if (KrillCollection.cache.get(vc.getName())!=null){
+            if (KrillCollection.cache.get(vc.getName()) != null) {
                 KrillCollection.cache.remove(vc.getName());
             }
             vcDao.deleteVirtualCorpus(vc);
@@ -228,17 +234,17 @@
         }
     }
 
-//    @Deprecated
-//    public void editVC (VirtualCorpusJson vcJson, String username)
-//            throws KustvaktException {
-//        ParameterChecker.checkIntegerValue(vcJson.getId(), "id");
-//        VirtualCorpus vc = vcDao.retrieveVCById(vcJson.getId());
-//        editVC(vc, vcJson, vcJson.getName(), username);
-//    }
+    // @Deprecated
+    // public void editVC (VirtualCorpusJson vcJson, String username)
+    // throws KustvaktException {
+    // ParameterChecker.checkIntegerValue(vcJson.getId(), "id");
+    // VirtualCorpus vc = vcDao.retrieveVCById(vcJson.getId());
+    // editVC(vc, vcJson, vcJson.getName(), username);
+    // }
 
     public Status handlePutRequest (String username, String vcCreator,
             String vcName, QueryJson vcJson) throws KustvaktException {
-        
+
         verifyUsername(username, vcCreator);
         VirtualCorpus vc = vcDao.retrieveVCByName(vcName, vcCreator);
         ParameterChecker.checkObjectValue(vcJson, "request entity");
@@ -280,8 +286,9 @@
                     deleteVCAccess(hiddenAccess.getId(), "system");
                     int groupId = hiddenAccess.getUserGroup().getId();
                     userGroupService.deleteAutoHiddenGroup(groupId, "system");
-                    // EM: should the users within the hidden group receive 
-                    // notifications? 
+                    // EM: should the users within the hidden group
+                    // receive
+                    // notifications?
                 }
                 // else remains the same
             }
@@ -318,24 +325,27 @@
     public void storeVC (QueryJson vc, String vcName, String createdBy)
             throws KustvaktException {
         String koralQuery = null;
-        if (vc.getQueryType().equals(QueryType.VIRTUAL_CORPUS)){
-            ParameterChecker.checkStringValue(vc.getCorpusQuery(), "corpusQuery");
+        if (vc.getQueryType().equals(QueryType.VIRTUAL_CORPUS)) {
+            ParameterChecker.checkStringValue(vc.getCorpusQuery(),
+                    "corpusQuery");
             koralQuery = serializeCorpusQuery(vc.getCorpusQuery());
         }
-        else if (vc.getQueryType().equals(QueryType.QUERY)){
+        else if (vc.getQueryType().equals(QueryType.QUERY)) {
             ParameterChecker.checkStringValue(vc.getQuery(), "query");
-            ParameterChecker.checkStringValue(vc.getQueryLanguage(), "queryLanguage");
+            ParameterChecker.checkStringValue(vc.getQueryLanguage(),
+                    "queryLanguage");
             koralQuery = serializeQuery(vc.getQuery(), vc.getQueryLanguage());
         }
-        
-        storeVC(vcName, vc.getType(), vc.getQueryType(), koralQuery, vc.getDefinition(),
-                vc.getDescription(), vc.getStatus(), vc.isCached(), createdBy);
+
+        storeVC(vcName, vc.getType(), vc.getQueryType(), koralQuery,
+                vc.getDefinition(), vc.getDescription(), vc.getStatus(),
+                vc.isCached(), createdBy);
     }
 
-    public void storeVC (String vcName, ResourceType type,
-            QueryType queryType, String koralQuery, String definition,
-            String description, String status, boolean isCached,
-            String username) throws KustvaktException {
+    public void storeVC (String vcName, ResourceType type, QueryType queryType,
+            String koralQuery, String definition, String description,
+            String status, boolean isCached, String username)
+            throws KustvaktException {
         ParameterChecker.checkNameValue(vcName, "vcName");
         ParameterChecker.checkObjectValue(type, "type");
 
@@ -398,12 +408,12 @@
         }
         return koralQuery;
     }
-    
+
     private String serializeQuery (String query, String queryLanguage)
             throws KustvaktException {
         QuerySerializer serializer = new QuerySerializer();
         String koralQuery;
-            koralQuery = serializer.setQuery(query, queryLanguage).toJSON();
+        koralQuery = serializer.setQuery(query, queryLanguage).toJSON();
         if (DEBUG) {
             jlog.debug(koralQuery);
         }
@@ -452,15 +462,14 @@
         return (numberOfDoc > 0) ? true : false;
     }
 
-
     public void shareVC (String username, String createdBy, String vcName,
             String groupName) throws KustvaktException {
 
         VirtualCorpus vc = vcDao.retrieveVCByName(vcName, createdBy);
-        if (vc == null){
+        if (vc == null) {
             String vcCode = createdBy + "/" + vcName;
             throw new KustvaktException(StatusCodes.NO_RESOURCE_FOUND,
-                    "Virtual corpus "+ vcCode+" is not found.",
+                    "Virtual corpus " + vcCode + " is not found.",
                     String.valueOf(vcCode));
         }
         if (!username.equals(vc.getCreatedBy())
@@ -469,7 +478,8 @@
                     "Unauthorized operation for user: " + username, username);
         }
 
-        UserGroup userGroup = userGroupService.retrieveUserGroupByName(groupName);
+        UserGroup userGroup =
+                userGroupService.retrieveUserGroupByName(groupName);
 
         if (!isVCAccessAdmin(userGroup, username)
                 && !adminDao.isAdmin(username)) {
@@ -494,9 +504,9 @@
                 throw new KustvaktException(StatusCodes.DB_INSERT_FAILED,
                         cause.getMessage());
             }
-            
-            vcDao.editVirtualCorpus(vc, null, ResourceType.PROJECT, null,
-                    null, null, null, null, vc.isCached());
+
+            vcDao.editVirtualCorpus(vc, null, ResourceType.PROJECT, null, null,
+                    null, null, null, vc.isCached());
         }
     }
 
@@ -528,7 +538,6 @@
     // }
     // }
 
-    
     public List<VirtualCorpusAccessDto> listVCAccessByUsername (String username)
             throws KustvaktException {
         List<VirtualCorpusAccess> accessList = new ArrayList<>();
@@ -536,17 +545,18 @@
             accessList = accessDao.retrieveAllAccess();
         }
         else {
-            List<UserGroup> groups = userGroupService.retrieveUserGroup(username);
-            for (UserGroup g: groups){
-                if (isVCAccessAdmin(g, username)){
-                    accessList.addAll(accessDao.retrieveActiveAccessByGroup(g.getId()));
-                }   
+            List<UserGroup> groups =
+                    userGroupService.retrieveUserGroup(username);
+            for (UserGroup g : groups) {
+                if (isVCAccessAdmin(g, username)) {
+                    accessList.addAll(
+                            accessDao.retrieveActiveAccessByGroup(g.getId()));
+                }
             }
         }
         return accessConverter.createVCADto(accessList);
     }
-    
-    
+
     public List<VirtualCorpusAccessDto> listVCAccessByVC (String username,
             String vcCreator, String vcName) throws KustvaktException {
 
@@ -587,17 +597,19 @@
 
         return accessConverter.createVCADto(accessList);
     }
-    
+
     public List<VirtualCorpusAccessDto> listVCAccessByGroup (String username,
             String groupName) throws KustvaktException {
-        UserGroup userGroup = userGroupService.retrieveUserGroupByName(groupName);
+        UserGroup userGroup =
+                userGroupService.retrieveUserGroupByName(groupName);
 
         List<VirtualCorpusAccess> accessList;
         if (adminDao.isAdmin(username)) {
             accessList = accessDao.retrieveAllAccessByGroup(userGroup.getId());
         }
         else if (isVCAccessAdmin(userGroup, username)) {
-            accessList = accessDao.retrieveActiveAccessByGroup(userGroup.getId());
+            accessList =
+                    accessDao.retrieveActiveAccessByGroup(userGroup.getId());
         }
         else {
             throw new KustvaktException(StatusCodes.AUTHORIZATION_FAILED,
@@ -623,12 +635,12 @@
     }
 
     public VirtualCorpus searchVCByName (String username, String vcName,
-            String createdBy) throws KustvaktException {
+            String createdBy, QueryType queryType) throws KustvaktException {
         VirtualCorpus vc = vcDao.retrieveVCByName(vcName, createdBy);
         if (vc == null) {
             String vcCode = createdBy + "/" + vcName;
             throw new KustvaktException(StatusCodes.NO_RESOURCE_FOUND,
-                    "Virtual corpus "+ vcCode+" is not found.",
+                    queryType.displayName()+ " " + vcCode + " is not found.",
                     String.valueOf(vcCode));
         }
         checkVCAccess(vc, username);
@@ -636,11 +648,11 @@
     }
 
     public VirtualCorpusDto retrieveVCByName (String username, String vcName,
-            String createdBy) throws KustvaktException {
-        VirtualCorpus vc = searchVCByName(username, vcName, createdBy);
+            String createdBy, QueryType queryType) throws KustvaktException {
+        VirtualCorpus vc = searchVCByName(username, vcName, createdBy, queryType);
         String json = vc.getKoralQuery();
         String statistics = null;
-        if (vc.getQueryType().equals(QueryType.VIRTUAL_CORPUS)){
+        if (vc.getQueryType().equals(QueryType.VIRTUAL_CORPUS)) {
             statistics = krill.getStatistics(json);
         }
         return converter.createVirtualCorpusDto(vc, statistics);
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/QueryReferenceController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/QueryReferenceController.java
index ff8f35b..955de0e 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/QueryReferenceController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/QueryReferenceController.java
@@ -1,11 +1,14 @@
 package de.ids_mannheim.korap.web.controller;
 
+import java.util.List;
+
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
 import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
@@ -119,7 +122,7 @@
         try {
             scopeService.verifyScope(context, OAuth2Scope.VC_INFO);
             return service.retrieveVCByName(context.getUsername(), qName,
-                    createdBy);
+                    createdBy, QueryType.QUERY);
         }
         catch (KustvaktException e) {
             throw kustvaktResponseHandler.throwit(e);
@@ -159,6 +162,22 @@
 
     
     // TODO: List all queries available to the logged in user
+    @GET
+    @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
+    public List<VirtualCorpusDto> listAvailableQuery (
+            @Context SecurityContext securityContext,
+            @QueryParam("username") String username) {
+        TokenContext context =
+                (TokenContext) securityContext.getUserPrincipal();
+        try {
+            scopeService.verifyScope(context, OAuth2Scope.VC_INFO);
+            return service.listAvailableVCForUser(context.getUsername(),
+                    username, QueryType.QUERY);
+        }
+        catch (KustvaktException e) {
+            throw kustvaktResponseHandler.throwit(e);
+        }
+    }
     // TODO: List all queries of a sepcific user
     // TODO: Some admin routes missing.
     // TODO: Some sharing routes missing
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusController.java
index 645329e..14b4ed2 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusController.java
@@ -23,6 +23,7 @@
 import com.sun.jersey.spi.container.ResourceFilters;
 
 import de.ids_mannheim.korap.constant.OAuth2Scope;
+import de.ids_mannheim.korap.constant.QueryType;
 import de.ids_mannheim.korap.constant.ResourceType;
 import de.ids_mannheim.korap.dto.VirtualCorpusAccessDto;
 import de.ids_mannheim.korap.dto.VirtualCorpusDto;
@@ -133,7 +134,7 @@
         try {
             scopeService.verifyScope(context, OAuth2Scope.VC_INFO);
             return service.retrieveVCByName(context.getUsername(), vcName,
-                    createdBy);
+                    createdBy, QueryType.VIRTUAL_CORPUS);
         }
         catch (KustvaktException e) {
             throw kustvaktResponseHandler.throwit(e);
@@ -165,7 +166,7 @@
         try {
             scopeService.verifyScope(context, OAuth2Scope.VC_INFO);
             return service.listAvailableVCForUser(context.getUsername(),
-                    username);
+                    username, QueryType.VIRTUAL_CORPUS);
         }
         catch (KustvaktException e) {
             throw kustvaktResponseHandler.throwit(e);
@@ -188,13 +189,14 @@
     @Path("~{createdBy}")
     @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
     public List<VirtualCorpusDto> listUserVC (
-            @PathParam("createdBy") String createdBy, 
+            @PathParam("createdBy") String createdBy,
             @Context SecurityContext securityContext) {
         TokenContext context =
                 (TokenContext) securityContext.getUserPrincipal();
         try {
             scopeService.verifyScope(context, OAuth2Scope.VC_INFO);
-            return service.listOwnerVC(context.getUsername(), createdBy);
+            return service.listOwnerVC(context.getUsername(), createdBy,
+                    QueryType.VIRTUAL_CORPUS);
         }
         catch (KustvaktException e) {
             throw kustvaktResponseHandler.throwit(e);
@@ -227,7 +229,8 @@
                 (TokenContext) securityContext.getUserPrincipal();
         try {
             scopeService.verifyScope(context, OAuth2Scope.ADMIN);
-            return service.listVCByType(context.getUsername(), createdBy, type);
+            return service.listVCByType(context.getUsername(), createdBy, type,
+                    QueryType.VIRTUAL_CORPUS);
         }
         catch (KustvaktException e) {
             throw kustvaktResponseHandler.throwit(e);
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/input/QueryJson.java b/full/src/main/java/de/ids_mannheim/korap/web/input/QueryJson.java
index 0e312d7..8d061a9 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/input/QueryJson.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/input/QueryJson.java
@@ -23,7 +23,6 @@
     
     // required
     private ResourceType type;
-    private QueryType queryType;
     // required for queryType="VIRTUAL_CORPUS"
     private String corpusQuery;
     // required for queryType="QUERY"
@@ -35,4 +34,5 @@
     private String description;
     private String status;
     private String queryVersion;
+    private QueryType queryType;
 }
\ No newline at end of file