From 8d126eb4a85be9143b7b1c65b5d492aa3b3602c2 Mon Sep 17 00:00:00 2001 From: Timm Fitschen <t.fitschen@indiscale.com> Date: Thu, 31 Oct 2024 22:39:48 +0100 Subject: [PATCH] FIX: tombstone for linkahead --- .../indiscale/fdo/manager/DefaultManager.java | 68 ++++--------------- .../api/UnsuccessfulOperationException.java | 4 ++ .../indiscale/fdo/manager/doip/DoipFdo.java | 5 +- .../fdo/manager/doip/DoipRepository.java | 2 +- .../fdo/manager/mock/MockManager.java | 17 ----- 5 files changed, 22 insertions(+), 74 deletions(-) diff --git a/src/main/java/com/indiscale/fdo/manager/DefaultManager.java b/src/main/java/com/indiscale/fdo/manager/DefaultManager.java index 9026db0..992264b 100644 --- a/src/main/java/com/indiscale/fdo/manager/DefaultManager.java +++ b/src/main/java/com/indiscale/fdo/manager/DefaultManager.java @@ -233,10 +233,10 @@ public class DefaultManager implements Manager { profileRefs = val.getDataAsString(); break; case "FDO_Data_Refs": - dataRefs = val.getDataAsString().replaceFirst("^\\[\"", "").replaceFirst("\"]$", ""); + dataRefs = val.getDataAsString().replaceFirst("^\\[\"?", "").replaceFirst("\"?]$", ""); break; case "FDO_MD_Refs": - metadataRefs = val.getDataAsString().replaceFirst("^\\[\"", "").replaceFirst("\"]$", ""); + metadataRefs = val.getDataAsString().replaceFirst("^\\[\"?", "").replaceFirst("\"?]$", ""); break; case "FDO_Type_Ref": typeRef = val.getDataAsString(); @@ -308,7 +308,7 @@ public class DefaultManager implements Manager { // Delete data try { if (data != null) { - String data_pid = data.getPID().replaceAll("\"", ""); + String data_pid = data.getPID(); if (purgeFDO(data_pid) == null) { return null; // ToDo: UnsuccessfulOperationException or null? } @@ -319,7 +319,7 @@ public class DefaultManager implements Manager { // Delete metadata try { if (metadata != null) { - String metadata_pid = metadata.getPID().replaceAll("\"", ""); + String metadata_pid = metadata.getPID(); if (purgeFDO(metadata_pid) == null) { return null; } @@ -384,13 +384,9 @@ public class DefaultManager implements Manager { // 2. Update data-attributes: DO_Status set to “deleted”, “URL_Status” added String dataDoStatus = null; boolean dataDoStatusSet = false; - String dataUrlStatus = null; - boolean dataUrlStatusSet = false; try { - dataDoStatus = repository.createUpdateDoAttribute(data.getPID(), "DO_Status", "deleted"); + dataDoStatus = repository.createUpdateDoAttribute(data.getPID(), "FDO_Status", "deleted"); dataDoStatusSet = true; - dataUrlStatus = repository.createUpdateDoAttribute(data.getPID(), "URL_Status", ""); - dataUrlStatusSet = true; } catch (UnsuccessfulOperationException e) { // If any of the listed operations fails, all operations are rolled back if (dataFiles != null) { @@ -399,27 +395,17 @@ public class DefaultManager implements Manager { if (metadataFiles != null) { repository.addFilesToDo(metadata.getPID(), metadataFiles); } - if (dataDoStatusSet) { - if (dataDoStatus != null) { - repository.createUpdateDoAttribute(data.getPID(), "DO_Status", dataDoStatus); - } else { - repository.deleteDoAttribute(data.getPID(), "DO_Status"); - } - } } // 3. If delete_MD, update metadata-attributes analogously to data-attributes String metadataDoStatus = null; boolean metadataDoStatusSet = false; - String metadataUrlStatus = null; - boolean metadataUrlStatusSet = false; if (deleteMD) { try { metadataDoStatus = - repository.createUpdateDoAttribute(metadata.getPID(), "DO_Status", "deleted"); + repository.createUpdateDoAttribute(metadata.getPID(), "FDO_Status", "deleted"); metadataDoStatusSet = true; - metadataUrlStatus = repository.createUpdateDoAttribute(metadata.getPID(), "URL_Status", ""); - metadataUrlStatusSet = true; } catch (UnsuccessfulOperationException e) { + e.printStackTrace(); // If any of the listed operations fails, all operations are rolled back if (dataFiles != null) { repository.addFilesToDo(data.getPID(), dataFiles); @@ -429,23 +415,9 @@ public class DefaultManager implements Manager { } if (dataDoStatusSet) { if (dataDoStatus != null) { - repository.createUpdateDoAttribute(data.getPID(), "DO_Status", dataDoStatus); + repository.createUpdateDoAttribute(data.getPID(), "FDO_Status", dataDoStatus); } else { - repository.deleteDoAttribute(data.getPID(), "DO_Status"); - } - } - if (dataUrlStatusSet) { - if (dataUrlStatus != null) { - repository.createUpdateDoAttribute(data.getPID(), "URL_Status", dataUrlStatus); - } else { - repository.deleteDoAttribute(data.getPID(), "URL_Status"); - } - } - if (metadataDoStatusSet) { - if (metadataDoStatus != null) { - repository.createUpdateDoAttribute(metadata.getPID(), "DO_Status", dataDoStatus); - } else { - repository.deleteDoAttribute(metadata.getPID(), "DO_Status"); + repository.deleteDoAttribute(data.getPID(), "FDO_Status"); } } } @@ -463,30 +435,16 @@ public class DefaultManager implements Manager { } if (dataDoStatusSet) { if (dataDoStatus != null) { - repository.createUpdateDoAttribute(data.getPID(), "DO_Status", dataDoStatus); - } else { - repository.deleteDoAttribute(data.getPID(), "DO_Status"); - } - } - if (dataUrlStatusSet) { - if (dataUrlStatus != null) { - repository.createUpdateDoAttribute(data.getPID(), "URL_Status", dataUrlStatus); + repository.createUpdateDoAttribute(data.getPID(), "FDO_Status", dataDoStatus); } else { - repository.deleteDoAttribute(data.getPID(), "URL_Status"); + repository.deleteDoAttribute(data.getPID(), "FDO_Status"); } } if (metadataDoStatusSet) { if (metadataDoStatus != null) { - repository.createUpdateDoAttribute(metadata.getPID(), "DO_Status", dataDoStatus); - } else { - repository.deleteDoAttribute(metadata.getPID(), "DO_Status"); - } - } - if (metadataUrlStatusSet) { - if (metadataUrlStatus != null) { - repository.createUpdateDoAttribute(metadata.getPID(), "URL_Status", dataUrlStatus); + repository.createUpdateDoAttribute(metadata.getPID(), "FDO_Status", dataDoStatus); } else { - repository.deleteDoAttribute(metadata.getPID(), "URL_Status"); + repository.deleteDoAttribute(metadata.getPID(), "FDO_Status"); } } } diff --git a/src/main/java/com/indiscale/fdo/manager/api/UnsuccessfulOperationException.java b/src/main/java/com/indiscale/fdo/manager/api/UnsuccessfulOperationException.java index 9bc9e27..683a826 100644 --- a/src/main/java/com/indiscale/fdo/manager/api/UnsuccessfulOperationException.java +++ b/src/main/java/com/indiscale/fdo/manager/api/UnsuccessfulOperationException.java @@ -11,4 +11,8 @@ public class UnsuccessfulOperationException extends Exception { public UnsuccessfulOperationException(String message) { super(message); } + + public UnsuccessfulOperationException(Exception e) { + super(e); + } } diff --git a/src/main/java/com/indiscale/fdo/manager/doip/DoipFdo.java b/src/main/java/com/indiscale/fdo/manager/doip/DoipFdo.java index 69c90e8..ba9789a 100644 --- a/src/main/java/com/indiscale/fdo/manager/doip/DoipFdo.java +++ b/src/main/java/com/indiscale/fdo/manager/doip/DoipFdo.java @@ -120,7 +120,8 @@ public class DoipFdo implements FDO { this.metadata = new MetadataImpl(metadata); this.fdo = fdo; this.attributes = fdo.attributes; - if (this.attributes != null) { + if (fdo.attributes != null && fdo.attributes.has("content") && fdo.attributes.get("content").isJsonObject()) { + this.attributes = fdo.attributes.get("content").getAsJsonObject(); if (this.attributes.has(FDO_PROFILE_REF)) { this.profile = FdoProfile.getProfile(this.attributes.get(FDO_PROFILE_REF).getAsString()); } @@ -130,6 +131,8 @@ public class DoipFdo implements FDO { if (this.attributes.has(FDO_STATUS)) { this.status = FdoStatus.getStatus(this.attributes.get(FDO_STATUS).getAsString()); } + } else { + this.attributes=null; } } diff --git a/src/main/java/com/indiscale/fdo/manager/doip/DoipRepository.java b/src/main/java/com/indiscale/fdo/manager/doip/DoipRepository.java index c04be37..46e9916 100644 --- a/src/main/java/com/indiscale/fdo/manager/doip/DoipRepository.java +++ b/src/main/java/com/indiscale/fdo/manager/doip/DoipRepository.java @@ -402,7 +402,7 @@ public class DoipRepository implements RepositoryConnection { e.printStackTrace(); throw new UnsuccessfulOperationException("Operation not supported by Repository."); } - throw new UnsuccessfulOperationException(e.getMessage()); + throw new UnsuccessfulOperationException(e); } } diff --git a/src/main/java/com/indiscale/fdo/manager/mock/MockManager.java b/src/main/java/com/indiscale/fdo/manager/mock/MockManager.java index 7dce06c..f58b4d4 100644 --- a/src/main/java/com/indiscale/fdo/manager/mock/MockManager.java +++ b/src/main/java/com/indiscale/fdo/manager/mock/MockManager.java @@ -110,23 +110,6 @@ public class MockManager extends DefaultManager { } } - @Override - public String deleteFDO(String pid, boolean deleteMD) - throws PidUnresolvableException, IllegalArgumentException, UnsuccessfulOperationException { - synchronized (pidRegistry) { - if (!pidRegistry.containsKey(pid)) { - throw new PidUnresolvableException("Unknown PID: " + pid); - } - DigitalObject d_o = pidRegistry.get(pid).getDO(); - if (d_o == null || !d_o.isFDO()) { - throw new IllegalArgumentException("Digital Object with PID " + pid + "is not an FDO."); - } - throw new UnsuccessfulOperationException( - "Not implemented: MockRepository does not currently support non-purge deletion."); - // return getCurrentRepository(pid); - } - } - @Override public String deleteFDO(String pid) throws PidUnresolvableException, -- GitLab