From c9cb6e07fe13a6fd88e7643514f061572acf26c7 Mon Sep 17 00:00:00 2001
From: "Stefan E. Funk" <funk@sub.uni-goettingen.de>
Date: Fri, 18 Oct 2019 18:05:27 +0200
Subject: [PATCH] =?UTF-8?q?Only=20include=20schemaLocations=20if=20dc=20an?=
 =?UTF-8?q?d=20oai=5Fdc=20used=20in=20response.=20Thought=20prefixes=20are?=
 =?UTF-8?q?=20always=20plotted.=20Hm.=20Doesn=C3=84t=20matter.=20I=20hsupp?=
 =?UTF-8?q?ose.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../info/textgrid/middleware/OAIPMHImpl.java  | 32 +++++++++++++------
 .../textgrid/middleware/OAIPMHProducer.java   |  6 ++--
 .../textgrid/middleware/OaiPmhClient.java     |  2 --
 .../info/textgrid/middleware/OaiPmhTest.java  |  1 +
 4 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHImpl.java b/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHImpl.java
index e3b59855..d68b47d9 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHImpl.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHImpl.java
@@ -41,10 +41,12 @@ public class OAIPMHImpl implements OAIPMHProducer {
   // FINALS
   // **
 
-  private static final String SCHEMA_LOCATIONS =
-      "http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd "
-          + "http://www.openarchives.org/OAI/2.0/ https://www.openarchives.org/OAI/2.0/OAI-PMH.xsd "
-          + "http://purl.org/dc/elements/1.1/ https://dublincore.org/schemas/xmls/simpledc20021212.xsd";
+  private static final String OAIPMH_SCHEMA_LOCATION =
+      "http://www.openarchives.org/OAI/2.0/ https://www.openarchives.org/OAI/2.0/OAI-PMH.xsd";
+  private static final String OAIDC_SCHEMA_LOCATION =
+      "http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd";
+  private static final String DC_SCHEMA_LOCATION =
+      "http://purl.org/dc/elements/1.1/ https://dublincore.org/schemas/xmls/simpledc20021212.xsd";
 
   // **
   // STATICS
@@ -117,7 +119,7 @@ public class OAIPMHImpl implements OAIPMHProducer {
     String result = "";
 
     try {
-      result = getStringFromJAXBOAIElement(
+      result = getStringFromJAXBOAIElement(verb,
           handleRequest(verb, identifier, metadataPrefix, set, from, until, resumptionToken));
     } catch (ParseException e) {
       // TODO Auto-generated catch block
@@ -139,7 +141,7 @@ public class OAIPMHImpl implements OAIPMHProducer {
     String result = "";
 
     try {
-      result = getStringFromJAXBOAIElement(
+      result = getStringFromJAXBOAIElement(verb,
           handleRequest(verb, identifier, metadataPrefix, set, from, until, resumptionToken));
     } catch (ParseException e) {
       // TODO Auto-generated catch block
@@ -658,21 +660,33 @@ public class OAIPMHImpl implements OAIPMHProducer {
    * other way has been working here! I tried EVERYTHING else! Really!
    * </p>
    * 
+   * @param theVerb
    * @param theJAXBOAIElement
    * @return
    */
-  private static String getStringFromJAXBOAIElement(
+  private static String getStringFromJAXBOAIElement(final String theVerb,
       final JAXBElement<OAIPMHtype> theJAXBOAIElement) {
 
     String result = "";
 
+    // Always add OAIPMH schema location.
+    String schemaLocations = OAIPMH_SCHEMA_LOCATION;
+    // Add OAI_DC and DC schema location if needed.
+    if (theVerb.equals("GetRecord") || theVerb.endsWith("ListRecords")) {
+      schemaLocations += OAIDC_SCHEMA_LOCATION + " " + DC_SCHEMA_LOCATION;
+    }
+
+    // PLEASE NOTE We always get oai_dc and dc prefixes defined in the root element due to the
+    // bindings.xml file. Seems to be no problem for the time being.
+
     try {
-      // FIXME GEMOKEL: Add schemaLocations to OAI root element.
+      // OBACHT! GEMOKEL! Add schemaLocations to OAI root element here!
       JAXBContext jc = JAXBContext.newInstance(OAIPMHtype.class);
 
       Marshaller marshaller = jc.createMarshaller();
+      // Comment out if one-line-output wanted!
       marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-      marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, SCHEMA_LOCATIONS);
+      marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, schemaLocations);
 
       StringWriter sw = new StringWriter();
       marshaller.marshal(theJAXBOAIElement, sw);
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHProducer.java b/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHProducer.java
index 00e40ddd..77d71174 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHProducer.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHProducer.java
@@ -1,15 +1,13 @@
 package info.textgrid.middleware;
 
-import info.textgrid.middleware.oaipmh.OAIPMHtype;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.FormParam;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
-import javax.ws.rs.DefaultValue;
-import javax.ws.rs.FormParam;
 import javax.ws.rs.core.MediaType;
-import javax.xml.bind.JAXBElement;
 
 /**
  * <p>
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/OaiPmhClient.java b/oaipmh-core/src/main/java/info/textgrid/middleware/OaiPmhClient.java
index 8705269a..299b78fb 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/OaiPmhClient.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/OaiPmhClient.java
@@ -1,12 +1,10 @@
 package info.textgrid.middleware;
 
-import info.textgrid.middleware.oaipmh.OAIPMHtype;
 import java.text.ParseException;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
-import javax.xml.bind.JAXBElement;
 import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
 
 /**
diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/OaiPmhTest.java b/oaipmh-core/src/test/java/info/textgrid/middleware/OaiPmhTest.java
index 3257291e..a3bdc2e3 100644
--- a/oaipmh-core/src/test/java/info/textgrid/middleware/OaiPmhTest.java
+++ b/oaipmh-core/src/test/java/info/textgrid/middleware/OaiPmhTest.java
@@ -468,6 +468,7 @@ public class OaiPmhTest {
     OaiPmhTest.identifierList.setIdentifierField("textgridUri");
     OaiPmhTest.identifierList.setRepositoryObjectURIPrefix("textgrid:");
     OaiPmhTest.identifierList.setSearchResponseSize("100");
+
     String r = this.request.getRequest("", "", "", "", "", "", "");
     System.out.println(r);
     System.out.println("-----------------------------------\n");
-- 
GitLab