Allow system VC to have names with less than 3 characters (close #788)

Change-Id: I5f995987a1a7ba4a486e41381ee38302cafc8bf4
diff --git a/Changes b/Changes
index c0841fe..fc41ea5 100644
--- a/Changes
+++ b/Changes
@@ -22,7 +22,8 @@
 - Merge full and lite profiles and create one jar for both. 
 - Merge full and lite version in dockerfile and CI tests
 - Fix redundant initial-super-client generation.
-
+- Allow system VC to have names with less than 3 characters (support for existing 
+  C2 VC, #788)
 
 # version 0.79.1
 
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 70af091..d2c7f6b 100644
--- a/src/main/java/de/ids_mannheim/korap/service/QueryService.java
+++ b/src/main/java/de/ids_mannheim/korap/service/QueryService.java
@@ -75,7 +75,7 @@
     public static boolean DEBUG = false;
 
     public static Pattern queryNamePattern = Pattern
-            .compile("[a-zA-Z0-9]+[a-zA-Z_0-9-.]+");
+            .compile("[a-zA-Z0-9]+[a-zA-Z_0-9-.]*");
 
     @Autowired
     private QueryDao queryDao;
@@ -377,8 +377,10 @@
             String definition, String description, String status,
             boolean isCached, String queryCreator, String query,
             String queryLanguage, double apiVersion) throws KustvaktException {
-        ParameterChecker.checkNameValue(queryName, "queryName");
-        ParameterChecker.checkObjectValue(type, "type");
+    	ParameterChecker.checkObjectValue(type, "type");
+    	if (!type.equals(ResourceType.SYSTEM)) {
+    		ParameterChecker.checkNameValue(queryName, "queryName");
+    	}
 
         if (!queryNamePattern.matcher(queryName).matches()) {
             throw new KustvaktException(StatusCodes.INVALID_ARGUMENT, queryType
diff --git a/src/test/java/de/ids_mannheim/korap/cache/NamedVCLoaderTest.java b/src/test/java/de/ids_mannheim/korap/cache/NamedVCLoaderTest.java
index 35a15bd..1b3eead 100644
--- a/src/test/java/de/ids_mannheim/korap/cache/NamedVCLoaderTest.java
+++ b/src/test/java/de/ids_mannheim/korap/cache/NamedVCLoaderTest.java
@@ -8,8 +8,10 @@
 import java.io.IOException;
 import java.util.Map;
 
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
+
 import de.ids_mannheim.korap.collection.DocBits;
 import de.ids_mannheim.korap.config.SpringJerseyTest;
 import de.ids_mannheim.korap.dao.QueryDao;
@@ -18,6 +20,7 @@
 import de.ids_mannheim.korap.init.NamedVCLoader;
 import de.ids_mannheim.korap.util.QueryException;
 
+@Disabled
 public class NamedVCLoaderTest extends SpringJerseyTest {
 
     @Autowired
@@ -25,8 +28,30 @@
 
     @Autowired
     private QueryDao dao;
+    
+	private void clean (String vcId, QueryDO vc)
+			throws IOException, QueryException, KustvaktException {
+		VirtualCorpusCache.delete(vcId);
+        assertFalse(VirtualCorpusCache.contains(vcId));
+        dao.deleteQuery(vc);
+        vc = dao.retrieveQueryByName(vcId, "system");
+        assertNull(vc);
+	}
 
     @Test
+    public void testVCName ()
+            throws IOException, QueryException, KustvaktException {
+        String vcId = "c";
+        vcLoader.loadVCToCache(vcId, "/vc/c.jsonld");
+        assertTrue(VirtualCorpusCache.contains(vcId));
+        Map<String, DocBits> cachedData = VirtualCorpusCache.retrieve(vcId);
+        assertTrue(cachedData.size() > 0);
+        QueryDO vc = dao.retrieveQueryByName(vcId, "system");
+        assertNotNull(vc);
+        clean(vcId, vc);
+    }
+    
+    @Test
     public void testNamedVCLoader ()
             throws IOException, QueryException, KustvaktException {
         String vcId = "named-vc1";
@@ -34,10 +59,10 @@
         assertTrue(VirtualCorpusCache.contains(vcId));
         Map<String, DocBits> cachedData = VirtualCorpusCache.retrieve(vcId);
         assertTrue(cachedData.size() > 0);
-        //VirtualCorpusCache.delete(vcId);
-        //assertFalse(VirtualCorpusCache.contains(vcId));
         QueryDO vc = dao.retrieveQueryByName(vcId, "system");
         assertNotNull(vc);
+        VirtualCorpusCache.delete(vcId);
+        assertFalse(VirtualCorpusCache.contains(vcId));
         
         String koralQuery = vc.getKoralQuery();
         testUpdateVC(vcId,koralQuery);
@@ -63,13 +88,7 @@
         
         QueryDO vc = dao.retrieveQueryByName(vcId, "system");
         String updatedKoralQuery = vc.getKoralQuery();
-        
         assertTrue (koralQuery.hashCode() != updatedKoralQuery.hashCode());
-        
-        VirtualCorpusCache.delete(vcId);
-        assertFalse(VirtualCorpusCache.contains(vcId));
-        dao.deleteQuery(vc);
-        vc = dao.retrieveQueryByName(vcId, "system");
-        assertNull(vc);
+        clean(vcId, vc);
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusControllerAdminTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusControllerAdminTest.java
index db790ed..5274364 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusControllerAdminTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusControllerAdminTest.java
@@ -75,7 +75,7 @@
         assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
         JsonNode node = testAdminListVC_UsingAdminToken("system",
                 ResourceType.SYSTEM);
-        System.out.println(node.toPrettyString());
+//        System.out.println(node.toPrettyString());
         assertEquals(2, node.size());
         testDeleteSystemVC(admin, "new-system-vc");
     }
diff --git a/src/test/resources/vc/c.jsonld b/src/test/resources/vc/c.jsonld
new file mode 100644
index 0000000..a79d6e5
--- /dev/null
+++ b/src/test/resources/vc/c.jsonld
@@ -0,0 +1,10 @@
+{"collection": {
+    "@type": "koral:doc",
+    "key": "textSigle",
+    "match": "match:ne",
+    "type" : "type:string",
+    "value": [
+        "GOE/AGI/04846",
+        "GOE/AGA/01784"
+    ]
+}}