Implemented predefined VC caching and added VC reference tests.

Change-Id: I84ad56b375f8b076ad92e493775993fc0580249f
diff --git a/full/src/main/java/de/ids_mannheim/korap/config/FullConfiguration.java b/full/src/main/java/de/ids_mannheim/korap/config/FullConfiguration.java
index fc86217..296be80 100644
--- a/full/src/main/java/de/ids_mannheim/korap/config/FullConfiguration.java
+++ b/full/src/main/java/de/ids_mannheim/korap/config/FullConfiguration.java
@@ -87,6 +87,8 @@
     private RSAPrivateKey rsaPrivateKey;
     private JWKSet publicKeySet;
     private String rsaKeyId;
+    
+    private String namedVCPath;
 
     public FullConfiguration (Properties properties) throws Exception {
         super(properties);
@@ -109,6 +111,9 @@
         setOAuth2Configuration(properties);
         setOpenIdConfiguration(properties);
         setRSAKeys(properties);
+        
+        setNamedVCPath(properties
+                .getProperty("krill.namedVC", "vc"));
     }
 
     private void setSecurityConfiguration (Properties properties) {
@@ -648,4 +653,12 @@
     public void setMessageDigestAlgorithm (String messageDigestAlgorithm) {
         this.messageDigestAlgorithm = messageDigestAlgorithm;
     }
+
+    public String getNamedVCPath () {
+        return namedVCPath;
+    }
+
+    public void setNamedVCPath (String namedVCPath) {
+        this.namedVCPath = namedVCPath;
+    }
 }
diff --git a/full/src/main/java/de/ids_mannheim/korap/config/Initializator.java b/full/src/main/java/de/ids_mannheim/korap/config/Initializator.java
index e730a0b..c204558 100644
--- a/full/src/main/java/de/ids_mannheim/korap/config/Initializator.java
+++ b/full/src/main/java/de/ids_mannheim/korap/config/Initializator.java
@@ -1,31 +1,42 @@
 package de.ids_mannheim.korap.config;
 
-import java.util.Arrays;
+import java.io.IOException;
 import java.util.HashSet;
 import java.util.Set;
 
+import javax.annotation.PostConstruct;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
 import de.ids_mannheim.korap.oauth2.constant.OAuth2Scope;
 import de.ids_mannheim.korap.oauth2.dao.AccessScopeDao;
 
 /**
- * Initializes values in the database from kustvakt configuration.
+ * Initializes values in the database from kustvakt configuration and
+ * performs named VC caching.
  * 
  * @author margaretha
  *
  */
 public class Initializator {
 
+    @Autowired
     private AccessScopeDao accessScopeDao;
+    @Autowired
+    private NamedVCLoader loader;
 
-    public Initializator (AccessScopeDao accessScopeDao) {
-        this.accessScopeDao = accessScopeDao;
+    public Initializator () {}
+
+    public void init () throws IOException {
+        setInitialAccessScope();
+        loader.loadVCToCache();
     }
 
-    public void init () {
-        setAccessScope();
+    public void initTest () {
+        setInitialAccessScope();
     }
-
-    private void setAccessScope () {
+    
+    private void setInitialAccessScope () {
         OAuth2Scope[] enums = OAuth2Scope.values();
         Set<String> scopes = new HashSet<>(enums.length);
         for (OAuth2Scope s : enums) {
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
new file mode 100644
index 0000000..043f77e
--- /dev/null
+++ b/full/src/main/java/de/ids_mannheim/korap/config/NamedVCLoader.java
@@ -0,0 +1,58 @@
+package de.ids_mannheim.korap.config;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import de.ids_mannheim.korap.KrillCollection;
+import de.ids_mannheim.korap.web.SearchKrill;
+
+@Component
+public class NamedVCLoader {
+    @Autowired
+    private FullConfiguration config;
+    @Autowired
+    private SearchKrill searchKrill;
+    
+    private static Logger jlog = LogManager.getLogger(NamedVCLoader.class);
+
+    public void loadVCToCache ()
+            throws IOException {
+
+        String dir = config.getNamedVCPath();
+        File d = new File(dir);
+        if (!d.isDirectory()) {
+            throw new IOException("Directory " + dir + " is not valid");
+        }
+
+        for (File file : d.listFiles()) {
+            if (!file.exists()) {
+                throw new IOException("File " + file + " is not found.");
+            }
+            else if (!file.getName().endsWith(".jsonld")) {
+                throw new IOException("File " + file
+                        + " is not allowed. Filename must ends with .jsonld");
+            }
+
+            long start = System.currentTimeMillis();
+            String json = FileUtils.readFileToString(file, "utf-8");
+            KrillCollection collection = new KrillCollection(json);
+            collection.setIndex(searchKrill.getIndex());
+            
+            String filename = file.getName();
+            filename = filename.substring(0,filename.length()-7);
+            if (collection != null) {
+                collection.storeInCache(filename);
+            }
+            long end = System.currentTimeMillis();
+            jlog.debug(filename + " duration: " + (end - start));
+            jlog.debug("memory cache: "
+                    + KrillCollection.cache.calculateInMemorySize());
+        }
+    }
+}
diff --git a/full/src/main/java/de/ids_mannheim/korap/server/KustvaktServer.java b/full/src/main/java/de/ids_mannheim/korap/server/KustvaktServer.java
index 35879c8..87f1e0a 100644
--- a/full/src/main/java/de/ids_mannheim/korap/server/KustvaktServer.java
+++ b/full/src/main/java/de/ids_mannheim/korap/server/KustvaktServer.java
@@ -3,7 +3,6 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.InputStream;
-import java.net.URL;
 import java.util.Properties;
 
 import de.ids_mannheim.korap.config.FullConfiguration;
@@ -17,8 +16,6 @@
  */
 public class KustvaktServer extends KustvaktBaseServer {
 
-    private static FullConfiguration fullConfig;
-    
     public static final String API_VERSION = "v0.1";
     
     public static void main (String[] args) throws Exception {
@@ -38,8 +35,8 @@
         
         properties.load(in);
         in.close();
-        fullConfig = new FullConfiguration(properties);
-        config = fullConfig;
+        
+        config = new FullConfiguration(properties);
 
 		if (kargs == null)
 			System.exit(0);
@@ -47,8 +44,6 @@
         if (kargs.getSpringConfig() == null){
             kargs.setSpringConfig("default-config.xml");
         }
-        kargs.setRootPackages(new String[] { "de.ids_mannheim.korap.web.utils",
-                "de.ids_mannheim.korap.web.service.full" });
         rootPackages = "de.ids_mannheim.korap.web.utils;"
                 + "de.ids_mannheim.korap.web.service.full";
         server.start();
diff --git a/full/src/main/resources/default-config.xml b/full/src/main/resources/default-config.xml
index 90ea568..32ebb35 100644
--- a/full/src/main/resources/default-config.xml
+++ b/full/src/main/resources/default-config.xml
@@ -168,7 +168,6 @@
 
 	<bean id="initializator" class="de.ids_mannheim.korap.config.Initializator"
 		init-method="init">
-		<constructor-arg name="accessScopeDao" ref="accessScopeDao" />
 	</bean>
 
 	<!-- Krill -->
diff --git a/full/src/main/resources/ehcache.xml b/full/src/main/resources/ehcache.xml
index d2be647..8cddd0e 100644
--- a/full/src/main/resources/ehcache.xml
+++ b/full/src/main/resources/ehcache.xml
@@ -1,5 +1,6 @@
-<ehcache xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
-       xsi:schemaLocation='http://ehcache.org/ehcache.xsd'>
+<ehcache xsi:noNamespaceSchemaLocation="http://www.ehcache.org/ehcache.xsd"
+	updateCheck="true" monitoring="autodetect" dynamicConfig="true">
+	
     <defaultCache eternal='true' overflowToDisk='false'/>
     <!--maxBytesLocalHeap="200M"-->
     <diskStore path="./cache_store"/>
@@ -50,5 +51,14 @@
            eternal='false'
            memoryStoreEvictionPolicy="LRU"
            maxEntriesLocalHeap="500"
-           overflowToDisk='false'/>          
+           overflowToDisk='false'/>  
+           
+    <cache name="named_vc" 
+		eternal="true" 
+		memoryStoreEvictionPolicy="LRU"
+		maxBytesLocalHeap="256M" 
+		maxBytesLocalDisk="1G"
+		diskExpiryThreadIntervalSeconds = "120" > 
+		<persistence strategy="localTempSwap"/>
+	</cache>        
 </ehcache>
diff --git a/full/src/main/resources/kustvakt.conf b/full/src/main/resources/kustvakt.conf
index 22e7e14..d7fbf7d 100644
--- a/full/src/main/resources/kustvakt.conf
+++ b/full/src/main/resources/kustvakt.conf
@@ -5,6 +5,8 @@
 krill.index.commit.log = log/krill.commit.log
 krill.index.commit.auto = 500
 krill.index.relations.max = 100
+## Directory path of virtual corpora to cache
+krill.namedVC = vc
 
 ## LDAP
 ldap.config = file-path-to-ldap-config