Added collection query rewrite according to availability.

Change-Id: I79d7fdf2564bb832bc59f6d7d3a311d0e5409d14
diff --git a/src/main/java/de/ids_mannheim/korap/config/Attributes.java b/src/main/java/de/ids_mannheim/korap/config/Attributes.java
index 16ddfdd..1789e61 100644
--- a/src/main/java/de/ids_mannheim/korap/config/Attributes.java
+++ b/src/main/java/de/ids_mannheim/korap/config/Attributes.java
@@ -93,6 +93,8 @@
     public static final String DOC_SIGLE = "docSigle";
     public static final String TEXT_SIGLE = "textSigle";
 
+    public static final String AVAILABILITY = "availability";
+    
     public static final String REF_CORPUS = "refCorpus";
     public static final String QUERY = "query";
     public static final String CACHE = "cache";
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionRewrite.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionRewrite.java
new file mode 100644
index 0000000..d2894b3
--- /dev/null
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionRewrite.java
@@ -0,0 +1,63 @@
+package de.ids_mannheim.korap.resource.rewrite;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+import de.ids_mannheim.korap.config.Attributes;
+import de.ids_mannheim.korap.config.KustvaktConfiguration;
+import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.resource.rewrite.KoralNode.RewriteIdentifier;
+import de.ids_mannheim.korap.user.User;
+import de.ids_mannheim.korap.utils.JsonUtils;
+import de.ids_mannheim.korap.utils.KoralCollectionQueryBuilder;
+
+/**
+ * @author margaretha
+ * @date 22 May 2017
+ */
+public class CollectionRewrite implements RewriteTask.RewriteQuery {
+
+	private static Logger jlog = LoggerFactory.getLogger(CollectionRewrite.class);
+
+	public CollectionRewrite() {
+		super();
+	}
+
+	@Override
+	public JsonNode rewriteQuery(KoralNode node, KustvaktConfiguration config, User user) throws KustvaktException {
+		JsonNode subnode = node.rawNode();
+		KoralCollectionQueryBuilder builder = new KoralCollectionQueryBuilder();
+		if (subnode.at("/collection").isMissingNode()) {
+			if (subnode.has("collection")) {
+				builder.setBaseQuery(JsonUtils.toJSON(subnode));
+			}
+
+			switch (user.getCorpusAccess()) {
+			case PUBLIC:
+				builder = new KoralCollectionQueryBuilder();
+				builder.with("availability = /CC-BY.*/ | availablity = /ACA.*/");
+				break;
+
+			case ALL:
+				builder = new KoralCollectionQueryBuilder();
+				builder.with("availability = /QAO.*/ | availablity = /ACA.*/ |  availablity = /CC-BY.*/");
+				break;
+
+			default: // FREE
+				builder = new KoralCollectionQueryBuilder();
+				builder.with("availability	 = /CC-BY.*/");
+				break;
+			}
+
+			JsonNode rewritten = JsonUtils.readTree(builder.toJSON()).at("/collection");
+			RewriteIdentifier identifier = new KoralNode.RewriteIdentifier(Attributes.AVAILABILITY,
+					rewritten.at("/value"));
+			node.set("collection", rewritten, identifier);
+			jlog.debug(node.at("/collection").toString());
+		}
+
+		return node.rawNode();
+	}
+}
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandler.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandler.java
index 94875f4..c360850 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandler.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandler.java
@@ -49,7 +49,8 @@
 
     public void defaultRewriteConstraints () {
         this.add(FoundryInject.class);
-        this.add(PublicCollection.class);
+        //this.add(PublicCollection.class);
+        this.add(CollectionRewrite.class);
         this.add(IdWriter.class);
         this.add(DocMatchRewrite.class);
         this.add(CollectionCleanRewrite.class);
diff --git a/src/main/java/de/ids_mannheim/korap/security/ac/ResourceFinder.java b/src/main/java/de/ids_mannheim/korap/security/ac/ResourceFinder.java
index 47a215d..6efdb4f 100644
--- a/src/main/java/de/ids_mannheim/korap/security/ac/ResourceFinder.java
+++ b/src/main/java/de/ids_mannheim/korap/security/ac/ResourceFinder.java
@@ -128,7 +128,7 @@
         
         if (sets.isEmpty()){
             throw new KustvaktException(StatusCodes.NO_VALUE_FOUND, 
-                    "Cannot found public resources with ids: "+id_set.toString());
+            		"Cannot found public "+clazz.getSimpleName()+" with ids: "+id_set.toString());
         }
         return sets;
     }
diff --git a/src/main/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManager.java b/src/main/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManager.java
index 16745bb..43440f3 100644
--- a/src/main/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManager.java
+++ b/src/main/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManager.java
@@ -17,6 +17,7 @@
 import de.ids_mannheim.korap.interfaces.db.UserDataDbIface;
 import de.ids_mannheim.korap.interfaces.defaults.ApacheValidator;
 import de.ids_mannheim.korap.user.*;
+import de.ids_mannheim.korap.user.User.CorpusAccess;
 import de.ids_mannheim.korap.utils.StringUtils;
 import de.ids_mannheim.korap.utils.TimeUtils;
 import de.ids_mannheim.korap.security.auth.LdapAuth3;
@@ -719,6 +720,7 @@
             entHandler.createAccount(user);
             if (user.isAdmin() && user instanceof KorAPUser){
             	adminHandler.addAccount(user);
+            	user.setCorpusAccess(CorpusAccess.ALL);
             }
             details.setUserId(user.getId());
             settings.setUserId(user.getId());
diff --git a/src/main/java/de/ids_mannheim/korap/user/User.java b/src/main/java/de/ids_mannheim/korap/user/User.java
index 53c3d1e..68e59ac 100644
--- a/src/main/java/de/ids_mannheim/korap/user/User.java
+++ b/src/main/java/de/ids_mannheim/korap/user/User.java
@@ -45,7 +45,16 @@
     private List<Userdata> userdata;
 
     private boolean isAdmin;
-
+    
+    private CorpusAccess corpusAccess = CorpusAccess.FREE;
+    
+    public enum CorpusAccess	 {
+        FREE, // without login   
+        PUBLIC, // extern
+        ALL; // intern
+    }
+   
+    
     protected User () {
         this.fields = new ParamFields();
         this.accountCreation = TimeUtils.getNow().getMillis();
@@ -53,6 +62,7 @@
         this.username = "";
         this.id = -1;
         this.userdata = new ArrayList<>();
+        this.corpusAccess = CorpusAccess.FREE;
     }
 
 
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/PolicyLoader.java b/src/main/java/de/ids_mannheim/korap/web/service/PolicyLoader.java
index aba7506..8db99be 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/PolicyLoader.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/PolicyLoader.java
@@ -14,11 +14,13 @@
 import de.ids_mannheim.korap.resources.Foundry;
 import de.ids_mannheim.korap.resources.KustvaktResource;
 import de.ids_mannheim.korap.resources.Layer;
+import de.ids_mannheim.korap.resources.VirtualCollection;
 import de.ids_mannheim.korap.resources.Permissions.Permission;
 import de.ids_mannheim.korap.security.ac.PolicyBuilder;
 import de.ids_mannheim.korap.security.ac.ResourceFinder;
 import de.ids_mannheim.korap.security.ac.SecurityManager;
 import de.ids_mannheim.korap.user.User;
+import de.ids_mannheim.korap.utils.KoralCollectionQueryBuilder;
 
 /**
  * @author hanl
@@ -48,7 +50,9 @@
 		String[] permissions;
 		try {
 			while ((policy = br.readLine()) != null) {
-				if (policy.startsWith("#") || policy.isEmpty()) continue;
+				if (policy.startsWith("#") || policy.isEmpty()){
+					continue;
+				}
 				
 				policyData = policy.split("\t");
 				type = policyData[0];
@@ -57,6 +61,10 @@
 				description = policyData[3];
 				condition = policyData[4];
 				permissions = policyData[5].split(",");
+				
+				String collectionQuery = null;
+				if (policyData.length > 6)
+					collectionQuery = policyData[6];
 
 				Permission[] permissionArr = new Permission[permissions.length];
 				for (int i = 0; i < permissions.length; i++) {
@@ -64,7 +72,7 @@
 						permissionArr[i] = Permission.READ;
 					}
 				}
-				KustvaktResource resource = createResource(type, id, name, description);
+				KustvaktResource resource = createResource(type, id, name, description, collectionQuery);
 				if (resource != null) {
 					builder.addCondition(condition);
 					builder.setResources(resource);
@@ -78,8 +86,8 @@
 		}
 	}
 
-	private KustvaktResource createResource(String type, String id, String name, String description) {
-
+	private KustvaktResource createResource(String type, String id, String name, String description, String docQuery) {
+		
 		KustvaktResource resource = null;
 		if (type.equals("corpus")) {
 			resource = new Corpus(id);
@@ -87,11 +95,15 @@
 			resource = new Foundry(id);
 		} else if (type.equals("layer")) {
 			resource = new Layer(id);
-		}
-//			else if (type.equals("virtualcollection")) {
-//			resource = new VirtualCollection(id);
-//		}
-		else{
+		} else if (type.equals("virtualcollection")) {
+			KoralCollectionQueryBuilder builder;
+			resource = new VirtualCollection(id);
+			if (docQuery != null && !docQuery.isEmpty()) {
+				builder = new KoralCollectionQueryBuilder();
+				builder.with(docQuery);
+				resource.setFields(builder.toJSON());
+			}
+		} else {
 			return resource;
 		}
 
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java b/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java
index 0cbbe13..03e9754 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java
@@ -343,7 +343,9 @@
         meta.addEntry("cutOff", cutoff);
 
         ss.setMeta(meta.raw());
-        return Response.ok(ss.toJSON()).build();
+        String result = ss.toJSON();
+        jlog.debug("Query result: "+result);
+        return Response.ok(result).build();
     }
 
 
@@ -482,6 +484,7 @@
         User user;
         try {
             user = controller.getUser(context.getUsername());
+            // EM: set user.corpusAccess, default is CorpusAccess.FREE
         }
         catch (KustvaktException e) {
             jlog.error("Failed retrieving user in the search service: {}",
@@ -508,6 +511,7 @@
         }
 
         String result = doSearch(eng, query, pageLength, meta);
+        jlog.debug("Query result: "+result);
         return Response.ok(result).build();
     }
 
@@ -1222,6 +1226,7 @@
             throw KustvaktResponseHandler.throwit(StatusCodes.ILLEGAL_ARGUMENT,
                     e.getMessage(), "");
         }
+        jlog.debug("MatchInfo results: "+results);
         return Response.ok(results).build();
     }