HTV .CONFLICT mappa mentese
authorelgekko <vasary@elgekko.net>
Thu, 9 Mar 2023 09:27:34 +0000 (10:27 +0100)
committerelgekko <vasary@elgekko.net>
Thu, 9 Mar 2023 09:27:34 +0000 (10:27 +0100)
server/user.jobengine.executors/src/user/jobengine/server/steps/BackupFileStep.java [new file with mode: 0644]

diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/BackupFileStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/BackupFileStep.java
new file mode 100644 (file)
index 0000000..396fd24
--- /dev/null
@@ -0,0 +1,122 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.DirectoryStream;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.apache.commons.lang.RandomStringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+import org.apache.logging.log4j.message.Message;\r
+import org.apache.logging.log4j.message.ParameterizedMessage;\r
+\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.configuration.SystemConfiguration;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.db.MediaFileDAO;\r
+import user.jobengine.db.Store;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class BackupFileStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static boolean RANDOMIZE_ARCHIVES = SystemConfiguration.getInstance().value("tsm.randomize-archives");\r
+       private Marker marker;\r
+       public static final String DOT_DONE = ".DONE";\r
+       public static final String DOT_JSON = ".json";\r
+\r
+       MediaFile getMediaFile(String fileName) {\r
+               List<MediaFile> result = new ArrayList<>();\r
+               MediaFileDAO dao = (MediaFileDAO) getManager().getBaseDAO(MediaFile.class);\r
+               getManager().executeQuery("SELECT id FROM MEDIAFILE WHERE relativepath=?", rs -> {\r
+                       long id = rs.getLong("id");\r
+                       result.add((MediaFile) dao.get(id));\r
+                       return false;\r
+               }, s -> {\r
+                       s.setString(1, fileName);\r
+               });\r
+\r
+               return result.size() > 0 ? result.get(0) : null;\r
+       }\r
+\r
+       String flag(Object checkObject) {\r
+               return checkObject == null ? "-" : "X";\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute() throws Exception {\r
+               marker = getSessionMarker();\r
+\r
+               Path sourceFolder = Paths.get("/mnt/ISILON/ARCHIVE/.CONFLICT");\r
+               Path donePath = Paths.get(sourceFolder.toString(), DOT_DONE);\r
+               Store tsmStore = getManager().getSystemStore(false);\r
+               StoreUri tsmUri = tsmStore.getSourceStoreUri(RemoteStoreProtocol.TSM);\r
+\r
+               try (DirectoryStream<Path> stream = Files.newDirectoryStream(sourceFolder)) {\r
+                       for (Path source : stream) {\r
+                               if (Files.isDirectory(source)) {\r
+                                       continue;\r
+                               }\r
+\r
+                               String fileName = source.getFileName().toString();\r
+                               if (fileName.toLowerCase().endsWith(".mxf") || fileName.toLowerCase().endsWith(".mp4")) {\r
+\r
+                                       MediaFile mf = getMediaFile(fileName);\r
+                                       RemoteFile tsmFile = tsmUri.getRemoteFile(fileName);\r
+                                       logger.info(marker, "[{}{}] {}", flag(mf), flag(tsmFile), fileName);\r
+                                       if (getJobRuntime().isWaitingCancel())\r
+                                               break;\r
+\r
+                                       if (tsmFile == null) {\r
+                                               backup(source, tsmUri);\r
+                                               tsmFile = tsmUri.getRemoteFile(fileName);\r
+                                       }\r
+\r
+                                       if (mf != null && tsmFile != null) {\r
+                                               moveToDone(donePath, source, fileName);\r
+                                       }\r
+                               }\r
+                       }\r
+               } finally {\r
+                       tsmUri.cleanUp();\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       private void moveToDone(Path donePath, Path source, String fileName) throws IOException {\r
+               EscortFiles.ensureUNCFolder(donePath);\r
+               Files.move(source, Paths.get(donePath.toString(), fileName));\r
+               Path json = Paths.get(source.getParent().toString(), fileName + DOT_JSON);\r
+               Files.move(json, Paths.get(donePath.toString(), fileName + DOT_JSON));\r
+       }\r
+\r
+       private void backup(Path source, StoreUri targetUri) throws Exception {\r
+               String sourceFileName = source.getFileName().toString();\r
+               try {\r
+                       getJobRuntime().setDescription(sourceFileName);\r
+\r
+                       StoreUri sourceUri = getManager().createStoreUri(RemoteStoreProtocol.LOCAL, source.getParent().toString());\r
+                       String targetFileName;\r
+                       if (RANDOMIZE_ARCHIVES) {\r
+                               targetFileName = String.format("%s-%s", RandomStringUtils.randomAlphanumeric(8), sourceFileName);\r
+                       } else\r
+                               targetFileName = sourceFileName;\r
+\r
+                       RemoteFile remoteFile = sourceUri.transferFrom(targetUri, sourceFileName, targetFileName);\r
+\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       Message m = new ParameterizedMessage("Az '{}' állomány archiválása sikertelen. A rendszer hibaüzenete: {}", sourceFileName, e.getMessage());\r
+                       logger.error(marker, m);\r
+                       throw new Exception(m.getFormattedMessage());\r
+               }\r
+       }\r
+\r
+}\r