Determine corpus access dynamically using koralQuery

for resources without predefined required_access.

Change-Id: I10bcd952afd693f49c43f68e6e38be50b61df9f3
diff --git a/src/main/java/de/ids_mannheim/korap/annotation/ResourceParser.java b/src/main/java/de/ids_mannheim/korap/annotation/ResourceParser.java
index cade8f6..e5cc73c 100644
--- a/src/main/java/de/ids_mannheim/korap/annotation/ResourceParser.java
+++ b/src/main/java/de/ids_mannheim/korap/annotation/ResourceParser.java
@@ -20,6 +20,8 @@
 import de.ids_mannheim.korap.entity.AnnotationLayer;
 import de.ids_mannheim.korap.entity.Resource;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.service.QueryService;
+import de.ids_mannheim.korap.user.User.CorpusAccess;
 
 /**
  * Parser for extracting data from resources.json listing virtual corpora 
@@ -36,6 +38,8 @@
     private ResourceDao resourceDao;
     @Autowired
     private AnnotationDao annotationDao;
+    @Autowired
+    private QueryService queryService;
 
     public static String RESOURCE_FILE = "resources.json";
     public static ObjectMapper mapper = new ObjectMapper();
@@ -54,36 +58,38 @@
         JsonNode node = mapper.readTree(is);
         for (JsonNode resource : node) {
             String resourceId = resource.at("/id").asText();
+            String pid = resource.at("/pid").asText();
+            String deTitle = resource.at("/de_title").asText();
+            String enTitle = resource.at("/en_title").asText();
+            String enDescription = resource.at("/en_description").asText(); 
+            String institution = resource.at("/institution").asText();
             String requiredAccess = resource.at("/required_access").asText();
+            String corpusQuery = resource.at("/corpus_query").asText();
+            
             if (requiredAccess.isEmpty()){
-            	requiredAccess = "free";
+				if (!corpusQuery.isEmpty()) {
+					String koralQuery = queryService
+							.serializeCorpusQuery(corpusQuery);
+					// assume all vc are not cached and use the given koralQuery
+					// for cached-vc, the koralQuery should contain referTo
+					CorpusAccess access = queryService.determineRequiredAccess(
+							false, resourceId, koralQuery);
+					requiredAccess = access.name();
+				}
             }
-            //            log.debug(resourceId);
             Set<AnnotationLayer> layers = parseLayers(resource.at("/layers"));
             try {
                 Resource r = resourceDao.retrieveResource(resourceId);
-                if (r == null) {
-                    resourceDao.createResource(resource.at("/id").asText(),
-                    		resource.at("/pid").asText(),
-                            resource.at("/de_title").asText(),
-                            resource.at("/en_title").asText(),
-                            resource.at("/en_description").asText(), 
-                            layers,
-                            resource.at("/institution").asText(),
-                            resource.at("/corpus_query").asText(),
-                            requiredAccess);
-                }
-                else {
-                	resourceDao.updateResource(r,
-                			resource.at("/pid").asText(),
-                            resource.at("/de_title").asText(),
-                            resource.at("/en_title").asText(),
-                            resource.at("/en_description").asText(), 
-                            layers,
-                            resource.at("/institution").asText(),
-                            resource.at("/corpus_query").asText(),
-                            requiredAccess);
-                }
+				if (r == null) {
+					resourceDao.createResource(resourceId, pid, deTitle,
+							enTitle, enDescription, layers, institution,
+							corpusQuery, requiredAccess);
+				}
+				else {
+					resourceDao.updateResource(r, pid, deTitle, enTitle,
+							enDescription, layers, institution, corpusQuery,
+							requiredAccess);
+				}
             }
             catch (Exception e) {
                 log.warn("Failed creating resource: " + e.getMessage());
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 7cfa9cd..cfa16fd 100644
--- a/src/main/java/de/ids_mannheim/korap/service/QueryService.java
+++ b/src/main/java/de/ids_mannheim/korap/service/QueryService.java
@@ -407,7 +407,7 @@
         }
     }
 
-    private String serializeCorpusQuery (String corpusQuery)
+    public String serializeCorpusQuery (String corpusQuery)
             throws KustvaktException {
         QuerySerializer serializer = new QuerySerializer();
         serializer.setCollection(corpusQuery);
diff --git a/src/main/resources/data/resources.json b/src/main/resources/data/resources.json
index 77a5028..cc9942f 100644
--- a/src/main/resources/data/resources.json
+++ b/src/main/resources/data/resources.json
@@ -13,7 +13,7 @@
         "tt/p"
     ],
     "corpus_query":"corpusSigle=WPD17",
-    "required_access" : "free",
+    "required_access" : "FREE",
     "institution" : "IDS Mannheim"
 },
 {
@@ -31,7 +31,7 @@
         "tt/p"
     ],
     "corpus_query":"corpusSigle=WDD17",
-    "required_access" : "free",
+    "required_access" : "FREE",
     "institution" : "IDS Mannheim"
 },
 {
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/ResourceControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/ResourceControllerTest.java
index 6322ede..23c8bd7 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/ResourceControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/ResourceControllerTest.java
@@ -22,18 +22,32 @@
 		JsonNode n = JsonUtils.readTree(entity);
 		assertEquals(3, n.size());
 
-		n = n.get(0);
+		JsonNode n0 = n.get(0);
 		assertEquals("http://hdl.handle.net/10932/00-03B6-558F-4E10-6201-1",
-				n.at("/resourceId").asText());
-		assertEquals(n.at("/titles/de").asText(),
+				n0.at("/resourceId").asText());
+		assertEquals(n0.at("/titles/de").asText(),
 				"Deutsche Wikipedia Artikel 2017");
-		assertEquals(n.at("/titles/en").asText(),
+		assertEquals(n0.at("/titles/en").asText(),
 				"German Wikipedia Articles 2017");
-		assertEquals(1, n.at("/languages").size());
-		assertEquals(6, n.at("/layers").size());
-		assertEquals("IDS Mannheim", n.at("/institution").asText());
+		assertEquals(1, n0.at("/languages").size());
+		assertEquals(6, n0.at("/layers").size());
+		assertEquals("IDS Mannheim", n0.at("/institution").asText());
 		assertEquals("https://korap.ids-mannheim.de?cq=corpusSigle=WPD17",
-				n.at("/landingPage").asText());
-		assertEquals("free", n.at("/requiredAccess").asText());
+				n0.at("/landingPage").asText());
+		assertEquals("FREE", n0.at("/requiredAccess").asText());
+		
+		JsonNode n1 = n.get(1);
+		assertEquals("http://hdl.handle.net/10932/00-03B6-558F-5EA0-6301-B",
+				n1.at("/resourceId").asText());
+		assertEquals(n1.at("/titles/de").asText(),
+				"Deutsche Wikipedia-Diskussionskorpus 2017");
+		assertEquals(n1.at("/titles/en").asText(),
+				"German Wikipedia talk corpus 2017");
+		assertEquals(1, n1.at("/languages").size());
+		assertEquals(6, n1.at("/layers").size());
+		assertEquals("IDS Mannheim", n1.at("/institution").asText());
+		assertEquals("https://korap.ids-mannheim.de?cq=corpusSigle=WDD17",
+				n1.at("/landingPage").asText());
+		assertEquals("FREE", n1.at("/requiredAccess").asText());
 	}
 }