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