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 4e98914e95b34d3c7bd050c3c35084ffbb692af6..ef9e6313cf24decdbc7d588a8faa0f9e17f01570 100644 --- a/DLCM-PreIngest/src/main/java/ch/dlcm/business/DepositService.java +++ b/DLCM-PreIngest/src/main/java/ch/dlcm/business/DepositService.java @@ -303,11 +303,11 @@ public class DepositService extends CompositeResourceService<Deposit> { super.delete(depositId); } - public void checkArchiveIsEditable(String depositId) { + public void checkArchiveIsEditable(String depositId, Integer preferredStorage) { final String cannotEditMessage = this.messageService.get("preingest.deposit.error.cannot_edit_deposit", new Object[] { depositId }); try { final String aipId = this.trustedArchiveMetadataRemoteService.getAipIdFromDepositId(depositId); - final ArchivalInfoPackage aip = this.aipService.findOne(aipId); + final ArchivalInfoPackage aip = this.aipService.findOne(aipId, preferredStorage); if (aip.getInfo().getStatus() != PackageStatus.COMPLETED) { throw new SolidifyUnmodifiableException(cannotEditMessage); } 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 7c493836ced7cb30238de25b2e57dae69c45a4db..8ddf3e2848450132bcabd55d21f06fedecd58d99 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 @@ -797,8 +797,9 @@ public class DepositController extends AbstractPackageController<DepositDataFile final Result result = new Result(depositId); if (((DepositService) this.itemService).statusUpdateIsValid(deposit, newStatus)) { if (newStatus == EDITING_METADATA) { + Integer preferredStorage = deposit.getPreservationPolicy().getMainStorage(); // Check if archive is completed - ((DepositService) this.itemService).checkArchiveIsEditable(depositId); + ((DepositService) this.itemService).checkArchiveIsEditable(depositId, preferredStorage); // If archive is in collections, put all its collection in edition ((DepositService) this.itemService).putInMetadataEditingCollections(depositId); // Purge SIP of the deposit diff --git a/DLCM-ResourceServerCommon/src/main/java/ch/dlcm/service/rest/abstractservice/ArchivalInfoPackageRemoteResourceService.java b/DLCM-ResourceServerCommon/src/main/java/ch/dlcm/service/rest/abstractservice/ArchivalInfoPackageRemoteResourceService.java index f41aa255fd8ef63f501afdb3f95e22a03367658c..49f0bb76b97777b3ae2b21300dc12f138bb689f0 100644 --- a/DLCM-ResourceServerCommon/src/main/java/ch/dlcm/service/rest/abstractservice/ArchivalInfoPackageRemoteResourceService.java +++ b/DLCM-ResourceServerCommon/src/main/java/ch/dlcm/service/rest/abstractservice/ArchivalInfoPackageRemoteResourceService.java @@ -27,6 +27,7 @@ import java.net.URI; import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -242,7 +243,11 @@ public abstract class ArchivalInfoPackageRemoteResourceService extends RemoteRes @Override public ArchivalInfoPackage findOne(String aipId) { - return this.getAIPOnStorage(aipId); + return this.findOne(aipId, null); + } + + public ArchivalInfoPackage findOne(String aipId, Integer preferredStorage) { + return this.getAIPOnStorage(aipId, preferredStorage); } public ArchivalInfoPackage getAIPOnDefaultStorage(String aipId) { @@ -250,12 +255,20 @@ public abstract class ArchivalInfoPackageRemoteResourceService extends RemoteRes } public ArchivalInfoPackage getAIPOnStorage(String aipId) { - final String storage = this.findStorageForAIP(aipId); + return getAIPOnStorage(aipId, null); + } + + public ArchivalInfoPackage getAIPOnStorage(String aipId, Integer preferredStorage) { + final String storage = this.findStorageForAIP(aipId, preferredStorage); return this.getAIP(storage, aipId); } public String findStorageForAIP(String aipId) { - for (String storage : this.archivalStorageList) { + return this.findStorageForAIP(aipId, null); + } + + public String findStorageForAIP(String aipId, Integer preferredStorage) { + for (String storage : this.getArchivalStorageListByPreference(preferredStorage)) { if (this.isAipPresent(storage, aipId)) { return storage; } @@ -263,6 +276,13 @@ public abstract class ArchivalInfoPackageRemoteResourceService extends RemoteRes return this.getDefaultArchivalStorage(); } + public String[] getArchivalStorageListByPreference(Integer preferredStorageIndex) { + List<String> list = new ArrayList<>(Arrays.asList(this.archivalStorageList)); + String preferredStorage = list.remove(preferredStorageIndex.intValue()); + list.add(0, preferredStorage); + return list.toArray(new String[0]); + } + public ArchivalInfoPackage getAIP(String storageUrl, String aipId) { this.restClientService.checkResId(aipId); return this.restClientService.getResource(this.getArchivalStorageUrlWithId(storageUrl, aipId), ArchivalInfoPackage.class); @@ -421,6 +441,10 @@ public abstract class ArchivalInfoPackageRemoteResourceService extends RemoteRes } protected boolean isAipPresent(String storageUrl, String aipId) { - return HttpStatus.OK.equals(this.restClientService.headResource(this.getArchivalStorageUrlWithId(storageUrl, aipId))); + try { + return HttpStatus.OK.equals(this.restClientService.headResource(this.getArchivalStorageUrlWithId(storageUrl, aipId))); + } catch (Exception e) { + return false; + } } }