Add pid for resource and use it as resourceId when available #798

Changed institution to IDS Mannheim.

Change-Id: I9d14f97b948aa35f50dc08b47dcc1ac7ec3c6375
diff --git a/Changes b/Changes
index 76170f3..10dc286 100644
--- a/Changes
+++ b/Changes
@@ -18,7 +18,10 @@
   - Added statisticsRewriteHandler and queryContextRewrite, 
   - changed file locations to the data folder, 
   - removed unused beans (cacheManager, sqliteDataSource)
-- Fix landingPage in the free resource web-service.  
+- Fix landingPage in the free resource web-service (#799) 
+- Add pid for resource and use it as resourceId when available #798
+- Changed institution to IDS Mannheim.
+
 
 # version 0.76
 
diff --git a/src/main/java/de/ids_mannheim/korap/annotation/FreeResourceParser.java b/src/main/java/de/ids_mannheim/korap/annotation/FreeResourceParser.java
index 777f511..17b4546 100644
--- a/src/main/java/de/ids_mannheim/korap/annotation/FreeResourceParser.java
+++ b/src/main/java/de/ids_mannheim/korap/annotation/FreeResourceParser.java
@@ -60,6 +60,7 @@
                 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(), 
@@ -68,7 +69,8 @@
                             resource.at("/corpus_query").asText());
                 }
                 else {
-                	resourceDao.updateResource(resource.at("/id").asText(),
+                	resourceDao.updateResource(r,
+                			resource.at("/pid").asText(),
                             resource.at("/de_title").asText(),
                             resource.at("/en_title").asText(),
                             resource.at("/en_description").asText(), 
diff --git a/src/main/java/de/ids_mannheim/korap/dao/ResourceDao.java b/src/main/java/de/ids_mannheim/korap/dao/ResourceDao.java
index 5655980..94dd5b2 100644
--- a/src/main/java/de/ids_mannheim/korap/dao/ResourceDao.java
+++ b/src/main/java/de/ids_mannheim/korap/dao/ResourceDao.java
@@ -67,7 +67,7 @@
     }
 
     @Transactional
-    public void createResource (String id, String germanTitle,
+    public void createResource (String id, String pid, String germanTitle,
             String englishTitle, String englishDescription,
             Set<AnnotationLayer> layers, String institution, 
             String corpusQuery) throws KustvaktException {
@@ -75,23 +75,29 @@
         ParameterChecker.checkStringValue(englishTitle, "en_title");
         ParameterChecker.checkStringValue(germanTitle, "de_title");
 
-        Resource r = new Resource(id, germanTitle, englishTitle,
+        Resource r = new Resource(id, pid, germanTitle, englishTitle,
                 englishDescription, layers, institution, corpusQuery);
         entityManager.persist(r);
 
     }
     
     @Transactional
-    public void updateResource (String id, String germanTitle,
+    public void updateResource (Resource r, String pid, String germanTitle,
             String englishTitle, String englishDescription,
             Set<AnnotationLayer> layers, String institution, 
             String corpusQuery) throws KustvaktException {
-        ParameterChecker.checkStringValue(id, "id");
+        ParameterChecker.checkObjectValue(layers, "layers");
         ParameterChecker.checkStringValue(englishTitle, "en_title");
         ParameterChecker.checkStringValue(germanTitle, "de_title");
 
-        Resource r = new Resource(id, germanTitle, englishTitle,
-                englishDescription, layers, institution, corpusQuery);
+        r.setCorpusQuery(corpusQuery);
+        r.setEnglishDescription(englishDescription);
+        r.setEnglishTitle(englishTitle);
+        r.setGermanTitle(germanTitle);
+        r.setInstitution(institution);
+        r.setLayers(layers);
+        r.setPid(pid);
+        
         entityManager.merge(r);
 
     }
diff --git a/src/main/java/de/ids_mannheim/korap/dto/converter/ResourceConverter.java b/src/main/java/de/ids_mannheim/korap/dto/converter/ResourceConverter.java
index c1a207f..efbc619 100644
--- a/src/main/java/de/ids_mannheim/korap/dto/converter/ResourceConverter.java
+++ b/src/main/java/de/ids_mannheim/korap/dto/converter/ResourceConverter.java
@@ -31,7 +31,14 @@
         for (Resource r : resources) {
             dto = new ResourceDto();
             dto.setDescription(r.getEnglishDescription());
-            dto.setResourceId(r.getId());
+            
+            String pid = r.getPid();
+            if (pid !=null && !pid.isEmpty()) {
+            	dto.setResourceId(pid);
+            }
+            else {
+            	dto.setResourceId(r.getId());
+            }
             dto.setLanguages(new String[] { "deu" });
 
             titles = new HashMap<String, String>();
diff --git a/src/main/java/de/ids_mannheim/korap/entity/Resource.java b/src/main/java/de/ids_mannheim/korap/entity/Resource.java
index 4e9906b..98c7fa5 100644
--- a/src/main/java/de/ids_mannheim/korap/entity/Resource.java
+++ b/src/main/java/de/ids_mannheim/korap/entity/Resource.java
@@ -27,9 +27,13 @@
 @Table(name = "resource")
 public class Resource {
 
+	// required
     @Id
     private String id;
+    
+    private String pid;
 
+    // one title is required
     @Column(name = "de_title")
     private String germanTitle;
 
@@ -39,21 +43,25 @@
     @Column(name = "en_description")
     private String englishDescription;
     
+    // required
     @Column(name = "corpus_query")
     private String corpusQuery;
     
     private String institution;
-
-    @ManyToMany(fetch = FetchType.EAGER)
-    @JoinTable(name = "resource_layer", joinColumns = @JoinColumn(name = "resource_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "layer_id", referencedColumnName = "id"))
+    
+    // required
+	@ManyToMany(fetch = FetchType.EAGER)
+	@JoinTable(name = "resource_layer", joinColumns = @JoinColumn(name = "resource_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "layer_id", referencedColumnName = "id"))
     private Set<AnnotationLayer> layers;
 
     public Resource () {}
 
-    public Resource (String id, String germanTitle, String englishTitle,
-                     String englishDescription, Set<AnnotationLayer> layers,
-                     String institution, String corpusQuery) {
+	public Resource (String id, String pid, String germanTitle,
+					 String englishTitle, String englishDescription,
+					 Set<AnnotationLayer> layers, String institution,
+					 String corpusQuery) {
         this.id = id;
+        this.pid = pid;
         this.germanTitle = germanTitle;
         this.englishTitle = englishTitle;
         this.englishDescription = englishDescription;
@@ -62,12 +70,12 @@
         this.institution=institution;
     }
 
-    @Override
-    public String toString () {
-        return "id=" + id + ", germanTitle=" + germanTitle + ", englishTitle="
-                + englishTitle + ", description=" + englishDescription
-                + ", layers= " + layers + ", institution=" + institution
-                + ", corpusQuery=" + corpusQuery;
-    }
+	@Override
+	public String toString () {
+		return "id=" + id + "pid=" + pid + ", germanTitle=" + germanTitle
+				+ ", englishTitle=" + englishTitle + ", description="
+				+ englishDescription + ", layers= " + layers + ", institution="
+				+ institution + ", corpusQuery=" + corpusQuery;
+	}
 
 }
diff --git a/src/main/resources/db/sqlite/V4.1__resource_alteration.sql b/src/main/resources/db/sqlite/V4.1__resource_alteration.sql
index 20a9aa3..64844bf 100644
--- a/src/main/resources/db/sqlite/V4.1__resource_alteration.sql
+++ b/src/main/resources/db/sqlite/V4.1__resource_alteration.sql
@@ -2,4 +2,7 @@
 ADD COLUMN institution VARCHAR(100) DEFAULT NULL;
 
 ALTER TABLE resource 
-ADD COLUMN corpus_query VARCHAR(500) DEFAULT NULL;
\ No newline at end of file
+ADD COLUMN corpus_query VARCHAR(500) DEFAULT NULL;
+
+ALTER TABLE resource 
+ADD COLUMN pid VARCHAR(500) DEFAULT NULL;
\ No newline at end of file
diff --git a/src/main/resources/json/free-resources.json b/src/main/resources/json/free-resources.json
index 95ee585..10320f2 100644
--- a/src/main/resources/json/free-resources.json
+++ b/src/main/resources/json/free-resources.json
@@ -1,5 +1,6 @@
 [{
     "id": "WPD17",
+    "pid": "http://hdl.handle.net/10932/00-03B6-558F-4E10-6201-1",
     "de_title" : "Deutsche Wikipedia Artikel 2017",
     "en_title" : "German Wikipedia Articles 2017",
     "en_description" : "A collection of articles of German Wikipedia from July 1st, 2017.",
@@ -12,10 +13,11 @@
         "tt/p"
     ],
     "corpus_query":"corpusSigle=WPD17",
-    "institution" : "Wikimedia Foundation"
+    "institution" : "IDS Mannheim"
 },
 {
     "id": "WDD17",
+    "pid" : "http://hdl.handle.net/10932/00-03B6-558F-5EA0-6301-B",
     "de_title" : "Deutsche Wikipedia-Diskussionskorpus 2017",
     "en_title" : "German Wikipedia talk corpus 2017",
     "en_description" : "A collection of talk pages of German Wikipedia from July 1st, 2017.",
@@ -28,10 +30,11 @@
         "tt/p"
     ],
     "corpus_query":"corpusSigle=WDD17",
-    "institution" : "Wikimedia Foundation"
+    "institution" : "IDS Mannheim"
 },
 {
     "id": "WUD17",
+    "pid": "http://hdl.handle.net/10932/00-03B6-558F-6EF0-6401-F",
     "de_title" : "Deutsche Wikipedia-Benutzerdiskussionskorpus 2017",
     "en_title" : "German Wikipedia user talk corpus 2017",
     "en_description" : "A collection of user talk pages of German Wikipedia from July 1st, 2017.",
@@ -44,6 +47,6 @@
         "tt/p"
     ],
     "corpus_query":"corpusSigle=WUD17",
-    "institution" : "Wikimedia Foundation"
+    "institution" : "IDS Mannheim"
 }
 ]
\ No newline at end of file
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/FreeResourceControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/FreeResourceControllerTest.java
index 99296a1..719a96c 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/FreeResourceControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/FreeResourceControllerTest.java
@@ -14,24 +14,25 @@
 @ContextConfiguration("classpath:test-resource-config.xml")
 public class FreeResourceControllerTest extends SpringJerseyTest {
 
-    @Test
-    public void testResource () throws KustvaktException {
-        Response response = target().path(API_VERSION).path("resource")
-                .request().get();
-        String entity = response.readEntity(String.class);
-        JsonNode n = JsonUtils.readTree(entity);
-        assertEquals(3, n.size());
+	@Test
+	public void testResource () throws KustvaktException {
+		Response response = target().path(API_VERSION).path("resource")
+				.request().get();
+		String entity = response.readEntity(String.class);
+		JsonNode n = JsonUtils.readTree(entity);
+		assertEquals(3, n.size());
 
-        n = n.get(0);
-        assertEquals(n.at("/resourceId").asText(), "WPD17");
-        assertEquals(n.at("/titles/de").asText(), 
-                "Deutsche Wikipedia Artikel 2017");
-        assertEquals(n.at("/titles/en").asText(), 
-                "German Wikipedia Articles 2017");
-        assertEquals(1, n.at("/languages").size());
-        assertEquals(6, n.at("/layers").size());
-        assertEquals("Wikimedia Foundation", n.at("/institution").asText());
-        assertEquals("https://korap.ids-mannheim.de?cq=corpusSigle=WPD17", 
-                n.at("/landingPage").asText());
-    }
+		n = 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(),
+				"Deutsche Wikipedia Artikel 2017");
+		assertEquals(n.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("https://korap.ids-mannheim.de?cq=corpusSigle=WPD17",
+				n.at("/landingPage").asText());
+	}
 }