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
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2ControllerTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2ControllerTest.java
index 7fb5d4c..a5ba179 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2ControllerTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2ControllerTest.java
@@ -8,7 +8,6 @@
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response.Status;
-import org.apache.commons.codec.binary.Base64;
import org.apache.http.entity.ContentType;
import org.apache.oltu.oauth2.common.error.OAuthError;
import org.apache.oltu.oauth2.common.message.types.GrantType;
@@ -187,6 +186,7 @@
tokenForm.add("client_id", "fCBbQkAyYzI4NzUxMg");
tokenForm.add("client_secret", "secret");
tokenForm.add("code", code);
+ System.out.println(code);
response = requestToken(tokenForm);
String entity = response.getEntity(String.class);
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/VCReferenceTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/VCReferenceTest.java
new file mode 100644
index 0000000..ae3d38e
--- /dev/null
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/VCReferenceTest.java
@@ -0,0 +1,75 @@
+package de.ids_mannheim.korap.web.controller;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.sun.jersey.api.client.ClientResponse;
+
+import de.ids_mannheim.korap.config.SpringJerseyTest;
+import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.utils.JsonUtils;
+
+public class VCReferenceTest extends SpringJerseyTest {
+
+ @Test
+ public void testVCRef () throws KustvaktException {
+ testSearchWithoutVCRefOr();
+ testSearchWithoutVCRefAnd();
+ // auto caching
+ testSearchWithVCRefEqual();
+ testSearchWithVCRefNotEqual();
+ // retrieve from cache
+ testSearchWithVCRefEqual();
+ testSearchWithVCRefNotEqual();
+ }
+
+ private void testSearchWithoutVCRefOr () throws KustvaktException {
+ ClientResponse response = resource().path("search")
+ .queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
+ .queryParam("cq",
+ "textSigle=\"GOE/AGF/00000\" | textSigle=\"GOE/AGA/01784\"")
+ .get(ClientResponse.class);
+
+ String ent = response.getEntity(String.class);
+ JsonNode node = JsonUtils.readTree(ent);
+ assertTrue(node.at("/matches").size() > 0);
+ }
+
+ private void testSearchWithoutVCRefAnd () throws KustvaktException {
+ ClientResponse response = resource().path("search")
+ .queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
+ .queryParam("cq",
+ "textSigle!=\"GOE/AGI/04846\" & textSigle!=\"GOE/AGA/01784\"")
+ .get(ClientResponse.class);
+
+ String ent = response.getEntity(String.class);
+ JsonNode node = JsonUtils.readTree(ent);
+ assertTrue(node.at("/matches").size() > 0);
+ }
+
+ public void testSearchWithVCRefEqual () throws KustvaktException {
+ ClientResponse response = resource().path("search")
+ .queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
+ .queryParam("cq", "referTo named-vc1")
+ .get(ClientResponse.class);
+
+ String ent = response.getEntity(String.class);
+ JsonNode node = JsonUtils.readTree(ent);
+ assertTrue(node.at("/matches").size() > 0);
+
+ }
+
+ public void testSearchWithVCRefNotEqual () throws KustvaktException {
+ ClientResponse response = resource().path("search")
+ .queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
+ .queryParam("cq", "referTo named-vc2")
+ .get(ClientResponse.class);
+
+ String ent = response.getEntity(String.class);
+ JsonNode node = JsonUtils.readTree(ent);
+ assertTrue(node.at("/matches").size() > 0);
+ }
+
+}
diff --git a/full/src/test/resources/kustvakt-test.conf b/full/src/test/resources/kustvakt-test.conf
index 694abce..8690e4f 100644
--- a/full/src/test/resources/kustvakt-test.conf
+++ b/full/src/test/resources/kustvakt-test.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
diff --git a/full/src/test/resources/test-config.xml b/full/src/test/resources/test-config.xml
index ad3d702..f438fd2 100644
--- a/full/src/test/resources/test-config.xml
+++ b/full/src/test/resources/test-config.xml
@@ -167,8 +167,7 @@
</bean>
<bean id="initializator" class="de.ids_mannheim.korap.config.Initializator"
- init-method="init">
- <constructor-arg name="accessScopeDao" ref="accessScopeDao" />
+ init-method="initTest">
</bean>