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 f59edf8af827b9536910eae0c75e2e8aa9dfef78..835d05314fb830968cdab5095aa70d08cd5385ab 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(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 2d780b859efed754b7f2dcd0d896bd3b6ef27803..6801e39c535d5a46202f2ad5ac34ac337e588c1b 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreFieldLoader.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreFieldLoader.java @@ -15,14 +15,12 @@ import org.elasticsearch.search.SearchHit; * </p> * * <p> - * For each element two functions are necessary because the datatype "SeachHit" could contain more + * For each element two functions are necessary because the data type "SeachHit" could contain more * then one results and the GetResponse just one. * </p> * * @author Maximilian Brodhun, SUB Göttingen * @author Stefan E. Funk, SUB Göttingen - * @version 2019-10-29 - * @since 2014-02-18 */ public class DublinCoreFieldLoader { @@ -49,25 +47,15 @@ public class DublinCoreFieldLoader { */ public static List<String> setDate(GetResponse responseWorkValues, String[] fields) { - // TODO We don't need this here, I suppose? We have to check the dates here! - // return fillList(responseWorkValues, fields); - List<String> dates = new ArrayList<String>(); // Transform to OAI-PMH certificated time stamp if (responseWorkValues.isExists()) { for (String field : fields) { - try { - // TODO Set values in config file! - if (responseWorkValues.getField(field) != null) { - dates.add(OaipmhUtilities - .oaiDatestampAsString(responseWorkValues.getField(field).getValue().toString())); - } - } catch (ParseException e) { - // TODO Do not use invalid dates here! + // TODO Set values in config file! + if (responseWorkValues.getField(field) != null) { + // We need ISO8601 here, take entries as they come from ElasticSearch! dates.add(responseWorkValues.getField(field).getValue().toString()); - log.fine("tried to parse date value: " - + responseWorkValues.getField(field).getValue().toString()); } } } @@ -86,13 +74,8 @@ public class DublinCoreFieldLoader { for (String field : fields) { if (hit.getFields().get(field) != null) { - try { - dates.add(OaipmhUtilities - .oaiDatestampAsString(hit.getFields().get(field).getValues().get(0).toString())); - } catch (ParseException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + // We need ISO8601 here, take entries as they come from ElasticSearch! + dates.add(hit.getFields().get(field).getValues().get(0).toString()); } } 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 c6206eba11c01b87e3093605b887ea1e6b2dd20f..f5ab2f45d001c71e1460fde292911d84b41b0fe3 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java @@ -1,7 +1,5 @@ package info.textgrid.middleware; - -import java.text.ParseException; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -18,8 +16,6 @@ import info.textgrid.middleware.oaipmh.ResumptionTokenType; /** * @author Stefan E. Funk, SUB Göttingen - * @version 2023-01-10 - * @since 2014-02-20 */ public abstract class IdentifierListDelivererAbstract implements IdentifierListDelivererInterface { @@ -47,7 +43,6 @@ public abstract class IdentifierListDelivererAbstract implements IdentifierListD protected long resultSize; protected int searchResponseSize; protected ResumptionTokenType resTokenForResponse; - protected String datestamp; protected boolean idExist = true; protected String[] identifierListFields; // Fields for the elasticsearch request protected String rangeField; // Field for the optional range query @@ -128,20 +123,14 @@ public abstract class IdentifierListDelivererAbstract implements IdentifierListD public SearchResponse hitHandling(SearchResponse listFurtherValues, ListIdentifiersType lit, String set, String resumptionToken, Map<String, Integer> cursorCollector) { - int i = 0; long size = listFurtherValues.getHits().totalHits; setResultSize(size); for (SearchHit hit : listFurtherValues.getHits().getHits()) { - i++; // Handle TextGrid. if (this.textgrid) { String datestamp = hit.getSourceAsMap().get(this.dateOfObjectCreation).toString(); - try { - datestamp = OaipmhUtilities.oaiDatestampAsString(datestamp); - } catch (ParseException e) { - log.severe(e.getMessage()); - } + datestamp = OaipmhUtilities.getUTCDateAsString(datestamp); String identifier = hit.getSourceAsMap().get(this.identifierField).toString(); lit = setListIdentifierHeader(datestamp, identifier, lit, set); } @@ -149,26 +138,17 @@ public abstract class IdentifierListDelivererAbstract implements IdentifierListD // Handle DARIAH. else if (this.dariah) { JSONObject json = new JSONObject(hit.getSourceAsMap()); - - // Get modifiedDate field and convert datestamp. - this.datestamp = OaipmhUtilities.firstEnrtryFieldLoader(json, this.dateOfObjectCreation); - try { - this.datestamp = OaipmhUtilities.oaiDatestampAsString(this.datestamp); - } catch (ParseException e) { - log.severe(e.getMessage()); - // TODO Go to ERROR state! - } - - // Get identifier field. - String identifier = OaipmhUtilities.firstEnrtryFieldLoader(json, this.identifierField); - lit = setListIdentifierHeader(this.datestamp, identifier, lit, set); + String datestamp = OaipmhUtilities.firstEntryFieldLoader(json, this.dateOfObjectCreation); + datestamp = OaipmhUtilities.getUTCDateAsString(datestamp); + String identifier = OaipmhUtilities.firstEntryFieldLoader(json, this.identifierField); + lit = setListIdentifierHeader(datestamp, identifier, lit, set); } } // Check the need for a resumption token! ResumptionTokenType responseToken = OaipmhUtilities.getResumptionToken( listFurtherValues.getHits().getTotalHits(), resumptionToken, cursorCollector, - listFurtherValues.getScrollId(), this.searchResponseSize, i); + listFurtherValues.getScrollId(), this.searchResponseSize); if (responseToken != null) { lit.setResumptionToken(responseToken); } 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 489a00624e24bf3e7f6523670d737a5e680d5fb2..4b483374e9bedd653d955222f854bec7b2003696 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererIdiom.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererIdiom.java @@ -141,22 +141,19 @@ public class IdentifierListDelivererIdiom extends IdentifierListDelivererAbstrac if (completeListSize > 0) { setFoundItems(true); - int i = 0; for (SearchHit hit : scrollResp.getHits().getHits()) { - i++; String textgridURI = OaipmhUtilities - .firstEnrtryFieldLoader(new JSONObject(hit.getSourceAsMap()), this.identifierField); - String createdDate = OaipmhUtilities.oaiDatestampAsString(OaipmhUtilities - .firstEnrtryFieldLoader(new JSONObject(hit.getSourceAsMap()), this.rangeField)); - + .firstEntryFieldLoader(new JSONObject(hit.getSourceAsMap()), this.identifierField); + String createdDate = OaipmhUtilities.getUTCDateAsString(OaipmhUtilities + .firstEntryFieldLoader(new JSONObject(hit.getSourceAsMap()), this.rangeField)); identifierList.getHeader().add(OaipmhUtilities.computeResponseHeader(createdDate, OaipmhUtilities.getTextGridBaseURI(textgridURI), "")); } // Check the need for a resumption token! ResumptionTokenType responseToken = OaipmhUtilities.getResumptionToken(completeListSize, - resumptionToken, cursorCollector, scrollID, IDIOM_RESPONSE_SIZE, i); + resumptionToken, cursorCollector, scrollID, IDIOM_RESPONSE_SIZE); if (responseToken != null) { identifierList.setResumptionToken(responseToken); } 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 de9a118f29a2daeb26113d52d72fe6929e3093fe..76283c910403ea13ec0e489e1ab4a3ddf77273d7 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.getUTCDateAsString(immByTGObject.getCreationDate()), tgBaseURI)); singleImageMetsMods.setRecord(conedaKorRecord); diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererAbstract.java b/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererAbstract.java index 8439befbad719f87786d171bb569e1fbae1e1c74..0e4bce6e3a9910b1664acd82a68b95a1671cec41 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererAbstract.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererAbstract.java @@ -16,16 +16,6 @@ public abstract class MetadataFormatListDelivererAbstract protected OaipmhElasticSearchClient oaiEsClient; - private boolean idExist = true; - - /** - * @param textgrid - * @param dariah - */ - public MetadataFormatListDelivererAbstract() { - // - } - /** * */ @@ -41,7 +31,7 @@ public abstract class MetadataFormatListDelivererAbstract mft.setSchema(OaipmhConstants.OAIDC_SCHEMA_LOCATION); result.getMetadataFormat().add(mft); - // Add metadata format for OPEN AIRE. + // Add metadata format for (oai_datacite). MetadataFormatType mftOpenAire = new MetadataFormatType(); mftOpenAire.setMetadataNamespace(OaipmhConstants.DATACITE_NAMESPACE); mftOpenAire.setMetadataPrefix(OaipmhConstants.METADATA_OPENAIRE_PREFIX); @@ -75,20 +65,6 @@ public abstract class MetadataFormatListDelivererAbstract // GETTERS & SETTERS // - /** - * @return - */ - public boolean isIdExist() { - return this.idExist; - } - - /** - * @param idExist - */ - public void setIdExist(boolean idExist) { - this.idExist = idExist; - } - /** * @return */ diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererDH.java b/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererDH.java index 38ac270b2d45cd9715da22c98373cdf7df13d103..c2d361a1f2ef9d9ac2549a391ad7752b8ab0f89d 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererDH.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererDH.java @@ -7,20 +7,13 @@ import info.textgrid.middleware.oaipmh.ListMetadataFormatsType; */ public class MetadataFormatListDelivererDH extends MetadataFormatListDelivererAbstract { - /** - * @param textgrid - * @param dariah - */ - public MetadataFormatListDelivererDH() { - // NOTE We do not have specific metadata formats for DHREP right now. - } - /** * */ @Override public ListMetadataFormatsType setMetadataFormatList(String id) { - // Get things from abstract class. + // Get things from abstract class, we do not have different metadata formats for different + // identifiers! Get the two defaults here. return super.setMetadataFormatList(); } diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererTG.java b/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererTG.java index 2ad0e6512d83f937619e8d10ee8f17a5dcc07369..334fe565fbe3827cf7f662fefdab26889f3f5ac2 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererTG.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererTG.java @@ -20,13 +20,6 @@ public class MetadataFormatListDelivererTG extends MetadataFormatListDelivererAb public static final String URI = "textgridUri"; - /** - * - */ - public MetadataFormatListDelivererTG() { - // - } - /** * <p> * Get metadata format list for specific ID. @@ -35,14 +28,12 @@ public class MetadataFormatListDelivererTG extends MetadataFormatListDelivererAb @Override public ListMetadataFormatsType setMetadataFormatList(String id) { + ListMetadataFormatsType result = new ListMetadataFormatsType(); + String[] includes = new String[] {URI}; String[] excludes = Strings.EMPTY_ARRAY; FetchSourceContext fetchSourceContext = new FetchSourceContext(true, includes, excludes); - ListMetadataFormatsType lmft = new ListMetadataFormatsType(); - MetadataFormatType mft = new MetadataFormatType(); - MetadataFormatType openAireMetadataFormat = new MetadataFormatType(); - GetRequest getRequest = new GetRequest(this.oaiEsClient.getEsIndex(), this.oaiEsClient.getEsType(), id.replace("textgrid:", "")).fetchSourceContext(fetchSourceContext); @@ -51,29 +42,18 @@ public class MetadataFormatListDelivererTG extends MetadataFormatListDelivererAb try { tgObject = this.oaiEsClient.getEsClient().get(getRequest, RequestOptions.DEFAULT); + // Check if object is existing in TG. if (tgObject.isExists()) { - setIdExist(true); - mft.setMetadataPrefix(OaipmhConstants.METADATA_OAIDC_PREFIX); - mft.setMetadataNamespace(OaipmhConstants.OAIDC_NAMESPACE); - mft.setSchema(OaipmhConstants.OAIDC_SCHEMA_LOCATION); - - openAireMetadataFormat.setMetadataPrefix(OaipmhConstants.METADATA_OPENAIRE_PREFIX); - openAireMetadataFormat.setMetadataNamespace(OaipmhConstants.DATACITE_NAMESPACE); - openAireMetadataFormat.setSchema(OaipmhConstants.DATACITE_SCHEMA_LOCATION); + result = setMetadataFormatList(); - lmft.getMetadataFormat().add(mft); - lmft.getMetadataFormat().add(openAireMetadataFormat); - - } else { - setIdExist(false); - lmft = null; + // TODO Check here, if object is existing in IDIOM? } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } - return lmft; + return result; } /** 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 f02e9f374be049a7bf45516900c7aec830745ef4..710d26b77a3d6e0b2713cc6ea13fbdd677e170b6 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 a7cad1e61a3e63a1aaa60bd141ab7c6ea631d615..a566ecc7daf07d0fe2675911d038912699a76d3e 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 { @@ -419,6 +417,9 @@ public class OaipmhImpl implements OaipmhProducer { } if (listIdentifiers != null) { + if (listIdentifiers.getHeader() == null || listIdentifiers.getHeader().isEmpty()) { + return oaipmhError(oaipmhRoot, OaipmhConstants.OAI_NO_RECORD_MATCH, ""); + } oaipmhRoot.setListIdentifiers(listIdentifiers); } else { return oaipmhError(oaipmhRoot, OaipmhConstants.OAI_NO_RECORD_MATCH, @@ -481,9 +482,10 @@ public class OaipmhImpl implements OaipmhProducer { public OAIPMHtype listMetadataFormatsRequest(String id, OAIPMHtype oaipmhRoot, RequestType request) { - List<String> errorValues = new ArrayList<String>(); ListMetadataFormatsType listMF = new ListMetadataFormatsType(); + List<String> errorValues = new ArrayList<String>(); + if (this.metadataFormatList.requestChecker(request)) { if (id.isEmpty()) { @@ -492,7 +494,7 @@ public class OaipmhImpl implements OaipmhProducer { listMF = this.metadataFormatList.setMetadataFormatList(request.getIdentifier()); } - if (listMF != null) { + if (listMF != null && !listMF.getMetadataFormat().isEmpty()) { oaipmhRoot.setListMetadataFormats(listMF); } else { return oaipmhError(oaipmhRoot, OaipmhConstants.OAI_NO_RECORD_MATCH, ILLEGAL_ID); @@ -617,6 +619,9 @@ public class OaipmhImpl implements OaipmhProducer { } if (listRecords != null) { + if (listRecords.getRecord() == null || listRecords.getRecord().isEmpty()) { + return oaipmhError(oaipmhRoot, OaipmhConstants.OAI_NO_RECORD_MATCH, ""); + } oaipmhRoot.setListRecords(listRecords); } else { return oaipmhError(oaipmhRoot, OaipmhConstants.OAI_BAD_ARGUMENT, ILLEGAL_OTHER); @@ -778,7 +783,7 @@ public class OaipmhImpl implements OaipmhProducer { // Set the responseDate of today. try { - oaipmhRoot.setResponseDate(OaipmhUtilities.getXMLGregorianCalendarNow()); + oaipmhRoot.setResponseDate(OaipmhUtilities.getCurrentUTCDateAsGregorian()); } 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 c4638b946e7d8f874859fdbf60a9992cad11904b..c9f4017dd8cf26358bd331c55e5b975d12d23875 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhUtilities.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhUtilities.java @@ -5,16 +5,18 @@ import java.io.StringWriter; import java.math.BigInteger; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.OffsetDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; -import java.util.GregorianCalendar; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; -import java.util.TimeZone; import java.util.logging.Logger; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; @@ -33,8 +35,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 +52,10 @@ import info.textgrid.namespaces.middleware.tgauth.ProjectInfo; */ public class OaipmhUtilities { + // ** + // STATICS + // ** + private static Logger log = Logger.getLogger(OaipmhUtilities.class.getName()); // ** @@ -64,9 +68,15 @@ public class OaipmhUtilities { public static final String PREFIX_DEVIDER = ":"; public static final String PREFIX_HDL = "hdl"; public static final String PREFIX_TEXTGRID = "textgrid"; - public static final Set<String> IDENTIFIER_PREFIXES_TO_FILTER = new HashSet<String>(Arrays.asList( - PREFIX_HDL, - PREFIX_TEXTGRID)); + public static final Set<String> IDENTIFIER_PREFIXES_TO_FILTER = + new HashSet<String>(Arrays.asList(PREFIX_HDL, PREFIX_TEXTGRID)); + + // Define date formats. + public static final String OAIDC_UTC_TIME_FORMAT_String = "yyyy-MM-dd'T'HH:mm:ss'Z'"; + public static final DateTimeFormatter UTC_FORMATTER = + DateTimeFormatter.ofPattern(OAIDC_UTC_TIME_FORMAT_String).withZone(ZoneId.of("UTC")); + public static final SimpleDateFormat FROM_UNTIL_FORMAT = + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); // ** // CLASS @@ -84,32 +94,6 @@ public class OaipmhUtilities { // STATICS // ** - /** - * @param verb - * @return - */ - public static boolean isOAIPMH_RequestArgument(String verb) { - String allowedArgument = "^[identifier,from,until,set,resumptionToken,metadataPrefix]*$"; - 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,87 +119,82 @@ public class OaipmhUtilities { /** * <p> - * Producing the list of all metadata formats. + * Get the current UTC date string for OAI-PMH response dates from current system millis. * </p> * - * @return tgRepMetadaFormats + * @return */ - public ListMetadataFormatsType setMetadataFormatList() { - - ListMetadataFormatsType tgRepMetadataFormats = new ListMetadataFormatsType(); - MetadataFormatType tgDublinCore = setMetadataFormats(); - tgRepMetadataFormats.getMetadataFormat().add(tgDublinCore); - - return tgRepMetadataFormats; + public static String getCurrentUTCDateAsString() { + return UTC_FORMATTER.format(Instant.now()); } /** * <p> - * Calculating the current date and give it back as XMLGregorianCalendar. + * Converting a given string representing a date value into the date format required for OAIPMH + * and give it back as string. * </p> * - * @return now - * @throws DatatypeConfigurationException + * @param originalDateTimeString + * @return */ - public static XMLGregorianCalendar getXMLGregorianCalendarNow() - throws DatatypeConfigurationException { - - GregorianCalendar gregorianCalendar = new GregorianCalendar(); - DatatypeFactory datatypeFactory = DatatypeFactory.newInstance(); - XMLGregorianCalendar now = datatypeFactory.newXMLGregorianCalendar(gregorianCalendar); - - return now; + public static String getUTCDateAsString(String originalDateTimeString) { + return UTC_FORMATTER.format(Instant.from(OffsetDateTime.parse(originalDateTimeString))); } /** * <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 - * @throws ParseException + * @return * @throws DatatypeConfigurationException */ - public static XMLGregorianCalendar oaiDatestampAsGregorian(String originalDateTimeString) - throws ParseException, DatatypeConfigurationException { - - log.fine("original date time string: " + 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); + public static XMLGregorianCalendar getUTCDateAsGregorian(String originalDateTimeString) + throws DatatypeConfigurationException { + return DatatypeFactory.newInstance() + .newXMLGregorianCalendar(getUTCDateAsString(originalDateTimeString)); + } - return xmlCal; + /** + * @param originalDateTimeString + * @return + * @throws DatatypeConfigurationException + */ + public static XMLGregorianCalendar getCurrentUTCDateAsGregorian() + throws DatatypeConfigurationException { + return getUTCDateAsGregorian(getCurrentUTCDateAsString()); } /** * <p> - * Converting a given string representing a date value into the date format required for OAIPMH - * and give it back as string. + * Parse incoming date for UTS format. * </p> * - * @param originalDateTimeString - * @return dateOutputAsString - * @throws ParseException + * @param incomingDate + * @return */ - public static String oaiDatestampAsString(String originalDateTimeString) throws ParseException { + public static boolean isCorrectFromUntilDate(String incomingDate) { + + boolean result = false; + + log.fine("incoming date: " + incomingDate); - log.fine("incoming date: " + originalDateTimeString); + try { + Date d = FROM_UNTIL_FORMAT.parse(incomingDate); + FROM_UNTIL_FORMAT.format(d); + + log.fine("date used: " + result); - 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); + result = true; + } catch (ParseException e) { - log.fine("outgoing date: " + dateOutputAsString); + log.warning("date not usable for from/until: " + incomingDate); + + result = false; + } - return dateOutputAsString; + return result; } /** @@ -223,140 +202,71 @@ public class OaipmhUtilities { * Returns a resumptionToken for a search, if necessary. * </p> * - * TODO Check if we really must put all these references in! - * * @param completeListSize * @param resumptionToken * @param cursorCollector * @param scrollID * @param searchResponseSize - * @param i * @return A resumption token if applicable, null otherwise. */ public static ResumptionTokenType getResumptionToken(final long completeListSize, final String resumptionToken, Map<String, Integer> cursorCollector, final String scrollID, - final int searchResponseSize, final int i) { + final int searchResponseSize) { - log.fine("Creating a ResumptionToken:\n" + " CompleteListSize: " + completeListSize + "\n" - + " ResumptionToken: " + resumptionToken + "\n" + " CursorCollector: " + cursorCollector - + "\n" + " ScrollID: " + scrollID + "\n" + " SearchResponseSize: " + searchResponseSize - + "\n" + " IterationStep: " + i); + ResumptionTokenType result = null; - int cursor; + log.fine("need a resumption token?\n" + + " completeListSize: " + completeListSize + "\n" + + " searchResponseSize: " + searchResponseSize + "\n" + + " resumptionToken: " + resumptionToken + "\n" + + " scrollID: " + scrollID + "\n" + + " cursorCollector (size:" + cursorCollector.size() + "): " + cursorCollector + "\n"); - // Three cases here: - // 1. Complete list size is > searchResponseSize and a token already is existing: we need to - // check hash map! - // 2. Complete list size is > searchResponseSize and we have no token: we do need one! - // 3. Complete list size is <= searchResponseSize (we do not need a token! do nothing!) if (completeListSize > searchResponseSize) { - ResumptionTokenType resTokenForResponse = new ResumptionTokenType(); + int cursor; + result = new ResumptionTokenType(); - if (resumptionToken != null && cursorCollector.containsKey(resumptionToken)) { - - cursor = cursorCollector.get(resumptionToken).intValue() + i; - if (cursor == searchResponseSize) { - // TODO Why not "cursor += searchResponseSize;" ?? - cursor = 2 * searchResponseSize; - } - resTokenForResponse.setCursor(BigInteger.valueOf((long) cursor)); - cursorCollector.put(scrollID, cursor); - } else { - resTokenForResponse.setCursor(BigInteger.valueOf(searchResponseSize)); - cursorCollector.put(scrollID, searchResponseSize); - cursor = searchResponseSize; - resTokenForResponse.setCursor(BigInteger.valueOf((long) cursor)); + log.fine("yes, we NEED a restok"); - log.fine("New ResumptionToken created from scroll ID: " + cursorCollector.get(scrollID)); - } - - // Set resumption token string if cursor is less then complete list size: More objects can be - // delivered! - if (cursor < completeListSize) { - resTokenForResponse.setValue(scrollID); + // 1. Complete list size is > searchResponseSize and a token already is existing: we need to + // check hash map! + if (resumptionToken != null && cursorCollector.containsKey(resumptionToken)) { + // Get cursor from resumption token map and increase. + cursor = cursorCollector.get(resumptionToken).intValue() + searchResponseSize; } - - // Remove resumption token string if cursor is bigger then or equal complete list size: This - // is the last response, no more objects are available! - if (cursor >= completeListSize) { - resTokenForResponse.setValue(""); + // 2. Complete list size is > searchResponseSize and we have no token: we do need one! + else { + // Cursor must be 0 in first response. + cursor = 0; } + // Set cursor, token value, and complete list size. + result.setCursor(BigInteger.valueOf(cursor)); + result.setValue(scrollID); + result.setCompleteListSize(BigInteger.valueOf(completeListSize)); + // Update token map. + cursorCollector.put(scrollID, cursor); - // Set complete list size. - resTokenForResponse.setCompleteListSize(BigInteger.valueOf(completeListSize)); - - return resTokenForResponse; - } - - return null; - } - - /** - * @param dateToValidate - * @return - */ - 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; - } + log.fine("restok from scroll id (cursor: " + cursor + "): " + result.getValue()); - /** - * @param dateToValidate - * @return - */ - public static boolean isThisDateValidToOtherTimeStamp(String dateToValidate) { + // Last response, no more objects are available! + if ((cursor + searchResponseSize) >= completeListSize) { + // Remove resumption token string from response, and clear token map. + result.setValue(""); + cursorCollector.remove(scrollID); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + log.fine("last response, restok deleted"); - dateFormat.setLenient(false); - dateFormat.setLenient(false); - try { - dateFormat.parse(dateToValidate.trim()); - } catch (ParseException pe) { - return false; + // FIXME See, how large the map is getting! Add expiration date to response and delete + // expired tokens!! + } } - 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",}; - - /** - * @param d - * @return - */ - 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) { - // TODO Handle Exception! - } - } + // 3. Complete list size is <= searchResponseSize (we do not need a token! do nothing!) + else { + log.fine("no, we do NOT need a restok!"); } - return d; + return result; } /** @@ -456,7 +366,7 @@ public class OaipmhUtilities { * @param field * @return Returns only the first String from the result list, or "" if list is empty. */ - public static String firstEnrtryFieldLoader(JSONObject resultFromGetRequestInES, String field) { + public static String firstEntryFieldLoader(JSONObject resultFromGetRequestInES, String field) { String result = ""; @@ -500,9 +410,15 @@ public class OaipmhUtilities { log.fine("get request id: " + getRequest.id()); - // Declaration of the result from the get-request + // Declaration of the result from the get-request. GetResponse esResultObject = theESClient.getEsClient().get(getRequest, RequestOptions.DEFAULT); + log.fine("es result object is existing: " + esResultObject.isExists()); + + if (!esResultObject.isExists()) { + throw new IOException("es record with id " + idInElasticSearchIndex + " is not existing!"); + } + return esResultObject; } @@ -537,31 +453,6 @@ public class OaipmhUtilities { return getRecordType; } - /** - * @param propertyName - * @param propFile - * @return - */ - @Deprecated - public static String[][] fetchArrayFromPropFile(String propertyName, Properties propFile) { - - // TODO Why get a 2D array and only use the first element in RecordDelivererDatacite? - // BTW Where does the ";" come from anyway? - - // Get array split up by the semicolon. - String[] a = propFile.getProperty(propertyName).split(";"); - - // Create the two dimensional array with correct size. - String[][] array = new String[a.length][a.length]; - - // Combine the arrays split by semicolon and comma. - for (int i = 0; i < a.length; i++) { - array[i] = a[i].split(","); - } - - return array; - } - /** * @param propertyName * @param propFile 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 c7e41b8d92fff52b859a20a00b98a491e1a895c5..5a3e2f30be9c75b2a8b1c9c323c8a952b3d49b7b 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDC.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDC.java @@ -77,20 +77,15 @@ public class RecordDelivererDC extends RecordDelivererAbstract { if (this.dariah == true) { dublinCoreBuilder = putContentIntoDCFieldListsDH(esResultObject); JSONObject json = new JSONObject(esResultObject.getSourceAsMap()); - identifier = OaipmhUtilities.firstEnrtryFieldLoader(json, this.identifierField); + identifier = OaipmhUtilities.firstEntryFieldLoader(json, this.identifierField); String dateOfCreation = "NO_DATE_SET!"; - if (OaipmhUtilities.firstEnrtryFieldLoader(json, this.dateOfObjectCreation) != null) { - try { - dateOfCreation = OaipmhUtilities.oaiDatestampAsString( - OaipmhUtilities.firstEnrtryFieldLoader(json, this.dateOfObjectCreation).toString()); - } catch (ParseException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + if (OaipmhUtilities.firstEntryFieldLoader(json, this.dateOfObjectCreation) != null) { + dateOfCreation = OaipmhUtilities.getUTCDateAsString( + OaipmhUtilities.firstEntryFieldLoader(json, this.dateOfObjectCreation).toString()); } - String setSpec = OaipmhUtilities.firstEnrtryFieldLoader(json, this.specField); + String setSpec = OaipmhUtilities.firstEntryFieldLoader(json, this.specField); String setSpecValue = OaipmhUtilities.getSetSpec(setSpec, this.specFieldPrefix, identifier); @@ -125,13 +120,14 @@ public class RecordDelivererDC extends RecordDelivererAbstract { String dateOfCreation = esResultObject.getSourceAsMap().get(this.dateOfObjectCreation).toString(); + log.fine("date of creation: " + dateOfCreation); + String setSpec = DublinCoreFieldLoader .fillListFromTGWorkValues(esResultObject, this.relationList).get(0); String setSpecValue = OaipmhUtilities.getSetSpec(setSpec, this.specFieldPrefix, identifier); - String convertedCreationDate = - OaipmhUtilities.oaiDatestampAsString(dateOfCreation).toString(); + String convertedCreationDate = OaipmhUtilities.getUTCDateAsString(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 fcf30a2abb238b78059260a0609a087d978a1193..8a2a116797fbc00f2cace627fdfcf0fb5f96e233 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDatacite.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDatacite.java @@ -161,8 +161,8 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract { } // Set response header. - String datestamp = OaipmhUtilities.oaiDatestampAsString( - OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, this.dateOfObjectCreation)); + String datestamp = OaipmhUtilities.getUTCDateAsString( + OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, this.dateOfObjectCreation)); String identifier = ""; if (!idInElasticSearchIndex.startsWith(this.repositoryObjectURIPrefix)) { @@ -170,8 +170,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract { } else { identifier = idInElasticSearchIndex; } - - String setSpec = OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, this.specField); + String setSpec = OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, this.specField); String setSpecValue = OaipmhUtilities.getSetSpec(setSpec, this.specFieldPrefix, identifier); HeaderType header = OaipmhUtilities.computeResponseHeader(datestamp, identifier, setSpecValue); @@ -282,7 +281,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract { Sizes sizes = new Sizes(); String size = - OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, this.oarSizeField) + " " + BYTES; + OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, this.oarSizeField) + " " + BYTES; sizes.getSize().add(size); return sizes; @@ -305,17 +304,17 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract { if (this.textgrid) { Subject subject = new Subject(); String value = - OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, subjectField + DOT_VALUE); + OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, subjectField + DOT_VALUE); if (!value.isEmpty()) { subject.setValue(value); } String scheme = - OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, subjectField + DOT_ID + DOT_VALUE); + OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, subjectField + DOT_ID + DOT_VALUE); if (!scheme.isEmpty()) { subject.setSubjectScheme(scheme); } String schemeURI = - OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, subjectField + DOT_ID + DOT_TYPE); + OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, subjectField + DOT_ID + DOT_TYPE); if (schemeURI.isEmpty()) { subject.setSchemeURI(schemeURI); } @@ -351,7 +350,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract { String version = ""; for (String versionField : this.oarVersionFields) { - version = OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, versionField); + version = OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, versionField); } return version; @@ -372,7 +371,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract { // ** if (this.textgrid) { - String resourceValue = OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, format); + String resourceValue = OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, format); resourceType.setValue(resourceValue); // Set collection for all aggregation types, take also into account: images and text. if (TextGridMimetypes.AGGREGATION_SET.contains(format)) { @@ -400,7 +399,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract { // ** else if (this.dariah) { - String resourceValue = OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, format); + String resourceValue = OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, format); resourceType.setValue(resourceValue); // Set collection for DARIAH collection type here, data object for everything else. if (TextGridMimetypes.DARIAH_COLLECTION.equals(format)) { @@ -430,7 +429,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract { for (String geoLocationField : this.oarGeoLocationFields) { GeoLocation geoLocation = new GeoLocation(); - String place = OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, geoLocationField); + String place = OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, geoLocationField); geoLocation.setGeoLocationPlace(place); if (!place.isEmpty()) { geoLocations.getGeoLocation().add(geoLocation); @@ -468,12 +467,12 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract { // relatedIdentifier.setSchemeURI(TGConstants.TEXTGRID_METADATASCHEME_URI); String uriForWork = - OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, relatedIdentifierField) + OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, relatedIdentifierField) .replace(this.repositoryObjectURIPrefix, ""); relatedIdentifier .setValue( OaipmhUtilities - .firstEnrtryFieldLoader( + .firstEntryFieldLoader( new JSONObject( OaipmhUtilities.getRcordByIDFromElasticSearch(this.oaiEsClient, uriForWork, workFields, Strings.EMPTY_ARRAY).getSource()), @@ -535,7 +534,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract { if (this.textgrid) { String idForWorkObject = - OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, this.relationToWorkObject); + OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, this.relationToWorkObject); if (idForWorkObject != null) { idForWorkObject = idForWorkObject.replace(this.repositoryObjectURIPrefix, ""); JSONObject resultOfFurtherObject = @@ -590,9 +589,9 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract { if (this.textgrid) { Rights rights = new Rights(); rights.setRightsURI( - OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, rightsField + LICENSE_URI)); + OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, rightsField + LICENSE_URI)); rights.setValue( - OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, rightsField + DOT_VALUE)); + OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, rightsField + DOT_VALUE)); rightsResultList.getRights().add(rights); } @@ -658,7 +657,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract { if (this.textgrid) { AlternateIdentifier alternateIdentifier = new AlternateIdentifier(); alternateIdentifier.setValue( - OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, alternateIdentifierField)); + OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, alternateIdentifierField)); alternateIdentifier.setAlternateIdentifierType(ID_TYPE_URI); alternateIdentifiers.getAlternateIdentifier().add(alternateIdentifier); } @@ -727,7 +726,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract { Contributor contributor = new Contributor(); if (contributorField.equals("project")) { String fieldContent = - OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, contributorField + DOT_VALUE); + OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, contributorField + DOT_VALUE); if (fieldContent != null && !fieldContent.isEmpty()) { contributor.setContributorName(fieldContent); contributor.setContributorType(ContributorType.OTHER); @@ -735,7 +734,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract { new info.textgrid.middleware.oaipmh.Resource.Contributors.Contributor.NameIdentifier(); name.setNameIdentifierScheme(TG_PROJECT_CONTRIBUTOR_SCHEME); name.setValue( - OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, contributorField + DOT_ID)); + OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, contributorField + DOT_ID)); name.setSchemeURI(TG_PROJECT_CONTRIBUTOR_SCHEME_URI); if (!name.getValue().isEmpty() && !name.getNameIdentifierScheme().isEmpty() && !name.getSchemeURI().isEmpty()) { @@ -745,7 +744,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract { } } else { String fieldContent = - OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, contributorField); + OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, contributorField); if (fieldContent != null && !fieldContent.isEmpty()) { contributor.setContributorName(fieldContent); contributor.setContributorType(ContributorType.DATA_MANAGER); @@ -798,34 +797,31 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract { for (String dateField : this.oarDateFields) { Date dateInOpenAireRecord = new Date(); - try { - // Only one value per field is needed here (I think). - String dateValue = OaipmhUtilities - .oaiDatestampAsString(OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, dateField)); - dateInOpenAireRecord.setValue(dateValue); - // TODO Use extra created, issued, and updated fields in configuration! + // Only one value per field is needed here (I think). + // We need ISO8601 here, take entries as they come from ElasticSearch! + String dateValue = OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, dateField); + dateInOpenAireRecord.setValue(dateValue); - // Filter TextGrid values for date type. - if (dateField.equals("created")) { - dateInOpenAireRecord.setDateType(DateType.CREATED); - } - if (dateField.equals("issued")) { - dateInOpenAireRecord.setDateType(DateType.ISSUED); - } - if (dateField.equals("lastModified")) { - dateInOpenAireRecord.setDateType(DateType.UPDATED); - } + // TODO Use extra created, issued, and updated fields in configuration! - // Filter DARIAH values for date type. - if (dateField.equals("administrativeMetadata.dcterms:created")) { - dateInOpenAireRecord.setDateType(DateType.CREATED); - } - if (dateField.equals("administrativeMetadata.dcterms:modified")) { - dateInOpenAireRecord.setDateType(DateType.UPDATED); - } - } catch (ParseException e) { - log.severe("could not parse date field: " + e.getMessage()); + // Filter TextGrid values for date type. + if (dateField.equals("created")) { + dateInOpenAireRecord.setDateType(DateType.CREATED); + } + if (dateField.equals("issued")) { + dateInOpenAireRecord.setDateType(DateType.ISSUED); + } + if (dateField.equals("lastModified")) { + dateInOpenAireRecord.setDateType(DateType.UPDATED); + } + + // Filter DARIAH values for date type. + if (dateField.equals("administrativeMetadata.dcterms:created")) { + dateInOpenAireRecord.setDateType(DateType.CREATED); + } + if (dateField.equals("administrativeMetadata.dcterms:modified")) { + dateInOpenAireRecord.setDateType(DateType.UPDATED); } dates.getDate().add(dateInOpenAireRecord); @@ -840,7 +836,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract { private Identifier addIdentifier() { Identifier identifier = new Identifier(); - String idValue = OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, this.oarIdentifierField); + String idValue = OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, this.oarIdentifierField); // ** // TextGrid @@ -884,10 +880,10 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract { if (this.textgrid) { Creator creator = new Creator(); - creator.setCreatorName(OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, creatorField)); + creator.setCreatorName(OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, creatorField)); NameIdentifier nameIdentifier = new NameIdentifier(); // TODO: creatorID Field from config file - String creatorID = OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, + String creatorID = OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, "edition.source.bibliographicCitation.author.id"); if (creatorID != null && creatorID.contains(":")) { nameIdentifier.setValue(creatorID.split(":")[1]); @@ -996,8 +992,8 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract { */ private String addPublicationYear() throws ParseException, DatatypeConfigurationException { return Integer.toString(OaipmhUtilities - .oaiDatestampAsGregorian( - OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, this.dateOfObjectCreation)) + .getUTCDateAsGregorian( + OaipmhUtilities.firstEntryFieldLoader(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 028538d587a07ad2f0fd77e438e12313a8951be5..2017672bd1cc7fa47988e5cd9782db2f74f973bf 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererIdiom.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererIdiom.java @@ -87,6 +87,10 @@ public class RecordDelivererIdiom extends RecordDelivererAbstract { String creationDate = getIdiomInfoFromES(textgridRevisionURI, CREATED); String modificationDate = getIdiomInfoFromES(textgridRevisionURI, LAST_MODIFIED); + log.fine("object type: " + objectType); + log.fine("textgrid creationDate: " + creationDate); + log.fine("textgrid modificationDate: " + modificationDate); + // Get TG URI from ID. if (!textgridRevisionURI.startsWith(TEXTGRID_URI_PREFIX)) { textgridRevisionURI = TEXTGRID_URI_PREFIX + textgridRevisionURI; @@ -96,7 +100,6 @@ public class RecordDelivererIdiom extends RecordDelivererAbstract { String textgridBaseURI = OaipmhUtilities.getTextGridBaseURI(textgridRevisionURI); log.fine("textgrid base uri: " + textgridBaseURI); - log.fine("object type is: " + objectType); log.fine(objectType + " doc/dom: " + creationDate + "/" + modificationDate); if (objectType.equals("ARTEFACT")) { @@ -148,8 +151,7 @@ public class RecordDelivererIdiom extends RecordDelivererAbstract { // No setSpec needed here! It COULD be the IDIOM project ID, but we do not need it at the // moment. String setSpec = ""; - String convertedModificationDate = - OaipmhUtilities.oaiDatestampAsString(modificationDate).toString(); + String convertedModificationDate = OaipmhUtilities.getUTCDateAsString(modificationDate); // We need to have the base URI here in header (and record), it is used as Record ID of Mayan // artifacts here! HeaderType header = @@ -222,7 +224,7 @@ public class RecordDelivererIdiom extends RecordDelivererAbstract { json = new JSONObject(OaipmhUtilities.getRcordByIDFromElasticSearch(this.oaiEsClient, changedId, searchField, Strings.EMPTY_ARRAY).getSource()); - result = OaipmhUtilities.firstEnrtryFieldLoader(json, theSearchField); + result = OaipmhUtilities.firstEntryFieldLoader(json, theSearchField); return result; } 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 e4d7b740c997a8c7a0353539ac58477f7d95bb44..38b81998c7d256a7d63d44853a2f26c8c4e504a9 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererAbstract.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererAbstract.java @@ -9,8 +9,6 @@ import info.textgrid.middleware.oaipmh.ResumptionTokenType; /** * @author Maximilian Brodhun, SUB Göttingen * @author Stefan E. Funk, SUB Göttingen - * @version 2022-09-07 - * @since */ public abstract class RecordListDelivererAbstract implements RecordListDelivererInterface { @@ -85,16 +83,16 @@ public abstract class RecordListDelivererAbstract implements RecordListDeliverer if (request.getIdentifier() != null) { errorValues.add("identifier"); } - /* - * if(request.getFrom()!= null && (!OAIPMHUtilities.isThisDateValid(request.getFrom()) && - * !OAIPMHUtilities.isThisDateValidToOtherTimeStamp(request.getFrom()))) { - * errorValues.add("from"); } if(request.getUntil() != null && - * (!OAIPMHUtilities.isThisDateValid(request.getUntil()) && - * !OAIPMHUtilities.isThisDateValidToOtherTimeStamp(request.getUntil()))) { - * errorValues.add("until"); } if(request.getFrom()!= null && request.getUntil()!=null && - * !OAIPMHUtilities.getFormatOfDate(request.getFrom()).equals(OAIPMHUtilities.getFormatOfDate( - * request.getFrom()))) { errorValues.add("until, from"); } - */ + + // Check from and util. + if (request.getFrom() != null && !OaipmhUtilities.isCorrectFromUntilDate(request.getFrom())) { + errorValues.add("from"); + } + if (request.getUntil() != null && !OaipmhUtilities.isCorrectFromUntilDate(request.getUntil())) { + errorValues.add("until"); + } + + // Set error messages. if (errorValues.size() > 0) { result.setError(OaipmhConstants.OAI_BAD_ARGUMENT, "The request includes illegal arguments " + "or is missing required arguments: " + errorValues); @@ -205,7 +203,6 @@ public abstract class RecordListDelivererAbstract implements RecordListDeliverer this.resTokenForResponse = resTokenForResponse; } - /** * @return */ @@ -220,7 +217,6 @@ public abstract class RecordListDelivererAbstract implements RecordListDeliverer this.modifiedField = modifiedField; } - /** * @return */ @@ -326,7 +322,6 @@ public abstract class RecordListDelivererAbstract implements RecordListDeliverer return this.formatToFilter; } - /** * @return */ 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 5ca6ce5bcbce300d15db2c001731776ac7892c63..976f99c6f5c9ef2608a8f91946beac382d92861c 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java @@ -185,13 +185,10 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract { if (completeListSize > 0) { setFoundItems(true); - int i = 0; for (SearchHit hit : scrollResp.getHits().getHits()) { - i++; - if (hit != null && hit.getFields() != null) { JSONObject json = new JSONObject(hit.getSourceAsMap()); - this.modifiedValue = OaipmhUtilities.firstEnrtryFieldLoader(json, this.modifiedField); + this.modifiedValue = OaipmhUtilities.firstEntryFieldLoader(json, this.modifiedField); // ** // TEXTGRID SEARCH @@ -219,7 +216,7 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract { String identifier = hit.getSourceAsMap().get(this.identifierField).toString(); HeaderType header = OaipmhUtilities.computeResponseHeader( - OaipmhUtilities.oaiDatestampAsString(this.modifiedValue).toString(), identifier, + OaipmhUtilities.getUTCDateAsString(this.modifiedValue).toString(), identifier, setSpec); buildRecord(recordList, header, dublinCoreBuilder); @@ -240,14 +237,14 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract { else if (this.dariah) { // Get identifier and setSpec field, add setSpec prefix if not already set. - String identifier = OaipmhUtilities.firstEnrtryFieldLoader(json, this.identifierField); + String identifier = OaipmhUtilities.firstEntryFieldLoader(json, this.identifierField); String setSpec = OaipmhUtilities.getSetSpec(set, this.specFieldPrefix, identifier); try { dublinCoreBuilder = putContentIntoDCFieldListsDH(hit); HeaderType header = OaipmhUtilities.computeResponseHeader( - OaipmhUtilities.oaiDatestampAsString(this.modifiedValue).toString(), identifier, + OaipmhUtilities.getUTCDateAsString(this.modifiedValue).toString(), identifier, setSpec); buildRecord(recordList, header, dublinCoreBuilder); @@ -262,16 +259,8 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract { } } - // Check the need for a resumption token! - - log.fine("completeListSize: " + completeListSize); - log.fine("resumptionToken: " + resumptionToken); - log.fine("scrollid: " + scrollID); - log.fine("searchResponseSize: " + this.searchResponseSize); - ResumptionTokenType resTokenForResponse = OaipmhUtilities.getResumptionToken(completeListSize, - resumptionToken, cursorCollector, scrollID, this.searchResponseSize, i); - + resumptionToken, cursorCollector, scrollID, this.searchResponseSize); if (resTokenForResponse != null) { log.fine("resTokenForResponse: " + resTokenForResponse.getValue()); } diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDatacite.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDatacite.java index 13ad6559fa06843c6ac0ff489d5a32b19115213c..ee8c57385d7568c5bbd9e31bc9972fc18a2e6b71 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDatacite.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDatacite.java @@ -207,10 +207,7 @@ public class RecordListDelivererDatacite extends RecordListDelivererAbstract { if (completeListSize > 0) { setFoundItems(true); - int i = 0; - for (SearchHit hit : scrollResp.getHits().getHits()) { - i++; if (hit != null && hit.getFields() != null) { String id2add; // TODO Could we not use hit.getId() also for TG hits? Where is the difference? @@ -232,14 +229,13 @@ public class RecordListDelivererDatacite extends RecordListDelivererAbstract { this.resTokenForResponse.setValue(""); } else { this.resTokenForResponse = OaipmhUtilities.getResumptionToken(completeListSize, - resumptionToken, cursorCollector, scrollID, this.searchResponseSize, i); + resumptionToken, cursorCollector, scrollID, this.searchResponseSize); } } else { setFoundItems(false); } - return uriList; } 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 14bbe724680da889860f15adbe90e2a668d1f6de..87a9f872409bdff85edf9c8fdfee5bda860563e3 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIdiom.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIdiom.java @@ -141,15 +141,13 @@ public class RecordListDelivererIdiom extends RecordListDelivererAbstract { if (completeListSize > 0) { setFoundItems(true); - int i = 0; for (SearchHit hit : scrollResp.getHits().getHits()) { - i++; - log.fine("hit no." + i + ": id=" + hit.getId()); + log.fine("hit no." + hit.getIndex() + ": id=" + hit.getId()); String textgridURI = OaipmhUtilities - .firstEnrtryFieldLoader(new JSONObject(hit.getSourceAsMap()), this.identifierField); + .firstEntryFieldLoader(new JSONObject(hit.getSourceAsMap()), this.identifierField); log.fine("textgrid uri: " + textgridURI); @@ -173,7 +171,7 @@ public class RecordListDelivererIdiom extends RecordListDelivererAbstract { // Check the need for a resumption token! ResumptionTokenType responseToken = OaipmhUtilities.getResumptionToken(completeListSize, - resumptionToken, cursorCollector, scrollID, IDIOM_RESPONSE_SIZE, i); + resumptionToken, cursorCollector, scrollID, IDIOM_RESPONSE_SIZE); if (responseToken != null) { recordList.setResumptionToken(responseToken); } diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererInterface.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererInterface.java index b79343d8158fd6400f52105d8ac9318a9b87231b..c22a2b06ac689e127eec7c5b6e56f2b19ae37e55 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererInterface.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererInterface.java @@ -9,7 +9,6 @@ import info.textgrid.middleware.oaipmh.ListRecordsType; */ public interface RecordListDelivererInterface { - /** * @param from * @param to diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestDHOaipmhLocally.java b/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestDHOaipmhLocally.java index 9d18a65b00bf38c5b17ca1a0bf88ad400585acf0..fa8f5a8af7bfbd8a2053dd25b7542231127d5168 100644 --- a/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestDHOaipmhLocally.java +++ b/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestDHOaipmhLocally.java @@ -281,7 +281,7 @@ public class TestDHOaipmhLocally { // System.out.println(json); DublinCoreBuilder result = new DublinCoreBuilder(); List<String> identifier = new ArrayList<String>(); - System.out.println(OaipmhUtilities.firstEnrtryFieldLoader(json, TEST_DARIAH_IDENTIFIER)); + System.out.println(OaipmhUtilities.firstEntryFieldLoader(json, TEST_DARIAH_IDENTIFIER)); identifier = OaipmhUtilities.listFieldLoader(json, "descriptiveMetadata.dc:identifier"); for (String id : identifier) { System.out.println(id); @@ -330,7 +330,7 @@ public class TestDHOaipmhLocally { JSONObject json = new JSONObject(jsonAsString); DublinCoreBuilder result = new DublinCoreBuilder(); List<String> identifier = new ArrayList<String>(); - System.out.println(OaipmhUtilities.firstEnrtryFieldLoader(json, TEST_DARIAH_IDENTIFIER)); + System.out.println(OaipmhUtilities.firstEntryFieldLoader(json, TEST_DARIAH_IDENTIFIER)); identifier = OaipmhUtilities.listFieldLoader(json, "descriptiveMetadata.dc:identifier"); for (String id : identifier) { System.out.println(id); 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 f941fa50c5c1a97b3b39233920705e22f86656e6..f1168648d88880882aa266b7629bff7f6fff53cb 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,11 @@ package info.textgrid.middleware.test; import static org.junit.Assert.assertTrue; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.List; +import javax.xml.datatype.DatatypeConfigurationException; +import javax.xml.datatype.XMLGregorianCalendar; import org.junit.Test; import info.textgrid.middleware.OaipmhUtilities; @@ -178,4 +183,106 @@ public class TestOaipmhUtilities { } } + /** + * @throws DatatypeConfigurationException + */ + @Test + public void testGetUTCDateAsString() throws DatatypeConfigurationException { + + String tgDateStamp = "2012-02-10T23:45:00.507+01:00"; + String expectedUTCDate = "2012-02-10T22:45:00Z"; + String utcDate = OaipmhUtilities.getUTCDateAsString(tgDateStamp); + + if (!utcDate.equals(expectedUTCDate)) { + assertTrue(utcDate + " != " + expectedUTCDate, false); + } + } + + /** + * @throws ParseException + * @throws DatatypeConfigurationException + */ + @Test + public void testGetUTCDateAsGregorian() throws DatatypeConfigurationException { + + String tgDateStamp = "2022-07-22T14:28:13.139+02:00"; + String expectedUTCDate = "2022-07-22T12:28:13Z"; + XMLGregorianCalendar utcDate = OaipmhUtilities.getUTCDateAsGregorian(tgDateStamp); + + if (!utcDate.toString().equals(expectedUTCDate)) { + assertTrue(utcDate + " != " + expectedUTCDate, false); + } + } + + /** + * @throws DatatypeConfigurationException + * @throws ParseException + */ + @Test + public void testIsCorrectFromUntilDate() throws DatatypeConfigurationException, ParseException { + + String date = "1970-12-10T18:30:00"; + List<String> result = new ArrayList<String>(); + if (!OaipmhUtilities.isCorrectFromUntilDate(date)) { + result.add(date); + } + date = "1970-12-10T18:30"; + if (OaipmhUtilities.isCorrectFromUntilDate(date)) { + result.add(date); + } + date = "1970-12-10T18"; + if (OaipmhUtilities.isCorrectFromUntilDate(date)) { + result.add(date); + } + date = "1970-12-10"; + if (OaipmhUtilities.isCorrectFromUntilDate(date)) { + result.add(date); + } + date = "1970-12"; + if (OaipmhUtilities.isCorrectFromUntilDate(date)) { + result.add(date); + } + date = "1970"; + if (OaipmhUtilities.isCorrectFromUntilDate(date)) { + result.add(date); + } + date = "kakki"; + if (OaipmhUtilities.isCorrectFromUntilDate(date)) { + result.add(date); + } + date = "kakki-fakki"; + if (OaipmhUtilities.isCorrectFromUntilDate(date)) { + result.add(date); + } + + if (!result.isEmpty()) { + assertTrue(result.toString() + ": not ISO8691!", false); + } + } + + /** + * @throws DatatypeConfigurationException + * @throws ParseException + */ + @Test + public void testGetCurrentUTCDateAsString() + throws DatatypeConfigurationException, ParseException { + + String currentUTCDate = OaipmhUtilities.getCurrentUTCDateAsString(); + + System.out.println("UTC from current millies: " + currentUTCDate); + } + + /** + * @throws DatatypeConfigurationException + * @throws ParseException + */ + @Test + public void testGetCurrentUTCg() throws DatatypeConfigurationException, ParseException { + + XMLGregorianCalendar currentUTCDate = OaipmhUtilities.getCurrentUTCDateAsGregorian(); + + System.out.println("UTC from current millies: " + currentUTCDate); + } + } 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 fac84975f4128d595773debb9079c0a3d32a12d7..bb826ba8ba24d1318b844cdbf2b317af221e97c2 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(); + String nowTest = OaipmhUtilities.getCurrentUTCDateAsString(); 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.getUTCDateAsGregorian(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.getUTCDateAsString(dateformatbefore); System.out.println("Date after conversion: " + testDate); System.out.println("---------------------------------------------"); } @@ -289,17 +289,6 @@ public class TestTGOaipmhLocally { System.out.println("-----------------------------------\n"); } - /** - * @throws ParseException - */ - @Test - 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 */ 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 470c4be16e9b4b61e2db6d147d4d63afe10b7738..36603a88d1e72d48d18d86b4c7ab0b2806fe7196 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 @@ -479,7 +479,8 @@ public class OaipmhUtilitiesOnline { int size = Integer.parseInt(sizeStr.substring(0, sizeStr.indexOf("\""))); String cursorStr = toktag.substring(toktag.indexOf("cursor=\"") + 8); int cursor = Integer.parseInt(cursorStr.substring(0, cursorStr.indexOf("\""))); - System.out.println("\t" + theThreadName + "size: " + size + " / " + cursor); + System.out.println("\t" + theThreadName + "complete list size: " + size); + System.out.println("\tdelivered with last response: " + cursor); // If token is provided, test cursor and element count! if (!restok.isEmpty()) { @@ -495,7 +496,7 @@ public class OaipmhUtilitiesOnline { + recordsExpectedPerRequest + " if token is provided, but is " + size; assertTrue(message, false); } - if (cursor != recordsExpectedPerRequest * loopCount) { + if (cursor != recordsExpectedPerRequest * (loopCount - 1)) { String message = "cursor must be " + (loopCount * recordsExpectedPerRequest) + " in loop " + loopCount + ", but is " + cursor; assertTrue(message, false); @@ -629,13 +630,10 @@ public class OaipmhUtilitiesOnline { String headerDate = theResponseString.substring(theResponseString.indexOf(datestampTag) + datestampTag.length(), theResponseString.indexOf("</datestamp>")).trim(); - - System.out.println(headerDate); - - String recordChangeDate = theResponseString + String recordChangeDate = OaipmhUtilities.getUTCDateAsString(theResponseString .substring(theResponseString.indexOf(recordChangeTag) + recordChangeTag.length(), theResponseString.indexOf("</recordChangeDate>")) - .trim(); + .trim()); if (!headerDate.equals(recordChangeDate)) { assertTrue(headerDate + " != " + recordChangeDate, false); 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 8c91a2c0eb74b97a0d1dc62cf16f9718d8f6156d..78ee5b7891a1a70efcbda7e7aec2bf418c858ffe 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 52d488e5983b8dfa97219ee0a3d54e2763aa52fe..3a373f61077851782feecad0ced0600693584051 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 20431afaf5aa719eea036811c2df4dff4c396a96..500dae534dfabdc131b22c39537f444b63b780a8 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 { diff --git a/oaipmh-webapp/src/main/webapp/WEB-INF/beans.xml b/oaipmh-webapp/src/main/webapp/WEB-INF/beans.xml index 1a468037a5e32c55d4015d5ffe8ad72ab3560e4c..d098e2f02f4b1a7de4b302bef2d0d97c5be3dc74 100644 --- a/oaipmh-webapp/src/main/webapp/WEB-INF/beans.xml +++ b/oaipmh-webapp/src/main/webapp/WEB-INF/beans.xml @@ -93,6 +93,7 @@ <bean id="MetadataFormatListDelivererTG" class="info.textgrid.middleware.MetadataFormatListDelivererTG"> + <property name="oaiEsClient" ref="ElasticSearchClient" /> </bean> <!-- Bean for verb=Identify --> diff --git a/pom.xml b/pom.xml index ad93c4cef716c9cbf1dd17ee74e7170db33f62a4..0996fddb0734040362d829ee680b440002df8ad7 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ <maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version> <maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version> <maven-jaxb2-plugin.version>0.15.2</maven-jaxb2-plugin.version> - <mets-mods-mapping.version>2.1.4</mets-mods-mapping.version> + <mets-mods-mapping.version>2.1.5-SNAPSHOT</mets-mods-mapping.version> <package-info-maven-plugin.version>1.4.5</package-info-maven-plugin.version> <properties-maven-plugin.version>1.0-alpha-2</properties-maven-plugin.version> <rdf4j-repository-api.version>3.0.2</rdf4j-repository-api.version>