Skip to content
Snippets Groups Projects
Commit 1dd7a54b authored by Jesper Zedlitz's avatar Jesper Zedlitz
Browse files

mehr Informationen in DCAT-AP.de Export

parent c2b70021
No related branches found
No related tags found
1 merge request!2Draft: Resolve "DCAT-AP.de konformer Export"
Pipeline #237 passed
...@@ -88,6 +88,17 @@ ...@@ -88,6 +88,17 @@
<artifactId>commons-text</artifactId> <artifactId>commons-text</artifactId>
<version>1.8</version> <version>1.8</version>
</dependency> </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> </dependencies>
<build> <build>
......
...@@ -2,13 +2,16 @@ package de.landsh.opendata.uploadform.controller; ...@@ -2,13 +2,16 @@ package de.landsh.opendata.uploadform.controller;
import de.landsh.opendata.uploadform.model.Dataset; import de.landsh.opendata.uploadform.model.Dataset;
import de.landsh.opendata.uploadform.model.DatasetMatrix; 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.DatasetService;
import de.landsh.opendata.uploadform.services.LocalAuthorityService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.commons.text.StringEscapeUtils; import org.apache.commons.text.StringEscapeUtils;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import java.time.format.DateTimeFormatter;
import java.util.List; import java.util.List;
@Controller @Controller
...@@ -16,8 +19,9 @@ import java.util.List; ...@@ -16,8 +19,9 @@ import java.util.List;
public class DcatController { public class DcatController {
private final DatasetService datasetService; private final DatasetService datasetService;
private final LocalAuthorityService localAuthorityService;
@GetMapping("/catalog.xml") @GetMapping(value = "/catalog.xml", produces = "application/rdf+xml")
@ResponseBody @ResponseBody
public String catalogXML() { public String catalogXML() {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
...@@ -33,13 +37,13 @@ public class DcatController { ...@@ -33,13 +37,13 @@ public class DcatController {
" xmlns:dct=\"http://purl.org/dc/terms/\"\n" + " xmlns:dct=\"http://purl.org/dc/terms/\"\n" +
" xmlns:dcatde=\"http://dcat-ap.de/def/dcatde/\"\n" + " xmlns:dcatde=\"http://dcat-ap.de/def/dcatde/\"\n" +
" xmlns:skos=\"http://www.w3.org/2004/02/skos/core#\"\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"); " <dcat:Catalog rdf:about=\"https://opendata.schleswig-holstein.de/upload/\">\n");
List<Dataset> datasetList = datasetService.findAll(1, 100); List<Dataset> datasetList = datasetService.findAll(1, 100);
for (Dataset dataset : datasetList) { for (Dataset dataset : datasetList) {
if (dataset.getUploadDate() != null) { if (dataset.getUploadDate() != null) {
sb.append(toDcat(dataset)); sb.append(toDcat(dataset, false));
} }
} }
...@@ -48,10 +52,20 @@ public class DcatController { ...@@ -48,10 +52,20 @@ public class DcatController {
return sb.toString(); return sb.toString();
} }
String toDcat(Dataset dataset) { String toDcat(Dataset dataset, boolean withPrefix) {
final DatasetMatrix dm = dataset.getDatasetMatrix(); final DatasetMatrix dm = dataset.getDatasetMatrix();
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
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>\n");
}
sb.append("<dcat:Dataset rdf:about=\"https://opendata.schleswig-holstein.de/upload/dataset/"); sb.append("<dcat:Dataset rdf:about=\"https://opendata.schleswig-holstein.de/upload/dataset/");
sb.append(dataset.getId()); sb.append(dataset.getId());
sb.append("\">\n"); sb.append("\">\n");
...@@ -59,7 +73,20 @@ public class DcatController { ...@@ -59,7 +73,20 @@ public class DcatController {
sb.append("<dct:title>").append(StringEscapeUtils.escapeXml11(dm.getTitle())).append("</dct:title>\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: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");
sb.append("</dcat:dataset>\n"); sb.append("</dcat:dataset>\n");
......
...@@ -2,50 +2,76 @@ package de.landsh.opendata.uploadform.controller; ...@@ -2,50 +2,76 @@ package de.landsh.opendata.uploadform.controller;
import de.landsh.opendata.uploadform.model.Dataset; import de.landsh.opendata.uploadform.model.Dataset;
import de.landsh.opendata.uploadform.model.DatasetMatrix; 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.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.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.boot.test.mock.mockito.MockBean; import org.mockito.Mockito;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException; import java.io.IOException;
import java.io.StringReader; import java.io.StringReader;
import java.time.LocalDateTime;
class DcatControllerTest { import static org.junit.jupiter.api.Assertions.*;
class DcatControllerTest {
private DcatController controller; private DcatController controller;
@MockBean
private DatasetService datasetService; private DatasetService datasetService = Mockito.mock(DatasetService.class);
private LocalAuthorityService localAuthorityService = Mockito.mock(LocalAuthorityService.class);
@BeforeEach @BeforeEach
public void setUp() { 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 @Test
void toDcat() throws ParserConfigurationException, SAXException, IOException { public void toDcat() throws DocumentException {
DatasetMatrix datasetMatrix = new DatasetMatrix(); DatasetMatrix datasetMatrix = new DatasetMatrix();
datasetMatrix.setId("vornamen"); datasetMatrix.setId("vornamen");
datasetMatrix.setTitle("Vornamen"); datasetMatrix.setTitle("Vornamen");
datasetMatrix.setDescription("Die Vornamensstatistik ... siehe https://example.org?a=1&b=2"); 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.setId(1L);
dataset.setDatasetMatrix(datasetMatrix); dataset.setDatasetMatrix(datasetMatrix);
dataset.setOrganization("010585890"); // Amt Hüttener Berge dataset.setOrganization("010585890"); // Amt Hüttener Berge
dataset.setYear(2021); 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 // assert that XML is well-formed
final SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); Document doc = new SAXReader().read(new StringReader(result));
parser.parse(new InputSource(new StringReader(result)), new DefaultHandler());
Node node = doc.selectSingleNode("//dcatde:politicalGeocodingURI");
assertNotNull(node);
assertEquals("http://dcat-ap.de/def/politicalGeocoding/municipalAssociationKey/010585890", ((Element)node).attributeValue("resource"));
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment