From b963400128e085e2a29557a3a088d66a84d66528 Mon Sep 17 00:00:00 2001
From: Andreas Romeyke <andreas.romeyke@slub-dresden.de>
Date: Wed, 7 Feb 2018 10:42:02 +0100
Subject: [PATCH] - added collision-detection if a replaced fileOriginalPath
 already exists - bugfix, Matcher.matches() works only on whole string,
 therefore Matcher.lookingAt() is used

---
 .../metadata_DnxMoveFileOriginalPath.xml      |  2 +-
 .../DnxMoveFileOriginalPath.java              | 58 ++++++++++++++++---
 2 files changed, 50 insertions(+), 10 deletions(-)

diff --git a/src/PLUGIN-INF/metadata_DnxMoveFileOriginalPath.xml b/src/PLUGIN-INF/metadata_DnxMoveFileOriginalPath.xml
index e9b8e4b..9291fef 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 e7500a6..e890d49 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='" +
-- 
GitLab