diff --git a/pom.xml b/pom.xml index ecf386dbb4a2e72d1e8af5c4000afdf549ffee28..a68a964af88e38ac681f9348259f5a5cc21fc130 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ <groupId>de.landsh.opendata</groupId> <artifactId>dcat-uploader</artifactId> - <version>1.0.3</version> + <version>1.0.4</version> <build> <plugins> diff --git a/src/main/java/de/landsh/opendata/ckan/DcatUploader.java b/src/main/java/de/landsh/opendata/ckan/DcatUploader.java index 4a0c73115aab0d24a9aa34ba7f9d1a1915c01f70..3c9cc5107d3f6b2a1f028b0c84083fe45e8efc02 100644 --- a/src/main/java/de/landsh/opendata/ckan/DcatUploader.java +++ b/src/main/java/de/landsh/opendata/ckan/DcatUploader.java @@ -2,6 +2,7 @@ package de.landsh.opendata.ckan; import de.landsh.opendata.DCATAPde; import de.landsh.opendata.Locn; +import de.landsh.opendata.SPDX; import de.landsh.opendata.SchemaOrg; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; @@ -216,6 +217,11 @@ public class DcatUploader { if (distribution.hasProperty(DCATAPde.licenseAttributionByText)) { jsonResource.put("licenseAttributionByText", getString(distribution, DCATAPde.licenseAttributionByText)); } + if( distribution.hasProperty(SPDX.checksum)) { + final Resource checksum = distribution.getPropertyResourceValue(SPDX.checksum); + jsonResource.put("hash", getString(checksum, SPDX.checksumValue)); + jsonResource.put("hash_algorithm", getString(checksum, SPDX.algorithm)); + } ckanAPI.createResource(jsonResource); } diff --git a/src/main/resources/dataset-with-geometry.xml b/src/main/resources/dataset-with-geometry.xml new file mode 100644 index 0000000000000000000000000000000000000000..f68f82432e88fbe557ebb861365b1613900231a8 --- /dev/null +++ b/src/main/resources/dataset-with-geometry.xml @@ -0,0 +1,52 @@ +<rdf:RDF + xmlns:dct="http://purl.org/dc/terms/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:j.0="http://www.w3.org/ns/locn#" + xmlns:schema="http://schema.org/" + xmlns:dcat="http://www.w3.org/ns/dcat#" + xmlns:xsd="http://www.w3.org/2001/XMLSchema#" + xmlns:dcatde="http://dcat-ap.de/def/dcatde/"> + <dcat:Dataset rdf:about="https://opendata.schleswig-holstein.de/dataset/demo"> + <dcat:keyword>my dataset</dcat:keyword> + <dct:accrualPeriodicity rdf:resource="http://publications.europa.eu/resource/authority/frequency/DAILY"/> + <dcat:keyword>demo</dcat:keyword> + <dcat:distribution> + <dcat:Distribution rdf:about="https://opendata.schleswig-holstein.de/dataset/demo/resource"> + <dcat:downloadURL rdf:resource="http://example.org/data.csv"/> + <dcat:accessURL rdf:resource="http://example.org/data.csv"/> + <dct:format rdf:resource="http://publications.europa.eu/resource/authority/file-type/CSV"/> + <dcat:byteSize rdf:datatype="http://www.w3.org/2001/XMLSchema#decimal" + >500</dcat:byteSize> + <dct:title>data.csv</dct:title> + <dcatde:licenseAttributionByText>ZIT-SH</dcatde:licenseAttributionByText> + <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-by/4.0"/> + </dcat:Distribution> + </dcat:distribution> + <dct:spatial> + <dct:Location> + <j.0:geometry rdf:datatype="http://www.opengis.net/ont/geosparql#wktLiteral" + >POLYGON(( 10.753384 54.033113 , 10.754036 54.033269 , 10.750559 54.039196 , 10.75143 54.039301 , 10.753384 54.033113 ))</j.0:geometry> + <j.0:geometry rdf:datatype="https://www.iana.org/assignments/media-types/application/vnd.geo+json" + >{"type":"Polygon","coordinates":[[[10.753384,54.033113],[10.754036,54.033269],[10.750559,54.039196],[10.75143,54.039301],[10.753384,54.033113]]]}</j.0:geometry> + </dct:Location> + </dct:spatial> + <dct:temporal> + <dct:PeriodOfTime> + <schema:endDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date" + >2020-10-12</schema:endDate> + <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date" + >2020-10-11</schema:startDate> + </dct:PeriodOfTime> + </dct:temporal> + <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-by/4.0"/> + <dct:description>This is a description of my dataset.</dct:description> + <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#date" + >2020-10-13</dct:modified> + <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date" + >2020-10-13</dct:issued> + <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/TRAN"/> + <dct:title>My first dataset</dct:title> + <dcatde:licenseAttributionByText>ZIT-SH</dcatde:licenseAttributionByText> + <dct:publisher rdf:resource="https://opendata.schleswig-holstein.de/organization/2a6d6241-fdfd-4d9a-9106-8c658be43a27"/> + </dcat:Dataset> +</rdf:RDF> \ No newline at end of file diff --git a/src/main/resources/dataset.xml b/src/main/resources/dataset.xml new file mode 100644 index 0000000000000000000000000000000000000000..0867f6958615c174632fb56e7981d781d14ee750 --- /dev/null +++ b/src/main/resources/dataset.xml @@ -0,0 +1,48 @@ +<rdf:RDF + xmlns:dct="http://purl.org/dc/terms/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:schema="http://schema.org/" + xmlns:dcat="http://www.w3.org/ns/dcat#" xmlns:spdx="http://spdx.org/rdf/terms#" + xmlns:dcatde="http://dcat-ap.de/def/dcatde/"> + <dcat:Dataset rdf:about="https://opendata.schleswig-holstein.de/dataset/demo"> + <dcat:keyword>my dataset</dcat:keyword> + <dct:accrualPeriodicity rdf:resource="http://publications.europa.eu/resource/authority/frequency/DAILY"/> + <dcat:keyword>demo</dcat:keyword> + <dcatde:politicalGeocodingURI> + <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/regionalKey/010550044044"/> + </dcatde:politicalGeocodingURI> + <dcat:distribution> + <dcat:Distribution rdf:about="https://opendata.schleswig-holstein.de/dataset/demo/resource"> + <dcat:downloadURL rdf:resource="http://example.org/data.csv"/> + <dcat:accessURL rdf:resource="http://example.org/data.csv"/> + <dct:format rdf:resource="http://publications.europa.eu/resource/authority/file-type/CSV"/> + <dcat:byteSize rdf:datatype="http://www.w3.org/2001/XMLSchema#decimal">500</dcat:byteSize> + <dct:title>data.csv</dct:title> + <dcatde:licenseAttributionByText>ZIT-SH</dcatde:licenseAttributionByText> + <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-by/4.0"/> + <spdx:checksum> + <spdx:Checksum> + <spdx:checksumValue rdf:datatype="http://www.w3.org/2001/XMLSchema#hexBinary">17f9aec62e8398c358b3d3a2deaef2a5</spdx:checksumValue> + <spdx:algorithm rdf:resource="http://dcat-ap.de/def/hashAlgorithms/md/5"/> + </spdx:Checksum> + </spdx:checksum> + </dcat:Distribution> + </dcat:distribution> + <dct:temporal> + <dct:PeriodOfTime> + <schema:endDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2020-10-12</schema:endDate> + <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2020-10-11</schema:startDate> + </dct:PeriodOfTime> + </dct:temporal> + <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-by/4.0"/> + <dcatde:politicalGeocodingLevelURI rdf:resource="http://dcat-ap.de/def/politicalGeocoding/Level/municipality"/> + <dct:description>This is a description of my dataset.</dct:description> + <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2020-10-13</dct:modified> + <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2020-10-13</dct:issued> + <dct:spatial rdf:resource="http://dcat-ap.de/def/politicalGeocoding/regionalKey/010550044044"/> + <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/TRAN"/> + <dct:title>My first dataset</dct:title> + <dcatde:licenseAttributionByText>ZIT-SH</dcatde:licenseAttributionByText> + <dct:publisher rdf:resource="https://opendata.schleswig-holstein.de/organization/2a6d6241-fdfd-4d9a-9106-8c658be43a27"/> + </dcat:Dataset> +</rdf:RDF> \ No newline at end of file diff --git a/src/test/java/de/landsh/opendata/ckan/DcatUploaderTest.java b/src/test/java/de/landsh/opendata/ckan/DcatUploaderTest.java index aef3620c1844c0232bc69b640b1b1678c3ceea8d..3c7efb2657a65d16d5c5cc64c539f8efa7ce3588 100644 --- a/src/test/java/de/landsh/opendata/ckan/DcatUploaderTest.java +++ b/src/test/java/de/landsh/opendata/ckan/DcatUploaderTest.java @@ -1,7 +1,5 @@ package de.landsh.opendata.ckan; -import de.landsh.opendata.DCATAPde; -import org.apache.jena.datatypes.xsd.XSDDatatype; import org.apache.jena.rdf.model.Resource; import org.apache.jena.rdf.model.*; import org.apache.jena.vocabulary.DCAT; @@ -16,8 +14,6 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import java.io.IOException; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; import java.util.UUID; import static org.junit.Assert.assertEquals; @@ -26,7 +22,6 @@ import static org.junit.Assert.assertNotNull; public class DcatUploaderTest { private static final String geometryInJSON = "{\"type\":\"Polygon\",\"coordinates\":[[[10.753384,54.033113],[10.754036,54.033269],[10.750559,54.039196],[10.75143,54.039301],[10.753384,54.033113]]]}"; - private static final Property geometry = ResourceFactory.createProperty("http://www.w3.org/ns/locn#", "geometry"); private final CkanAPI ckanAPI = Mockito.mock(CkanAPI.class); private DcatUploader dcatUploader; @@ -46,115 +41,16 @@ public class DcatUploaderTest { dcatUploader = new DcatUploader(ckanAPI); } - private org.apache.jena.rdf.model.Resource generateDataset() { - Model model = ModelFactory.createDefaultModel(); - - LocalDate date = LocalDate.of(2020, 10, 13); - - final Resource dataset = model.createResource("https://opendata.schleswig-holstein.de/dataset/demo"); - dataset.addProperty(RDF.type, DCAT.Dataset); - - final org.apache.jena.rdf.model.Resource temporal = model.createResource(); - temporal.addProperty(RDF.type, DCTerms.PeriodOfTime); - temporal.addLiteral(model.createProperty("http://schema.org/", "startDate"), - model.createTypedLiteral(date.minusDays(2).format(DateTimeFormatter.ISO_DATE), XSDDatatype.XSDdate)); - temporal.addLiteral(model.createProperty("http://schema.org/", "endDate"), - model.createTypedLiteral(date.minusDays(1).format(DateTimeFormatter.ISO_DATE), XSDDatatype.XSDdate)); - dataset.addProperty(DCTerms.temporal, temporal); - - dataset.addLiteral(DCTerms.title, "My first dataset"); - dataset.addLiteral(DCTerms.issued, model.createTypedLiteral(date.format(DateTimeFormatter.ISO_DATE), XSDDatatype.XSDdate)); - dataset.addLiteral(DCTerms.modified, model.createTypedLiteral(date.format(DateTimeFormatter.ISO_DATE), XSDDatatype.XSDdate)); - dataset.addProperty(DCTerms.license, ResourceFactory.createResource("http://dcat-ap.de/def/licenses/cc-by/4.0")); - dataset.addProperty(DCATAPde.licenseAttributionByText, "ZIT-SH"); - dataset.addProperty(DCAT.theme, ResourceFactory.createResource("http://publications.europa.eu/resource/authority/data-theme/TRAN")); - - dataset.addProperty(DCTerms.accrualPeriodicity, ResourceFactory.createResource("http://publications.europa.eu/resource/authority/frequency/DAILY")); - - final Resource loc = model.createResource("http://dcat-ap.de/def/politicalGeocoding/regionalKey/010550044044"); - loc.addProperty(RDF.type, DCTerms.Location); - dataset.addProperty(DCTerms.spatial, loc); - - dataset.addProperty(DCATAPde.politicalGeocodingURI, ResourceFactory.createResource("http://dcat-ap.de/def/politicalGeocoding/regionalKey/010550044044")); - dataset.addProperty(DCATAPde.politicalGeocodingLevelURI, ResourceFactory.createResource("http://dcat-ap.de/def/politicalGeocoding/Level/municipality")); - dataset.addLiteral(DCTerms.description, "This is a description of my dataset."); - dataset.addProperty(DCAT.keyword, "demo"); - dataset.addProperty(DCAT.keyword, "my dataset"); - dataset.addProperty(DCTerms.publisher, ResourceFactory.createResource("https://opendata.schleswig-holstein.de/organization/2a6d6241-fdfd-4d9a-9106-8c658be43a27")); - - final Resource distribution = model.createResource("https://opendata.schleswig-holstein.de/dataset/demo/resource"); - distribution.addProperty(RDF.type, DCAT.Distribution); - distribution.addProperty(DCTerms.license, ResourceFactory.createResource("http://dcat-ap.de/def/licenses/cc-by/4.0")); - distribution.addLiteral(DCATAPde.licenseAttributionByText, "ZIT-SH"); - distribution.addLiteral(DCTerms.title, "data.csv"); - distribution.addLiteral(DCAT.byteSize, model.createTypedLiteral(500, XSDDatatype.XSDdecimal)); - distribution.addProperty(DCTerms.format, ResourceFactory.createResource("http://publications.europa.eu/resource/authority/file-type/CSV")); - final Resource url = model.createResource("http://example.org/data.csv"); - distribution.addProperty(DCAT.accessURL, url); - distribution.addProperty(DCAT.downloadURL, url); - dataset.addProperty(DCAT.distribution, distribution); - - return dataset; - } - - private org.apache.jena.rdf.model.Resource generateDatasetWithGeometry() { + /** + * Liest eine RDF-Resource aus einer Datei im resources/ Verzeichnis ein. + */ + private org.apache.jena.rdf.model.Resource loadDataset(String resourceName) { final Model model = ModelFactory.createDefaultModel(); - - final LocalDate date = LocalDate.of(2020, 10, 13); - - final Resource dataset = model.createResource("https://opendata.schleswig-holstein.de/dataset/demo"); - dataset.addProperty(RDF.type, DCAT.Dataset); - - final org.apache.jena.rdf.model.Resource temporal = model.createResource(); - temporal.addProperty(RDF.type, DCTerms.PeriodOfTime); - temporal.addLiteral(model.createProperty("http://schema.org/", "startDate"), - model.createTypedLiteral(date.minusDays(2).format(DateTimeFormatter.ISO_DATE), XSDDatatype.XSDdate)); - temporal.addLiteral(model.createProperty("http://schema.org/", "endDate"), - model.createTypedLiteral(date.minusDays(1).format(DateTimeFormatter.ISO_DATE), XSDDatatype.XSDdate)); - dataset.addProperty(DCTerms.temporal, temporal); - - dataset.addLiteral(DCTerms.title, "My first dataset"); - dataset.addLiteral(DCTerms.issued, model.createTypedLiteral(date.format(DateTimeFormatter.ISO_DATE), XSDDatatype.XSDdate)); - dataset.addLiteral(DCTerms.modified, model.createTypedLiteral(date.format(DateTimeFormatter.ISO_DATE), XSDDatatype.XSDdate)); - dataset.addProperty(DCTerms.license, ResourceFactory.createResource("http://dcat-ap.de/def/licenses/cc-by/4.0")); - dataset.addProperty(DCATAPde.licenseAttributionByText, "ZIT-SH"); - dataset.addProperty(DCAT.theme, ResourceFactory.createResource("http://publications.europa.eu/resource/authority/data-theme/TRAN")); - - dataset.addProperty(DCTerms.accrualPeriodicity, ResourceFactory.createResource("http://publications.europa.eu/resource/authority/frequency/DAILY")); - - final Resource loc = model.createResource(); - loc.addProperty(RDF.type, DCTerms.Location); - - loc.addLiteral(geometry, model.createTypedLiteral( - geometryInJSON, - "https://www.iana.org/assignments/media-types/application/vnd.geo+json" - )); - loc.addLiteral(geometry, model.createTypedLiteral( - "POLYGON(( 10.753384 54.033113 , 10.754036 54.033269 , 10.750559 54.039196 , 10.75143 54.039301 , 10.753384 54.033113 ))", - "http://www.opengis.net/ont/geosparql#wktLiteral" - )); - - dataset.addProperty(DCTerms.spatial, loc); - dataset.addLiteral(DCTerms.description, "This is a description of my dataset."); - dataset.addProperty(DCAT.keyword, "demo"); - dataset.addProperty(DCAT.keyword, "my dataset"); - dataset.addProperty(DCTerms.publisher, ResourceFactory.createResource("https://opendata.schleswig-holstein.de/organization/2a6d6241-fdfd-4d9a-9106-8c658be43a27")); - - final Resource distribution = model.createResource("https://opendata.schleswig-holstein.de/dataset/demo/resource"); - distribution.addProperty(RDF.type, DCAT.Distribution); - distribution.addProperty(DCTerms.license, ResourceFactory.createResource("http://dcat-ap.de/def/licenses/cc-by/4.0")); - distribution.addLiteral(DCATAPde.licenseAttributionByText, "ZIT-SH"); - distribution.addLiteral(DCTerms.title, "data.csv"); - distribution.addLiteral(DCAT.byteSize, model.createTypedLiteral(500, XSDDatatype.XSDdecimal)); - distribution.addProperty(DCTerms.format, ResourceFactory.createResource("http://publications.europa.eu/resource/authority/file-type/CSV")); - final Resource url = model.createResource("http://example.org/data.csv"); - distribution.addProperty(DCAT.accessURL, url); - distribution.addProperty(DCAT.downloadURL, url); - dataset.addProperty(DCAT.distribution, distribution); - - return dataset; + model.read(getClass().getResourceAsStream(resourceName), "https://opendata.schleswig-holstein.de/"); + return model.listSubjectsWithProperty(RDF.type, DCAT.Dataset).nextResource(); } + @Test public void testUpload() throws IOException { final ArgumentCaptor<JSONObject> argumentPackage = ArgumentCaptor.forClass(JSONObject.class); @@ -164,7 +60,7 @@ public class DcatUploaderTest { Mockito.when(ckanAPI.createResource(argumentResource.capture())).thenReturn("resource"); // invoke method - final String packageId = dcatUploader.upload(generateDataset()); + final String packageId = dcatUploader.upload(loadDataset("/dataset.xml")); final JSONObject jsonPackage = argumentPackage.getValue(); final JSONObject jsonResource = argumentResource.getValue(); @@ -199,6 +95,9 @@ public class DcatUploaderTest { assertEquals("CSV", jsonResource.getString("format")); assertEquals("http://dcat-ap.de/def/licenses/cc-by/4.0", jsonResource.getString("license")); assertEquals("ZIT-SH", jsonResource.getString("licenseAttributionByText")); + assertEquals("17f9aec62e8398c358b3d3a2deaef2a5", jsonResource.getString("hash")); + assertEquals("http://dcat-ap.de/def/hashAlgorithms/md/5", jsonResource.getString("hash_algorithm")); + } /** @@ -206,7 +105,7 @@ public class DcatUploaderTest { */ @Test public void testUpload_Collection() throws IOException { - final Resource dataset = generateDataset(); + final Resource dataset = loadDataset("/dataset.xml"); dataset.addProperty(DCTerms.isVersionOf, ResourceFactory.createResource("https://opendata.schleswig-holstein.de/dataset/mycollection")); final String expectedPackageId = UUID.randomUUID().toString(); @@ -228,7 +127,7 @@ public class DcatUploaderTest { Mockito.when(ckanAPI.createPackage(argumentPackage.capture())).thenReturn("demo"); // invoke method - dcatUploader.upload(generateDatasetWithGeometry()); + dcatUploader.upload(loadDataset("/dataset-with-geometry.xml")); final JSONObject jsonPackage = argumentPackage.getValue(); assertNotNull(jsonPackage);