diff --git a/pom.xml b/pom.xml index 7671cc5fa4dd58d591f93671d1f3d29aff880c50..cd8e4c7c0b297ccfe5b41ff67f770bdd62c1aca3 100644 --- a/pom.xml +++ b/pom.xml @@ -1,21 +1,20 @@ <?xml version="1.0" encoding="utf-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> - <version>3.2.2</version> + <version>3.4.0</version> <relativePath /> </parent> <groupId>de.landsh.opendata</groupId> <artifactId>dcat-catalog-proxy</artifactId> - <version>1.3.0</version> + <version>1.4.0-SNAPSHOT</version> <name>dcat-catalog-proxy</name> <description>DCAT catalog proxy</description> <properties> <java.version>17</java.version> - <jena.version>4.7.0</jena.version> + <jena.version>5.2.0</jena.version> </properties> <dependencies> <dependency> @@ -80,6 +79,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/x <artifactId>snakeyaml</artifactId> <version>1.32</version> </dependency> + <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>2.18.0</version> + </dependency> </dependencies> </dependencyManagement> <build> @@ -92,7 +97,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/x <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> - <version>0.8.7</version> + <version>0.8.12</version> <executions> <execution> <id>coverage-initialize</id> @@ -157,7 +162,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/x <plugin> <groupId>org.owasp</groupId> <artifactId>dependency-check-maven</artifactId> - <version>7.4.4</version> + <version>11.1.0</version> <configuration> <suppressionFiles> <suppressionFile>owasp-suppressions.xml</suppressionFile> @@ -165,6 +170,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/x <failBuildOnCVSS>8</failBuildOnCVSS> <assemblyAnalyzerEnabled>false</assemblyAnalyzerEnabled> <failOnError>true</failOnError> + <nvdApiKey>${env.NVD_API_KEY}</nvdApiKey> </configuration> <executions> <execution> @@ -177,7 +183,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/x <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>versions-maven-plugin</artifactId> - <version>2.14.2</version> + <version>2.18.0</version> <configuration> <rulesUri>file:///${project.basedir}/rules.xml</rulesUri> </configuration> @@ -187,14 +193,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/x <artifactId>spotbugs-maven-plugin</artifactId> <version>4.5.3.0</version> </plugin> - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>versions-maven-plugin</artifactId> - <version>2.14.2</version> - <configuration> - <rulesUri>file:///${project.basedir}/rules.xml</rulesUri> - </configuration> - </plugin> </plugins> </build> </project> diff --git a/rules.xml b/rules.xml index f5be1873c4c6edd8ba93a4e86628febd3e61deaf..2b6901820718196b3ab82510f209fbb4721c5a93 100644 --- a/rules.xml +++ b/rules.xml @@ -11,15 +11,5 @@ <ignoreVersion type="regex">(?i).*M(?:-?\d+)?</ignoreVersion> </ignoreVersions> <rules> - - <!-- 4.7.0 is the last version that work. There is an additional rule for - IRIs in later versions that prevents some of CKAN's responses - to be parsed. --> - <rule groupId="org.apache.jena" comparisonMethod="maven"> - <ignoreVersions> - <ignoreVersion type="regex">4.[89].*</ignoreVersion> - <ignoreVersion type="regex">4.1[0-9].*</ignoreVersion> - </ignoreVersions> - </rule> </rules> </ruleset> diff --git a/src/main/java/de/landsh/opendata/catalogproxy/CatalogFilter.java b/src/main/java/de/landsh/opendata/catalogproxy/CatalogFilter.java index 14b02f209bd98555d42e0cdb53ca32d54c40146f..6e110a00dfa5517a298713cc88baed2c6bfe0155 100644 --- a/src/main/java/de/landsh/opendata/catalogproxy/CatalogFilter.java +++ b/src/main/java/de/landsh/opendata/catalogproxy/CatalogFilter.java @@ -14,6 +14,7 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import java.io.InputStream; +import java.nio.channels.Selector; import java.util.*; /** @@ -129,8 +130,9 @@ public class CatalogFilter implements InitializingBean { final Resource accessURL = distribution.getPropertyResourceValue(DCAT.accessURL); final Resource downloadURL = distribution.getPropertyResourceValue(DCAT.downloadURL); + final boolean hasAccessService = distribution.hasProperty(DCAT.accessService); - if (downloadURL == null) { + if (downloadURL == null && !hasAccessService) { distribution.addProperty(DCAT.downloadURL, accessURL); } } @@ -359,8 +361,7 @@ public class CatalogFilter implements InitializingBean { void changeStartAndEndDate(Model model) { LinkedList<Statement> oldStatements = new LinkedList<>(); - Selector selectorStart = new SimpleSelector(null, model.createProperty("http://schema.org/startDate"), (Object) null); - StmtIterator it = model.listStatements(selectorStart); + StmtIterator it = model.listStatements(null, model.createProperty("http://schema.org/startDate"), (String) null); while (it.hasNext()) { Statement stmt = it.next(); oldStatements.add(stmt); @@ -368,8 +369,7 @@ public class CatalogFilter implements InitializingBean { } it.close(); - Selector selectorEnd = new SimpleSelector(null, model.createProperty("http://schema.org/endDate"), (Object) null); - it = model.listStatements(selectorEnd); + it = model.listStatements(null, model.createProperty("http://schema.org/endDate"), (String) null); while (it.hasNext()) { Statement stmt = it.next(); oldStatements.add(stmt); diff --git a/src/main/java/de/landsh/opendata/catalogproxy/FilterInvalidRDF.java b/src/main/java/de/landsh/opendata/catalogproxy/FilterInvalidRDF.java index 0b9029532d3ae152d23c94d12b440992fbfc3779..f7ddae35a6f8c96389f4557095dc25fb2ce5a6f2 100644 --- a/src/main/java/de/landsh/opendata/catalogproxy/FilterInvalidRDF.java +++ b/src/main/java/de/landsh/opendata/catalogproxy/FilterInvalidRDF.java @@ -1,6 +1,11 @@ package de.landsh.opendata.catalogproxy; +import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.jena.irix.IRIException; +import org.apache.jena.irix.IRIs; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.IOException; @@ -10,8 +15,9 @@ import java.nio.charset.StandardCharsets; public class FilterInvalidRDF extends InputStream { - private static final String RDF_ABOUT_DOUBLE_QUOTE = "rdf:about=\""; - private static final String RDF_ABOUT_SINGLE_QUOTE = "rdf:about='"; + + private static final Logger log = LoggerFactory.getLogger(FilterInvalidRDF.class); + private final BufferedReader reader; boolean initialized = false; private byte[] currentLine = null; @@ -40,27 +46,51 @@ public class FilterInvalidRDF extends InputStream { line = StringUtils.join(fragments, "&"); } + line = fixRdfAbout(line, "about"); + return fixRdfAbout(line, "resource"); + } + + private static String fixRdfAbout(String line, String propertyName) { + final String propertyWithDoubleQuote = "rdf:" + propertyName + "=\""; + final String propertyWithSingleQuote = "rdf:" + propertyName + "='"; + String before = null; String iri = null; String after = null; - if (line.contains(RDF_ABOUT_DOUBLE_QUOTE)) { - before = StringUtils.substringBefore(line, RDF_ABOUT_DOUBLE_QUOTE) + RDF_ABOUT_DOUBLE_QUOTE; - iri = StringUtils.substringBetween(line, RDF_ABOUT_DOUBLE_QUOTE, "\""); - after = "\"" + StringUtils.substringAfter(StringUtils.substringAfter(line, RDF_ABOUT_DOUBLE_QUOTE), "\""); - } else if (line.contains(RDF_ABOUT_SINGLE_QUOTE)) { - before = StringUtils.substringBefore(line, RDF_ABOUT_DOUBLE_QUOTE) + RDF_ABOUT_SINGLE_QUOTE; - iri = StringUtils.substringBetween(line, RDF_ABOUT_DOUBLE_QUOTE, "'"); - after = "'" + StringUtils.substringAfter(StringUtils.substringAfter(line, RDF_ABOUT_DOUBLE_QUOTE), "'"); + if (line.contains(propertyWithDoubleQuote)) { + before = StringUtils.substringBefore(line, propertyWithDoubleQuote) + propertyWithDoubleQuote; + iri = StringUtils.substringBetween(line, propertyWithDoubleQuote, "\""); + after = "\"" + StringUtils.substringAfter(StringUtils.substringAfter(line, propertyWithDoubleQuote), "\""); + } else if (line.contains(propertyWithSingleQuote)) { + before = StringUtils.substringBefore(line, propertyWithDoubleQuote) + propertyWithSingleQuote; + iri = StringUtils.substringBetween(line, propertyWithDoubleQuote, "'"); + after = "'" + StringUtils.substringAfter(StringUtils.substringAfter(line, propertyWithDoubleQuote), "'"); } if (iri == null) { return line; } else { - final String fixedIRI = iri.replaceAll(" ", "%20"); - return before + fixedIRI + after; + + return before + fixIRI(iri) + after; } } + private static String fixIRI(String iri) { + String result = iri.replaceAll(" ", "%20"); + + try { + IRIs.reference(result); + } catch (IRIException e) { + log.info("Found a really bad IRI: '{}'", iri); + + // A reliable way to turn any text (even a broken URI) into a URI is to use a hash value. + + result = "urn:" + DigestUtils.md5Hex(iri); + } + + return result; + } + private void readNextLine() throws IOException { final String line = reader.readLine(); if (line == null) { @@ -96,7 +126,7 @@ public class FilterInvalidRDF extends InputStream { index++; return '\n'; } - + byte result = currentLine[index]; index++; return result; diff --git a/src/test/java/de/landsh/opendata/catalogproxy/CatalogFilterTest.java b/src/test/java/de/landsh/opendata/catalogproxy/CatalogFilterTest.java index eb94bbae5ea410c0a534f55d2004a2c84eb2b73b..eeb950bae8420f82d07d17b78eafeb3537df89d5 100644 --- a/src/test/java/de/landsh/opendata/catalogproxy/CatalogFilterTest.java +++ b/src/test/java/de/landsh/opendata/catalogproxy/CatalogFilterTest.java @@ -1,6 +1,9 @@ package de.landsh.opendata.catalogproxy; -import org.apache.jena.rdf.model.*; +import org.apache.jena.rdf.model.Model; +import org.apache.jena.rdf.model.ModelFactory; +import org.apache.jena.rdf.model.ResIterator; +import org.apache.jena.rdf.model.Resource; import org.apache.jena.riot.RDFLanguages; import org.apache.jena.riot.RDFParser; import org.apache.jena.riot.system.ErrorHandlerFactory; @@ -270,11 +273,53 @@ public class CatalogFilterTest { try (final InputStream inputStream = getClass().getResourceAsStream("/catalog.xml")) { final Model model = catalogFilter.work(inputStream); - Selector selectorSchema = new SimpleSelector(null, model.createProperty("http://schema.org/startDate"), (Object) null); - assertFalse(model.listStatements(selectorSchema).hasNext()); + assertFalse(model.listStatements(null, model.createProperty("http://schema.org/startDate"), (String) null).hasNext()); + assertTrue(model.listStatements(null, DCAT.startDate, (String) null).hasNext()); + } + } - Selector selectorDCAT = new SimpleSelector(null, DCAT.startDate, (Object) null); - assertTrue(model.listStatements(selectorDCAT).hasNext()); + /** + * A data service must be preserved. + */ + @Test + public void dataservice() throws IOException { + try (final InputStream inputStream = getClass().getResourceAsStream("/dataservice.xml")) { + final Model model = catalogFilter.work(inputStream); + + assertEquals(1, model.listStatements(null, RDF.type, DCAT.Dataset).toList().size(), "one dcat:Dataset"); + assertEquals(4, model.listStatements(null, RDF.type, DCAT.Distribution).toList().size(), "four dcat:Distribution"); + assertEquals(2, model.listStatements(null, RDF.type, DCAT.DataService).toList().size(), "two dcat:DataService"); } } + + /** + * In case of a dcat:DataService no dcat:downloadURL must be added to a dcat:Distribution + * <a href="https://www.dcat-ap.de/def/dcatde/2.0/implRules/#konvention-41">Konvention 41</a> states that a + * dcat:Distribution MUST NOT have a dcat:downloadURL property. + */ + @Test + public void addDownloadURLs_DataService() { + final Model model = parseRdf(getClass().getResourceAsStream("/dataservice.xml")); + + catalogFilter.addDownloadURLs(model); + + Resource distributionWithService1 = model.getResource("https://umweltgeodienste.schleswig-holstein.de/WMS_UWAT_NAT?"); + Resource distributionWithService2 = model.getResource("https://umweltgeodienste.schleswig-holstein.de/WFS_UWAT?"); + Resource distributionWithoutService1 = model.getResource("https://umweltgeodienste.schleswig-holstein.de/WFS_UWAT?service=wfs&version=2.0.0&request=GetFeature&typeNames=app:ramsar"); + Resource distributionWithoutService2 = model.getResource("https://opendata.schleswig-holstein.de/data/llur55/ramsar_utm32.zip"); + + assertTrue(distributionWithService1.hasProperty(DCAT.accessURL)); + assertTrue(distributionWithService1.hasProperty(DCAT.accessService)); + assertFalse(distributionWithService1.hasProperty(DCAT.downloadURL), "a dcat:Distribution with a dcat:DataService MUST NOT have a dcat:downloadURL"); + + assertTrue(distributionWithService2.hasProperty(DCAT.accessURL)); + assertTrue(distributionWithService2.hasProperty(DCAT.accessService)); + assertFalse(distributionWithService2.hasProperty(DCAT.downloadURL), "a dcat:Distribution with a dcat:DataService MUST NOT have a dcat:downloadURL"); + + assertTrue(distributionWithoutService1.hasProperty(DCAT.accessURL)); + assertTrue(distributionWithoutService1.hasProperty(DCAT.downloadURL)); + + assertTrue(distributionWithoutService2.hasProperty(DCAT.accessURL)); + assertTrue(distributionWithoutService2.hasProperty(DCAT.downloadURL)); + } } diff --git a/src/test/resources/dataservice.xml b/src/test/resources/dataservice.xml new file mode 100644 index 0000000000000000000000000000000000000000..402f3a96721baccd026cde3252e5f579880edbf6 --- /dev/null +++ b/src/test/resources/dataservice.xml @@ -0,0 +1,353 @@ +<rdf:RDF + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:j.0="http://data.europa.eu/r5r/" + xmlns:locn="http://www.w3.org/ns/locn#" + xmlns:schema="http://schema.org/" + xmlns:dct="http://purl.org/dc/terms/" + xmlns:adms="http://www.w3.org/ns/adms#" + xmlns:vcard="http://www.w3.org/2006/vcard/ns#" + xmlns:cnt="http://www.w3.org/2011/content#" + xmlns:geosparql="http://www.opengis.net/ont/geosparql#" + xmlns:dcat="http://www.w3.org/ns/dcat#" + xmlns:hydra="http://www.w3.org/ns/hydra/core#" + xmlns:foaf="http://xmlns.com/foaf/0.1/" + xmlns:dcatde="http://dcat-ap.de/def/dcatde/"> + <dcat:Catalog> + <dcat:dataset> + <dcat:Dataset rdf:about="http://registry.gdi-de.org/id/de.sh/5171691F-F2F0-40F0-9009-FDDD25A9B8B5"> + <dcat:contactPoint> + <vcard:Organization> + <vcard:hasAddress> + <vcard:Address> + <vcard:region>Schleswig-Holstein</vcard:region> + <vcard:postal-code>D-24220</vcard:postal-code> + <vcard:locality>Flintbek</vcard:locality> + <vcard:street-address>Hamburger Chaussee 25</vcard:street-address> + </vcard:Address> + </vcard:hasAddress> + <vcard:hasTelephone> + <vcard:Voice> + <vcard:hasValue rdf:resource="tel:+49-4347-704-337"/> + </vcard:Voice> + </vcard:hasTelephone> + <vcard:hasURL rdf:resource="https://www.schleswig-holstein.de/DE/landesregierung/ministerien-behoerden/LFU/organisation/abteilungen/abteilung5_naturschutz.html"/> + <vcard:hasEmail rdf:resource="mailto:thomas.holzhueter@lfu.landsh.de"/> + <vcard:fn>Landesamt für Umwelt des Landes Schleswig-Holstein (LfU)</vcard:fn> + </vcard:Organization> + </dcat:contactPoint> + <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime" + >2014-11-24T00:00:00.000+01:00</dct:issued> + <adms:identifier>5171691F-F2F0-40F0-9009-FDDD25A9B8B5</adms:identifier> + <dcatde:contributorID rdf:resource="https://umweltportal.schleswig-holstein.de"/> + <dct:identifier>5171691F-F2F0-40F0-9009-FDDD25A9B8B5</dct:identifier> + <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/> + <dcat:keyword xml:lang="de">Geoinformation</dcat:keyword> + <dct:title xml:lang="de">RAMSAR Gebiete in Schleswig-Holstein LfU</dct:title> + <dcat:distribution> + <dcat:Distribution rdf:about="https://umweltgeodienste.schleswig-holstein.de/WMS_UWAT_NAT?"> + <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0"/> + <dcatde:licenseAttributionByText>LfU-SH</dcatde:licenseAttributionByText> + <dct:format rdf:resource="http://publications.europa.eu/resource/authority/file-type/WMS_SRVC"/> + <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#date" + >2024-01-12</dct:modified> + <dct:description xml:lang="de">Dieser Dienst enthält öffentlich verfügbare Naturschutzdaten der Abteilung 5 - Naturschutz des LfU-SH. Informationen zu den einzelnen Karten können jeweils den zugehörigen Metadaten zu den einzelnen Datensätzen entnommen werden. Der Dienst wird regelmäßig um neu publizierte Daten erweitert.</dct:description> + <dct:title xml:lang="de">WMS Fachthema Naturschutz</dct:title> + <dcat:accessService> + <dcat:DataService rdf:about="http://registry.gdi-de.org/id/de.sh/4A3E2A99-2771-4855-A3A3-484267A32BDA"> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/a3bdfb16-cf74-4c9e-85d2-01554a32543b"/> + <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#date" + >2024-01-12</dct:modified> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/caac9581-7cb3-4515-930a-66f05a56ed5d"/> + <dcatde:contributorID rdf:resource="https://umweltportal.schleswig-holstein.de"/> + <dcatde:licenseAttributionByText>LfU-SH</dcatde:licenseAttributionByText> + <dct:description xml:lang="de">Dieser Dienst enthält öffentlich verfügbare Naturschutzdaten der Abteilung 5 - Naturschutz des LfU-SH. Informationen zu den einzelnen Karten können jeweils den zugehörigen Metadaten zu den einzelnen Datensätzen entnommen werden. Der Dienst wird regelmäßig um neu publizierte Daten erweitert.</dct:description> + <dcat:keyword xml:lang="de">FFH</dcat:keyword> + <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/> + <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date" + >2024-01-12</dct:issued> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/fad5fbb6-fab8-42a0-82ff-ee977a6de67a"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/4611e8be-7ba9-4317-87dc-5716ddf2bbdc"/> + <dct:title xml:lang="de">WMS Fachthema Naturschutz</dct:title> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/345E5BBD-4173-47C9-87C6-5E6F6EC0233D"/> + <dcat:keyword xml:lang="de">Kompensationskataster</dcat:keyword> + <dcat:servesDataset rdf:resource="http://portalu.de/igc_sh#Schleswig-Holstein:6782583C-9747-4C16-B94D-3EAF2BFDB171"/> + <dcat:keyword xml:lang="de">SPA</dcat:keyword> + <dcat:servesDataset rdf:resource="http://portalu.de/igc_2/116fc192-36ab-4ad4-b3c7-1421eb5fc2de"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/afcb00c7-ee70-4575-be47-bdd9d0619820"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/3F21DC89-3711-4434-88AE-D194B34DB700"/> + <dct:identifier>4A3E2A99-2771-4855-A3A3-484267A32BDA</dct:identifier> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/a9b4ef28-f26b-48a0-bd80-0062b7ab3bf2"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/93ccf530-f3c5-4e63-865e-2f9cac0f2a1c"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/eec2e842-7b78-42dd-afcc-2d5f63cd8230"/> + <dcat:keyword xml:lang="de">infoMapAccessService</dcat:keyword> + <dcat:servesDataset rdf:resource="http://portalu.de/igc_sh#Schleswig-Holstein:3F1EF043-6AAF-4E70-9752-3D115E974937"/> + <dcat:contactPoint> + <vcard:Organization> + <vcard:hasAddress> + <vcard:Address> + <vcard:country-name>DEU</vcard:country-name> + <vcard:region>Schleswig-Holstein</vcard:region> + <vcard:postal-code>24106</vcard:postal-code> + <vcard:locality>Kiel</vcard:locality> + <vcard:street-address>Mercatorstraße 3</vcard:street-address> + </vcard:Address> + </vcard:hasAddress> + <vcard:hasEmail rdf:resource="mailto:info.umweltportal@mekun.landsh.de"/> + <vcard:fn>Ministerium für Energiewende, Klimaschutz, Umwelt und Natur (MEKUN)</vcard:fn> + </vcard:Organization> + </dcat:contactPoint> + <cnt:characterEncoding>utf8</cnt:characterEncoding> + <dct:temporal> + <dct:PeriodOfTime> + <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date" + >2024-01-12</schema:startDate> + </dct:PeriodOfTime> + </dct:temporal> + <dcat:keyword xml:lang="de">ENVI</dcat:keyword> + <dcat:endpointURL rdf:resource="https://umweltgeodienste.schleswig-holstein.de/WMS_UWAT_NAT?"/> + <dct:conformsTo rdf:resource="http://www.opengis.net/def/crs/EPSG/0/25832"/> + <dct:publisher> + <foaf:Organization> + <locn:address> + <locn:Address> + <locn:adminUnitL1>DEU</locn:adminUnitL1> + <locn:adminUnitL2>Schleswig-Holstein</locn:adminUnitL2> + <locn:postCode>24106</locn:postCode> + <locn:postName>Kiel</locn:postName> + <locn:thoroughfare>Mercatorstraße 3</locn:thoroughfare> + </locn:Address> + </locn:address> + <foaf:mbox rdf:resource="mailto:info.umweltportal@mekun.landsh.de"/> + <foaf:name>Ministerium für Energiewende, Klimaschutz, Umwelt und Natur (MEKUN)</foaf:name> + </foaf:Organization> + </dct:publisher> + <adms:identifier>4A3E2A99-2771-4855-A3A3-484267A32BDA</adms:identifier> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/fef8d4fa-bd74-4770-91f6-ffe19191fbd5"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/9E93F6BA-7C4E-4CFF-90E5-C27730CB4A3A"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/ab2c9b8a-da13-41c7-a513-87e3de90c1f0"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/cee4a266-e841-4feb-a405-21fe3e410971"/> + <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/ENVI"/> + <dcat:keyword xml:lang="de">RAMSAR</dcat:keyword> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/11ef5ed8-d869-437d-9d1a-bbe21b2a496d"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/954ff9f5-f56c-44e8-bf88-1ccfbd315803"/> + <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/94b31c6c-a367-4ee8-9103-246465c83041"/> + </dcat:DataService> + </dcat:accessService> + <dcat:accessURL rdf:resource="https://umweltgeodienste.schleswig-holstein.de/WMS_UWAT_NAT?"/> + </dcat:Distribution> + </dcat:distribution> + <dcat:keyword xml:lang="de">inspireidentifiziert</dcat:keyword> + <dct:type rdf:resource="http://inspire.ec.europa.eu/metadata-codelist/ResourceType/dataset"/> + <cnt:characterEncoding>utf8</cnt:characterEncoding> + <dcatde:licenseAttributionByText>LLUR SH</dcatde:licenseAttributionByText> + <dcat:distribution> + <dcat:Distribution rdf:about="https://umweltgeodienste.schleswig-holstein.de/WFS_UWAT?"> + <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0"/> + <dcatde:licenseAttributionByText>LfU-SH</dcatde:licenseAttributionByText> + <dct:format rdf:resource="http://publications.europa.eu/resource/authority/file-type/WFS_SRVC"/> + <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#date" + >2023-12-20</dct:modified> + <dct:description xml:lang="de">Downloaddienste (WFS) zu den verschiedenen Fachthemen im Umweltportal SH</dct:description> + <dct:title xml:lang="de">WFS Fachthemen Umwelt</dct:title> + <dcat:accessService> + <dcat:DataService rdf:about="http://registry.gdi-de.org/id/de.sh/E7ABB1D0-A702-4470-8F0A-F3AAB8AEEDB3"> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/0d046287-f6b3-4969-b68b-6b23e84c0794"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/1342afbc-7c46-4ed9-bf20-9b52dfd8e231"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/53da48ca-e329-4e32-9832-5838f966c727"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/bcf2253c-a7fb-4721-8497-153450eaba4c"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/71bc8a31-3f47-46df-924c-615844e3e9bc"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/ef2de277-d6ec-49d3-9751-a0681a8967bf"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/32aeae5d-fa79-4fcc-9243-08dfc1b7c678"/> + <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime" + >2023-09-22T00:00:00.000+02:00</dct:issued> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/751bc97f-a8dc-4f37-a4e4-43a2dc9b284f"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/345E5BBD-4173-47C9-87C6-5E6F6EC0233D"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/fad124f9-c775-4f3a-9031-3a4726efb53c"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/954ff9f5-f56c-44e8-bf88-1ccfbd315803"/> + <dcat:endpointURL rdf:resource="https://umweltgeodienste.schleswig-holstein.de/WFS_UWAT?"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/31460ffe-2eaa-4de0-948f-8131c5dfd555"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/e4e6df1a-c7a1-43e1-a505-dad8beeeb4e5"/> + <dct:publisher> + <foaf:Organization> + <locn:address> + <locn:Address> + <locn:adminUnitL1>DEU</locn:adminUnitL1> + <locn:adminUnitL2>Schleswig-Holstein</locn:adminUnitL2> + <locn:postCode>24106</locn:postCode> + <locn:postName>Kiel</locn:postName> + <locn:thoroughfare>Mercatorstraße 3</locn:thoroughfare> + </locn:Address> + </locn:address> + <foaf:mbox rdf:resource="mailto:tobias.kuring@mekun.landsh.de"/> + <foaf:name>Ministerium für Energiewende, Klimaschutz, Umwelt und Natur (MEKUN)</foaf:name> + </foaf:Organization> + </dct:publisher> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/c8b262ff-8db1-474f-aed1-d8cb89c0353b"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/c0b09bac-6a9f-42e0-8c54-1ad69a475019"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/8f57d1fc-a319-44c3-a99e-7fb595c923a9"/> + <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/44106bda-0c83-40c8-8894-15f4d2fe800d"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/0fe57715-ef1d-45ec-9bec-cb089a135920"/> + <dct:identifier>E7ABB1D0-A702-4470-8F0A-F3AAB8AEEDB3</dct:identifier> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/fad5fbb6-fab8-42a0-82ff-ee977a6de67a"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/a3bdfb16-cf74-4c9e-85d2-01554a32543b"/> + <dct:temporal> + <dct:PeriodOfTime> + <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime" + >2023-09-22T00:00:00.000+02:00</schema:startDate> + </dct:PeriodOfTime> + </dct:temporal> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/afcb00c7-ee70-4575-be47-bdd9d0619820"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/a96372cf-da92-47ce-963d-999c90a03d95"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/3F21DC89-3711-4434-88AE-D194B34DB700"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/67957c98-eb6f-4bc6-b8e2-7cc9bb70cd84"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/efa21515-e182-4b30-b712-9c0ace395763"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/76eac324-c621-41b1-b2d5-54ca73292046"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/ab2c9b8a-da13-41c7-a513-87e3de90c1f0"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/11ef5ed8-d869-437d-9d1a-bbe21b2a496d"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/7e47bc24-817d-4cd5-98d9-f944f3905e68"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc_sh#Schleswig-Holstein:6782583C-9747-4C16-B94D-3EAF2BFDB171"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/ce489700-c9d8-48a4-8738-411205b93be9"/> + <dcat:contactPoint> + <vcard:Organization> + <vcard:hasAddress> + <vcard:Address> + <vcard:country-name>DEU</vcard:country-name> + <vcard:region>Schleswig-Holstein</vcard:region> + <vcard:postal-code>24106</vcard:postal-code> + <vcard:locality>Kiel</vcard:locality> + <vcard:street-address>Mercatorstraße 3</vcard:street-address> + </vcard:Address> + </vcard:hasAddress> + <vcard:hasEmail rdf:resource="mailto:tobias.kuring@mekun.landsh.de"/> + <vcard:fn>Ministerium für Energiewende, Klimaschutz, Umwelt und Natur (MEKUN)</vcard:fn> + </vcard:Organization> + </dcat:contactPoint> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/eec2e842-7b78-42dd-afcc-2d5f63cd8230"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/7d36cab6-e344-465e-994d-c7bacff450dd"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/39bd5e67-f445-461d-8bcf-81777294107a"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/a8ab5172-f03b-4260-a087-43fbbca857a4"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/47868c16-745f-42bf-b55f-6322803bdb20"/> + <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc_sh#Schleswig-Holstein:3F1EF043-6AAF-4E70-9752-3D115E974937"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/e5f96ae0-7b41-49c4-b7ef-c5958bf85dfa"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/d40c7ed6-2338-41b6-ba73-f6473c687361"/> + <dcat:keyword xml:lang="de">WFS</dcat:keyword> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/94b31c6c-a367-4ee8-9103-246465c83041"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/558b7b71-0f44-4d46-a5f2-486041d5e4bd"/> + <dcatde:licenseAttributionByText>LfU-SH</dcatde:licenseAttributionByText> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/9E93F6BA-7C4E-4CFF-90E5-C27730CB4A3A"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/d2d33b92-38c2-4526-9aea-8036bcf9efa4"/> + <dcat:keyword xml:lang="de">ENVI</dcat:keyword> + <dcat:keyword xml:lang="de">Boden</dcat:keyword> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/cee4a266-e841-4feb-a405-21fe3e410971"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/55e36ae5-ee1a-4425-8ac2-2ed4d9f300cf"/> + <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#date" + >2023-12-20</dct:modified> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/fef8d4fa-bd74-4770-91f6-ffe19191fbd5"/> + <dct:conformsTo rdf:resource="http://www.opengis.net/def/crs/EPSG/0/25832"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/f1e38239-3ec3-424d-a44e-d716a7e9587c"/> + <dcat:keyword xml:lang="de">Geologie</dcat:keyword> + <cnt:characterEncoding>utf8</cnt:characterEncoding> + <dct:title xml:lang="de">WFS Fachthemen Umwelt</dct:title> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/6f5e8b2b-5b8e-44a0-ac9f-8f5ffc22843a"/> + <dcat:keyword xml:lang="de">infoFeatureAccessService</dcat:keyword> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/8de2b3c3-29ae-40ec-ab4f-d57e60dd22c2"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/93ccf530-f3c5-4e63-865e-2f9cac0f2a1c"/> + <dct:description xml:lang="de">Downloaddienste (WFS) zu den verschiedenen Fachthemen im Umweltportal SH</dct:description> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/ed1bb096-e07c-48d3-98d2-5e604ae648fa"/> + <dcatde:contributorID rdf:resource="https://umweltportal.schleswig-holstein.de"/> + <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/ENVI"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/c44ac6ea-7809-4754-99d4-05ee0ab437a0"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/584a9887-2b26-43cf-b911-d48e2b1f665f"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/a30355be-e649-402f-a871-5798bda2f799"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/717811ae-ddf4-4fce-9dd7-9ababab3996c"/> + <adms:identifier>E7ABB1D0-A702-4470-8F0A-F3AAB8AEEDB3</adms:identifier> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/a8bf4ce5-d93f-4f87-96aa-c1010364c0cb"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/caac9581-7cb3-4515-930a-66f05a56ed5d"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/a9b4ef28-f26b-48a0-bd80-0062b7ab3bf2"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/4611e8be-7ba9-4317-87dc-5716ddf2bbdc"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/d10bf481-06f3-4615-b1f7-1808990a3c2e"/> + <dcat:servesDataset rdf:resource="http://portalu.de/igc/d07c84b3-0d1f-4620-b459-8a4b5ba1d0f7"/> + </dcat:DataService> + </dcat:accessService> + <dcat:accessURL rdf:resource="https://umweltgeodienste.schleswig-holstein.de/WFS_UWAT?"/> + </dcat:Distribution> + </dcat:distribution> + <dct:conformsTo rdf:resource="http://www.opengis.net/def/crs/EPSG/0/4647"/> + <dct:spatial> + <dct:Location> + <locn:geometry rdf:datatype="http://www.opengis.net/ont/geosparql#wktLiteral" + >POLYGON((7.87 55.06,11.31 55.06,11.31 53.36,7.87 53.36,7.87 55.06))</locn:geometry> + </dct:Location> + </dct:spatial> + <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#date" + >2024-11-04</dct:modified> + <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/ENVI"/> + <dcat:distribution> + <dcat:Distribution rdf:about="https://umweltgeodienste.schleswig-holstein.de/WFS_UWAT?service=wfs&version=2.0.0&request=GetFeature&typeNames=app:ramsar"> + <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0"/> + <dcatde:licenseAttributionByText>LLUR SH</dcatde:licenseAttributionByText> + <dct:format rdf:resource="http://publications.europa.eu/resource/authority/file-type/GML"/> + <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#date" + >2024-11-04</dct:modified> + <dct:title>WFS RAMSAR Gebiete</dct:title> + <dcat:downloadURL rdf:resource="https://umweltgeodienste.schleswig-holstein.de/WFS_UWAT?service=wfs&version=2.0.0&request=GetFeature&typeNames=app:ramsar"/> + <dcat:accessURL rdf:resource="https://umweltgeodienste.schleswig-holstein.de/WFS_UWAT?service=wfs&version=2.0.0&request=GetFeature&typeNames=app:ramsar"/> + </dcat:Distribution> + </dcat:distribution> + <dct:temporal> + <dct:PeriodOfTime> + <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime" + >2014-11-24T00:00:00.000+01:00</schema:startDate> + </dct:PeriodOfTime> + </dct:temporal> + <dcat:keyword xml:lang="de">Schutzgebiete</dcat:keyword> + <dct:accrualPeriodicity rdf:resource="http://publications.europa.eu/resource/authority/frequency/IRREG"/> + <j.0:applicableLegislation rdf:resource="http://data.europa.eu/eli/dir/2007/2/2019-06-26"/> + <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0"/> + <dct:publisher> + <foaf:Organization> + <locn:address> + <locn:Address> + <locn:adminUnitL2>Schleswig-Holstein</locn:adminUnitL2> + <locn:postCode>D-24220</locn:postCode> + <locn:postName>Flintbek</locn:postName> + <locn:thoroughfare>Hamburger Chaussee 25</locn:thoroughfare> + </locn:Address> + </locn:address> + <foaf:homepage rdf:resource="https://www.schleswig-holstein.de/DE/landesregierung/ministerien-behoerden/LFU/organisation/abteilungen/abteilung5_naturschutz.html"/> + <foaf:phone rdf:resource="tel:+49-4347-704-337"/> + <foaf:mbox rdf:resource="mailto:thomas.holzhueter@lfu.landsh.de"/> + <foaf:name>Landesamt für Umwelt des Landes Schleswig-Holstein (LfU)</foaf:name> + </foaf:Organization> + </dct:publisher> + <dcat:keyword xml:lang="de">Karte</dcat:keyword> + <dcat:distribution> + <dcat:Distribution rdf:about="https://opendata.schleswig-holstein.de/data/llur55/ramsar_utm32.zip"> + <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0"/> + <dcatde:licenseAttributionByText>LLUR SH</dcatde:licenseAttributionByText> + <dct:format rdf:resource="http://publications.europa.eu/resource/authority/file-type/SHP"/> + <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#date" + >2024-11-04</dct:modified> + <dct:title>RAMSAR Gebiete</dct:title> + <dcat:downloadURL rdf:resource="https://opendata.schleswig-holstein.de/data/llur55/ramsar_utm32.zip"/> + <dcat:accessURL rdf:resource="https://opendata.schleswig-holstein.de/data/llur55/ramsar_utm32.zip"/> + </dcat:Distribution> + </dcat:distribution> + <dct:accessRights rdf:resource="http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/noLimitations"/> + <dcat:keyword xml:lang="de">ENVI</dcat:keyword> + <dct:description xml:lang="de">Die 1971 in Ramsar (Iran) unterzeichnete internationale "Convention on Wetlands" ist eine zwischenstaatliche Vereinbarung zur Erhaltung und umweltverträglicher Nutzung von Feuchtgebieten und deren Resourcen. Ratifizierung durch die BRD 1976. Das Ramsar-Abkommen verpflichtet die Vertragsstaaten zur Erhaltung und Förderung von Feuchtgebieten u.a. durch Benennung von Gebieten, die den Ramsar-Kriterien entsprechen. In Schleswig-Holstein ist das Gebiet "Schleswig-Holsteinisches Wattenmeer und angrenzende Gebiete" am 15.11.1991 offiziell benannt worden.</dct:description> + </dcat:Dataset> + </dcat:dataset> + </dcat:Catalog> + <hydra:PagedCollection rdf:about="https://opendata-stage.schleswig-holstein.de/csw2dcat/2/catalog.xml?page=1&Identifier=5171691F-F2F0-40F0-9009-FDDD25A9B8B5&Subject=opendata"> + <hydra:lastPage rdf:resource="https://opendata-stage.schleswig-holstein.de/csw2dcat/2/catalog.xml?page=1&Identifier=5171691F-F2F0-40F0-9009-FDDD25A9B8B5&Subject=opendata"/> + <hydra:firstPage rdf:resource="https://opendata-stage.schleswig-holstein.de/csw2dcat/2/catalog.xml?page=1&Identifier=5171691F-F2F0-40F0-9009-FDDD25A9B8B5&Subject=opendata"/> + <hydra:totalItems rdf:datatype="http://www.w3.org/2001/XMLSchema#int" + >1</hydra:totalItems> + <hydra:itemsPerPage rdf:datatype="http://www.w3.org/2001/XMLSchema#int" + >50</hydra:itemsPerPage> + </hydra:PagedCollection> +</rdf:RDF>