diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/dspace/DSpaceMetadataMapper.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/dspace/DSpaceMetadataMapper.java index 6fc50f6a..feb3c840 100644 --- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/dspace/DSpaceMetadataMapper.java +++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/dspace/DSpaceMetadataMapper.java @@ -30,26 +30,32 @@ import org.springframework.stereotype.Component; /** - * dc.title for the Manuscript - * dc.publisher for the publisher name - * dc.identifier.citation for the Manuscript - * dc.identifier.doi for the DOI - * dc.contributor for each non-submitter associated with the Manuscript - * dc.description.abstract for the Manuscript - * dc.date.issued for the publication date - * DSPACE_FIELD_EMBARGO_LIFT Date that the embargo is lifted - * DSPACE_FIELD_EMBARGO_TERMS Date that the embargo is lifted + * DSpace metadata fields set: + * */ @Component public class DSpaceMetadataMapper { // Section of workspace item form to add metadata private static final String SECTION = "traditionalpageone"; - @Value("${dspace.field.embargo.lift}") - private String dspaceFieldEmbargoLift; + private final String dspaceFieldEmbargoLift; + private final String dspaceFieldEmbargoTerms; - @Value("${dspace.field.embargo.terms}") - private String dspaceFieldEmbargoTerms; + public DSpaceMetadataMapper(@Value("${dspace.field.embargo.lift}") String dspaceFieldEmbargoLift, + @Value("${dspace.field.embargo.terms}") String dspaceFieldEmbargoTerms) { + this.dspaceFieldEmbargoLift = dspaceFieldEmbargoLift; + this.dspaceFieldEmbargoTerms = dspaceFieldEmbargoTerms; + } public String patchWorkspaceItem(DepositSubmission submission) { DepositMetadata depositMd = submission.getMetadata(); @@ -59,10 +65,8 @@ public String patchWorkspaceItem(DepositSubmission submission) { JSONArray metadata = new JSONArray(); - String title = manuscriptMd.getTitle(); - // Required by DSpace - metadata.add(add_array(SECTION, "dc.title", title)); + metadata.add(add_array(SECTION, "dc.title", manuscriptMd.getTitle())); if (journalMd != null && journalMd.getPublisherName() != null) { metadata.add(add_array(SECTION, "dc.publisher", journalMd.getPublisherName())); @@ -140,7 +144,7 @@ private JSONObject array_value(String value) { return obj; } - // TODO Could we use citation in CrossRef metadata? + // TODO Could we use citation from CrossRef metadata? private String createCitation(DepositSubmission submission) { DepositMetadata submissionMd = submission.getMetadata(); DepositMetadata.Article articleMd = submissionMd.getArticleMetadata(); diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceSession.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceSession.java index a0a9e311..d7a11628 100644 --- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceSession.java +++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceSession.java @@ -72,6 +72,7 @@ public TransportResponse send(PackageStream packageStream, Map m workspaceItemId = Integer.parseInt(ref.substring(DEPOSIT_STATUS_REF_PREFIX.length())); } } catch (NumberFormatException e) { + // nop } if (workspaceItemId == -1) { diff --git a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/provider/dspace/DSpaceMetadataMapperTest.java b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/provider/dspace/DSpaceMetadataMapperTest.java new file mode 100644 index 00000000..a9d71e14 --- /dev/null +++ b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/provider/dspace/DSpaceMetadataMapperTest.java @@ -0,0 +1,125 @@ +package org.eclipse.pass.deposit.provider.dspace; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.net.URI; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.List; + +import com.jayway.jsonpath.DocumentContext; +import com.jayway.jsonpath.JsonPath; +import org.eclipse.pass.deposit.model.DepositManifest; +import org.eclipse.pass.deposit.model.DepositMetadata; +import org.eclipse.pass.deposit.model.DepositMetadata.Article; +import org.eclipse.pass.deposit.model.DepositMetadata.Journal; +import org.eclipse.pass.deposit.model.DepositMetadata.Manuscript; +import org.eclipse.pass.deposit.model.DepositMetadata.PERSON_TYPE; +import org.eclipse.pass.deposit.model.DepositMetadata.Person; +import org.eclipse.pass.deposit.model.DepositSubmission; +import org.junit.jupiter.api.Test; + +public class DSpaceMetadataMapperTest { + @Test + public void testPatchWorkspaceItem() { + DSpaceMetadataMapper mapper = new DSpaceMetadataMapper("test.embargo.lift", "test.embargo.terms"); + + DepositSubmission ds = new DepositSubmission(); + DepositManifest manifest = new DepositManifest(); + DepositMetadata md = new DepositMetadata(); + + ds.setManifest(manifest); + ds.setMetadata(md); + + Article article = md.getArticleMetadata(); + Journal journal = md.getJournalMetadata(); + Manuscript manuscript = md.getManuscriptMetadata(); + + manuscript.setTitle("this is a title"); + manuscript.setMsAbstract("This is a compelling abstract."); + journal.setJournalTitle("journal title"); + journal.setPublisherName("publisher name"); + article.setDoi(URI.create("10.1016/j.iheduc.2015.08.004")); + article.setIssue("1"); + article.setVolume("2"); + + Person author1 = new Person(); + author1.setEmail("p1@example.com"); + author1.setFirstName("P1"); + author1.setFullName("P1 Person"); + author1.setLastName("Person"); + author1.setMiddleName("One"); + author1.setType(PERSON_TYPE.author); + + Person author2 = new Person(); + author2.setEmail("p2@example.com"); + author2.setFirstName("P2"); + author2.setFullName("P2 Person"); + author2.setLastName("Person"); + author2.setMiddleName("Two"); + author2.setType(PERSON_TYPE.author); + + md.getPersons().add(author1); + md.getPersons().add(author2); + + ZonedDateTime pubDate = ZonedDateTime.now(); + ZonedDateTime embargoDate = pubDate.plusYears(1); + + journal.setPublicationDate(pubDate); + article.setEmbargoLiftDate(embargoDate); + + ds.setSubmissionDate(pubDate); + + String json = mapper.patchWorkspaceItem(ds); + + DocumentContext jsonContext = JsonPath.parse(json); + + checkValue(jsonContext, "dc.title", manuscript.getTitle()); + checkValue(jsonContext, "dc.identifier.doi", article.getDoi().toString()); + checkValue(jsonContext, "dc.description.abstract", manuscript.getMsAbstract()); + checkValue(jsonContext, "dc.publisher", journal.getPublisherName()); + checkValue(jsonContext, "dc.identifier.citation", + "Person, P1 One, Person, P2 Two. (2024-12-19). journal title. 2 (1). 10.1016/j.iheduc.2015.08.004."); + checkValue(jsonContext, "dc.contributor.author", "P1 Person", "P2 Person"); + checkValue(jsonContext, "dc.date.issued", + journal.getPublicationDate().format(DateTimeFormatter.ISO_LOCAL_DATE)); + checkValue(jsonContext, "test.embargo.lift", + article.getEmbargoLiftDate().format(DateTimeFormatter.ISO_LOCAL_DATE)); + checkValue(jsonContext, "test.embargo.terms", + article.getEmbargoLiftDate().format(DateTimeFormatter.ISO_LOCAL_DATE)); + } + + private void checkValue(DocumentContext context, String key, String... expected) { + String path = "$[?(@.path == '/sections/traditionalpageone/" + key + "')].value[*].value"; + + List values = context.read(path); + + assertEquals(Arrays.asList(expected), values); + } + + @Test + public void testPatchWorkspaceItemMinimalMetadata() { + DSpaceMetadataMapper mapper = new DSpaceMetadataMapper("test.embargo.lift", "test.embargo.terms"); + + DepositSubmission ds = new DepositSubmission(); + DepositManifest manifest = new DepositManifest(); + DepositMetadata md = new DepositMetadata(); + Journal journal = md.getJournalMetadata(); + + ds.setManifest(manifest); + ds.setMetadata(md); + + Manuscript manuscript = md.getManuscriptMetadata(); + ZonedDateTime pubDate = ZonedDateTime.now(); + + manuscript.setTitle("this is a title"); + journal.setPublicationDate(pubDate); + + String json = mapper.patchWorkspaceItem(ds); + + DocumentContext jsonContext = JsonPath.parse(json); + + checkValue(jsonContext, "dc.title", manuscript.getTitle()); + } +} diff --git a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/service/SubmissionProcessorIT.java b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/service/SubmissionProcessorIT.java index 67401fc9..f56cffc2 100644 --- a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/service/SubmissionProcessorIT.java +++ b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/service/SubmissionProcessorIT.java @@ -441,8 +441,10 @@ private void initDSpaceApiStubs() throws IOException { private void verifyDSpaceApiStubs(int expectedCount) throws IOException { WireMock.verify(expectedCount, getRequestedFor(urlEqualTo("/dspace/api/security/csrf"))); WireMock.verify(expectedCount, postRequestedFor(urlEqualTo("/dspace/api/authn/login"))); - WireMock.verify(expectedCount, getRequestedFor(urlEqualTo("/dspace/api/discover/search/objects?query=handle:collectionhandle"))); - WireMock.verify(expectedCount, postRequestedFor(urlEqualTo("/dspace/api/submission/workspaceitems?owningCollection=collectionuuid"))); + WireMock.verify(expectedCount, getRequestedFor( + urlEqualTo("/dspace/api/discover/search/objects?query=handle:collectionhandle"))); + WireMock.verify(expectedCount, postRequestedFor( + urlEqualTo("/dspace/api/submission/workspaceitems?owningCollection=collectionuuid"))); WireMock.verify(expectedCount, patchRequestedFor(urlEqualTo("/dspace/api/submission/workspaceitems/1"))); WireMock.verify(expectedCount, postRequestedFor(urlEqualTo("/dspace/api/workflow/workflowitems"))); }