From 0b184e52afc426ee16260c9ae0caff36c0dd1466 Mon Sep 17 00:00:00 2001
From: Mark Patton
Date: Tue, 4 Feb 2025 08:59:37 -0500
Subject: [PATCH 01/12] Fix JSONObject duplicate in classpath during tests
---
pass-deposit-services/pom.xml | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/pass-deposit-services/pom.xml b/pass-deposit-services/pom.xml
index 1617e52c..dec824fd 100644
--- a/pass-deposit-services/pom.xml
+++ b/pass-deposit-services/pom.xml
@@ -93,6 +93,12 @@
spring-boot-starter-test
${spring-boot-maven-plugin.version}
test
+
+
+ com.vaadin.external.google
+ android-json
+
+
From 0bd7f685fdfd4e3ff1a5993000f01e133d4228ad Mon Sep 17 00:00:00 2001
From: Mark Patton
Date: Tue, 4 Feb 2025 09:39:20 -0500
Subject: [PATCH 02/12] When looking up deposit support for a Repository,
prefer the key
---
.../org/eclipse/pass/deposit/service/SubmissionProcessor.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/service/SubmissionProcessor.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/service/SubmissionProcessor.java
index 3f9e03b2..d4f878ca 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/service/SubmissionProcessor.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/service/SubmissionProcessor.java
@@ -291,8 +291,8 @@ private static boolean isSubmittedByUser(Submission submission) {
static Collection getLookupKeys(Repository repo) {
final List keys = new ArrayList<>();
- ofNullable(repo.getName()).ifPresent(keys::add);
ofNullable(repo.getRepositoryKey()).ifPresent(keys::add);
+ ofNullable(repo.getName()).ifPresent(keys::add);
ofNullable(repo.getId()).map(Object::toString).ifPresent(keys::add);
return keys;
From 5b259ffe33a3cf850dff4ff3a738541262701cfa Mon Sep 17 00:00:00 2001
From: Mark Patton
Date: Tue, 4 Feb 2025 09:46:15 -0500
Subject: [PATCH 03/12] Make sure that file resources have a filename so the
extension can be checked
---
.../pass/deposit/assembler/AbstractAssembler.java | 2 +-
.../eclipse/pass/deposit/assembler/PassFileResource.java | 9 ++++++++-
.../pass/deposit/assembler/PassFileResourceIT.java | 2 +-
3 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/assembler/AbstractAssembler.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/assembler/AbstractAssembler.java
index 58d6ea64..16d6ef41 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/assembler/AbstractAssembler.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/assembler/AbstractAssembler.java
@@ -233,7 +233,7 @@ protected List resolveCustodialResources(List
} else if (Objects.nonNull(dfr.getDepositFile().getPassFileId())) {
String passFileId = dfr.getDepositFile().getPassFileId();
LOG.trace("Returning PassFileResource for Pass File {}", passFileId);
- delegateResource = new PassFileResource(passClient, passFileId);
+ delegateResource = new PassFileResource(passClient, passFileId, dfr.getDepositFile().getName());
} else if (location.startsWith(HTTP_PREFIX) || location.startsWith(HTTPS_PREFIX) ||
location.startsWith(JAR_PREFIX)) {
try {
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/assembler/PassFileResource.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/assembler/PassFileResource.java
index 15b81e3d..170f2744 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/assembler/PassFileResource.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/assembler/PassFileResource.java
@@ -29,10 +29,12 @@ public class PassFileResource extends AbstractResource {
private final PassClient passClient;
private final String passFileId;
+ private final String filename;
- public PassFileResource(PassClient passClient, String passFileId) {
+ public PassFileResource(PassClient passClient, String passFileId, String filename) {
this.passClient = passClient;
this.passFileId = passFileId;
+ this.filename = filename;
}
@Override
@@ -54,4 +56,9 @@ public String getContentAsString(Charset charset) throws IOException {
public String getDescription() {
return "PassFileResource File ID: " + passFileId;
}
+
+ @Override
+ public String getFilename() {
+ return filename;
+ }
}
diff --git a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/assembler/PassFileResourceIT.java b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/assembler/PassFileResourceIT.java
index c654d430..9ce0bd73 100644
--- a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/assembler/PassFileResourceIT.java
+++ b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/assembler/PassFileResourceIT.java
@@ -41,7 +41,7 @@ void testGetInputStream() throws IOException {
file.setUri(fileUri);
passClient.createObject(file);
- PassFileResource passFileResource = new PassFileResource(passClient, file.getId());
+ PassFileResource passFileResource = new PassFileResource(passClient, file.getId(), file.getName());
// WHEN
InputStream inputStream = passFileResource.getInputStream();
From d34fdf59b4e38c2655203d010ac431e124e5a8c2 Mon Sep 17 00:00:00 2001
From: Mark Patton
Date: Tue, 4 Feb 2025 09:47:23 -0500
Subject: [PATCH 04/12] Add support for deposit with the DSpace REST API.
Adjust DSpace configuration properties.
---
.../builder/DepositSubmissionMapper.java | 32 ++--
.../config/repository/DSpaceBinding.java | 38 +++++
.../config/repository/ProtocolBinding.java | 3 +-
.../provider/dspace/DSpaceAssembler.java | 50 ++++++
.../provider/dspace/DSpaceMetadataMapper.java | 147 +++++++++++++++++
.../inveniordm/InvenioRdmMetadataMapper.java | 6 +-
.../j10p/DspaceMetadataDomWriter.java | 106 ++----------
.../deposit/provider/util/CitationUtil.java | 71 ++++++++
.../pass/deposit/service/DepositTask.java | 8 +-
.../DeploymentTestDataService.java | 9 +-
.../DSpaceDepositService.java} | 153 ++++++++++++++----
.../pass/deposit/transport/Transport.java | 25 +--
.../deposit/transport/TransportSession.java | 6 +-
.../transport/devnull/DevNullTransport.java | 3 +-
.../transport/dspace/DSpaceResponse.java | 72 +++++++++
.../transport/dspace/DSpaceSession.java | 132 +++++++++++++++
.../transport/dspace/DSpaceTransport.java | 53 ++++++
.../transport/fs/FilesystemTransport.java | 3 +-
.../inveniordm/InvenioRdmSession.java | 3 +-
.../transport/sftp/SftpTransportSession.java | 3 +-
.../transport/sword2/Sword2Transport.java | 2 +-
.../sword2/Sword2TransportSession.java | 4 +-
.../src/main/resources/application.properties | 9 +-
.../AbstractJacksonMappingTest.java | 3 +-
.../PropertyResolvingDeserializerTest.java | 4 +-
.../RepositoryConfigMappingTest.java | 12 +-
.../repository/SimpleClassMappingTest.java | 12 +-
.../TransportConfigMappingTest.java | 8 +-
.../spring/AwsParamStoreConfigTest.java | 4 +
.../dspace/DSpaceMetadataMapperTest.java | 128 +++++++++++++++
.../j10p/DspaceMetadataDomWriterTest.java | 13 +-
.../deposit/provider/j10p/MetadataIT.java | 8 +-
.../deposit/service/AbstractDepositIT.java | 2 -
.../pass/deposit/service/DepositTaskTest.java | 2 +-
.../service/SubmissionProcessorIT.java | 66 +++++++-
.../DeploymentTestDataServiceIT.java | 28 ++--
.../support/jobs/ScheduledJobsTest.java | 4 +-
.../pass/deposit/transport/sftp/SftpTest.java | 4 +-
.../resources/full-test-repositories.json | 13 +-
.../messaging/status/DepositTaskIT.json | 6 +-
.../submissions/sample1-unsubmitted.json | 70 ++++----
.../resources/test-application.properties | 9 ++
.../pass/deposit/model/DepositMetadata.java | 6 +-
43 files changed, 1075 insertions(+), 265 deletions(-)
create mode 100644 pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/config/repository/DSpaceBinding.java
create mode 100644 pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/dspace/DSpaceAssembler.java
create mode 100644 pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/dspace/DSpaceMetadataMapper.java
create mode 100644 pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/util/CitationUtil.java
rename pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/{deploymenttest/DspaceDepositService.java => dspace/DSpaceDepositService.java} (64%)
create mode 100644 pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceResponse.java
create mode 100644 pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceSession.java
create mode 100644 pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceTransport.java
create mode 100644 pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/provider/dspace/DSpaceMetadataMapperTest.java
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/builder/DepositSubmissionMapper.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/builder/DepositSubmissionMapper.java
index 549c7def..5f7b84f1 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/builder/DepositSubmissionMapper.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/builder/DepositSubmissionMapper.java
@@ -20,10 +20,10 @@
import java.net.URI;
import java.time.LocalDate;
-import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@@ -73,8 +73,8 @@ public class DepositSubmissionMapper {
private static final String AUTHORS_KEY = "authors";
private static final String AUTHOR_KEY = "author";
private static final String PUB_TYPE_KEY = "pubType";
- private static final String EMBARGO_END_DATE_PATTERN = "yyyy-MM-dd";
private static final String NLMTA_KEY = "journal-NLMTA-ID";
+ private static final String DEFAULT_DATE_TIME_ZONE = "America/New_York";
/**
* Creates a DepositSubmission by walking the tree of PassEntity objects, starting with the Submission entity,
@@ -267,7 +267,7 @@ private void processCommonMetadata(DepositMetadata metadata, JsonObject submissi
.ifPresent(pName -> metadata.getJournalMetadata().setPublisherName(pName));
getStringProperty(submissionData, PUBLICATION_DATE_KEY)
- .ifPresent(pName -> metadata.getJournalMetadata().setPublicationDate(pName));
+ .ifPresent(date -> metadata.getJournalMetadata().setPublicationDate(parseDate(date)));
getArrayProperty(submissionData, ISSNS).ifPresent(issns -> {
issns.forEach(issnObjAsStr -> {
@@ -290,19 +290,29 @@ private void processCommonMetadata(DepositMetadata metadata, JsonObject submissi
getStringProperty(submissionData, EMBARGO_END_DATE_KEY).ifPresent(endDate -> {
try {
- // TODO - Resolve inconsistent date/date-time formats in metadata and deposit data model
- // TODO - Fix assumption of local timezone
- DateTimeFormatter formatter = DateTimeFormatter.ofPattern(EMBARGO_END_DATE_PATTERN);
- LocalDateTime localEndDate = LocalDate.parse(endDate, formatter).atStartOfDay();
- ZonedDateTime zonedEndDate = localEndDate.atZone(ZoneId.of("America/New_York"));
- metadata.getArticleMetadata().setEmbargoLiftDate(zonedEndDate);
- } catch (Exception e) {
+ metadata.getArticleMetadata().setEmbargoLiftDate(parseDate(endDate));
+ } catch (DateTimeParseException e) {
throw new DepositServiceRuntimeException(
- String.format("Data file contained an invalid Date: '%s'.", endDate), e);
+ String.format("Data file contained an invalid Date: '%s'.", endDate), e);
}
});
}
+ // Parse an ISO 8601 date with or without a time zone
+ public ZonedDateTime parseDate(String date) {
+ try {
+ return ZonedDateTime.parse(date, DateTimeFormatter.ISO_DATE);
+ } catch (DateTimeParseException e) {
+ try {
+ return LocalDate.parse(date, DateTimeFormatter.ISO_LOCAL_DATE).atStartOfDay()
+ .atZone(ZoneId.of(DEFAULT_DATE_TIME_ZONE));
+ } catch (DateTimeParseException e2) {
+ throw new DepositServiceRuntimeException(
+ String.format("Metadata contained an invalid Date: '%s'.", date), e2);
+ }
+ }
+ }
+
private void processCrossrefMetadata(DepositMetadata metadata, JsonObject submissionData) {
getStringProperty(submissionData, DOI_KEY).ifPresent(doi -> {
try {
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/config/repository/DSpaceBinding.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/config/repository/DSpaceBinding.java
new file mode 100644
index 00000000..3e046bf6
--- /dev/null
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/config/repository/DSpaceBinding.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2024 Johns Hopkins University
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.eclipse.pass.deposit.config.repository;
+
+import static org.eclipse.pass.deposit.transport.Transport.TRANSPORT_PROTOCOL;
+
+import java.util.Map;
+
+import org.eclipse.pass.deposit.transport.Transport;
+
+/**
+ * @author Russ Poetker (rpoetke1@jh.edu)
+ */
+public class DSpaceBinding extends ProtocolBinding {
+ static final String PROTO = "DSpace";
+
+ public DSpaceBinding() {
+ this.setProtocol(PROTO);
+ }
+
+ @Override
+ public Map asPropertiesMap() {
+ return Map.of(TRANSPORT_PROTOCOL, Transport.PROTOCOL.DSpace.name());
+ }
+}
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/config/repository/ProtocolBinding.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/config/repository/ProtocolBinding.java
index 0a67cae5..773da4d8 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/config/repository/ProtocolBinding.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/config/repository/ProtocolBinding.java
@@ -30,7 +30,8 @@
@JsonSubTypes.Type(value = SftpBinding.class, name = SftpBinding.PROTO),
@JsonSubTypes.Type(value = SwordV2Binding.class, name = SwordV2Binding.PROTO),
@JsonSubTypes.Type(value = FilesystemBinding.class, name = FilesystemBinding.PROTO),
- @JsonSubTypes.Type(value = InvenioRdmBinding.class, name = InvenioRdmBinding.PROTO)
+ @JsonSubTypes.Type(value = InvenioRdmBinding.class, name = InvenioRdmBinding.PROTO),
+ @JsonSubTypes.Type(value = DSpaceBinding.class, name = DSpaceBinding.PROTO)
})
public abstract class ProtocolBinding {
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/dspace/DSpaceAssembler.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/dspace/DSpaceAssembler.java
new file mode 100644
index 00000000..bfc5de92
--- /dev/null
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/dspace/DSpaceAssembler.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2024 Johns Hopkins University
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.eclipse.pass.deposit.provider.dspace;
+
+import static org.eclipse.pass.deposit.assembler.AssemblerSupport.buildMetadata;
+
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.pass.deposit.assembler.AbstractAssembler;
+import org.eclipse.pass.deposit.assembler.DepositFileResource;
+import org.eclipse.pass.deposit.assembler.MetadataBuilder;
+import org.eclipse.pass.deposit.assembler.MetadataBuilderFactory;
+import org.eclipse.pass.deposit.assembler.PackageStream;
+import org.eclipse.pass.deposit.assembler.ResourceBuilderFactory;
+import org.eclipse.pass.deposit.assembler.SimplePackageStream;
+import org.eclipse.pass.deposit.model.DepositSubmission;
+import org.eclipse.pass.support.client.PassClient;
+import org.springframework.stereotype.Component;
+
+@Component
+public class DSpaceAssembler extends AbstractAssembler {
+ public DSpaceAssembler(MetadataBuilderFactory mbf,
+ ResourceBuilderFactory rbf,
+ PassClient passClient) {
+ super(mbf, rbf, passClient);
+ }
+
+ @Override
+ protected PackageStream createPackageStream(DepositSubmission depositSubmission,
+ List custodialResources,
+ MetadataBuilder mb, ResourceBuilderFactory rbf,
+ Map options) {
+ buildMetadata(mb, options);
+ return new SimplePackageStream(depositSubmission, custodialResources, mb);
+ }
+}
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
new file mode 100644
index 00000000..7f1d692d
--- /dev/null
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/dspace/DSpaceMetadataMapper.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2024 Johns Hopkins University
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.eclipse.pass.deposit.provider.dspace;
+
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+
+import net.minidev.json.JSONArray;
+import net.minidev.json.JSONObject;
+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;
+import org.eclipse.pass.deposit.model.DepositSubmission;
+import org.eclipse.pass.deposit.provider.util.CitationUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * DSpace metadata fields set:
+ *
+ * - 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
+ *
+ */
+@Component
+public class DSpaceMetadataMapper {
+ // Section of workspace item form to add metadata
+ private static final String SECTION = "traditionalpageone";
+
+ private final String dspaceFieldEmbargoLift;
+ private final 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();
+ Journal journalMd = depositMd.getJournalMetadata();
+ Article articleMd = depositMd.getArticleMetadata();
+ Manuscript manuscriptMd = depositMd.getManuscriptMetadata();
+
+ JSONArray metadata = new JSONArray();
+
+ // Required by DSpace
+ metadata.add(add_array(SECTION, "dc.title", manuscriptMd.getTitle()));
+
+ if (journalMd != null && journalMd.getPublisherName() != null) {
+ metadata.add(add_array(SECTION, "dc.publisher", journalMd.getPublisherName()));
+ }
+
+ if (articleMd.getDoi() != null) {
+ metadata.add(add_array(SECTION, "dc.identifier.doi", articleMd.getDoi().toString()));
+ }
+
+ if (manuscriptMd.getMsAbstract() != null) {
+ metadata.add(add_array(SECTION, "dc.description.abstract", manuscriptMd.getMsAbstract()));
+ }
+
+ String citation = CitationUtil.createCitation(submission);
+
+ if (!citation.isEmpty()) {
+ metadata.add(add_array(SECTION, "dc.identifier.citation", citation));
+ }
+
+ // Required by DSpace as ISO 8601 local date
+ metadata.add(add_array(SECTION, "dc.date.issued", journalMd.getPublicationDate().
+ format(DateTimeFormatter.ISO_LOCAL_DATE)));
+
+ // Add non-submitters as authors
+ String[] authors = depositMd.getPersons().stream().filter(
+ p -> p.getType() != DepositMetadata.PERSON_TYPE.submitter).
+ map(Person::getName).toArray(String[]::new);
+
+ metadata.add(add_array(SECTION, "dc.contributor.author", authors));
+
+ ZonedDateTime embargoLiftDate = articleMd.getEmbargoLiftDate();
+
+ if (embargoLiftDate != null) {
+ String liftDate = embargoLiftDate.format(DateTimeFormatter.ISO_LOCAL_DATE);
+
+ metadata.add(add_array(SECTION, dspaceFieldEmbargoLift, liftDate));
+ metadata.add(add_array(SECTION, dspaceFieldEmbargoTerms, liftDate));
+ }
+
+ // Required by DSpace
+ metadata.add(add("license", "granted", "true"));
+
+ return metadata.toString();
+ }
+
+ private JSONObject add(String section, String key, String value) {
+ JSONObject op = new JSONObject();
+
+ op.put("op", "add");
+ op.put("path", "/sections/" + section + "/" + key);
+ op.put("value", value);
+
+ return op;
+ }
+
+ private JSONObject add_array(String section, String key, String... values) {
+ JSONObject op = new JSONObject();
+
+ op.put("op", "add");
+ op.put("path", "/sections/" + section + "/" + key);
+
+ JSONArray op_value = new JSONArray();
+ for (String value : values) {
+ op_value.add(array_value(value));
+ }
+
+ op.put("value", op_value);
+
+ return op;
+ }
+
+ private JSONObject array_value(String value) {
+ JSONObject obj = new JSONObject();
+ obj.put("value", value);
+ return obj;
+ }
+}
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/inveniordm/InvenioRdmMetadataMapper.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/inveniordm/InvenioRdmMetadataMapper.java
index f73235a5..1b488501 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/inveniordm/InvenioRdmMetadataMapper.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/inveniordm/InvenioRdmMetadataMapper.java
@@ -15,6 +15,7 @@
*/
package org.eclipse.pass.deposit.provider.inveniordm;
+import java.time.format.DateTimeFormatter;
import java.util.Objects;
import net.minidev.json.JSONArray;
@@ -49,8 +50,9 @@ public JSONObject toInvenioMetadata(DepositSubmission depositSubmission) {
invenioMetadata.put("creators", creators);
String title = depositSubmission.getSubmissionMeta().get("title").getAsString();
invenioMetadata.put("title", title);
- String publicationDate = depositMetadata.getJournalMetadata().getPublicationDate();
- invenioMetadata.put("publication_date", publicationDate);
+
+ invenioMetadata.put("publication_date", depositMetadata.getJournalMetadata().
+ getPublicationDate().format(DateTimeFormatter.ISO_LOCAL_DATE));
JSONObject resourceType = new JSONObject();
resourceType.put("id", "publication-article");
invenioMetadata.put("resource_type", resourceType);
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/j10p/DspaceMetadataDomWriter.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/j10p/DspaceMetadataDomWriter.java
index ee7a3853..fb41ade8 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/j10p/DspaceMetadataDomWriter.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/j10p/DspaceMetadataDomWriter.java
@@ -49,14 +49,12 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
-import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
-import au.edu.apsr.mtk.base.AmdSec;
import au.edu.apsr.mtk.base.Constants;
import au.edu.apsr.mtk.base.Div;
import au.edu.apsr.mtk.base.DmdSec;
@@ -70,11 +68,11 @@
import au.edu.apsr.mtk.base.METSWrapper;
import au.edu.apsr.mtk.base.MdSec;
import au.edu.apsr.mtk.base.MdWrap;
-import au.edu.apsr.mtk.base.SourceMD;
import au.edu.apsr.mtk.base.StructMap;
import org.eclipse.pass.deposit.assembler.PackageStream;
import org.eclipse.pass.deposit.model.DepositMetadata;
import org.eclipse.pass.deposit.model.DepositSubmission;
+import org.eclipse.pass.deposit.provider.util.CitationUtil;
import org.w3c.dom.Comment;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@@ -105,8 +103,6 @@ public class DspaceMetadataDomWriter {
private METS mets;
- private int authorIndex;
-
DspaceMetadataDomWriter(DocumentBuilderFactory dbf) {
try {
this.dbf = dbf;
@@ -409,7 +405,6 @@ Element createDublinCoreMetadataDCMES(DepositSubmission submission) {
// Attach a for each Person associated with the submission to the Manuscript metadata
DepositMetadata nimsMd = submission.getMetadata();
DepositMetadata.Manuscript manuscriptMd = nimsMd.getManuscriptMetadata();
- DepositMetadata.Article articleMd = nimsMd.getArticleMetadata();
DepositMetadata.Journal journalMd = nimsMd.getJournalMetadata();
// Attach a for the Manuscript title
@@ -435,11 +430,7 @@ Element createDublinCoreMetadataDCMES(DepositSubmission submission) {
record.appendChild(publisher);
}
- // Begin building citation string
- StringBuilder citationBldr = new StringBuilder();
-
- // Attach a for each author of the manuscript and add authorIndex to citation
- authorIndex = 0;
+ // Attach a for each author of the manuscript
nimsMd.getPersons().forEach(p -> {
// Only include authorIndex, PIs and CoPIs as contributors
if (p.getType() != DepositMetadata.PERSON_TYPE.submitter) {
@@ -447,56 +438,18 @@ Element createDublinCoreMetadataDCMES(DepositSubmission submission) {
contributor.setTextContent(p.getName());
record.appendChild(contributor);
}
-
- if (p.getType() == DepositMetadata.PERSON_TYPE.author) {
- // Citation: For author 0, add name. For authorIndex 1 and 2, add comma then name.
- // For author 3, add comma and "et al". For later authorIndex, do nothing.
- if (authorIndex == 0) {
- citationBldr.append(p.getReversedName());
- } else if (authorIndex <= 2) {
- citationBldr.append(", " + p.getReversedName());
- } else if (authorIndex == 3) {
- citationBldr.append(", et al");
- }
- authorIndex++;
- }
});
- if (authorIndex == 0) {
+
+ if (nimsMd.getPersons().stream().filter(p -> p.getType() == DepositMetadata.PERSON_TYPE.author).count() == 0) {
throw new RuntimeException("No authors found in the manuscript metadata!");
}
- // Add period at end of author list in citation
- citationBldr.append(".");
- // Attach a if not empty
- // publication date - after a single space, in parens, followed by "."
- if (journalMd != null && journalMd.getPublicationDate() != null && !journalMd.getPublicationDate().isEmpty()) {
- citationBldr.append(" (" + journalMd.getPublicationDate() + ").");
- }
- // article title - after single space, in double quotes with "." inside
- if (articleMd != null && articleMd.getTitle() != null && !articleMd.getTitle().isEmpty()) {
- citationBldr.append(" \"" + articleMd.getTitle() + ".\"");
- }
- // journal title - after single space, followed by "."
- if (journalMd != null && journalMd.getJournalTitle() != null && !journalMd.getJournalTitle().isEmpty()) {
- citationBldr.append(" " + journalMd.getJournalTitle() + ".");
- }
- // volume - after single space
- if (articleMd != null && articleMd.getVolume() != null && !articleMd.getVolume().isEmpty()) {
- citationBldr.append(" " + articleMd.getVolume());
- }
- // issue - after single space, inside parens, followed by "."
- if (articleMd != null && articleMd.getIssue() != null && !articleMd.getIssue().isEmpty()) {
- citationBldr.append(" (" + articleMd.getIssue() + ").");
- }
- // DOI - after single space, followed by "."
- if (articleMd != null && articleMd.getDoi() != null) {
- citationBldr.append(" " + articleMd.getDoi().toString() + ".");
- }
+ String citation = CitationUtil.createCitation(submission);
- if (!citationBldr.toString().isEmpty()) {
- Element citation = dcDocument.createElementNS(DCTERMS_NS, asQname(DCTERMS_NS, DCT_BIBLIOCITATION));
- citation.setTextContent(citationBldr.toString());
- record.appendChild(citation);
+ if (!citation.isEmpty()) {
+ Element el = dcDocument.createElementNS(DCTERMS_NS, asQname(DCTERMS_NS, DCT_BIBLIOCITATION));
+ el.setTextContent(citation);
+ record.appendChild(el);
}
return record;
@@ -656,47 +609,6 @@ private FileSec createFileSec() throws METSException {
return fs;
}
- private SourceMD getSourceMd(String id) throws METSException {
- if (id == null) {
- return createSourceMd();
- }
-
- Optional amdSec = mets
- .getAmdSecs()
- .stream()
- .filter(candidateAmdSec -> candidateAmdSec.getSourceMD(id) != null)
- .findAny();
-
- if (amdSec.isPresent()) {
- return amdSec.get().getSourceMD(id);
- }
-
- throw new RuntimeException("SourceMD with id '" + id + "' not found.");
- }
-
- private SourceMD createSourceMd() throws METSException {
- AmdSec amdSec = getAmdSec();
- SourceMD sourceMD = amdSec.newSourceMD();
- sourceMD.setID(mintId());
- amdSec.addSourceMD(sourceMD);
- return sourceMD;
- }
-
- private AmdSec getAmdSec() throws METSException {
- if (mets.getAmdSecs() == null || mets.getAmdSecs().isEmpty()) {
- return createAmdSec();
- }
-
- return mets.getAmdSecs().get(0);
- }
-
- private AmdSec createAmdSec() throws METSException {
- AmdSec as = mets.newAmdSec();
- mets.addAmdSec(as);
- as.setID(mintId());
- return as;
- }
-
/**
* Obtains the specified {@code }, or creates a new {@code } if {@code id} is {@code null}.
*
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/util/CitationUtil.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/util/CitationUtil.java
new file mode 100644
index 00000000..19724276
--- /dev/null
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/util/CitationUtil.java
@@ -0,0 +1,71 @@
+package org.eclipse.pass.deposit.provider.util;
+
+import java.time.format.DateTimeFormatter;
+
+import org.eclipse.pass.deposit.model.DepositMetadata;
+import org.eclipse.pass.deposit.model.DepositMetadata.Person;
+import org.eclipse.pass.deposit.model.DepositSubmission;
+
+public class CitationUtil {
+ private CitationUtil() {}
+
+ // TODO Could we use citation from CrossRef metadata?
+ public static String createCitation(DepositSubmission submission) {
+ DepositMetadata submissionMd = submission.getMetadata();
+ DepositMetadata.Article articleMd = submissionMd.getArticleMetadata();
+ DepositMetadata.Journal journalMd = submissionMd.getJournalMetadata();
+
+ StringBuilder citationBldr = new StringBuilder();
+
+ int authorIndex = 0;
+ for (Person p: submissionMd.getPersons()) {
+ if (p.getType() == DepositMetadata.PERSON_TYPE.author) {
+ // Citation: For author 0, add name. For authorIndex 1 and 2, add comma then name.
+ // For author 3, add comma and "et al". For later authorIndex, do nothing.
+ if (authorIndex == 0) {
+ citationBldr.append(p.getReversedName());
+ } else if (authorIndex <= 2) {
+ citationBldr.append(", " + p.getReversedName());
+ } else if (authorIndex == 3) {
+ citationBldr.append(", et al");
+ }
+ authorIndex++;
+ }
+ }
+
+ // Add period at end of author list in citation
+
+ if (citationBldr.length() > 0) {
+ citationBldr.append(".");
+ }
+
+ // Attach a if not empty
+ // publication date - after a single space, in parens, followed by "."
+ if (journalMd != null && journalMd.getPublicationDate() != null) {
+ citationBldr.append(" (" + journalMd.getPublicationDate().
+ format(DateTimeFormatter.ISO_LOCAL_DATE) + ").");
+ }
+ // article title - after single space, in double quotes with "." inside
+ if (articleMd != null && articleMd.getTitle() != null && !articleMd.getTitle().isEmpty()) {
+ citationBldr.append(" \"" + articleMd.getTitle() + ".\"");
+ }
+ // journal title - after single space, followed by "."
+ if (journalMd != null && journalMd.getJournalTitle() != null && !journalMd.getJournalTitle().isEmpty()) {
+ citationBldr.append(" " + journalMd.getJournalTitle() + ".");
+ }
+ // volume - after single space
+ if (articleMd != null && articleMd.getVolume() != null && !articleMd.getVolume().isEmpty()) {
+ citationBldr.append(" " + articleMd.getVolume());
+ }
+ // issue - after single space, inside parens, followed by "."
+ if (articleMd != null && articleMd.getIssue() != null && !articleMd.getIssue().isEmpty()) {
+ citationBldr.append(" (" + articleMd.getIssue() + ").");
+ }
+ // DOI - after single space, followed by "."
+ if (articleMd != null && articleMd.getDoi() != null) {
+ citationBldr.append(" " + articleMd.getDoi().toString() + ".");
+ }
+
+ return citationBldr.toString();
+ }
+}
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/service/DepositTask.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/service/DepositTask.java
index 8f15c285..00ef26e8 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/service/DepositTask.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/service/DepositTask.java
@@ -442,9 +442,13 @@ static Function performDeposit(DepositWorkerContext
dc.deposit().getId(), dc.deposit());
}
try (TransportSession transportSession = transport.open(packagerConfig)) {
- TransportResponse tr = transportSession.send(packageStream, packagerConfig);
+ TransportResponse tr = transportSession.send(packageStream, packagerConfig, deposit);
deposit.setDepositStatus(DepositStatus.SUBMITTED);
- deposit.setDepositStatusRef(packageStream.metadata().packageDepositStatusRef());
+
+ // Only set deposit status ref if not already set during transport
+ if (deposit.getDepositStatusRef() == null) {
+ deposit.setDepositStatusRef(packageStream.metadata().packageDepositStatusRef());
+ }
return tr;
} catch (Exception e) {
throw new RuntimeException("Error closing transport session for deposit " +
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/deploymenttest/DeploymentTestDataService.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/deploymenttest/DeploymentTestDataService.java
index 77152757..476e21be 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/deploymenttest/DeploymentTestDataService.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/deploymenttest/DeploymentTestDataService.java
@@ -20,6 +20,7 @@
import java.util.List;
import java.util.Objects;
+import org.eclipse.pass.deposit.support.dspace.DSpaceDepositService;
import org.eclipse.pass.support.client.ModelUtil;
import org.eclipse.pass.support.client.PassClient;
import org.eclipse.pass.support.client.PassClientSelector;
@@ -51,7 +52,7 @@ public class DeploymentTestDataService {
public static final String SUBMISSION_ID = "submission.id";
private final PassClient passClient;
- private final DspaceDepositService dspaceDepositService;
+ private final DSpaceDepositService dspaceDepositService;
@Value("${pass.test.data.policy.title}")
private String testPolicyTitle;
@@ -66,7 +67,7 @@ public class DeploymentTestDataService {
private String dspaceKey;
@Autowired
- public DeploymentTestDataService(PassClient passClient, DspaceDepositService dspaceDepositService) {
+ public DeploymentTestDataService(PassClient passClient, DSpaceDepositService dspaceDepositService) {
this.passClient = passClient;
this.dspaceDepositService = dspaceDepositService;
}
@@ -131,7 +132,7 @@ private void deleteDepositsInRepoIfNeeded(Grant testGrant) throws IOException {
));
List testSubmissions = passClient.streamObjects(testSubmissionSelector).toList();
if (!testSubmissions.isEmpty()) {
- DspaceDepositService.AuthContext authContext = dspaceDepositService.authenticate();
+ DSpaceDepositService.AuthContext authContext = dspaceDepositService.authenticate();
testSubmissions.forEach(testSubmission -> {
try {
PassClientSelector testDepositSelector = new PassClientSelector<>(Deposit.class);
@@ -149,7 +150,7 @@ private void deleteDepositsInRepoIfNeeded(Grant testGrant) throws IOException {
}
}
- private void deleteDepositInRepoIfNeeded(Deposit deposit, DspaceDepositService.AuthContext authContext) {
+ private void deleteDepositInRepoIfNeeded(Deposit deposit, DSpaceDepositService.AuthContext authContext) {
if (isDspaceDeposit(deposit)) {
dspaceDepositService.deleteDeposit(deposit, authContext);
}
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/deploymenttest/DspaceDepositService.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/dspace/DSpaceDepositService.java
similarity index 64%
rename from pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/deploymenttest/DspaceDepositService.java
rename to pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/dspace/DSpaceDepositService.java
index d8cd787d..05262c20 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/deploymenttest/DspaceDepositService.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/dspace/DSpaceDepositService.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.eclipse.pass.deposit.support.deploymenttest;
+package org.eclipse.pass.deposit.support.dspace;
import java.net.URI;
import java.util.List;
@@ -29,11 +29,13 @@
import org.apache.hc.core5.http.io.SocketConfig;
import org.apache.hc.core5.util.TimeValue;
import org.apache.hc.core5.util.Timeout;
+import org.eclipse.pass.deposit.assembler.DepositFileResource;
+import org.eclipse.pass.deposit.transport.RepositoryConnectivityService;
import org.eclipse.pass.support.client.model.Deposit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@@ -46,35 +48,37 @@
/**
* @author Russ Poetker (rpoetke1@jh.edu)
*/
-@ConditionalOnProperty(name = "pass.test.data.job.enabled")
@Service
-public class DspaceDepositService {
- private static final Logger LOG = LoggerFactory.getLogger(DspaceDepositService.class);
-
- public static final String X_XSRF_TOKEN = "X-XSRF-TOKEN";
- public static final String COOKIE = "Cookie";
- public static final String DSPACE_XSRF_COOKIE = "DSPACE-XSRF-COOKIE=";
- public static final String AUTHORIZATION = "Authorization";
+public class DSpaceDepositService {
+ private static final Logger LOG = LoggerFactory.getLogger(DSpaceDepositService.class);
+ private static final String X_XSRF_TOKEN = "X-XSRF-TOKEN";
+ private static final String COOKIE = "Cookie";
+ private static final String DSPACE_XSRF_COOKIE = "DSPACE-XSRF-COOKIE=";
+ private static final String AUTHORIZATION = "Authorization";
private final RestClient restClient;
+ @Value("${dspace.api.url}")
+ private String dspaceApiUrl;
+
+ @Value("${dspace.website.url}")
+ private String dspaceWebsiteUrl;
+
@Value("${dspace.user}")
private String dspaceUsername;
@Value("${dspace.password}")
private String dspacePassword;
- @Value("${dspace.server}")
- private String dspaceServer;
+ @Value("${dspace.collection.handle}")
+ private String dspaceCollectionHandle;
- @Value("${dspace.server.api.protocol}")
- private String dspaceApiProtocol;
+ @Autowired
+ private RepositoryConnectivityService repositoryConnectivityService;
- protected record AuthContext(String xsrfToken, String authToken){}
+ public record AuthContext(String xsrfToken, String authToken){}
- public DspaceDepositService(@Value("${dspace.server.api.protocol}") String dspaceApiProtocol,
- @Value("${dspace.server}") String dspaceServer,
- @Value("${dspace.server.api.path}") String dspaceApiPath) {
+ public DSpaceDepositService(@Value("${dspace.api.url}") String dspaceApiUrl) {
PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create()
.setDefaultSocketConfig(SocketConfig.custom()
.setSoTimeout(Timeout.ofMinutes(1))
@@ -89,9 +93,10 @@ public DspaceDepositService(@Value("${dspace.server.api.protocol}") String dspac
.setConnectionManager(connectionManager)
.disableCookieManagement()
.build();
+
this.restClient = RestClient.builder()
.requestFactory(new HttpComponentsClientHttpRequestFactory(httpClient))
- .baseUrl(dspaceApiProtocol + "://" + dspaceServer + dspaceApiPath)
+ .baseUrl(dspaceApiUrl)
.build();
}
@@ -100,7 +105,7 @@ public DspaceDepositService(@Value("${dspace.server.api.protocol}") String dspac
* authentication docs.
* @return an AuthContext containing authToken and xsrfToken
*/
- AuthContext authenticate() {
+ public AuthContext authenticate() {
// Using exchange is needed for this call because dspace returns 404, but the response headers has the
// csrf token header DSPACE-XSRF-TOKEN
ResponseEntity csrfResponse = restClient.get()
@@ -119,7 +124,7 @@ AuthContext authenticate() {
.body(bodyPair)
.retrieve()
.toBodilessEntity();
- String authToken = getAuthHeaderValue(authResponse, AUTHORIZATION);
+ String authToken = getAuthHeaderValue(authResponse, "Authorization");
return new AuthContext(xsrfToken, authToken);
}
@@ -128,11 +133,11 @@ AuthContext authenticate() {
* Deletes the deposit in the remote repository.
* @param deposit contains deposit info to do the delete
*/
- void deleteDeposit(Deposit deposit, AuthContext authContext) {
+ public void deleteDeposit(Deposit deposit, AuthContext authContext) {
LOG.warn("Deleting Test Deposit In Dspace (PASS Deposit ID={})", deposit.getId());
URI accessUrl = Objects.nonNull(deposit.getRepositoryCopy())
- ? deposit.getRepositoryCopy().getAccessUrl()
- : null;
+ ? deposit.getRepositoryCopy().getAccessUrl()
+ : null;
LOG.warn("Deposit accessUrl={}", accessUrl);
if (Objects.nonNull(accessUrl)) {
String handleValue = parseHandleFilter(accessUrl);
@@ -162,12 +167,20 @@ private String getAuthHeaderValue(ResponseEntity response, String header)
}
private String parseHandleFilter(URI accessUrl) {
- String handleDelim = dspaceApiProtocol + "://" + dspaceServer + "/handle/";
- String[] handleTokens = accessUrl.toString().split(handleDelim);
- if (handleTokens.length != 2) {
+ String path = accessUrl.getPath();
+
+ String mark = "/handle/";
+ int start = path.indexOf(mark);
+
+ if (start == -1) {
throw new RuntimeException("Unable to determine dspace item handle for " + accessUrl);
}
- return handleTokens[1];
+
+ return path.substring(start + mark.length());
+ }
+
+ public String createAccessUrlFromItemUuid(String itemUuid) {
+ return dspaceWebsiteUrl + "/items/" + itemUuid;
}
private String findItemUuid(String handleValue, AuthContext authContext, String submissionTitle) {
@@ -233,4 +246,88 @@ private void deleteItem(String itemUuid, AuthContext authContext) {
.toBodilessEntity();
LOG.warn("Deleted item UUID={}", itemUuid);
}
+
+ public String getUuidForHandle(String handle, AuthContext authContext) {
+ LOG.debug("Search Dspace for object with handle={}", handle);
+
+ String searchResponse = restClient.get()
+ .uri("/discover/search/objects?query=handle:{handleValue}", handle)
+ .accept(MediaType.APPLICATION_JSON)
+ .header(AUTHORIZATION, authContext.authToken())
+ .retrieve()
+ .body(String.class);
+
+ List
*/
public interface TransportSession extends AutoCloseable {
-
/**
* Transfer the bytes of the supplied package to the remote system. Metadata can be optionally supplied which may
* help the underlying transport correctly configure itself for the transfer.
@@ -45,12 +45,14 @@ public interface TransportSession extends AutoCloseable {
*
* @param packageStream the package and package metadata
* @param metadata transport-related metadata, or any "extra" package metadata
+ * @param deposit deposit representation
* @return a response indicating success or failure of the transfer
*/
- TransportResponse send(PackageStream packageStream, Map metadata);
+ TransportResponse send(PackageStream packageStream, Map metadata, Deposit deposit);
boolean closed();
+ @Override
void close() throws IOException;
}
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/devnull/DevNullTransport.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/devnull/DevNullTransport.java
index 12b854ea..712fe465 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/devnull/DevNullTransport.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/devnull/DevNullTransport.java
@@ -66,7 +66,8 @@ public TransportSession open(Map hints) {
class DevNullTransportSession implements TransportSession {
@Override
- public TransportResponse send(PackageStream packageStream, Map metadata) {
+ public TransportResponse send(PackageStream packageStream, Map metadata,
+ Deposit deposit) {
// no-op, just return successful response
return new TransportResponse() {
@Override
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceResponse.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceResponse.java
new file mode 100644
index 00000000..47d2bef7
--- /dev/null
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceResponse.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2024 Johns Hopkins University
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.eclipse.pass.deposit.transport.dspace;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.eclipse.pass.deposit.service.DepositUtil;
+import org.eclipse.pass.deposit.transport.TransportResponse;
+import org.eclipse.pass.support.client.PassClient;
+import org.eclipse.pass.support.client.model.CopyStatus;
+import org.eclipse.pass.support.client.model.Deposit;
+import org.eclipse.pass.support.client.model.DepositStatus;
+import org.eclipse.pass.support.client.model.RepositoryCopy;
+
+/**
+ * @author Russ Poetker (rpoetke1@jh.edu)
+ */
+class DSpaceResponse implements TransportResponse {
+ private final boolean success;
+ private final Throwable throwable;
+ private final String depositAccessUrl;
+
+ DSpaceResponse(boolean success, String depositAccessUrl) {
+ this(success, depositAccessUrl, null);
+ }
+
+ DSpaceResponse(boolean success, String depositAccessUrl, Throwable throwable) {
+ this.success = success;
+ this.depositAccessUrl = depositAccessUrl;
+ this.throwable = throwable;
+ }
+
+ @Override
+ public boolean success() {
+ return success;
+ }
+
+ @Override
+ public Throwable error() {
+ return throwable;
+ }
+
+ @Override
+ public void onSuccess(DepositUtil.DepositWorkerContext depositWorkerContext, PassClient passClient) {
+ try {
+ RepositoryCopy repositoryCopy = depositWorkerContext.repoCopy();
+ repositoryCopy.setAccessUrl(URI.create(depositAccessUrl));
+ repositoryCopy.getExternalIds().add(depositAccessUrl);
+ repositoryCopy.setCopyStatus(CopyStatus.COMPLETE);
+ passClient.updateObject(repositoryCopy);
+ Deposit deposit = depositWorkerContext.deposit();
+ deposit.setDepositStatus(DepositStatus.ACCEPTED);
+ passClient.updateObject(deposit);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
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
new file mode 100644
index 00000000..599fd206
--- /dev/null
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceSession.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2024 Johns Hopkins University
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.eclipse.pass.deposit.transport.dspace;
+
+import java.util.Map;
+
+import com.jayway.jsonpath.DocumentContext;
+import com.jayway.jsonpath.JsonPath;
+import org.eclipse.pass.deposit.assembler.PackageStream;
+import org.eclipse.pass.deposit.model.DepositSubmission;
+import org.eclipse.pass.deposit.provider.dspace.DSpaceMetadataMapper;
+import org.eclipse.pass.deposit.support.dspace.DSpaceDepositService;
+import org.eclipse.pass.deposit.support.dspace.DSpaceDepositService.AuthContext;
+import org.eclipse.pass.deposit.transport.TransportResponse;
+import org.eclipse.pass.deposit.transport.TransportSession;
+import org.eclipse.pass.support.client.PassClient;
+import org.eclipse.pass.support.client.model.Deposit;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * In order to do a deposit to DSpace, first a workspace item is created with the files.
+ * Then the workspace item is patched with the correct metadata.
+ * Finally a workflow item is created referencing the workspace item in order to trigger submission.
+ */
+class DSpaceSession implements TransportSession {
+ private static final String DEPOSIT_STATUS_REF_PREFIX = "wsi:";
+ private static final Logger LOG = LoggerFactory.getLogger(DSpaceSession.class);
+
+ private final DSpaceDepositService dspaceDepositService;
+ private final DSpaceMetadataMapper dspaceMetadataMapper;
+ private final PassClient passClient;
+
+ public DSpaceSession(DSpaceDepositService dspaceDepositService, DSpaceMetadataMapper dspaceMetadataMapper,
+ PassClient passClient) {
+ this.dspaceDepositService = dspaceDepositService;
+ this.dspaceMetadataMapper = dspaceMetadataMapper;
+ this.passClient = passClient;
+ }
+
+ @Override
+ public TransportResponse send(PackageStream packageStream, Map metadata, Deposit deposit) {
+ try {
+ DepositSubmission depositSubmission = packageStream.getDepositSubmission();
+
+ LOG.info("Processing Dspace Deposit for Submission: {}", depositSubmission.getId());
+
+ AuthContext authContext = dspaceDepositService.authenticate();
+
+ // Create WorkspaceItem if it does not already exist
+
+ int workspaceItemId = -1;
+ DocumentContext workspaceItemContext = null;
+
+ try {
+ String ref = deposit.getDepositStatusRef();
+
+ if (ref != null && ref.startsWith(DEPOSIT_STATUS_REF_PREFIX)) {
+ workspaceItemId = Integer.parseInt(ref.substring(DEPOSIT_STATUS_REF_PREFIX.length()));
+ }
+ } catch (NumberFormatException e) {
+ // nop
+ }
+
+ if (workspaceItemId == -1) {
+ workspaceItemContext = JsonPath.parse(dspaceDepositService.createWorkspaceItem(
+ packageStream.getCustodialContent(), authContext));
+ workspaceItemId = workspaceItemContext.read("$._embedded.workspaceitems[0].id");
+
+ // Use the deposit status ref to mark that the workspace item was created
+ deposit.setDepositStatusRef(DEPOSIT_STATUS_REF_PREFIX + workspaceItemId);
+ passClient.updateObject(deposit);
+
+ LOG.debug("Created WorkspaceItem: {}", workspaceItemId);
+ } else {
+ LOG.info("DSpace WorkspaceItem already exists for Submission: {}", depositSubmission.getId());
+
+ workspaceItemContext = JsonPath.parse(dspaceDepositService.
+ getWorkspaceItem(workspaceItemId, authContext));
+ }
+
+ // Check metadata to see if it needs to be patched.
+
+ Map itemMetadata = workspaceItemContext.
+ read("$._embedded.workspaceitems[0]._embedded.item.metadata");
+
+ if (itemMetadata.size() == 0) {
+ String patchJson = dspaceMetadataMapper.patchWorkspaceItem(depositSubmission);
+
+ LOG.debug("Patching WorkspaceItem to add metadata {}", patchJson);
+ dspaceDepositService.patchWorkspaceItem(workspaceItemId, patchJson, authContext);
+ }
+
+ LOG.debug("Creating WorkflowItem for WorkspaceItem {}", workspaceItemId);
+ dspaceDepositService.createWorkflowItem(workspaceItemId, authContext);
+
+ // Item which should be published
+ String itemUuid = workspaceItemContext.read("$._embedded.workspaceitems[0]._embedded.item.uuid");
+ String accessUrl = dspaceDepositService.createAccessUrlFromItemUuid(itemUuid);
+
+ LOG.info("Completed DSpace Deposit for Submission: {}, accessUrl: {}",
+ depositSubmission.getId(), accessUrl);
+ return new DSpaceResponse(true, accessUrl);
+ } catch (Exception e) {
+ LOG.error("Error depositing into DSpace", e);
+ return new DSpaceResponse(false, null, e);
+ }
+ }
+
+ @Override
+ public boolean closed() {
+ return true;
+ }
+
+ @Override
+ public void close() {
+ // no-op resources are closed with try-with-resources
+ }
+}
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceTransport.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceTransport.java
new file mode 100644
index 00000000..72615ec5
--- /dev/null
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceTransport.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2024 Johns Hopkins University
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.eclipse.pass.deposit.transport.dspace;
+
+import java.util.Map;
+
+import org.eclipse.pass.deposit.provider.dspace.DSpaceMetadataMapper;
+import org.eclipse.pass.deposit.support.dspace.DSpaceDepositService;
+import org.eclipse.pass.deposit.transport.Transport;
+import org.eclipse.pass.deposit.transport.TransportSession;
+import org.eclipse.pass.support.client.PassClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class DSpaceTransport implements Transport {
+ @Autowired
+ private DSpaceDepositService dspaceDepositService;
+
+ @Autowired
+ private DSpaceMetadataMapper dspaceMetadataMapper;
+
+ @Autowired
+ private PassClient passClient;
+
+ @Override
+ public PROTOCOL protocol() {
+ return PROTOCOL.DSpace;
+ }
+
+ @Override
+ public TransportSession open(Map hints) {
+ return new DSpaceSession(dspaceDepositService, dspaceMetadataMapper, passClient);
+ }
+
+ @Override
+ public boolean checkConnectivity(Map hints) {
+ return dspaceDepositService.verifyConnectivity();
+ }
+}
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/fs/FilesystemTransport.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/fs/FilesystemTransport.java
index 3d13d39b..c4ee576a 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/fs/FilesystemTransport.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/fs/FilesystemTransport.java
@@ -109,7 +109,8 @@ public TransportSession open(Map hints) {
class FilesystemTransportSession implements TransportSession {
@Override
- public TransportResponse send(PackageStream packageStream, Map metadata) {
+ public TransportResponse send(PackageStream packageStream, Map metadata,
+ Deposit deposit) {
String filename = packageStream.metadata().name();
AtomicReference transportException = new AtomicReference<>();
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/inveniordm/InvenioRdmSession.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/inveniordm/InvenioRdmSession.java
index e7417c5e..0382c7ed 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/inveniordm/InvenioRdmSession.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/inveniordm/InvenioRdmSession.java
@@ -36,6 +36,7 @@
import org.eclipse.pass.deposit.provider.inveniordm.InvenioRdmMetadataMapper;
import org.eclipse.pass.deposit.transport.TransportResponse;
import org.eclipse.pass.deposit.transport.TransportSession;
+import org.eclipse.pass.support.client.model.Deposit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.Resource;
@@ -76,7 +77,7 @@ class InvenioRdmSession implements TransportSession {
}
@Override
- public TransportResponse send(PackageStream packageStream, Map metadata) {
+ public TransportResponse send(PackageStream packageStream, Map metadata, Deposit deposit) {
try {
DepositSubmission depositSubmission = packageStream.getDepositSubmission();
LOG.warn("Processing InvenioRDM Deposit for Submission: {}", depositSubmission.getId());
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sftp/SftpTransportSession.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sftp/SftpTransportSession.java
index 760afec9..3d2c10f8 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sftp/SftpTransportSession.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sftp/SftpTransportSession.java
@@ -44,6 +44,7 @@
import org.eclipse.pass.deposit.assembler.PackageStream;
import org.eclipse.pass.deposit.transport.TransportResponse;
import org.eclipse.pass.deposit.transport.TransportSession;
+import org.eclipse.pass.support.client.model.Deposit;
/**
* @author Russ Poetker (rpoetke1@jh.edu)
@@ -57,7 +58,7 @@ class SftpTransportSession implements TransportSession {
}
@Override
- public TransportResponse send(PackageStream packageStream, Map metadata) {
+ public TransportResponse send(PackageStream packageStream, Map metadata, Deposit deposit) {
PackageStream.Metadata streamMetadata = packageStream.metadata();
String fileName = streamMetadata.name();
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sword2/Sword2Transport.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sword2/Sword2Transport.java
index 72b14d0e..fc154fe3 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sword2/Sword2Transport.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sword2/Sword2Transport.java
@@ -54,7 +54,7 @@
* A URL to the SWORD version 2 service document
* {@link Sword2TransportHints#SWORD_COLLECTION_URL}
* A URL to the SWORD version 2 collection that packages will be deposited to upon
- * {@link Sword2TransportSession#send(PackageStream, Map) send}
+ * {@link Sword2TransportSession#send(PackageStream, Map, DepositWorkerContext) send}
* Optional: {@link Sword2TransportHints#SWORD_ON_BEHALF_OF_USER}
* The username this session is being opened for
* Optional: {@link Sword2TransportHints#SWORD_CLIENT_USER_AGENT}
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sword2/Sword2TransportSession.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sword2/Sword2TransportSession.java
index 6923a149..db9e9f35 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sword2/Sword2TransportSession.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sword2/Sword2TransportSession.java
@@ -104,6 +104,7 @@ public Sword2TransportSession(SWORDClient client, ServiceDocument serviceDocumen
*
* @param packageStream {@inheritDoc}
* @param metadata {@inheritDoc}
+ * @param passDeposit {@inheritDoc}
* @return {@inheritDoc}
* @throws IllegalStateException if this session has been {@link #close() closed}
* @see
@@ -111,7 +112,8 @@ public Sword2TransportSession(SWORDClient client, ServiceDocument serviceDocumen
* SWORD v2 Profile
*/
@Override
- public TransportResponse send(PackageStream packageStream, Map metadata) {
+ public TransportResponse send(PackageStream packageStream, Map metadata,
+ org.eclipse.pass.support.client.model.Deposit passDeposit) {
if (closed) {
throw new IllegalStateException("SWORDv2 transport session has been closed.");
}
diff --git a/pass-deposit-services/deposit-core/src/main/resources/application.properties b/pass-deposit-services/deposit-core/src/main/resources/application.properties
index 6c7039f1..54484789 100644
--- a/pass-deposit-services/deposit-core/src/main/resources/application.properties
+++ b/pass-deposit-services/deposit-core/src/main/resources/application.properties
@@ -27,13 +27,14 @@ pmc.ftp.port=${PMC_FTP_PORT}
pmc.ftp.user=${PMC_FTP_USER}
pmc.ftp.password=${PMC_FTP_PASSWORD}
-dspace.host=${DSPACE_HOST}
-dspace.port=${DSPACE_PORT}
dspace.server=${DSPACE_SERVER}
+dspace.api.url=${DSPACE_API_URL}
+dspace.website.url=${DSPACE_WEBSITE_URL}
dspace.user=${DSPACE_USER}
dspace.password=${DSPACE_PASSWORD}
-dspace.server.api.protocol=${DSPACE_API_PROTOCOL}
-dspace.server.api.path=${DSPACE_API_PATH}
+dspace.collection.handle=${DSPACE_COLLECTION_HANDLE}
+dspace.field.embargo.lift=${DSPACE_FIELD_EMBARGO_LIFT:local.embargo.lift}
+dspace.field.embargo.terms=${DSPACE_FIELD_EMBARGO_TERMS:local.embargo.terms}
inveniordm.api.baseUrl=${INVENIORDM_API_BASE_URL:}
inveniordm.api.token=${INVENIORDM_API_TOKEN}
diff --git a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/AbstractJacksonMappingTest.java b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/AbstractJacksonMappingTest.java
index 5f545156..6e14a9ec 100644
--- a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/AbstractJacksonMappingTest.java
+++ b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/AbstractJacksonMappingTest.java
@@ -30,8 +30,7 @@
@TestPropertySource(
locations = "/test-application.properties",
properties = {
- "dspace.host=test-dspace-host",
- "dspace.port=test-dspace-port",
+ "dspace.server=test-dspace-host:8000",
"pmc.ftp.host=test-ftp-host",
"pmc.ftp.port=test-ftp-port",
})
diff --git a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/PropertyResolvingDeserializerTest.java b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/PropertyResolvingDeserializerTest.java
index 76d5237f..cbc00c20 100644
--- a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/PropertyResolvingDeserializerTest.java
+++ b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/PropertyResolvingDeserializerTest.java
@@ -30,7 +30,7 @@ public void noPropertyResolutionTest() throws Exception {
RepositoryConfig.class);
assertEquals(SwordV2Binding.PROTO, config.getTransportConfig().getProtocolBinding().getProtocol());
SwordV2Binding swordV2Binding = (SwordV2Binding) config.getTransportConfig().getProtocolBinding();
- assertTrue(swordV2Binding.getDefaultCollectionUrl().contains("http://test-dspace-host:test-dspace-port"));
+ assertTrue(swordV2Binding.getDefaultCollectionUrl().contains("http://test-dspace-host:8000"));
}
@Test
@@ -39,6 +39,6 @@ public void resolvePropertiesTest() throws Exception {
RepositoryConfig.class);
assertTrue(config.getTransportConfig().getProtocolBinding().getProtocol().equals(SwordV2Binding.PROTO));
SwordV2Binding swordV2Binding = (SwordV2Binding) config.getTransportConfig().getProtocolBinding();
- assertFalse(swordV2Binding.getDefaultCollectionUrl().contains("${dspace.host}"));
+ assertFalse(swordV2Binding.getDefaultCollectionUrl().contains("${dspace.server}"));
}
}
diff --git a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/RepositoryConfigMappingTest.java b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/RepositoryConfigMappingTest.java
index a2184f7e..ddaa547d 100644
--- a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/RepositoryConfigMappingTest.java
+++ b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/RepositoryConfigMappingTest.java
@@ -75,12 +75,12 @@ public class RepositoryConfigMappingTest extends AbstractJacksonMappingTest {
" \"protocol\": \"SWORDv2\",\n" +
" \"username\": \"sworduser\",\n" +
" \"password\": \"swordpass\",\n" +
- " \"server-fqdn\": \"${dspace.host}\",\n" +
- " \"server-port\": \"${dspace.port}\",\n" +
- " \"service-doc\": \"http://${dspace.host}:${dspace" +
- ".port}/swordv2/servicedocument\",\n" +
- " \"default-collection\": \"http://${dspace.host}:${dspace" +
- ".port}/swordv2/collection/123456789/2\",\n" +
+ " \"server-fqdn\": null,\n" +
+ " \"server-port\": null,\n" +
+ " \"service-doc\": \"http://${dspace.server}" +
+ "/swordv2/servicedocument\",\n" +
+ " \"default-collection\": \"http://${dspace.server}" +
+ "/swordv2/collection/123456789/2\",\n" +
" \"on-behalf-of\": null,\n" +
" \"deposit-receipt\": true,\n" +
" \"user-agent\": \"pass-deposit/x.y.z\"\n" +
diff --git a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/SimpleClassMappingTest.java b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/SimpleClassMappingTest.java
index 939dcacd..a7ec26b8 100644
--- a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/SimpleClassMappingTest.java
+++ b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/SimpleClassMappingTest.java
@@ -40,10 +40,10 @@ public class SimpleClassMappingTest extends AbstractJacksonMappingTest {
" \"protocol\": \"SWORDv2\",\n" +
" \"username\": \"sworduser\",\n" +
" \"password\": \"swordpass\",\n" +
- " \"service-doc\": \"http://${dspace.host}:${dspace" +
- ".port}/swordv2/servicedocument\",\n" +
- " \"default-collection\": \"http://${dspace" +
- ".host}:${dspace.port}/swordv2/collection/123456789/2\",\n" +
+ " \"service-doc\": \"http://${dspace.server}" +
+ "/swordv2/servicedocument\",\n" +
+ " \"default-collection\": \"http://${dspace.server}" +
+ "/swordv2/collection/123456789/2\",\n" +
" \"on-behalf-of\": null,\n" +
" \"deposit-receipt\": true,\n" +
" \"user-agent\": \"pass-deposit/x.y.z\"\n" +
@@ -108,9 +108,9 @@ public void mapSwordBinding() throws IOException {
assertEquals("SWORDv2", swordBinding.getProtocol());
assertEquals("sworduser", swordBinding.getUsername());
assertEquals("swordpass", swordBinding.getPassword());
- assertEquals("http://test-dspace-host:test-dspace-port/swordv2/servicedocument",
+ assertEquals("http://test-dspace-host:8000/swordv2/servicedocument",
swordBinding.getServiceDocUrl());
- assertEquals("http://test-dspace-host:test-dspace-port/swordv2/collection/123456789/2",
+ assertEquals("http://test-dspace-host:8000/swordv2/collection/123456789/2",
swordBinding.getDefaultCollectionUrl());
assertNull(swordBinding.getOnBehalfOf());
assertTrue(swordBinding.isDepositReceipt());
diff --git a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/TransportConfigMappingTest.java b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/TransportConfigMappingTest.java
index 2412c563..b164be35 100644
--- a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/TransportConfigMappingTest.java
+++ b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/repository/TransportConfigMappingTest.java
@@ -96,10 +96,10 @@ public class TransportConfigMappingTest extends AbstractJacksonMappingTest {
" \"protocol\": \"SWORDv2\",\n" +
" \"username\": \"sworduser\",\n" +
" \"password\": \"swordpass\",\n" +
- " \"service-doc\": \"http://${dspace.host}:${dspace" +
- ".port}/swordv2/servicedocument\",\n" +
- " \"default-collection\": \"http://${dspace" +
- ".host}:${dspace.port}/swordv2/collection/123456789/2\",\n" +
+ " \"service-doc\": \"http://${dspace.server}" +
+ "/swordv2/servicedocument\",\n" +
+ " \"default-collection\": \"http://${dspace.server}" +
+ "/swordv2/collection/123456789/2\",\n" +
" \"on-behalf-of\": null,\n" +
" \"deposit-receipt\": true,\n" +
" \"user-agent\": \"pass-deposit/x.y.z\",\n" +
diff --git a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/spring/AwsParamStoreConfigTest.java b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/spring/AwsParamStoreConfigTest.java
index 9c4bbd02..3d8deb84 100644
--- a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/spring/AwsParamStoreConfigTest.java
+++ b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/config/spring/AwsParamStoreConfigTest.java
@@ -45,6 +45,10 @@
pass.client.password=${PASS_CORE_PASSWORD:test-pw}
dspace.user=${DSPACE_USER:test@test.edu}
dspace.password=${DSPACE_PASSWORD:test-dspace-pw}
+ dspace.server=localhost:8000
+ dspace.api.url=http://localhost:8000/api
+ dspace.website.url=http://localhost:8000/website
+ dspace.collection.handle=1234/1
"""
)
@ContextConfiguration(initializers = ConfigDataApplicationContextInitializer.class)
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..a5cbeeb0
--- /dev/null
+++ b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/provider/dspace/DSpaceMetadataMapperTest.java
@@ -0,0 +1,128 @@
+package org.eclipse.pass.deposit.provider.dspace;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.net.URI;
+import java.time.ZoneId;
+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.of(2024, 12, 19, 0, 0, 0, 0, ZoneId.systemDefault());
+ ZonedDateTime embargoDate = ZonedDateTime.now().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());
+ checkValue(jsonContext, "dc.date.issued",
+ journal.getPublicationDate().format(DateTimeFormatter.ISO_LOCAL_DATE));
+ }
+}
diff --git a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/provider/j10p/DspaceMetadataDomWriterTest.java b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/provider/j10p/DspaceMetadataDomWriterTest.java
index 7f4e6e3b..9d8cacf5 100644
--- a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/provider/j10p/DspaceMetadataDomWriterTest.java
+++ b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/provider/j10p/DspaceMetadataDomWriterTest.java
@@ -104,8 +104,6 @@
import org.junit.jupiter.api.io.TempDir;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.core.io.ClassPathResource;
-import org.springframework.core.io.Resource;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
@@ -120,10 +118,6 @@ public class DspaceMetadataDomWriterTest {
@TempDir
private Path tempDir;
- private List custodialContent = Arrays.asList(
- new ClassPathResource(this.getClass().getPackage().getName().replace(".", "/") + "/manuscript.txt"),
- new ClassPathResource(this.getClass().getPackage().getName().replace(".", "/") + "/figure.jpg"));
-
private final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
private DspaceMetadataDomWriter underTest;
@@ -229,7 +223,7 @@ public void writeSampleMets() throws Exception {
when(journal.getJournalTitle()).thenReturn("American Journal of XYZ Research");
when(journal.getJournalId()).thenReturn("Am J of XYZ Res");
when(journal.getPublisherName()).thenReturn("Super Publisher");
- when(journal.getPublicationDate()).thenReturn("2018-09-12");
+ when(journal.getPublicationDate()).thenReturn(ZonedDateTime.now());
underTest.addResource(r);
underTest.addSubmission(submission);
@@ -296,8 +290,6 @@ public void testAddResource() throws Exception {
String type = "text/plain";
String checksumMd5Val = "abcdef12345";
String checksumMd5 = Checksum.OPTS.MD5.name();
- String checksumShaVal = "123456abcdef";
- String checksumSha = Checksum.OPTS.SHA256.name();
PackageStream.Checksum checksum = mock(PackageStream.Checksum.class);
when(checksum.algorithm()).thenReturn(Checksum.OPTS.MD5);
@@ -448,8 +440,7 @@ public void testCreateDublinCoreMetadata() throws Exception {
DepositMetadata.Journal jMd = mock(DepositMetadata.Journal.class);
String publisherName = "Big Publisher";
when(jMd.getPublisherName()).thenReturn(publisherName);
- String publicationDate = "1/9/1919";
- when(jMd.getPublicationDate()).thenReturn(publicationDate);
+ when(jMd.getPublicationDate()).thenReturn(ZonedDateTime.now());
DepositMetadata md = mock(DepositMetadata.class);
when(md.getArticleMetadata()).thenReturn(artMd);
diff --git a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/provider/j10p/MetadataIT.java b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/provider/j10p/MetadataIT.java
index 3d743240..29ea1430 100644
--- a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/provider/j10p/MetadataIT.java
+++ b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/provider/j10p/MetadataIT.java
@@ -51,7 +51,7 @@ public class MetadataIT extends AbstractDepositSubmissionIT {
" },\n {\n \"author\": \"Mary Beth Lacey\"\n }\n ],\n \"agreements\": {\n " +
"\"JScholarship\": \"Text removed.\"\n },\n \"title\": \"My Test Article\",\n \"journal-title\": " +
"\"Nature Communications\",\n \"issns\": [\n {\n \"issn\": \"2041-1723\",\n \"pubType\": " +
- "\"Print\"\n }\n ],\n \"publisher\": \"Elsevier\",\n \"publicationDate\": \"Fall 2016\",\n " +
+ "\"Print\"\n }\n ],\n \"publisher\": \"Elsevier\",\n \"publicationDate\": \"2001-03-05\",\n " +
"\"abstract\": \"Abstract text\",\n \"journal-NLMTA-ID\": \"Nat Commun\",\n \"agent_information\": " +
"{\n \"name\": \"Chrome\",\n \"version\": \"69\"\n }\n}";
@@ -61,7 +61,7 @@ public class MetadataIT extends AbstractDepositSubmissionIT {
"\"JScholarship\": \"Text removed.\"\n },\n \"title\": \"My Test Article\",\n \"journal-title\": " +
"\"Nature Communications\",\n \"issns\": [\n {\n \"issn\": \"2041-1723\",\n " +
"\"pubType\": \"Print\"\n }\n ],\n \"publisher\": \"Elsevier\",\n \"publicationDate\": " +
- "\"Fall 2016\",\n \"abstract\": \"Abstract text\",\n \"journal-NLMTA-ID\": \"Nat Commun\",\n " +
+ "\"2020-05-06\",\n \"abstract\": \"Abstract text\",\n \"journal-NLMTA-ID\": \"Nat Commun\",\n " +
"\"agent_information\": {\n \"name\": \"Chrome\",\n \"version\": \"69\"\n }\n}";
@Autowired private SubmissionTestUtil submissionTestUtil;
@@ -96,7 +96,7 @@ public void commonContributorsAndFewAuthors() throws Exception {
// In citation, list up to three authors. Take publication date from "common" if not in "crossref".
assertNotNull(qdc.getElementsByTagNameNS(DCTERMS_NS, DCT_BIBLIOCITATION).item(0).getTextContent());
- assertEquals("Christine Cagney, Mary Beth Lacey. (Fall 2016). \"My Test Article.\" Nature Communications.",
+ assertEquals("Christine Cagney, Mary Beth Lacey. (2001-03-05). \"My Test Article.\" Nature Communications.",
qdc.getElementsByTagNameNS(DCTERMS_NS, DCT_BIBLIOCITATION).item(0).getTextContent());
}
@@ -116,7 +116,7 @@ public void crossrefAndManyAuthors() throws Exception {
// Publication date in "crossref" has precedence over one in "common".
assertNotNull(qdc.getElementsByTagNameNS(DCTERMS_NS, DCT_BIBLIOCITATION).item(0).getTextContent());
assertEquals(
- "Christine Cagney, Mary Beth Lacey, David Michael Starsky, et al. (Fall 2016). \"My Test Article.\" " +
+ "Christine Cagney, Mary Beth Lacey, David Michael Starsky, et al. (2020-05-06). \"My Test Article.\" " +
"Nature Communications.",
qdc.getElementsByTagNameNS(DCTERMS_NS, DCT_BIBLIOCITATION).item(0).getTextContent());
}
diff --git a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/service/AbstractDepositIT.java b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/service/AbstractDepositIT.java
index 78affd2c..9b9db271 100644
--- a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/service/AbstractDepositIT.java
+++ b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/service/AbstractDepositIT.java
@@ -50,8 +50,6 @@
@TestPropertySource(properties = {
"pass.deposit.repository.configuration=classpath:org/eclipse/pass/deposit/messaging/status/DepositTaskIT.json",
- "dspace.host=localhost",
- "dspace.port=9020",
"dspace.user=test-dspace-user",
"dspace.password=test-dspace-password",
"dspace.server=localhost:9020",
diff --git a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/service/DepositTaskTest.java b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/service/DepositTaskTest.java
index 3faa8fed..4fc6d086 100644
--- a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/service/DepositTaskTest.java
+++ b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/service/DepositTaskTest.java
@@ -193,7 +193,7 @@ private static Deposit depositContext(DepositUtil.DepositWorkerContext depositCo
when(packager.getTransport()).thenReturn(transport);
when(transport.checkConnectivity(anyMap())).thenReturn(true);
when(transport.open(anyMap())).thenReturn(session);
- when(session.send(eq(stream), any())).thenReturn(tr);
+ when(session.send(eq(stream), any(), any())).thenReturn(tr);
when(depositContext.packager()).thenReturn(packager);
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 803c4954..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
@@ -21,6 +21,8 @@
import static com.github.tomakehurst.wiremock.client.WireMock.get;
import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor;
import static com.github.tomakehurst.wiremock.client.WireMock.ok;
+import static com.github.tomakehurst.wiremock.client.WireMock.patch;
+import static com.github.tomakehurst.wiremock.client.WireMock.patchRequestedFor;
import static com.github.tomakehurst.wiremock.client.WireMock.post;
import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor;
import static com.github.tomakehurst.wiremock.client.WireMock.put;
@@ -78,7 +80,11 @@
@TestPropertySource(properties = {
"pass.deposit.repository.configuration=classpath:/full-test-repositories.json",
"inveniordm.api.token=test-invenio-api-token",
- "inveniordm.api.baseUrl=http://localhost:9030/api"
+ "inveniordm.api.baseUrl=http://localhost:9030/api",
+ "dspace.server=localhost:9030",
+ "dspace.api.url=http://localhost:9030/dspace/api",
+ "dspace.website.url=http://localhost:9030/dspace/website",
+ "dspace.collection.handle=collectionhandle"
})
@WireMockTest(httpPort = 9030)
public class SubmissionProcessorIT extends AbstractSubmissionIT {
@@ -104,6 +110,7 @@ void testSubmissionProcessing_Full() throws Exception {
ResourceTestUtil.readSubmissionJson("sample1-unsubmitted")));
resetGrantProjectName(submission, null);
initInvenioApiStubs();
+ initDSpaceApiStubs();
// WHEN/THEN
testSubmissionProcessor(submission, false);
@@ -111,6 +118,7 @@ void testSubmissionProcessing_Full() throws Exception {
verify(invenioRdmTransport, times(1)).open(anyMap());
verify(devNullTransport, times(0)).open(anyMap());
verifyInvenioApiStubs(1);
+ verifyDSpaceApiStubs(1);
}
@Test
@@ -120,6 +128,8 @@ void testSubmissionProcessing_Full_InvenioExistingRecord() throws Exception {
ResourceTestUtil.readSubmissionJson("sample1-unsubmitted")));
resetGrantProjectName(submission, null);
initInvenioApiStubs();
+ initDSpaceApiStubs();
+
String searchRecordsJsonResponse = "{ \"hits\": { \"hits\": [{ \"id\": \"existing-record-id\", " +
"\"is_published\": \"false\"} ] } }";
stubFor(get("/api/user/records?q=metadata.title:%22Specific%20protein%20supplementation%20using%20" +
@@ -136,6 +146,8 @@ void testSubmissionProcessing_Full_InvenioExistingRecord() throws Exception {
verify(invenioRdmTransport, times(1)).open(anyMap());
verify(devNullTransport, times(0)).open(anyMap());
verifyInvenioApiStubs(1);
+ verifyDSpaceApiStubs(1);
+
WireMock.verify(1, deleteRequestedFor(
urlEqualTo("/api/records/existing-record-id/draft")));
}
@@ -149,10 +161,11 @@ void testSubmissionProcessing_SkipTestSubmission() throws Exception {
// WHEN/THEN
testSubmissionProcessor(submission, true);
- verify(devNullTransport, times(4)).open(anyMap());
+ verify(devNullTransport, times(5)).open(anyMap());
verify(filesystemTransport, times(0)).open(anyMap());
verify(invenioRdmTransport, times(0)).open(anyMap());
verifyInvenioApiStubs(0);
+ verifyDSpaceApiStubs(0);
}
@Test
@@ -162,6 +175,7 @@ void testSubmissionProcessing_DontSkipTestSubmission() throws Exception {
ResourceTestUtil.readSubmissionJson("sample1-unsubmitted")));
resetGrantProjectName(submission, DeploymentTestDataService.PASS_E2E_TEST_GRANT);
initInvenioApiStubs();
+ initDSpaceApiStubs();
ReflectionTestUtils.setField(depositTaskHelper, "skipDeploymentTestDeposits", Boolean.FALSE);
// WHEN/THEN
@@ -170,6 +184,7 @@ void testSubmissionProcessing_DontSkipTestSubmission() throws Exception {
verify(filesystemTransport, times(3)).open(anyMap());
verify(invenioRdmTransport, times(1)).open(anyMap());
verifyInvenioApiStubs(1);
+ verifyDSpaceApiStubs(1);
}
private void testSubmissionProcessor(Submission submission, boolean usingDevNull) throws IOException {
@@ -236,7 +251,7 @@ private void testSubmissionProcessor(Submission submission, boolean usingDevNull
List repoKeys = resultDeposits.stream()
.map(deposit -> deposit.getRepository().getRepositoryKey())
.toList();
- List expectedRepoKey = List.of("PubMed Central", "JScholarship", "BagIt", "InvenioRDM");
+ List expectedRepoKey = List.of("PubMed Central", "JScholarship", "BagIt", "InvenioRDM", "DSpace");
assertTrue(repoKeys.size() == expectedRepoKey.size() && repoKeys.containsAll(expectedRepoKey)
&& expectedRepoKey.containsAll(repoKeys));
Deposit pmcDeposit = resultDeposits.stream()
@@ -388,4 +403,49 @@ private void verifyInvenioApiStubs(int expectedCount) throws IOException, URISyn
urlEqualTo("/api/records/test-record-id/draft/actions/publish")));
}
+ private void initDSpaceApiStubs() throws IOException {
+ stubFor(get("/dspace/api/security/csrf").willReturn(WireMock.notFound().
+ withHeader("DSPACE-XSRF-TOKEN", "csrftoken")));
+ stubFor(post("/dspace/api/authn/login").willReturn(WireMock.ok().withHeader("Authorization", "authtoken")));
+
+ String searchJson = "{\n"
+ + " \"_embedded\": {\n"
+ + " \"searchResult\": {\n"
+ + " \"_embedded\": {\n"
+ + " \"objects\": [\n"
+ + " {\n"
+ + " \"_embedded\": {\n"
+ + " \"indexableObject\": {\n"
+ + " \"handle\": \"collectionhandle\",\n"
+ + " \"uuid\": \"collectionuuid\"\n"
+ + " }\n"
+ + " }\n"
+ + " }\n"
+ + " ]\n"
+ + " }\n"
+ + " }\n"
+ + " }\n"
+ + "}\n";
+ stubFor(get("/dspace/api/discover/search/objects?query=handle:collectionhandle")
+ .willReturn(ok(searchJson)));
+
+ stubFor(post("/dspace/api/submission/workspaceitems?owningCollection=collectionuuid")
+ .willReturn(WireMock.ok("{\"_embedded\": {\"workspaceitems\": [{\"id\": 1,"
+ + "\"_embedded\": {\"item\": {\"uuid\": \"uuid\", \"metadata\": {}}}}]}}")));
+
+ stubFor(patch("/dspace/api/submission/workspaceitems/1").willReturn(WireMock.ok()));
+
+ stubFor(post("/dspace/api/workflow/workflowitems").willReturn(WireMock.ok()));
+ }
+
+ 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, patchRequestedFor(urlEqualTo("/dspace/api/submission/workspaceitems/1")));
+ WireMock.verify(expectedCount, postRequestedFor(urlEqualTo("/dspace/api/workflow/workflowitems")));
+ }
}
diff --git a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/support/deploymenttest/DeploymentTestDataServiceIT.java b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/support/deploymenttest/DeploymentTestDataServiceIT.java
index b300b210..ef8f4c03 100644
--- a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/support/deploymenttest/DeploymentTestDataServiceIT.java
+++ b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/support/deploymenttest/DeploymentTestDataServiceIT.java
@@ -44,6 +44,7 @@
import com.github.tomakehurst.wiremock.client.WireMock;
import com.github.tomakehurst.wiremock.junit5.WireMockTest;
import org.eclipse.pass.deposit.service.AbstractDepositIT;
+import org.eclipse.pass.deposit.support.dspace.DSpaceDepositService;
import org.eclipse.pass.support.client.PassClientSelector;
import org.eclipse.pass.support.client.RSQL;
import org.eclipse.pass.support.client.model.AwardStatus;
@@ -73,8 +74,9 @@
* @author Russ Poetker (rpoetke1@jh.edu)
*/
@TestPropertySource(properties = {
- "dspace.server.api.protocol=http",
- "dspace.server.api.path=/server/api",
+ "dspace.server=localhost:9020",
+ "dspace.api.url=http://localhost:9020/server/api",
+ "dspace.website.url=http://localhost:9020/website",
"pass.test.data.job.enabled=true",
"pass.test.data.policy.title=test-policy-title",
"pass.test.data.user.email=test-user-email@foo",
@@ -84,7 +86,7 @@
class DeploymentTestDataServiceIT extends AbstractDepositIT {
@Autowired private DeploymentTestDataService deploymentTestDataService;
- @SpyBean private DspaceDepositService dspaceDepositService;
+ @SpyBean private DSpaceDepositService dspaceDepositService;
@BeforeEach
public void initPolicyAndUser() throws IOException {
@@ -207,10 +209,10 @@ void testProcessTestData_DeleteTestSubmissionsForTestGrant() throws Exception {
verifyTestGrantDeleted();
verify(dspaceDepositService, times(1)).deleteDeposit(
argThat(deposit -> deposit.getRepository().getRepositoryKey().equals("TestDspace")),
- any(DspaceDepositService.AuthContext.class));
+ any(DSpaceDepositService.AuthContext.class));
verify(dspaceDepositService, times(0)).deleteDeposit(
argThat(deposit -> deposit.getRepository().getRepositoryKey().equals("TestNihms")),
- any(DspaceDepositService.AuthContext.class));
+ any(DSpaceDepositService.AuthContext.class));
verifyDspaceApiStubs(1, 1);
}
@@ -232,10 +234,10 @@ void testProcessTestData_DeleteTestSubmissionsWithNullRepoCopy() throws Exceptio
verifyTestGrantDeleted();
verify(dspaceDepositService, times(1)).deleteDeposit(
argThat(deposit -> deposit.getRepository().getRepositoryKey().equals("TestDspace")),
- any(DspaceDepositService.AuthContext.class));
+ any(DSpaceDepositService.AuthContext.class));
verify(dspaceDepositService, times(0)).deleteDeposit(
argThat(deposit -> deposit.getRepository().getRepositoryKey().equals("TestNihms")),
- any(DspaceDepositService.AuthContext.class));
+ any(DSpaceDepositService.AuthContext.class));
verifyDspaceApiStubs(0, 1);
}
@@ -308,10 +310,10 @@ void testProcessTestData_DoesNotDeleteTestSubmissionsForOtherGrant() throws Exce
verify(dspaceDepositService, times(1)).deleteDeposit(
argThat(deposit -> deposit.getRepository().getRepositoryKey().equals("TestDspace")),
- any(DspaceDepositService.AuthContext.class));
+ any(DSpaceDepositService.AuthContext.class));
verify(dspaceDepositService, times(0)).deleteDeposit(
argThat(deposit -> deposit.getRepository().getRepositoryKey().equals("TestNihms")),
- any(DspaceDepositService.AuthContext.class));
+ any(DSpaceDepositService.AuthContext.class));
verifyDspaceApiStubs(1, 1);
}
@@ -332,10 +334,10 @@ void testProcessTestData_DoesNotDeleteDspaceDepositIfSkip() throws Exception {
verifyTestGrantDeleted();
verify(dspaceDepositService, times(0)).deleteDeposit(
argThat(deposit -> deposit.getRepository().getRepositoryKey().equals("TestDspace")),
- any(DspaceDepositService.AuthContext.class));
+ any(DSpaceDepositService.AuthContext.class));
verify(dspaceDepositService, times(0)).deleteDeposit(
argThat(deposit -> deposit.getRepository().getRepositoryKey().equals("TestNihms")),
- any(DspaceDepositService.AuthContext.class));
+ any(DSpaceDepositService.AuthContext.class));
verifyDspaceApiStubs(0, 0);
}
@@ -357,10 +359,10 @@ void testProcessTestData_DoesNotDeleteDspaceDepositIfNameMismatch() throws Excep
verifyTestGrantDeleted();
verify(dspaceDepositService, times(1)).deleteDeposit(
argThat(deposit -> deposit.getRepository().getRepositoryKey().equals("TestDspace")),
- any(DspaceDepositService.AuthContext.class));
+ any(DSpaceDepositService.AuthContext.class));
verify(dspaceDepositService, times(0)).deleteDeposit(
argThat(deposit -> deposit.getRepository().getRepositoryKey().equals("TestNihms")),
- any(DspaceDepositService.AuthContext.class));
+ any(DSpaceDepositService.AuthContext.class));
WireMock.verify(1, getRequestedFor(urlEqualTo("/server/api/security/csrf")));
WireMock.verify(1, postRequestedFor(urlEqualTo("/server/api/authn/login")));
WireMock.verify(1, getRequestedFor(
diff --git a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/support/jobs/ScheduledJobsTest.java b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/support/jobs/ScheduledJobsTest.java
index 235e0321..b13ded9b 100644
--- a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/support/jobs/ScheduledJobsTest.java
+++ b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/support/jobs/ScheduledJobsTest.java
@@ -45,9 +45,9 @@
"pass.deposit.jobs.3.init.delay=120",
"dspace.user=test-dspace-user",
"dspace.password=test-dspace-password",
+ "dspace.port=9020",
"dspace.server=localhost:9020",
- "dspace.server.api.protocol=http",
- "dspace.server.api.path=/server/api",
+ "dspace.server.api.path=http://localhost/server/api",
})
@DirtiesContext
public class ScheduledJobsTest {
diff --git a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/transport/sftp/SftpTest.java b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/transport/sftp/SftpTest.java
index d7784b28..9801e62d 100644
--- a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/transport/sftp/SftpTest.java
+++ b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/transport/sftp/SftpTest.java
@@ -103,7 +103,7 @@ public void testCreateFile() {
TransportSession transportSession = sftpTransport.open(hints);
// WHEN
- TransportResponse transportResponse = transportSession.send(stream, new HashMap<>());
+ TransportResponse transportResponse = transportSession.send(stream, new HashMap<>(), null);
// THEN
assertTrue(transportResponse.success());
@@ -134,7 +134,7 @@ public void testCreateFile_Fail_MissingBaseDir() {
// WHEN
DepositServiceRuntimeException ex = assertThrows(DepositServiceRuntimeException.class, () -> {
- transportSession.send(stream, new HashMap<>());
+ transportSession.send(stream, new HashMap<>(), null);
});
// THEN
diff --git a/pass-deposit-services/deposit-core/src/test/resources/full-test-repositories.json b/pass-deposit-services/deposit-core/src/test/resources/full-test-repositories.json
index 19107b5f..401ccd18 100644
--- a/pass-deposit-services/deposit-core/src/test/resources/full-test-repositories.json
+++ b/pass-deposit-services/deposit-core/src/test/resources/full-test-repositories.json
@@ -145,5 +145,16 @@
"protocol": "invenioRdm"
}
}
+ },
+ "DSpace": {
+ "assembler": {
+ "specification": "DSpace",
+ "beanName": "DSpaceAssembler"
+ },
+ "transport-config": {
+ "protocol-binding": {
+ "protocol": "DSpace"
+ }
+ }
}
-}
\ No newline at end of file
+}
diff --git a/pass-deposit-services/deposit-core/src/test/resources/org/eclipse/pass/deposit/messaging/status/DepositTaskIT.json b/pass-deposit-services/deposit-core/src/test/resources/org/eclipse/pass/deposit/messaging/status/DepositTaskIT.json
index 4fef904e..fdcf51a2 100644
--- a/pass-deposit-services/deposit-core/src/test/resources/org/eclipse/pass/deposit/messaging/status/DepositTaskIT.json
+++ b/pass-deposit-services/deposit-core/src/test/resources/org/eclipse/pass/deposit/messaging/status/DepositTaskIT.json
@@ -27,8 +27,8 @@
"protocol": "SWORDv2",
"username": "${dspace.user}",
"password": "${dspace.password}",
- "server-fqdn": "${dspace.host}",
- "server-port": "${dspace.port}",
+ "server-fqdn": null,
+ "server-port": null,
"service-doc": "${dspace.baseuri}/swordv2/servicedocument",
"default-collection": "${dspace.baseuri}/swordv2/collection/${dspace.collection.handle}",
"on-behalf-of": null,
@@ -37,4 +37,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/pass-deposit-services/deposit-core/src/test/resources/submissions/sample1-unsubmitted.json b/pass-deposit-services/deposit-core/src/test/resources/submissions/sample1-unsubmitted.json
index 192e2f2e..85de620c 100644
--- a/pass-deposit-services/deposit-core/src/test/resources/submissions/sample1-unsubmitted.json
+++ b/pass-deposit-services/deposit-core/src/test/resources/submissions/sample1-unsubmitted.json
@@ -95,6 +95,13 @@
"id": "7",
"@type": "Repository"
},
+ {
+ "name": "DSpace Repo",
+ "repositoryKey": "DSpace",
+ "description": "DSpace Repository",
+ "id": "8",
+ "@type": "Repository"
+ },
{
"journalName": "AAPS PharmSci",
"issns": [
@@ -104,7 +111,7 @@
"nlmta": "AAPS PharmSci",
"pmcParticipation": "A",
"publisher": null,
- "id": "8",
+ "id": "9",
"@type": "Journal"
},
{
@@ -112,10 +119,10 @@
"abstract": "This is a great paper!",
"doi": "abcdef",
"pmid": "fedcba",
- "journal": "8",
+ "journal": "9",
"volume": "123",
"issue": "May 2015",
- "id": "9",
+ "id": "10",
"@type": "Publication"
},
{
@@ -127,23 +134,23 @@
{ "id": "7" }
],
"institution": "fake:institution1",
- "id": "10",
+ "id": "11",
"@type": "Policy"
},
{
"name": "National Eye Institute",
"url": "http://example.com/eyeguys",
"localKey": "aabbcc",
- "policy": "10",
- "id": "11",
+ "policy": "11",
+ "id": "12",
"@type": "Funder"
},
{
"name": "International Eye Institute",
"url": "http://example.com/othereyeguys",
"localKey": "ddeeff",
- "policy": "10",
- "id": "12",
+ "policy": "11",
+ "id": "13",
"@type": "Funder"
},
{
@@ -154,14 +161,14 @@
"awardDate": "2017-06-01T00:00:00.000Z",
"startDate": "2017-05-01T00:00:00.000Z",
"endDate": "2018-06-01T00:00:00.000Z",
- "primaryFunder": "11",
- "directFunder": "12",
+ "primaryFunder": "12",
+ "directFunder": "13",
"pi": "2",
"coPis": [
"3",
"1"
],
- "id": "13",
+ "id": "14",
"@type": "Grant"
},
{
@@ -171,18 +178,19 @@
"submittedDate": "2017-06-02T00:00:00.000Z",
"aggregatedDepositStatus": "NOT_STARTED",
"submissionStatus": "APPROVAL_REQUESTED",
- "publication": "9",
+ "publication": "10",
"repositories": [
"4",
"5",
"6",
- "7"
+ "7",
+ "8"
],
"submitter": "2",
"grants": [
- "13"
+ "14"
],
- "id": "14",
+ "id": "15",
"@type": "Submission"
},
{
@@ -191,8 +199,8 @@
"description": "Custodial content",
"fileRole": "SUPPLEMENTAL",
"mimeType": "image/jpg",
- "submission": "14",
- "id": "15",
+ "submission": "15",
+ "id": "16",
"@type": "File"
},
{
@@ -201,8 +209,8 @@
"description": "Custodial content",
"fileRole": "FIGURE",
"mimeType": "image/tiff",
- "submission": "14",
- "id": "16",
+ "submission": "15",
+ "id": "17",
"@type": "File"
},
{
@@ -211,8 +219,8 @@
"description": "Custodial content",
"fileRole": "FIGURE",
"mimeType": "image/png",
- "submission": "14",
- "id": "17",
+ "submission": "15",
+ "id": "18",
"@type": "File"
},
{
@@ -221,8 +229,8 @@
"description": "Custodial content",
"fileRole": "MANUSCRIPT",
"mimeType": "application/msword",
- "submission": "14",
- "id": "18",
+ "submission": "15",
+ "id": "19",
"@type": "File"
},
{
@@ -231,8 +239,8 @@
"description": "Custodial content",
"fileRole": "TABLE",
"mimeType": "application/vnd.oasis.opendocument.spreadsheet",
- "submission": "14",
- "id": "19",
+ "submission": "15",
+ "id": "20",
"@type": "File"
},
{
@@ -241,8 +249,8 @@
"description": "Custodial content, meant to conflict with NIH package spec",
"fileRole": "SUPPLEMENTAL",
"mimeType": "application/xml",
- "submission": "14",
- "id": "20",
+ "submission": "15",
+ "id": "21",
"@type": "File"
},
{
@@ -251,8 +259,8 @@
"description": "Custodial content, meant to conflict with NIH package spec",
"fileRole": "SUPPLEMENTAL",
"mimeType": "text/plain",
- "submission": "14",
- "id": "21",
+ "submission": "15",
+ "id": "22",
"@type": "File"
},
{
@@ -261,8 +269,8 @@
"description": "Custodial content with a space in the filename",
"fileRole": "SUPPLEMENTAL",
"mimeType": "text/plain",
- "submission": "14",
- "id": "22",
+ "submission": "15",
+ "id": "23",
"@type": "File"
}
]
diff --git a/pass-deposit-services/deposit-core/src/test/resources/test-application.properties b/pass-deposit-services/deposit-core/src/test/resources/test-application.properties
index fcffe763..fd0a40b3 100644
--- a/pass-deposit-services/deposit-core/src/test/resources/test-application.properties
+++ b/pass-deposit-services/deposit-core/src/test/resources/test-application.properties
@@ -20,3 +20,12 @@ spring.cloud.aws.s3.enabled=false
pass.client.url=http://localhost:8080/
pass.client.user=test
pass.client.password=test
+
+dspace.server=localhost:8000
+dspace.user=user
+dspace.password=test
+dspace.api.url=http://localhost:8000/api
+dspace.website.url=http://localhost:8000/website
+dspace.collection.handle=1234/1
+dspace.field.embargo.lift=local.embargo.lift
+dspace.field.embargo.terms=local.embargo.terms
diff --git a/pass-deposit-services/deposit-model/src/main/java/org/eclipse/pass/deposit/model/DepositMetadata.java b/pass-deposit-services/deposit-model/src/main/java/org/eclipse/pass/deposit/model/DepositMetadata.java
index f95ff630..c0761b4e 100644
--- a/pass-deposit-services/deposit-model/src/main/java/org/eclipse/pass/deposit/model/DepositMetadata.java
+++ b/pass-deposit-services/deposit-model/src/main/java/org/eclipse/pass/deposit/model/DepositMetadata.java
@@ -237,7 +237,7 @@ public static class Journal {
/**
* Date of publication
*/
- public String publicationDate;
+ public ZonedDateTime publicationDate;
/**
* ISSN mapped to journal publication type
@@ -302,14 +302,14 @@ public void setPublisherName(String publisherName) {
/**
* @return {@link #publicationDate}
*/
- public String getPublicationDate() {
+ public ZonedDateTime getPublicationDate() {
return publicationDate;
}
/**
* @param publicationDate {@link #publicationDate}
*/
- public void setPublicationDate(String publicationDate) {
+ public void setPublicationDate(ZonedDateTime publicationDate) {
this.publicationDate = publicationDate;
}
From f87a2cc900329b3a00abf42cc7b230ae0b9a8461 Mon Sep 17 00:00:00 2001
From: Mark Patton
Date: Wed, 5 Feb 2025 10:16:30 -0500
Subject: [PATCH 05/12] Fix DSpace abstract metadata being in wrong submission
form section
---
.../provider/dspace/DSpaceMetadataMapper.java | 21 +++++++-------
.../dspace/DSpaceMetadataMapperTest.java | 28 ++++++++++---------
2 files changed, 26 insertions(+), 23 deletions(-)
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 7f1d692d..5701eb1f 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
@@ -47,7 +47,8 @@
@Component
public class DSpaceMetadataMapper {
// Section of workspace item form to add metadata
- private static final String SECTION = "traditionalpageone";
+ static final String SECTION_ONE = "traditionalpageone";
+ static final String SECTION_TWO = "traditionalpagetwo";
private final String dspaceFieldEmbargoLift;
private final String dspaceFieldEmbargoTerms;
@@ -67,28 +68,28 @@ public String patchWorkspaceItem(DepositSubmission submission) {
JSONArray metadata = new JSONArray();
// Required by DSpace
- metadata.add(add_array(SECTION, "dc.title", manuscriptMd.getTitle()));
+ metadata.add(add_array(SECTION_ONE, "dc.title", manuscriptMd.getTitle()));
if (journalMd != null && journalMd.getPublisherName() != null) {
- metadata.add(add_array(SECTION, "dc.publisher", journalMd.getPublisherName()));
+ metadata.add(add_array(SECTION_ONE, "dc.publisher", journalMd.getPublisherName()));
}
if (articleMd.getDoi() != null) {
- metadata.add(add_array(SECTION, "dc.identifier.doi", articleMd.getDoi().toString()));
+ metadata.add(add_array(SECTION_ONE, "dc.identifier.doi", articleMd.getDoi().toString()));
}
if (manuscriptMd.getMsAbstract() != null) {
- metadata.add(add_array(SECTION, "dc.description.abstract", manuscriptMd.getMsAbstract()));
+ metadata.add(add_array(SECTION_TWO, "dc.description.abstract", manuscriptMd.getMsAbstract()));
}
String citation = CitationUtil.createCitation(submission);
if (!citation.isEmpty()) {
- metadata.add(add_array(SECTION, "dc.identifier.citation", citation));
+ metadata.add(add_array(SECTION_ONE, "dc.identifier.citation", citation));
}
// Required by DSpace as ISO 8601 local date
- metadata.add(add_array(SECTION, "dc.date.issued", journalMd.getPublicationDate().
+ metadata.add(add_array(SECTION_ONE, "dc.date.issued", journalMd.getPublicationDate().
format(DateTimeFormatter.ISO_LOCAL_DATE)));
// Add non-submitters as authors
@@ -96,15 +97,15 @@ public String patchWorkspaceItem(DepositSubmission submission) {
p -> p.getType() != DepositMetadata.PERSON_TYPE.submitter).
map(Person::getName).toArray(String[]::new);
- metadata.add(add_array(SECTION, "dc.contributor.author", authors));
+ metadata.add(add_array(SECTION_ONE, "dc.contributor.author", authors));
ZonedDateTime embargoLiftDate = articleMd.getEmbargoLiftDate();
if (embargoLiftDate != null) {
String liftDate = embargoLiftDate.format(DateTimeFormatter.ISO_LOCAL_DATE);
- metadata.add(add_array(SECTION, dspaceFieldEmbargoLift, liftDate));
- metadata.add(add_array(SECTION, dspaceFieldEmbargoTerms, liftDate));
+ metadata.add(add_array(SECTION_ONE, dspaceFieldEmbargoLift, liftDate));
+ metadata.add(add_array(SECTION_ONE, dspaceFieldEmbargoTerms, liftDate));
}
// Required by DSpace
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
index a5cbeeb0..7ae5e7c0 100644
--- 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
@@ -1,5 +1,7 @@
package org.eclipse.pass.deposit.provider.dspace;
+import static org.eclipse.pass.deposit.provider.dspace.DSpaceMetadataMapper.SECTION_ONE;
+import static org.eclipse.pass.deposit.provider.dspace.DSpaceMetadataMapper.SECTION_TWO;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.net.URI;
@@ -76,23 +78,23 @@ public void testPatchWorkspaceItem() {
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",
+ checkValue(jsonContext, SECTION_ONE, "dc.title", manuscript.getTitle());
+ checkValue(jsonContext, SECTION_ONE, "dc.identifier.doi", article.getDoi().toString());
+ checkValue(jsonContext, SECTION_TWO, "dc.description.abstract", manuscript.getMsAbstract());
+ checkValue(jsonContext, SECTION_ONE, "dc.publisher", journal.getPublisherName());
+ checkValue(jsonContext, SECTION_ONE, "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",
+ checkValue(jsonContext, SECTION_ONE, "dc.contributor.author", "P1 Person", "P2 Person");
+ checkValue(jsonContext, SECTION_ONE, "dc.date.issued",
journal.getPublicationDate().format(DateTimeFormatter.ISO_LOCAL_DATE));
- checkValue(jsonContext, "test.embargo.lift",
+ checkValue(jsonContext, SECTION_ONE, "test.embargo.lift",
article.getEmbargoLiftDate().format(DateTimeFormatter.ISO_LOCAL_DATE));
- checkValue(jsonContext, "test.embargo.terms",
+ checkValue(jsonContext, SECTION_ONE, "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";
+ private void checkValue(DocumentContext context, String section, String key, String... expected) {
+ String path = "$[?(@.path == '/sections/" + section + "/" + key + "')].value[*].value";
List values = context.read(path);
@@ -121,8 +123,8 @@ public void testPatchWorkspaceItemMinimalMetadata() {
DocumentContext jsonContext = JsonPath.parse(json);
- checkValue(jsonContext, "dc.title", manuscript.getTitle());
- checkValue(jsonContext, "dc.date.issued",
+ checkValue(jsonContext, SECTION_ONE, "dc.title", manuscript.getTitle());
+ checkValue(jsonContext, SECTION_ONE, "dc.date.issued",
journal.getPublicationDate().format(DateTimeFormatter.ISO_LOCAL_DATE));
}
}
From ffb33402450b4f074d0961afdc68b08ed18b3ae7 Mon Sep 17 00:00:00 2001
From: Mark Patton
Date: Wed, 5 Feb 2025 10:16:58 -0500
Subject: [PATCH 06/12] Tighten check for missing DSpace metadata in workspace
item
---
.../eclipse/pass/deposit/transport/dspace/DSpaceSession.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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 599fd206..63de765c 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
@@ -97,7 +97,7 @@ public TransportResponse send(PackageStream packageStream, Map m
Map itemMetadata = workspaceItemContext.
read("$._embedded.workspaceitems[0]._embedded.item.metadata");
- if (itemMetadata.size() == 0) {
+ if (!itemMetadata.containsKey("dc.title")) {
String patchJson = dspaceMetadataMapper.patchWorkspaceItem(depositSubmission);
LOG.debug("Patching WorkspaceItem to add metadata {}", patchJson);
From fe653d1d3c0f1f9b5924c1aeec6ede17bd18a860 Mon Sep 17 00:00:00 2001
From: Mark Patton
Date: Fri, 7 Feb 2025 09:31:31 -0500
Subject: [PATCH 07/12] Fix copyright statements and remove incorrect author
comment
---
.../pass/deposit/provider/util/CitationUtil.java | 15 +++++++++++++++
.../deposit/transport/dspace/DSpaceResponse.java | 5 +----
.../deposit/transport/dspace/DSpaceSession.java | 4 ++--
.../deposit/transport/dspace/DSpaceTransport.java | 2 +-
4 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/util/CitationUtil.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/util/CitationUtil.java
index 19724276..ae00ff13 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/util/CitationUtil.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/util/CitationUtil.java
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2025 Johns Hopkins University
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package org.eclipse.pass.deposit.provider.util;
import java.time.format.DateTimeFormatter;
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceResponse.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceResponse.java
index 47d2bef7..a06ae2a2 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceResponse.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceResponse.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2024 Johns Hopkins University
+ * Copyright 2025 Johns Hopkins University
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,9 +26,6 @@
import org.eclipse.pass.support.client.model.DepositStatus;
import org.eclipse.pass.support.client.model.RepositoryCopy;
-/**
- * @author Russ Poetker (rpoetke1@jh.edu)
- */
class DSpaceResponse implements TransportResponse {
private final boolean success;
private final Throwable throwable;
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 63de765c..60a3c4aa 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
@@ -1,5 +1,5 @@
/*
- * Copyright 2024 Johns Hopkins University
+ * Copyright 2025 Johns Hopkins University
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -72,7 +72,7 @@ public TransportResponse send(PackageStream packageStream, Map m
workspaceItemId = Integer.parseInt(ref.substring(DEPOSIT_STATUS_REF_PREFIX.length()));
}
} catch (NumberFormatException e) {
- // nop
+ LOG.warn("Unable to parse status ref for Submission: {}", depositSubmission.getId());
}
if (workspaceItemId == -1) {
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceTransport.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceTransport.java
index 72615ec5..da68da19 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceTransport.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceTransport.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2024 Johns Hopkins University
+ * Copyright 2025 Johns Hopkins University
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
From c2523190272b3a5c1688ec497121fb45ca436975 Mon Sep 17 00:00:00 2001
From: Mark Patton
Date: Fri, 7 Feb 2025 15:02:21 -0500
Subject: [PATCH 08/12] Make DSpace deposit service only load if relevant
property defined. Make the connection verification for DSpace more robust.
---
.../pass/deposit/support/dspace/DSpaceDepositService.java | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/dspace/DSpaceDepositService.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/dspace/DSpaceDepositService.java
index 05262c20..a6c7f3a8 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/dspace/DSpaceDepositService.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/dspace/DSpaceDepositService.java
@@ -36,6 +36,7 @@
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@@ -48,6 +49,7 @@
/**
* @author Russ Poetker (rpoetke1@jh.edu)
*/
+@ConditionalOnProperty(name = "dspace.api.url")
@Service
public class DSpaceDepositService {
private static final Logger LOG = LoggerFactory.getLogger(DSpaceDepositService.class);
@@ -124,7 +126,7 @@ public AuthContext authenticate() {
.body(bodyPair)
.retrieve()
.toBodilessEntity();
- String authToken = getAuthHeaderValue(authResponse, "Authorization");
+ String authToken = getAuthHeaderValue(authResponse, AUTHORIZATION);
return new AuthContext(xsrfToken, authToken);
}
@@ -327,7 +329,7 @@ public String getWorkspaceItem(int workspaceItemId, AuthContext authContext) {
}
public boolean verifyConnectivity() {
- URI uri = URI.create(dspaceApiUrl);
- return repositoryConnectivityService.verifyConnect(uri.getHost(), uri.getPort());
+ // The base API URL is a valid service endpoint
+ return repositoryConnectivityService.verifyConnectByURL(dspaceApiUrl);
}
}
From 6f5d702d9eca6c797ef953cfe61c4c719617b325 Mon Sep 17 00:00:00 2001
From: Mark Patton
Date: Mon, 10 Feb 2025 15:41:58 -0500
Subject: [PATCH 09/12] Revert changes which enabled Deposit object to be
modified during a submission
---
.../pass/deposit/service/DepositTask.java | 8 +--
.../pass/deposit/transport/Transport.java | 22 +++----
.../deposit/transport/TransportSession.java | 6 +-
.../transport/devnull/DevNullTransport.java | 3 +-
.../transport/dspace/DSpaceSession.java | 60 ++++---------------
.../transport/dspace/DSpaceTransport.java | 6 +-
.../transport/fs/FilesystemTransport.java | 3 +-
.../inveniordm/InvenioRdmSession.java | 3 +-
.../transport/sftp/SftpTransportSession.java | 3 +-
.../transport/sword2/Sword2Transport.java | 2 +-
.../sword2/Sword2TransportSession.java | 4 +-
.../pass/deposit/service/DepositTaskTest.java | 2 +-
.../pass/deposit/transport/sftp/SftpTest.java | 4 +-
13 files changed, 38 insertions(+), 88 deletions(-)
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/service/DepositTask.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/service/DepositTask.java
index 00ef26e8..8f15c285 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/service/DepositTask.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/service/DepositTask.java
@@ -442,13 +442,9 @@ static Function performDeposit(DepositWorkerContext
dc.deposit().getId(), dc.deposit());
}
try (TransportSession transportSession = transport.open(packagerConfig)) {
- TransportResponse tr = transportSession.send(packageStream, packagerConfig, deposit);
+ TransportResponse tr = transportSession.send(packageStream, packagerConfig);
deposit.setDepositStatus(DepositStatus.SUBMITTED);
-
- // Only set deposit status ref if not already set during transport
- if (deposit.getDepositStatusRef() == null) {
- deposit.setDepositStatusRef(packageStream.metadata().packageDepositStatusRef());
- }
+ deposit.setDepositStatusRef(packageStream.metadata().packageDepositStatusRef());
return tr;
} catch (Exception e) {
throw new RuntimeException("Error closing transport session for deposit " +
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/Transport.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/Transport.java
index f2b47ac1..019eadbc 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/Transport.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/Transport.java
@@ -24,7 +24,7 @@
* Abstracts the transport protocol used to deposit a package with a target submission system. Callers are able to
* {@link #open(Map) open} a {@link TransportSession} by supplying configuration hints, which allows the implementation
* to perform necessary connection initialization, prior to a package being transported using
- * {@link TransportSession#send(PackageStream, Map, Deposit)}.
+ * {@link TransportSession#send(PackageStream, Map)}.
*/
public interface Transport {
@@ -68,36 +68,36 @@ public interface Transport {
/**
* Property key identifying the base64 encoded checksum of the {@code InputStream} being deposited by {@link
- * TransportSession#send(PackageStream, Map, Deposit)}. N.B.: The preferred form of obtaining
- * the checksum of the {@code InputStream} would be {@link PackageStream.Metadata#checksums()}.
+ * TransportSession#send(PackageStream, Map)}. N.B.: The preferred form of obtaining the checksum of the
+ * {@code InputStream} would be {@link PackageStream.Metadata#checksums()}.
*/
String TRANSPORT_CHECKSUM_SHA256 = "deposit.transport.checksum.sha256";
/**
* Property key identifying the base64 encoded checksum of the {@code InputStream} being deposited by {@link
- * TransportSession#send(PackageStream, Map, Deposit)}. N.B.: The preferred form of obtaining
- * the checksum of the {@code InputStream} would be {@link PackageStream.Metadata#checksums()}.
+ * TransportSession#send(PackageStream, Map)}. N.B.: The preferred form of obtaining the checksum of the
+ * {@code InputStream} would be {@link PackageStream.Metadata#checksums()}.
*/
String TRANSPORT_CHECKSUM_SHA512 = "deposit.transport.checksum.sha512";
/**
* Property key identifying the base64 encoded checksum of the {@code InputStream} being deposited by {@link
- * TransportSession#send(PackageStream, Map, Deposit)}. N.B.: The preferred form of obtaining
- * the checksum of the {@code InputStream} would be {@link PackageStream.Metadata#checksums()}.
+ * TransportSession#send(PackageStream, Map)}. N.B.: The preferred form of obtaining the checksum of the
+ * {@code InputStream} would be {@link PackageStream.Metadata#checksums()}.
*/
String TRANSPORT_CHECKSUM_MD5 = "deposit.transport.checksum.md5";
/**
* Property key identifying the mime type of the {@code InputStream} being deposited by
- * {@link TransportSession#send(PackageStream, Map, Deposit)}. N.B.: The preferred form of obtaining the name of
+ * {@link TransportSession#send(PackageStream, Map)}. N.B.: The preferred form of obtaining the name of
* the {@code InputStream} would be {@link PackageStream.Metadata#name()}.
*/
String TRANSPORT_MIME_TYPE = "deposit.transport.mime-type";
/**
* Property key identifying the packaging spec of the {@code InputStream} being deposited by {@link
- * TransportSession#send(PackageStream, Map, DepositWorker)}. N.B.: The preferred form
- * of obtaining the packaging specification of the {@code InputStream} would be {@link PackageStream.Metadata#spec()}.
+ * TransportSession#send(PackageStream, Map)}. N.B.: The preferred form of obtaining the packaging
+ * specification of the {@code InputStream} would be {@link PackageStream.Metadata#spec()}.
*/
String TRANSPORT_PACKAGE_SPEC = "deposit.transport.package-spec";
@@ -143,7 +143,7 @@ enum PROTOCOL {
/**
* Open a {@link TransportSession} with the underlying transport. The returned {@code TransportSession} should be
* ready to use by the caller, without the caller having to perform any further setup (the implementation of this
- * method should perform all necessary actions to allow {@link TransportSession#send(PackageStream, Map, Deposit)} to
+ * method should perform all necessary actions to allow {@link TransportSession#send(PackageStream, Map)} to
* succeed). The supplied {@code hints} may be used by the implementation to configure and open the session. Well
* known properties include those documented in {@link Transport}, and individual implementations may document
* properties as well.
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/TransportSession.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/TransportSession.java
index 839fc488..7b96383f 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/TransportSession.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/TransportSession.java
@@ -20,7 +20,6 @@
import java.util.Map;
import org.eclipse.pass.deposit.assembler.PackageStream;
-import org.eclipse.pass.support.client.model.Deposit;
/**
* Represents an open connection, or the promise of a successful connection, with a service or system that will accept
@@ -34,6 +33,7 @@
*
*/
public interface TransportSession extends AutoCloseable {
+
/**
* Transfer the bytes of the supplied package to the remote system. Metadata can be optionally supplied which may
* help the underlying transport correctly configure itself for the transfer.
@@ -45,14 +45,12 @@ public interface TransportSession extends AutoCloseable {
*
* @param packageStream the package and package metadata
* @param metadata transport-related metadata, or any "extra" package metadata
- * @param deposit deposit representation
* @return a response indicating success or failure of the transfer
*/
- TransportResponse send(PackageStream packageStream, Map metadata, Deposit deposit);
+ TransportResponse send(PackageStream packageStream, Map metadata);
boolean closed();
- @Override
void close() throws IOException;
}
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/devnull/DevNullTransport.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/devnull/DevNullTransport.java
index 712fe465..12b854ea 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/devnull/DevNullTransport.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/devnull/DevNullTransport.java
@@ -66,8 +66,7 @@ public TransportSession open(Map hints) {
class DevNullTransportSession implements TransportSession {
@Override
- public TransportResponse send(PackageStream packageStream, Map metadata,
- Deposit deposit) {
+ public TransportResponse send(PackageStream packageStream, Map metadata) {
// no-op, just return successful response
return new TransportResponse() {
@Override
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 60a3c4aa..56a0d926 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
@@ -26,8 +26,6 @@
import org.eclipse.pass.deposit.support.dspace.DSpaceDepositService.AuthContext;
import org.eclipse.pass.deposit.transport.TransportResponse;
import org.eclipse.pass.deposit.transport.TransportSession;
-import org.eclipse.pass.support.client.PassClient;
-import org.eclipse.pass.support.client.model.Deposit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -37,81 +35,49 @@
* Finally a workflow item is created referencing the workspace item in order to trigger submission.
*/
class DSpaceSession implements TransportSession {
- private static final String DEPOSIT_STATUS_REF_PREFIX = "wsi:";
private static final Logger LOG = LoggerFactory.getLogger(DSpaceSession.class);
private final DSpaceDepositService dspaceDepositService;
private final DSpaceMetadataMapper dspaceMetadataMapper;
- private final PassClient passClient;
- public DSpaceSession(DSpaceDepositService dspaceDepositService, DSpaceMetadataMapper dspaceMetadataMapper,
- PassClient passClient) {
+ public DSpaceSession(DSpaceDepositService dspaceDepositService, DSpaceMetadataMapper dspaceMetadataMapper) {
this.dspaceDepositService = dspaceDepositService;
this.dspaceMetadataMapper = dspaceMetadataMapper;
- this.passClient = passClient;
}
@Override
- public TransportResponse send(PackageStream packageStream, Map metadata, Deposit deposit) {
+ public TransportResponse send(PackageStream packageStream, Map metadata) {
try {
DepositSubmission depositSubmission = packageStream.getDepositSubmission();
- LOG.info("Processing Dspace Deposit for Submission: {}", depositSubmission.getId());
+ LOG.warn("Processing Dspace Deposit for Submission: {}", depositSubmission.getId());
AuthContext authContext = dspaceDepositService.authenticate();
- // Create WorkspaceItem if it does not already exist
+ // Create WorkspaceItem
- int workspaceItemId = -1;
- DocumentContext workspaceItemContext = null;
-
- try {
- String ref = deposit.getDepositStatusRef();
-
- if (ref != null && ref.startsWith(DEPOSIT_STATUS_REF_PREFIX)) {
- workspaceItemId = Integer.parseInt(ref.substring(DEPOSIT_STATUS_REF_PREFIX.length()));
- }
- } catch (NumberFormatException e) {
- LOG.warn("Unable to parse status ref for Submission: {}", depositSubmission.getId());
- }
-
- if (workspaceItemId == -1) {
- workspaceItemContext = JsonPath.parse(dspaceDepositService.createWorkspaceItem(
+ DocumentContext workspaceItemContext = JsonPath.parse(dspaceDepositService.createWorkspaceItem(
packageStream.getCustodialContent(), authContext));
- workspaceItemId = workspaceItemContext.read("$._embedded.workspaceitems[0].id");
-
- // Use the deposit status ref to mark that the workspace item was created
- deposit.setDepositStatusRef(DEPOSIT_STATUS_REF_PREFIX + workspaceItemId);
- passClient.updateObject(deposit);
-
- LOG.debug("Created WorkspaceItem: {}", workspaceItemId);
- } else {
- LOG.info("DSpace WorkspaceItem already exists for Submission: {}", depositSubmission.getId());
+ int workspaceItemId = workspaceItemContext.read("$._embedded.workspaceitems[0].id");
- workspaceItemContext = JsonPath.parse(dspaceDepositService.
- getWorkspaceItem(workspaceItemId, authContext));
- }
+ LOG.debug("Created WorkspaceItem: {}", workspaceItemId);
- // Check metadata to see if it needs to be patched.
+ // Patch in metadata
- Map itemMetadata = workspaceItemContext.
- read("$._embedded.workspaceitems[0]._embedded.item.metadata");
+ String patchJson = dspaceMetadataMapper.patchWorkspaceItem(depositSubmission);
- if (!itemMetadata.containsKey("dc.title")) {
- String patchJson = dspaceMetadataMapper.patchWorkspaceItem(depositSubmission);
+ LOG.debug("Patching WorkspaceItem to add metadata {}", patchJson);
+ dspaceDepositService.patchWorkspaceItem(workspaceItemId, patchJson, authContext);
- LOG.debug("Patching WorkspaceItem to add metadata {}", patchJson);
- dspaceDepositService.patchWorkspaceItem(workspaceItemId, patchJson, authContext);
- }
+ // Publish the WorkspaceItem
LOG.debug("Creating WorkflowItem for WorkspaceItem {}", workspaceItemId);
dspaceDepositService.createWorkflowItem(workspaceItemId, authContext);
- // Item which should be published
String itemUuid = workspaceItemContext.read("$._embedded.workspaceitems[0]._embedded.item.uuid");
String accessUrl = dspaceDepositService.createAccessUrlFromItemUuid(itemUuid);
- LOG.info("Completed DSpace Deposit for Submission: {}, accessUrl: {}",
+ LOG.warn("Completed DSpace Deposit for Submission: {}, accessUrl: {}",
depositSubmission.getId(), accessUrl);
return new DSpaceResponse(true, accessUrl);
} catch (Exception e) {
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceTransport.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceTransport.java
index da68da19..a3f86fb3 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceTransport.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceTransport.java
@@ -21,7 +21,6 @@
import org.eclipse.pass.deposit.support.dspace.DSpaceDepositService;
import org.eclipse.pass.deposit.transport.Transport;
import org.eclipse.pass.deposit.transport.TransportSession;
-import org.eclipse.pass.support.client.PassClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -33,9 +32,6 @@ public class DSpaceTransport implements Transport {
@Autowired
private DSpaceMetadataMapper dspaceMetadataMapper;
- @Autowired
- private PassClient passClient;
-
@Override
public PROTOCOL protocol() {
return PROTOCOL.DSpace;
@@ -43,7 +39,7 @@ public PROTOCOL protocol() {
@Override
public TransportSession open(Map hints) {
- return new DSpaceSession(dspaceDepositService, dspaceMetadataMapper, passClient);
+ return new DSpaceSession(dspaceDepositService, dspaceMetadataMapper);
}
@Override
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/fs/FilesystemTransport.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/fs/FilesystemTransport.java
index c4ee576a..3d13d39b 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/fs/FilesystemTransport.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/fs/FilesystemTransport.java
@@ -109,8 +109,7 @@ public TransportSession open(Map hints) {
class FilesystemTransportSession implements TransportSession {
@Override
- public TransportResponse send(PackageStream packageStream, Map metadata,
- Deposit deposit) {
+ public TransportResponse send(PackageStream packageStream, Map metadata) {
String filename = packageStream.metadata().name();
AtomicReference transportException = new AtomicReference<>();
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/inveniordm/InvenioRdmSession.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/inveniordm/InvenioRdmSession.java
index 0382c7ed..e7417c5e 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/inveniordm/InvenioRdmSession.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/inveniordm/InvenioRdmSession.java
@@ -36,7 +36,6 @@
import org.eclipse.pass.deposit.provider.inveniordm.InvenioRdmMetadataMapper;
import org.eclipse.pass.deposit.transport.TransportResponse;
import org.eclipse.pass.deposit.transport.TransportSession;
-import org.eclipse.pass.support.client.model.Deposit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.Resource;
@@ -77,7 +76,7 @@ class InvenioRdmSession implements TransportSession {
}
@Override
- public TransportResponse send(PackageStream packageStream, Map metadata, Deposit deposit) {
+ public TransportResponse send(PackageStream packageStream, Map metadata) {
try {
DepositSubmission depositSubmission = packageStream.getDepositSubmission();
LOG.warn("Processing InvenioRDM Deposit for Submission: {}", depositSubmission.getId());
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sftp/SftpTransportSession.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sftp/SftpTransportSession.java
index 3d2c10f8..760afec9 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sftp/SftpTransportSession.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sftp/SftpTransportSession.java
@@ -44,7 +44,6 @@
import org.eclipse.pass.deposit.assembler.PackageStream;
import org.eclipse.pass.deposit.transport.TransportResponse;
import org.eclipse.pass.deposit.transport.TransportSession;
-import org.eclipse.pass.support.client.model.Deposit;
/**
* @author Russ Poetker (rpoetke1@jh.edu)
@@ -58,7 +57,7 @@ class SftpTransportSession implements TransportSession {
}
@Override
- public TransportResponse send(PackageStream packageStream, Map metadata, Deposit deposit) {
+ public TransportResponse send(PackageStream packageStream, Map metadata) {
PackageStream.Metadata streamMetadata = packageStream.metadata();
String fileName = streamMetadata.name();
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sword2/Sword2Transport.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sword2/Sword2Transport.java
index fc154fe3..72b14d0e 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sword2/Sword2Transport.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sword2/Sword2Transport.java
@@ -54,7 +54,7 @@
* A URL to the SWORD version 2 service document
* {@link Sword2TransportHints#SWORD_COLLECTION_URL}
* A URL to the SWORD version 2 collection that packages will be deposited to upon
- * {@link Sword2TransportSession#send(PackageStream, Map, DepositWorkerContext) send}
+ * {@link Sword2TransportSession#send(PackageStream, Map) send}
* Optional: {@link Sword2TransportHints#SWORD_ON_BEHALF_OF_USER}
* The username this session is being opened for
* Optional: {@link Sword2TransportHints#SWORD_CLIENT_USER_AGENT}
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sword2/Sword2TransportSession.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sword2/Sword2TransportSession.java
index db9e9f35..6923a149 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sword2/Sword2TransportSession.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/sword2/Sword2TransportSession.java
@@ -104,7 +104,6 @@ public Sword2TransportSession(SWORDClient client, ServiceDocument serviceDocumen
*
* @param packageStream {@inheritDoc}
* @param metadata {@inheritDoc}
- * @param passDeposit {@inheritDoc}
* @return {@inheritDoc}
* @throws IllegalStateException if this session has been {@link #close() closed}
* @see
@@ -112,8 +111,7 @@ public Sword2TransportSession(SWORDClient client, ServiceDocument serviceDocumen
* SWORD v2 Profile
*/
@Override
- public TransportResponse send(PackageStream packageStream, Map metadata,
- org.eclipse.pass.support.client.model.Deposit passDeposit) {
+ public TransportResponse send(PackageStream packageStream, Map metadata) {
if (closed) {
throw new IllegalStateException("SWORDv2 transport session has been closed.");
}
diff --git a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/service/DepositTaskTest.java b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/service/DepositTaskTest.java
index 4fc6d086..3faa8fed 100644
--- a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/service/DepositTaskTest.java
+++ b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/service/DepositTaskTest.java
@@ -193,7 +193,7 @@ private static Deposit depositContext(DepositUtil.DepositWorkerContext depositCo
when(packager.getTransport()).thenReturn(transport);
when(transport.checkConnectivity(anyMap())).thenReturn(true);
when(transport.open(anyMap())).thenReturn(session);
- when(session.send(eq(stream), any(), any())).thenReturn(tr);
+ when(session.send(eq(stream), any())).thenReturn(tr);
when(depositContext.packager()).thenReturn(packager);
diff --git a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/transport/sftp/SftpTest.java b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/transport/sftp/SftpTest.java
index 9801e62d..d7784b28 100644
--- a/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/transport/sftp/SftpTest.java
+++ b/pass-deposit-services/deposit-core/src/test/java/org/eclipse/pass/deposit/transport/sftp/SftpTest.java
@@ -103,7 +103,7 @@ public void testCreateFile() {
TransportSession transportSession = sftpTransport.open(hints);
// WHEN
- TransportResponse transportResponse = transportSession.send(stream, new HashMap<>(), null);
+ TransportResponse transportResponse = transportSession.send(stream, new HashMap<>());
// THEN
assertTrue(transportResponse.success());
@@ -134,7 +134,7 @@ public void testCreateFile_Fail_MissingBaseDir() {
// WHEN
DepositServiceRuntimeException ex = assertThrows(DepositServiceRuntimeException.class, () -> {
- transportSession.send(stream, new HashMap<>(), null);
+ transportSession.send(stream, new HashMap<>());
});
// THEN
From 87423115c82c2b14f8a7bdf6bb1b8350224361e2 Mon Sep 17 00:00:00 2001
From: Mark Patton
Date: Tue, 11 Feb 2025 09:59:51 -0500
Subject: [PATCH 10/12] Copyright statement fixes.
---
.../deposit/provider/dspace/DSpaceAssembler.java | 2 +-
.../provider/dspace/DSpaceMetadataMapper.java | 2 +-
.../provider/dspace/DSpaceMetadataMapperTest.java | 15 +++++++++++++++
3 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/dspace/DSpaceAssembler.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/dspace/DSpaceAssembler.java
index bfc5de92..bf64ceee 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/dspace/DSpaceAssembler.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/provider/dspace/DSpaceAssembler.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2024 Johns Hopkins University
+ * Copyright 2025 Johns Hopkins University
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
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 5701eb1f..68b6e373 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
@@ -1,5 +1,5 @@
/*
- * Copyright 2024 Johns Hopkins University
+ * Copyright 2025 Johns Hopkins University
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
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
index 7ae5e7c0..6cd7996e 100644
--- 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
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2025 Johns Hopkins University
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package org.eclipse.pass.deposit.provider.dspace;
import static org.eclipse.pass.deposit.provider.dspace.DSpaceMetadataMapper.SECTION_ONE;
From 4861db1ef893ea7a221a9c2f3a9b2f8a508c8ae5 Mon Sep 17 00:00:00 2001
From: Mark Patton
Date: Tue, 11 Feb 2025 10:11:11 -0500
Subject: [PATCH 11/12] Cleanup Spring initialization of DSpace components
---
.../deposit/support/dspace/DSpaceDepositService.java | 8 ++++----
.../deposit/transport/dspace/DSpaceTransport.java | 11 ++++++-----
2 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/dspace/DSpaceDepositService.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/dspace/DSpaceDepositService.java
index a6c7f3a8..a4d19ac7 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/dspace/DSpaceDepositService.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/dspace/DSpaceDepositService.java
@@ -34,7 +34,6 @@
import org.eclipse.pass.support.client.model.Deposit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.http.HttpStatus;
@@ -75,12 +74,13 @@ public class DSpaceDepositService {
@Value("${dspace.collection.handle}")
private String dspaceCollectionHandle;
- @Autowired
- private RepositoryConnectivityService repositoryConnectivityService;
+ private final RepositoryConnectivityService repositoryConnectivityService;
public record AuthContext(String xsrfToken, String authToken){}
- public DSpaceDepositService(@Value("${dspace.api.url}") String dspaceApiUrl) {
+ public DSpaceDepositService(@Value("${dspace.api.url}") String dspaceApiUrl, RepositoryConnectivityService repositoryConnectivityService) {
+ this.repositoryConnectivityService = repositoryConnectivityService;
+
PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create()
.setDefaultSocketConfig(SocketConfig.custom()
.setSoTimeout(Timeout.ofMinutes(1))
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceTransport.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceTransport.java
index a3f86fb3..e258c670 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceTransport.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/transport/dspace/DSpaceTransport.java
@@ -21,16 +21,17 @@
import org.eclipse.pass.deposit.support.dspace.DSpaceDepositService;
import org.eclipse.pass.deposit.transport.Transport;
import org.eclipse.pass.deposit.transport.TransportSession;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class DSpaceTransport implements Transport {
- @Autowired
- private DSpaceDepositService dspaceDepositService;
+ private final DSpaceDepositService dspaceDepositService;
+ private final DSpaceMetadataMapper dspaceMetadataMapper;
- @Autowired
- private DSpaceMetadataMapper dspaceMetadataMapper;
+ public DSpaceTransport(DSpaceDepositService dspaceDepositService, DSpaceMetadataMapper dspaceMetadataMapper) {
+ this.dspaceDepositService = dspaceDepositService;
+ this.dspaceMetadataMapper = dspaceMetadataMapper;
+ }
@Override
public PROTOCOL protocol() {
From b8e36116fdc2c86bb6a09a2673ef0a5918d28a5d Mon Sep 17 00:00:00 2001
From: Mark Patton
Date: Tue, 11 Feb 2025 10:33:03 -0500
Subject: [PATCH 12/12] Fix checkstyle violation
---
.../pass/deposit/support/dspace/DSpaceDepositService.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/dspace/DSpaceDepositService.java b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/dspace/DSpaceDepositService.java
index a4d19ac7..33682538 100644
--- a/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/dspace/DSpaceDepositService.java
+++ b/pass-deposit-services/deposit-core/src/main/java/org/eclipse/pass/deposit/support/dspace/DSpaceDepositService.java
@@ -78,7 +78,8 @@ public class DSpaceDepositService {
public record AuthContext(String xsrfToken, String authToken){}
- public DSpaceDepositService(@Value("${dspace.api.url}") String dspaceApiUrl, RepositoryConnectivityService repositoryConnectivityService) {
+ public DSpaceDepositService(@Value("${dspace.api.url}") String dspaceApiUrl,
+ RepositoryConnectivityService repositoryConnectivityService) {
this.repositoryConnectivityService = repositoryConnectivityService;
PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create()