From e2834dd2a07125f5789fa1c386b1a5ab58976162 Mon Sep 17 00:00:00 2001
From: "Stefan E. Funk" <funk@sub.uni-goettingen.de>
Date: Tue, 27 Sep 2022 18:32:05 +0200
Subject: [PATCH] fix: refactor textgrid URI usage (URI <--> base URI)

---
 .../textgrid/middleware/OAIPMHUtilities.java  | 15 ++++
 .../middleware/RecordDelivererIDIOM.java      | 70 +++++++++----------
 .../middleware/RecordListDelivererIDIOM.java  |  9 ++-
 .../middleware/test/TestOAIPMHUtilities.java  | 37 ++++++++++
 4 files changed, 90 insertions(+), 41 deletions(-)

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 6647c3ef..2bb13502 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHUtilities.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHUtilities.java
@@ -676,6 +676,21 @@ public class OAIPMHUtilities {
     return result;
   }
 
+  /**
+   * @param theURI
+   * @return
+   */
+  public static String getTextGridBaseURI(String theURI) {
+
+    String result = theURI;
+
+    if (theURI.contains(".")) {
+      result = theURI.substring(0, theURI.indexOf('.')).trim();
+    }
+
+    return result;
+  }
+
   // **
   // GETTERS & SETTERS
   // **
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 f83b1e72..f3bc1d52 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererIDIOM.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererIDIOM.java
@@ -24,14 +24,28 @@ import info.textgrid.middleware.oaipmh.RecordType;
 /**
  * @author Maximilian Brodhun, SUB Göttingen
  * @author Stefan E. Funk, SUB Göttingen
- * @version 2022-09-23
+ * @version 2022-09-27
  * @since 2019-03-12
  */
 @Component
 public class RecordDelivererIDIOM extends RecordDelivererAbstract {
 
+  // **
+  // FINALS
+  // **
+
+  private static final String TEXTGRID_URI_PREFIX = "textgrid:";
+
+  // **
+  // STATICS
+  // **
+
   private static Logger log = Logger.getLogger(RecordDelivererIDIOM.class.getName());
 
+  // **
+  // CLASS
+  // **
+
   private IDIOMImages idiomImages;
 
   private RecordType record = new RecordType();
@@ -55,33 +69,32 @@ public class RecordDelivererIDIOM extends RecordDelivererAbstract {
    * @throws IOException
    */
   @Override
-  public GetRecordType getRecordById(String id) throws ParseException, IOException {
+  public GetRecordType getRecordById(final String id) throws ParseException, IOException {
 
     GetRecordType grt = new GetRecordType();
 
-    log.fine("identifier: " + id);
+    log.fine("incoming ID: " + id);
 
     setDatestampsAndObjectType(id);
 
-    // Get TG URI and TG base URI from ID.
-    String tgURI = id;
-    if (!id.startsWith("textgrid:")) {
-      tgURI = "textgrid:" + id;
+    // Get TG URI from ID.
+    String textgridURI = id;
+    if (!id.startsWith(TEXTGRID_URI_PREFIX)) {
+      textgridURI = TEXTGRID_URI_PREFIX + id;
     }
-    String tgBaseURI = tgURI;
-    // FIXME Why we only replace ".0" here??
-    tgBaseURI = tgBaseURI.replace(".0", "");
 
-    log.fine("tg uri/base uri: " + tgURI + "/" + tgBaseURI);
+    // Get base URI for ClassicMayanMetsMods and response header here.
+    String textgridBaseURI = OAIPMHUtilities.getTextGridBaseURI(textgridURI);
+
+    log.fine("textgrid uri/base uri: " + textgridURI + "/" + textgridBaseURI);
     log.fine("object type is: " + this.objectType);
     log.fine(this.objectType + " doc/dom: " + this.dateOfObjectCreation + "/"
         + this.dateOfLastObjectModification);
 
     if (this.objectType.equals("ARTEFACT")) {
-
       try {
         ClassicMayanMetsMods metsmods = new ClassicMayanMetsMods(
-            tgBaseURI,
+            textgridBaseURI,
             this.dateOfObjectCreation,
             this.dateOfLastObjectModification);
 
@@ -101,7 +114,7 @@ public class RecordDelivererIDIOM extends RecordDelivererAbstract {
 
       log.fine("calling idiom image getRecordById()");
 
-      GetRecordType idi = this.idiomImages.getRecordById(id);
+      GetRecordType idi = this.idiomImages.getRecordById(textgridURI);
 
       // Fixes #64
       if (idi != null) {
@@ -109,21 +122,11 @@ public class RecordDelivererIDIOM extends RecordDelivererAbstract {
       }
     }
 
-    // See, that IDs have NO revision number.
-    // FIXME Why we replace ALL revision numbers here?? Is there a difference to tgBaseURI with ".0"
-    // and ".n"??
-    String identifierToSet = tgURI;
-    if (identifierToSet.contains(".")) {
-      identifierToSet = identifierToSet.substring(0, identifierToSet.indexOf("."));
-    }
-
-    log.fine("identifier to set: " + identifierToSet);
-
     // No setSpec needed here!
+    // TODO Why not??
     String setSpec = "";
     HeaderType header =
-        OAIPMHUtilities.computeResponseHeader(this.dateOfObjectCreation, identifierToSet,
-            setSpec);
+        OAIPMHUtilities.computeResponseHeader(this.dateOfObjectCreation, textgridURI, setSpec);
     this.record.setHeader(header);
 
     grt.setRecord(this.record);
@@ -174,20 +177,16 @@ public class RecordDelivererIDIOM extends RecordDelivererAbstract {
    * @throws ParseException
    * @throws IOException
    */
-  private void setDatestampsAndObjectType(String idInDatabase) throws ParseException, IOException {
+  private void setDatestampsAndObjectType(final String idInDatabase)
+      throws ParseException, IOException {
 
     String changedId = idInDatabase;
 
-    if (idInDatabase.startsWith("textgrid:")) {
-      changedId = idInDatabase.substring("textgrid:".length());
+    // Remove prefix.
+    if (idInDatabase.startsWith(TEXTGRID_URI_PREFIX)) {
+      changedId = idInDatabase.substring(TEXTGRID_URI_PREFIX.length());
     }
 
-    if (!idInDatabase.contains(".0")) {
-      changedId = changedId + ".0";
-    }
-
-    log.fine("changedId: " + changedId);
-
     JSONObject json = new JSONObject();
     String[] searchFields = {TGConstants.CREATED, TGConstants.MODIFIED_FIELD, "notes"};
 
@@ -203,7 +202,6 @@ public class RecordDelivererIDIOM extends RecordDelivererAbstract {
     this.objectType = OAIPMHUtilities.fieldLoader(json, "notes");
   }
 
-
   // **
   // GETTERS & SETTERS
   // **
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIDIOM.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIDIOM.java
index e2f34d8c..b09f3c19 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIDIOM.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIDIOM.java
@@ -16,7 +16,6 @@ import org.elasticsearch.index.query.RangeQueryBuilder;
 import org.elasticsearch.search.SearchHit;
 import org.elasticsearch.search.builder.SearchSourceBuilder;
 import org.json.JSONObject;
-import info.textgrid.middleware.oaipmh.GetRecordType;
 import info.textgrid.middleware.oaipmh.ListRecordsType;
 import info.textgrid.middleware.oaipmh.RecordType;
 import info.textgrid.middleware.oaipmh.ResumptionTokenType;
@@ -130,12 +129,12 @@ public class RecordListDelivererIDIOM extends RecordListDelivererAbstract {
         String textgridURI =
             OAIPMHUtilities.fieldLoader(new JSONObject(hit.getSourceAsMap()), "textgridUri");
 
-        log.fine("textgridURI: " + textgridURI);
+        log.fine("textgrid uri: " + textgridURI);
 
-        // Create new record here! We must not set only references here!
+        // Create new record here!
+        // NOTE We must not set only references here!!
         RecordType record = new RecordType();
-        RecordType sourceRecord =
-            this.idiomRecord.getRecordById(textgridURI.replace(".0", "")).getRecord();
+        RecordType sourceRecord = this.idiomRecord.getRecordById(textgridURI).getRecord();
         record.setHeader(sourceRecord.getHeader());
         record.setMetadata(sourceRecord.getMetadata());
 
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 f43f39f4..5650f808 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
@@ -118,4 +118,41 @@ public class TestOAIPMHUtilities {
     }
   }
 
+  /**
+   * 
+   */
+  @Test
+  public void testGetTextGridBaseURI() {
+
+    String uriExpected = "textgrid:12345";
+
+    String uri = "textgrid:12345.13";
+    String baseURI = OAIPMHUtilities.getTextGridBaseURI(uri);
+    if (!baseURI.equals(uriExpected)) {
+      System.out.println(baseURI + " != " + uriExpected);
+      assertTrue(false);
+    }
+
+    uri = "textgrid:12345.1";
+    baseURI = OAIPMHUtilities.getTextGridBaseURI(uri);
+    if (!baseURI.equals(uriExpected)) {
+      System.out.println(baseURI + " != " + uriExpected);
+      assertTrue(false);
+    }
+
+    uri = "textgrid:12345";
+    baseURI = OAIPMHUtilities.getTextGridBaseURI(uri);
+    if (!baseURI.equals(uriExpected)) {
+      System.out.println(baseURI + " != " + uriExpected);
+      assertTrue(false);
+    }
+
+    uri = "textgrid:12345.3847";
+    baseURI = OAIPMHUtilities.getTextGridBaseURI(uri);
+    if (!baseURI.equals(uriExpected)) {
+      System.out.println(baseURI + " != " + uriExpected);
+      assertTrue(false);
+    }
+  }
+
 }
-- 
GitLab