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