From 1dd7a54b6cfb256a9df4a2e680e22f760960f07e Mon Sep 17 00:00:00 2001
From: Jesper Zedlitz <jesper@zedlitz.de>
Date: Fri, 21 Jan 2022 07:33:25 +0100
Subject: [PATCH] mehr Informationen in DCAT-AP.de Export

---
 pom.xml                                       | 11 ++++
 .../uploadform/controller/DcatController.java | 45 ++++++++++++----
 .../controller/DcatControllerTest.java        | 54 ++++++++++++++-----
 3 files changed, 87 insertions(+), 23 deletions(-)

diff --git a/pom.xml b/pom.xml
index 6fe40f4..029a761 100644
--- a/pom.xml
+++ b/pom.xml
@@ -88,6 +88,17 @@
             <artifactId>commons-text</artifactId>
             <version>1.8</version>
         </dependency>
+        <dependency>
+            <groupId>org.dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>2.1.3</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>jaxen</groupId>
+            <artifactId>jaxen</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/src/main/java/de/landsh/opendata/uploadform/controller/DcatController.java b/src/main/java/de/landsh/opendata/uploadform/controller/DcatController.java
index 43248c0..ee20ea2 100644
--- a/src/main/java/de/landsh/opendata/uploadform/controller/DcatController.java
+++ b/src/main/java/de/landsh/opendata/uploadform/controller/DcatController.java
@@ -2,13 +2,16 @@ package de.landsh.opendata.uploadform.controller;
 
 import de.landsh.opendata.uploadform.model.Dataset;
 import de.landsh.opendata.uploadform.model.DatasetMatrix;
+import de.landsh.opendata.uploadform.model.LocalAuthority;
 import de.landsh.opendata.uploadform.services.DatasetService;
+import de.landsh.opendata.uploadform.services.LocalAuthorityService;
 import lombok.RequiredArgsConstructor;
 import org.apache.commons.text.StringEscapeUtils;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 @Controller
@@ -16,8 +19,9 @@ import java.util.List;
 public class DcatController {
 
     private final DatasetService datasetService;
+    private final LocalAuthorityService localAuthorityService;
 
-    @GetMapping("/catalog.xml")
+    @GetMapping(value = "/catalog.xml", produces = "application/rdf+xml")
     @ResponseBody
     public String catalogXML() {
         StringBuilder sb = new StringBuilder();
@@ -33,13 +37,13 @@ public class DcatController {
                 "  xmlns:dct=\"http://purl.org/dc/terms/\"\n" +
                 "  xmlns:dcatde=\"http://dcat-ap.de/def/dcatde/\"\n" +
                 "  xmlns:skos=\"http://www.w3.org/2004/02/skos/core#\"\n" +
-                "  xmlns:schema=\"http://schema.org/\"\n" +
+                "  xmlns:schema=\"http://schema.org/\">\n" +
                 "  <dcat:Catalog rdf:about=\"https://opendata.schleswig-holstein.de/upload/\">\n");
 
         List<Dataset> datasetList = datasetService.findAll(1, 100);
         for (Dataset dataset : datasetList) {
-            if( dataset.getUploadDate() != null) {
-                sb.append(toDcat(dataset));
+            if (dataset.getUploadDate() != null) {
+                sb.append(toDcat(dataset, false));
             }
         }
 
@@ -48,18 +52,41 @@ public class DcatController {
         return sb.toString();
     }
 
-     String toDcat(Dataset dataset) {
+    String toDcat(Dataset dataset, boolean withPrefix) {
         final DatasetMatrix dm = dataset.getDatasetMatrix();
         final StringBuilder sb = new StringBuilder();
-        sb.append("<dcat:dataset>\n");
+        final LocalAuthority localAuthority = localAuthorityService.findById(dataset.getOrganization());
+        if( withPrefix) {
+            sb.append("<dcat:dataset xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n" +
+                    "  xmlns:dcat=\"http://www.w3.org/ns/dcat#\"\n" +
+                    "  xmlns:dct=\"http://purl.org/dc/terms/\"\n" +
+                    "  xmlns:dcatde=\"http://dcat-ap.de/def/dcatde/\"\n" +
+                    "  xmlns:skos=\"http://www.w3.org/2004/02/skos/core#\"\n" +
+                    "  xmlns:schema=\"http://schema.org/\">\n");
+        }else {
+            sb.append("<dcat:dataset>\n");
+        }
         sb.append("<dcat:Dataset rdf:about=\"https://opendata.schleswig-holstein.de/upload/dataset/");
         sb.append(dataset.getId());
         sb.append("\">\n");
 
-        sb.append("<dct:title>").append(StringEscapeUtils.escapeXml11( dm.getTitle())).append("</dct:title>\n");
-        sb.append("<dct:description>").append(StringEscapeUtils.escapeXml11( dm.getDescription())).append("</dct:description>\n");
-        
+        sb.append("<dct:title>").append(StringEscapeUtils.escapeXml11(dm.getTitle())).append("</dct:title>\n");
+        sb.append("<dct:description>").append(StringEscapeUtils.escapeXml11(dm.getDescription())).append("</dct:description>\n");
 
+        if (localAuthority != null) {
+            sb.append("<dct:spatial rdf:resource='").append(localAuthority.getUri()).append("'/>\n");
+            sb.append("<dcatde:politicalGeocodingURI rdf:resource=\"").append(localAuthority.getUri()).append("\"/>\n");
+        }
+        sb.append("<dct:issued rdf:datatype=\"http://www.w3.org/2001/XMLSchema#date\">")
+                .append(dataset.getUploadDate().format(DateTimeFormatter.ISO_DATE))
+                .append("</dct:issued>");
+        sb.append("<dct:modified rdf:datatype=\"http://www.w3.org/2001/XMLSchema#date\">")
+                .append(dataset.getUploadDate().format(DateTimeFormatter.ISO_DATE))
+                .append("</dct:modified>");
+        sb.append("<dct:temporal><dct:PeriodOfTime>");
+        sb.append("<schema:startDate rdf:datatype=\"http://www.w3.org/2001/XMLSchema#date\">").append(dataset.getYear()).append("-01-01</schema:startDate>");
+        sb.append("<schema:endDate rdf:datatype=\"http://www.w3.org/2001/XMLSchema#date\">").append(dataset.getYear()).append("-01-01</schema:endDate>");
+        sb.append("</dct:PeriodOfTime></dct:temporal>");
         sb.append("</dcat:Dataset>\n");
         sb.append("</dcat:dataset>\n");
 
diff --git a/src/test/java/de/landsh/opendata/uploadform/controller/DcatControllerTest.java b/src/test/java/de/landsh/opendata/uploadform/controller/DcatControllerTest.java
index 75361f7..61ba0f0 100644
--- a/src/test/java/de/landsh/opendata/uploadform/controller/DcatControllerTest.java
+++ b/src/test/java/de/landsh/opendata/uploadform/controller/DcatControllerTest.java
@@ -2,50 +2,76 @@ package de.landsh.opendata.uploadform.controller;
 
 import de.landsh.opendata.uploadform.model.Dataset;
 import de.landsh.opendata.uploadform.model.DatasetMatrix;
+import de.landsh.opendata.uploadform.model.LocalAuthority;
 import de.landsh.opendata.uploadform.services.DatasetService;
+import de.landsh.opendata.uploadform.services.LocalAuthorityService;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.Node;
+import org.dom4j.io.SAXReader;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.mock.mockito.MockBean;
-import org.xml.sax.InputSource;
+import org.mockito.Mockito;
 import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
 
 import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
 import java.io.IOException;
 import java.io.StringReader;
+import java.time.LocalDateTime;
 
-class DcatControllerTest {
+import static org.junit.jupiter.api.Assertions.*;
 
+class DcatControllerTest {
     private DcatController controller;
 
-    @MockBean
-    private DatasetService datasetService;
+
+    private DatasetService datasetService = Mockito.mock(DatasetService.class);
+
+    private LocalAuthorityService localAuthorityService = Mockito.mock(LocalAuthorityService.class);
 
     @BeforeEach
     public void setUp() {
-        controller = new DcatController(datasetService);
+        controller = new DcatController(datasetService, localAuthorityService);
+    }
+
+    @Test
+    public void catalogXML() throws DocumentException {
+        String result = controller.catalogXML();
+        Document doc = new SAXReader().read(new StringReader(result));
+
     }
 
     @Test
-    void toDcat() throws ParserConfigurationException, SAXException, IOException {
+    public void toDcat() throws  DocumentException {
         DatasetMatrix datasetMatrix = new DatasetMatrix();
         datasetMatrix.setId("vornamen");
         datasetMatrix.setTitle("Vornamen");
         datasetMatrix.setDescription("Die Vornamensstatistik ... siehe https://example.org?a=1&b=2");
 
-        Dataset dataset = new Dataset();
+        final Dataset dataset = new Dataset();
         dataset.setId(1L);
         dataset.setDatasetMatrix(datasetMatrix);
         dataset.setOrganization("010585890");  // Amt Hüttener Berge
         dataset.setYear(2021);
+        dataset.setUploadDate(LocalDateTime.parse("2021-01-21T06:39:00"));
+
+        final LocalAuthority localAuthority = new LocalAuthority();
+        localAuthority.setUri("http://dcat-ap.de/def/politicalGeocoding/municipalAssociationKey/010585890");
+        localAuthority.setName("Hüttener Berge");
+        localAuthority.setType("Amt");
+        localAuthority.setCounty(false);
+        localAuthority.setMunicipality(true);
+
+        Mockito.when(localAuthorityService.findById("010585890")).thenReturn(localAuthority);
 
-        String result = controller.toDcat(dataset);
+        String result = controller.toDcat(dataset, true);
 
         // assert that XML is well-formed
-        final SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
-        parser.parse(new InputSource(new StringReader(result)), new DefaultHandler());
+        Document doc = new SAXReader().read(new StringReader(result));
 
+        Node  node = doc.selectSingleNode("//dcatde:politicalGeocodingURI");
+        assertNotNull(node);
+        assertEquals("http://dcat-ap.de/def/politicalGeocoding/municipalAssociationKey/010585890", ((Element)node).attributeValue("resource"));
     }
 }
-- 
GitLab