baa96ad2b570ff9f290b4ceecf1a1e4da74dba01
[mediacube.git] /
1 package hu.user.mediacube.integration.safedelete;
2
3 import hu.user.mediacube.integration.safedelete.verifier.MediaCubeDatabaseService;
4 import hu.user.mediacube.integration.safedelete.verifier.TSMService;
5 import lombok.extern.log4j.Log4j2;
6 import org.springframework.beans.factory.annotation.Autowired;
7 import org.springframework.stereotype.Component;
8
9 import java.io.IOException;
10 import java.nio.file.DirectoryStream;
11 import java.nio.file.Files;
12 import java.nio.file.Path;
13 import java.nio.file.Paths;
14 import java.time.Duration;
15 import java.time.Instant;
16 import java.time.format.DateTimeFormatter;
17
18 @Component
19 @Log4j2
20 public class SafeDeleteCommand {
21     private static final String ERROR_FILENAME_PREFIX = "ERROR-";
22
23     @Autowired
24     private SafeDeleteProperties safeDeleteProperties;
25
26     @Autowired
27     private MediaCubeDatabaseService mediaCubeDatabaseService;
28
29     @Autowired
30     private TSMService tsmService;
31
32     private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
33
34     public void processDirectory(String directory, boolean forceDeleteArchived) throws IOException {
35         final Instant start = Instant.now();
36         log.info("Check directory: {}", directory);
37         log.info("Delete already archived: {}", forceDeleteArchived);
38         Path inputPath = Paths.get(directory);
39         try (DirectoryStream<Path> stream = Files.newDirectoryStream(inputPath)) {
40             for (Path filePath : stream) {
41                 if (Files.isDirectory(filePath) || filePath.getFileName().toString().startsWith(ERROR_FILENAME_PREFIX)) {
42                     continue;
43                 }
44                 processInputFile(filePath, forceDeleteArchived);
45                 if (safeDeleteProperties.getMaxExecutionHours() > -1
46                         && safeDeleteProperties.getMaxExecutionHours() <= Duration.between(start, Instant.now()).toHours()
47                 ) {
48                     log.info("Reached maximum execution duration");
49                     break;
50                 }
51             }
52         }
53     }
54
55     private void processInputFile(Path source, boolean forceDeleteArchived) {
56         ArchiveFileStatus status = ArchiveFileStatus.builder().name(source.getFileName().toString()).build();
57         String fileName = source.getFileName().toString();
58
59         try {
60             log.info("Check MediaCube metadata for {}", source);
61             mediaCubeDatabaseService.verify(fileName, status);
62
63             log.info("Check TSM file for {}", source);
64             tsmService.verify(source, status);
65
66             if (forceDeleteArchived && status.isFileSizeEquals() && status.isHashEquals()) {
67                 FileOperations.silentDelete(source);
68             }
69
70         } catch (Exception e) {
71             log.catching(e);
72             FileOperations.silentRename(source, ERROR_FILENAME_PREFIX);
73         }
74     }
75 }
76