git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorvasary.daniel <TFS\vasary.daniel>
Tue, 10 Aug 2021 14:38:54 +0000 (14:38 +0000)
committervasary.daniel <TFS\vasary.daniel>
Tue, 10 Aug 2021 14:38:54 +0000 (14:38 +0000)
75 files changed:
server/-product/production/AMC/jobs/executors.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/schedules.json [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/ArchiveSubtitlesStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/CancelableStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/DirMXFValidatorStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/EscortFileUpdaterStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/FILEZILLA_AVIDTransferToStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/FILEZILLA_PASARESTORETransferToStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/FileCleanupStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/FileSearchFilterOptions.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/FileValidatorStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/ForkDownloadStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/ForkUploadStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/GenericArchiveCheckerStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/HarrisMissingMaterialCheckerStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/MetadataPersisterStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/NEXIO1TransferFromStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/NEXIO1TransferToStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/NEXIO2TransferFromStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/NEXIO2TransferToStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/NEXIOArchiveCheckerStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/NEXIOMetadataPersisterStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/PASAPOOLTransferToStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/PBARCHIVETransferFromStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/PBArchiveCheckerStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/PathItemsCollectorStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/PeableBeachMissingMaterialCheckerStep.210604 [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/PeableBeachMissingMaterialCheckerStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/RegisterUserRestoreStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/RegisterVODRestoreStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/RundownFilesCollectorStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/ServerStatusReportStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/SubtitleFilesCollectorStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/TSMTransferFromStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/TSMTransferToStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/TestForkCancelableStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/TransferStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/TransferToFTPStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/VODTransferToStep.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/shared/EscortFiles.java [new file with mode: 0644]
server/-product/production/AMC/jobs/steps/shared/PBQuery.java [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/FILEZILLA_AVID-validate-and-restore.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/FILEZILLA_PASARESTORE-validate-and-archive.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/FILEZILLA_PASARESTORE-validate-and-restore.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/NEXIO1-validate-and-archive.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/NEXIO1-validate-and-restore.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/NEXIO2-validate-and-archive.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/NEXIO2-validate-and-restore.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/PASAPOOL-validate-and-restore.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/PB-archive-checker.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/PBARCHIVE-validate-and-archive.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/VOD-validate-and-restore.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/cancelable.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/create-lowres-ondemand.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/fork-validate-and-archive.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/fork-validate-and-restore.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/generic-archive-checker.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/harris1-missingmaterial-checker.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/harris2-missingmaterial-checker.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/nexio1-archive-checker.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/nexio2-archive-checker.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/peablebeach-missingmaterial-checker.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/register-user-restore.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/register-vod-restore.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/server-status-report.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/sync-subtitles.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/test-fork-cancelable.xml [new file with mode: 0644]
server/-product/production/AMC/jobs/templates/validate-dir-mxf.xml [new file with mode: 0644]
server/-product/production/AMC/settings/application.yaml [new file with mode: 0644]
server/-product/production/AMC/settings/dsm.opt [new file with mode: 0644]
server/-product/production/AMC/settings/jetty.xml [new file with mode: 0644]
server/-product/production/AMC/settings/log4j2-210810.xml [new file with mode: 0644]
server/-product/production/AMC/settings/log4j2.xml [new file with mode: 0644]
server/-product/production/AMC/settings/maestro.yaml [new file with mode: 0644]
server/-product/production/AMC/settings/mediacube.yaml [new file with mode: 0644]

diff --git a/server/-product/production/AMC/jobs/executors.xml b/server/-product/production/AMC/jobs/executors.xml
new file mode 100644 (file)
index 0000000..498d397
--- /dev/null
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<executors>\r
+       <executor className="EscortFileUpdaterStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="PBARCHIVETransferFromStep.java" maxConcurrent="2" isRemote="false" />\r
+       <executor className="PBArchiveCheckerStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="ArchiveSubtitlesStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="SubtitleFilesCollectorStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="ServerStatusReportStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="TransferStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="TSMTransferToStep.java" maxConcurrent="4" isRemote="false" />\r
+       <executor className="TSMTransferFromStep.java" maxConcurrent="8" isRemote="false" />\r
+       <executor className="NEXIO1TransferToStep.java" maxConcurrent="4" isRemote="false" />\r
+       <executor className="NEXIO2TransferToStep.java" maxConcurrent="4" isRemote="false" />\r
+       <executor className="PASAPOOLTransferToStep.java" maxConcurrent="4" isRemote="false" />\r
+       <executor className="FILEZILLA_PASARESTORETransferToStep.java" maxConcurrent="4" isRemote="false" />\r
+       <executor className="FILEZILLA_AVIDTransferToStep.java" maxConcurrent="4" isRemote="false" />\r
+       <executor className="NEXIO1TransferFromStep.java" maxConcurrent="2" isRemote="false" />\r
+       <executor className="NEXIO2TransferFromStep.java" maxConcurrent="2" isRemote="false" />\r
+       <executor className="VODTransferToStep.java" maxConcurrent="3" isRemote="false" />\r
+       <executor className="RegisterVODRestoreStep.java" maxConcurrent="1" isRemote="false" />\r
+\r
+       <executor className="RegisterUserRestoreStep.java" maxConcurrent="3" isRemote="false" />\r
+       <executor className="FileValidatorStep.java" maxConcurrent="10" isRemote="false" />\r
+       <executor className="MetadataPersisterStep.java" maxConcurrent="10" isRemote="false" />\r
+       <executor className="FileCleanupStep.java" maxConcurrent="10" isRemote="false" />\r
+       <executor className="ForkUploadStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="ForkDownloadStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="NEXIOArchiveCheckerStep.java" maxConcurrent="2" isRemote="false" />\r
+       <executor className="NEXIOMetadataPersisterStep.java" maxConcurrent="5" isRemote="false" />\r
+       <executor className="HarrisMissingMaterialCheckerStep.java" maxConcurrent="2" isRemote="false" />\r
+       <executor className="PeableBeachMissingMaterialCheckerStep.java" maxConcurrent="1" isRemote="false" />\r
+\r
+       <executor className="CancelableStep.java" maxConcurrent="2" isRemote="false" />\r
+       <executor className="TestForkCancelableStep.java" maxConcurrent="3" isRemote="false" />\r
+       <executor className="DirMXFValidatorStep.java" maxConcurrent="1" isRemote="false" />\r
+</executors>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/schedules.json b/server/-product/production/AMC/jobs/schedules.json
new file mode 100644 (file)
index 0000000..66fc1e2
--- /dev/null
@@ -0,0 +1,146 @@
+{"joblist":[\r
+       {\r
+         "template": "PB-archive-checker.xml",\r
+         "name" : "PEABLEBEACH archiválás előkészítése",\r
+      "active": true,\r
+      "executeimmediate": false,\r
+      "cronexpression": "0 0 */1 * * ?",\r
+         "parameters": \r
+               [ \r
+                       {"name": "sourceStoreName", "value": "PBARCHIVE", "type": "java.lang.String"},\r
+                       {"name": "escortStoreName", "value": "MEDIACUBE_DOWNLOADS", "type": "java.lang.String"},\r
+                       {"name": "lastModifiedHours", "value": 3, "type": "java.lang.Integer"}\r
+               ]\r
+       },      \r
+       {\r
+      "template": "sync-subtitles.xml",\r
+         "name" : "Feliratok szinkronizálása",\r
+      "active": true,\r
+         "cronexpression": "0 */30 * * * ?",\r
+      "parameters": [ \r
+       {"name": "sourceFolder", "value": "x:\\PB_ORIG", "type": "java.lang.String"}, \r
+       {"name": "syncTarget", "value": "r:\\BeachPool", "type": "java.lang.String"}, \r
+       {"name": "filter", "value": ".*\\.(stl)$",  "type": "java.lang.String" } \r
+      ]\r
+       },\r
+       {\r
+      "template": "server-status-report.xml",\r
+         "name" : "MediaCube státusz",\r
+      "active": true,\r
+      "executeimmediate": false,\r
+         "cronexpression": "0 */30 * * * ?"\r
+       },\r
+       {\r
+         "template": "nexio1-archive-checker.xml",\r
+         "name" : "NEXIO1 archiválás előkészítése",\r
+      "active": true,\r
+      "executeimmediate": false,\r
+      "cronexpression": "0 0 */1 * * ?",\r
+         "parameters": \r
+               [ \r
+                       {"name": "sourceStoreName", "value": "NEXIO1", "type": "java.lang.String"},\r
+                       {"name": "escortStoreName", "value": "MEDIACUBE_DOWNLOADS", "type": "java.lang.String"},\r
+                       {"name": "lastModifiedHours", "value": 3, "type": "java.lang.Integer"}\r
+               ]\r
+       },      \r
+       {\r
+         "template": "nexio2-archive-checker.xml",\r
+         "name" : "NEXIO2 archiválás előkészítése",\r
+      "active": true,\r
+      "executeimmediate": false,\r
+      "cronexpression": "0 0 */1 * * ?",\r
+         "parameters": \r
+               [ \r
+                       {"name": "sourceStoreName", "value": "NEXIO2", "type": "java.lang.String"},\r
+                       {"name": "escortStoreName", "value": "MEDIACUBE_DOWNLOADS", "type": "java.lang.String"},\r
+                       {"name": "lastModifiedHours", "value": 3, "type": "java.lang.Integer"}\r
+               ]\r
+       },\r
+       {\r
+         "template": "fork-validate-and-archive.xml",\r
+         "name" : "Kötegelt validálás és archiválás",\r
+         "active": true,\r
+         "executeimmediate": false,\r
+         "cronexpression": "0 */30 * * * ?",\r
+         "parameters": \r
+               [ \r
+                       {"name": "sourceStoreName", "value": "MEDIACUBE_DOWNLOADS", "type": "java.lang.String"},\r
+                       {"name": "template", "value": "validate-and-archive.xml", "type": "java.lang.String"},\r
+                       {"name": "expectedColorSpace", "value": "", "type": "java.lang.String"},\r
+                       {"name": "limit", "value": 100, "type": "java.lang.Integer"}\r
+               ]\r
+       },\r
+       {\r
+         "template": "harris1-missingmaterial-checker.xml",\r
+         "name" : "HARRIS1 missing material lekérdezés",\r
+         "active": true,\r
+         "executeimmediate": false,\r
+         "cronexpression": "0 */5 * * * ?",\r
+         "parameters": \r
+               [ \r
+                       {"name": "vicFiles", "value": ["z:\\NEXIO.VIC", "z:\\EDIT 9.VIC", "z:\\TRIM2.VIC"], "type": "com.ibm.nosql.json.api.BasicDBList"},\r
+                       {"name": "escortStoreName", "value": "MEDIACUBE_UPLOADS", "type": "java.lang.String"},\r
+                       {"name": "targetStoreName", "value": "NEXIO1", "type": "java.lang.String"},\r
+                       {"name": "targetProtocol", "value": "FTP", "type": "java.lang.String"}\r
+               ]\r
+       },\r
+       {\r
+         "template": "harris2-missingmaterial-checker.xml",\r
+         "name" : "HARRIS2 missing material lekérdezés",\r
+         "active": true,\r
+         "executeimmediate": false,\r
+         "cronexpression": "0 */5 * * * ?",\r
+         "parameters": \r
+               [ \r
+                       {"name": "vicFiles", "value": ["z:\\NEXIO2.VIC", "z:\\EDIT-4.VIC", "z:\\EDIT 10.VIC"], "type": "com.ibm.nosql.json.api.BasicDBList"},\r
+                       {"name": "escortStoreName", "value": "MEDIACUBE_UPLOADS", "type": "java.lang.String"},\r
+                       {"name": "targetStoreName", "value": "NEXIO2", "type": "java.lang.String"},\r
+                       {"name": "targetProtocol", "value": "FTP", "type": "java.lang.String"}\r
+               ]\r
+       },\r
+       {\r
+         "template": "peablebeach-missingmaterial-checker.xml",\r
+         "name" : "PEABLEBEACH missing material lekérdezés",\r
+         "active": true,\r
+         "executeimmediate": false,\r
+         "cronexpression": "0 */5 * * * ?",\r
+         "parameters": \r
+               [ \r
+                       {"name": "escortStoreName", "value": "MEDIACUBE_UPLOADS", "type": "java.lang.String"},\r
+                       {"name": "lookupStoreNames", "value": ["PEABLEBEACH", "PASAPOOL", "SELENIOPOOL", "SELENIOPOOL_16_9", "SELENIOPOOL_16_9_PROCESSING", "SELENIOPOOL_4_3", "SELENIOPOOL_4_3_PROCESSING"], "type": "com.ibm.nosql.json.api.BasicDBList"},\r
+                       {"name": "targetStoreName", "value": "PASAPOOL", "type": "java.lang.String"},\r
+                       {"name": "targetProtocol", "value": "FTP", "type": "java.lang.String"},\r
+                       {"name": "primaryEndPoint", "value": "http://10.170.100.61:18083", "type": "java.lang.String"},\r
+                       {"name": "primaryUserName", "value": "pbs", "type": "java.lang.String"},\r
+                       {"name": "primaryPassword", "value": "pbs", "type": "java.lang.String"},\r
+                       {"name": "secondaryEndPoint", "value": "http://10.170.100.62:18083", "type": "java.lang.String"},\r
+                       {"name": "secondaryUserName", "value": "pbs", "type": "java.lang.String"},\r
+                       {"name": "secondaryPassword", "value": "pbs", "type": "java.lang.String"},\r
+                       {"name": "rangeForwardHours", "value": 168, "type": "java.lang.Integer"}\r
+               ]\r
+       },\r
+       {\r
+         "template": "fork-validate-and-restore.xml",\r
+         "name" : "Kötegelt validálás és visszatöltés",\r
+         "active": true,\r
+         "executeimmediate": false,\r
+         "cronexpression": "0 */1 * * * ?",\r
+         "parameters": \r
+               [ \r
+                       {"name": "sourceStoreName", "value": "MEDIACUBE_UPLOADS", "type": "java.lang.String"},\r
+                       {"name": "template", "value": "validate-and-restore.xml", "type": "java.lang.String"},\r
+                       {"name": "expectedColorSpace", "value": "", "type": "java.lang.String"},\r
+                       {"name": "limit", "value": 0, "type": "java.lang.Integer"}\r
+               ]\r
+       },\r
+       {\r
+      "template": "register-user-restore.xml",\r
+         "name" : "Felhasználói visszatöltés regisztráció",\r
+         "active": false,\r
+         "executeimmediate": false,\r
+      "parameters": \r
+               [ \r
+                       {"name": "escortStoreName", "value": "MEDIACUBE_UPLOADS", "type": "java.lang.String"}\r
+               ]\r
+       }       \r
+]}\r
diff --git a/server/-product/production/AMC/jobs/steps/ArchiveSubtitlesStep.java b/server/-product/production/AMC/jobs/steps/ArchiveSubtitlesStep.java
new file mode 100644 (file)
index 0000000..4afb09b
--- /dev/null
@@ -0,0 +1,116 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.StandardCopyOption;\r
+import java.nio.file.attribute.FileAttribute;\r
+import java.nio.file.attribute.PosixFilePermission;\r
+import java.nio.file.attribute.PosixFilePermissions;\r
+import java.util.Arrays;\r
+import java.util.List;\r
+import java.util.Set;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+public class ArchiveSubtitlesStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(List<String> files, String syncTarget) {\r
+               int current = 0;\r
+               for (String file : files) {\r
+                       Path source = Paths.get(file);\r
+                       Path archive = archiveSubtitle(source);\r
+\r
+                       if (archive != null) {\r
+                               Path sync = Paths.get(syncTarget);\r
+                               syncSubtitle(archive, sync);\r
+                       }\r
+\r
+                       current++;\r
+                       int progress = current * 100 / files.size();\r
+                       setProgress(progress);\r
+               }\r
+               setProgress(100);\r
+               return null;\r
+       }\r
+\r
+       private Path archiveSubtitle(Path source) {\r
+               Path archiveRoot = Paths.get(source.toString().replace("PB_ORIG", "PB_ARCH")).getParent().getParent();\r
+               String lang = source.getParent().getFileName().toString().toUpperCase();\r
+               // logger.info(getMarker(), "Archive root is {}, lang is {}", archiveRoot,\r
+               // lang);\r
+\r
+               String sourceFileName = source.getFileName().toString();\r
+               Path archive = Paths.get(archiveRoot.toString(), sourceFileName.replace(".stl", "_" + lang + ".stl"));\r
+               boolean isOverride = archive.toFile().exists();\r
+               try {\r
+                       ensureFolder(archiveRoot);\r
+                       Files.copy(source, archive, StandardCopyOption.REPLACE_EXISTING);\r
+\r
+                       boolean isContentEquals = Arrays.equals(Files.readAllBytes(source), Files.readAllBytes(archive));\r
+                       logger.info(getMarker(), "Contents equals {}", isContentEquals);\r
+                       if (isContentEquals) {\r
+                               if (isOverride)\r
+                                       logger.info(getMarker(), "Successfully replaced {}", archive);\r
+                               else\r
+                                       logger.info(getMarker(), "Successfully archived {}", archive);\r
+\r
+                               String doneFileName = sourceFileName.substring(0, sourceFileName.lastIndexOf("."));\r
+                               Path done = Paths.get(source.getParent().toString(), doneFileName + "_DONE.stl");\r
+                               Files.move(source, done, StandardCopyOption.REPLACE_EXISTING);\r
+                               return archive;\r
+                       } else\r
+                               throw new Exception("Source and target content not equals");\r
+               } catch (Exception e) {\r
+                       logger.error(getMarker(), "Error copy {} to {}. System message: {}", source, archive, e.getMessage());\r
+               }\r
+               return null;\r
+       }\r
+\r
+       private void syncSubtitle(Path archive, Path syncTarget) {\r
+               Path sync = Paths.get(syncTarget.toString(), archive.getFileName().toString());\r
+               logger.info(getMarker(), "Sync root {} exists {}", syncTarget, syncTarget.toFile().exists());\r
+\r
+               if (!sync.toFile().exists()) {\r
+                       logger.info(getMarker(), "Skipping {} synchronization, target not exists", sync);\r
+                       return;\r
+               }\r
+\r
+               logger.info(getMarker(), "Target {} synchronization required", sync);\r
+\r
+               try {\r
+                       Files.copy(archive, sync, StandardCopyOption.REPLACE_EXISTING);\r
+                       boolean isContentEquals = Arrays.equals(Files.readAllBytes(archive), Files.readAllBytes(sync));\r
+                       if (isContentEquals)\r
+                               logger.info(getMarker(), "Successfully synchronized {}", archive);\r
+                       else\r
+                               throw new Exception("Synchronization source and target content not equals");\r
+               } catch (Exception e) {\r
+                       logger.error(getMarker(), "Error synchronize {} to {}. System message: {}", archive, sync, e.getMessage());\r
+               }\r
+       }\r
+\r
+       public void ensureFolder(Path filePath) throws IOException {\r
+               File folder = filePath.toFile();\r
+               if (!folder.exists() || !folder.isDirectory()) {\r
+                       try {\r
+                               Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxrwxrwx");\r
+                               FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);\r
+                               Files.createDirectories(filePath, attr);\r
+                       } catch (Exception e) {\r
+                               try {\r
+                                       Files.createDirectories(filePath);\r
+                               } catch (Exception e1) {\r
+                                       logger.catching(e1);\r
+                                       throw e1;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/CancelableStep.java b/server/-product/production/AMC/jobs/steps/CancelableStep.java
new file mode 100644 (file)
index 0000000..2b025e8
--- /dev/null
@@ -0,0 +1,35 @@
+package user.jobengine.server.steps;\r
+\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+\r
+public class CancelableStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       int count = 10;\r
+\r
+       @StepEntry\r
+       public Object[] execute(int param) throws Exception {\r
+               try {\r
+                       getJobRuntime().setDisableRetry(true);\r
+                       for (int i = 0; i < count; i++) {\r
+                               if (getJobRuntime().isWaitingCancel())\r
+                                       break;\r
+                               Thread.sleep(2000);\r
+                               int progress = (i + 1) * 100 / count;\r
+                               setProgress(progress);\r
+//                             if (i==9)\r
+//                                     throw new Exception("Hiba teszt!");\r
+                       }\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+                       throw e;\r
+               }\r
+               return null;\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/DirMXFValidatorStep.java b/server/-product/production/AMC/jobs/steps/DirMXFValidatorStep.java
new file mode 100644 (file)
index 0000000..f26d679
--- /dev/null
@@ -0,0 +1,61 @@
+package user.jobengine.server.steps;\r
+\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
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.mediatool.MediaInfo;\r
+import user.jobengine.db.Media;\r
+\r
+public class DirMXFValidatorStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(String source) throws Exception {\r
+               Path path = Paths.get(source);\r
+               DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path);\r
+               for (Path file : directoryStream) {\r
+                       if (getJobRuntime().isWaitingCancel()) {\r
+                               cancel();\r
+                               return null;\r
+                       }\r
+\r
+                       if (file.toFile().isDirectory())\r
+                               continue;\r
+\r
+                       String fileName = file.getFileName().toString();\r
+                       if (fileName.contains("."))\r
+                               fileName = fileName.substring(0, fileName.lastIndexOf("."));\r
+\r
+                       if (file.toFile().length() == 0) {\r
+                               logger.error("Zero: {}", fileName);\r
+                               continue;\r
+                       }\r
+\r
+                       Media media = getManager().getMedia(fileName);\r
+                       long frames = 0;\r
+                       if (media == null) {\r
+                               logger.warn("Unchecked yet: {}", fileName);\r
+                       } else\r
+                               frames = media.getLength();\r
+\r
+                       MediaInfo mi = null;\r
+\r
+                       try {\r
+                               mi = new MediaInfo(file);\r
+                               mi.process();\r
+                       } catch (Exception e) {\r
+                               logger.error(getSessionMarker(), e.getMessage());\r
+                               logger.error("Unreadable: {}", fileName);\r
+                       }\r
+\r
+                       logger.info("Valid: {}  MC farmes {}  FF frames {}", fileName, frames, mi.getFrames());\r
+               }\r
+\r
+               return null;\r
+       }\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/EscortFileUpdaterStep.java b/server/-product/production/AMC/jobs/steps/EscortFileUpdaterStep.java
new file mode 100644 (file)
index 0000000..5dcb523
--- /dev/null
@@ -0,0 +1,57 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.FileNotFoundException;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.StoreUri;\r
+import user.commons.mediatool.MediaInfo;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class EscortFileUpdaterStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(StoreUri sourceStoreUri, String fileName, String escortFile) throws Exception {\r
+               if (!RemoteStoreProtocol.LOCAL.equals(sourceStoreUri.getProtocol()))\r
+                       throw new Exception("Store URI protocol must be local.");\r
+               Path filePath = Paths.get(sourceStoreUri.toString(true), fileName);\r
+               if (!filePath.toFile().exists())\r
+                       throw new FileNotFoundException("File not exists: " + filePath.toString());\r
+\r
+               Path escortFilePath = Paths.get(escortFile);\r
+               DownloadableMedia downloadable = null;\r
+               try {\r
+                       downloadable = EscortFiles.decode(escortFilePath);\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+               }\r
+\r
+               if (downloadable != null)\r
+                       storeCurrentFrames(filePath, downloadable, escortFilePath);\r
+\r
+               return null;\r
+       }\r
+\r
+       private void storeCurrentFrames(Path filePath, DownloadableMedia downloadable, Path escortFilePath) {\r
+               MediaInfo mi = null;\r
+               try {\r
+                       mi = new MediaInfo(filePath);\r
+                       mi.process();\r
+                       long frames = mi.getFrames();\r
+                       downloadable.put("frames", frames);\r
+                       Files.write(escortFilePath, downloadable.toPrettyString("").getBytes());\r
+                       logger.info(getMarker(), "{} length {} is saved to escort file", filePath, frames,\r
+                                       escortFilePath.getFileName().toString());\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+               }\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/FILEZILLA_AVIDTransferToStep.java b/server/-product/production/AMC/jobs/steps/FILEZILLA_AVIDTransferToStep.java
new file mode 100644 (file)
index 0000000..9774709
--- /dev/null
@@ -0,0 +1,11 @@
+package user.jobengine.server.steps;\r
+\r
+import user.commons.StoreUri;\r
+\r
+public class FILEZILLA_AVIDTransferToStep extends TransferStep {\r
+       @Override\r
+       @StepEntry\r
+       public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+               return super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+       }\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/FILEZILLA_PASARESTORETransferToStep.java b/server/-product/production/AMC/jobs/steps/FILEZILLA_PASARESTORETransferToStep.java
new file mode 100644 (file)
index 0000000..925549b
--- /dev/null
@@ -0,0 +1,85 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\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.MarkerManager;\r
+\r
+import user.commons.StoreUri;\r
+import user.commons.mediaarea.MediaArea;\r
+\r
+public class FILEZILLA_PASARESTORETransferToStep extends TransferStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String CODEC_PROFILE_HIGH = "HIGH";\r
+       private static final String CODEC_PROFILE_MAIN = "MAIN";\r
+       private static final String CODEC_PROFILE_422 = "4:2:2";\r
+       private static final String DISPLAY_ASPECT_16_9 = "16:9";\r
+       private static final String DISPLAY_ASPECT_4_3 = "4:3";\r
+       private StoreUri sourceStoreUri;\r
+       private String sourceFileName;\r
+\r
+       @Override\r
+       @StepEntry\r
+       public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+               this.sourceStoreUri = sourceStoreUri;\r
+               this.sourceFileName = sourceFileName;\r
+               logMediaProfile();\r
+               Object[] result = super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+               return result;\r
+       }\r
+\r
+       private boolean isHD(MediaArea mi) {\r
+               return mi.getHeight() == 1080;\r
+       }\r
+\r
+       private boolean isSD_HIGH_16_9(MediaArea mi) {\r
+               String formatProfileName = mi.getFormatProfileName();\r
+               return mi.getHeight() < 650 && formatProfileName.contains(CODEC_PROFILE_HIGH) && DISPLAY_ASPECT_16_9.equals(mi.getDisplayAspect());\r
+       }\r
+\r
+       private boolean isSD_HIGH_4_3(MediaArea mi) {\r
+               String formatProfileName = mi.getFormatProfileName();\r
+               return mi.getHeight() < 650 && formatProfileName.contains(CODEC_PROFILE_HIGH) && DISPLAY_ASPECT_4_3.equals(mi.getDisplayAspect());\r
+       }\r
+\r
+       private boolean isSD_MAIN_422(MediaArea mi) {\r
+               String formatProfileName = mi.getFormatProfileName();\r
+               return mi.getHeight() < 650 && (formatProfileName.contains(CODEC_PROFILE_MAIN) || formatProfileName.contains(CODEC_PROFILE_422));\r
+       }\r
+\r
+       protected void logMediaProfile() {\r
+               Marker marker = MarkerManager.getMarker("MEDIAPROFILE");\r
+               try {\r
+                       Path filePath = Paths.get(sourceStoreUri.toString(true), sourceFileName);\r
+                       MediaArea mi = new MediaArea(filePath);\r
+                       mi.process();\r
+                       logger.info(marker, "{} data : {} {} {}", sourceFileName, mi.getFormatProfileName(), mi.getHeight(), mi.getDisplayAspect());\r
+\r
+                       if (isHD(mi)) {\r
+                               logger.info(marker, "{} is MOVED_HD", sourceFileName);\r
+                               return;\r
+                       }\r
+\r
+                       if (isSD_HIGH_16_9(mi)) {\r
+                               logger.info(marker, "{} is CONVSD16_9", sourceFileName);\r
+                               return;\r
+                       }\r
+\r
+                       if (isSD_HIGH_4_3(mi)) {\r
+                               logger.info(marker, "{} is CONVSD4_3", sourceFileName);\r
+                               return;\r
+                       }\r
+\r
+                       if (isSD_MAIN_422(mi)) {\r
+                               logger.info(marker, "{} is MOVED_SD", sourceFileName);\r
+                               return;\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.error(marker, e.getMessage());\r
+               }\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/FileCleanupStep.java b/server/-product/production/AMC/jobs/steps/FileCleanupStep.java
new file mode 100644 (file)
index 0000000..8e1a6f4
--- /dev/null
@@ -0,0 +1,35 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.message.Message;\r
+import org.apache.logging.log4j.message.ParameterizedMessage;\r
+\r
+import user.commons.StoreUri;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class FileCleanupStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(StoreUri sourceStoreUri, String fileName, String escortFile) throws Exception {\r
+               try {\r
+\r
+                       Message msg = new ParameterizedMessage("A {} fájl visszatöltése befejeződött.", fileName);\r
+                       EscortFiles.notifyRecipient(Paths.get(escortFile), logger, msg);\r
+\r
+                       Path filePath = Paths.get(sourceStoreUri.toString(true), fileName);\r
+                       EscortFiles.remove(filePath);\r
+                       EscortFiles.remove(Paths.get(escortFile));\r
+                       EscortFiles.remove(Paths.get(escortFile + EscortFiles.DOT_CATCHED));\r
+               } catch (Exception e) {\r
+                       logger.error(e.getMessage());\r
+                       throw e;\r
+               }\r
+               return null;\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/FileSearchFilterOptions.java b/server/-product/production/AMC/jobs/steps/FileSearchFilterOptions.java
new file mode 100644 (file)
index 0000000..436c3be
--- /dev/null
@@ -0,0 +1,41 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+public class FileSearchFilterOptions {\r
+\r
+       private BasicDBObject filter;\r
+\r
+       public FileSearchFilterOptions(BasicDBObject filter) {\r
+               this.filter = filter;\r
+       }\r
+\r
+       public boolean acceptFile(Path file) {\r
+               if (filter == null)\r
+                       return true;\r
+\r
+               if (filter.containsKey("fileName")) {\r
+                       //.*\.(sh|ini|conf|vhost|xml|php)$\r
+                       String fileNamePattern = filter.getString("fileName");\r
+                       if (fileNamePattern == null || fileNamePattern.trim().length() == 0)\r
+                               return true;\r
+\r
+                       Pattern pattern = Pattern.compile(fileNamePattern, Pattern.CASE_INSENSITIVE);\r
+\r
+                       Matcher matcher = pattern.matcher(file.getFileName().toString());\r
+                       if (matcher.find())\r
+                               return true;\r
+\r
+               }\r
+\r
+               return false;\r
+       }\r
+\r
+       public boolean preAcceptDirectory(Path file) {\r
+               return true;\r
+       }\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/FileValidatorStep.java b/server/-product/production/AMC/jobs/steps/FileValidatorStep.java
new file mode 100644 (file)
index 0000000..362155f
--- /dev/null
@@ -0,0 +1,146 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.FileNotFoundException;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.message.Message;\r
+import org.apache.logging.log4j.message.ParameterizedMessage;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.StoreUri;\r
+import user.commons.mediatool.MediaInfo;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class FileValidatorStep extends JobStep {\r
+       private static final String COLORSPACE = "COLORSPACE";\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(StoreUri sourceStoreUri, String fileName, long expectedFrameNumber, long expectedSize, String exceptedColorSpace, String escortFile)\r
+                       throws Exception {\r
+               if (!RemoteStoreProtocol.LOCAL.equals(sourceStoreUri.getProtocol()))\r
+                       throw new Exception("Store URI protocol must be local.");\r
+               Path filePath = Paths.get(sourceStoreUri.toString(true), fileName);\r
+               if (!filePath.toFile().exists())\r
+                       throw new FileNotFoundException("File not exists: " + filePath.toString());\r
+\r
+               Path escortFilePath = Paths.get(escortFile);\r
+\r
+               if (getJobRuntime().isWaitingCancel()) {\r
+                       EscortFiles.remove(filePath);\r
+                       //EscortFiles.remove(escortFilePath);\r
+                       EscortFiles.remove(Paths.get(escortFile + EscortFiles.DOT_CATCHED));\r
+\r
+                       Message msg = new ParameterizedMessage("A {} fájl visszatöltése kezelői beavatkozás miatt megszakadt.", fileName);\r
+                       EscortFiles.notifyRecipient(escortFilePath, logger, msg);\r
+\r
+                       cancel();\r
+                       return null;\r
+               }\r
+\r
+               DownloadableMedia downloadable = null;\r
+               try {\r
+                       downloadable = EscortFiles.decode(escortFilePath);\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+               }\r
+\r
+               if (downloadable != null && expectedFrameNumber == 0)\r
+                       storeCurrentFrames(filePath, downloadable);\r
+\r
+               if (downloadable != null && downloadable.containsKey("skipValidation") && downloadable.getBoolean("skipValidation"))\r
+                       return null;\r
+\r
+               if (expectedFrameNumber > 0 || StringUtils.isNotBlank(exceptedColorSpace))\r
+                       validateMedia(filePath, expectedFrameNumber, exceptedColorSpace, escortFile);\r
+\r
+               if (expectedSize > 0)\r
+                       validateSize(filePath, expectedSize, escortFile);\r
+\r
+               //A metadata persister miatt torlunk mindet teszt modban\r
+               /*\r
+               if (StringUtils.isNotBlank(testSimulate)) {\r
+                       EscortFiles.remove(escortFilePath);\r
+                       EscortFiles.remove(Paths.get(escortFile + EscortFiles.DOT_CATCHED));\r
+                       logger.info(getMarker(), "{} deleted to prevent real processing", escortFile);\r
+               }\r
+               */\r
+               logger.info(getMarker(), "{} passed validation", fileName);\r
+               return null;\r
+       }\r
+\r
+       private void storeCurrentFrames(Path filePath, DownloadableMedia downloadable) {\r
+               MediaInfo mi = null;\r
+               try {\r
+                       mi = new MediaInfo(filePath);\r
+                       mi.process();\r
+                       long frames = mi.getFrames();\r
+\r
+                       if (downloadable.containsKey("mediaId")) {\r
+                               Media media = getManager().getMedia(downloadable.getLong("mediaId"));\r
+                               if (media != null) {\r
+                                       media.setLength(frames);\r
+                                       getManager().modify(media);\r
+                               }\r
+\r
+                       }\r
+\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+               }\r
+       }\r
+\r
+       private void validateMedia(Path filePath, long expectedFrameNumber, String exceptedColorSpace, String escortFile) throws Exception {\r
+               MediaInfo mi = null;\r
+               try {\r
+                       mi = new MediaInfo(filePath);\r
+                       mi.process();\r
+\r
+                       if (expectedFrameNumber > 0) {\r
+                               long frames = mi.getFrames();\r
+                               if (Math.abs(frames - expectedFrameNumber) > 3) {\r
+                                       Message msg = new ParameterizedMessage("Validációs hiba miatt a {} fájl másolása nem lehetséges.", filePath.getFileName());\r
+                                       EscortFiles.notifyRecipient(Paths.get(escortFile), logger, msg);\r
+                                       getJobRuntime().setDisableRetry(true);\r
+                                       throw new Exception("Length mismatch in " + filePath + ". Expected: " + expectedFrameNumber + ", found: " + frames);\r
+                               }\r
+                       }\r
+\r
+                       if (StringUtils.isNotBlank(exceptedColorSpace)) {\r
+                               String colorSpace = mi.getColorSpace();\r
+                               if (colorSpace == null) {\r
+                                       EscortFiles.createFellow(escortFile, COLORSPACE);\r
+                                       throw new Exception("Can not determine color space in " + filePath);\r
+                               }\r
+\r
+                               if (!colorSpace.equals(exceptedColorSpace)) {\r
+                                       EscortFiles.createFellow(escortFile, COLORSPACE);\r
+                                       throw new Exception("Expected color space is " + exceptedColorSpace + ", but found " + colorSpace);\r
+                               }\r
+                       }\r
+\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+                       throw e;\r
+               }\r
+       }\r
+\r
+       private void validateSize(Path filePath, long expectedSize, String escortFile) throws Exception {\r
+               try {\r
+                       long length = filePath.toFile().length();\r
+                       if (length != expectedSize)\r
+                               throw new Exception("Size mismatch. Expected: " + expectedSize + ", found: " + length);\r
+\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+                       throw e;\r
+               }\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/ForkDownloadStep.java b/server/-product/production/AMC/jobs/steps/ForkDownloadStep.java
new file mode 100644 (file)
index 0000000..6722c82
--- /dev/null
@@ -0,0 +1,204 @@
+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.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.JobStatus;\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Store;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class ForkDownloadStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(String tempStoreName, String template, String expectedColorSpace, int limit)\r
+                       throws Exception {\r
+               DirectoryStream<Path> directoryStream = null;\r
+               int count = limit;\r
+               int allCount = 0;\r
+               int currentCount = 0;\r
+\r
+               try {\r
+\r
+                       StoreUri tempStoreUri = getManager().getStoreUri(tempStoreName, RemoteStoreProtocol.LOCAL);\r
+                       Path path = Paths.get(tempStoreUri.toString(true), ".STATUS");\r
+\r
+                       List<Path> escortFiles = new ArrayList<>();\r
+                       directoryStream = Files.newDirectoryStream(path);\r
+                       for (Path escortFile : directoryStream) {\r
+                               if (getJobRuntime().isWaitingCancel()) {\r
+                                       cancel();\r
+                                       return null;\r
+                               }\r
+                               escortFiles.add(escortFile);\r
+                       }\r
+                       allCount = escortFiles.size();\r
+                       escortFiles.sort((p1, p2) -> {\r
+                               return Long.valueOf(p1.toFile().lastModified()).compareTo(p2.toFile().lastModified());\r
+                       });\r
+\r
+                       if (allCount > 0) {\r
+                               for (Path escortFile : escortFiles) {\r
+                                       if (getJobRuntime().isWaitingCancel()) {\r
+                                               cancel();\r
+                                               break;\r
+                                       }\r
+\r
+                                       if (processPathItem(tempStoreUri, template, escortFile)) {\r
+                                               count--;\r
+                                               if (count == 0)\r
+                                                       break;\r
+                                       }\r
+                                       currentCount++;\r
+                                       int progress = currentCount * 100 / allCount;\r
+                                       setProgress(progress);\r
+                               }\r
+                       }\r
+\r
+                       setProgress(100);\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+                       throw e;\r
+               } finally {\r
+                       if (directoryStream != null) {\r
+                               try {\r
+                                       directoryStream.close();\r
+                               } catch (IOException e) {\r
+                               }\r
+                       }\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       private boolean processPathItem(StoreUri tempStoreUri, String template, Path escortFile) throws IOException {\r
+               if (escortFile.toFile().isDirectory())\r
+                       return false;\r
+\r
+               //ami nem JSON azt nem kezeljuk\r
+               if (!escortFile.getFileName().toString().toLowerCase().endsWith(EscortFiles.DOT_JSON))\r
+                       return false;\r
+\r
+               //aminek van COLORSPACE kiterjesztesu valtozata azt nem kezeljuk\r
+               //              Path colorspaceFile = Paths.get(escortFile.toString() + ".colorspace");\r
+               //              if (colorspaceFile.toFile().exists())\r
+               //                      return false;\r
+\r
+               if (EscortFiles.isCatchedFileExists(escortFile))\r
+                       return false;\r
+\r
+               String escortFileName = escortFile.getFileName().toString();\r
+               //minimum 3 karakter: STORENAME.FILENAME.MXF.JSON\r
+               long dotCount = escortFileName.chars().filter(ch -> ch == '.').count();\r
+               if (dotCount < 3)\r
+                       return false;\r
+\r
+               try {\r
+                       DownloadableMedia downloadable = EscortFiles.decode(escortFile);\r
+                       if (downloadable == null) {\r
+                               logger.error(getSessionMarker(), "Can't encode {}", escortFile);\r
+                               return false;\r
+                       }\r
+\r
+                       StoreUri sourceStoreUri = getManager().getStoreUri(downloadable.getLong("sourceStoreUriId"));\r
+                       StoreUri targetStoreUri = getManager().getStoreUri(downloadable.getLong("targetStoreUriId"));\r
+\r
+                       Store sourceStore = getManager().getStore(sourceStoreUri.getStoreId());\r
+                       String sourceStoreName = sourceStore.getName();\r
+                       template = sourceStoreName + "-" + template;\r
+                       logger.info(getMarker(), "Starting {} for {}", template, escortFileName);\r
+\r
+                       String sourceFileName = downloadable.getString("fileName");\r
+                       Map<String, Object> parameters = new HashMap<>();\r
+                       parameters.put("sourceStoreUri", sourceStoreUri);\r
+                       parameters.put("fileName", sourceFileName);\r
+                       parameters.put("tempStoreUri", tempStoreUri);\r
+                       parameters.put("targetStoreUri", targetStoreUri);\r
+                       parameters.put("expectedFrameNumber", downloadable.getLong("frames"));\r
+                       parameters.put("expectedSize", downloadable.getLong("size"));\r
+                       parameters.put("expectedColorSpace", downloadable.getString("colorSpace"));\r
+                       parameters.put("escortFile", escortFile.toAbsolutePath().toString());\r
+\r
+                       int priority = 50;\r
+\r
+                       //megszakitasok miatt a mar lejott mozikat vegyuk elore 20.09.09\r
+                       if (targetExists(tempStoreUri, sourceFileName))\r
+                               priority = 51;\r
+\r
+                       //parameterek: IJobRuntime parent, String template, String name, int priority, Map<String, Object> parameters\r
+                       IJobRuntime child = getEngine().submit(null, e -> {\r
+                               IJobRuntime r = (IJobRuntime) e.getSource();\r
+                               if (r.isDisableRetry())\r
+                                       return;\r
+\r
+                               if (e.getStatus().equals(JobStatus.CANCELED) || e.getStatus().equals(JobStatus.SUSPENDED))\r
+                                       EscortFiles.removeCatchedFile(escortFile);\r
+\r
+                               if (e.getStatus().equals(JobStatus.FINISHED) && "PBARCHIVE".equals(sourceStoreName)) {\r
+                                       try {\r
+                                               FtpDirectoryLister lister = (FtpDirectoryLister) sourceStoreUri.getLister();\r
+                                               RemoteFile remoteFile = lister.get(sourceFileName);\r
+                                               if (remoteFile == null)\r
+                                                       logger.info(getMarker(), "Remote file for {} is not available", sourceFileName);\r
+                                               else {\r
+                                                       logger.info(getMarker(), "Remote file {} successfully archived, deleting...",\r
+                                                                       sourceFileName);\r
+                                                       lister.delete(remoteFile);\r
+                                               }\r
+                                       } catch (Exception ex) {\r
+                                               logger.error(getMarker(), ex.getMessage());\r
+                                       } finally {\r
+                                               if (sourceStoreUri != null)\r
+                                                       sourceStoreUri.cleanUp();\r
+                                       }\r
+                               }\r
+\r
+                       }, template, "Archiválás", priority, IJobEngine.DEFAULT_OWNER, parameters);\r
+                       if (child == null)\r
+                               throw new Exception("Submit error.");\r
+\r
+                       child.setDescription(sourceFileName);\r
+\r
+                       child.setRelated(downloadable.getString("title") + " / " + sourceStoreName);\r
+\r
+                       EscortFiles.createCatchedFile(escortFile);\r
+\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+                       return false;\r
+               }\r
+\r
+               return true;\r
+       }\r
+\r
+       private boolean targetExists(StoreUri storeUri, String fileName) {\r
+               try {\r
+                       Path targetFile = Paths.get(storeUri.toString(true), fileName);\r
+                       if (targetFile.toFile().exists()) {\r
+                               logger.info(getMarker(), "Retrieved file {} exists", fileName);\r
+                               return true;\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.error(getMarker(), e.getMessage());\r
+               }\r
+               logger.info(getMarker(), "Retrieved file {} not exists yet", fileName);\r
+               return false;\r
+       }\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/ForkUploadStep.java b/server/-product/production/AMC/jobs/steps/ForkUploadStep.java
new file mode 100644 (file)
index 0000000..57b1801
--- /dev/null
@@ -0,0 +1,243 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.DirectoryStream;\r
+import java.nio.file.FileStore;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.attribute.BasicFileAttributes;\r
+import java.nio.file.attribute.FileTime;\r
+import java.text.NumberFormat;\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.JobStatus;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.db.Store;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class ForkUploadStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(String tempStoreName, String template, String expectedColorSpace, int limit) throws Exception {\r
+               DirectoryStream<Path> directoryStream = null;\r
+               int count = limit;\r
+               int allCount = 0;\r
+               int currentCount = 0;\r
+\r
+               try {\r
+                       StoreUri tempStoreUri = getManager().getStoreUri(tempStoreName, RemoteStoreProtocol.LOCAL);\r
+\r
+                       try {\r
+                               Path tempPath = Paths.get(tempStoreUri.toString(true));\r
+                               FileStore store = Files.getFileStore(tempPath.getRoot());\r
+                               NumberFormat nf = NumberFormat.getNumberInstance();\r
+                               logger.info(getMarker(), "Free space on temp {}", nf.format(store.getUsableSpace()));\r
+                       } catch (IOException e) {\r
+                               logger.error(getMarker(), e.getMessage());\r
+                       }\r
+\r
+                       Path path = Paths.get(tempStoreUri.toString(true), ".STATUS");\r
+\r
+                       List<Path> escortFiles = new ArrayList<>();\r
+                       directoryStream = Files.newDirectoryStream(path);\r
+                       for (Path escortFile : directoryStream) {\r
+                               if (getJobRuntime().isWaitingCancel()) {\r
+                                       cancel();\r
+                                       return null;\r
+                               }\r
+                               escortFiles.add(escortFile);\r
+                       }\r
+                       allCount = escortFiles.size();\r
+                       //a file neve az adasbakerules idopontjaval kezdodik\r
+                       //                      escortFiles.sort((p1, p2) -> {\r
+                       //                              return p1.compareTo(p2);\r
+                       //                      });\r
+\r
+                       //200911 megis inkabb a letrehozas idopontja legyen\r
+                       try {\r
+                               escortFiles.sort((p1, p2) -> {\r
+                                       int result = 0;\r
+                                       try {\r
+                                               FileTime mod1 = Files.readAttributes(p1, BasicFileAttributes.class).lastModifiedTime();\r
+                                               FileTime mod2 = Files.readAttributes(p2, BasicFileAttributes.class).lastModifiedTime();\r
+                                               result = mod1.compareTo(mod2);\r
+                                       } catch (Throwable e) {\r
+                                       }\r
+                                       return result;\r
+                               });\r
+                       } catch (Throwable e) {\r
+                       }\r
+\r
+                       if (allCount > 0) {\r
+                               for (Path escortFile : escortFiles) {\r
+                                       if (getJobRuntime().isWaitingCancel()) {\r
+                                               cancel();\r
+                                               break;\r
+                                       }\r
+\r
+                                       if (processPathItem(tempStoreUri, template, escortFile)) {\r
+                                               count--;\r
+                                               if (count == 0)\r
+                                                       break;\r
+                                       }\r
+                                       currentCount++;\r
+                                       int progress = currentCount * 100 / allCount;\r
+                                       setProgress(progress);\r
+                               }\r
+                       }\r
+\r
+                       setProgress(100);\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+                       throw e;\r
+               } finally {\r
+                       if (directoryStream != null) {\r
+                               try {\r
+                                       directoryStream.close();\r
+                               } catch (IOException e) {\r
+                               }\r
+                       }\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       private String getTSMFileName(long mediaId, StoreUri sourceStoreUri) {\r
+               String result = null;\r
+               Media media = getManager().getMedia(mediaId);\r
+\r
+               if (media != null) {\r
+                       List<MediaFile> mediaFiles = media.getMediaFiles();\r
+                       for (MediaFile mediaFile : mediaFiles) {\r
+                               if (mediaFile.getStoreId() == sourceStoreUri.getStoreId()) {\r
+                                       result = mediaFile.getRelativePath();\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+       private boolean processPathItem(StoreUri tempStoreUri, String template, Path escortFile) throws IOException {\r
+               if (escortFile.toFile().isDirectory())\r
+                       return false;\r
+\r
+               //ami nem JSON azt nem kezeljuk\r
+               if (!escortFile.getFileName().toString().toLowerCase().endsWith(EscortFiles.DOT_JSON))\r
+                       return false;\r
+\r
+               //aminek van COLORSPACE kiterjesztésű\r
+               //              Path colorspaceFile = Paths.get(escortFile.toString() + ".colorspace");\r
+               //              if (colorspaceFile.toFile().exists())\r
+               //                      return false;\r
+\r
+               if (EscortFiles.isCatchedFileExists(escortFile))\r
+                       return false;\r
+\r
+               String escortFileName = escortFile.getFileName().toString();\r
+               //minimum 3 karakter: STORENAME.FILENAME.MXF.JSON\r
+               long dotCount = escortFileName.chars().filter(ch -> ch == '.').count();\r
+               if (dotCount < 3)\r
+                       return false;\r
+\r
+               try {\r
+                       DownloadableMedia downloadable = EscortFiles.decode(escortFile);\r
+\r
+                       if (downloadable == null) {\r
+                               logger.error(getSessionMarker(), "Can't decode {}", escortFile);\r
+                               return false;\r
+                       }\r
+\r
+                       StoreUri sourceStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
+\r
+                       long mediaId = downloadable.getLong("mediaId");\r
+                       String tsmFileName = getTSMFileName(mediaId, sourceStoreUri);\r
+                       if (StringUtils.isBlank(tsmFileName)) {\r
+                               logger.error(getMarker(), "Media ID not exists anymore {}", mediaId);\r
+                               return false;\r
+                       }\r
+\r
+                       StoreUri targetStoreUri = getManager().getStoreUri(downloadable.getLong("targetStoreUriId"));\r
+\r
+                       Store targetStore = getManager().getStore(targetStoreUri.getStoreId());\r
+                       template = targetStore.getName() + "-" + template;\r
+                       logger.info(getMarker(), "Starting {} for {}", template, escortFileName);\r
+\r
+                       String targetFileName = downloadable.getString("fileName");\r
+\r
+                       Map<String, Object> parameters = new HashMap<>();\r
+                       parameters.put("sourceStoreUri", sourceStoreUri);\r
+                       parameters.put("tsmFileName", tsmFileName);\r
+                       parameters.put("fileName", targetFileName);\r
+                       parameters.put("tempStoreUri", tempStoreUri);\r
+                       parameters.put("targetStoreUri", targetStoreUri);\r
+                       parameters.put("relativeTargetPath", downloadable.getString("relativeTargetPath"));\r
+                       parameters.put("expectedFrameNumber", downloadable.getLong("frames"));\r
+                       parameters.put("expectedSize", downloadable.getLong("size"));\r
+                       parameters.put("expectedColorSpace", downloadable.getString("colorSpace"));\r
+                       parameters.put("escortFile", escortFile.toAbsolutePath().toString());\r
+\r
+                       //int priority = downloadable.containsKey("priority") ? downloadable.getInt("priority") : 0;\r
+                       //mindenki egyforman induljon 20.09.07\r
+                       //a NEXIO egy kicsit fontosabb 20.09.08. megsem 20.09.09\r
+                       //int priority = escortFile.toString().contains("NEXIO") ? 51 : 50;\r
+                       //megszakitasok miatt a mar lejott mozikat vegyuk elore 20.09.09\r
+\r
+                       int priority = 50;\r
+                       if (targetExists(tempStoreUri, targetFileName))\r
+                               priority = 51;\r
+\r
+                       //parameterek: IJobRuntime parent, String template, String name, int priority, Map<String, Object> parameters\r
+                       IJobRuntime child = getEngine().submit(null, e -> {\r
+                               IJobRuntime r = (IJobRuntime) e.getSource();\r
+                               if (r.isDisableRetry())\r
+                                       return;\r
+                               \r
+                               if (e.getStatus().equals(JobStatus.CANCELED) || e.getStatus().equals(JobStatus.SUSPENDED))\r
+                                       EscortFiles.removeCatchedFile(escortFile);\r
+                       }, template, "Visszatöltés", priority, IJobEngine.DEFAULT_OWNER, parameters);\r
+                       if (child == null)\r
+                               throw new Exception("Submit error.");\r
+\r
+                       child.setDescription(escortFileName);\r
+\r
+                       child.setRelated(downloadable.getString("title") + "|" + targetStore.getName());\r
+                       EscortFiles.createCatchedFile(escortFile);\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+                       return false;\r
+               }\r
+\r
+               return true;\r
+       }\r
+\r
+       private boolean targetExists(StoreUri storeUri, String fileName) {\r
+               try {\r
+                       Path targetFile = Paths.get(storeUri.toString(true), fileName);\r
+                       if (targetFile.toFile().exists()) {\r
+                               logger.info(getMarker(), "Retrieved file {} exists", fileName);\r
+                               return true;\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.error(getMarker(), e.getMessage());\r
+               }\r
+               logger.info(getMarker(), "Retrieved file {} not exists yet", fileName);\r
+               return false;\r
+       }\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/GenericArchiveCheckerStep.java b/server/-product/production/AMC/jobs/steps/GenericArchiveCheckerStep.java
new file mode 100644 (file)
index 0000000..60858b2
--- /dev/null
@@ -0,0 +1,94 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.Paths;\r
+import java.sql.Timestamp;\r
+import java.util.List;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class GenericArchiveCheckerStep extends JobStep {\r
+       private static final String DOT_MXF = ".MXF";\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       private boolean check(Timestamp modified, Timestamp created, Media media) {\r
+               boolean create = media == null;\r
+               create |= create || !media.getModified().equals(modified);\r
+               create |= create || !media.getCreated().equals(created);\r
+               return create;\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(String sourceStoreName, String protocol, String wildCard, String escortStoreName, int limit) throws Exception {\r
+               StoreUri sourceStoreUri = null;\r
+               int count = limit;\r
+\r
+               try {\r
+                       sourceStoreUri = getManager().getStoreUri(sourceStoreName, Enum.valueOf(RemoteStoreProtocol.class, protocol));\r
+                       StoreUri escortSoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
+                       StoreUri targetStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
+\r
+                       String outputPath = Paths.get(escortSoreUri.toString(true)).toString();\r
+\r
+                       //az FTP store nem tamogatja az asszinkron listazast\r
+                       List<RemoteFile> remoteFiles = sourceStoreUri.getRemoteFiles(wildCard);\r
+                       for (RemoteFile remoteFile : remoteFiles) {\r
+                               if (processClip(sourceStoreName, remoteFile, sourceStoreUri, targetStoreUri, outputPath))\r
+                                       count--;\r
+\r
+                               if (count == 0) {\r
+                                       logger.info("Limit reached: {}", limit);\r
+                                       break;\r
+                               }\r
+\r
+                       }\r
+               } catch (Exception e) {\r
+                       throw e;\r
+               } finally {\r
+                       if (sourceStoreUri != null)\r
+                               sourceStoreUri.cleanUp();\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       private boolean processClip(String storeName, RemoteFile remoteFile, StoreUri sourceStoreUri, StoreUri targetStoreUri, String outputPath) {\r
+               boolean result = false;\r
+               String title = remoteFile.getName();\r
+               Timestamp modified = Timestamp.from(remoteFile.getModify().toInstant());\r
+               Timestamp created = Timestamp.from(remoteFile.getCreated().toInstant());\r
+\r
+               //TODO a masolas alatt allo klippeket kiszurni\r
+               if (title.contains("."))\r
+                       title = title.substring(0, title.indexOf("."));\r
+               long size = remoteFile.getSize();\r
+\r
+               Media media = getManager().getMedia(title);\r
+\r
+               boolean createEscort = check(modified, created, media);\r
+\r
+               if (createEscort) {\r
+                       long mediaId = media == null ? 0 : media.getId();\r
+                       String fileName = title + DOT_MXF;\r
+                       DownloadableMedia archive = DownloadableMedia.create(title, fileName, modified, created, 0, size, sourceStoreUri.getId(), targetStoreUri.getId(),\r
+                                       mediaId);\r
+                       String escortFileName = storeName + "." + remoteFile.getName();\r
+                       try {\r
+                               result = EscortFiles.createMetadataIfNotExists(outputPath, escortFileName, archive.toPrettyString(""));\r
+                       } catch (IOException e) {\r
+                               logger.error("Escort file creation error.", e);\r
+                       }\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/HarrisMissingMaterialCheckerStep.java b/server/-product/production/AMC/jobs/steps/HarrisMissingMaterialCheckerStep.java
new file mode 100644 (file)
index 0000000..db18fdf
--- /dev/null
@@ -0,0 +1,172 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import com.ibm.nosql.json.api.BasicDBList;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.StoreUri;\r
+import user.commons.harris.HarrisRecord;\r
+import user.commons.harris.VICFileParser;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class HarrisMissingMaterialCheckerStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger(HarrisMissingMaterialCheckerStep.class);\r
+       private static final String lineFormat = System.getProperty("harris.vic.lineformat",\r
+                       "A TTTTTTTT     LLLLLLLLLLL MMMMMMMMMMMMMMMMMMMMMMM X   DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD");\r
+       private static final String validTypeCodes = System.getProperty("harris.vic.validtypecodes", "SPACE,E");\r
+       private static final String appendExtension = System.getProperty("missingmaterial.appendextension", ".mxf");\r
+\r
+       @StepEntry\r
+       public Object[] execute(BasicDBList vicFiles, String escortStoreName, String targetStoreName, String targetProtocol) throws Exception {\r
+               StoreUri escortStoreUri = null;\r
+               StoreUri targetStoreUri = null;\r
+               try {\r
+                       getJobRuntime().setRelated(targetStoreName + " restore");\r
+\r
+                       escortStoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
+                       targetStoreUri = getManager().getStoreUri(targetStoreName, Enum.valueOf(RemoteStoreProtocol.class, targetProtocol));\r
+                       StoreUri sourceStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
+                       List<HarrisRecord> records = null;\r
+                       for (Object vicFile : vicFiles) {\r
+                               if (getJobRuntime().isWaitingCancel()) {\r
+                                       cancel();\r
+                                       break;\r
+                               }\r
+\r
+                               Path vicFilePath = Paths.get(String.valueOf(vicFile));\r
+\r
+                               if (!vicFilePath.toFile().exists()) {\r
+                                       logger.warn("File not exists: {}", vicFilePath);\r
+                                       continue;\r
+                               }\r
+\r
+                               logger.info(getMarker(), "Processing {}", vicFilePath);\r
+                               records = processVICFile(records, vicFilePath);\r
+                       }\r
+\r
+                       if (records != null && !getJobRuntime().isWaitingCancel()) {\r
+                               FTPClient client = ((FtpDirectoryLister) targetStoreUri.getLister()).connect();\r
+                               logger.info(getMarker(), "Reading target file list");\r
+                               List<String> fileNames = Arrays.asList(client.listNames());\r
+                               logger.info(getMarker(), "Target file list reading completed, mediabase size is {}", fileNames.size());\r
+                               int i = 0;\r
+                               for (HarrisRecord record : records) {\r
+\r
+                                       if (getJobRuntime().isWaitingCancel()) {\r
+                                               cancel();\r
+                                               break;\r
+                                       }\r
+\r
+                                       boolean contains = fileNames.contains(record.getFileName() + ".lxf");\r
+                                       if (contains)\r
+                                               logger.info(getMarker(), "File {} already exists on {}", record.getFileName(), targetStoreName);\r
+                                       else\r
+                                               processRecord(record, targetStoreName, sourceStoreUri, targetStoreUri, escortStoreUri);\r
+                                       i++;\r
+                                       int progress = i * 100 / records.size();\r
+                                       setProgress(progress);\r
+                               }\r
+                       }\r
+\r
+                       if (records == null || records.size() == 0)\r
+                               logger.info(getMarker(), "Nothing to do");\r
+                       else\r
+                               logger.info(getMarker(), "Completed");\r
+\r
+                       setProgress(100);\r
+               } catch (Exception e) {\r
+                       logger.error(e.getMessage());\r
+                       throw e;\r
+               } finally {\r
+                       if (escortStoreUri != null)\r
+                               escortStoreUri.cleanUp();\r
+                       if (targetStoreUri != null)\r
+                               targetStoreUri.cleanUp();\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       private boolean processRecord(HarrisRecord record, String targetStoreName, StoreUri sourceStoreUri, StoreUri targetStoreUri, StoreUri escortStoreUri)\r
+                       throws Exception {\r
+\r
+               String fileName = record.getFileName();\r
+               String outputPath = Paths.get(escortStoreUri.toString(true)).toString();\r
+\r
+               if (StringUtils.isNotBlank(appendExtension))\r
+                       fileName += appendExtension;\r
+\r
+               String escortFileName = targetStoreName + "." + fileName;\r
+\r
+               //ha mar letezik, nem toltjuk fel ujra (a vic fajlbol kezzel torlik valamikor...)\r
+               try {\r
+                       if (EscortFiles.isMetadataExists(outputPath, escortFileName)) {\r
+                               logger.debug(getMarker(), "Status file already exists {}", escortFileName);\r
+                               return true;\r
+                       }\r
+               } catch (IOException e1) {\r
+                       logger.info(getMarker(), "Status file check error for {}", fileName);\r
+                       return true;\r
+               }\r
+\r
+               //nincs bent MC-ben\r
+               Media media = getManager().getMedia(record.getFileName());\r
+               if (media == null) {\r
+                       logger.warn(getSessionMarker(), "File is not available in archive {}", record.getFileName());\r
+                       return true;\r
+               }\r
+\r
+               //              if (existsOnNexio(record, targetStoreName, targetStoreUri)) {\r
+               //                      logger.info(getMarker(),  "File {} already exists on {}", record.getFileName(), targetStoreName);\r
+               //                      return false;\r
+               //              }\r
+\r
+               DownloadableMedia downloadable = DownloadableMedia.create(media.getTitle(), fileName, media.getModified(), media.getCreated(), media.getLength(), 0L,\r
+                               sourceStoreUri.getId(), targetStoreUri.getId(), media.getId());\r
+\r
+               //alapbol magasabb (1-99)\r
+               downloadable.put("priority", 50);\r
+               downloadable.put("isNexio", true);\r
+\r
+               try {\r
+                       EscortFiles.createMetadata(outputPath, escortFileName, downloadable.toPrettyString(""));\r
+                       logger.info(getMarker(), "Status file created {}", escortFileName);\r
+               } catch (Exception e) {\r
+                       logger.error("Can't create escort file {}. System message is: {}", escortFileName, e.getMessage());\r
+               }\r
+               return true;\r
+       }\r
+\r
+       private List<HarrisRecord> processVICFile(List<HarrisRecord> records, Path vicFilePath) {\r
+               VICFileParser parser = null;\r
+               try {\r
+                       parser = new VICFileParser(vicFilePath, lineFormat, validTypeCodes);\r
+\r
+                       List<HarrisRecord> currentRecords = parser.getRecords();\r
+                       if (records == null)\r
+                               records = currentRecords;\r
+                       else {\r
+                               if (currentRecords != null)\r
+                                       records.addAll(currentRecords);\r
+                       }\r
+\r
+               } catch (Exception e) {\r
+                       logger.error(e.getMessage());\r
+               }\r
+               return records;\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/MetadataPersisterStep.java b/server/-product/production/AMC/jobs/steps/MetadataPersisterStep.java
new file mode 100644 (file)
index 0000000..2a04cc4
--- /dev/null
@@ -0,0 +1,118 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.sql.Timestamp;\r
+import java.time.Instant;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.StoreUri;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.Item;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class MetadataPersisterStep extends JobStep {\r
+       private static final String GENERIC = "Generic";\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(StoreUri targetStoreUri, String escortFile) throws Exception {\r
+               try {\r
+\r
+                       Path escortFilePath = Paths.get(escortFile);\r
+                       //ha nem ment at a letoltott file az ellenorzesen, akkor már torolve lett\r
+                       if (escortFilePath.toFile().exists()) {\r
+                               String escortFileName = escortFilePath.getFileName().toString();\r
+                               String sourceStoreName = escortFileName.substring(0, escortFileName.indexOf("."));\r
+                               DownloadableMedia downloadable = EscortFiles.decode(escortFilePath);\r
+                               String title = downloadable.getString("title");\r
+                               String fileName = downloadable.getString("fileName");\r
+                               long mediaId = downloadable.containsKey("mediaId") ? downloadable.getLong("mediaId") : 0;\r
+                               String fileTypeName = fileName.substring(fileName.lastIndexOf(".") + 1).toUpperCase();\r
+\r
+                               IItemManager manager = getManager();\r
+\r
+                               if (mediaId == 0) {\r
+                                       mediaId = tryGetMediaId(title, mediaId);\r
+                               }\r
+\r
+                               //TODO ha van mediaId, akkor update!!!!!!!!!\r
+\r
+                               Timestamp modified = downloadable.getTimestamp("modified");\r
+                               Timestamp created = downloadable.getTimestamp("created");\r
+                               long frames = downloadable.getLong("frames");\r
+\r
+                               String targetStoreName = getManager().getStore(targetStoreUri.getStoreId()).getName();\r
+                               if (mediaId == 0) {\r
+                                       //ez elszallhat, mert nincs filetype vagy store\r
+                                       MediaFile mediaFile = manager.createMediaFile(fileName, fileTypeName, targetStoreName);\r
+                                       //ez elszallhat, mert nincs itemtype\r
+                                       Item item = manager.createItem(GENERIC, title, sourceStoreName, null);\r
+                                       //ez elszallhat, mert nincs itemtype\r
+                                       Media media = manager.createMedia(GENERIC, title, sourceStoreName, null);\r
+\r
+                                       //TODO megoldani  egy tranzakcioban\r
+                                       item.add();\r
+                                       media.setItemId(item.getId());\r
+                                       media.setLength(frames);\r
+                                       media.setCreated(created);\r
+                                       media.setModified(modified);\r
+                                       media.setArchived(Timestamp.from(Instant.now()));\r
+                                       media.add();\r
+\r
+                                       //TODO\r
+                                       //mediaFile.setFileSize(fileSize);\r
+                                       mediaFile.setMediaId(media.getId());\r
+                                       mediaFile.setLastModified(modified);\r
+                                       mediaFile.add();\r
+                               } else {\r
+                                       Media media = manager.getMedia(mediaId);\r
+                                       media.setLength(frames);\r
+                                       media.setCreated(created);\r
+                                       media.setModified(modified);\r
+                                       media.setArchived(Timestamp.from(Instant.now()));\r
+                                       manager.modify(media);\r
+\r
+                                       //TODO\r
+                                       //mediaFile.setFileSize(fileSize);\r
+                                       MediaFile mediaFile = manager.getSystemMediaFile(media);\r
+                                       if (mediaFile == null) {\r
+                                               mediaFile = manager.createMediaFile(fileName, fileTypeName, targetStoreName);\r
+                                               mediaFile.setMediaId(media.getId());\r
+                                               mediaFile.setLastModified(modified);\r
+                                               mediaFile.add();\r
+                                       } else {\r
+                                               mediaFile.setRelativePath(fileName);\r
+                                               mediaFile.setLastModified(modified);\r
+                                               manager.modify(mediaFile);\r
+                                       }\r
+                               }\r
+\r
+                       } else\r
+                               logger.error(getMarker(), "Status file does not exists {}", escortFilePath);\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+                       throw e;\r
+               }\r
+               return null;\r
+       }\r
+\r
+       private long tryGetMediaId(String title, long mediaId) {\r
+               Media media = null;\r
+               //duplikatum miatt\r
+               try {\r
+                       media = getManager().getMedia(title);\r
+                       if (media != null)\r
+                               mediaId = media.getId();\r
+               } catch (Exception e) {\r
+                       logger.error(getMarker(), "Media with title {} is not available. System message is: {}", title, e.getMessage());\r
+               }\r
+               return mediaId;\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/NEXIO1TransferFromStep.java b/server/-product/production/AMC/jobs/steps/NEXIO1TransferFromStep.java
new file mode 100644 (file)
index 0000000..7963459
--- /dev/null
@@ -0,0 +1,30 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.StoreUri;\r
+\r
+public class NEXIO1TransferFromStep extends TransferStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @Override\r
+       @StepEntry\r
+       public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+               Object[] result = null;\r
+               try {\r
+                       Path targetFile = Paths.get(targetStoreUri.toString(true), targetFileName);\r
+                       if (targetFile.toFile().exists()) {\r
+                               logger.info(getMarker(), "Using previously retrived file {}", targetFile);\r
+                       } else {\r
+                               result = super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.error(getMarker(), e.getMessage());\r
+               }\r
+               return result;\r
+       }\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/NEXIO1TransferToStep.java b/server/-product/production/AMC/jobs/steps/NEXIO1TransferToStep.java
new file mode 100644 (file)
index 0000000..5af53df
--- /dev/null
@@ -0,0 +1,54 @@
+package user.jobengine.server.steps;\r
+\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+\r
+public class NEXIO1TransferToStep extends TransferStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @Override\r
+       @StepEntry\r
+       public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+               //\r
+               //              try {\r
+               //                      String title = targetFileName;\r
+               //                      if (title.contains("."))\r
+               //                              title = title.substring(0, title.lastIndexOf("."));\r
+               //                      RemoteFile remoteFile = targetStoreUri.getFileWithContent(title + ".xml");\r
+               //                      if (remoteFile != null && remoteFile.getContent() != null) {\r
+               //                              logger.info("File already exists on NEXIO1 {}", targetFileName);\r
+               //                              return null;\r
+               //                      }\r
+               //              } catch (Exception e) {\r
+               //                      logger.error(e.getMessage());\r
+               //              } finally {\r
+               //                      targetStoreUri.cleanUp();\r
+               //              }\r
+/*\r
+               try {\r
+                       FTPClient client = ((FtpDirectoryLister) targetStoreUri.getLister()).connect();\r
+                       logger.info(getMarker(), "Reading target file list");\r
+                       List<String> fileNames = Arrays.asList(client.listNames());\r
+                       logger.info(getMarker(), "Target file list reading completed, mediabase size is {}", fileNames.size());\r
+                       String title = targetFileName.replace(".mxf", ".lxf");\r
+                       boolean contains = fileNames.contains(title);\r
+                       if (contains) {\r
+                               logger.info(getMarker(), "File already exists {} on {}", title, getManager().getStore(targetStoreUri.getStoreId()).getName());\r
+                               return null;\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+               } finally {\r
+                       targetStoreUri.cleanUp();\r
+               }\r
+*/\r
+               return super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+       }\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/NEXIO2TransferFromStep.java b/server/-product/production/AMC/jobs/steps/NEXIO2TransferFromStep.java
new file mode 100644 (file)
index 0000000..a698c6e
--- /dev/null
@@ -0,0 +1,30 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.StoreUri;\r
+\r
+public class NEXIO2TransferFromStep extends TransferStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @Override\r
+       @StepEntry\r
+       public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+               Object[] result = null;\r
+               try {\r
+                       Path targetFile = Paths.get(targetStoreUri.toString(true), targetFileName);\r
+                       if (targetFile.toFile().exists()) {\r
+                               logger.info(getMarker(), "Using previously retrived file {}", targetFile);\r
+                       } else {\r
+                               result = super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.error(getMarker(), e.getMessage());\r
+               }\r
+               return result;\r
+       }\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/NEXIO2TransferToStep.java b/server/-product/production/AMC/jobs/steps/NEXIO2TransferToStep.java
new file mode 100644 (file)
index 0000000..20c81a6
--- /dev/null
@@ -0,0 +1,53 @@
+package user.jobengine.server.steps;\r
+\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+\r
+public class NEXIO2TransferToStep extends TransferStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @Override\r
+       @StepEntry\r
+       public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+               //              try {\r
+               //                      String title = targetFileName;\r
+               //                      if (title.contains("."))\r
+               //                              title = title.substring(0, title.lastIndexOf("."));\r
+               //                      RemoteFile remoteFile = targetStoreUri.getFileWithContent(title + ".xml");\r
+               //                      if (remoteFile != null && remoteFile.getContent() != null) {\r
+               //                              logger.info("File already exists on NEXIO2 {}", targetFileName);\r
+               //                              return null;\r
+               //                      }\r
+               //              } catch (Exception e) {\r
+               //                      logger.error(e.getMessage());\r
+               //              } finally {\r
+               //                      targetStoreUri.cleanUp();\r
+               //              }\r
+/*\r
+               try {\r
+                       FTPClient client = ((FtpDirectoryLister) targetStoreUri.getLister()).connect();\r
+                       logger.info(getMarker(), "Reading target file list");\r
+                       List<String> fileNames = Arrays.asList(client.listNames());\r
+                       logger.info(getMarker(), "Target file list reading completed, mediabase size is {}", fileNames.size());\r
+                       String title = targetFileName.replace(".mxf", ".lxf");\r
+                       boolean contains = fileNames.contains(title);\r
+                       if (contains) {\r
+                               logger.info(getMarker(), "File already exists {} on {}", title, getManager().getStore(targetStoreUri.getStoreId()).getName());\r
+                               return null;\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+               } finally {\r
+                       targetStoreUri.cleanUp();\r
+               }\r
+*/\r
+               return super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+       }\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/NEXIOArchiveCheckerStep.java b/server/-product/production/AMC/jobs/steps/NEXIOArchiveCheckerStep.java
new file mode 100644 (file)
index 0000000..0548517
--- /dev/null
@@ -0,0 +1,188 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.Paths;\r
+import java.sql.Timestamp;\r
+import java.text.SimpleDateFormat;\r
+import java.time.Duration;\r
+import java.time.Instant;\r
+import java.util.Iterator;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.StoreUri;\r
+import user.commons.nexio.api.Clip;\r
+import user.commons.nexio.api.ClipNotFoundException;\r
+import user.commons.nexio.api.Controller;\r
+import user.commons.nexio.api.Mediabase;\r
+import user.commons.nexio.server.protocol.ProtocolException;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+import user.jobengine.db.MediaFile;\r
+\r
+public class NEXIOArchiveCheckerStep extends JobStep {\r
+       private static final String DOT_MXF = ".mxf";\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd-HHmmss");\r
+\r
+       private boolean check(Timestamp modified, Timestamp created, int duration, Media media, int videoFormat, int lastModifiedHours) {\r
+               String title = media.getTitle();\r
+\r
+               //formatum\r
+               if (!(videoFormat == 3 || videoFormat == 19)) {\r
+                       logger.debug(getMarker(), "{} unsupported video format", videoFormat);\r
+                       return false;\r
+               }\r
+\r
+               if (!checkModifiedByTime(title, modified, lastModifiedHours))\r
+                       return false;\r
+\r
+               //utolso modositas\r
+               MediaFile mediaFile = getManager().getSystemMediaFile(media);\r
+               boolean isModified = true;\r
+               if (mediaFile == null) {\r
+                       logger.info(getMarker(), "{} system media file not available", title);\r
+                       return false;\r
+               }\r
+\r
+               String mcMod = df.format(mediaFile.getLastModified());\r
+               String nexioMod = df.format(modified);\r
+               isModified = mcMod.compareTo(nexioMod) < 0;\r
+               if (isModified) {\r
+                       logger.info(getMarker(), "{} modification time: MC {} < NEXIO {}", title, mcMod, nexioMod);\r
+                       return true;\r
+               }\r
+\r
+               boolean isLengthChanged = media.getLength() > 0 && Math.abs(media.getLength() - duration) > 3;\r
+               if (isLengthChanged) {\r
+                       logger.info(getMarker(), "{} length: MC {} != NEXIO {}", title, media.getLength(), duration);\r
+                       return true;\r
+               }\r
+\r
+               return false;\r
+       }\r
+\r
+       private boolean checkModifiedByTime(String title, Timestamp modified, int lastModifiedHours) {\r
+               //utolso modositas a mosthoz kepest\r
+               //The result of this method can be a negative period if the end is before the start.\r
+               long modifiedHours = Duration.between(modified.toInstant(), Instant.now()).toHours();\r
+               if (modifiedHours < 0) {\r
+                       logger.info(getMarker(), "{} modification time greather than now", title);\r
+                       return false;\r
+               }\r
+               if (modifiedHours < lastModifiedHours) {\r
+                       logger.debug(getMarker(), "{} modification time is too cloose for now", title);\r
+                       return false;\r
+               }\r
+\r
+               return true;\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(String sourceStoreName, String escortStoreName, int lastModifiedHours) throws Exception {\r
+               Controller controller = null;\r
+\r
+               try {\r
+                       getJobRuntime().setRelated(sourceStoreName + " archive");\r
+\r
+                       StoreUri nexioStoreUri = getManager().getStoreUri(sourceStoreName, RemoteStoreProtocol.NEXIO);\r
+                       StoreUri sourceStoreUri = getManager().getStoreUri(sourceStoreName, RemoteStoreProtocol.FTP);\r
+                       StoreUri targetStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
+                       StoreUri escortStoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
+                       String outputPath = Paths.get(escortStoreUri.toString(true)).toString();\r
+\r
+                       logger.info(getMarker(), "Connecting mediabase {}", nexioStoreUri.toString());\r
+                       if (nexioStoreUri.getPortNumber() == 0)\r
+                               controller = new Controller(nexioStoreUri.getUri(), nexioStoreUri.getPortNumber());\r
+                       else\r
+                               controller = new Controller(nexioStoreUri.getUri());\r
+                       controller.connect();\r
+                       Mediabase mediabase = controller.getMediabase();\r
+\r
+                       Iterator<Clip> clips = mediabase.getClips();\r
+                       logger.info(getMarker(), "Processing clips");\r
+\r
+                       processClips(sourceStoreName, sourceStoreUri, targetStoreUri, outputPath, clips, lastModifiedHours);\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage() == null ? "Unknown error" : e.getMessage());\r
+                       throw e;\r
+               } finally {\r
+                       setProgress(100);\r
+                       if (controller != null)\r
+                               controller.disconnect();\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       private void processClips(String storeName, StoreUri sourceStoreUri, StoreUri targetStoreUri, String outputPath, Iterator<Clip> clips,\r
+                       int lastModifiedHours) throws ClipNotFoundException, IOException, ProtocolException {\r
+               int processed = 0;\r
+               while (clips.hasNext()) {\r
+\r
+                       if (getJobRuntime().isWaitingCancel()) {\r
+                               cancel();\r
+                               break;\r
+                       }\r
+\r
+                       Clip clip = clips.next();\r
+\r
+                       try {\r
+                               String title = null;\r
+                               Timestamp created = null;\r
+                               Timestamp modified = null;\r
+                               int frames = 0;\r
+                               int videoFormat = 0;\r
+                               frames = clip.getDuration();\r
+\r
+                               //ures clip\r
+                               if (frames == 1)\r
+                                       continue;\r
+\r
+                               title = clip.getXid().get();\r
+                               created = Timestamp.from(clip.getRecordDateTimestamp().toInstant());\r
+                               modified = Timestamp.from(clip.getModifiedTimestamp().toInstant());\r
+                               videoFormat = clip.getVideoFormat();\r
+\r
+                               Media media = getManager().getMedia(title);\r
+                               logger.debug(getMarker(), "Checking {}", title);\r
+                               boolean createEscort = false;\r
+\r
+                               long mediaId = 0;\r
+                               if (media == null) {\r
+                                       if (checkModifiedByTime(title, modified, lastModifiedHours)) {\r
+                                               createEscort = true;\r
+                                               logger.info(getMarker(), "{} not archived yet", title);\r
+                                       }\r
+                               } else {\r
+                                       mediaId = media.getId();\r
+                                       createEscort = check(modified, created, frames, media, videoFormat, lastModifiedHours);\r
+                               }\r
+\r
+                               if (createEscort && !title.contains("*")) {\r
+                                       String fileName = title + DOT_MXF;\r
+                                       DownloadableMedia downloadable = DownloadableMedia.create(title, fileName, modified, created, frames, 0, sourceStoreUri.getId(),\r
+                                                       targetStoreUri.getId(), mediaId);\r
+                                       String escortFileName = storeName + "." + downloadable.getString("fileName");\r
+                                       if (EscortFiles.createMetadataIfNotExists(outputPath, escortFileName, downloadable.toPrettyString(""))) {\r
+                                               logger.info(getMarker(), "Archive status file created for {}", fileName);\r
+                                       } else {\r
+                                               logger.info(getMarker(), "Archive status file already exists for {}", fileName);\r
+                                       }\r
+\r
+                               }\r
+\r
+                               processed++;\r
+                               if (processed % 100 == 0)\r
+                                       logger.info(getMarker(), "Processed {} records", processed);\r
+                       } catch (Exception e) {\r
+                               logger.error(getSessionMarker(), e.getMessage());\r
+                               continue;\r
+                       }\r
+               }\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/NEXIOMetadataPersisterStep.java b/server/-product/production/AMC/jobs/steps/NEXIOMetadataPersisterStep.java
new file mode 100644 (file)
index 0000000..ffaf54a
--- /dev/null
@@ -0,0 +1,110 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.sql.Timestamp;\r
+import java.text.SimpleDateFormat;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.w3c.dom.Document;\r
+import org.w3c.dom.Node;\r
+import org.w3c.dom.NodeList;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class NEXIOMetadataPersisterStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String DOT_XML = ".xml";\r
+\r
+       @StepEntry\r
+       public Object[] execute(StoreUri targetStoreUri, String escortFile) throws Exception {\r
+               try {\r
+                       Path escortFilePath = Paths.get(escortFile);\r
+                       if (!escortFilePath.toFile().exists()) {\r
+                               logger.error(getMarker(), "Status file does not exists {}", escortFilePath);\r
+                               return null;\r
+                       }\r
+\r
+                       DownloadableMedia downloadable = EscortFiles.decode(escortFilePath);\r
+                       if (!downloadable.containsKey("isNexio") || !downloadable.getBoolean("isNexio"))\r
+                               return null;\r
+\r
+                       if (!downloadable.containsKey("mediaId"))\r
+                               throw new NullPointerException("No media ID found for " + downloadable.getString("title"));\r
+\r
+                       Media media = getManager().getMedia(downloadable.getLong("mediaId"));\r
+                       MediaFile mediaFile = getManager().getSystemMediaFile(media);\r
+                       if (mediaFile == null)\r
+                               throw new NullPointerException("No TSM media file found for " + downloadable.getString("title"));\r
+\r
+                       RemoteFile remoteFile = targetStoreUri.getFileWithContent(downloadable.getString("title") + ".xml");\r
+\r
+                       //TODO mediafile lastmodified = feltoltott file nexio xml lastmodified\r
+                       Timestamp lastModified = getLastModified(remoteFile);\r
+                       logger.info("Setting last modification time on {} to {}", downloadable.getString("title"), lastModified);\r
+                       mediaFile.setLastModified(lastModified);\r
+                       getManager().modify(mediaFile);\r
+\r
+                       //                      if (!RemoteStoreProtocol.FTP.equals(targetStoreUri.getProtocol()))\r
+                       //                              return null;\r
+\r
+                       //\r
+                       //                      String title = downloadable.getString("title");\r
+                       //                      String fileName = downloadable.getString("fileName");\r
+                       //                      Date created = downloadable.getDate("created");\r
+                       //                      Date modified = downloadable.getDate("modified");\r
+                       //                      byte[] metadata = EscortFiles.createNEXIODatesMeta(title, created, modified);\r
+                       //                      uploadMeta(targetStoreUri, fileName, metadata);\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+                       throw e;\r
+               } finally {\r
+                       if (targetStoreUri != null)\r
+                               targetStoreUri.cleanUp();\r
+               }\r
+               return null;\r
+       }\r
+\r
+       private Timestamp getLastModified(RemoteFile remoteFile) throws Exception {\r
+               Timestamp result = null;\r
+               Document document = EscortFiles.createNEXIOMeta(remoteFile.getContent());\r
+               Node firstChild = document.getFirstChild();\r
+               NodeList list = firstChild.getChildNodes();\r
+               for (int i = 0; i < list.getLength(); i++) {\r
+                       Node item = list.item(i);\r
+                       if (item.getNodeName().equals("ModifiedTimeStamp")) {\r
+                               SimpleDateFormat df = new SimpleDateFormat("MM-dd-yyyy (HH:mm:ss)");\r
+                               result = Timestamp.from(df.parse(item.getTextContent()).toInstant());\r
+                               break;\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+\r
+       //      private void uploadMeta(StoreUri storeUri, String fileName, byte[] metadata) throws Exception {\r
+       //              logger.info(getMarker(), "Uploading metadata for {}", fileName);\r
+       //              OutputStream outStream = null;\r
+       //              try {\r
+       //                      FTPClient sourceFtp = ((FtpDirectoryLister) storeUri.getLister()).connect();\r
+       //                      outStream = sourceFtp.storeFileStream(fileName + DOT_XML);\r
+       //                      if (outStream == null)\r
+       //                              throw new NullPointerException("Can not create: " + fileName + DOT_XML + " on FTP. Reply is:" + sourceFtp.getReplyString());\r
+       //                      outStream.write(metadata);\r
+       //                      outStream.flush();\r
+       //              } catch (Exception e) {\r
+       //                      logger.catching(e);\r
+       //                      throw e;\r
+       //              } finally {\r
+       //                      if (outStream != null)\r
+       //                              outStream.close();\r
+       //                      storeUri.cleanUp();\r
+       //              }\r
+       //      }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/PASAPOOLTransferToStep.java b/server/-product/production/AMC/jobs/steps/PASAPOOLTransferToStep.java
new file mode 100644 (file)
index 0000000..0c69ee3
--- /dev/null
@@ -0,0 +1,102 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\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.MarkerManager;\r
+\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.mediaarea.MediaArea;\r
+import user.commons.strings.FileSizeUtils;\r
+\r
+public class PASAPOOLTransferToStep extends TransferStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String CODEC_PROFILE_HIGH = "HIGH";\r
+       private static final String CODEC_PROFILE_MAIN = "MAIN";\r
+       private static final String CODEC_PROFILE_422 = "4:2:2";\r
+       private static final String DISPLAY_ASPECT_16_9 = "16:9";\r
+       private static final String DISPLAY_ASPECT_4_3 = "4:3";\r
+       private StoreUri sourceStoreUri;\r
+       private String sourceFileName;\r
+       private Marker marker = MarkerManager.getMarker("MEDIAPROFILE");\r
+\r
+       @Override\r
+       @StepEntry\r
+       public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+               this.sourceStoreUri = sourceStoreUri;\r
+               this.sourceFileName = sourceFileName;\r
+               long start = System.currentTimeMillis();\r
+               Object[] result = super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+               RemoteFile remoteFile = sourceStoreUri.getRemoteFile(targetFileName);\r
+               if (remoteFile != null && remoteFile.getSize() > 0) {\r
+                       long diff = (System.currentTimeMillis() - start) / 1000;\r
+                       if (diff > 0) {\r
+                               long bytesSpeed = remoteFile.getSize() / diff;\r
+                               String speed = FileSizeUtils.sizeAsString(bytesSpeed);\r
+                               logger.info(getMarker(), "{} size is {}, upload speed was {}/sec", targetFileName, FileSizeUtils.sizeAsString(remoteFile.getSize()), speed);\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+\r
+       @Override\r
+       protected StoreUri getTargetStoreUri(StoreUri targetStoreUri) {\r
+               StoreUri result = targetStoreUri;\r
+               try {\r
+                       Path filePath = Paths.get(sourceStoreUri.toString(true), sourceFileName);\r
+                       MediaArea mi = new MediaArea(filePath);\r
+                       mi.process();\r
+\r
+                       if (isHD(mi)) {\r
+                               logger.info(marker, "{} is MOVED_HD", sourceFileName);\r
+                               result = getManager().getStoreUri("PEABLEBEACH", targetStoreUri.getProtocol());\r
+                               return result;\r
+                       }\r
+\r
+                       if (isSD_HIGH_16_9(mi)) {\r
+                               logger.info(marker, "{} is CONVSD16_9", sourceFileName);\r
+                               result = getManager().getStoreUri("SELENIOPOOL_16_9", targetStoreUri.getProtocol());\r
+                               return result;\r
+                       }\r
+\r
+                       if (isSD_HIGH_4_3(mi)) {\r
+                               logger.info(marker, "{} is CONVSD4_3", sourceFileName);\r
+                               result = getManager().getStoreUri("SELENIOPOOL_4_3", targetStoreUri.getProtocol());\r
+                               return result;\r
+                       }\r
+\r
+                       if (isSD_MAIN_422(mi)) {\r
+                               logger.info(marker, "{} is MOVED_SD", sourceFileName);\r
+                               result = getManager().getStoreUri("PEABLEBEACH", targetStoreUri.getProtocol());\r
+                               return result;\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private boolean isHD(MediaArea mi) {\r
+               return mi.getHeight() == 1080;\r
+       }\r
+\r
+       private boolean isSD_HIGH_16_9(MediaArea mi) {\r
+               String formatProfileName = mi.getFormatProfileName();\r
+               return mi.getHeight() < 650 && formatProfileName.contains(CODEC_PROFILE_HIGH) && DISPLAY_ASPECT_16_9.equals(mi.getDisplayAspect());\r
+       }\r
+\r
+       private boolean isSD_HIGH_4_3(MediaArea mi) {\r
+               String formatProfileName = mi.getFormatProfileName();\r
+               return mi.getHeight() < 650 && formatProfileName.contains(CODEC_PROFILE_HIGH) && DISPLAY_ASPECT_4_3.equals(mi.getDisplayAspect());\r
+       }\r
+\r
+       private boolean isSD_MAIN_422(MediaArea mi) {\r
+               String formatProfileName = mi.getFormatProfileName();\r
+               return mi.getHeight() < 650 && (formatProfileName.contains(CODEC_PROFILE_MAIN) || formatProfileName.contains(CODEC_PROFILE_422));\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/PBARCHIVETransferFromStep.java b/server/-product/production/AMC/jobs/steps/PBARCHIVETransferFromStep.java
new file mode 100644 (file)
index 0000000..d47c2b7
--- /dev/null
@@ -0,0 +1,21 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.StoreUri;\r
+\r
+public class PBARCHIVETransferFromStep extends TransferStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @Override\r
+       @StepEntry\r
+       public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+               Object[] result = null;\r
+               result = super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+               return result;\r
+       }\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/PBArchiveCheckerStep.java b/server/-product/production/AMC/jobs/steps/PBArchiveCheckerStep.java
new file mode 100644 (file)
index 0000000..75b1a35
--- /dev/null
@@ -0,0 +1,151 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.Paths;\r
+import java.sql.Timestamp;\r
+import java.time.Duration;\r
+import java.time.Instant;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.nexio.api.ClipNotFoundException;\r
+import user.commons.nexio.server.protocol.ProtocolException;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class PBArchiveCheckerStep extends JobStep {\r
+       private static final String DOT_MXF = ".mxf";\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       private boolean checkModifiedByTime(String title, Timestamp modified, int lastModifiedHours) {\r
+               long modifiedHours = Duration.between(modified.toInstant(), Instant.now()).toHours();\r
+               if (modifiedHours < 0) {\r
+                       logger.info(getMarker(), "{} modification time greather than now", title);\r
+                       return false;\r
+               }\r
+               if (modifiedHours < lastModifiedHours) {\r
+                       logger.info(getMarker(), "{} modification time is too cloose for now", title);\r
+                       return false;\r
+               }\r
+\r
+               return true;\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(String sourceStoreName, String escortStoreName, int lastModifiedHours) throws Exception {\r
+               logger.info(getMarker(), "Started {}", sourceStoreName);\r
+               StoreUri sourceStoreUri = null;\r
+               try {\r
+                       getJobRuntime().setRelated(sourceStoreName + " archive");\r
+\r
+                       sourceStoreUri = getManager().getStoreUri(sourceStoreName, RemoteStoreProtocol.FTP);\r
+\r
+                       StoreUri targetStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
+                       StoreUri escortStoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
+                       String outputPath = Paths.get(escortStoreUri.toString(true)).toString();\r
+\r
+                       FtpDirectoryLister lister = (FtpDirectoryLister) sourceStoreUri.getLister();\r
+                       FTPClient client = lister.connect();\r
+                       //a StoreUri alapu listazas nem mukodik, miota a working directory beallitas fix\r
+                       List<RemoteFile> remoteFiles = new ArrayList<>();\r
+\r
+                       String[] listNames = client.listNames();\r
+                       for (String f : listNames) {\r
+                               logger.info(getMarker(), "File name is {}", f);\r
+\r
+                               try {\r
+                                       RemoteFile remoteFile = lister.get(f);\r
+                                       if (remoteFile == null)\r
+                                               logger.info(getMarker(), "Remote file for {} is not available", f);\r
+                                       else\r
+                                               remoteFiles.add(remoteFile);\r
+\r
+                               } catch (Exception iex) {\r
+                                       logger.error(getMarker(), iex.getMessage());\r
+                               }\r
+                       }\r
+\r
+                       logger.info(getMarker(), "Found {} files in working dir {}", remoteFiles.size(),\r
+                                       client.printWorkingDirectory());\r
+                       processClips(sourceStoreName, sourceStoreUri, targetStoreUri, outputPath, remoteFiles, lastModifiedHours);\r
+\r
+               } catch (Exception e) {\r
+                       logger.error(getMarker(), e.getMessage());\r
+                       logger.error(getSessionMarker(), e.getMessage() == null ? "Unknown error" : e.getMessage());\r
+                       throw e;\r
+               } finally {\r
+                       if (sourceStoreUri != null)\r
+                               sourceStoreUri.cleanUp();\r
+                       setProgress(100);\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       private void processClips(String storeName, StoreUri sourceStoreUri, StoreUri targetStoreUri, String outputPath,\r
+                       List<RemoteFile> remoteFiles, int lastModifiedHours)\r
+                       throws ClipNotFoundException, IOException, ProtocolException {\r
+               for (RemoteFile remoteFile : remoteFiles) {\r
+\r
+                       if (getJobRuntime().isWaitingCancel()) {\r
+                               //logger.info("CANCELED");\r
+                               cancel();\r
+                               break;\r
+                       }\r
+                       try {\r
+\r
+                               String title = null;\r
+                               Timestamp created = null;\r
+                               Timestamp modified = null;\r
+                               title = remoteFile.getName();\r
+\r
+                               int dotIdx = title.lastIndexOf(".");\r
+                               if (dotIdx > -1)\r
+                                       title = title.substring(0, dotIdx);\r
+\r
+                               created = remoteFile.getCreated();\r
+                               modified = remoteFile.getModify();\r
+\r
+                               logger.info(getMarker(), "{} created {} modified {}", title, created, modified);\r
+                               Media media = getManager().getMedia(title);\r
+                               boolean createEscort = false;\r
+\r
+                               if (checkModifiedByTime(title, modified, lastModifiedHours))\r
+                                       createEscort = true;\r
+\r
+                               if (!createEscort)\r
+                                       continue;\r
+\r
+                               if (createEscort) {\r
+                                       long mediaId = 0;\r
+                                       if (media != null)\r
+                                               mediaId = media.getId();\r
+                                       String fileName = title + DOT_MXF;\r
+                                       DownloadableMedia downloadable = DownloadableMedia.create(title, fileName, modified, created, 0, 0,\r
+                                                       sourceStoreUri.getId(), targetStoreUri.getId(), mediaId);\r
+                                       String escortFileName = storeName + "." + downloadable.getString("fileName");\r
+                                       if (EscortFiles.createMetadataIfNotExists(outputPath, escortFileName,\r
+                                                       downloadable.toPrettyString(""))) {\r
+                                               logger.info(getMarker(), "Archive status file created for {}", fileName);\r
+                                       } else {\r
+                                               logger.info(getMarker(), "Archive status file already exists for {}", fileName);\r
+                                       }\r
+                               }\r
+\r
+                       } catch (Exception e) {\r
+                               logger.error(getSessionMarker(), e.getMessage());\r
+                               continue;\r
+                       }\r
+               }\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/PathItemsCollectorStep.java b/server/-product/production/AMC/jobs/steps/PathItemsCollectorStep.java
new file mode 100644 (file)
index 0000000..58c379b
--- /dev/null
@@ -0,0 +1,76 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.FileVisitResult;\r
+import java.nio.file.FileVisitor;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.SimpleFileVisitor;\r
+import java.nio.file.attribute.BasicFileAttributes;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+/* DO NOT REMOVE!\r
+import user.jobengine.server.steps.FileSearchFilterOptions;\r
+*/\r
+public class PathItemsCollectorStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       protected FileSearchFilterOptions createFileFilter(BasicDBObject filter) {\r
+               return new FileSearchFilterOptions(filter);\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(String sourceFolder, BasicDBObject filter) throws Exception {\r
+               Path sourcePath = Paths.get(sourceFolder);\r
+\r
+               List<String> files = new ArrayList<>();\r
+\r
+               //teljes rekurzivitas szuressel\r
+               FileSearchFilterOptions filterOptions = createFileFilter(filter);\r
+               FileVisitor<Path> visitor = new SimpleFileVisitor<Path>() {\r
+                       @Override\r
+                       public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {\r
+                               if (!filterOptions.preAcceptDirectory(dir))\r
+                                       return FileVisitResult.SKIP_SUBTREE;\r
+                               return FileVisitResult.CONTINUE;\r
+                       }\r
+\r
+                       @Override\r
+                       public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {\r
+                               if (filterOptions.acceptFile(file)) {\r
+                                       files.add(file.toString());\r
+                                       logger.info(file);\r
+                               }\r
+                               return FileVisitResult.CONTINUE;\r
+                       }\r
+\r
+                       @Override\r
+                       public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {\r
+                               logger.error(exc);\r
+                               return FileVisitResult.CONTINUE;\r
+                       }\r
+\r
+               };\r
+\r
+               try {\r
+                       logger.info(getMarker(), "Visiting {} which exists {}", sourceFolder, sourcePath.toFile().exists());\r
+                       Files.walkFileTree(sourcePath, visitor);\r
+               } catch (Exception e) {\r
+                       logger.error(getMarker(), "Error processing '{}'. System message: {}", sourcePath, e.getMessage());\r
+                       logger.catching(e);\r
+                       throw e;\r
+               } finally {\r
+               }\r
+\r
+               logger.info(getMarker(), "Found {} files", files.size());\r
+               setProgress(100);\r
+               return new Object[] { files };\r
+       }\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/PeableBeachMissingMaterialCheckerStep.210604 b/server/-product/production/AMC/jobs/steps/PeableBeachMissingMaterialCheckerStep.210604
new file mode 100644 (file)
index 0000000..3b1a1fa
--- /dev/null
@@ -0,0 +1,225 @@
+package user.jobengine.server.steps;\r
+\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.Arrays;\r
+import java.util.Collection;\r
+import java.util.LinkedHashSet;\r
+import java.util.List;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import com.ibm.nosql.json.api.BasicDBList;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.PBQuery.MMMedia;\r
+\r
+public class PeableBeachMissingMaterialCheckerStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String appendExtension = System.getProperty("missingmaterial.appendextension", ".mxf");\r
+\r
+       @StepEntry\r
+       public Object[] execute(String escortStoreName, BasicDBList lookupStoreNames, String targetStoreName, String targetProtocol, String primaryEndPoint,\r
+                       String primaryUserName, String primaryPassword, String secondaryEndPoint, String secondaryUserName, String secondaryPassword, int rangeForwardHours)\r
+                       throws Exception {\r
+               StoreUri escortStoreUri = null;\r
+               try {\r
+                       getJobRuntime().setRelated(targetStoreName + " restore");\r
+\r
+                       escortStoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
+                       StoreUri sourceStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
+                       StoreUri targetStoreUri = getManager().getStoreUri(targetStoreName, Enum.valueOf(RemoteStoreProtocol.class, targetProtocol));\r
+\r
+                       LinkedHashSet<String> poolContent = new LinkedHashSet<>();\r
+\r
+                       int progress = 0;\r
+                       int count = lookupStoreNames.size();\r
+                       int processed = 0;\r
+\r
+                       for (Object lookup : lookupStoreNames) {\r
+                               if (getJobRuntime().isWaitingCancel()) {\r
+                                       cancel();\r
+                                       return null;\r
+                               }\r
+                               String lookupStoreName = String.valueOf(lookup);\r
+\r
+                               StoreUri lookupStoreUri = getManager().getStoreUri(lookupStoreName, Enum.valueOf(RemoteStoreProtocol.class, targetProtocol));\r
+                               logger.info(getMarker(), "Checking pool {}", lookupStoreName);\r
+                               List<String> lookupContent = getPoolContent(lookupStoreName, lookupStoreUri);\r
+                               poolContent.addAll(lookupContent);\r
+                               processed++;\r
+                               progress = processed * 50 / count;\r
+                               setProgress(progress);\r
+                       }\r
+                       /*\r
+                                               if (1 == 1) {\r
+\r
+                                                       logger.info(getMarker(), "Kikapcsolva");\r
+                                                       return null;\r
+                                               }\r
+                       */\r
+\r
+                       PBQuery query = new PBQuery();\r
+                       query.init(primaryEndPoint, primaryUserName, primaryPassword, secondaryEndPoint, secondaryUserName, secondaryPassword, rangeForwardHours);\r
+                       Collection<MMMedia> medias = query.getPossibelMissingMaterialNames(new ArrayList<>(poolContent));\r
+                       logger.info(getMarker(), "API returned {} items", medias == null ? 0 : medias.size());\r
+\r
+                       if (medias != null && medias.size() > 0) {\r
+                               count = medias.size();\r
+                               for (MMMedia media : medias) {\r
+                                       logger.info(getMarker(), "API response contains {}", media.getName());\r
+                               }\r
+\r
+                               for (MMMedia media : medias) {\r
+                                       if (getJobRuntime().isWaitingCancel()) {\r
+                                               cancel();\r
+                                               break;\r
+                                       }\r
+                                       processRecord(media, sourceStoreUri, targetStoreName, targetStoreUri, escortStoreUri);\r
+                                       processed++;\r
+                                       progress = 50 + (processed * 50 / count);\r
+                                       setProgress(progress);\r
+                               }\r
+\r
+                       }\r
+                       setProgress(100);\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+                       throw e;\r
+               } finally {\r
+                       if (escortStoreUri != null)\r
+                               escortStoreUri.cleanUp();\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       private List<String> getPoolContent(String storeName, StoreUri targetStoreUri) throws Exception {\r
+               List<String> poolContent = new ArrayList<>();\r
+\r
+               FtpDirectoryLister lister = (FtpDirectoryLister) targetStoreUri.getLister();\r
+               FTPClient client = lister.connect();\r
+               logger.info(getMarker(), "Working dir is {}", client.printWorkingDirectory());\r
+               String[] listNames = client.listNames();\r
+               targetStoreUri.cleanUp();\r
+\r
+               if (listNames != null) {\r
+                       List<String> remoteFileNames = Arrays.asList(listNames);\r
+                       logger.info(getMarker(), "Remote file list size :{}", remoteFileNames.size());\r
+                       for (String name : remoteFileNames) {\r
+                               try {\r
+                                       if (name.toLowerCase().endsWith(".mxf")) {\r
+                                               int pos = name.lastIndexOf(".");\r
+                                               if (pos > -1) {\r
+                                                       name = name.substring(0, pos);\r
+                                                       //logger.info(getMarker(), "Adding {}", name);\r
+                                                       poolContent.add(name);\r
+                                               }\r
+                                       }\r
+                               } catch (Exception e) {\r
+                                       logger.error(e.getMessage());\r
+                               }\r
+\r
+                       }\r
+               }\r
+\r
+               //              List<RemoteFile> remoteFiles = targetStoreUri.getRemoteFiles();\r
+               //              if (remoteFiles != null) {\r
+               //                      logger.info(getMarker(), "Remote file list size :{}", remoteFiles.size());\r
+               //                      for (RemoteFile rf : remoteFiles) {\r
+               //                              try {\r
+               //                                      String name = rf.getName();\r
+               //                                      if (name.toLowerCase().endsWith(".mxf")) {\r
+               //                                              int pos = name.lastIndexOf(".");\r
+               //                                              if (pos > -1) {\r
+               //                                                      name = name.substring(0, pos);\r
+               //                                                      //logger.info(getMarker(), "Adding {}", name);\r
+               //                                                      poolContent.add(name);\r
+               //                                              }\r
+               //                                      }\r
+               //                              } catch (Exception e) {\r
+               //                                      logger.error(e.getMessage());\r
+               //                              }\r
+               //\r
+               //                      }\r
+               //              }\r
+               logger.info(getMarker(), "Pool {} contains {} items", storeName, poolContent == null ? 0 : poolContent.size());\r
+               return poolContent;\r
+       }\r
+\r
+       //csak visszaterunk\r
+       private String normalizeName(String mediaName) {\r
+               String result = mediaName;\r
+               if (StringUtils.isNotBlank(appendExtension))\r
+                       result += appendExtension;\r
+               //              if (StringUtils.isNotBlank(mediaName)) {\r
+               //                      result = mediaName.trim().toLowerCase();\r
+               //              }\r
+               return result;\r
+       }\r
+\r
+       private void processRecord(MMMedia mmedia, StoreUri sourceStoreUri, String targetStoreName, StoreUri targetStoreUri, StoreUri escortStoreUri) {\r
+               //TODO kisbetu/nagybetu problema kezelese\r
+\r
+               Media media = null;\r
+               //duplikatum miatt\r
+               try {\r
+                       media = getManager().getMedia(mmedia.getName());\r
+               } catch (Exception e) {\r
+                       logger.error(getMarker(), "Can't identify missing material {}. System message is: {}", mmedia.getName(), e.getMessage());\r
+                       return;\r
+               }\r
+\r
+               String fileName = normalizeName(mmedia.getName());\r
+\r
+               if (media == null) {\r
+                       logger.warn(getMarker(), "File {} not archived yet", mmedia.getName());\r
+                       return;\r
+               }\r
+\r
+               DownloadableMedia downloadable = DownloadableMedia.create(mmedia.getName(), fileName, media.getModified(), media.getCreated(), media.getLength(), 0L,\r
+                               sourceStoreUri.getId(), targetStoreUri.getId(), media.getId());\r
+               downloadable.put("priority", 50);\r
+               String usage = mmedia.getUsage();\r
+               usage = usage.replace("-", "").replace(":", "");\r
+               String escortFileName = usage + "." + targetStoreName + "." + fileName;\r
+               Path outputPath = null;\r
+               try {\r
+                       outputPath = Paths.get(escortStoreUri.toString(true));\r
+                       boolean exsists = statusFileExists(outputPath, fileName);\r
+                       if (exsists)\r
+                               return;\r
+                       EscortFiles.createMetadata(outputPath.toString(), escortFileName, downloadable.toPrettyString(""));\r
+                       logger.info(getMarker(), "Status file created {}", escortFileName);\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), "Can't create status file {}", Paths.get(outputPath.toString(), escortFileName));\r
+               }\r
+\r
+       }\r
+\r
+       private boolean statusFileExists(Path outputPath, String fileName) {\r
+               boolean exsists = false;\r
+               Path statusPath = Paths.get(outputPath.toString(), EscortFiles.STATUSFOLDER);\r
+               try (DirectoryStream<Path> p = Files.newDirectoryStream(statusPath, "*" + fileName + EscortFiles.DOT_JSON)) {\r
+                       if (p.iterator().hasNext()) {\r
+                               logger.info(getMarker(), "Status file for {} already exists", fileName);\r
+                               exsists = true;\r
+                       }\r
+\r
+               } catch (Exception e1) {\r
+                       logger.error(getSessionMarker(), e1.getMessage());\r
+               }\r
+               return exsists;\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/PeableBeachMissingMaterialCheckerStep.java b/server/-product/production/AMC/jobs/steps/PeableBeachMissingMaterialCheckerStep.java
new file mode 100644 (file)
index 0000000..e231367
--- /dev/null
@@ -0,0 +1,227 @@
+package user.jobengine.server.steps;\r
+\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.Arrays;\r
+import java.util.Collection;\r
+import java.util.LinkedHashSet;\r
+import java.util.List;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import com.ibm.nosql.json.api.BasicDBList;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+import user.jobengine.server.steps.shared.PBQuery;\r
+import user.jobengine.server.steps.shared.PBQuery.MMMedia;\r
+\r
+public class PeableBeachMissingMaterialCheckerStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String appendExtension = ".mxf";\r
+\r
+       @StepEntry\r
+       public Object[] execute(String escortStoreName, BasicDBList lookupStoreNames, String targetStoreName, String targetProtocol, String primaryEndPoint,\r
+                       String primaryUserName, String primaryPassword, String secondaryEndPoint, String secondaryUserName, String secondaryPassword, int rangeForwardHours)\r
+                       throws Exception {\r
+               StoreUri escortStoreUri = null;\r
+               try {\r
+                       getJobRuntime().setRelated(targetStoreName + " restore");\r
+\r
+                       escortStoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
+                       StoreUri sourceStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
+                       StoreUri targetStoreUri = getManager().getStoreUri(targetStoreName, Enum.valueOf(RemoteStoreProtocol.class, targetProtocol));\r
+\r
+                       LinkedHashSet<String> poolContent = new LinkedHashSet<>();\r
+\r
+                       int progress = 0;\r
+                       int count = lookupStoreNames.size();\r
+                       int processed = 0;\r
+\r
+                       for (Object lookup : lookupStoreNames) {\r
+                               if (getJobRuntime().isWaitingCancel()) {\r
+                                       cancel();\r
+                                       return null;\r
+                               }\r
+                               String lookupStoreName = String.valueOf(lookup);\r
+\r
+                               StoreUri lookupStoreUri = getManager().getStoreUri(lookupStoreName, Enum.valueOf(RemoteStoreProtocol.class, targetProtocol));\r
+                               logger.info(getMarker(), "Checking pool {}", lookupStoreName);\r
+                               List<String> lookupContent = getPoolContent(lookupStoreName, lookupStoreUri);\r
+                               poolContent.addAll(lookupContent);\r
+                               processed++;\r
+                               progress = processed * 50 / count;\r
+                               setProgress(progress);\r
+                       }\r
+                       /*\r
+                                               if (1 == 1) {\r
+\r
+                                                       logger.info(getMarker(), "Kikapcsolva");\r
+                                                       return null;\r
+                                               }\r
+                       */\r
+\r
+                       PBQuery query = new PBQuery();\r
+                       query.init(primaryEndPoint, primaryUserName, primaryPassword, secondaryEndPoint, secondaryUserName, secondaryPassword, rangeForwardHours);\r
+                       Collection<MMMedia> medias = query.getPossibelMissingMaterialNames(new ArrayList<>(poolContent));\r
+                       logger.info(getMarker(), "API returned {} items", medias == null ? 0 : medias.size());\r
+\r
+                       if (medias != null && medias.size() > 0) {\r
+                               count = medias.size();\r
+                               for (MMMedia media : medias) {\r
+                                       logger.info(getMarker(), "API response contains {}", media.getName());\r
+                               }\r
+\r
+                               for (MMMedia media : medias) {\r
+                                       if (getJobRuntime().isWaitingCancel()) {\r
+                                               cancel();\r
+                                               break;\r
+                                       }\r
+                                       processRecord(media, sourceStoreUri, targetStoreName, targetStoreUri, escortStoreUri);\r
+                                       processed++;\r
+                                       progress = 50 + (processed * 50 / count);\r
+                                       setProgress(progress);\r
+                               }\r
+\r
+                       }\r
+                       setProgress(100);\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+                       throw e;\r
+               } finally {\r
+                       if (escortStoreUri != null)\r
+                               escortStoreUri.cleanUp();\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       private List<String> getPoolContent(String storeName, StoreUri targetStoreUri) throws Exception {\r
+               List<String> poolContent = new ArrayList<>();\r
+\r
+               FtpDirectoryLister lister = (FtpDirectoryLister) targetStoreUri.getLister();\r
+               FTPClient client = lister.connect();\r
+               logger.info(getMarker(), "Working dir is {}", client.printWorkingDirectory());\r
+               String[] listNames = client.listNames();\r
+               targetStoreUri.cleanUp();\r
+\r
+               if (listNames != null) {\r
+                       List<String> remoteFileNames = Arrays.asList(listNames);\r
+                       logger.info(getMarker(), "Remote file list size :{}", remoteFileNames.size());\r
+                       for (String name : remoteFileNames) {\r
+                               try {\r
+                                       if (name.toLowerCase().endsWith(".mxf")) {\r
+                                               int pos = name.lastIndexOf(".");\r
+                                               if (pos > -1) {\r
+                                                       name = name.substring(0, pos);\r
+                                                       //logger.info(getMarker(), "Adding {}", name);\r
+                                                       poolContent.add(name);\r
+                                               }\r
+                                       }\r
+                               } catch (Exception e) {\r
+                                       logger.error(e.getMessage());\r
+                               }\r
+\r
+                       }\r
+               }\r
+\r
+               //              List<RemoteFile> remoteFiles = targetStoreUri.getRemoteFiles();\r
+               //              if (remoteFiles != null) {\r
+               //                      logger.info(getMarker(), "Remote file list size :{}", remoteFiles.size());\r
+               //                      for (RemoteFile rf : remoteFiles) {\r
+               //                              try {\r
+               //                                      String name = rf.getName();\r
+               //                                      if (name.toLowerCase().endsWith(".mxf")) {\r
+               //                                              int pos = name.lastIndexOf(".");\r
+               //                                              if (pos > -1) {\r
+               //                                                      name = name.substring(0, pos);\r
+               //                                                      //logger.info(getMarker(), "Adding {}", name);\r
+               //                                                      poolContent.add(name);\r
+               //                                              }\r
+               //                                      }\r
+               //                              } catch (Exception e) {\r
+               //                                      logger.error(e.getMessage());\r
+               //                              }\r
+               //\r
+               //                      }\r
+               //              }\r
+               logger.info(getMarker(), "Pool {} contains {} items", storeName, poolContent == null ? 0 : poolContent.size());\r
+               return poolContent;\r
+       }\r
+\r
+       //csak visszaterunk\r
+       private String normalizeName(String mediaName) {\r
+               String result = mediaName;\r
+               if (StringUtils.isNotBlank(appendExtension))\r
+                       result += appendExtension;\r
+               //              if (StringUtils.isNotBlank(mediaName)) {\r
+               //                      result = mediaName.trim().toLowerCase();\r
+               //              }\r
+               return result;\r
+       }\r
+\r
+       private void processRecord(MMMedia mmedia, StoreUri sourceStoreUri, String targetStoreName, StoreUri targetStoreUri, StoreUri escortStoreUri) {\r
+               //TODO kisbetu/nagybetu problema kezelese\r
+               \r
+               Media media = null;\r
+               //duplikatum miatt\r
+               try {\r
+                       media = getManager().getMedia(mmedia.getName());\r
+               } catch (Exception e) {\r
+                       logger.error(getMarker(), "Can't identify missing material {}. System message is: {}", mmedia.getName(), e.getMessage());\r
+                       return;\r
+               }\r
+\r
+               String fileName = normalizeName(mmedia.getName());\r
+\r
+               if (media == null) {\r
+                       logger.warn(getMarker(), "File {} not archived yet", mmedia.getName());\r
+                       return;\r
+               }\r
+\r
+               DownloadableMedia downloadable = DownloadableMedia.create(mmedia.getName(), fileName, media.getModified(), media.getCreated(), media.getLength(), 0L,\r
+                               sourceStoreUri.getId(), targetStoreUri.getId(), media.getId());\r
+               downloadable.put("priority", 50);\r
+               String usage = mmedia.getUsage();\r
+               usage = usage.replace("-", "").replace(":", "");\r
+               String escortFileName = usage + "." + targetStoreName + "." + fileName;\r
+               Path outputPath = null;\r
+               try {\r
+                       outputPath = Paths.get(escortStoreUri.toString(true));\r
+                       boolean exsists = statusFileExists(outputPath, fileName);\r
+                       if (exsists)\r
+                               return;\r
+                       EscortFiles.createMetadata(outputPath.toString(), escortFileName, downloadable.toPrettyString(""));\r
+                       logger.info(getMarker(), "Status file created {}", escortFileName);\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), "Can't create status file {}", Paths.get(outputPath.toString(), escortFileName));\r
+               }\r
+\r
+       }\r
+\r
+       private boolean statusFileExists(Path outputPath, String fileName) {\r
+               boolean exsists = false;\r
+               Path statusPath = Paths.get(outputPath.toString(), EscortFiles.STATUSFOLDER);\r
+               try (DirectoryStream<Path> p = Files.newDirectoryStream(statusPath, "*" + fileName + EscortFiles.DOT_JSON)) {\r
+                       if (p.iterator().hasNext()) {\r
+                               logger.info(getMarker(), "Status file for {} already exists", fileName);\r
+                               exsists = true;\r
+                       }\r
+\r
+               } catch (Exception e1) {\r
+                       logger.error(getSessionMarker(), e1.getMessage());\r
+               }\r
+               return exsists;\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/RegisterUserRestoreStep.java b/server/-product/production/AMC/jobs/steps/RegisterUserRestoreStep.java
new file mode 100644 (file)
index 0000000..c743653
--- /dev/null
@@ -0,0 +1,72 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Paths;\r
+import java.util.List;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.ArchivedMedia;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class RegisterUserRestoreStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String appendExtension = System.getProperty("missingmaterial.appendextension", ".mxf");\r
+\r
+       @StepEntry\r
+       public Object[] execute(String escortStoreName, String targetStoreName, List<ArchivedMedia> basket, String recipient) throws Exception {\r
+               StoreUri escortStoreUri = null;\r
+               try {\r
+                       escortStoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
+                       StoreUri targetStoreUri = getManager().getStore(targetStoreName).getTargetStoreUri();\r
+                       StoreUri sourceStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
+                       int processed = 0;\r
+                       for (ArchivedMedia media : basket) {\r
+                               processRecord(media, targetStoreName, sourceStoreUri, targetStoreUri, escortStoreUri, recipient);\r
+                               processed++;\r
+                               int progress = processed * 100 / basket.size();\r
+                               setProgress(progress);\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+                       throw e;\r
+               } finally {\r
+                       if (escortStoreUri != null)\r
+                               escortStoreUri.cleanUp();\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       private void processRecord(ArchivedMedia archivedMedia, String targetStoreName, StoreUri sourceStoreUri, StoreUri targetStoreUri, StoreUri escortStoreUri,\r
+                       String recipient) {\r
+               Media media = archivedMedia.getMedia();\r
+\r
+               String fileName = media.getTitle();\r
+               if (StringUtils.isNotBlank(appendExtension))\r
+                       fileName += appendExtension;\r
+\r
+               DownloadableMedia downloadable = DownloadableMedia.create(media.getTitle(), fileName, media.getModified(), media.getCreated(), media.getLength(), 0L,\r
+                               sourceStoreUri.getId(), targetStoreUri.getId(), media.getId());\r
+               downloadable.put("recipient", recipient);\r
+               downloadable.put("skipValidation", true);\r
+               String escortFileName = targetStoreName + "." + downloadable.getString("fileName");\r
+               String outputPath = null;\r
+               try {\r
+                       outputPath = Paths.get(escortStoreUri.toString(true)).toString();\r
+                       if (EscortFiles.createMetadataIfNotExists(outputPath, escortFileName, downloadable.toPrettyString("")))\r
+                               logger.info(getSessionMarker(), "Status file created {}", escortFileName);\r
+                       else\r
+                               logger.info(getSessionMarker(), "Status file already exists {}", escortFileName);\r
+               } catch (Exception e) {\r
+                       logger.error("Can't create escort file {}", Paths.get(outputPath.toString(), escortFileName));\r
+               }\r
+\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/RegisterVODRestoreStep.java b/server/-product/production/AMC/jobs/steps/RegisterVODRestoreStep.java
new file mode 100644 (file)
index 0000000..174056d
--- /dev/null
@@ -0,0 +1,80 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import com.ibm.nosql.json.api.BasicDBList;\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class RegisterVODRestoreStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String appendExtension = System.getProperty("missingmaterial.appendextension", ".mxf");\r
+\r
+       @StepEntry\r
+       public Object[] execute(String targetStoreName, BasicDBList basket) throws Exception {\r
+               try {\r
+                       StoreUri sourceStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
+\r
+                       StoreUri targetStoreUri = getManager().getStore(targetStoreName).getTargetStoreUri();\r
+                       StoreUri escortStoreUri = getManager().getStoreUri("MEDIACUBE_UPLOADS", RemoteStoreProtocol.LOCAL);\r
+                       int processed = 0;\r
+                       for (int i = 0; i < basket.size(); i++) {\r
+                               BasicDBObject item = (BasicDBObject) basket.get(i);\r
+                               //logger.info(item.toPrettyString());\r
+                               processRecord(targetStoreName, sourceStoreUri, targetStoreUri, escortStoreUri, item);\r
+                               processed++;\r
+                               int progress = processed * 100 / basket.size();\r
+                               setProgress(progress);\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+                       throw e;\r
+               } finally {\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       private void processRecord(String targetStoreName, StoreUri sourceStoreUri, StoreUri targetStoreUri, StoreUri escortStoreUri, BasicDBObject item) {\r
+               String mediaTitle = item.getString("title");\r
+               String relativeTargetPath = item.getString("path");\r
+\r
+               Media media = getManager().getMedia(mediaTitle);\r
+               \r
+               if (media == null) {\r
+                       logger.error("Media {} is not available", mediaTitle);\r
+                       return;\r
+               }\r
+               \r
+               String fileName = media.getTitle();\r
+               if (StringUtils.isNotBlank(appendExtension))\r
+                       fileName += appendExtension;\r
+\r
+               DownloadableMedia downloadable = DownloadableMedia.create(media.getTitle(), fileName, media.getModified(), media.getCreated(), media.getLength(), 0L,\r
+                               sourceStoreUri.getId(), targetStoreUri.getId(), media.getId());\r
+               //downloadable.put("skipValidation", true);\r
+               downloadable.put("relativeTargetPath", relativeTargetPath);\r
+               String escortFileName = targetStoreName + "." + downloadable.getString("fileName");\r
+               String outputPath = null;\r
+               try {\r
+                       outputPath = Paths.get(escortStoreUri.toString(true)).toString();\r
+                       if (EscortFiles.createMetadataIfNotExists(outputPath, escortFileName, downloadable.toPrettyString("")))\r
+                               logger.info(getSessionMarker(), "Status file created {}", escortFileName);\r
+                       else\r
+                               logger.info(getSessionMarker(), "Status file already exists {}", escortFileName);\r
+               } catch (Exception e) {\r
+                       logger.error("Can't create escort file {}", Paths.get(outputPath.toString(), escortFileName));\r
+               }\r
+\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/RundownFilesCollectorStep.java b/server/-product/production/AMC/jobs/steps/RundownFilesCollectorStep.java
new file mode 100644 (file)
index 0000000..57750aa
--- /dev/null
@@ -0,0 +1,42 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.text.SimpleDateFormat;\r
+import java.util.Calendar;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+/* DO NOT REMOVE!\r
+import user.jobengine.server.steps.FileSearchFilterOptions;\r
+*/\r
+public class RundownFilesCollectorStep extends PathItemsCollectorStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @Override\r
+       protected FileSearchFilterOptions createFileFilter(BasicDBObject filter) {\r
+               SimpleDateFormat df = new SimpleDateFormat("yyyy\\MM");\r
+               Calendar thisMonthCal = Calendar.getInstance();\r
+               Calendar nextMonthCal = Calendar.getInstance();\r
+               nextMonthCal.add(Calendar.MONTH, 1);\r
+\r
+               FileSearchFilterOptions result = new FileSearchFilterOptions(filter) {\r
+                       @Override\r
+                       public boolean acceptFile(Path file) {\r
+                               if (file.toString().contains(df.format(thisMonthCal.getTime())) || file.toString().contains(df.format(nextMonthCal.getTime())))\r
+                                       return super.acceptFile(file);\r
+\r
+                               return false;\r
+                       }\r
+               };\r
+               return result;\r
+       }\r
+\r
+       @Override\r
+       @StepEntry\r
+       public Object[] execute(String sourceFolder, BasicDBObject filter) throws Exception {\r
+               return super.execute(sourceFolder, filter);\r
+       }\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/ServerStatusReportStep.java b/server/-product/production/AMC/jobs/steps/ServerStatusReportStep.java
new file mode 100644 (file)
index 0000000..787a07e
--- /dev/null
@@ -0,0 +1,39 @@
+package user.jobengine.server.steps;\r
+\r
+import java.time.Instant;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.JobStatus;\r
+import user.commons.MediaCubeMarker;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class ServerStatusReportStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute() throws Exception {\r
+               IJobEngine engine = getEngine();\r
+               int jobCount = 0;\r
+               StringBuilder sb = new StringBuilder();\r
+               Map<Long, IJobRuntime> jobs = engine.getJobs();\r
+               if (jobs != null) {\r
+                       Set<Long> keys = jobs.keySet();\r
+                       jobCount = keys.size();\r
+                       for (Long key : keys) {\r
+                               IJobRuntime runtime = jobs.get(key);\r
+                               if (JobStatus.SUSPENDED.equals(runtime.getStatus()))\r
+                                       sb.append(runtime.getRelated() + " felfüggesztve: " + runtime.getDescription() + "</br>");\r
+                       }\r
+               }\r
+               MediaCubeMarker marker = new MediaCubeMarker();\r
+\r
+               marker.setSubject(String.format("%s [%d db] AMC MediaCube feldolgozás", Instant.now(), jobCount));\r
+               logger.info(marker, sb.toString());\r
+               return null;\r
+       }\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/SubtitleFilesCollectorStep.java b/server/-product/production/AMC/jobs/steps/SubtitleFilesCollectorStep.java
new file mode 100644 (file)
index 0000000..f27a5a6
--- /dev/null
@@ -0,0 +1,60 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.FileVisitResult;\r
+import java.nio.file.FileVisitor;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.SimpleFileVisitor;\r
+import java.nio.file.attribute.BasicFileAttributes;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+public class SubtitleFilesCollectorStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(String sourceFolder, String fileNamePattern) throws Exception {\r
+               Path sourcePath = Paths.get(sourceFolder);\r
+               List<String> files = new ArrayList<>();\r
+\r
+               Pattern pattern = Pattern.compile(fileNamePattern, Pattern.CASE_INSENSITIVE);\r
+\r
+               FileVisitor<Path> visitor = new SimpleFileVisitor<Path>() {\r
+                       @Override\r
+                       public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {\r
+                               if (!file.getFileName().toString().contains("_DONE")) {\r
+                                       Matcher matcher = pattern.matcher(file.getFileName().toString());\r
+                                       if (matcher.find())\r
+                                               files.add(file.toString());\r
+                               }\r
+                               return FileVisitResult.CONTINUE;\r
+                       }\r
+\r
+                       @Override\r
+                       public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {\r
+                               return FileVisitResult.CONTINUE;\r
+                       }\r
+\r
+               };\r
+\r
+               try {\r
+                       Files.walkFileTree(sourcePath, visitor);\r
+               } catch (Exception e) {\r
+                       logger.error(getMarker(), "Error processing '{}'. System message: {}", sourcePath, e.getMessage());\r
+                       logger.catching(e);\r
+                       throw e;\r
+               } finally {\r
+               }\r
+\r
+               logger.info(getMarker(), "Found {} files", files.size());\r
+               return new Object[] { files };\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/TSMTransferFromStep.java b/server/-product/production/AMC/jobs/steps/TSMTransferFromStep.java
new file mode 100644 (file)
index 0000000..ab1b6bb
--- /dev/null
@@ -0,0 +1,27 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.StoreUri;\r
+\r
+public class TSMTransferFromStep extends TransferStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @Override\r
+       @StepEntry\r
+       public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+               Object[] result = null;\r
+               Path targetFile = Paths.get(targetStoreUri.toString(true), targetFileName);\r
+               if (targetFile.toFile().exists()) {\r
+                       logger.info(getMarker(), "Using previously retrived file {}", targetFile);\r
+               } else {\r
+                       result = super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+               }\r
+               return result;\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/TSMTransferToStep.java b/server/-product/production/AMC/jobs/steps/TSMTransferToStep.java
new file mode 100644 (file)
index 0000000..efff055
--- /dev/null
@@ -0,0 +1,11 @@
+package user.jobengine.server.steps;\r
+\r
+import user.commons.StoreUri;\r
+\r
+public class TSMTransferToStep extends TransferStep {\r
+       @Override\r
+       @StepEntry\r
+       public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+               return super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+       }\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/TestForkCancelableStep.java b/server/-product/production/AMC/jobs/steps/TestForkCancelableStep.java
new file mode 100644 (file)
index 0000000..7651a13
--- /dev/null
@@ -0,0 +1,33 @@
+package user.jobengine.server.steps;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.IJob;\r
+import user.commons.JobStatus;\r
+import user.commons.ListUtils;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class TestForkCancelableStep extends JobStep {\r
+       private static final String CHILD_TITLE = "Párhuzamosított alfolyamat";\r
+       private static final String CHILD_TEMPLATE = "cancelable.xml";\r
+       private static final Logger logger = LogManager.getLogger();\r
+       int count = 20;\r
+\r
+       @StepEntry\r
+       public Object[] execute(IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               for (int i = 0; i < count; i++) {\r
+                       IJobRuntime runtime = getEngine().submit(null, e -> {\r
+                               if (e.getStatus().equals(JobStatus.CANCELED) || e.getStatus().equals(JobStatus.SUSPENDED))\r
+                                       logger.info("Cleanup occured because status is {} {}", e.getStatus(), ((IJob) e.getSource()).getId());\r
+                       }, CHILD_TEMPLATE, "JOB " + i, 0, IJobEngine.DEFAULT_OWNER, ListUtils.asMap("param", i));\r
+\r
+                       runtime.setRelated("TEST" + runtime.getId());\r
+               }\r
+\r
+               //              jobRuntime.forkWaitComplete();\r
+               logger.info("Done");\r
+               return null;\r
+       }\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/TransferStep.java b/server/-product/production/AMC/jobs/steps/TransferStep.java
new file mode 100644 (file)
index 0000000..67cc025
--- /dev/null
@@ -0,0 +1,100 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Store;\r
+\r
+public class TransferStep extends JobStep {\r
+       private static final String DOT_PART = ".part";\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+               try {\r
+                       getJobRuntime().setCancelable(false);\r
+\r
+                       Store sourceStore = getManager().getStore(sourceStoreUri.getStoreId());\r
+                       Store targetStore = getManager().getStore(targetStoreUri.getStoreId());\r
+\r
+                       String description = String.format("%s -> %s : %s", sourceStore.getName(), targetStore.getName(), sourceFileName);\r
+                       getJobRuntime().setDescription(description);\r
+\r
+                       sourceStoreUri.addProgressListener(e -> setProgress(e.getProgress()));\r
+\r
+                       StoreUri currentTargetStoreUri = getTargetStoreUri(targetStoreUri);\r
+                       tryCopy(sourceStoreUri, sourceFileName, currentTargetStoreUri, targetFileName);\r
+               } catch (Exception e) {\r
+                       logger.error(getMarker(), "Error in transfer of {} when copying from {} to {}.", sourceFileName, sourceStoreUri, targetStoreUri);\r
+                       throw e;\r
+               } finally {\r
+                       if (sourceStoreUri != null)\r
+                               sourceStoreUri.cleanUp();\r
+                       if (targetStoreUri != null)\r
+                               targetStoreUri.cleanUp();\r
+               }\r
+               return null;\r
+       }\r
+\r
+       protected StoreUri getTargetStoreUri(StoreUri targetStoreUri) {\r
+               return targetStoreUri;\r
+       }\r
+\r
+       protected String getTmpExtension() {\r
+               return DOT_PART;\r
+       }\r
+\r
+       private void tryCopy(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+               String currentTargetFileName = targetFileName;\r
+\r
+               boolean renameAfterCopy = false;\r
+               boolean renameAfterFTP = false;\r
+               if (getTmpExtension() != null) {\r
+                       if (RemoteStoreProtocol.LOCAL.equals(targetStoreUri.getProtocol())) {\r
+                               currentTargetFileName += getTmpExtension();\r
+                               renameAfterCopy = true;\r
+                       }\r
+                       Store targetStore = getManager().getStore(targetStoreUri.getStoreId());\r
+\r
+                       if (RemoteStoreProtocol.FTP.equals(targetStoreUri.getProtocol()) && !"NEXIO1".equals(targetStore.getName())\r
+                                       && !"NEXIO2".equals(targetStore.getName())) {\r
+                               currentTargetFileName += getTmpExtension();\r
+                               renameAfterFTP = true;\r
+                       }\r
+               }\r
+\r
+               sourceStoreUri.transferFrom(targetStoreUri, sourceFileName, currentTargetFileName);\r
+\r
+               logger.info(getMarker(), "Transfer of {} completed from {} to {}", sourceFileName, sourceStoreUri, currentTargetFileName);\r
+\r
+               if (renameAfterCopy) {\r
+                       Path tmpTargetFile = Paths.get(targetStoreUri.toString(true), currentTargetFileName);\r
+                       Path targetFile = Paths.get(targetStoreUri.toString(true), targetFileName);\r
+                       try {\r
+                               logger.info(getMarker(), "Renaming LOCAL file from {} to {} on {}", currentTargetFileName, targetFileName, sourceStoreUri);\r
+                               tmpTargetFile.toFile().renameTo(targetFile.toFile());\r
+                       } catch (Exception e) {\r
+                               logger.error(getMarker(), e.getMessage());\r
+                       }\r
+               }\r
+               if (renameAfterFTP) {\r
+                       try {\r
+                               FtpDirectoryLister lister = (FtpDirectoryLister) targetStoreUri.getLister();\r
+                               FTPClient client = lister.connect();\r
+                               logger.info(getMarker(), "Renaming FTP file from {} to {} on {}", currentTargetFileName, targetFileName, sourceStoreUri);\r
+                               client.rename(currentTargetFileName, targetFileName);\r
+                       } catch (Exception e) {\r
+                               logger.error(getMarker(), e.getMessage());\r
+                       } finally {\r
+                               targetStoreUri.cleanUp();\r
+                       }\r
+               }\r
+       }\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/TransferToFTPStep.java b/server/-product/production/AMC/jobs/steps/TransferToFTPStep.java
new file mode 100644 (file)
index 0000000..b42d5d5
--- /dev/null
@@ -0,0 +1,11 @@
+package user.jobengine.server.steps;\r
+\r
+import user.commons.StoreUri;\r
+\r
+public class TransferToFTPStep extends TransferStep {\r
+       @Override\r
+       @StepEntry\r
+       public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+               return super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+       }\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/VODTransferToStep.java b/server/-product/production/AMC/jobs/steps/VODTransferToStep.java
new file mode 100644 (file)
index 0000000..d17eaa1
--- /dev/null
@@ -0,0 +1,22 @@
+package user.jobengine.server.steps;\r
+\r
+import user.commons.StoreUri;\r
+\r
+public class VODTransferToStep extends TransferStep {\r
+       private String relativeTargetPath;\r
+\r
+       @StepEntry\r
+       public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String relativeTargetPath, String targetFileName)\r
+                       throws Exception {\r
+               this.relativeTargetPath = relativeTargetPath;\r
+               return super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+       }\r
+\r
+       @Override\r
+       protected StoreUri getTargetStoreUri(StoreUri targetStoreUri) {\r
+               StoreUri result = getManager().getStoreUri(targetStoreUri.getId());\r
+               result.setRootPath(relativeTargetPath);\r
+               return result;\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/shared/EscortFiles.java b/server/-product/production/AMC/jobs/steps/shared/EscortFiles.java
new file mode 100644 (file)
index 0000000..da308d3
--- /dev/null
@@ -0,0 +1,339 @@
+package user.jobengine.server.steps.shared;\r
+\r
+import java.io.ByteArrayInputStream;\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.io.OutputStream;\r
+import java.io.StringWriter;\r
+import java.io.UnsupportedEncodingException;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.attribute.FileAttribute;\r
+import java.nio.file.attribute.PosixFilePermission;\r
+import java.nio.file.attribute.PosixFilePermissions;\r
+import java.text.SimpleDateFormat;\r
+import java.util.Calendar;\r
+import java.util.Date;\r
+import java.util.Set;\r
+\r
+import javax.xml.parsers.DocumentBuilder;\r
+import javax.xml.parsers.DocumentBuilderFactory;\r
+import javax.xml.transform.OutputKeys;\r
+import javax.xml.transform.Transformer;\r
+import javax.xml.transform.TransformerConfigurationException;\r
+import javax.xml.transform.TransformerException;\r
+import javax.xml.transform.TransformerFactory;\r
+import javax.xml.transform.TransformerFactoryConfigurationError;\r
+import javax.xml.transform.dom.DOMSource;\r
+import javax.xml.transform.stream.StreamResult;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.commons.net.ftp.FTPClient;\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.w3c.dom.DOMImplementation;\r
+import org.w3c.dom.Document;\r
+import org.w3c.dom.Element;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+import com.ibm.nosql.json.util.JSON;\r
+\r
+import user.commons.CalendarUtils;\r
+import user.commons.MediaCubeMarker;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+\r
+public class EscortFiles {\r
+       private static final String RECORDTIMESTAMP = "RecordTimeStamp";\r
+       private static final String MODIFIEDTIMESTAMP = "ModifiedTimeStamp";\r
+       public static final String DOT_CATCHED = ".catched";\r
+       public static final String DOT_JSON = ".json";\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String EXTENDEDAGENCY = "ExtendedAgency";\r
+       private static final String EXTENDEDDESCRIPTION = "ExtendedDescription";\r
+       private static final String KILLDATE = "KillDate";\r
+       private static final String FORMAT_KILLDATE = "MM-dd-yyyy";\r
+       private static final String EXTENDEDID = "extendedId";\r
+       private static final String ID = "ID";\r
+       private static final String KILLDATE_FILENAME = "%s.%s.killdate";\r
+       private static final String FORMAT_KILLDATENAME = "yyyyMMdd";\r
+       public static final String STATUSFOLDER = ".STATUS";\r
+       public static final String CONFLICTFOLDER = ".CONFLICT";\r
+\r
+       public static String composeKillDate(int days) {\r
+               Calendar killDate = Calendar.getInstance();\r
+               killDate.add(Calendar.DAY_OF_YEAR, days);\r
+               SimpleDateFormat dateFormat = new SimpleDateFormat(FORMAT_KILLDATENAME);\r
+               return dateFormat.format(killDate.getTime());\r
+       }\r
+       /*\r
+        * <?xml version="1.0" encoding="UTF-16"?> <ID extendedId="aaaaaaa">\r
+        * <KillDate>02-02-2018</KillDate> <ExtendedDescription>TEST\r
+        * TEST</ExtendedDescription> <ExtendedAgency>AGENT AGENT</ExtendedAgency>\r
+        * </ID>\r
+        */\r
+\r
+       private static String composeKillDateFileName(String fileName, int days) {\r
+               return String.format(KILLDATE_FILENAME, fileName, composeKillDate(days));\r
+       }\r
+\r
+       public static void createCatchedFile(Path escortFile) throws IOException {\r
+               Path catchedFilePath = Paths.get(escortFile.toString() + DOT_CATCHED);\r
+               Files.createFile(catchedFilePath);\r
+       }\r
+\r
+       public static void createFellow(String escortFile, String extension) throws IOException {\r
+               Files.copy(Paths.get(escortFile), Paths.get(escortFile + "." + extension));\r
+       }\r
+\r
+       /***\r
+        * A media eleresi utjan alapjan a .STATUS almappaban letrehozza a .catch fajlt.\r
+        *\r
+        * @param mediaFile\r
+        * @throws IOException\r
+        */\r
+       public static void createMediaCatch(Path mediaFile) throws IOException {\r
+               Path catchedFile = createMediaCathFilePath(mediaFile);\r
+               ensureUNCFolder(catchedFile.getParent());\r
+               Files.createFile(catchedFile);\r
+       }\r
+\r
+       private static Path createMediaCathFilePath(Path mediaFile) {\r
+               return Paths.get(mediaFile.getParent().toString(), STATUSFOLDER, mediaFile.getFileName() + DOT_CATCHED);\r
+       }\r
+\r
+       public static void createMetadata(String filePath, String fileName, String metadata) throws IOException {\r
+               ensureUNCFolder(filePath, STATUSFOLDER);\r
+               String metadataFileName = fileName + DOT_JSON;\r
+               Path metadataPath = Paths.get(filePath, STATUSFOLDER, metadataFileName);\r
+               Files.write(metadataPath, metadata.getBytes());\r
+       }\r
+\r
+       public static boolean createMetadataIfNotExists(String filePath, String fileName, String metadata) throws IOException {\r
+               boolean result = false;\r
+               if (!EscortFiles.isMetadataExists(filePath, fileName)) {\r
+                       EscortFiles.createMetadata(filePath, fileName, metadata);\r
+                       result = true;\r
+               }\r
+               return result;\r
+       }\r
+\r
+       public static void createMorpheusXML(String filePath, String fileName, String content) throws IOException {\r
+               ensureUNCFolder(filePath, STATUSFOLDER);\r
+               Path xmlPath = Paths.get(filePath, fileName);\r
+               if (Files.exists(xmlPath))\r
+                       throw new IOException(String.format("Az '%s' állomány már létezik.", xmlPath));\r
+               Files.write(xmlPath, content.getBytes());\r
+       }\r
+\r
+       public static byte[] createNEXIODatesMeta(String fileName, Date recorded, Date modified) throws Exception {\r
+               DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();\r
+               DocumentBuilder db = dbf.newDocumentBuilder();\r
+               DOMImplementation impl = db.getDOMImplementation();\r
+               Document xmlDocument = impl.createDocument(null, null, null);\r
+\r
+               Element root = xmlDocument.createElement(ID);\r
+               root.setAttribute(EXTENDEDID, fileName);\r
+               //      <ModifiedTimeStamp>07-13-2020 (19:36:52)</ModifiedTimeStamp>\r
+               //      <RecordTimeStamp>05-18-2013 (18:52:24)</RecordTimeStamp>\r
+               SimpleDateFormat df = new SimpleDateFormat("MM-dd-yyyy (HH:mm:ss)");\r
+               root.appendChild(xmlDocument.createElement(MODIFIEDTIMESTAMP)).appendChild(xmlDocument.createTextNode(df.format(modified)));\r
+               root.appendChild(xmlDocument.createElement(RECORDTIMESTAMP)).appendChild(xmlDocument.createTextNode(df.format(recorded)));\r
+               xmlDocument.appendChild(root);\r
+\r
+               return xmDocumentToString(xmlDocument);\r
+       }\r
+\r
+       public static byte[] createNEXIOKillDateFile(String fileName, Date killDate, String description, String agency) throws Exception {\r
+               DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();\r
+               DocumentBuilder db = dbf.newDocumentBuilder();\r
+               DOMImplementation impl = db.getDOMImplementation();\r
+               Document xmlDocument = impl.createDocument(null, null, null);\r
+\r
+               Element root = xmlDocument.createElement(ID);\r
+               root.setAttribute(EXTENDEDID, fileName);\r
+               if (killDate != null) {\r
+                       String sKillDate = CalendarUtils.toString(CalendarUtils.createCalendar(killDate), FORMAT_KILLDATE);\r
+                       root.appendChild(xmlDocument.createElement(KILLDATE)).appendChild(xmlDocument.createTextNode(sKillDate));\r
+               }\r
+\r
+               if (StringUtils.isNotBlank(description))\r
+                       root.appendChild(xmlDocument.createElement(EXTENDEDDESCRIPTION)).appendChild(xmlDocument.createTextNode(description));\r
+               if (StringUtils.isNotBlank(agency))\r
+                       root.appendChild(xmlDocument.createElement(EXTENDEDAGENCY)).appendChild(xmlDocument.createTextNode(agency));\r
+               xmlDocument.appendChild(root);\r
+\r
+               return xmDocumentToString(xmlDocument);\r
+       }\r
+\r
+       public static Document createNEXIOMeta(byte[] content) throws Exception {\r
+               DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();\r
+               DocumentBuilder db = dbf.newDocumentBuilder();\r
+               DOMImplementation impl = db.getDOMImplementation();\r
+               Document xmlDocument = null;\r
+\r
+               try (InputStream is = new ByteArrayInputStream(content)) {\r
+                       xmlDocument = db.parse(is);\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+               }\r
+\r
+               return xmlDocument;\r
+       }\r
+\r
+       public static void createUNCKillDate(String filePath, String fileName, int days, Marker marker) throws IOException {\r
+               ensureUNCFolder(filePath, STATUSFOLDER);\r
+               String killDateFileName = composeKillDateFileName(fileName, days);\r
+               Path killDatePath = Paths.get(filePath, STATUSFOLDER, killDateFileName);\r
+               if (Files.exists(killDatePath))\r
+                       logger.warn(marker, "Az '{}' állomány már létezik.", killDatePath);\r
+               else\r
+                       Files.createFile(killDatePath);\r
+       }\r
+\r
+       @SuppressWarnings("unchecked")\r
+       public static <T> T decode(Path escortFile) {\r
+               T result = null;\r
+               try {\r
+                       byte[] bytes = Files.readAllBytes(escortFile);\r
+                       String content = new String(bytes);\r
+                       result = (T) JSON.parse(content);\r
+               } catch (Exception e) {\r
+                       logger.error("Decode error. System message is: ", e.getMessage());\r
+               }\r
+               return result;\r
+       }\r
+\r
+       public static void ensureUNCFolder(Path filePath) throws IOException {\r
+               File folder = filePath.toFile();\r
+               if (!folder.exists() || !folder.isDirectory()) {\r
+                       try {\r
+                               Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxrwxrwx");\r
+                               FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);\r
+                               Files.createDirectories(filePath, attr);\r
+                       } catch (Exception e) {\r
+                               //logger.catching(e);\r
+                               try {\r
+                                       Files.createDirectories(filePath);\r
+                               } catch (Exception e1) {\r
+                                       logger.catching(e1);\r
+                                       throw e1;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       public static void ensureUNCFolder(String filePath, String folderName) throws IOException {\r
+               Path statusPath = Paths.get(filePath, folderName);\r
+               ensureUNCFolder(statusPath);\r
+       }\r
+\r
+       public static boolean isCatchedFileExists(Path escortFile) {\r
+               Path catchedFilePath = Paths.get(escortFile.toString() + DOT_CATCHED);\r
+               return catchedFilePath.toFile().exists();\r
+       }\r
+\r
+       /***\r
+        * A media eleresi utjan alapjan a .STATUS almappaban vizsgalja .catch fajl letezeset.\r
+        *\r
+        * @param mediaFile\r
+        * @return\r
+        */\r
+       public static boolean isMediaCatched(Path mediaFile) {\r
+               Path catchedFile = createMediaCathFilePath(mediaFile);\r
+               return catchedFile.toFile().exists();\r
+       }\r
+\r
+       public static boolean isMetadataExists(String filePath, String fileName) throws IOException {\r
+               boolean result = false;\r
+               String metadataFileName = fileName + DOT_JSON;\r
+               Path metadataPath = Paths.get(filePath, STATUSFOLDER, metadataFileName);\r
+               result = metadataPath.toFile().exists();\r
+               return result;\r
+       }\r
+\r
+       public static void notifyRecipient(Path escortFile, Logger logger, Message msg) {\r
+               if (escortFile.toFile().exists()) {\r
+                       try {\r
+                               BasicDBObject downloadable = EscortFiles.decode(escortFile);\r
+                               String recipientKey = "recipient";\r
+                               if (downloadable.containsKey(recipientKey)) {\r
+                                       String recipient = downloadable.getString(recipientKey);\r
+                                       logger.info(new MediaCubeMarker(recipient, "MediaCube rendszerüzenet"), msg);\r
+                               }\r
+                       } catch (Exception e) {\r
+                               logger.catching(e);\r
+                       }\r
+\r
+               }\r
+       }\r
+\r
+       public static void remove(Path file) {\r
+               try {\r
+                       file.toFile().delete();\r
+               } catch (Exception e) {\r
+                       logger.error("Unable to delete {}", file.toAbsolutePath().toString());\r
+               }\r
+       }\r
+\r
+       public static void removeCatchedFile(Path escortFile) {\r
+               remove(Paths.get(escortFile.toString() + DOT_CATCHED));\r
+       }\r
+\r
+       /***\r
+        * A media eleresi utjan alapjan a .STATUS almappabol torli a .catch fajlt.\r
+        *\r
+        * @param mediaFile\r
+        * @throws IOException\r
+        */\r
+       public static void removeMediaCatch(Path mediaFile) {\r
+               Path catchedFile = createMediaCathFilePath(mediaFile);\r
+               remove(catchedFile);\r
+       }\r
+\r
+       public static void setNEXIOKillDate(int killDateDays, String targetFileName, String nexioAgency, StoreUri targetUri) throws Exception {\r
+               OutputStream outStream = null;\r
+               try {\r
+                       FTPClient targetFTP = ((FtpDirectoryLister) targetUri.getLister()).connect();\r
+                       Calendar killDate = CalendarUtils.createCalendar(new Date());\r
+                       killDate.add(Calendar.DAY_OF_YEAR, killDateDays);\r
+                       if (targetFileName.toLowerCase().contains(".mxf"))\r
+                               targetFileName = targetFileName.substring(0, targetFileName.lastIndexOf('.'));\r
+                       byte[] killDateFile = EscortFiles.createNEXIOKillDateFile(targetFileName, killDate.getTime(), null, nexioAgency);\r
+                       String xml = targetFileName + ".xml";\r
+                       outStream = targetFTP.storeFileStream(xml);\r
+                       if (outStream == null) {\r
+                               throw new NullPointerException("Can not open: " + targetFileName.substring(0, targetFileName.lastIndexOf('.')) + ".xml" + " Reply:"\r
+                                               + targetFTP.getReplyString());\r
+                       }\r
+                       outStream.write(killDateFile);\r
+                       outStream.flush();\r
+               } catch (Exception e) {\r
+                       throw e;\r
+               } finally {\r
+                       if (outStream != null)\r
+                               outStream.close();\r
+                       targetUri.cleanUp();\r
+               }\r
+       }\r
+\r
+       private static byte[] xmDocumentToString(Document xmlDocument)\r
+                       throws TransformerFactoryConfigurationError, TransformerConfigurationException, TransformerException, IOException, UnsupportedEncodingException {\r
+               DOMSource domSource = new DOMSource(xmlDocument);\r
+               TransformerFactory tf = TransformerFactory.newInstance();\r
+               Transformer transformer = tf.newTransformer();\r
+               transformer.setOutputProperty(OutputKeys.METHOD, "xml");\r
+               transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-16");\r
+               transformer.setOutputProperty(OutputKeys.INDENT, "yes");\r
+               StringWriter sw = new StringWriter();\r
+               StreamResult sr = new StreamResult(sw);\r
+               transformer.transform(domSource, sr);\r
+               String result = sw.toString();\r
+               sw.close();\r
+               return result.getBytes("UTF-16");\r
+       }\r
+}\r
diff --git a/server/-product/production/AMC/jobs/steps/shared/PBQuery.java b/server/-product/production/AMC/jobs/steps/shared/PBQuery.java
new file mode 100644 (file)
index 0000000..2b50e30
--- /dev/null
@@ -0,0 +1,413 @@
+package user.jobengine.server.steps.shared;\r
+\r
+import java.io.DataInputStream;\r
+import java.io.FileNotFoundException;\r
+import java.io.IOException;\r
+import java.io.StringReader;\r
+import java.net.URL;\r
+import java.nio.file.CopyOption;\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.nio.file.StandardCopyOption;\r
+import java.text.SimpleDateFormat;\r
+import java.util.Arrays;\r
+import java.util.Calendar;\r
+import java.util.Collection;\r
+import java.util.Date;\r
+import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+import java.util.TreeMap;\r
+\r
+import javax.xml.parsers.DocumentBuilder;\r
+import javax.xml.parsers.DocumentBuilderFactory;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.http.HttpEntity;\r
+import org.apache.http.HttpResponse;\r
+import org.apache.http.auth.AuthScope;\r
+import org.apache.http.auth.UsernamePasswordCredentials;\r
+import org.apache.http.client.methods.HttpPost;\r
+import org.apache.http.entity.StringEntity;\r
+import org.apache.http.impl.client.DefaultHttpClient;\r
+import org.apache.http.params.BasicHttpParams;\r
+import org.apache.http.params.HttpConnectionParams;\r
+import org.apache.http.params.HttpParams;\r
+import org.apache.http.protocol.HTTP;\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.MarkerManager;\r
+import org.w3c.dom.Document;\r
+import org.w3c.dom.NamedNodeMap;\r
+import org.w3c.dom.Node;\r
+import org.w3c.dom.NodeList;\r
+import org.xml.sax.InputSource;\r
+\r
+import user.commons.configuration.SystemConfiguration;\r
+\r
+public class PBQuery {\r
+       public class MMMedia {\r
+               private final String name;\r
+               private final String usage;\r
+\r
+               MMMedia(String name, String usage) {\r
+                       this.name = name;\r
+                       this.usage = usage;\r
+\r
+               }\r
+\r
+               public String getName() {\r
+                       return name;\r
+               }\r
+\r
+               public String getUsage() {\r
+                       return usage;\r
+               }\r
+       }\r
+\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private Marker subtitleMarker = MarkerManager.getMarker("MISSING-SUBTITLE");\r
+       private static final int CONNECTION_TIMEOUT = 5000;\r
+       private static final int SOCKET_TIMEOUT = 5000;\r
+       public static final String GETMEDIAUSAGEBYUTRANGE = "/getMediaUsageByUTRange";\r
+       public static final String GETCUSTOMVIEW = "/getCustomView";\r
+\r
+       private static final Path subtitleRoot = Paths.get("X:\\PB_ARCH");\r
+       private static final Path missingSubsRoot = Paths.get("R:\\BeachPool");\r
+       private Set<Path> subsDirectoriesList;\r
+\r
+       private static Document toDocument(String xml) {\r
+               DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\r
+               DocumentBuilder builder = null;\r
+               try {\r
+                       builder = factory.newDocumentBuilder();\r
+                       Document doc = builder.parse(new InputSource(new StringReader(xml)));\r
+                       return doc;\r
+               } catch (Exception e) {\r
+                       logger.error(e.getMessage());\r
+               }\r
+               return null;\r
+       }\r
+\r
+       private SimpleDateFormat sdf_range = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:'00'");\r
+       private String primaryEndPoint;\r
+       private String primaryUserName;\r
+       private String primaryPassword;\r
+       private String secondaryEndPoint;\r
+       private String secondaryUserName;\r
+\r
+       private String secondaryPassword;\r
+\r
+       private int rangeForwardHours;\r
+\r
+       private String getAttribute(Node node, String name) {\r
+               String result = null;\r
+               if (node != null && node.hasAttributes()) {\r
+                       NamedNodeMap attributes = node.getAttributes();\r
+                       if (attributes != null) {\r
+                               Node mediaNameNode = attributes.getNamedItem(name);\r
+                               if (mediaNameNode != null)\r
+                                       result = mediaNameNode.getNodeValue();\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+\r
+       public Collection<MMMedia> getPossibelMissingMaterialNames(List<String> poolContent) throws Exception {\r
+               Map<String, MMMedia> result = querySortableMedias(poolContent);\r
+               queryOtherMedias(poolContent, result);\r
+\r
+               TreeMap<String, MMMedia> sortedUsages = new TreeMap<>();\r
+               for (MMMedia m : result.values()) {\r
+                       // a TreeMap lehetove teszi: nincs duplikatum + a korabbi musorok elore kerulnek\r
+                       sortedUsages.put(m.getUsage() + "." + m.getName(), m);\r
+               }\r
+\r
+               return sortedUsages.values();\r
+\r
+       }\r
+\r
+       private Path getSOAPTemplate(String viewName) throws FileNotFoundException {\r
+               String configDir = SystemConfiguration.getInstance().getConfig("settings/soap");\r
+               logger.info("Loading template {} from {}", viewName, configDir);\r
+               return Paths.get(configDir, viewName);\r
+       }\r
+\r
+       public void init(String primaryEndPoint, String primaryUserName, String primaryPassword, String secondaryEndPoint,\r
+                       String secondaryUserName, String secondaryPassword, int rangeForwardHours) throws Exception {\r
+               this.primaryEndPoint = primaryEndPoint;\r
+               this.primaryUserName = primaryUserName;\r
+               this.primaryPassword = primaryPassword;\r
+               this.secondaryEndPoint = secondaryEndPoint;\r
+               this.secondaryUserName = secondaryUserName;\r
+               this.secondaryPassword = secondaryPassword;\r
+               this.rangeForwardHours = rangeForwardHours;\r
+               this.subsDirectoriesList = readSubtileDirectoriesList(subtitleRoot);\r
+       }\r
+\r
+       private void putEarliest(Map<String, MMMedia> result, String mediaName, String usageTime) {\r
+               if (result.containsKey(mediaName)) {\r
+                       MMMedia m = result.get(mediaName);\r
+                       // az aktualis a korabbi idopont\r
+                       if (usageTime.compareTo(m.getUsage()) < 0)\r
+                               result.put(mediaName, new MMMedia(mediaName, usageTime));\r
+               } else\r
+                       result.put(mediaName, new MMMedia(mediaName, usageTime));\r
+       }\r
+\r
+       public String query(String endPoint, String action, String soap, String user, String pwd) throws Exception {\r
+\r
+               HttpParams httpParameters = new BasicHttpParams();\r
+               HttpConnectionParams.setConnectionTimeout(httpParameters, CONNECTION_TIMEOUT);\r
+               HttpConnectionParams.setSoTimeout(httpParameters, SOCKET_TIMEOUT);\r
+               DefaultHttpClient httpclient = new DefaultHttpClient(httpParameters);\r
+               // http://10.170.100.61:18083\r
+\r
+               String result = null;\r
+               DataInputStream is = null;\r
+               try {\r
+                       URL url = new URL(endPoint);\r
+                       httpclient.getCredentialsProvider().setCredentials(\r
+                                       new AuthScope(url.getHost(), url.getPort(), null, "Digest"),\r
+                                       new UsernamePasswordCredentials(user, pwd));\r
+\r
+                       HttpPost httppost = new HttpPost(url.toURI());\r
+                       httppost.setHeader("soapaction", action);\r
+                       // Content-Type application/soap+xml; charset=utf-8;\r
+                       // action="/getMediaUsageByUTRange"\r
+                       httppost.setHeader("Content-Type", "text/xml; charset=utf-8");\r
+                       HttpEntity entity = new StringEntity(soap.toString(), HTTP.UTF_8);\r
+                       httppost.setEntity(entity);\r
+                       logger.info("Executing call {}", action);\r
+                       HttpResponse response = httpclient.execute(httppost);// calling server\r
+                       HttpEntity r_entity = response.getEntity(); // get response\r
+                       // Header[] headers = response.getAllHeaders();\r
+                       // for (Header h : headers) {\r
+                       // logger.info("Reponse Header", h.getName() + ": " + h.getValue());\r
+                       // }\r
+                       if (r_entity != null) {\r
+                               byte[] bytes = new byte[(int) r_entity.getContentLength()];\r
+                               if (r_entity.isStreaming()) {\r
+                                       is = new DataInputStream(r_entity.getContent());\r
+                                       is.readFully(bytes);\r
+                               }\r
+                               result = new String(bytes);\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.error("Exception while connecting to endpoint {}. System message is: {}", e.getMessage());\r
+                       throw e;\r
+               } finally {\r
+                       if (is != null) {\r
+                               try {\r
+                                       is.close();\r
+                               } catch (IOException e) {\r
+                               }\r
+                       }\r
+                       if (httpclient != null) {\r
+                               httpclient.getConnectionManager().shutdown();\r
+                       }\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+       public void queryOtherMedias(List<String> poolContent, Map<String, MMMedia> result) throws Exception {\r
+               String xml = null;\r
+               String soap = null;\r
+\r
+               Path template = getSOAPTemplate(GETCUSTOMVIEW);\r
+\r
+               if (!template.toFile().exists())\r
+                       throw new FileNotFoundException(template.toString());\r
+               try {\r
+                       soap = new String(Files.readAllBytes(template));\r
+                       xml = query(primaryEndPoint, GETCUSTOMVIEW, soap, primaryUserName, primaryPassword);\r
+               } catch (Exception e1) {\r
+                       try {\r
+                               xml = query(secondaryEndPoint, GETCUSTOMVIEW, soap, secondaryUserName, secondaryPassword);\r
+                       } catch (Exception e2) {\r
+                       }\r
+               }\r
+\r
+               if (StringUtils.isBlank(xml)) {\r
+                       logger.info("Query result is empty");\r
+                       return;\r
+               }\r
+\r
+               Document document = toDocument(xml);\r
+               NodeList mediaNodes = document.getElementsByTagName("media");\r
+\r
+               if (mediaNodes == null || mediaNodes.getLength() == 0)\r
+                       return;\r
+\r
+               for (int i = 0; i < mediaNodes.getLength(); i++) {\r
+                       Node mediaNode = mediaNodes.item(i);\r
+                       String mediaName = getAttribute(mediaNode, "mediaName");\r
+                       if (StringUtils.isBlank(mediaName)) {\r
+                               continue;\r
+                       }\r
+\r
+                       String usageType = getAttribute(mediaNode, "UsageType");\r
+                       if (!"PrimaryVideo".equals(usageType) && !"Live".equals(usageType))\r
+                               logger.info(subtitleMarker, "queryOtherMedias: {}, {}", usageType, mediaName);\r
+\r
+                       if (poolContent.contains(mediaName))\r
+                               continue;\r
+\r
+                       String usageTime = getAttribute(mediaNode, "earliestUsageTime");\r
+                       putEarliest(result, mediaName, usageTime);\r
+               }\r
+\r
+               logger.info("Document done, items {}", mediaNodes.getLength());\r
+\r
+       }\r
+\r
+       public Map<String, MMMedia> querySortableMedias(List<String> poolContent) throws Exception {\r
+               Map<String, MMMedia> result = new HashMap<>();\r
+\r
+               String xml = null;\r
+               String soap = null;\r
+\r
+               Path template = getSOAPTemplate(GETMEDIAUSAGEBYUTRANGE);\r
+\r
+               if (!template.toFile().exists())\r
+                       throw new FileNotFoundException(template.toString());\r
+\r
+               try {\r
+                       long now = System.currentTimeMillis();\r
+                       Calendar cal = Calendar.getInstance();\r
+                       cal.setTimeInMillis(now);\r
+                       cal.add(Calendar.HOUR_OF_DAY, rangeForwardHours);\r
+\r
+                       String fromDateStr = sdf_range.format(new Date(now));\r
+                       String toDateStr = sdf_range.format(cal.getTime());\r
+\r
+                       soap = new String(Files.readAllBytes(template));\r
+                       soap = soap.replace("{start}", fromDateStr);\r
+                       soap = soap.replace("{end}", toDateStr);\r
+\r
+                       xml = query(primaryEndPoint, GETMEDIAUSAGEBYUTRANGE, soap, primaryUserName, primaryPassword);\r
+               } catch (Exception e1) {\r
+                       try {\r
+                               xml = query(secondaryEndPoint, GETMEDIAUSAGEBYUTRANGE, soap, secondaryUserName, secondaryPassword);\r
+                       } catch (Exception e2) {\r
+                       }\r
+               }\r
+\r
+               if (StringUtils.isBlank(xml)) {\r
+                       logger.info("Query result is empty");\r
+                       return result;\r
+               }\r
+\r
+               Document document = toDocument(xml);\r
+               NodeList mediaNodes = document.getElementsByTagName("mediaUsage");\r
+\r
+               if (mediaNodes == null || mediaNodes.getLength() == 0)\r
+                       return result;\r
+\r
+               for (int i = 0; i < mediaNodes.getLength(); i++) {\r
+                       Node mediaNode = mediaNodes.item(i);\r
+                       String mediaName = getAttribute(mediaNode, "mediaName");\r
+                       String mediaType = getAttribute(mediaNode, "mediaType");\r
+                       if (StringUtils.isBlank(mediaName))\r
+                               continue;\r
+\r
+                       if (StringUtils.equals("Subtitle", mediaType)) {\r
+                               logger.info(this.subtitleMarker, "Missing subtitle: {}", mediaName);\r
+\r
+                               try {\r
+                                       this.copyMissingSubtitle(mediaName + ".stl");\r
+                               } catch (Exception e) {\r
+                                       logger.error(this.subtitleMarker, e.getMessage());\r
+                               }\r
+\r
+                               continue;\r
+                       }\r
+\r
+                       if (!StringUtils.equals("Video", mediaType))\r
+                               continue;\r
+\r
+                       if (poolContent.contains(mediaName))\r
+                               continue;\r
+\r
+                       Node usageChild = mediaNode.getFirstChild();\r
+                       if (usageChild == null) {\r
+                               logger.info("Skipping {}, no media usage defined", mediaName);\r
+                               continue;\r
+                       }\r
+\r
+                       NodeList usageNodes = usageChild.getChildNodes();\r
+                       if (usageNodes == null || usageNodes.getLength() == 0) {\r
+                               logger.info("Skipping {}, no media usage defined", mediaName);\r
+                               continue;\r
+                       }\r
+\r
+                       for (int j = 0; j < usageNodes.getLength(); j++) {\r
+                               Node mediaUsageNode = usageNodes.item(j);\r
+                               String usageTime = getAttribute(mediaUsageNode, "earliestUsageTime");\r
+                               logger.info("{}, {}", mediaName, usageTime);\r
+                               putEarliest(result, mediaName, usageTime);\r
+                       }\r
+\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+       private Set<Path> readSubtileDirectoriesList(Path root) {\r
+               Set<Path> result = new HashSet<>();\r
+               DirectoryStream<Path> stream = null;\r
+               try {\r
+                       stream = Files.newDirectoryStream(Paths.get(root.toString()));\r
+                       Iterator<Path> dirIterator = stream.iterator();\r
+\r
+                       while (dirIterator.hasNext()) {\r
+                               Path path = dirIterator.next();\r
+                               if (Files.isDirectory(path)) {\r
+                                       result.add(path);\r
+                                       logger.info(this.subtitleMarker, "Detected subtitle root {}", path);\r
+                               }\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.error(this.subtitleMarker, e.getMessage());\r
+               } finally {\r
+                       try {\r
+                               if (stream != null)\r
+                                       stream.close();\r
+                       } catch (IOException e) {\r
+                       }\r
+\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private void copyMissingSubtitle(String subtitleName) throws Exception {\r
+               boolean found = false;\r
+               for (Path subtitleDir : this.subsDirectoriesList) {\r
+                       Path source = Paths.get(subtitleDir.toString(), new String[] { subtitleName });\r
+                       if (source.toFile().exists()) {\r
+                               found = true;\r
+                               logger.info(this.subtitleMarker, "Found missing {}", source);\r
+                               Path target = Paths.get(missingSubsRoot.toString(), new String[] { subtitleName });\r
+                               if (target.toFile().exists())\r
+                                       logger.info(this.subtitleMarker, "Missing subtitle {} already exists, overriding", target);\r
+                               Files.copy(source, target, new CopyOption[] { StandardCopyOption.REPLACE_EXISTING });\r
+                               boolean isContentEquals = Arrays.equals(Files.readAllBytes(source), Files.readAllBytes(target));\r
+                               if (isContentEquals) {\r
+                                       logger.info(this.subtitleMarker, "Successfully copied {}", target);\r
+                                       break;\r
+                               }\r
+                               logger.error(this.subtitleMarker, "Source {} and target {} content are not equals", source, target);\r
+                               break;\r
+                       }\r
+               }\r
+               if (!found)\r
+                       logger.warn(this.subtitleMarker, "Can't find missing {}", subtitleName);\r
+       }\r
+}\r
diff --git a/server/-product/production/AMC/jobs/templates/FILEZILLA_AVID-validate-and-restore.xml b/server/-product/production/AMC/jobs/templates/FILEZILLA_AVID-validate-and-restore.xml
new file mode 100644 (file)
index 0000000..5395ce4
--- /dev/null
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="tsmFileName" type="java.lang.String"/>\r
+                       <parameter name="fileName" type="java.lang.String"/>\r
+                       <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+                       <parameter name="expectedSize" type="java.lang.Long"/>\r
+                       <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+                       <parameter name="escortFile" type="java.lang.String"/>\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="TSMTransferFromStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="tsmFileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileValidatorStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedFrameNumber" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedSize" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedColorSpace" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FILEZILLA_AVIDTransferToStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="NEXIOMetadataPersisterStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileCleanupStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/FILEZILLA_PASARESTORE-validate-and-archive.xml b/server/-product/production/AMC/jobs/templates/FILEZILLA_PASARESTORE-validate-and-archive.xml
new file mode 100644 (file)
index 0000000..7caa7e2
--- /dev/null
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="fileName" type="java.lang.String"/>\r
+                       <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+                       <parameter name="expectedSize" type="java.lang.Long"/>\r
+                       <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+                       <parameter name="escortFile" type="java.lang.String"/>\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="TransferStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileValidatorStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedFrameNumber" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedSize" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedColorSpace" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="TSMTransferToStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="MetadataPersisterStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileCleanupStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/FILEZILLA_PASARESTORE-validate-and-restore.xml b/server/-product/production/AMC/jobs/templates/FILEZILLA_PASARESTORE-validate-and-restore.xml
new file mode 100644 (file)
index 0000000..da82bd6
--- /dev/null
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="tsmFileName" type="java.lang.String"/>\r
+                       <parameter name="fileName" type="java.lang.String"/>\r
+                       <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+                       <parameter name="expectedSize" type="java.lang.Long"/>\r
+                       <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+                       <parameter name="escortFile" type="java.lang.String"/>\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="TSMTransferFromStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="tsmFileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileValidatorStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedFrameNumber" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedSize" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedColorSpace" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FILEZILLA_PASARESTORETransferToStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="NEXIOMetadataPersisterStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileCleanupStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/NEXIO1-validate-and-archive.xml b/server/-product/production/AMC/jobs/templates/NEXIO1-validate-and-archive.xml
new file mode 100644 (file)
index 0000000..7426382
--- /dev/null
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="fileName" type="java.lang.String"/>\r
+                       <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+                       <parameter name="expectedSize" type="java.lang.Long"/>\r
+                       <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+                       <parameter name="escortFile" type="java.lang.String"/>\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="NEXIO1TransferFromStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileValidatorStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedFrameNumber" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedSize" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedColorSpace" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="TSMTransferToStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="MetadataPersisterStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileCleanupStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/NEXIO1-validate-and-restore.xml b/server/-product/production/AMC/jobs/templates/NEXIO1-validate-and-restore.xml
new file mode 100644 (file)
index 0000000..5b11ead
--- /dev/null
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="tsmFileName" type="java.lang.String"/>\r
+                       <parameter name="fileName" type="java.lang.String"/>\r
+                       <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+                       <parameter name="expectedSize" type="java.lang.Long"/>\r
+                       <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+                       <parameter name="escortFile" type="java.lang.String"/>\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="TSMTransferFromStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="tsmFileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileValidatorStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedFrameNumber" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedSize" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedColorSpace" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="NEXIO1TransferToStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="NEXIOMetadataPersisterStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileCleanupStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/NEXIO2-validate-and-archive.xml b/server/-product/production/AMC/jobs/templates/NEXIO2-validate-and-archive.xml
new file mode 100644 (file)
index 0000000..005122a
--- /dev/null
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="fileName" type="java.lang.String"/>\r
+                       <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+                       <parameter name="expectedSize" type="java.lang.Long"/>\r
+                       <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+                       <parameter name="escortFile" type="java.lang.String"/>\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="NEXIO2TransferFromStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileValidatorStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedFrameNumber" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedSize" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedColorSpace" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="TSMTransferToStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="MetadataPersisterStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileCleanupStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/NEXIO2-validate-and-restore.xml b/server/-product/production/AMC/jobs/templates/NEXIO2-validate-and-restore.xml
new file mode 100644 (file)
index 0000000..15b0e18
--- /dev/null
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="tsmFileName" type="java.lang.String"/>\r
+                       <parameter name="fileName" type="java.lang.String"/>\r
+                       <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+                       <parameter name="expectedSize" type="java.lang.Long"/>\r
+                       <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+                       <parameter name="escortFile" type="java.lang.String"/>\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="TSMTransferFromStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="tsmFileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileValidatorStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedFrameNumber" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedSize" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedColorSpace" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="NEXIO2TransferToStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="NEXIOMetadataPersisterStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileCleanupStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/PASAPOOL-validate-and-restore.xml b/server/-product/production/AMC/jobs/templates/PASAPOOL-validate-and-restore.xml
new file mode 100644 (file)
index 0000000..df9ebe1
--- /dev/null
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="tsmFileName" type="java.lang.String"/>\r
+                       <parameter name="fileName" type="java.lang.String"/>\r
+                       <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+                       <parameter name="expectedSize" type="java.lang.Long"/>\r
+                       <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+                       <parameter name="escortFile" type="java.lang.String"/>\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="TSMTransferFromStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="tsmFileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileValidatorStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedFrameNumber" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedSize" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedColorSpace" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="PASAPOOLTransferToStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="NEXIOMetadataPersisterStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileCleanupStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/PB-archive-checker.xml b/server/-product/production/AMC/jobs/templates/PB-archive-checker.xml
new file mode 100644 (file)
index 0000000..54d3606
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!-- A PB ARCHIVE mappat vizsgalva, megkeresi azokat a fajlokat, amik archivalhatoak. Ezekre archivalasi bejegyzest keszit.  -->\r
+<jobtemplate useSessionLog="false">\r
+<declarations>\r
+       <parameters>\r
+               <parameter name="sourceStoreName" type="java.lang.String"/>\r
+               <parameter name="escortStoreName" type="java.lang.String"/>\r
+               <parameter name="lastModifiedHours" type="java.lang.Integer"/>\r
+       </parameters>\r
+</declarations>\r
+<commands>\r
+       <calljobstep type="PBArchiveCheckerStep.java" weight="1">\r
+               <inputs>\r
+                       <input>\r
+                               <parameter name="sourceStoreName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="escortStoreName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="lastModifiedHours" />\r
+                       </input>\r
+               </inputs>\r
+       </calljobstep>\r
+</commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/PBARCHIVE-validate-and-archive.xml b/server/-product/production/AMC/jobs/templates/PBARCHIVE-validate-and-archive.xml
new file mode 100644 (file)
index 0000000..7740b8e
--- /dev/null
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="fileName" type="java.lang.String"/>\r
+                       <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+                       <parameter name="expectedSize" type="java.lang.Long"/>\r
+                       <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+                       <parameter name="escortFile" type="java.lang.String"/>\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="PBARCHIVETransferFromStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="EscortFileUpdaterStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="TSMTransferToStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="MetadataPersisterStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileCleanupStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/VOD-validate-and-restore.xml b/server/-product/production/AMC/jobs/templates/VOD-validate-and-restore.xml
new file mode 100644 (file)
index 0000000..5cdcadb
--- /dev/null
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="tsmFileName" type="java.lang.String"/>\r
+                       <parameter name="fileName" type="java.lang.String"/>\r
+                       <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="relativeTargetPath" type="java.lang.String"/>\r
+                       <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+                       <parameter name="expectedSize" type="java.lang.Long"/>\r
+                       <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+                       <parameter name="escortFile" type="java.lang.String"/>\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="TSMTransferFromStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="tsmFileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileValidatorStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedFrameNumber" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedSize" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedColorSpace" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="VODTransferToStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="relativeTargetPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileCleanupStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/cancelable.xml b/server/-product/production/AMC/jobs/templates/cancelable.xml
new file mode 100644 (file)
index 0000000..fa29cc3
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="param" type="java.lang.Integer" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep remote="true" type="CancelableStep.java" weight="1" >\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="param" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/create-lowres-ondemand.xml b/server/-product/production/AMC/jobs/templates/create-lowres-ondemand.xml
new file mode 100644 (file)
index 0000000..375beb2
--- /dev/null
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="mediaCubeMedia" type="user.jobengine.db.Media" />\r
+                       <parameter name="deleteSource" type="java.lang.Boolean"/>\r
+                       <parameter name="killDateDays" type="java.lang.Integer"/>\r
+                       <parameter name="successRecipient" type="java.lang.String" />\r
+                       <parameter name="localHiresPath" type="java.lang.String" />\r
+                       <parameter name="globalHiresPath" type="java.lang.String" />\r
+                       <parameter name="localLowresPath" type="java.lang.String" />\r
+                       <parameter name="transcoderAddress" type="java.lang.String" />\r
+                       <parameter name="transcoderTemplateName" type="java.lang.String" />\r
+                       <parameter name="localRetrievePath" type="java.lang.String" />\r
+                       <parameter name="globalRetrievePath" type="java.lang.String" />\r
+                       <parameter name="targetNamePattern" type="java.lang.String" />\r
+               </parameters>\r
+               <variables>\r
+                       <variable name="archiveItem" type="user.jobengine.server.steps.ArchiveItem" />\r
+               </variables>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="user.jobengine.server.steps.CreateArchiveItemStep" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="mediaCubeMedia" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="localHiresPath" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="archiveItem" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>\r
+               <calljobstep type="user.jobengine.server.steps.TSMRestoreStep" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="mediaCubeMedia" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="localHiresPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetNamePattern" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="successRecipient" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="killDateDays" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="localRetrievePath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="globalRetrievePath" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="user.jobengine.server.steps.MediaToolStep" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="archiveItem" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="mediaCubeMedia" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="user.jobengine.server.steps.TranscodeFFAStranStep" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="archiveItem" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="mediaCubeMedia" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="transcoderAddress" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="transcoderTemplateName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="globalHiresPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="localLowresPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="deleteSource" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="user.jobengine.server.steps.UpdateGhostMediaData" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="mediaCubeMedia" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/fork-validate-and-archive.xml b/server/-product/production/AMC/jobs/templates/fork-validate-and-archive.xml
new file mode 100644 (file)
index 0000000..5136c36
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceStoreName" type="java.lang.String" />\r
+                       <parameter name="template" type="java.lang.String"/>\r
+                       <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+                       <parameter name="limit" type="java.lang.Integer" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="ForkDownloadStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceStoreName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="template" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedColorSpace"/>\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="limit" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/fork-validate-and-restore.xml b/server/-product/production/AMC/jobs/templates/fork-validate-and-restore.xml
new file mode 100644 (file)
index 0000000..bddbab6
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceStoreName" type="java.lang.String" />\r
+                       <parameter name="template" type="java.lang.String"/>\r
+                       <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+                       <parameter name="limit" type="java.lang.Integer" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="ForkUploadStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceStoreName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="template" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedColorSpace" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="limit" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/generic-archive-checker.xml b/server/-product/production/AMC/jobs/templates/generic-archive-checker.xml
new file mode 100644 (file)
index 0000000..500369e
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!-- Egy server egy mappajat vegigolvasva, megkeresi azokat a fajlokat amik valtoztak, es a tarolo valamint a fajl nevebol kepez egy statusz fajlt.  -->\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+<declarations>\r
+       <parameters>\r
+               <parameter name="sourceStoreName" type="java.lang.String"/>\r
+               <parameter name="protocol" type="java.lang.String"/>\r
+               <parameter name="wildCard" type="java.lang.String"/>\r
+               <parameter name="escortStoreName" type="java.lang.String"/>\r
+               <parameter name="limit" type="java.lang.Integer"/>\r
+       </parameters>\r
+</declarations>\r
+<commands>\r
+       <calljobstep type="GenericArchiveCheckerStep.java" weight="1">\r
+               <inputs>\r
+                       <input>\r
+                               <parameter name="sourceStoreName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="protocol" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="wildCard" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="escortStoreName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="limit" />\r
+                       </input>\r
+               </inputs>\r
+       </calljobstep>\r
+</commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/harris1-missingmaterial-checker.xml b/server/-product/production/AMC/jobs/templates/harris1-missingmaterial-checker.xml
new file mode 100644 (file)
index 0000000..5777fa2
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!-- A VIC fajlok tartalma alapjan a hianyzo media fajlok nevebol kepez statusz fajlokat.  -->\r
+<jobtemplate useSessionLog="false">\r
+<declarations>\r
+       <parameters>\r
+               <parameter name="vicFiles" type="com.ibm.nosql.json.api.BasicDBList"/>\r
+               <parameter name="escortStoreName" type="java.lang.String"/>\r
+               <parameter name="targetStoreName" type="java.lang.String"/>\r
+               <parameter name="targetProtocol" type="java.lang.String"/>\r
+       </parameters>\r
+</declarations>\r
+<commands>\r
+       <calljobstep type="HarrisMissingMaterialCheckerStep.java" weight="1">\r
+               <inputs>\r
+                       <input>\r
+                               <parameter name="vicFiles" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="escortStoreName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="targetStoreName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="targetProtocol" />\r
+                       </input>\r
+               </inputs>\r
+       </calljobstep>\r
+</commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/harris2-missingmaterial-checker.xml b/server/-product/production/AMC/jobs/templates/harris2-missingmaterial-checker.xml
new file mode 100644 (file)
index 0000000..5777fa2
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!-- A VIC fajlok tartalma alapjan a hianyzo media fajlok nevebol kepez statusz fajlokat.  -->\r
+<jobtemplate useSessionLog="false">\r
+<declarations>\r
+       <parameters>\r
+               <parameter name="vicFiles" type="com.ibm.nosql.json.api.BasicDBList"/>\r
+               <parameter name="escortStoreName" type="java.lang.String"/>\r
+               <parameter name="targetStoreName" type="java.lang.String"/>\r
+               <parameter name="targetProtocol" type="java.lang.String"/>\r
+       </parameters>\r
+</declarations>\r
+<commands>\r
+       <calljobstep type="HarrisMissingMaterialCheckerStep.java" weight="1">\r
+               <inputs>\r
+                       <input>\r
+                               <parameter name="vicFiles" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="escortStoreName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="targetStoreName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="targetProtocol" />\r
+                       </input>\r
+               </inputs>\r
+       </calljobstep>\r
+</commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/nexio1-archive-checker.xml b/server/-product/production/AMC/jobs/templates/nexio1-archive-checker.xml
new file mode 100644 (file)
index 0000000..991c062
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!-- A NEXIO server-t lekerdezve, megkeresi azokat a fajlokat amik valtoztak, es a tarolo valamint a fajl nevebol kepez egy statusz fajlt.  -->\r
+<jobtemplate useSessionLog="false">\r
+<declarations>\r
+       <parameters>\r
+               <parameter name="sourceStoreName" type="java.lang.String"/>\r
+               <parameter name="escortStoreName" type="java.lang.String"/>\r
+               <parameter name="lastModifiedHours" type="java.lang.Integer"/>\r
+       </parameters>\r
+</declarations>\r
+<commands>\r
+       <calljobstep type="NEXIOArchiveCheckerStep.java" weight="1">\r
+               <inputs>\r
+                       <input>\r
+                               <parameter name="sourceStoreName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="escortStoreName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="lastModifiedHours" />\r
+                       </input>\r
+               </inputs>\r
+       </calljobstep>\r
+</commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/nexio2-archive-checker.xml b/server/-product/production/AMC/jobs/templates/nexio2-archive-checker.xml
new file mode 100644 (file)
index 0000000..991c062
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!-- A NEXIO server-t lekerdezve, megkeresi azokat a fajlokat amik valtoztak, es a tarolo valamint a fajl nevebol kepez egy statusz fajlt.  -->\r
+<jobtemplate useSessionLog="false">\r
+<declarations>\r
+       <parameters>\r
+               <parameter name="sourceStoreName" type="java.lang.String"/>\r
+               <parameter name="escortStoreName" type="java.lang.String"/>\r
+               <parameter name="lastModifiedHours" type="java.lang.Integer"/>\r
+       </parameters>\r
+</declarations>\r
+<commands>\r
+       <calljobstep type="NEXIOArchiveCheckerStep.java" weight="1">\r
+               <inputs>\r
+                       <input>\r
+                               <parameter name="sourceStoreName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="escortStoreName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="lastModifiedHours" />\r
+                       </input>\r
+               </inputs>\r
+       </calljobstep>\r
+</commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/peablebeach-missingmaterial-checker.xml b/server/-product/production/AMC/jobs/templates/peablebeach-missingmaterial-checker.xml
new file mode 100644 (file)
index 0000000..b05b2ef
--- /dev/null
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!-- A PB API hivasok alapjan a hianyzo media fajlok nevebol kepez statusz fajlokat.  -->\r
+<jobtemplate useSessionLog="false">\r
+<declarations>\r
+       <parameters>\r
+               <parameter name="escortStoreName" type="java.lang.String"/>\r
+               <parameter name="lookupStoreNames" type="com.ibm.nosql.json.api.BasicDBList"/>\r
+               <parameter name="targetStoreName" type="java.lang.String"/>\r
+               <parameter name="targetProtocol" type="java.lang.String"/>\r
+               <parameter name="primaryEndPoint" type="java.lang.String"/>\r
+               <parameter name="primaryUserName" type="java.lang.String"/>\r
+               <parameter name="primaryPassword" type="java.lang.String"/>\r
+               <parameter name="secondaryEndPoint" type="java.lang.String"/>\r
+               <parameter name="secondaryUserName" type="java.lang.String"/>\r
+               <parameter name="secondaryPassword" type="java.lang.String"/>\r
+               <parameter name="rangeForwardHours" type="java.lang.Integer"/>\r
+       </parameters>\r
+</declarations>\r
+<commands>\r
+       <calljobstep type="PeableBeachMissingMaterialCheckerStep.java" weight="1">\r
+               <inputs>\r
+                       <input>\r
+                               <parameter name="escortStoreName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="lookupStoreNames" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="targetStoreName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="targetProtocol" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="primaryEndPoint" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="primaryUserName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="primaryPassword" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="secondaryEndPoint" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="secondaryUserName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="secondaryPassword" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="rangeForwardHours" />\r
+                       </input>\r
+               </inputs>\r
+       </calljobstep>\r
+</commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/register-user-restore.xml b/server/-product/production/AMC/jobs/templates/register-user-restore.xml
new file mode 100644 (file)
index 0000000..43a94d2
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="escortStoreName" type="java.lang.String" />\r
+                       <parameter name="targetStoreName" type="java.lang.String"/>\r
+                       <parameter name="basket" type="java.util.ArrayList" />\r
+                       <parameter name="recipient" type="java.lang.String" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="RegisterUserRestoreStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="escortStoreName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetStoreName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="basket"/>\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="recipient" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/register-vod-restore.xml b/server/-product/production/AMC/jobs/templates/register-vod-restore.xml
new file mode 100644 (file)
index 0000000..ac99610
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="targetStoreName" type="java.lang.String" />\r
+                       <parameter name="basket" type="com.ibm.nosql.json.api.BasicDBList" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="RegisterVODRestoreStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="targetStoreName"/>\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="basket"/>\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/server-status-report.xml b/server/-product/production/AMC/jobs/templates/server-status-report.xml
new file mode 100644 (file)
index 0000000..eec3da6
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate useSessionLog="false">\r
+       <commands>\r
+               <calljobstep type="ServerStatusReportStep.java" weight="1" />\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/sync-subtitles.xml b/server/-product/production/AMC/jobs/templates/sync-subtitles.xml
new file mode 100644 (file)
index 0000000..475ab5d
--- /dev/null
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate>\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceFolder" type="java.lang.String" />\r
+                       <parameter name="filter" type="java.lang.String" />\r
+                       <parameter name="syncTarget" type="java.lang.String" />\r
+               </parameters>\r
+               <variables>\r
+                       <variable name="files" type="java.util.List" />\r
+               </variables>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep remote="true" type="SubtitleFilesCollectorStep.java" weight="1" >\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceFolder" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="filter" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="files" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>\r
+               <calljobstep remote="true" type="ArchiveSubtitlesStep.java" weight="4" >\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="files" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="syncTarget" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/test-fork-cancelable.xml b/server/-product/production/AMC/jobs/templates/test-fork-cancelable.xml
new file mode 100644 (file)
index 0000000..8c88d84
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+<commands>\r
+       <calljobstep type="TestForkCancelableStep.java" weight="1" />\r
+</commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/jobs/templates/validate-dir-mxf.xml b/server/-product/production/AMC/jobs/templates/validate-dir-mxf.xml
new file mode 100644 (file)
index 0000000..2a2972b
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate>\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="source" type="java.lang.String"/>\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="DirMXFValidatorStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="source" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/AMC/settings/application.yaml b/server/-product/production/AMC/settings/application.yaml
new file mode 100644 (file)
index 0000000..78d138a
--- /dev/null
@@ -0,0 +1,37 @@
+datasource:\r
+  mediacube:\r
+    url: jdbc:db2://192.168.0.15:50000/mc\r
+    user: db2admin\r
+    password: password\r
+    external-indexer: false\r
+    simple-search: true\r
+    login-timeout: 3\r
+    pool-size: 10\r
+  mediacube-nosql:\r
+    url: jdbc:db2://192.168.0.15:50000/mc\r
+    user: db2admin\r
+    password: password\r
+    schema: test\r
+    login-timeout: 3\r
+services:\r
+  ffmpeg:\r
+    execurable-location: /opt/ffmpeg/ffmpeg \r
+  mediacube:\r
+    proxy-root: /opt\r
+  nexio:\r
+    host: 10.10.1.55\r
+    collection-name: nexioclips\r
+    use-mos-gateway: true\r
+    disabled: true\r
+jobs:\r
+  validate-transfers: false\r
+  copy-buffer-size: 32768\r
+  scheduled-execution-disabled: false\r
+tsm:\r
+  randomize-archives: false \r
+  delimiter: \\r
+  node-name: PASANODE\r
+  fs-name: NEXIO\r
+  alternate-fs-name: PASA\r
+  hl-name: \\r
+   
\ No newline at end of file
diff --git a/server/-product/production/AMC/settings/dsm.opt b/server/-product/production/AMC/settings/dsm.opt
new file mode 100644 (file)
index 0000000..952cfa1
--- /dev/null
@@ -0,0 +1,6 @@
+NODENAME         pasanode\r
+TCPSERVERADDRESS 192.168.0.9\r
+passwordaccess   generate\r
+\r
+commmethod       TCPIP\r
+tcpport          1500\r
diff --git a/server/-product/production/AMC/settings/jetty.xml b/server/-product/production/AMC/settings/jetty.xml
new file mode 100644 (file)
index 0000000..68c7716
--- /dev/null
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
+
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+       <Call name="addConnector">
+               <Arg>
+                       <New class="org.eclipse.jetty.server.ServerConnector">
+                               <Arg name="server">
+                                       <Ref refid="Server" />
+                               </Arg>
+                               <Set name="port">
+                                       <Property name="jetty.http.port" default="80" />
+                               </Set>
+                       </New>
+               </Arg>
+       </Call>
+
+       <Set name="handler">
+               <New id="Handlers"
+                       class="org.eclipse.jetty.server.handler.HandlerCollection">
+                       <Set name="handlers">
+                               <Array type="org.eclipse.jetty.server.Handler">
+                                       <Item>
+                                               <New id="Contexts"
+                                                       class="org.eclipse.jetty.server.handler.ContextHandlerCollection" />
+                                       </Item>
+                                       <Item>
+                                               <New id="DefaultHandler"
+                                                       class="org.eclipse.jetty.server.handler.DefaultHandler" />
+                                       </Item>
+                               </Array>
+                       </Set>
+               </New>
+       </Set>
+</Configure>
\ No newline at end of file
diff --git a/server/-product/production/AMC/settings/log4j2-210810.xml b/server/-product/production/AMC/settings/log4j2-210810.xml
new file mode 100644 (file)
index 0000000..b3d6ea0
--- /dev/null
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<Configuration status="ERROR" monitorInterval="10" packages="user.commons.log4j2.appender">\r
+       <Properties>\r
+               <Property name="logPath">log</Property>\r
+               <Property name="fileName">${logPath}/mediacube.log</Property>\r
+               <Property name="filePattern">${logPath}/$${date:yyyy-MM}/mediacube-%d{MM-dd-yyyy}-%i.log.gz</Property>\r
+               <Property name="markeredFileName">${logPath}/markered-mediacube.log</Property>\r
+               <Property name="markeredFilePattern">${logPath}/$${date:yyyy-MM}/markered-mediacube-%d{MM-dd-yyyy}-%i.log.gz</Property>\r
+               <Property name="fileName.err">${logPath}/mediacube-err.log</Property>\r
+               <Property name="filePattern.err">${logPath}/$${date:yyyy-MM}/mediacube-err-%d{MM-dd-yyyy}-%i.log.gz</Property>\r
+       </Properties>\r
+       <Appenders>\r
+               <File name="MediaProfile" fileName="${logPath}/mediaprofile.log">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MEDIAPROFILE" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %msg%n" />\r
+               </File>\r
+               <File name="MissingSubtitle" fileName="${logPath}/missingsubtitle.log">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MISSING-SUBTITLE" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %msg%n" />\r
+               </File>\r
+       \r
+               <Console name="Console" target="SYSTEM_OUT">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MEDIACUBE" onMatch="DENY" onMismatch="NEUTRAL" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L) %n" />\r
+               </Console>\r
+               <Console name="MarkeredConsole" target="SYSTEM_ERR">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MEDIACUBE" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %markerSimpleName - %msg (%F:%L)%n" />\r
+               </Console>\r
+               <HTMLMailAppender name="MarkeredMail" subject="MediaCube rendszerüzenet" to="vasary@elgekko.net" from="broadcast.service-ce@amcnetworks.com" smtpHost="10.160.60.165"\r
+                       smtpPort="125" smtpProtocol="smtp" smtpDebug="false" ignoreExceptions="false" bufferSize="1">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MEDIACUBE" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss} %-5level - %msg %n" />\r
+               </HTMLMailAppender>\r
+               <RollingFile name="MarkeredRollingFile" fileName="${markeredFileName}" filePattern="${markeredFilePattern}">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MEDIACUBE FILELOG" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile1" fileName="${logPath}/nexio1-archive-checker.log" filePattern="${markeredFilePattern}">\r
+                       <Filters>\r
+                               <MarkerFilter marker="NEXIO1 archiválás előkészítése" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %msg %n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile2" fileName="${logPath}/nexio2-archive-checker.log" filePattern="${markeredFilePattern}">\r
+                       <Filters>\r
+                               <MarkerFilter marker="NEXIO2 archiválás előkészítése" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %msg %n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile3" fileName="${logPath}/fork-validate-and-archive.log" filePattern="${markeredFilePattern}">\r
+                       <Filters>\r
+                               <MarkerFilter marker="Kötegelt validálás és archiválás" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile4" fileName="${logPath}/harris1-missingmaterial-checker.log" filePattern="${markeredFilePattern}">\r
+                       <Filters>\r
+                               <MarkerFilter marker="HARRIS1 missing material lekérdezés" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %msg %n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile5" fileName="${logPath}/harris2-missingmaterial-checker.log" filePattern="${markeredFilePattern}">\r
+                       <Filters>\r
+                               <MarkerFilter marker="HARRIS2 missing material lekérdezés" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %msg %n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile6" fileName="${logPath}/peablebeach-missingmaterial-checker.log" filePattern="${markeredFilePattern}">\r
+                       <Filters>\r
+                               <MarkerFilter marker="PEABLEBEACH missing material lekérdezés" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile7" fileName="${logPath}/fork-validate-and-restore.log" filePattern="${markeredFilePattern}">\r
+                       <Filters>\r
+                               <MarkerFilter marker="Kötegelt validálás és visszatöltés" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile8" fileName="${logPath}/validate-and-archive.log" filePattern="${markeredFilePattern}">\r
+                       <Filters>\r
+                               <MarkerFilter marker="Archiválás" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile9" fileName="${logPath}/validate-and-restore.log" filePattern="${markeredFilePattern}">\r
+                       <Filters>\r
+                               <MarkerFilter marker="Visszatöltés" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile10" fileName="${logPath}/sync-subtitles.log" filePattern="${markeredFilePattern}">\r
+                       <Filters>\r
+                               <MarkerFilter marker="Feliratok szinkronizálása" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile11" fileName="${logPath}/pb-archive-checker.log" filePattern="${markeredFilePattern}">\r
+                       <Filters>\r
+                               <MarkerFilter marker="PEABLEBEACH archiválás előkészítése" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="RollingFile" fileName="${fileName}" filePattern="${filePattern}">\r
+                       <Filters>\r
+                               <!-- <MarkerFilter marker="MEDIACUBE" onMatch="DENY" onMismatch="NEUTRAL" /> -->\r
+                               <MarkerFilter marker="MEDIACUBE FILELOG" onMatch="DENY" onMismatch="NEUTRAL" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %level %logger{1}.%M %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="RollingFileExceptions" fileName="${fileName.err}" filePattern="${filePattern.err}">\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %logger{1}.%M %msg (%F:%L)%n %throwable" />\r
+                       <Filters>\r
+                               <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               \r
+       </Appenders>\r
+       <Loggers>\r
+               <Root level="INFO">\r
+                       <AppenderRef ref="MediaProfile" />\r
+                       <AppenderRef ref="MissingSubtitle" />\r
+                       <AppenderRef ref="Console" />\r
+                       <AppenderRef ref="MarkeredConsole" />\r
+                       <AppenderRef ref="RollingFile" />\r
+                       <AppenderRef ref="RollingFileExceptions" />\r
+                       <AppenderRef ref="MarkeredRollingFile" />\r
+                       <AppenderRef ref="MarkeredRollingFile1" />\r
+                       <AppenderRef ref="MarkeredRollingFile2" />\r
+                       <AppenderRef ref="MarkeredRollingFile3" />\r
+                       <AppenderRef ref="MarkeredRollingFile4" />\r
+                       <AppenderRef ref="MarkeredRollingFile5" />\r
+                       <AppenderRef ref="MarkeredRollingFile6" />\r
+                       <AppenderRef ref="MarkeredRollingFile7" />\r
+                       <AppenderRef ref="MarkeredRollingFile8" />\r
+                       <AppenderRef ref="MarkeredRollingFile9" />\r
+                       <AppenderRef ref="MarkeredRollingFile10" />\r
+                       <AppenderRef ref="MarkeredRollingFile11" />\r
+                       <AppenderRef ref="MarkeredRollingFile11" />\r
+                       <AppenderRef ref="MarkeredMail" />\r
+               </Root>\r
+               <Logger name="org.zkoss" level="ERROR" additivity="false" />\r
+               <Logger name="org.quartz" level="ERROR" additivity="false" />\r
+               <Logger name="org.eclipse.jetty.osgi.boot" level="ERROR" additivity="false" />\r
+               <Logger name="user.commons.pool" level="DEBUG" additivity="false" />\r
+       </Loggers>\r
+</Configuration>\r
diff --git a/server/-product/production/AMC/settings/log4j2.xml b/server/-product/production/AMC/settings/log4j2.xml
new file mode 100644 (file)
index 0000000..74fbfa7
--- /dev/null
@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<Configuration status="ERROR" monitorInterval="10" packages="user.commons.log4j2.appender">\r
+       <Properties>\r
+               <Property name="logPath">log</Property>\r
+               <Property name="fileName">${logPath}/mediacube.log</Property>\r
+               <Property name="filePattern">${logPath}/$${date:yyyy-MM}/mediacube-%d{MM-dd-yyyy}-%i.log.gz</Property>\r
+               <Property name="markeredFileName">${logPath}/markered-mediacube.log</Property>\r
+               <Property name="markeredFilePattern">${logPath}/$${date:yyyy-MM}/markered-mediacube-%d{MM-dd-yyyy}-%i.log.gz</Property>\r
+               <Property name="fileName.err">${logPath}/mediacube-err.log</Property>\r
+               <Property name="filePattern.err">${logPath}/$${date:yyyy-MM}/mediacube-err-%d{MM-dd-yyyy}-%i.log.gz</Property>\r
+       </Properties>\r
+       <Appenders>\r
+               <Console name="Console" target="SYSTEM_OUT">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MEDIACUBE" onMatch="DENY" onMismatch="NEUTRAL" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L) %n" />\r
+               </Console>\r
+               <Console name="MarkeredConsole" target="SYSTEM_ERR">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MEDIACUBE" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %markerSimpleName - %msg (%F:%L)%n" />\r
+               </Console>\r
+               <HTMLMailAppender name="MarkeredMail" subject="MediaCube rendszerüzenet" to="vasary@elgekko.net" from="broadcast.service-ce@amcnetworks.com" smtpHost="10.160.60.165"\r
+                       smtpPort="125" smtpProtocol="smtp" smtpDebug="false" ignoreExceptions="false" bufferSize="1">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MEDIACUBE" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss} %-5level - %msg %n" />\r
+               </HTMLMailAppender>\r
+               <RollingFile name="MarkeredRollingFile" fileName="${markeredFileName}" filePattern="${markeredFilePattern}">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MEDIACUBE FILELOG" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile1" fileName="${logPath}/nexio1-archive-checker.log" filePattern="${logPath}/$${date:yyyy-MM}/nexio1-archive-checker-%d{MM-dd-yyyy}-%i.log.gz">\r
+                       <Filters>\r
+                               <MarkerFilter marker="NEXIO1 archiválás előkészítése" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %msg %n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile2" fileName="${logPath}/nexio2-archive-checker.log" filePattern="${logPath}/$${date:yyyy-MM}/nexio2-archive-checker-%d{MM-dd-yyyy}-%i.log.gz">\r
+                       <Filters>\r
+                               <MarkerFilter marker="NEXIO2 archiválás előkészítése" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %msg %n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile3" fileName="${logPath}/fork-validate-and-archive.log" filePattern="${logPath}/$${date:yyyy-MM}/fork-validate-and-archive-%d{MM-dd-yyyy}-%i.log.gz">\r
+                       <Filters>\r
+                               <MarkerFilter marker="Kötegelt validálás és archiválás" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile4" fileName="${logPath}/harris1-missingmaterial-checker.log" filePattern="${logPath}/$${date:yyyy-MM}/harris1-missingmaterial-checker-%d{MM-dd-yyyy}-%i.log.gz">\r
+                       <Filters>\r
+                               <MarkerFilter marker="HARRIS1 missing material lekérdezés" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %msg %n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile5" fileName="${logPath}/harris2-missingmaterial-checker.log" filePattern="${logPath}/$${date:yyyy-MM}/harris2-missingmaterial-checker-%d{MM-dd-yyyy}-%i.log.gz">\r
+                       <Filters>\r
+                               <MarkerFilter marker="HARRIS2 missing material lekérdezés" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %msg %n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile6" fileName="${logPath}/peablebeach-missingmaterial-checker.log" filePattern="${logPath}/$${date:yyyy-MM}/peablebeach-missingmaterial-checker-%d{MM-dd-yyyy}-%i.log.gz">\r
+                       <Filters>\r
+                               <MarkerFilter marker="PEABLEBEACH missing material lekérdezés" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile7" fileName="${logPath}/fork-validate-and-restore.log" filePattern="${logPath}/$${date:yyyy-MM}/fork-validate-and-restore-%d{MM-dd-yyyy}-%i.log.gz">\r
+                       <Filters>\r
+                               <MarkerFilter marker="Kötegelt validálás és visszatöltés" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile8" fileName="${logPath}/validate-and-archive.log" filePattern="${logPath}/$${date:yyyy-MM}/validate-and-archive-%d{MM-dd-yyyy}-%i.log.gz">\r
+                       <Filters>\r
+                               <MarkerFilter marker="Archiválás" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile9" fileName="${logPath}/validate-and-restore.log" filePattern="${logPath}/$${date:yyyy-MM}/validate-and-restore-%d{MM-dd-yyyy}-%i.log.gz">\r
+                       <Filters>\r
+                               <MarkerFilter marker="Visszatöltés" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile10" fileName="${logPath}/sync-subtitles.log" filePattern="${logPath}/$${date:yyyy-MM}/sync-subtitles-%d{MM-dd-yyyy}-%i.log.gz">\r
+                       <Filters>\r
+                               <MarkerFilter marker="Feliratok szinkronizálása" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile11" fileName="${logPath}/pb-archive-checker.log" filePattern="${logPath}/$${date:yyyy-MM}/pb-archive-checker-%d{MM-dd-yyyy}-%i.log.gz">\r
+                       <Filters>\r
+                               <MarkerFilter marker="PEABLEBEACH archiválás előkészítése" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               \r
+               <RollingFile name="MediaProfile" fileName="${logPath}/mediaprofile.log" filePattern="${logPath}/$${date:yyyy-MM}/mediaprofile-%d{MM-dd-yyyy}-%i.log.gz">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MEDIAPROFILE" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %msg%n" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MissingSubtitle" fileName="${logPath}/missingsubtitle.log" filePattern="${logPath}/$${date:yyyy-MM}/missingsubtitle-%d{MM-dd-yyyy}-%i.log.gz">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MISSING-SUBTITLE" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %msg%n" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               \r
+               <RollingFile name="RollingFile" fileName="${fileName}" filePattern="${filePattern}">\r
+                       <Filters>\r
+                               <!-- <MarkerFilter marker="MEDIACUBE" onMatch="DENY" onMismatch="NEUTRAL" /> -->\r
+                               <MarkerFilter marker="MEDIACUBE FILELOG" onMatch="DENY" onMismatch="NEUTRAL" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %level %logger{1}.%M %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="RollingFileExceptions" fileName="${fileName.err}" filePattern="${filePattern.err}">\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %logger{1}.%M %msg (%F:%L)%n %throwable" />\r
+                       <Filters>\r
+                               <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               \r
+       </Appenders>\r
+       <Loggers>\r
+               <Root level="INFO">\r
+                       <AppenderRef ref="Console" />\r
+                       <AppenderRef ref="MarkeredConsole" />\r
+                       <AppenderRef ref="RollingFile" />\r
+                       <AppenderRef ref="RollingFileExceptions" />\r
+                       <AppenderRef ref="MarkeredRollingFile" />\r
+                       <AppenderRef ref="MarkeredRollingFile1" />\r
+                       <AppenderRef ref="MarkeredRollingFile2" />\r
+                       <AppenderRef ref="MarkeredRollingFile3" />\r
+                       <AppenderRef ref="MarkeredRollingFile4" />\r
+                       <AppenderRef ref="MarkeredRollingFile5" />\r
+                       <AppenderRef ref="MarkeredRollingFile6" />\r
+                       <AppenderRef ref="MarkeredRollingFile7" />\r
+                       <AppenderRef ref="MarkeredRollingFile8" />\r
+                       <AppenderRef ref="MarkeredRollingFile9" />\r
+                       <AppenderRef ref="MarkeredRollingFile10" />\r
+                       <AppenderRef ref="MarkeredRollingFile11" />\r
+                       <AppenderRef ref="MarkeredRollingFile11" />\r
+                       <AppenderRef ref="MediaProfile" />\r
+                       <AppenderRef ref="MissingSubtitle" />\r
+                       <AppenderRef ref="MarkeredMail" />\r
+               </Root>\r
+               <Logger name="org.zkoss" level="ERROR" additivity="false" />\r
+               <Logger name="org.quartz" level="ERROR" additivity="false" />\r
+               <Logger name="org.eclipse.jetty.osgi.boot" level="ERROR" additivity="false" />\r
+               <Logger name="user.commons.pool" level="DEBUG" additivity="false" />\r
+       </Loggers>\r
+</Configuration>\r
diff --git a/server/-product/production/AMC/settings/maestro.yaml b/server/-product/production/AMC/settings/maestro.yaml
new file mode 100644 (file)
index 0000000..1d36157
--- /dev/null
@@ -0,0 +1,38 @@
+sourceStoreUri:
+  name: Default
+  protocol: LOCAL
+  uri: "/mnt/NLE"
+  fileFilter: "*.mxf"
+  showDirectories: true
+alternateSourceStoreUris:
+- name: NLE1
+  protocol: LOCAL
+  uri: "/mnt/NLE/NLE1"
+  fileFilter: "*.mxf"
+  showDirectories: true
+- name: NLE2
+  protocol: LOCAL
+  uri: "/mnt/NLE/NLE2"
+  fileFilter: "*.mxf"
+  showDirectories: true
+- name: NLE3
+  protocol: LOCAL
+  uri: "/mnt/NLE/NLE3"
+  fileFilter: "*.mxf"
+  showDirectories: true
+- name: NLE4
+  protocol: LOCAL
+  uri: "/mnt/NLE/NLE4"
+  fileFilter: "*.mxf"
+  showDirectories: true
+- name: POLC
+  protocol: LOCAL
+  uri: "/mnt/POLC"
+  fileFilter: "*.mxf"
+  showDirectories: true
+targets:
+- name: FINISHED_SHOWS
+  killDateDays: 7
+  storeUri:
+    protocol: LOCAL
+    uri: "/mnt/PROMISE/FINISHED_SHOWS"
diff --git a/server/-product/production/AMC/settings/mediacube.yaml b/server/-product/production/AMC/settings/mediacube.yaml
new file mode 100644 (file)
index 0000000..291a0ca
--- /dev/null
@@ -0,0 +1,55 @@
+jobQueuePollInterval: 1000\r
+disableHelp: true\r
+maestroDisabled: true\r
+alternateRetrieveSelector: true\r
+disableStatistics: true\r
+disableEditor: false\r
+targetRestoreFilters:\r
+- FILEZILLA_AVID\r
+- FILEZILLA_PASARESTORE\r
+topTypeFilters:\r
+- name: Hír bejátszó\r
+- name: Hír nyers\r
+- name: Visszarögzített\r
+- name: Egyéb\r
+bottomTypeFilters:\r
+- name: Műsor\r
+- name: Műsor nyers\r
+- name: Promo\r
+- name: Promo nyers\r
+- name: Reklám\r
+- name: Reklám nyers\r
+authentication:\r
+  authEnabled: true\r
+  adHost: intra.amc.hu\r
+  adNonSecurePort: 3268\r
+  adBaseDn: DC=intra,DC=amc,DC=hu\r
+  adAdminMap:\r
+  - INFORMATIKUSOK\r
+  - MUSZAKVEZETOK\r
+  adSubmitterMap:\r
+  - INFORMATIKUSOK\r
+  - MUSZAKVEZETOK\r
+  adEditorMap:\r
+  - INFORMATIKUSOK\r
+  - MUSZAKVEZETOK\r
+  localAccounts:\r
+  - user: user\r
+    password: 5F4DCC3B5AA765D61D8327DEB882CF99\r
+    email:\r
+  - user: user1\r
+    password: 5F4DCC3B5AA765D61D8327DEB882CF99\r
+    email:\r
+  - user: lebony\r
+    password: 4E25B117B14D86D7DCECB4E433CF932C\r
+    email:\r
+  - user: root\r
+    password: 5F4DCC3B5AA765D61D8327DEB882CF99\r
+    email: vasary@elgekko.net\r
+  localAdmins:\r
+  - root\r
+  - admin\r
+  localSubmitters:\r
+  - lebony\r
+  localEditors:\r
+  - editor\r