diff --git a/src/PLUGIN-INF/metadata_DnxMoveFileOriginalPath.xml b/src/PLUGIN-INF/metadata_DnxMoveFileOriginalPath.xml index e9b8e4bea06943a42c2cec3ec0e849fc6cca073c..9291fef0f728ab77c0d73256d4f413d914e67b83 100644 --- a/src/PLUGIN-INF/metadata_DnxMoveFileOriginalPath.xml +++ b/src/PLUGIN-INF/metadata_DnxMoveFileOriginalPath.xml @@ -7,7 +7,7 @@ </fr:x_form> </pl:initParameters> <pl:description>repairs broken file original paths</pl:description> - <pl:version>1.09</pl:version> + <pl:version>1.11</pl:version> <pl:materialType>DIGITAL</pl:materialType> <pl:module>Repository</pl:module> <pl:generalType>TASK</pl:generalType> diff --git a/src/org/slub/rosetta/plugins/repositoryTask/DnxMoveFileOriginalPath.java b/src/org/slub/rosetta/plugins/repositoryTask/DnxMoveFileOriginalPath.java index e7500a66678f3b4a8035a9b2c600b4b50d1134bb..e890d49150404b9f5320877709ef65bdefe95780 100644 --- a/src/org/slub/rosetta/plugins/repositoryTask/DnxMoveFileOriginalPath.java +++ b/src/org/slub/rosetta/plugins/repositoryTask/DnxMoveFileOriginalPath.java @@ -9,8 +9,10 @@ import com.exlibris.digitool.repository.api.RepositoryTaskPlugin; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -22,6 +24,11 @@ public class DnxMoveFileOriginalPath implements RepositoryTaskPlugin { super(); } + class FileOriginalPathCollisionException extends Exception { + FileOriginalPathCollisionException(String message) { + super(message); + } + } public TaskResults execute(IEEditor ieEditor, Map<String, String> initParams, TaskResults taskResults) { log.info("Executing DnxMoveFileOriginalPath for " + ieEditor.getIEPid()); @@ -32,31 +39,56 @@ public class DnxMoveFileOriginalPath implements RepositoryTaskPlugin { // get all rep pids try { List<String> repPids = ieEditor.getReps(); + // get all file pids for (String repPid: repPids) { - // get all file pids try { List<String> filePids = ieEditor.getFilesForRep(repPid); - for (String filePid: filePids) { + // for each rep pid mark all fileoriginalpaths to detect copies + Set<String> filePaths = new HashSet<>(); + for (String filePid : filePids) { + try { + DnxDocumentHelper ieDnxH = ieEditor.getDnxHelper(filePid); + DnxDocumentHelper.GeneralFileCharacteristics ieGfs = ieDnxH.getGeneralFileCharacteristics(); + String currentFileOriginalPath = ieGfs.getFileOriginalPath(); + filePaths.add( currentFileOriginalPath ); + } catch (DigitoolException e) { + IEsuccess = false; + String err = "unknown Digitool exception: " + e; + log.error(err); + e.printStackTrace(); + taskResults.addResult(ieEditor.getIEPid(), null, false, err); + } + } + countFiles+= filePids.size(); + // process each filePid for replace + for (String filePid : filePids) { try { - countFiles++; - if (replaceFileOriginalPath(ieEditor, repPid, filePid)) { countSuccess++; } + + if (replaceFileOriginalPath(ieEditor, repPid, filePid, filePaths)) { + countSuccess++; + } taskResults.addResult(ieEditor.getIEPid(), null, true, "filepid=" + filePid + " processed"); } catch (DigitoolException e) { IEsuccess = false; String err = "unknown Digitool exception: " + e; - log.error( err ); + log.error(err); e.printStackTrace(); taskResults.addResult(ieEditor.getIEPid(), null, false, err); + } catch (FileOriginalPathCollisionException e) { + IEsuccess = false; + log.error(e.getMessage()); + e.printStackTrace(); + taskResults.addResult(ieEditor.getIEPid(), null, false, e.getMessage()); } } } catch (DigitoolException e) { IEsuccess = false; String err = "no FilePids found for RepPid=" + repPid + ", Digitool exception: " + e; - log.warn( err ); + log.warn(err); taskResults.addResult(ieEditor.getIEPid(), null, false, err); } - } + } catch (DigitoolException e) { IEsuccess = false; String err = "no RepPids found, Digitool exception: " + e; @@ -96,8 +128,10 @@ public class DnxMoveFileOriginalPath implements RepositoryTaskPlugin { } + + /* replace file original path if it starts with "file://data/" or "/data/" */ - private boolean replaceFileOriginalPath(IEEditor ieEditor, String repPid, String filePid) throws DigitoolException { + private boolean replaceFileOriginalPath(IEEditor ieEditor, String repPid, String filePid, Set<String> filePaths) throws DigitoolException, FileOriginalPathCollisionException { DnxDocumentHelper ieDnxH = ieEditor.getDnxHelper(filePid); DnxDocumentHelper.GeneralFileCharacteristics ieGfs = ieDnxH.getGeneralFileCharacteristics(); String currentFileOriginalPath = ieGfs.getFileOriginalPath(); @@ -107,8 +141,14 @@ public class DnxMoveFileOriginalPath implements RepositoryTaskPlugin { Pattern pattern = Pattern.compile("^(file://|/)?data/"); Matcher matcher = pattern.matcher( currentFileOriginalPath ); /* if something is updated */ - if (matcher.matches()) { // update it + if (matcher.lookingAt()) { // update it updatedFileOriginalPath = matcher.replaceFirst( replacement ); + if (filePaths.contains( updatedFileOriginalPath )) { + throw new FileOriginalPathCollisionException("update needed for IE " + ieEditor.getIEPid() + " RepPid " + repPid + " FilePid " + filePid + + " (old file_original_path='" + currentFileOriginalPath + "') to new file_original_path='" + + updatedFileOriginalPath + "', but new file_original_path already exists!" + ); + } updated = true; log.info("update needed for IE " + ieEditor.getIEPid() + " RepPid " + repPid + " FilePid " + filePid + " (old file_original_path='" + currentFileOriginalPath + "') to new file_original_path='" +