Minor fixes (non-tested)
authorelgekko <vasary@elgekko.net>
Tue, 5 Sep 2023 19:30:14 +0000 (21:30 +0200)
committerelgekko <vasary@elgekko.net>
Tue, 5 Sep 2023 19:30:14 +0000 (21:30 +0200)
mc-intergator/mc-safe-delete/src/main/java/hu/user/mediacube/integration/safedelete/FileOperations.java [new file with mode: 0644]
mc-intergator/mc-safe-delete/src/main/java/hu/user/mediacube/integration/safedelete/SafeDeleteCommand.java
mc-intergator/mc-safe-delete/src/main/java/hu/user/mediacube/integration/safedelete/SafeDeleteMainEntry.java
mc-intergator/mc-safe-delete/src/main/java/hu/user/mediacube/integration/safedelete/SafeDeleteProperties.java
mc-intergator/mc-safe-delete/src/main/java/hu/user/mediacube/integration/safedelete/db/MediaCubeRecordMapper.java
mc-intergator/mc-safe-delete/src/main/java/hu/user/mediacube/integration/safedelete/verifier/MediaCubeDatabaseService.java
mc-intergator/mc-safe-delete/src/main/java/hu/user/mediacube/integration/safedelete/verifier/TSMService.java

diff --git a/mc-intergator/mc-safe-delete/src/main/java/hu/user/mediacube/integration/safedelete/FileOperations.java b/mc-intergator/mc-safe-delete/src/main/java/hu/user/mediacube/integration/safedelete/FileOperations.java
new file mode 100644 (file)
index 0000000..6dd1b53
--- /dev/null
@@ -0,0 +1,30 @@
+package hu.user.mediacube.integration.safedelete;
+
+import lombok.extern.log4j.Log4j2;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+@Log4j2
+public class FileOperations {
+
+    static public void silentDelete(Path path) {
+        try {
+            Files.delete(path);
+        } catch (Exception e) {
+            log.catching(e);
+        }
+
+    }
+
+    static public void silentRename(Path source, String prefix) {
+        try {
+            String fileName = String.format("%s%s", prefix, source.getFileName().toString());
+            Path target = Paths.get(source.getParent().toAbsolutePath().toString(), fileName);
+            Files.move(source, target);
+        } catch (Exception e) {
+            log.catching(e);
+        }
+    }
+}
index 151e32c11fae66790bdf9f29602409b9c54b3084..fee217ffdb7681e65e1701846e19893859314181 100644 (file)
@@ -15,6 +15,8 @@ import java.nio.file.Paths;
 @Component
 @Log4j2
 public class SafeDeleteCommand {
+    private static final String ERROR_FILENAME_PREFIX = "ERROR-";
+
     @Autowired
     MediaCubeDatabaseService mediaCubeDatabaseService;
 
@@ -26,9 +28,10 @@ public class SafeDeleteCommand {
         Path inputPath = Paths.get(directory);
         try (DirectoryStream<Path> stream = Files.newDirectoryStream(inputPath)) {
             for (Path filePath : stream) {
-                if (!Files.isDirectory(filePath)) {
-                    processInputFile(filePath, forceDeleteArchived);
+                if (Files.isDirectory(filePath) || filePath.getFileName().toString().startsWith(ERROR_FILENAME_PREFIX)) {
+                    continue;
                 }
+                processInputFile(filePath, forceDeleteArchived);
             }
         }
     }
@@ -45,15 +48,12 @@ public class SafeDeleteCommand {
             tsmService.verify(source, status);
 
             if (forceDeleteArchived && status.isFileSizeEquals() && status.isHashEquals()) {
-                try {
-                    Files.delete(source);
-                } catch (Exception e) {
-                    log.catching(e);
-                }
+                FileOperations.silentDelete(source);
             }
 
         } catch (Exception e) {
             log.catching(e);
+            FileOperations.silentRename(source, ERROR_FILENAME_PREFIX);
         }
     }
 }
index d60547318cdbddc50af972e283904619230cfa51..9d1b5520abb206ea79e762bad5d3f2c38a224c04 100644 (file)
@@ -13,7 +13,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 @Log4j2
 @SpringBootApplication()
-@MapperScan({"hu.user.mediacube.rdb"})
+@MapperScan({"hu.user.mediacube.rdb", "hu.user.mediacube.integration.safedelete.db"})
 public class SafeDeleteMainEntry implements CommandLineRunner {
     @Autowired
     SafeDeleteCommand safeDeleteCommand;
index a0048d3ae9fdb79b00d30565d7b5c0833c3aa170..dec2500032c01a0405ae18b763b389c34c2fc7c7 100644 (file)
@@ -1,11 +1,13 @@
 package hu.user.mediacube.integration.safedelete;
 
 import lombok.Getter;
+import lombok.Setter;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
 
 @Configuration
 @Getter
+@Setter
 @ConfigurationProperties(prefix = "tsm")
 public class SafeDeleteProperties {
     private String nodeName;
index 38b383c336b1a9a69be2140ddd676833e846449c..7cb61d3fd9716037337a27e05a358e1652e04a61 100644 (file)
@@ -11,7 +11,7 @@ import java.util.List;
 @Mapper()
 public interface MediaCubeRecordMapper {
 
-    @SelectProvider(type = MediaCubeRecord.class, method = "getByFileName")
+    @SelectProvider(type = MediaCubeRecordProvider.class, method = "getByFileName")
     @Results({
             @Result(property = "item.id", column = "itemid", jdbcType = JdbcType.BIGINT, id = true),
             @Result(property = "media.id", column = "mediaid", jdbcType = JdbcType.BIGINT, id = true),
@@ -26,8 +26,8 @@ public interface MediaCubeRecordMapper {
             SQL sql = new SQL();
             sql.SELECT("i.id item", "m.id mediaid", "m.archived", "mf.id mediafilefid", "mf.lastmodified");
             sql.FROM("mediafile mf");
-            sql.LEFT_OUTER_JOIN("media m ON (m.id = mf.mediaid)");
-            sql.LEFT_OUTER_JOIN("item i ON (i.id = m.itemid)");
+            sql.INNER_JOIN("media m ON (m.id = mf.mediaid)");
+            sql.INNER_JOIN("item i ON (i.id = m.itemid)");
             sql.WHERE("mf.relativepath = #{fileName}");
             return sql.toString();
         }
index 4ca0f69ca6dbf03ca0b1a52c9ce69824ad907bff..073a5b400ea5563bfbfef1523bc75c7335899901 100644 (file)
@@ -18,7 +18,7 @@ public class MediaCubeDatabaseService {
     public void verify(String fileName, ArchiveFileStatus status) throws Exception {
         List<MediaCubeRecord> dbRecords = mediaCubeRecordMapper.getByFileName(fileName);
         if (dbRecords.size() != 1) {
-            throw new Exception("Database records count mismatch. Expected 1 found " + dbRecords.size());
+            throw new Exception(String.format("Database record count mismatch. Expected 1 found %d", dbRecords.size()));
         }
         status.setMetadataExists(true);
     }
index 856410bc3dbe817a8a96758a40e46a3149dff8ce..17eaccca01052fe53521f6ef3c44a3bf60676f2f 100644 (file)
@@ -1,6 +1,7 @@
 package hu.user.mediacube.integration.safedelete.verifier;
 
 import hu.user.mediacube.integration.safedelete.ArchiveFileStatus;
+import hu.user.mediacube.integration.safedelete.FileOperations;
 import hu.user.mediacube.integration.safedelete.SafeDeleteProperties;
 import lombok.extern.log4j.Log4j2;
 import org.apache.commons.codec.digest.DigestUtils;
@@ -56,20 +57,30 @@ public class TSMService {
     }
 
     public void verify(Path source, ArchiveFileStatus status) throws Exception {
-        Path restored = restore(source.getFileName().toString());
-        long restoredLength = restored.toFile().length();
-        long originalLength = source.toFile().length();
-        if (originalLength != restoredLength) {
-            throw new Exception(String.format("File size mismatch. Expected %d, found %d", originalLength, restoredLength));
-        }
-        status.setFileSizeEquals(true);
+        Path restored = null;
+        try {
+            restored = restore(source.getFileName().toString());
+            long restoredLength = restored.toFile().length();
+            long originalLength = source.toFile().length();
+            if (originalLength != restoredLength) {
+                throw new Exception(String.format("File size mismatch. Expected %d, found %d", originalLength, restoredLength));
+            }
+            status.setFileSizeEquals(true);
 
-        String originalMD5 = createMD5Hash(source);
-        String restoredMD5 = createMD5Hash(restored);
-        if (!StringUtils.equals(originalMD5, restoredMD5)) {
-            throw new Exception(String.format("File MD5 hash mismatch. Expected %d, found %d", originalMD5, restoredMD5));
+            String originalMD5 = createMD5Hash(source);
+            String restoredMD5 = createMD5Hash(restored);
+            if (!StringUtils.equals(originalMD5, restoredMD5)) {
+                throw new Exception(String.format("File MD5 hash mismatch. Expected %d, found %d", originalMD5, restoredMD5));
+            }
+            status.setHashEquals(true);
+        } catch (Exception e) {
+            throw e;
+        } finally {
+            if (Objects.nonNull(restored)) {
+                FileOperations.silentDelete(restored);
+                FileOperations.silentDelete(restored.getParent());
+            }
         }
-        status.setHashEquals(true);
     }
 
     private String createMD5Hash(Path filePath) throws IOException {