Fixed recaching VC at closing index.

Change-Id: I29abc795cb57ef6cbff3d1ddc5b459e55d3fe26b
diff --git a/Changes b/Changes
index e9e4518..35f4b8f 100644
--- a/Changes
+++ b/Changes
@@ -8,6 +8,7 @@
   (#800)
 - Omit empty resource description.  
 - Added URL-encoding for corpus query at in the resource service. 
+- Fixed recaching VC at closing index.
 
 # version 0.77
 
diff --git a/src/main/java/de/ids_mannheim/korap/core/web/controller/SearchController.java b/src/main/java/de/ids_mannheim/korap/core/web/controller/SearchController.java
index 82e068e..0838cf0 100644
--- a/src/main/java/de/ids_mannheim/korap/core/web/controller/SearchController.java
+++ b/src/main/java/de/ids_mannheim/korap/core/web/controller/SearchController.java
@@ -63,6 +63,9 @@
 
     @Autowired
     private KustvaktResponseHandler kustvaktResponseHandler;
+    
+    @Autowired
+    private Runnable vcLoader;
 
     @Autowired
     private SearchService searchService;
@@ -104,6 +107,8 @@
     public Response closeIndexReader () {
         try {
             searchService.closeIndexReader();
+            Thread t = new Thread(vcLoader);
+            t.start();
         }
         catch (KustvaktException e) {
             throw kustvaktResponseHandler.throwit(e);
diff --git a/src/main/java/de/ids_mannheim/korap/init/DummyNamedVCLoaderImpl.java b/src/main/java/de/ids_mannheim/korap/init/DummyNamedVCLoaderImpl.java
new file mode 100644
index 0000000..dbf8b82
--- /dev/null
+++ b/src/main/java/de/ids_mannheim/korap/init/DummyNamedVCLoaderImpl.java
@@ -0,0 +1,10 @@
+package de.ids_mannheim.korap.init;
+
+public class DummyNamedVCLoaderImpl implements Runnable {
+
+	@Override
+	public void run () {
+		// TODO Auto-generated method stub
+
+	}
+}
diff --git a/src/main/java/de/ids_mannheim/korap/init/NamedVCLoader.java b/src/main/java/de/ids_mannheim/korap/init/NamedVCLoader.java
index 7bf7ccb..294c7f8 100644
--- a/src/main/java/de/ids_mannheim/korap/init/NamedVCLoader.java
+++ b/src/main/java/de/ids_mannheim/korap/init/NamedVCLoader.java
@@ -58,6 +58,9 @@
     @Override
     public void run () {
         try {
+        	VirtualCorpusCache.vcToCleanUp.clear();
+        	VirtualCorpusCache.map.clear();
+        	
             loadVCToCache();
         }
         catch (IOException | QueryException e) {
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/IndexControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/IndexControllerTest.java
index 3b9dfbc..83de67f 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/IndexControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/IndexControllerTest.java
@@ -10,15 +10,11 @@
 import java.nio.file.Path;
 import java.nio.file.Paths;
 
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.core.Form;
-import jakarta.ws.rs.core.MediaType;
-
 import org.apache.http.HttpStatus;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
+
 import com.fasterxml.jackson.databind.JsonNode;
-import jakarta.ws.rs.core.Response;
 
 import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
 import de.ids_mannheim.korap.config.Attributes;
@@ -27,6 +23,9 @@
 import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.utils.JsonUtils;
 import de.ids_mannheim.korap.web.SearchKrill;
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.Response;
 
 /**
  * @author margaretha
@@ -37,30 +36,52 @@
     private SearchKrill searchKrill;
 
     @Test
-    public void testCloseIndex () throws IOException, KustvaktException,
+    public void testRecachingVC_AfterClosingIndex () throws IOException, KustvaktException,
             URISyntaxException, InterruptedException {
+    	// check VC not found
+    	Response response = target().path(API_VERSION).path("vc").path("~system")
+                .path("named-vc1").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("admin", "pass"))
+                .get();
+
+    	assertEquals(HttpStatus.SC_NOT_FOUND, response.getStatus());
+    	
         URI uri = IndexControllerTest.class.getClassLoader()
                 .getResource("vc/named-vc1.jsonld").toURI();
-        Path toLink = Paths.get(uri);
-        Path symLink = Paths.get("vc/named-vc1.jsonld");
+        Path vcLink = Paths.get(uri);
+        Path targetLink = Paths.get("vc/named-vc1.jsonld");
         Path vcPath = Paths.get("vc");
         if (!Files.exists(vcPath)) {
             Files.createDirectory(vcPath);
         }
-        if (Files.exists(symLink, LinkOption.NOFOLLOW_LINKS)) {
-            Files.delete(symLink);
+        if (Files.exists(targetLink, LinkOption.NOFOLLOW_LINKS)) {
+            Files.delete(targetLink);
         }
-        Files.createSymbolicLink(symLink, toLink);
+        Files.copy(vcLink,targetLink);
         searchKrill.getStatistics(null);
         assertEquals(true, searchKrill.getIndex().isReaderOpen());
         Form form = new Form();
         form.param("token", "secret");
-        Response response = target().path(API_VERSION).path("index")
+        response = target().path(API_VERSION).path("index")
                 .path("close").request().post(Entity.form(form));
         assertEquals(HttpStatus.SC_OK, response.getStatus());
         assertEquals(false, searchKrill.getIndex().isReaderOpen());
         // Cleaning database and cache
         Thread.sleep(200);
+        
+        // check VC has been cached after closing index
+        response = target().path(API_VERSION).path("vc").path("~system")
+                .path("named-vc1").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("admin", "pass"))
+                .get();
+
+    	assertEquals(HttpStatus.SC_OK, response.getStatus());
+    	String entity = response.readEntity(String.class);
+        JsonNode node = JsonUtils.readTree(entity);
+
+        // clean up
         response = target().path(API_VERSION).path("vc").path("~system")
                 .path("named-vc1").request()
                 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
@@ -68,8 +89,8 @@
                 .delete();
         response = target().path(API_VERSION).path("vc").path("~system")
                 .path("named-vc1").request().get();
-        String entity = response.readEntity(String.class);
-        JsonNode node = JsonUtils.readTree(entity);
+        entity = response.readEntity(String.class);
+        node = JsonUtils.readTree(entity);
         assertEquals(StatusCodes.NO_RESOURCE_FOUND,
                 node.at("/errors/0/0").asInt());
     }
diff --git a/src/test/resources/test-config-lite.xml b/src/test/resources/test-config-lite.xml
index 5de7bd6..703ad29 100644
--- a/src/test/resources/test-config-lite.xml
+++ b/src/test/resources/test-config-lite.xml
@@ -176,6 +176,11 @@
 		/> <bean id="searchController" class="de.ids_mannheim.korap.web.controller.SearchController" 
 		/> <bean id="statisticController" class="de.ids_mannheim.korap.web.controller.StatisticController" 
 		/> -->
+		
+	<!-- VC loader -->
+	<bean id="vcLoader"
+		class="de.ids_mannheim.korap.init.DummyNamedVCLoaderImpl" />
+	
 	<!-- Services -->
 	<bean id="scopeService"
 		class="de.ids_mannheim.korap.oauth2.service.DummyOAuth2ScopeServiceImpl" />