From 8f0abd5dd5fb62fd9cf137a32cbe13013f3a0c6f Mon Sep 17 00:00:00 2001
From: Jesper Zedlitz <jesper@zedlitz.de>
Date: Tue, 20 Feb 2024 17:02:36 +0100
Subject: [PATCH] convert schema:startDate to dcat:startDate

---
 .../opendata/catalogproxy/CatalogFilter.java  | 31 +++++++++++++++++++
 .../catalogproxy/CatalogFilterTest.java       | 22 ++++++++++---
 2 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/src/main/java/de/landsh/opendata/catalogproxy/CatalogFilter.java b/src/main/java/de/landsh/opendata/catalogproxy/CatalogFilter.java
index 8cc4c02..14b02f2 100644
--- a/src/main/java/de/landsh/opendata/catalogproxy/CatalogFilter.java
+++ b/src/main/java/de/landsh/opendata/catalogproxy/CatalogFilter.java
@@ -79,6 +79,7 @@ public class CatalogFilter implements InitializingBean {
         addAccessRights(model);
         addRights(model);
         fixMediaType(model);
+        changeStartAndEndDate(model);
 
         return model;
     }
@@ -352,4 +353,34 @@ public class CatalogFilter implements InitializingBean {
         }
     }
 
+    /**
+     * In DCAT-AP.de 2 the startDate changed its namespace from schema.org to DCAT.
+     */
+    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);
+        while (it.hasNext()) {
+            Statement stmt = it.next();
+            oldStatements.add(stmt);
+            model.add(stmt.getSubject(), DCAT.startDate, stmt.getObject());
+        }
+        it.close();
+
+        Selector selectorEnd = new SimpleSelector(null, model.createProperty("http://schema.org/endDate"), (Object) null);
+        it = model.listStatements(selectorEnd);
+        while (it.hasNext()) {
+            Statement stmt = it.next();
+            oldStatements.add(stmt);
+            model.add(stmt.getSubject(), DCAT.endDate, stmt.getObject());
+        }
+        it.close();
+
+        for (Statement stmt : oldStatements) {
+            model.remove(stmt);
+        }
+
+    }
+
 }
diff --git a/src/test/java/de/landsh/opendata/catalogproxy/CatalogFilterTest.java b/src/test/java/de/landsh/opendata/catalogproxy/CatalogFilterTest.java
index b705fb0..eb94bba 100644
--- a/src/test/java/de/landsh/opendata/catalogproxy/CatalogFilterTest.java
+++ b/src/test/java/de/landsh/opendata/catalogproxy/CatalogFilterTest.java
@@ -1,9 +1,6 @@
 package de.landsh.opendata.catalogproxy;
 
-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.rdf.model.*;
 import org.apache.jena.riot.RDFLanguages;
 import org.apache.jena.riot.RDFParser;
 import org.apache.jena.riot.system.ErrorHandlerFactory;
@@ -263,4 +260,21 @@ public class CatalogFilterTest {
         assertNotNull(mediaType);
         assertEquals("https://www.iana.org/assignments/media-types/text/csv", mediaType.getURI());
     }
+
+
+    /**
+     * In DCAT-AP.de 2 the startDate changed its namespace from schema.org to DCAT.
+     */
+    @Test
+    public void dcatDate() throws IOException {
+        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());
+
+            Selector selectorDCAT = new SimpleSelector(null, DCAT.startDate, (Object) null);
+            assertTrue(model.listStatements(selectorDCAT).hasNext());
+        }
+    }
 }
-- 
GitLab