diff --git a/DLCM-Model/src/main/java/ch/dlcm/model/preingest/AnonymizedDeposit.java b/DLCM-Model/src/main/java/ch/dlcm/model/preingest/AnonymizedDeposit.java index ba581e52ffb833711376173705eec0f19f7e1579..c0e1fe02645f6641885041f68c70019abcc64442 100644 --- a/DLCM-Model/src/main/java/ch/dlcm/model/preingest/AnonymizedDeposit.java +++ b/DLCM-Model/src/main/java/ch/dlcm/model/preingest/AnonymizedDeposit.java @@ -47,15 +47,18 @@ public class AnonymizedDeposit extends ResourceNormalized { private Deposit deposit; @Schema(description = "The timestamp when the zip file of the anonymized deposit has been created") + @NotNull private OffsetDateTime timestamp; @Schema(description = "The checksum of the checksums of all data files") + @NotNull private String aggregateChecksum; @Schema(description = "The id of the page listing all anonymized deposits of a given deposit") + @NotNull private String pageId; - public @NotNull Deposit getDeposit() { + public Deposit getDeposit() { return deposit; } @@ -71,7 +74,7 @@ public class AnonymizedDeposit extends ResourceNormalized { return pageId; } - public void setDeposit(@NotNull Deposit deposit) { + public void setDeposit(Deposit deposit) { this.deposit = deposit; } diff --git a/DLCM-PreIngest/src/main/java/ch/dlcm/business/DepositService.java b/DLCM-PreIngest/src/main/java/ch/dlcm/business/DepositService.java index 457953ebcc93786aa0cde479dccd5268479ff366..4e98914e95b34d3c7bd050c3c35084ffbb692af6 100644 --- a/DLCM-PreIngest/src/main/java/ch/dlcm/business/DepositService.java +++ b/DLCM-PreIngest/src/main/java/ch/dlcm/business/DepositService.java @@ -26,9 +26,14 @@ package ch.dlcm.business; import static ch.dlcm.DLCMConstants.ANONYMIZED_DEPOSITS_FOLDER; import static ch.dlcm.DLCMRestFields.STATUS_FIELD; import static ch.dlcm.model.preingest.Deposit.DepositStatus.CANCEL_EDITING_METADATA; +import static ch.dlcm.model.preingest.Deposit.DepositStatus.CLEANED; +import static ch.dlcm.model.preingest.Deposit.DepositStatus.CLEANING; +import static ch.dlcm.model.preingest.Deposit.DepositStatus.COMPLETED; import static ch.dlcm.model.preingest.Deposit.DepositStatus.DELETING; +import static ch.dlcm.model.preingest.Deposit.DepositStatus.EDITING_METADATA; import static ch.dlcm.model.preingest.Deposit.DepositStatus.IN_PROGRESS; import static ch.dlcm.model.preingest.Deposit.DepositStatus.IN_VALIDATION; +import static ch.dlcm.model.preingest.Deposit.DepositStatus.UPGRADING_METADATA; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -58,6 +63,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.unit.DataSize; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; +import org.springframework.web.servlet.ModelAndView; import ch.unige.solidify.ChecksumAlgorithm; import ch.unige.solidify.SolidifyConstants; @@ -84,6 +90,7 @@ import ch.unige.solidify.validation.ValidationError; import ch.dlcm.DLCMConstants; import ch.dlcm.DLCMMetadataVersion; import ch.dlcm.config.DLCMProperties; +import ch.dlcm.config.DLCMRepositoryDescription; import ch.dlcm.controller.PreIngestController; import ch.dlcm.exception.DLCMCollectionDepositStatusException; import ch.dlcm.message.DepositMessage; @@ -99,6 +106,7 @@ import ch.dlcm.model.StatusHistory; import ch.dlcm.model.dto.DepositDto; import ch.dlcm.model.notification.NotificationType; import ch.dlcm.model.oais.ArchivalInfoPackage; +import ch.dlcm.model.oais.SubmissionInfoPackage; import ch.dlcm.model.policies.PreservationPolicy; import ch.dlcm.model.policies.SubmissionPolicy; import ch.dlcm.model.preingest.AnonymizedDeposit; @@ -133,6 +141,7 @@ import ch.dlcm.service.rest.fallback.FallbackUserRemoteResourceService; import ch.dlcm.service.rest.trusted.TrustedArchivePrivateMetadataRemoteResourceService; import ch.dlcm.service.rest.trusted.TrustedNotificationRemoteResourceService; import ch.dlcm.service.rest.trusted.TrustedSubmissionAgreementUserRemoteResourceService; +import ch.dlcm.service.rest.trusted.TrustedSubmissionInfoPackageRemoteResourceService; import ch.dlcm.service.rest.trusted.TrustedUserRemoteResourceService; import ch.dlcm.specification.DepositSpecification; import ch.dlcm.specification.dto.DepositDtoSpecification; @@ -206,9 +215,13 @@ public class DepositService extends CompositeResourceService<Deposit> { private final PreparationService preparationService; private final ChecksumAlgorithm defaultChecksumAlgorithm; private final AnonymizedDepositRepository anonymizedDepositRepository; + private final TrustedSubmissionInfoPackageRemoteResourceService trustedSubmissionInfoPackageRemoteResourceService; private final String preingestLocation; private final String preingestTempLocation; + private final String preingestPublicUrl; + private final String archiveHomePage; + private final DataSize fileSizeLimit; private final String defaultLicense; private final String defaultMasterArchiveType; @@ -235,7 +248,9 @@ public class DepositService extends CompositeResourceService<Deposit> { FallbackSubjectAreaRemoteResourceService subjectAreaService, HistoryService historyService, @Lazy PreparationService preparationService, - AnonymizedDepositRepository anonymizedDepositRepository) { + AnonymizedDepositRepository anonymizedDepositRepository, + TrustedSubmissionInfoPackageRemoteResourceService trustedSubmissionInfoPackageRemoteResourceService, + DLCMRepositoryDescription dlcmRepository) { this.depositDataFileRepository = depositDataFileRepository; this.specificationPermissionFilter = specificationPermissionFilter; this.httpRequestInfoProvider = httpRequestInfoProvider; @@ -258,13 +273,16 @@ public class DepositService extends CompositeResourceService<Deposit> { this.subjectAreaService = subjectAreaService; this.preparationService = preparationService; this.anonymizedDepositRepository = anonymizedDepositRepository; + this.trustedSubmissionInfoPackageRemoteResourceService = trustedSubmissionInfoPackageRemoteResourceService; this.defaultChecksumAlgorithm = ChecksumAlgorithm.valueOf(dlcmProperties.getParameters().getDefaultChecksum()); this.preingestLocation = dlcmProperties.getPreingestLocation(); this.preingestTempLocation = dlcmProperties.getTempLocation(this.preingestLocation); + this.preingestPublicUrl = dlcmProperties.getModule().getPreingest().getPublicUrl(); this.fileSizeLimit = dlcmProperties.getParameters().getFileSizeLimit(); this.defaultLicense = dlcmProperties.getParameters().getDefaultLicense(); this.defaultMasterArchiveType = dlcmProperties.getParameters().getDefaultMasterArchiveType(); + this.archiveHomePage = dlcmRepository.getArchiveHomePage(); } /** @@ -1323,6 +1341,18 @@ public class DepositService extends CompositeResourceService<Deposit> { }).start(); // Delete old anonymized deposit + this.deleteLastAnonymizedDeposit(lastOptionalAnonymizedDeposit); + + return anonymizedDeposit.getPageId(); + } + + public void deleteLastAnonymizedDeposit(Deposit deposit) { + final Optional<AnonymizedDeposit> lastOptionalAnonymizedDeposit = this.anonymizedDepositRepository.findLastAnonymizedDeposit(deposit); + this.deleteLastAnonymizedDeposit(lastOptionalAnonymizedDeposit); + } + + private void deleteLastAnonymizedDeposit(Optional<AnonymizedDeposit> lastOptionalAnonymizedDeposit) { + final Path anonymizedDepositFolder = Path.of(this.preingestLocation, ANONYMIZED_DEPOSITS_FOLDER); if (lastOptionalAnonymizedDeposit.isPresent()) { final String lastAnonymizedDepositId = lastOptionalAnonymizedDeposit.get().getResId(); try { @@ -1332,8 +1362,36 @@ public class DepositService extends CompositeResourceService<Deposit> { throw new SolidifyRuntimeException("Unable to delete old anonymized deposit " + lastAnonymizedDepositId, e); } } + } - return anonymizedDeposit.getPageId(); + public ModelAndView buildAnonymizedDepositPage(String anonymizedDepositPageId) { + final Optional<Deposit> depositOptional = this.anonymizedDepositRepository.findDepositByPageId(anonymizedDepositPageId); + if (depositOptional.isEmpty()) { + throw new SolidifyResourceNotFoundException("No anonymized deposit page found"); + } + final Deposit deposit = depositOptional.get(); + final DepositStatus depositStatus = deposit.getStatus(); + final List<AnonymizedDepositEntry> anonymizedDepositEntryList = this.buildAnonymizedDepositEntryList(anonymizedDepositPageId); + if (IN_PROGRESS.equals(depositStatus)) { + final ModelAndView modelAndView = new ModelAndView("anonymizedInProgressDeposit"); + modelAndView.addObject("anonymizedDepositEntryList", anonymizedDepositEntryList); + modelAndView.addObject("preingestPublicUrl", this.preingestPublicUrl); + return modelAndView; + } else { + String archiveLink = null; + if (List.of(COMPLETED, EDITING_METADATA, CLEANED, CLEANING, UPGRADING_METADATA).contains(depositStatus)) { + final String sipId = deposit.getSipId(); + if (sipId != null) { + final SubmissionInfoPackage sip = this.trustedSubmissionInfoPackageRemoteResourceService.findOne(sipId); + if (sip != null && sip.getAipId() != null) { + archiveLink = this.archiveHomePage + sip.getAipId(); + } + } + } + final ModelAndView modelAndView = new ModelAndView("anonymizedCompletedDeposit"); + modelAndView.addObject("archiveLink", archiveLink); + return modelAndView; + } } public List<AnonymizedDepositEntry> buildAnonymizedDepositEntryList(String anonymizedDepositPageId) { diff --git a/DLCM-PreIngest/src/main/java/ch/dlcm/controller/preingest/DepositController.java b/DLCM-PreIngest/src/main/java/ch/dlcm/controller/preingest/DepositController.java index 2667381ba83aa7dd38371c04a50b845ac29f6973..7c493836ced7cb30238de25b2e57dae69c45a4db 100644 --- a/DLCM-PreIngest/src/main/java/ch/dlcm/controller/preingest/DepositController.java +++ b/DLCM-PreIngest/src/main/java/ch/dlcm/controller/preingest/DepositController.java @@ -121,7 +121,6 @@ import ch.dlcm.model.notification.NotificationStatus; import ch.dlcm.model.notification.NotificationType; import ch.dlcm.model.policies.SubmissionAgreementType; import ch.dlcm.model.policies.SubmissionPolicy; -import ch.dlcm.model.preingest.AnonymizedDepositEntry; import ch.dlcm.model.preingest.Deposit; import ch.dlcm.model.preingest.Deposit.DepositStatus; import ch.dlcm.model.preingest.DepositDataFile; @@ -417,15 +416,7 @@ public class DepositController extends AbstractPackageController<DepositDataFile @GetMapping(SolidifyConstants.URL_ID_PLUS_SEP + DLCMActionName.GET_ANONYMIZED_DEPOSIT_PAGE) @EveryonePermissions public ModelAndView getAnonymizedDepositPage(@PathVariable("id") String anonymizedDepositPageId) { - final ModelAndView modelAndView = new ModelAndView("anonymizedDeposit"); - final List<AnonymizedDepositEntry> anonymizedDepositEntryList = - ((DepositService) this.itemService).buildAnonymizedDepositEntryList(anonymizedDepositPageId); - if (anonymizedDepositEntryList.isEmpty()) { - throw new SolidifyResourceNotFoundException("No anonymized deposit page found"); - } - modelAndView.addObject("anonymizedDepositEntryList", anonymizedDepositEntryList); - modelAndView.addObject("preingestPublicUrl", this.preingestModulePublicUrl); - return modelAndView; + return ((DepositService) this.itemService).buildAnonymizedDepositPage(anonymizedDepositPageId); } @GetMapping(SolidifyConstants.URL_ID_PLUS_SEP + DLCMActionName.DOWNLOAD_ANONYMIZED_DEPOSIT) diff --git a/DLCM-PreIngest/src/main/java/ch/dlcm/repository/AnonymizedDepositRepository.java b/DLCM-PreIngest/src/main/java/ch/dlcm/repository/AnonymizedDepositRepository.java index 4a03cd2472e6819f2c4ce948911b9d5c82246fbf..6c433faa88bbc76a0806f53917b832f8ea8bcaa8 100644 --- a/DLCM-PreIngest/src/main/java/ch/dlcm/repository/AnonymizedDepositRepository.java +++ b/DLCM-PreIngest/src/main/java/ch/dlcm/repository/AnonymizedDepositRepository.java @@ -45,4 +45,6 @@ public interface AnonymizedDepositRepository extends SolidifyRepository<Anonymiz List<AnonymizedDeposit> findAnonymizedDepositByPageIdOrderByTimestamp(String pageId); + @Query("SELECT deposit FROM AnonymizedDeposit ad WHERE ad.pageId = :pageId") + Optional<Deposit> findDepositByPageId(String pageId); } diff --git a/DLCM-PreIngest/src/main/java/ch/dlcm/service/DepositStatusService.java b/DLCM-PreIngest/src/main/java/ch/dlcm/service/DepositStatusService.java index 0bb4c0daa52b3285ca81ef33a57db5f0a1828fe2..b08f9cba48222b56208ef8ca3f60653adf453eb5 100644 --- a/DLCM-PreIngest/src/main/java/ch/dlcm/service/DepositStatusService.java +++ b/DLCM-PreIngest/src/main/java/ch/dlcm/service/DepositStatusService.java @@ -437,6 +437,12 @@ public class DepositStatusService extends DLCMService { */ final String currentDepositTmpLocation = this.depositTmpLocation + File.separatorChar + deposit.getResId(); FileTool.deleteRecursivelyEmptyDirectories(Path.of(currentDepositTmpLocation)); + + /* + * Delete anonymized deposit + */ + this.depositService.deleteLastAnonymizedDeposit(deposit); + } case IN_ERROR -> { deposit.setErrorStatusWithMessage(this.messageService.get("preingest.deposit.error.preparation")); diff --git a/DLCM-PreIngest/src/main/resources/templates/anonymizedCompletedDeposit.html b/DLCM-PreIngest/src/main/resources/templates/anonymizedCompletedDeposit.html new file mode 100644 index 0000000000000000000000000000000000000000..d10ca76dcfbded895afb8048c9f40d4853a638f2 --- /dev/null +++ b/DLCM-PreIngest/src/main/resources/templates/anonymizedCompletedDeposit.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html lang="en" xmlns:th="http://www.thymeleaf.org"> +<head> + <meta charset="UTF-8"> + <title>Anonymized Completed Deposit</title> + <link rel="stylesheet" th:href="@{/css/style.css}"> +</head> +<body> + +<h1>Welcome to the anonymized deposit download page</h1> +<div th:if="${archiveLink != null}" class="centered-div"> + This deposit has already been archived.<br> + You can access it from this link: <a th:href="${archiveLink}" th:text="${archiveLink}"></a> +</div> +<div th:if="${archiveLink == null}" class="centered-div"> + This deposit is in the process of being archived. It will be available shortly. +</div> +</body> +</html> \ No newline at end of file diff --git a/DLCM-PreIngest/src/main/resources/templates/anonymizedDeposit.html b/DLCM-PreIngest/src/main/resources/templates/anonymizedInProgressDeposit.html similarity index 63% rename from DLCM-PreIngest/src/main/resources/templates/anonymizedDeposit.html rename to DLCM-PreIngest/src/main/resources/templates/anonymizedInProgressDeposit.html index 8d2f5812cf77e2b5d3a46ab21247ed1f95a07a09..0184a4a54031c14b4bad7118051bca384d9981db 100644 --- a/DLCM-PreIngest/src/main/resources/templates/anonymizedDeposit.html +++ b/DLCM-PreIngest/src/main/resources/templates/anonymizedInProgressDeposit.html @@ -1,24 +1,9 @@ <!DOCTYPE html> -<html xmlns:th="http://www.thymeleaf.org"> +<html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> - <title>URL List</title> - <style> - h1 {text-align: center;} - body { font-family: Arial, sans-serif; } - table { width: 100%; border-collapse: collapse; margin: 30px; } - th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } - th { background-color: #f2f2f2; } - .centered-div { - width: 50%; - margin: 20px auto; - text-align: center; - line-height: 1.8; - padding: 20px; - border: 1px solid #ddd; - background-color: #f9f9f9; - } - </style> + <title>Anonymized In Progress Deposit</title> + <link rel="stylesheet" th:href="@{/css/style.css}"> </head> <body> diff --git a/DLCM-ResourceServerCommon/src/main/resources/static/css/style.css b/DLCM-ResourceServerCommon/src/main/resources/static/css/style.css new file mode 100644 index 0000000000000000000000000000000000000000..03fc8596a71f6dae9079d220c13c5b1c23ef7e29 --- /dev/null +++ b/DLCM-ResourceServerCommon/src/main/resources/static/css/style.css @@ -0,0 +1,14 @@ +h1 {text-align: center;} +body { font-family: Arial, sans-serif; } +table { width: 100%; border-collapse: collapse; margin: 30px; } +th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } +th { background-color: #f2f2f2; } +.centered-div { + width: 50%; + margin: 20px auto; + text-align: center; + line-height: 1.8; + padding: 20px; + border: 1px solid #ddd; + background-color: #f9f9f9; +} \ No newline at end of file