|
25 | 25 | @Component |
26 | 26 | @Slf4j |
27 | 27 | public class BackupFilesAction implements Action { |
28 | | - public static final String ACTION_KEY = "BACKUP_FILES_ACTION"; |
29 | | - private final IFileUploadService fileUploadService; |
30 | | - private final BuildProperties buildProperties; |
31 | | - |
32 | | - @Value("${application.upload.pathToBackup}") |
33 | | - private String pathToBackupFiles; |
34 | | - |
35 | | - public BackupFilesAction(IFileUploadService fileUploadService, BuildProperties buildProperties) { |
36 | | - this.fileUploadService = fileUploadService; |
37 | | - this.buildProperties = buildProperties; |
38 | | - } |
39 | | - |
40 | | - public static ActionMetadata getDefaultMetadata() { |
41 | | - return ActionMetadata.builder().key(ACTION_KEY).title("Backup Files") |
42 | | - .description("An action to backup all the files within the server").allowedParameters(List.of()) |
43 | | - .defaultCronValue("0 0 3 * * *").build(); |
44 | | - } |
| 28 | + public static final String ACTION_KEY = "BACKUP_FILES_ACTION"; |
| 29 | + private final LegacyFileUploadService fileUploadService; |
| 30 | + private final BuildProperties buildProperties; |
| 31 | + |
| 32 | + @Value("${application.upload.pathToBackup}") |
| 33 | + private String pathToBackupFiles; |
| 34 | + |
| 35 | + public BackupFilesAction(LegacyFileUploadService fileUploadService, BuildProperties buildProperties) { |
| 36 | + this.fileUploadService = fileUploadService; |
| 37 | + this.buildProperties = buildProperties; |
| 38 | + } |
| 39 | + |
| 40 | + public static ActionMetadata getDefaultMetadata() { |
| 41 | + return ActionMetadata.builder().key(ACTION_KEY).title("Backup Files") |
| 42 | + .description("An action to backup all the files within the server").allowedParameters(List.of()) |
| 43 | + .defaultCronValue("0 0 3 * * *").build(); |
| 44 | + } |
| 45 | + |
| 46 | + @Override |
| 47 | + public ActionResult run(List<ActionParameter> parameters) { |
| 48 | + |
| 49 | + Date date = new Date(); |
| 50 | + var resultBuilder = this.actionResultBuilder(parameters).startedDate(date); |
| 51 | + |
| 52 | + List<String> messages = new ArrayList<>(); |
| 53 | + try { |
| 54 | + String archiveName = buildProperties.getVersion().concat("-") |
| 55 | + .concat(ofPattern("yyyy-MM-dd-HH-mm-ss").format(LocalDateTime.now())); |
| 56 | + |
| 57 | + File tempDirectory = FileUtils.getTempDirectory(); |
| 58 | + File folder = new File(tempDirectory, RandomStringUtils.secure().nextAlphanumeric(6)); |
| 59 | + List<FileUpload> uploads = fileUploadService.findAll(); |
| 60 | + log.debug("create temp folder: {}", folder.mkdirs()); |
| 61 | + |
| 62 | + messages.add("current upload count: %s".formatted(uploads.size())); |
| 63 | + for (FileUpload upload : uploads) { |
| 64 | + var fileToSave = new File(folder, "%s_%s".formatted(upload.getId(), upload.getOriginalFilename())); |
| 65 | + try (InputStream is = fileUploadService.uploadToInputStream(upload)) { |
| 66 | + FileUtils.copyToFile(is, fileToSave); |
| 67 | + messages.add("file %s has been copied".formatted(upload.getOriginalFilename())); |
| 68 | + } |
| 69 | + } |
| 70 | + File zipFile = new File(tempDirectory, archiveName.concat(".zip")); |
45 | 71 |
|
46 | | - @Override |
47 | | - public ActionResult run(List<ActionParameter> parameters) { |
48 | | - |
49 | | - Date date = new Date(); |
50 | | - var resultBuilder = this.actionResultBuilder(parameters).startedDate(date); |
51 | | - |
52 | | - List<String> messages = new ArrayList<>(); |
53 | | - try { |
54 | | - String archiveName = buildProperties.getVersion().concat("-") |
55 | | - .concat(ofPattern("yyyy-MM-dd-HH-mm-ss").format(LocalDateTime.now())); |
56 | | - |
57 | | - File tempDirectory = FileUtils.getTempDirectory(); |
58 | | - File folder = new File(tempDirectory, RandomStringUtils.secure().nextAlphanumeric(6)); |
59 | | - List<FileUpload> uploads = fileUploadService.findAll(); |
60 | | - log.debug("create temp folder: {}", folder.mkdirs()); |
61 | | - |
62 | | - messages.add("current upload count: %s".formatted(uploads.size())); |
63 | | - for (FileUpload upload : uploads) { |
64 | | - var fileToSave = new File(folder, "%s_%s".formatted(upload.getId(), upload.getOriginalFilename())); |
65 | | - try (InputStream is = fileUploadService.uploadToInputStream(upload)) { |
66 | | - FileUtils.copyToFile(is, fileToSave); |
67 | | - messages.add("file %s has been copied".formatted(upload.getOriginalFilename())); |
68 | | - } |
69 | | - } |
70 | | - File zipFile = new File(tempDirectory, archiveName.concat(".zip")); |
| 72 | + ZipParameters zipParameters = new ZipParameters(); |
| 73 | + zipParameters.setIncludeRootFolder(false); |
71 | 74 |
|
72 | | - ZipParameters zipParameters = new ZipParameters(); |
73 | | - zipParameters.setIncludeRootFolder(false); |
| 75 | + try (var zip = new ZipFile(zipFile)) { |
| 76 | + zip.addFolder(folder, zipParameters); |
| 77 | + } |
74 | 78 |
|
75 | | - try (var zip = new ZipFile(zipFile)) { |
76 | | - zip.addFolder(folder, zipParameters); |
77 | | - } |
| 79 | + File backupFolder = getBackupFolder(); |
78 | 80 |
|
79 | | - File backupFolder = getBackupFolder(); |
80 | | - |
81 | | - zipLoop: for (File existingZipFile : FileUtils.listFiles(backupFolder, new String[] { "zip" }, false)) { |
82 | | - File tempDir = new File(tempDirectory, IdGenerators.get()); |
83 | | - log.debug("mkdir tempdir {}", tempDir.mkdirs()); |
84 | | - |
85 | | - try (var existingZip = new ZipFile(existingZipFile)) { |
86 | | - existingZip.extractAll(tempDir.getAbsolutePath()); |
87 | | - } |
88 | | - boolean contentEquals = true; |
89 | | - // todo this doesn't handle directory I think |
90 | | - for (File fileToSave : FileUtils.listFiles(folder, null, false)) { |
91 | | - var tempFile = new File(tempDir, fileToSave.getName()); |
92 | | - if (!tempFile.exists()) { |
93 | | - FileUtils.deleteDirectory(tempDir); |
94 | | - continue zipLoop; |
95 | | - } |
96 | | - try (var tempIs = new FileInputStream(tempFile); |
97 | | - var is = new FileInputStream(fileToSave)) { |
98 | | - if (!IOUtils.contentEquals(tempIs, is)) { |
99 | | - contentEquals = false; |
100 | | - break; |
101 | | - } |
102 | | - } |
103 | | - } |
104 | | - FileUtils.deleteDirectory(tempDir); |
105 | | - |
106 | | - if (contentEquals) { |
107 | | - return resultBuilder.finishedDate(new Date()).messages(List.of("zip are identical. done...")) |
108 | | - .build(); |
109 | | - } |
| 81 | + zipLoop: for (File existingZipFile : FileUtils.listFiles(backupFolder, new String[] { "zip" }, false)) { |
| 82 | + File tempDir = new File(tempDirectory, IdGenerators.get()); |
| 83 | + log.debug("mkdir tempdir {}", tempDir.mkdirs()); |
110 | 84 |
|
| 85 | + try (var existingZip = new ZipFile(existingZipFile)) { |
| 86 | + existingZip.extractAll(tempDir.getAbsolutePath()); |
| 87 | + } |
| 88 | + boolean contentEquals = true; |
| 89 | + // todo this doesn't handle directory I think |
| 90 | + for (File fileToSave : FileUtils.listFiles(folder, null, false)) { |
| 91 | + var tempFile = new File(tempDir, fileToSave.getName()); |
| 92 | + if (!tempFile.exists()) { |
| 93 | + FileUtils.deleteDirectory(tempDir); |
| 94 | + continue zipLoop; |
| 95 | + } |
| 96 | + try (var tempIs = new FileInputStream(tempFile); |
| 97 | + var is = new FileInputStream(fileToSave)) { |
| 98 | + if (!IOUtils.contentEquals(tempIs, is)) { |
| 99 | + contentEquals = false; |
| 100 | + break; |
111 | 101 | } |
| 102 | + } |
| 103 | + } |
| 104 | + FileUtils.deleteDirectory(tempDir); |
112 | 105 |
|
113 | | - FileUtils.moveFileToDirectory(zipFile, backupFolder, true); |
114 | | - FileUtils.cleanDirectory(tempDirectory); |
| 106 | + if (contentEquals) { |
| 107 | + return resultBuilder.finishedDate(new Date()).messages(List.of("zip are identical. done...")) |
| 108 | + .build(); |
| 109 | + } |
115 | 110 |
|
116 | | - messages.add("done."); |
117 | | - return resultBuilder.finishedDate(new Date()).messages(messages).build(); |
| 111 | + } |
118 | 112 |
|
119 | | - } catch (Exception e) { |
120 | | - log.error("error while executing action", e); |
121 | | - messages.add("error, see logs: %s".formatted(e.getMessage())); |
122 | | - return resultBuilder.messages(messages).finishedDate(new Date()).status(StatusType.FAILURE).build(); |
123 | | - } |
124 | | - } |
| 113 | + FileUtils.moveFileToDirectory(zipFile, backupFolder, true); |
| 114 | + FileUtils.cleanDirectory(tempDirectory); |
125 | 115 |
|
126 | | - @Override |
127 | | - public ActionMetadata getMetadata() { |
128 | | - return getDefaultMetadata(); |
129 | | - } |
| 116 | + messages.add("done."); |
| 117 | + return resultBuilder.finishedDate(new Date()).messages(messages).build(); |
130 | 118 |
|
131 | | - @Override |
132 | | - public String getKey() { |
133 | | - return ACTION_KEY; |
| 119 | + } catch (Exception e) { |
| 120 | + log.error("error while executing action", e); |
| 121 | + messages.add("error, see logs: %s".formatted(e.getMessage())); |
| 122 | + return resultBuilder.messages(messages).finishedDate(new Date()).status(StatusType.FAILURE).build(); |
134 | 123 | } |
135 | | - |
136 | | - private File getBackupFolder() { |
137 | | - File backupFolder = new File(pathToBackupFiles); |
138 | | - if (!backupFolder.exists()) { |
139 | | - boolean result = backupFolder.mkdirs(); |
140 | | - log.debug("creating backup folder: {}", result); |
141 | | - } |
142 | | - return backupFolder; |
| 124 | + } |
| 125 | + |
| 126 | + @Override |
| 127 | + public ActionMetadata getMetadata() { |
| 128 | + return getDefaultMetadata(); |
| 129 | + } |
| 130 | + |
| 131 | + @Override |
| 132 | + public String getKey() { |
| 133 | + return ACTION_KEY; |
| 134 | + } |
| 135 | + |
| 136 | + private File getBackupFolder() { |
| 137 | + File backupFolder = new File(pathToBackupFiles); |
| 138 | + if (!backupFolder.exists()) { |
| 139 | + boolean result = backupFolder.mkdirs(); |
| 140 | + log.debug("creating backup folder: {}", result); |
143 | 141 | } |
| 142 | + return backupFolder; |
| 143 | + } |
144 | 144 | } |
0 commit comments