From e54a468e7d4977e14d56c077d43ea5e9281ff9b4 Mon Sep 17 00:00:00 2001
From: "Stefan E. Funk" <funk@sub.uni-goettingen.de>
Date: Mon, 30 Jan 2023 17:21:08 +0100
Subject: [PATCH] fix: refactor some of the calendar methods, add tests

---
 .../middleware/DublinCoreBuilder.java         |  2 +-
 .../middleware/DublinCoreFieldLoader.java     |  4 +-
 .../IdentifierListDelivererAbstract.java      |  4 +-
 .../IdentifierListDelivererIdiom.java         |  2 +-
 .../info/textgrid/middleware/IdiomImages.java |  2 +-
 .../textgrid/middleware/OaipmhConstants.java  |  6 +-
 .../info/textgrid/middleware/OaipmhImpl.java  |  4 +-
 .../textgrid/middleware/OaipmhUtilities.java  | 91 +++++++------------
 .../middleware/RecordDelivererDC.java         |  4 +-
 .../middleware/RecordDelivererDatacite.java   |  8 +-
 .../middleware/RecordDelivererIdiom.java      |  2 +-
 .../middleware/RecordListDelivererDC.java     |  8 +-
 .../middleware/test/TestOaipmhUtilities.java  | 49 ++++++++++
 .../middleware/test/TestTGOaipmhLocally.java  |  6 +-
 .../test/online/OaipmhUtilitiesOnline.java    |  4 +-
 .../test/online/tg/TestTGGetRecordOnline.java |  2 -
 .../tg/TestTGListIdentifiersOnline.java       |  2 -
 .../online/tg/TestTGListRecordsOnline.java    |  2 -
 18 files changed, 108 insertions(+), 94 deletions(-)

diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreBuilder.java b/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreBuilder.java
index f59edf8a..82169624 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreBuilder.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreBuilder.java
@@ -114,7 +114,7 @@ public final class DublinCoreBuilder {
     for (String dcdate : dates) {
       ElementType dateElement = new ElementType();
       JAXBElement<ElementType> dcCoreDate = oaiDcObj.createDate(dateElement);
-      dateElement.setValue(OaipmhUtilities.oaiDatestampAsString(dcdate));
+      dateElement.setValue(OaipmhUtilities.getOaiDatestampAsString(dcdate));
       this.tgMappedDC.getTitleOrCreatorOrSubject().add(dcCoreDate);
     }
   }
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreFieldLoader.java b/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreFieldLoader.java
index 2d780b85..3202782a 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreFieldLoader.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreFieldLoader.java
@@ -61,7 +61,7 @@ public class DublinCoreFieldLoader {
           // TODO Set values in config file!
           if (responseWorkValues.getField(field) != null) {
             dates.add(OaipmhUtilities
-                .oaiDatestampAsString(responseWorkValues.getField(field).getValue().toString()));
+                .getOaiDatestampAsString(responseWorkValues.getField(field).getValue().toString()));
           }
         } catch (ParseException e) {
           // TODO Do not use invalid dates here!
@@ -88,7 +88,7 @@ public class DublinCoreFieldLoader {
       if (hit.getFields().get(field) != null) {
         try {
           dates.add(OaipmhUtilities
-              .oaiDatestampAsString(hit.getFields().get(field).getValues().get(0).toString()));
+              .getOaiDatestampAsString(hit.getFields().get(field).getValues().get(0).toString()));
         } catch (ParseException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java
index c6206eba..74eb3bf7 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java
@@ -138,7 +138,7 @@ public abstract class IdentifierListDelivererAbstract implements IdentifierListD
       if (this.textgrid) {
         String datestamp = hit.getSourceAsMap().get(this.dateOfObjectCreation).toString();
         try {
-          datestamp = OaipmhUtilities.oaiDatestampAsString(datestamp);
+          datestamp = OaipmhUtilities.getOaiDatestampAsString(datestamp);
         } catch (ParseException e) {
           log.severe(e.getMessage());
         }
@@ -153,7 +153,7 @@ public abstract class IdentifierListDelivererAbstract implements IdentifierListD
         // Get modifiedDate field and convert datestamp.
         this.datestamp = OaipmhUtilities.firstEnrtryFieldLoader(json, this.dateOfObjectCreation);
         try {
-          this.datestamp = OaipmhUtilities.oaiDatestampAsString(this.datestamp);
+          this.datestamp = OaipmhUtilities.getOaiDatestampAsString(this.datestamp);
         } catch (ParseException e) {
           log.severe(e.getMessage());
           // TODO Go to ERROR state!
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererIdiom.java b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererIdiom.java
index 489a0062..b9423211 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererIdiom.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererIdiom.java
@@ -147,7 +147,7 @@ public class IdentifierListDelivererIdiom extends IdentifierListDelivererAbstrac
         i++;
         String textgridURI = OaipmhUtilities
             .firstEnrtryFieldLoader(new JSONObject(hit.getSourceAsMap()), this.identifierField);
-        String createdDate = OaipmhUtilities.oaiDatestampAsString(OaipmhUtilities
+        String createdDate = OaipmhUtilities.getOaiDatestampAsString(OaipmhUtilities
             .firstEnrtryFieldLoader(new JSONObject(hit.getSourceAsMap()), this.rangeField));
 
         identifierList.getHeader().add(OaipmhUtilities.computeResponseHeader(createdDate,
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/IdiomImages.java b/oaipmh-core/src/main/java/info/textgrid/middleware/IdiomImages.java
index de9a118f..8ed1454b 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/IdiomImages.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/IdiomImages.java
@@ -220,7 +220,7 @@ public class IdiomImages implements RecordDelivererInterface, RecordListDelivere
       // Use base URI for IDIOM image delivery!
       String tgBaseURI = OaipmhUtilities.getTextGridBaseURI(changedID);
       conedaKorRecord.setHeader(buildOAIPMHRecordHeader(
-          OaipmhUtilities.oaiDatestampAsString(immByTGObject.getCreationDate()), tgBaseURI));
+          OaipmhUtilities.getOaiDatestampAsString(immByTGObject.getCreationDate()), tgBaseURI));
 
       singleImageMetsMods.setRecord(conedaKorRecord);
 
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhConstants.java b/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhConstants.java
index f02e9f37..710d26b7 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhConstants.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhConstants.java
@@ -19,7 +19,7 @@ public final class OaipmhConstants {
   // Namespaces
   public static final String OAIPMH_NAMESPACE = "http://www.openarchives.org/OAI/2.0/";
   public static final String OAIPMH_SCHEMA_LOCATION =
-      "https://www.openarchives.org/OAI/2.0/OAI-PMH.xsd";
+      "http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd";
 
   public static final String OAIDC_NAMESPACE = "http://www.openarchives.org/OAI/2.0/oai_dc/";
   public static final String OAIDC_SCHEMA_LOCATION =
@@ -30,14 +30,14 @@ public final class OaipmhConstants {
       "https://dublincore.org/schemas/xmls/simpledc20021212.xsd";
 
   public static final String METS_NAMESPACE = "http://www.loc.gov/METS/";
-  public static final String METS_SCHEMA_LOCATION = "https://www.loc.gov/standards/mets/mets.xsd";
+  public static final String METS_SCHEMA_LOCATION = "http://www.loc.gov/standards/mets/mets.xsd";
 
   public static final String IDIOM_IMAGE_NAMESPACE = METS_NAMESPACE;
   public static final String IDIOM_IMAGE_SCHEMA_LOCATION = METS_SCHEMA_LOCATION;
 
   public static final String DATACITE_NAMESPACE = "http://datacite.org/schema/kernel-3";
   public static final String DATACITE_SCHEMA_LOCATION =
-      "https://schema.datacite.org/meta/kernel-3/metadata.xsd";
+      "http://schema.datacite.org/meta/kernel-3/metadata.xsd";
 
   // Error String Constants.
   public static final String OAI_BAD_ARGUMENT = "BadArgument";
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 a7cad1e6..149073cb 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhImpl.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhImpl.java
@@ -30,8 +30,6 @@ import info.textgrid.middleware.oaipmh.VerbType;
  * 
  * @author Maximilian Brodhun, SUB Göttingen
  * @author Stefan E. Funk, SUB Göttingen
- * @version 2023-01-06
- * @since 2014-01-29
  */
 public class OaipmhImpl implements OaipmhProducer {
 
@@ -778,7 +776,7 @@ public class OaipmhImpl implements OaipmhProducer {
 
     // Set the responseDate of today.
     try {
-      oaipmhRoot.setResponseDate(OaipmhUtilities.getXMLGregorianCalendarNow());
+      oaipmhRoot.setResponseDate(OaipmhUtilities.getCurrentUTCDate());
     } catch (DatatypeConfigurationException e) {
       log.severe("datatype configuration failed");
     }
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhUtilities.java b/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhUtilities.java
index c4638b94..60101a0e 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhUtilities.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhUtilities.java
@@ -33,8 +33,6 @@ import info.textgrid.clients.AuthClient;
 import info.textgrid.clients.tgauth.AuthClientException;
 import info.textgrid.middleware.oaipmh.GetRecordType;
 import info.textgrid.middleware.oaipmh.HeaderType;
-import info.textgrid.middleware.oaipmh.ListMetadataFormatsType;
-import info.textgrid.middleware.oaipmh.MetadataFormatType;
 import info.textgrid.middleware.oaipmh.MetadataType;
 import info.textgrid.middleware.oaipmh.RecordType;
 import info.textgrid.middleware.oaipmh.Resource;
@@ -52,6 +50,10 @@ import info.textgrid.namespaces.middleware.tgauth.ProjectInfo;
  */
 public class OaipmhUtilities {
 
+  // **
+  // STATICS
+  // **
+
   private static Logger log = Logger.getLogger(OaipmhUtilities.class.getName());
 
   // **
@@ -68,6 +70,12 @@ public class OaipmhUtilities {
       PREFIX_HDL,
       PREFIX_TEXTGRID));
 
+  // Define date formats.
+  public static final SimpleDateFormat TEXTGRID_ITEM_TIME_FORMAT =
+      new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S");
+  public static final SimpleDateFormat OAIDC_UTC_TIME_FORMAT =
+      new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+
   // **
   // CLASS
   // **
@@ -93,23 +101,6 @@ public class OaipmhUtilities {
     return verb.matches(allowedArgument);
   }
 
-  /**
-   * <p>
-   * Since TextGrid just supports DC the only returned MetadataFormat is DublinCore.
-   * </p>
-   * 
-   * @return
-   */
-  public MetadataFormatType setMetadataFormats() {
-
-    MetadataFormatType tgDublinCore = new MetadataFormatType();
-    tgDublinCore.setMetadataNamespace("http://www.openarchives.org/OAI/2.0/oai_dc/");
-    tgDublinCore.setMetadataPrefix("oai_dc");
-    tgDublinCore.setSchema("http://www.openarchives.org/OAI/2.0/oai_dc.xsd");
-
-    return tgDublinCore;
-  }
-
   /**
    * @return
    * @throws AuthClientException
@@ -135,32 +126,16 @@ public class OaipmhUtilities {
 
   /**
    * <p>
-   * Producing the list of all metadata formats.
+   * Get the current UTC date for OAI-PMH response dates.
    * </p>
    * 
-   * @return tgRepMetadaFormats
-   */
-  public ListMetadataFormatsType setMetadataFormatList() {
-
-    ListMetadataFormatsType tgRepMetadataFormats = new ListMetadataFormatsType();
-    MetadataFormatType tgDublinCore = setMetadataFormats();
-    tgRepMetadataFormats.getMetadataFormat().add(tgDublinCore);
-
-    return tgRepMetadataFormats;
-  }
-
-  /**
-   * <p>
-   * Calculating the current date and give it back as XMLGregorianCalendar.
-   * </p>
-   * 
-   * @return now
+   * @return
    * @throws DatatypeConfigurationException
    */
-  public static XMLGregorianCalendar getXMLGregorianCalendarNow()
-      throws DatatypeConfigurationException {
+  public static XMLGregorianCalendar getCurrentUTCDate() throws DatatypeConfigurationException {
 
     GregorianCalendar gregorianCalendar = new GregorianCalendar();
+    gregorianCalendar.setTimeZone(TimeZone.getTimeZone("UTC"));
     DatatypeFactory datatypeFactory = DatatypeFactory.newInstance();
     XMLGregorianCalendar now = datatypeFactory.newXMLGregorianCalendar(gregorianCalendar);
 
@@ -169,28 +144,25 @@ public class OaipmhUtilities {
 
   /**
    * <p>
-   * Converting a given string representing a date value into the date format required for OAIPMH
-   * and give it back as XMLGregorianCalendar.
+   * Converting a given string representing a date value into XMLGregorianCalendar.
    * </p>
    * 
    * @param originalDateTimeString
-   * @return xmlCal
+   * @return
    * @throws ParseException
    * @throws DatatypeConfigurationException
    */
-  public static XMLGregorianCalendar oaiDatestampAsGregorian(String originalDateTimeString)
+  public static XMLGregorianCalendar getOaiDatestampAsGregorian(String originalDateTimeString)
       throws ParseException, DatatypeConfigurationException {
 
-    log.fine("original date time string: " + originalDateTimeString);
+    // Get time string.
+    String utcTimestamp = getOaiDatestampAsString(originalDateTimeString);
 
-    SimpleDateFormat tgItemTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S");
-    Date date = tgItemTime.parse(originalDateTimeString);
-    SimpleDateFormat outFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
-    outFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
-    String output2 = outFormatter.format(date);
-    XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(output2);
+    // Get calendar from time string.
+    XMLGregorianCalendar result =
+        DatatypeFactory.newInstance().newXMLGregorianCalendar(utcTimestamp);
 
-    return xmlCal;
+    return result;
   }
 
   /**
@@ -203,19 +175,20 @@ public class OaipmhUtilities {
    * @return dateOutputAsString
    * @throws ParseException
    */
-  public static String oaiDatestampAsString(String originalDateTimeString) throws ParseException {
+  public static String getOaiDatestampAsString(String originalDateTimeString)
+      throws ParseException {
 
     log.fine("incoming date: " + originalDateTimeString);
 
-    SimpleDateFormat tgItemTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S");
-    Date date = tgItemTime.parse(originalDateTimeString);
-    SimpleDateFormat outFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
-    outFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
-    String dateOutputAsString = outFormatter.format(date);
+    // Parse TextGrid time format.
+    Date date = TEXTGRID_ITEM_TIME_FORMAT.parse(originalDateTimeString);
+    // Set formatter UTC.
+    OAIDC_UTC_TIME_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC"));
+    String result = OAIDC_UTC_TIME_FORMAT.format(date);
 
-    log.fine("outgoing date: " + dateOutputAsString);
+    log.fine("outgoing date: " + result);
 
-    return dateOutputAsString;
+    return result;
   }
 
   /**
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDC.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDC.java
index c7e41b8d..84fcc33f 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDC.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDC.java
@@ -82,7 +82,7 @@ public class RecordDelivererDC extends RecordDelivererAbstract {
       String dateOfCreation = "NO_DATE_SET!";
       if (OaipmhUtilities.firstEnrtryFieldLoader(json, this.dateOfObjectCreation) != null) {
         try {
-          dateOfCreation = OaipmhUtilities.oaiDatestampAsString(
+          dateOfCreation = OaipmhUtilities.getOaiDatestampAsString(
               OaipmhUtilities.firstEnrtryFieldLoader(json, this.dateOfObjectCreation).toString());
         } catch (ParseException e) {
           // TODO Auto-generated catch block
@@ -131,7 +131,7 @@ public class RecordDelivererDC extends RecordDelivererAbstract {
           OaipmhUtilities.getSetSpec(setSpec, this.specFieldPrefix, identifier);
 
       String convertedCreationDate =
-          OaipmhUtilities.oaiDatestampAsString(dateOfCreation).toString();
+          OaipmhUtilities.getOaiDatestampAsString(dateOfCreation).toString();
       record.setHeader(
           OaipmhUtilities.computeResponseHeader(convertedCreationDate, identifier, setSpecValue));
       record.setMetadata(dublinCoreBuilder.getDC());
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDatacite.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDatacite.java
index fcf30a2a..250dd24c 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDatacite.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDatacite.java
@@ -161,7 +161,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
     }
 
     // Set response header.
-    String datestamp = OaipmhUtilities.oaiDatestampAsString(
+    String datestamp = OaipmhUtilities.getOaiDatestampAsString(
         OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, this.dateOfObjectCreation));
 
     String identifier = "";
@@ -800,8 +800,8 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
       Date dateInOpenAireRecord = new Date();
       try {
         // Only one value per field is needed here (I think).
-        String dateValue = OaipmhUtilities
-            .oaiDatestampAsString(OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, dateField));
+        String dateValue = OaipmhUtilities.getOaiDatestampAsString(
+            OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, dateField));
         dateInOpenAireRecord.setValue(dateValue);
 
         // TODO Use extra created, issued, and updated fields in configuration!
@@ -996,7 +996,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
    */
   private String addPublicationYear() throws ParseException, DatatypeConfigurationException {
     return Integer.toString(OaipmhUtilities
-        .oaiDatestampAsGregorian(
+        .getOaiDatestampAsGregorian(
             OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, this.dateOfObjectCreation))
         .getYear());
   }
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererIdiom.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererIdiom.java
index 028538d5..d36b3d3b 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererIdiom.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererIdiom.java
@@ -149,7 +149,7 @@ public class RecordDelivererIdiom extends RecordDelivererAbstract {
     // moment.
     String setSpec = "";
     String convertedModificationDate =
-        OaipmhUtilities.oaiDatestampAsString(modificationDate).toString();
+        OaipmhUtilities.getOaiDatestampAsString(modificationDate).toString();
     // We need to have the base URI here in header (and record), it is used as Record ID of Mayan
     // artifacts here!
     HeaderType header =
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java
index 5ca6ce5b..d618424e 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java
@@ -219,8 +219,8 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract {
                 String identifier = hit.getSourceAsMap().get(this.identifierField).toString();
 
                 HeaderType header = OaipmhUtilities.computeResponseHeader(
-                    OaipmhUtilities.oaiDatestampAsString(this.modifiedValue).toString(), identifier,
-                    setSpec);
+                    OaipmhUtilities.getOaiDatestampAsString(this.modifiedValue).toString(),
+                    identifier, setSpec);
                 buildRecord(recordList, header, dublinCoreBuilder);
 
               } catch (ParseException e) {
@@ -247,8 +247,8 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract {
               dublinCoreBuilder = putContentIntoDCFieldListsDH(hit);
 
               HeaderType header = OaipmhUtilities.computeResponseHeader(
-                  OaipmhUtilities.oaiDatestampAsString(this.modifiedValue).toString(), identifier,
-                  setSpec);
+                  OaipmhUtilities.getOaiDatestampAsString(this.modifiedValue).toString(),
+                  identifier, setSpec);
               buildRecord(recordList, header, dublinCoreBuilder);
 
             } catch (ParseException e) {
diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestOaipmhUtilities.java b/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestOaipmhUtilities.java
index f941fa50..453d4d34 100644
--- a/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestOaipmhUtilities.java
+++ b/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestOaipmhUtilities.java
@@ -1,6 +1,9 @@
 package info.textgrid.middleware.test;
 
 import static org.junit.Assert.assertTrue;
+import java.text.ParseException;
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.XMLGregorianCalendar;
 import org.junit.Test;
 import info.textgrid.middleware.OaipmhUtilities;
 
@@ -178,4 +181,50 @@ public class TestOaipmhUtilities {
     }
   }
 
+  /**
+   * @throws ParseException
+   */
+  @Test
+  public void testOaiDatestampAsString() throws ParseException {
+
+    String expectedUTCDate = "1970-12-10T17:30:00Z";
+    String tgDateStamp = "1970-12-10T18:30:00.000";
+
+    String utcDate = OaipmhUtilities.getOaiDatestampAsString(tgDateStamp);
+
+    if (!utcDate.equals(expectedUTCDate)) {
+      assertTrue(utcDate + " != " + expectedUTCDate, false);
+    }
+  }
+
+  /**
+   * @throws ParseException
+   * @throws DatatypeConfigurationException
+   */
+  @Test
+  public void testOaiDatestampAsGregorian() throws ParseException, DatatypeConfigurationException {
+
+    String expectedUTCDate = "1970-12-10T17:30:00Z";
+    String tgDateStamp = "1970-12-10T18:30:00.000";
+
+    XMLGregorianCalendar utcDate = OaipmhUtilities.getOaiDatestampAsGregorian(tgDateStamp);
+
+    if (!utcDate.toString().equals(expectedUTCDate)) {
+      assertTrue(utcDate + " != " + expectedUTCDate, false);
+    }
+  }
+
+  /**
+   * @throws DatatypeConfigurationException
+   */
+  @Test
+  public void testGetCurrentUTCDate() throws DatatypeConfigurationException {
+
+    XMLGregorianCalendar currentUTCDate = OaipmhUtilities.getCurrentUTCDate();
+
+    if (!currentUTCDate.toString().contains("Z")) {
+      assertTrue(currentUTCDate.toString() + " is not in UTC format!", false);
+    }
+  }
+
 }
diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestTGOaipmhLocally.java b/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestTGOaipmhLocally.java
index fac84975..7e9d90c1 100644
--- a/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestTGOaipmhLocally.java
+++ b/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestTGOaipmhLocally.java
@@ -218,7 +218,7 @@ public class TestTGOaipmhLocally {
   public void testDateNow() throws DatatypeConfigurationException {
 
     System.out.println("---------------Test Datestamp Parsing with now date -----------------");
-    XMLGregorianCalendar nowTest = OaipmhUtilities.getXMLGregorianCalendarNow();
+    XMLGregorianCalendar nowTest = OaipmhUtilities.getCurrentUTCDate();
     System.out.println(nowTest);
     System.out.println("-------------------------------------------");
   }
@@ -233,7 +233,7 @@ public class TestTGOaipmhLocally {
     String dateformatbefore = "2012-02-06T20:48:39.614+01:00";
     System.out.println("--------- Test Datestamp Parsing with a given date ---------------");
     System.out.println("Original date: " + dateformatbefore);
-    XMLGregorianCalendar testDate = OaipmhUtilities.oaiDatestampAsGregorian(dateformatbefore);
+    XMLGregorianCalendar testDate = OaipmhUtilities.getOaiDatestampAsGregorian(dateformatbefore);
     System.out.println("Date after conversion: " + testDate);
     System.out.println("---------------------------------------------");
   }
@@ -248,7 +248,7 @@ public class TestTGOaipmhLocally {
     String dateformatbefore = "2012-02-06T20:48:39.614+01:00";
     System.out.println("------------String Version-------------------");
     System.out.println("Original date: " + dateformatbefore);
-    String testDate = OaipmhUtilities.oaiDatestampAsString(dateformatbefore);
+    String testDate = OaipmhUtilities.getOaiDatestampAsString(dateformatbefore);
     System.out.println("Date after conversion: " + testDate);
     System.out.println("---------------------------------------------");
   }
diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/OaipmhUtilitiesOnline.java b/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/OaipmhUtilitiesOnline.java
index 470c4be1..e379ceaa 100644
--- a/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/OaipmhUtilitiesOnline.java
+++ b/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/OaipmhUtilitiesOnline.java
@@ -46,8 +46,8 @@ public class OaipmhUtilitiesOnline {
 
   // ## CHANGE SETTINGS BELOW FOR SETTING TEST SCOPE ---------------------------------------------
 
-  // public static final String PROPERTIES_FILE = "oaipmh.test.textgridlab-org.properties";
-  public static final String PROPERTIES_FILE = "oaipmh.test.dev-textgridlab-org.properties";
+  public static final String PROPERTIES_FILE = "oaipmh.test.textgridlab-org.properties";
+  // public static final String PROPERTIES_FILE = "oaipmh.test.dev-textgridlab-org.properties";
 
   public static final boolean TEST_ALL_PAGES = false;
   // public static final boolean TEST_ALL_PAGES = true;
diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGGetRecordOnline.java b/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGGetRecordOnline.java
index 8c91a2c0..78ee5b78 100644
--- a/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGGetRecordOnline.java
+++ b/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGGetRecordOnline.java
@@ -35,8 +35,6 @@ import info.textgrid.middleware.test.online.OaipmhUtilitiesOnline;
  * </p>
  * 
  * @author Stefan E. Funk, SUB Göttingen
- * @version 2023-01-11
- * @since 2022-09-08
  */
 @Ignore
 public class TestTGGetRecordOnline {
diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGListIdentifiersOnline.java b/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGListIdentifiersOnline.java
index 52d488e5..3a373f61 100644
--- a/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGListIdentifiersOnline.java
+++ b/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGListIdentifiersOnline.java
@@ -25,8 +25,6 @@ import info.textgrid.middleware.test.online.OaipmhUtilitiesOnline;
  * </p>
  * 
  * @author Stefan E. Funk, SUB Göttingen
- * @version 2022-09-23
- * @since 2022-09-12
  */
 @Ignore
 public class TestTGListIdentifiersOnline {
diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGListRecordsOnline.java b/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGListRecordsOnline.java
index 20431afa..500dae53 100644
--- a/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGListRecordsOnline.java
+++ b/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGListRecordsOnline.java
@@ -25,8 +25,6 @@ import info.textgrid.middleware.test.online.OaipmhUtilitiesOnline;
  * </p>
  * 
  * @author Stefan E. Funk, SUB Göttingen
- * @version 2022-09-28
- * @since 2022-09-12
  */
 @Ignore
 public class TestTGListRecordsOnline {
-- 
GitLab