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 d91429f59726884bf0aefc7f7507112e24ed3d76..d1a95578e7918148e72d949d25ed9914b7d76d63 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/IDIOMImages.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/IDIOMImages.java @@ -220,17 +220,16 @@ public class IDIOMImages implements RecordDelivererInterface, RecordListDelivere // Use base URI for IDIOM image delivery! String tgBaseURI = OAIPMHUtilities.getTextGridBaseURI(changedID); conedaKorRecord.setHeader(buildOAIPMHRecordHeader( - OAIPMHUtilities.datestampAsString(immByTGObject.getCreationDate()), tgBaseURI)); + OAIPMHUtilities.oaiDatestampAsString(immByTGObject.getCreationDate()), tgBaseURI)); singleImageMetsMods.setRecord(conedaKorRecord); } catch (ParserConfigurationException | SAXException | CrudClientException e) { - String message = - "ERROR getting IDIOM METS record from TG-crud! Maybe renew Session ID in OAIPMH config?" - + e.getClass().getName() + ": " + e.getMessage(); - log.warning(message); - - return null; + String errorMessage = "ERROR getting IDIOM METS record from TG-crud! " + e.getMessage(); + String logMessage = + errorMessage + "! Maybe session ID in OAIPMH config needs to be re-newed?"; + log.severe(logMessage); + throw new IOException(errorMessage); } return singleImageMetsMods; 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 40e78a79e9aac820b2eeb6fda624f17ed97bd677..4e1cadee3da54adcd75362e60b764ab2326378ef 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererIDIOM.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererIDIOM.java @@ -122,12 +122,12 @@ public class IdentifierListDelivererIDIOM extends IdentifierListDelivererAbstrac for (SearchHit hit : scrollResp.getHits().getHits()) { i++; String textgridURI = - OAIPMHUtilities.fieldLoader(new JSONObject(hit.getSourceAsMap()), "textgridUri"); + OAIPMHUtilities.fieldLoader(new JSONObject(hit.getSourceAsMap()), TGConstants.URI); + String createdDate = OAIPMHUtilities.oaiDatestampAsString( + OAIPMHUtilities.fieldLoader(new JSONObject(hit.getSourceAsMap()), TGConstants.CREATED)); - // FIXME BTW: We only need ID and DATESTAMP for ListIdentifiers, WHY do we get every - // complete RECORD?? - identifierList.getHeader() - .add(this.idiomRecord.getRecordById(textgridURI).getRecord().getHeader()); + identifierList.getHeader().add(OAIPMHUtilities.computeResponseHeader(createdDate, + OAIPMHUtilities.getTextGridBaseURI(textgridURI), "")); } // Check the need for a resumption token! 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 915594c5f5f689bf70a77c3b298a8cf8d10d7e14..6b025832bbc0ffd5f8b39590e2cb8b8f5fcceee8 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHImpl.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHImpl.java @@ -324,8 +324,11 @@ public class OAIPMHImpl implements OAIPMHProducer { log.fine(" ## called getRecordById"); } catch (ParseException | DatatypeConfigurationException | IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + // FIXME Handle exceptions with errors in other methods, too! + ErrorHandler idError = new ErrorHandler(); + idError.setError(OAIPMHConstants.OAI_ID_DOES_NOT_EXIST, e.getMessage()); + oaipmhRoot.getError().add(idError.getError()); + return oaipmhRoot; } if (getRecord != null) { @@ -613,18 +616,27 @@ public class OAIPMHImpl implements OAIPMHProducer { } } - log.fine(" ## creating ListRecordsType"); + try { + log.fine(" ## creating ListRecordsType"); + + ListRecordsType listRecords = recListDeliv.getRecords( + request.getFrom(), + request.getUntil(), + request.getSet(), + request.getResumptionToken()); - ListRecordsType listRecords = recListDeliv.getRecords( - request.getFrom(), - request.getUntil(), - request.getSet(), - request.getResumptionToken()); + log.fine(" ## created ListRecordsType"); - log.fine(" ## created ListRecordsType"); + if (listRecords != null) { + oaipmhRoot.setListRecords(listRecords); + } - if (listRecords != null) { - oaipmhRoot.setListRecords(listRecords); + } catch (IOException e) { + // FIXME Handle exceptions with errors in other methods, too! + ErrorHandler idError = new ErrorHandler(); + idError.setError(OAIPMHConstants.OAI_ID_DOES_NOT_EXIST, e.getMessage()); + oaipmhRoot.getError().add(idError.getError()); + return oaipmhRoot; } } 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 2bb13502ff2ecd118afee39c3c922c4934bf0175..f558f6c7065c4212476c679d5eb5638d9cf27aec 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHUtilities.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHUtilities.java @@ -49,8 +49,6 @@ import info.textgrid.namespaces.middleware.tgauth.ProjectInfo; * * @author Maximilian Brodhun, SUB Göttingen * @author Stefan E. Funk, SUB Göttingen - * @version 2022-09-27 - * @since 2014-01-29 */ public class OAIPMHUtilities { @@ -234,7 +232,7 @@ public class OAIPMHUtilities { * @return dateOutputAsString * @throws ParseException */ - public static String datestampAsString(String originalDateTimeString) throws ParseException { + public static String oaiDatestampAsString(String originalDateTimeString) throws ParseException { log.fine("incoming date: " + originalDateTimeString); @@ -685,10 +683,28 @@ public class OAIPMHUtilities { String result = theURI; if (theURI.contains(".")) { - result = theURI.substring(0, theURI.indexOf('.')).trim(); + result = theURI.substring(0, theURI.indexOf('.')); } - return result; + return result.trim(); + } + + /** + * @param theURI + * @return + */ + public static String getTextGridRevisionURI(String theURI) { + + // FIXME Get latest revision from tgsearch? + // https://dev.textgridlab.org/1.0/tgsearch/info/textgrid:3qmmt/revisions?sid=*** + + String result = theURI; + + if (!theURI.contains(".")) { + result = getTextGridBaseURI(theURI) + ".0"; + } + + return result.trim(); } // ** 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 74f10c0b9e912345774726c396393c0aa04e11ca..11e6f9b8a73140b86816f3f53e4b2545c1008c4e 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDATACITE.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDATACITE.java @@ -113,7 +113,7 @@ public class RecordDelivererDATACITE extends RecordDelivererAbstract { // Set response header. String datestamp = OAIPMHUtilities - .datestampAsString(OAIPMHUtilities.fieldLoader(this.jsonObj, this.dateOfObjectCreation)); + .oaiDatestampAsString(OAIPMHUtilities.fieldLoader(this.jsonObj, this.dateOfObjectCreation)); String identifier = ""; if (!idInElasticSearchIndex.startsWith(this.repositoryObjectURIPrefix)) { 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 7973213590b57eef9e3182a2e9833474d7b5c8cf..ffedd741862fd82084890dcf1f8254f7d2843ed1 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererIDIOM.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererIDIOM.java @@ -24,7 +24,7 @@ import info.textgrid.middleware.oaipmh.RecordType; /** * @author Maximilian Brodhun, SUB Göttingen * @author Stefan E. Funk, SUB Göttingen - * @version 2022-10-04 + * @version 2022-10-06 * @since 2019-03-12 */ @Component @@ -48,10 +48,6 @@ public class RecordDelivererIDIOM extends RecordDelivererAbstract { private IDIOMImages idiomImages; - private RecordType record = new RecordType(); - private String dateOfLastObjectModification; - private String objectType; - /** * @param textgrid * @param dariah @@ -71,72 +67,93 @@ public class RecordDelivererIDIOM extends RecordDelivererAbstract { @Override public GetRecordType getRecordById(final String id) throws ParseException, IOException { - GetRecordType grt = new GetRecordType(); + GetRecordType result = new GetRecordType(); + + RecordType recordType = new RecordType(); + + log.fine("incoming id: " + id); + + // Get revision URI if no revision URI is put in. + // FIXME Implement getLatestRevision in OAIPMHUtilities.getTextGridRevisionURI()!! + // FIXME We just implement it as it has been before! DO MAKE IT RIGHT SOON!! + String textgridRevisionURI = OAIPMHUtilities.getTextGridRevisionURI(id); - log.fine("incoming ID: " + id); + log.fine("textgrid revision uri: " + textgridRevisionURI); - setDatestampsAndObjectType(id); + String objectType = getIdiomInfoFromES(textgridRevisionURI, TGConstants.NOTES); + String creationDate = getIdiomInfoFromES(textgridRevisionURI, TGConstants.CREATED); + String modificationDate = getIdiomInfoFromES(textgridRevisionURI, TGConstants.MODIFIED_FIELD); // Get TG URI from ID. - String textgridURI = id; - if (!id.startsWith(TEXTGRID_URI_PREFIX)) { - textgridURI = TEXTGRID_URI_PREFIX + id; + if (!textgridRevisionURI.startsWith(TEXTGRID_URI_PREFIX)) { + textgridRevisionURI = TEXTGRID_URI_PREFIX + textgridRevisionURI; } // Get base URI for ClassicMayanMetsMods and response header here. - String textgridBaseURI = OAIPMHUtilities.getTextGridBaseURI(textgridURI); + String textgridBaseURI = OAIPMHUtilities.getTextGridBaseURI(textgridRevisionURI); - log.fine("textgrid uri/base uri: " + textgridURI + "/" + textgridBaseURI); - log.fine("object type is: " + this.objectType); - log.fine(this.objectType + " doc/dom: " + this.dateOfObjectCreation + "/" - + this.dateOfLastObjectModification); + log.fine("textgrid base uri: " + textgridBaseURI); + log.fine("object type is: " + objectType); + log.fine(objectType + " doc/dom: " + creationDate + "/" + modificationDate); - if (this.objectType.equals("ARTEFACT")) { + if (objectType.equals("ARTEFACT")) { try { ClassicMayanMetsMods metsmods = new ClassicMayanMetsMods( textgridBaseURI, - this.dateOfObjectCreation, - this.dateOfLastObjectModification); + creationDate, + modificationDate); log.fine("metsmods title: " + metsmods.getArtefactTitle()); - this.record.setMetadata(idiomMets(metsmods)); + recordType.setMetadata(idiomMets(metsmods)); } catch (JSONException | ParserConfigurationException | SAXException | IOException | ParseException | NoSuchElementException e) { - String message = "ERROR getting IDIOM METS record for ID " + id + "! " + String message = "ERROR getting IDIOM METS record for ID " + textgridRevisionURI + "! " + e.getClass().getName() + ": " + e.getMessage(); log.warning(message); } } - else if (this.objectType.startsWith("ConedaKorMediumData")) { + else if (objectType.startsWith("ConedaKorMediumData")) { log.fine("calling idiom image getRecordById()"); - GetRecordType idi = this.idiomImages.getRecordById(textgridURI); + GetRecordType idi = this.idiomImages.getRecordById(textgridRevisionURI); // Fixes #64 if (idi != null) { - this.record = idi.getRecord(); + recordType = idi.getRecord(); } else { - String message = "ERROR getting IDIOM IMAGE record for ID " + id + "!"; + String message = "ERROR getting IDIOM IMAGE record for ID " + textgridRevisionURI + "!"; log.warning(message); + String metsError = + "<mets xsi:schemaLocation=\"http://www.loc.gov/METS/ http://www.loc.gov/standards/mets/mets.xsd\"\n" + + "xmlns=\"http://www.loc.gov/METS/\" xmlns:dv=\"http://dfg-viewer.de/\"\n" + + "xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n" + + "<amdSec ID=\"error\"/>\n" + + "<structMap TYPE=\"LOGICAL\">\n" + + "<div LABEL=\"" + message + "\"/>\n" + + "</structMap>\n" + + "</mets>"; + MetadataType errorMetadata = new MetadataType(); + errorMetadata.setAny(metsError); + recordType.setMetadata(errorMetadata); } } - // No setSpec needed here! - // TODO Why not?? + // No setSpec needed here! It COULD be the IDIOM project ID, but we do not need it at the + // moment. String setSpec = ""; // We need to have the base URI here in header (and record), it is used as Record ID of Mayan // artifacts here! HeaderType header = - OAIPMHUtilities.computeResponseHeader(this.dateOfObjectCreation, textgridBaseURI, setSpec); - this.record.setHeader(header); + OAIPMHUtilities.computeResponseHeader(creationDate, textgridBaseURI, setSpec); + recordType.setHeader(header); - grt.setRecord(this.record); + result.setRecord(recordType); - return grt; + return result; } // ** @@ -174,17 +191,20 @@ public class RecordDelivererIDIOM extends RecordDelivererAbstract { /** * <p> - * ElasticSearch request in non-public index to get the datestamps for the object creation and - * last modification date in TextGridRep. + * ElasticSearch request in non-public index to get search field values from TextGridRep. * </p> * * @param idInDatabase + * @param theSearchField + * @return * @throws ParseException * @throws IOException */ - private void setDatestampsAndObjectType(final String idInDatabase) + private String getIdiomInfoFromES(final String idInDatabase, final String theSearchField) throws ParseException, IOException { + String result = ""; + String changedId = idInDatabase; // Remove prefix. @@ -192,19 +212,14 @@ public class RecordDelivererIDIOM extends RecordDelivererAbstract { changedId = idInDatabase.substring(TEXTGRID_URI_PREFIX.length()); } + String[] searchField = {theSearchField}; JSONObject json = new JSONObject(); - String[] searchFields = {TGConstants.CREATED, TGConstants.MODIFIED_FIELD, "notes"}; - json = new JSONObject(OAIPMHUtilities.getRcordByIDFromElasticSearch(this.oaiEsClient, changedId, - searchFields, Strings.EMPTY_ARRAY).getSource()); - - this.dateOfObjectCreation = - OAIPMHUtilities.datestampAsString(OAIPMHUtilities.fieldLoader(json, TGConstants.CREATED)); + searchField, Strings.EMPTY_ARRAY).getSource()); - this.dateOfLastObjectModification = OAIPMHUtilities - .datestampAsString(OAIPMHUtilities.fieldLoader(json, TGConstants.MODIFIED_FIELD)); + result = OAIPMHUtilities.fieldLoader(json, theSearchField); - this.objectType = OAIPMHUtilities.fieldLoader(json, "notes"); + return result; } // ** 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 076c23f82932042726caf08b458cff55c84a5457..6e80c1f6093de08a11c417226a9051d677fe2265 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIDIOM.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIDIOM.java @@ -23,8 +23,6 @@ import info.textgrid.middleware.oaipmh.ResumptionTokenType; /** * @author Maximilian Brodhun, SUB Göttingen * @author Stefan E. Funk, SUB Göttingen - * @version 2022-09-19 - * @since */ public class RecordListDelivererIDIOM extends RecordListDelivererAbstract { @@ -131,8 +129,7 @@ public class RecordListDelivererIDIOM extends RecordListDelivererAbstract { log.fine("textgrid uri: " + textgridURI); - // Create new record here! - // NOTE We must not set only references here!! + // Create new record! We must not set only references here!! RecordType record = new RecordType(); // No base URI here! We query elasticsearch, and so it needs to be a revision URI! RecordType sourceRecord = this.idiomRecord.getRecordById(textgridURI).getRecord(); 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 2db94e96994a207f74bfd49a571c7a0636269949..91cfa262d7d8b69aab0e07a54464362d5006d3d2 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/TGConstants.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/TGConstants.java @@ -50,6 +50,7 @@ public final class TGConstants { public static final String WORK_AGENT = "work.agent.value"; public static final String WORK_ID = "work.subject.id.value"; public static final String MODIFIED_FIELD = "lastModified"; + public static final String NOTES = "notes"; public static final String[] TGFields = {CREATED, FORMAT, IDENTIFIER, DATA_CONTRIBUTOR, URI, PROJECT_ID, IS_DERIVED_FROM, TITLE, PID, EDITION_ISEDITIONOF, EDITION_AGENT, EDITION_LICENSEURI, EDITION_LANGUAGE, BIBCIT_AUTHOR, 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 5650f808c127234cbe97c868bb389934e0bc2cff..14838ff6b83cc8bc9319ca89a39a6d4ec2c01270 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 @@ -155,4 +155,27 @@ public class TestOAIPMHUtilities { } } + /** + * + */ + @Test + public void testGetTextGridRevisionURI() { + + String uriExpected = "textgrid:12345.0"; + String uri = "textgrid:12345"; + String revisionURI = OAIPMHUtilities.getTextGridRevisionURI(uri); + if (!revisionURI.equals(uriExpected)) { + System.out.println(revisionURI + " != " + uriExpected); + assertTrue(false); + } + + uriExpected = "textgrid:12345.15"; + uri = "textgrid:12345.15"; + revisionURI = OAIPMHUtilities.getTextGridRevisionURI(uri); + if (!revisionURI.equals(uriExpected)) { + System.out.println(revisionURI + " != " + uriExpected); + assertTrue(false); + } + } + } diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestTGOAIPMHLocally.java b/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestTGOAIPMHLocally.java index 0b2e8ac862d8456702c0f74e99fe3ca77cfd48f4..730263c8dd94e775606b349207d64056f7178e02 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 @@ -264,7 +264,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.datestampAsString(dateformatbefore); + String testDate = OAIPMHUtilities.oaiDatestampAsString(dateformatbefore); System.out.println("Date after conversion: " + testDate); System.out.println("---------------------------------------------"); } diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/OAIPMHUtilitiesOnline.java b/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/OAIPMHUtilitiesOnline.java index d912f08a2f7c999ab98add8f2194be8fce9ae392..acff2f2cf400bfb183de7afc1241332a8d3bdf8a 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 @@ -153,6 +153,8 @@ public class OAIPMHUtilitiesOnline { int status = result.getStatus(); if (status != HttpStatus.SC_OK) { + String responseString = IOUtils.readStringFromStream((InputStream) result.getEntity()); + System.out.println("RESPONSE: " + responseString); String message = theThreadName + "status: " + status; assertTrue(message, false); } else { diff --git a/oaipmh-core/src/test/resources/oaipmh.test.dev-textgridlab-org.properties b/oaipmh-core/src/test/resources/oaipmh.test.dev-textgridlab-org.properties index 80a0058c7232d6b781a185679a4fdac5bbd29c94..0619b500a61738cdb07f6da53635f5da24680187 100644 --- a/oaipmh-core/src/test/resources/oaipmh.test.dev-textgridlab-org.properties +++ b/oaipmh-core/src/test/resources/oaipmh.test.dev-textgridlab-org.properties @@ -11,12 +11,9 @@ expectedGetRecordDATACITE = Weise Klugredenn checkGetRecordIDIOM = textgrid:2sg18.0 expectedGetRecordIDIOM = Aguateca -checkGetRecordIDIOMImage = 3pgz0.0 -expectedGetRecordIDIOMImage = Museum of Fine Arts Boston, Boston -#checkGetRecordIDIOMImage = textgrid:3vcgs.0 -#expectedGetRecordIDIOMImage = Edzna, Hieroglyphic Stairway 1, HS.1:1-10, HS.1:45-47, HS.1:48-49 -#checkGetRecordIDIOMImage = textgrid:407sf.0 -#expectedGetRecordIDIOMImage = Acanceh, Structure 1, Stucco Frieze, Detail +checkGetRecordIDIOMImage = textgrid:407sf.0 +expectedGetRecordIDIOMImage = Acanceh, Structure 1, Stucco Frieze, Detail +# another image would be: 3vbbt.0 checkGetRecordIDList = textgrid:mq05.0, textgrid:jgv6.0, textgrid:w7rz.0, textgrid:w36b.0, textgrid:mcdv.0, textgrid:v0qx.0, textgrid:xkck.0, textgrid:t3m1.0, textgrid:10rsq.0, textgrid:mq05.0, textgrid:jgv6.0, textgrid:w7rz.0, textgrid:w36b.0, textgrid:mcdv.0, textgrid:v0qx.0, textgrid:xkck.0, textgrid:t3m1.0, textgrid:10rsq.0 diff --git a/pom.xml b/pom.xml index d11e8dca04b71699358e763912f972b3edad53b0..a8bd0ee0316ee7a40c7a5ad757ee6a19d8fa5684 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,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.14.0</maven-jaxb2-plugin.version> - <mets-mods-mapping.version>2.0.0</mets-mods-mapping.version> + <mets-mods-mapping.version>2.0.1</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>