--- /dev/null
+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