From 55ab599ebe994aeec3eae6a8af90dba1aaa781af Mon Sep 17 00:00:00 2001
From: Maximilian Brodhun <brodhun@sub.uni-goettingen.de>
Date: Mon, 2 Dec 2019 18:16:27 +0100
Subject: [PATCH] Resolve response errors

---
 .../textgrid/middleware/ErrorHandler.java     |  4 +-
 .../IdentifierListDelivererAbstract.java      | 12 +++---
 .../info/textgrid/middleware/OAIPMHImpl.java  |  7 ++--
 .../textgrid/middleware/OAIPMHUtilities.java  | 38 +++++++++++++++++++
 .../RecordListDelivererAbstract.java          | 34 +++++++++++------
 .../info/textgrid/middleware/TGConstants.java |  2 +
 .../info/textgrid/middleware/OaiPmhTest.java  | 20 +++++++---
 7 files changed, 90 insertions(+), 27 deletions(-)

diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/ErrorHandler.java b/oaipmh-core/src/main/java/info/textgrid/middleware/ErrorHandler.java
index 0179698b..1f01edae 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/ErrorHandler.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/ErrorHandler.java
@@ -27,14 +27,14 @@ public class ErrorHandler {
 
     if (errorDescription.equals("BadArgument")) {
       this.errorCode = OAIPMHerrorcodeType.BAD_ARGUMENT;
-    } else if (errorDescription.equals("ResumptionTokenError")) {
+    } else if (errorDescription.equals("badResumptionToken")) {
       this.errorCode = OAIPMHerrorcodeType.BAD_RESUMPTION_TOKEN;
     } else if (errorDescription.equals("VerbError")) {
       this.errorCode = OAIPMHerrorcodeType.BAD_VERB;
       this.error.setValue("Illegal OAI-PMH verb");
     } else if (errorDescription.equals("FormatError")) {
       this.errorCode = OAIPMHerrorcodeType.CANNOT_DISSEMINATE_FORMAT;
-    } else if (errorDescription.equals("IDError")) {
+    } else if (errorDescription.equals("idDoesNotExist")) {
       this.errorCode = OAIPMHerrorcodeType.ID_DOES_NOT_EXIST;
     } else if (errorDescription.equals("MetadataFormatError")) {
       this.error.setValue("There are no metadata formats available for the specified item.");
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 803fda50..e122ab6a 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java
@@ -3,6 +3,9 @@ package info.textgrid.middleware;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+
+import javax.swing.plaf.synth.SynthSpinnerUI;
+
 import info.textgrid.middleware.oaipmh.ListIdentifiersType;
 import info.textgrid.middleware.oaipmh.RequestType;
 
@@ -57,19 +60,18 @@ public abstract class IdentifierListDelivererAbstract implements IdentifierListD
     if (request.getResumptionToken() != null) {
       boolean restokDCExisting = RecordListDelivererIDIOM.cursorCollector != null
           && RecordListDelivererIDIOM.cursorCollector.containsKey(request.getResumptionToken());
+      System.out.println(request.getResumptionToken() + " exists: " + RecordListDelivererDC.cursorCollector.containsKey(request.getResumptionToken()));
       boolean restokIDIOMExisting = RecordListDelivererDC.cursorCollector != null
           && RecordListDelivererDC.cursorCollector.containsKey(request.getResumptionToken());
-      if (restokDCExisting || restokIDIOMExisting) {
-        result.setError(TGConstants.OAI_BAD_RESUMPTION_TOKEN, "The value of the "
+      if (!restokDCExisting || !restokIDIOMExisting) {
+    	  System.out.println("BUHUH");
+    	  result.setError(TGConstants.OAI_BAD_RESUMPTION_TOKEN, "The value of the "
             + request.getResumptionToken() + " argument is invalid or expired.");
       }
     }
 
     List<String> errorValues = new ArrayList<String>();
 
-    if (request.getResumptionToken() != null && request.getMetadataPrefix() != null) {
-      errorValues.add("metadataPrefix");
-    }
     if (request.getResumptionToken() == null && request.getMetadataPrefix() == null) {
       errorValues.add("metadataPrefix");
     }
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 2591165a..86614408 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHImpl.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHImpl.java
@@ -251,9 +251,8 @@ public class OAIPMHImpl implements OAIPMHProducer {
       if (getRecord != null) {
         oaipmhRoot.setGetRecord(getRecord);
       } else {
-        ErrorHandler idError = new ErrorHandler();
-        idError.setError(TGConstants.OAI_NO_RECORD_MATCH, "The value of the identifier: "
-            + request.getIdentifier() + " is unknown or illegal in this repository");
+        ErrorHandler idError = new ErrorHandler();                
+        idError.setError(TGConstants.OAI_ID_DOES_NOT_EXIST, "No matching identifier ");
         oaipmhRoot.getError().add(idError.getError());
       }
     }
@@ -322,7 +321,7 @@ public class OAIPMHImpl implements OAIPMHProducer {
           oaipmhRoot.getError().add(requestErrors.getError());
         } else {
           oaipmhRoot.setListIdentifiers(listIdentifiers);
-        }
+        }        
       } else {
         ErrorHandler idError = new ErrorHandler();
         idError.setError(TGConstants.OAI_NO_RECORD_MATCH, "The value of the identifier: "
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 69ce9223..47efb732 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHUtilities.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHUtilities.java
@@ -3,6 +3,7 @@ package info.textgrid.middleware;
 import java.io.IOException;
 import java.io.InputStream;
 import java.math.BigInteger;
+import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -280,5 +281,42 @@ public class OAIPMHUtilities {
 
     return null;
   }
+  
+	public static boolean isThisDateValid(String dateToValidate){
+		
+	    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S");
+	    dateFormat.setLenient(false);
+	    try {
+	      dateFormat.parse(dateToValidate.trim());
+	    } catch (ParseException pe) {
+	      return false;
+	    }
+	    return true;
+	}
+  
+    private static final String[] formats = { 
+            "yyyy-MM-dd'T'HH:mm:ss'Z'",   "yyyy-MM-dd'T'HH:mm:ssZ",
+            "yyyy-MM-dd'T'HH:mm:ss",      "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
+            "yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd HH:mm:ss", 
+            "MM/dd/yyyy HH:mm:ss",        "MM/dd/yyyy'T'HH:mm:ss.SSS'Z'", 
+            "MM/dd/yyyy'T'HH:mm:ss.SSSZ", "MM/dd/yyyy'T'HH:mm:ss.SSS", 
+            "MM/dd/yyyy'T'HH:mm:ssZ",     "MM/dd/yyyy'T'HH:mm:ss", 
+            "yyyy:MM:dd HH:mm:ss",        "yyyyMMdd", };
+    
+    
+    public static String getFormatOfDate(String d) {
+        if (d != null) {
+            for (String parse : formats) {
+                SimpleDateFormat sdf = new SimpleDateFormat(parse);
+                try {
+                    sdf.parse(d);
+                    return parse;
+                } catch (ParseException e) {
+
+                }
+            }
+        }
+		return d;
+    }
 
 }
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererAbstract.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererAbstract.java
index 1d2587e3..b56dda84 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererAbstract.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererAbstract.java
@@ -29,6 +29,7 @@ public abstract class RecordListDelivererAbstract implements RecordListDeliverer
 
     ErrorHandler result = new ErrorHandler();
 
+    
     // Check if metadata prefix is existing and valid.
     if (request.getMetadataPrefix() != null
         && !request.getMetadataPrefix().equals(OAIPMHUtilities.OAIDC_PREFIX)
@@ -41,16 +42,20 @@ public abstract class RecordListDelivererAbstract implements RecordListDeliverer
 
     // Check if resumptionToken is invalid or existing.
     if (request.getResumptionToken() != null) {
-      boolean restokDCExisting = RecordListDelivererIDIOM.cursorCollector != null
-          && RecordListDelivererIDIOM.cursorCollector.containsKey(request.getResumptionToken());
-      boolean restokIDIOMExisting = RecordListDelivererDC.cursorCollector != null
-          && RecordListDelivererDC.cursorCollector.containsKey(request.getResumptionToken());
-      if (restokDCExisting || restokIDIOMExisting) {
-        result.setError(TGConstants.OAI_BAD_RESUMPTION_TOKEN, "The value of the "
-            + request.getResumptionToken() + " argument is invalid or expired.");
+        boolean restokDCExisting = RecordListDelivererIDIOM.cursorCollector != null
+            && RecordListDelivererIDIOM.cursorCollector.containsKey(request.getResumptionToken());
+        System.out.println(request.getResumptionToken() + " exists: " + RecordListDelivererDC.cursorCollector.containsKey(request.getResumptionToken()));
+        boolean restokIDIOMExisting = RecordListDelivererDC.cursorCollector != null
+            && RecordListDelivererDC.cursorCollector.containsKey(request.getResumptionToken());
+        if (!restokDCExisting || !restokIDIOMExisting) {
+      	  System.out.println("BUHUH");
+      	  result.setError(TGConstants.OAI_BAD_RESUMPTION_TOKEN, "The value of the "
+              + request.getResumptionToken() + " argument is invalid or expired.");
+        }
       }
-    }
 
+    
+    
     // Check if query to ElastisSearch responses with more then zero results
     // FIXME what the heck?
     if (true) {
@@ -60,15 +65,21 @@ public abstract class RecordListDelivererAbstract implements RecordListDeliverer
     // Check params in general.
     List<String> errorValues = new ArrayList<String>();
 
-    if (request.getResumptionToken() != null && request.getMetadataPrefix() != null) {
-      errorValues.add("metadataPrefix");
-    }
     if (request.getResumptionToken() == null && request.getMetadataPrefix() == null) {
       errorValues.add("metadataPrefix");
     }
     if (request.getIdentifier() != null) {
       errorValues.add("identifier");
     }
+    if(request.getFrom()!= null && !OAIPMHUtilities.isThisDateValid(request.getFrom())) {
+    	errorValues.add("from");
+    }
+    if(request.getUntil() != null && !OAIPMHUtilities.isThisDateValid(request.getUntil())) {
+    	errorValues.add("until");
+    }
+    if(OAIPMHUtilities.getFormatOfDate(request.getFrom()).equals(OAIPMHUtilities.getFormatOfDate(request.getFrom()))) {
+    	errorValues.add("The granularities for from and until doesn't match");
+    }
     if (errorValues.size() > 0) {
       result.setError(TGConstants.OAI_BAD_ARGUMENT, "The request includes illegal arguments "
           + "or is missing required arguments: " + errorValues);
@@ -76,5 +87,6 @@ public abstract class RecordListDelivererAbstract implements RecordListDeliverer
 
     return result;
   }
+  
 
 }
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/TGConstants.java b/oaipmh-core/src/main/java/info/textgrid/middleware/TGConstants.java
index e28594a5..42e40f40 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/TGConstants.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/TGConstants.java
@@ -34,6 +34,8 @@ public final class TGConstants {
   public static final String OAI_NO_RECORD_MATCH = "RecordMatchError";
   public static final String OAI_NO_SET_HIERARCHY = "SetHierarchyError";
   public static final String OAI_BAD_RESUMPTION_TOKEN = "badResumptionToken";
+  public static final String OAI_ID_DOES_NOT_EXIST = "idDoesNotExist";
+  public static final String OAI_TIMESTAMP_ERROR = "cannotDisseminateFormat";
 
   // TextGrid Metadata Fields for OAI-PMH Request (Mapping to DC)
   public static final String CREATED = "created";
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 d93ceb26..010266b5 100644
--- a/oaipmh-core/src/test/java/info/textgrid/middleware/OaiPmhTest.java
+++ b/oaipmh-core/src/test/java/info/textgrid/middleware/OaiPmhTest.java
@@ -159,6 +159,17 @@ public class OaiPmhTest {
     System.out.println("-----------------------------------\n");
   }
 
+  /**
+   * @throws ParseException
+   */
+  @Test
+  @Ignore
+  public void testGetDateFormat() throws ParseException {
+    System.out.println("Test get time format");
+    System.out.println(OAIPMHUtilities.getFormatOfDate("2019-12-02T15:36:13Z"));    
+    System.out.println("-----------------------------------\n");
+  }  
+  
   /**
    * @throws ParseException
    */
@@ -190,7 +201,7 @@ public class OaiPmhTest {
     record.setIdentifierField("textgridUri");
 
     System.out.println("Test for the verb \"GetRecord\" with succesfull response");
-    String p = this.request.getRequest("GetRecord", "textgrid:vqn0.0", "oai_dc", "", "", "", "");
+    String p = this.request.getRequest("GetRecord", "identifier\"id", "oai_dc", "", "", "", "");
     System.out.println(p);
     System.out.println("-----------------------------------\n");
   }
@@ -233,8 +244,7 @@ public class OaiPmhTest {
     OaiPmhTest.identifierList.setIdentifierField("textgridUri");
     OaiPmhTest.identifierList.setSearchResponseSize("100");
     System.out.println("Test for the verb \"ListIdentifiers\" with succesfull response");
-    String p = this.request.getRequest("ListIdentifiers", "", "oai_dc",
-        "project:TGPR-26236625-1acc-b921-a5fa-53567c3eeb80", "", "", "");
+    String p = this.request.getRequest("ListIdentifiers", "", "oai_dc", "", "2000-02-05", "", "junk");
     System.out.println(p);
     System.out.println("-----------------------------------\n");
   }
@@ -337,7 +347,7 @@ public class OaiPmhTest {
 
     System.out.println("Test for the verb \"ListRecords\" with sets with succesfull response");
     //String p = this.request.getRequest("ListRecords", "", "oai_dc", "project:TGPR-f89ad029-4eb2-ae5c-6028-5db876513128", "", "", "");
-    String p = this.request.getRequest("ListRecords", "", "oai_dc", "", "2012-05-09T00:33:55.364+02:00", "2012-05-09T00:33:55.364+02:00", "");
+    String p = this.request.getRequest("ListRecords", "", "oai_dc", "", "2012-05-09T00:33:55.364+02:00", "2012-05-09", "");
     System.out.println(p);
     String resToken = "";
     /*for (Map.Entry<String, Integer> entry : RecordListDelivererDC.cursorCollector.entrySet()) {
@@ -414,7 +424,7 @@ public class OaiPmhTest {
     OaiPmhTest.recordList.setModifiedField(TGConstants.CREATED);
     OaiPmhTest.recordList.setIdentifierField(TGConstants.URI);
     OaiPmhTest.recordList.setSearchResponseSize("100");
-    String r = this.request.getRequest("ListRecords", "", "oai_dc", "", "", "", "");
+    String r = this.request.getRequest("ListRecords", "", "oai_dc", "", "2002-02-06T05:35:00Z", "", "");
     System.out.println(r);
     System.out.println("-----------------------------------\n");
   }
-- 
GitLab