OMAR mappa hozzáadása git-hez
authorOmar Sweidan <omar.sweidan@userrendszerhaz.hu>
Tue, 10 May 2022 10:51:47 +0000 (12:51 +0200)
committerOmar Sweidan <omar.sweidan@userrendszerhaz.hu>
Tue, 10 May 2022 10:52:41 +0000 (12:52 +0200)
96 files changed:
server/-configuration/run-mediacube-server-omar.launch
server/-product/production/OMAR/configuration/etc/gosh_profile [new file with mode: 0644]
server/-product/production/OMAR/jobs/executors.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/schedules.json [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/AnalyzeMediaFilesStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/ArchiveListBuilderStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/ArchiveMaterialSubmitStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/ArchiveRecursive.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/BatchRetrieveForkStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/CalculateMD5Step.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/CancelableStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/CleanupMountedLocationStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/CreateArchiveItemStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/CreateMissingLowresStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/DeleteFile.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/DummyTestStep1.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/DummyTestStep2.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/DummyTestStep3.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/FileCopyStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/GenerateJSONMetadataStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/HSMMigrateStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/IntegrationTestStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/MXFCutterStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/MediaToolStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/MetadataTransformStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/MetadataUpdater.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/MoveJpegToIsilonStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/OutputPathAndNameSelectorStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/PrepareMediaRestoreStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/PrepareRemoteTranscodeStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/QueryMissingProxyMediaStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/RemoteJobStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/SafeDeleteRecursiveStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/SaveMediaProxy.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/TSMBackupStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/TSMExtendedRetrieveStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/TSMRestoreStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/TSMSimpleRestoreStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/TestForkCancelableStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/TranscodeFFAStranStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/TransferStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/UpdateGhostMediaDataStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/ValidateProResStep.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/shared/EscortFiles.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/shared/ExternalCommand.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/shared/ExternalCommandExecutor.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/shared/ExternalProfile.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/shared/ExternalProfilesConfig.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/shared/FileSearchFilterOptions.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/shared/IExternalCallback.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/shared/ItemManagerExtensions.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/shared/MediaCubeClient.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/shared/MediaFileSearchFilterOptions.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/shared/MetadataType.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/shared/MetadataTypeDetector.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/shared/TestLib.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/steps/shared/TestLib1.java [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/archive-limited.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/archive-material.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/archive-ondemand.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/archive-recursive.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/batch-retrieve-ondemand.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/calculatemd5.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/cancelable.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/common-copy.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/create-lowres-ondemand.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/create-proxy-ffmpeg.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/delete-materials.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/dummy-test-job-copy.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/dummy-test-job.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/integration-test.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/metadata-updater.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/migrate-hsm.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/move-jpeg-to-isilon.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/prores-archive.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/remote-transcode.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/retrieve-ondemand.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/retrieve.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/safe-delete-recursive.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/sync-subtitles.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/sys-recreate-lowres.xml [new file with mode: 0644]
server/-product/production/OMAR/jobs/templates/test-fork-cancelable.xml [new file with mode: 0644]
server/-product/production/OMAR/log/.gitignore [new file with mode: 0644]
server/-product/production/OMAR/log/2022-05/.gitignore [new file with mode: 0644]
server/-product/production/OMAR/log/2022-05/markered-mediacube-05-09-2022-1.log.gz [new file with mode: 0644]
server/-product/production/OMAR/log/2022-05/mediacube-05-09-2022-1.log.gz [new file with mode: 0644]
server/-product/production/OMAR/log/2022-05/mediacube-err-05-09-2022-1.log.gz [new file with mode: 0644]
server/-product/production/OMAR/mediacube.bat [new file with mode: 0644]
server/-product/production/OMAR/settings/application.yaml [new file with mode: 0644]
server/-product/production/OMAR/settings/dsm.opt [new file with mode: 0644]
server/-product/production/OMAR/settings/dsmopt.lock [new file with mode: 0644]
server/-product/production/OMAR/settings/external-commands.yaml [new file with mode: 0644]
server/-product/production/OMAR/settings/jetty.xml [new file with mode: 0644]
server/-product/production/OMAR/settings/log4j2.xml [new file with mode: 0644]
server/-product/production/OMAR/settings/maestro.yaml [new file with mode: 0644]
server/-product/production/OMAR/settings/mediacube.yaml [new file with mode: 0644]

index 3d55a3c34ffa01a3cf884cee69699c48cad783e5..7e9aae744c09a7e93cc32aabb57d594d81c7d9b5 100644 (file)
@@ -6,17 +6,17 @@
     <stringAttribute key="bootstrap" value=""/>\r
     <stringAttribute key="checked" value="[NONE]"/>\r
     <booleanAttribute key="clearConfig" value="true"/>\r
-    <stringAttribute key="configLocation" value="${workspace_loc}\-product\production\LOCAL\tmp"/>\r
+    <stringAttribute key="configLocation" value="${workspace_loc}\-product\production\OMAR\tmp"/>\r
     <booleanAttribute key="default" value="true"/>\r
     <booleanAttribute key="default_auto_start" value="false"/>\r
     <intAttribute key="default_start_level" value="4"/>\r
     <setAttribute key="deselected_workspace_bundles"/>\r
     <booleanAttribute key="includeOptional" value="false"/>\r
     <mapAttribute key="org.eclipse.debug.core.environmentVariables">\r
-        <mapEntry key="DSMI_CONFIG" value="${workspace_loc}\-product\production\LOCAL\settings\dsm.opt"/>\r
+        <mapEntry key="DSMI_CONFIG" value="${workspace_loc}\-product\production\OMAR\settings\dsm.opt"/>\r
         <mapEntry key="DSMI_DIR" value="c:\Program Files\Tivoli\TSM\baclient\"/>\r
         <mapEntry key="DSMI_LOG" value="c:\temp"/>\r
-        <mapEntry key="DSM_CONFIG" value="${workspace_loc}\-product\production\LOCAL\settings\dsm.opt"/>\r
+        <mapEntry key="DSM_CONFIG" value="${workspace_loc}\-product\production\OMAR\settings\dsm.opt"/>\r
         <mapEntry key="DSM_DIR" value="c:\Program Files\Tivoli\TSM\baclient\"/>\r
         <mapEntry key="LD_LIBRARY_PATH" value="c:\Program Files\Tivoli\TSM\baclient\;${workspace_loc}"/>\r
         <mapEntry key="LIBPATH" value="c:\Program Files\Tivoli\TSM\baclient\"/>\r
@@ -31,7 +31,7 @@
     <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console"/>\r
     <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>\r
     <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory&#13;&#10;-Dorg.eclipse.epp.logging.aeri.skipReports=true &#13;&#10;-Declipse.ignoreApp=true &#13;&#10;-Dosgi.noShutdown=true&#13;&#10;-Dlog4j.configurationFile=settings/log4j2.xml&#13;&#10;-Djetty.home=settings&#13;&#10;-Djetty.etc.config.urls=jetty.xml&#13;&#10;-Dgosh.home=configuration&#13;&#10;-Djava.io.tmpdir=tmp&#13;&#10;-Djna.library.path=${workspace_loc}&#13;&#10;-Djava.library.path=${workspace_loc}"/>\r
-    <stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc}\-product\production\LOCAL"/>\r
+    <stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc}\-product\production\OMAR"/>\r
     <stringAttribute key="pde.version" value="3.3"/>\r
     <setAttribute key="selected_target_bundles">\r
         <setEntry value="cglib@default:default"/>\r
diff --git a/server/-product/production/OMAR/configuration/etc/gosh_profile b/server/-product/production/OMAR/configuration/etc/gosh_profile
new file mode 100644 (file)
index 0000000..1c659f4
--- /dev/null
@@ -0,0 +1 @@
+prompt=mc>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/executors.xml b/server/-product/production/OMAR/jobs/executors.xml
new file mode 100644 (file)
index 0000000..0fd7a2f
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!DOCTYPE xml>\r
+\r
+<executors>\r
+       <executor className="QueryMissingProxyMediaStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="PrepareRemoteTranscodeJobParametersStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="TransferStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="PrepareMediaRestoreStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="TranscodeFFMpegStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="RemoteJobStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="PathItemsCollectorStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="TestForkCancelableStep.java" maxConcurrent="3" isRemote="false" />\r
+       <executor className="ArchiveRecursive.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="ArchiveListBuilderStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="ArchiveMaterialSubmitStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="BatchRetrieveForkStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="CancelableStep.java" maxConcurrent="20" isRemote="false" />\r
+       <executor className="CalculateMD5Step.java" maxConcurrent="1" isRemote="false "/>\r
+       <executor className="CleanupMountedLocationStep.java" maxConcurrent="5" isRemote="false" />\r
+       <executor className="CreateArchiveItemStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="CreateMissingLowresStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="DummyTestStep1.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="DummyTestStep2.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="DummyTestStep3.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="FileCopyStep.java" maxConcurrent="20" isRemote="false" />\r
+       <executor className="HSMMigrateStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="MediaToolStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="MetadataTransformStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="MoveJpegToIsilonStep.java" maxConcurrent="1" isRemote="false"/>\r
+       <executor className="MXFCutterStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="OutputPathAndNameSelectorStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="TranscodeFFAStranStep.java" maxConcurrent="2" isRemote="false" />\r
+       <executor className="TSMBackupStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="TSMExtendedRetrieveStep.java" maxConcurrent="1"  isRemote="false" />\r
+       <executor className="TSMRestoreStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="TSMSimpleRestoreStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="UpdateGhostMediaDataStep.java" maxConcurrent="1" isRemote="false" />\r
+       \r
+       <executor className="ProResArchiveStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="AnalyzeMediaFilesStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="ValidateProResStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="GenerateJSONMetadataStep.java" maxConcurrent="1" isRemote="false" />\r
+</executors>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/schedules.json b/server/-product/production/OMAR/jobs/schedules.json
new file mode 100644 (file)
index 0000000..0134aa6
--- /dev/null
@@ -0,0 +1,181 @@
+{
+"joblist":[
+  
+    {
+    "name":"n1",
+    "template":"cancelable.xml",
+    "active":true,
+    "executeimmediate":true,
+    "parameters":[{"name":"param","value":1000,"type":"java.lang.Integer"}]
+    },
+  
+    {
+    "name":"n2",
+    "template":"cancelable.xml",
+    "active":true,
+    "executeimmediate":true,
+    "parameters":[{"name":"param","value":1000,"type":"java.lang.Integer"}]
+    },
+  
+    {
+    "name":"Limitált archiválás",
+    "template":"archive-limited.xml",
+    "cronexpression":"0 */10 * * * ?",
+    "parameters":[
+      
+        {
+        "name":"sourcePath",
+        "value":"/opt/mediacube/ARCHIVE",
+        "type":"java.lang.String"
+        },
+      
+        {
+        "name":"globalSourcePath",
+        "value":"\\\\10.11.1.90\\data\\ARCHIVE",
+        "type":"java.lang.String"
+        },
+      
+        {
+        "name":"transcoderTargetPath",
+        "value":"/mnt/PROMISE/TRANSCODER/FFASTRANSCODER/Out",
+        "type":"java.lang.String"
+        },
+      
+        {
+        "name":"killDateDays",
+        "value":-1,
+        "type":"java.lang.Integer"
+        },
+      
+        {
+        "name":"limit",
+        "value":1000,
+        "type":"java.lang.Integer"
+        }
+      ]
+    },
+  
+    {
+    "name":"SYS: batch-retrieve-ondemand",
+    "template":"batch-retrieve-ondemand.xml"
+    },
+  
+    {
+    "template":"calculatemd5.xml",
+    "name":"MD5 kiszámítása",
+    "parameters":[
+      
+        {
+        "name":"fileName",
+        "value":"C:\\Users\\machine\\Downloads\\sample.mxf",
+        "type":"java.lang.String"
+        }
+      ]
+    },
+  
+    {
+    "template":"dummy-test-job.xml",
+    "name":"dummy test job",
+    "parameters":[{"name":"param1","value":"Jozsi","type":"java.lang.String"}],
+    "cronexpression":"0/3 * * * * ?"
+    },
+  
+    {
+    "template":"move-jpeg-to-isilon.xml",
+    "name":"JPEG másolása ISILON-ba",
+    "parameters":[
+      
+        {
+        "name":"sourceUri",
+        "value":"localhost",
+        "type":"java.lang.String"
+        },
+      
+        {
+        "name":"sourceProtocol",
+        "value":"LOCAL",
+        "type":"java.lang.String"
+        },
+      
+        {
+        "name":"sourceFolder",
+        "value":"c:\\data\\video",
+        "type":"java.lang.String"
+        },
+      
+        {
+        "name":"targetUri",
+        "value":"localhost",
+        "type":"java.lang.String"
+        },
+      
+        {
+        "name":"targetProtocol",
+        "value":"LOCAL",
+        "type":"java.lang.String"
+        },
+      
+        {
+        "name":"targetFolder",
+        "value":"c:\\data\\video2",
+        "type":"java.lang.String"
+        },
+      
+        {
+        "name":"userName",
+        "value":"dani",
+        "type":"java.lang.String"
+        },
+      
+        {
+        "name":"password",
+        "value":"dani",
+        "type":"java.lang.String"
+        },
+      
+        {
+        "name":"port",
+        "value":"21",
+        "type":"java.lang.Integer"
+        }
+      ]
+    },
+  
+    {
+    "template":"prores-archive.xml",
+    "name":"ProRes archiválás",
+    "parameters":[
+      
+        {
+        "name":"sourceStoreFolder",
+        "value":"c:\\data",
+        "type":"java.lang.String"
+        },
+      
+        {
+        "name":"sourceStoreName",
+        "value":"AMC_LOCAL",
+        "type":"java.lang.String"
+        },
+      
+        {
+        "name":"filter",
+        "value":{"fileName":".*\\.(mov)$"},
+        "type":"java.lang.String"
+        },
+      
+        {
+        "name":"targetStoreName",
+        "value":"AMC_LOCAL",
+        "type":"java.lang.String"
+        },
+      
+        {
+        "name":"escortStoreFolder",
+        "value":"AMC_LOCAL",
+        "type":"java.lang.String"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/steps/AnalyzeMediaFilesStep.java b/server/-product/production/OMAR/jobs/steps/AnalyzeMediaFilesStep.java
new file mode 100644 (file)
index 0000000..98cf7fa
--- /dev/null
@@ -0,0 +1,28 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Paths;\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.mediaarea.MediaArea;\r
+\r
+public class AnalyzeMediaFilesStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(List<String> foundFiles) {\r
+               Map<String, MediaArea> proResFiles = new HashMap<String, MediaArea>(foundFiles.size());\r
+\r
+               for (int i = 0; i < foundFiles.size(); i++) {\r
+                       MediaArea mediaArea = new MediaArea(Paths.get(foundFiles.get(i)));\r
+                       mediaArea.process();\r
+                       proResFiles.put(Paths.get(foundFiles.get(i)).toAbsolutePath().toString(), mediaArea);\r
+               }\r
+\r
+               return new Object[] { proResFiles };\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/ArchiveListBuilderStep.java b/server/-product/production/OMAR/jobs/steps/ArchiveListBuilderStep.java
new file mode 100644 (file)
index 0000000..b232182
--- /dev/null
@@ -0,0 +1,167 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\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.LinkedList;\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
+import org.apache.logging.log4j.Marker;\r
+\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+/**\r
+ * Az archivalhato mediak listazasa MediaFileWrapper objektumokban. A listazott media allomanyokat megjeloli .catched signal allomannyal, hogy a legkozelebbi\r
+ * listazas figyelmen kivul hagyja.\r
+ *\r
+ * @author robi\r
+ */\r
+public class ArchiveListBuilderStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       //      private static final String UTF8 = "utf-8";\r
+       private static final String STATUSFOLDER = ".STATUS";\r
+       private static final String JSONEXT = ".json";\r
+       private static final String CATCHEDEXT = ".catched";\r
+\r
+       public static final String ITEM_TITLE = "itemTitle";\r
+       public static final String ITEM_HOUSEID = "itemHouseId";\r
+       public static final String ITEM_DESCRIPTION = "itemDescription";\r
+       public static final String MEDIA_HOUSEID = "mediaHouseId";\r
+       public static final String MEDIA_TITLE = "mediaTitle";\r
+       public static final String MEDIA_DESCRIPTION = "mediaDescription";\r
+       public static final String MEDIA_TYPE = "mediaType";\r
+       private static final String DURATION = "duration";\r
+       private static final String EXISTING_MEDIAID = "existingMediaId";\r
+       private static final String TAGS = "tags";\r
+\r
+       private Marker marker;\r
+\r
+       private ArchiveItem createArchiveItem(Path jsonFilePath, Path mediaFilePath, Path catchedFilePath) {\r
+               ArchiveItem result = null;\r
+               try {\r
+                       result = ArchiveItem.fromFile(jsonFilePath);\r
+                       result.setMediaFile(mediaFilePath.toString());\r
+                       result.setCatchedFile(catchedFilePath.toString());\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+       private void createCatchedFile(Path catchedFilePath) {\r
+               try {\r
+                       Files.createFile(catchedFilePath);\r
+                       //Files.write(catchedFilePath, CATCHED.getBytes(UTF8), StandardOpenOption.CREATE);\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+               }\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(String sourcePath, int limit, IJobEngine jobEngine, IJobRuntime jobRuntime) {\r
+               marker = jobRuntime.getSessionMarker();\r
+               List<ArchiveItem> archiveList = new LinkedList<ArchiveItem>();\r
+               DirectoryStream<Path> directoryStream = null;\r
+               try {\r
+                       DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(sourcePath));\r
+                       for (Path p : stream) {\r
+                               processPathItem(p, archiveList);\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       logger.error(marker, "Az '{}' mappa elérése sikertelen. A rendszer hibaüzenete: {}", e.getMessage());\r
+               } finally {\r
+                       if (directoryStream != null) {\r
+                               try {\r
+                                       directoryStream.close();\r
+                               } catch (IOException e) {\r
+                               }\r
+                       }\r
+               }\r
+\r
+               if (limit > 0 && archiveList.size() > limit) {\r
+                       archiveList = archiveList.subList(0, limit);\r
+                       logger.info(marker, "A folyamat alkalmazza a beállított {} limitet.", limit);\r
+               }\r
+\r
+               if (archiveList.size() == 0)\r
+                       logger.info(marker, "Nincs archiválandó anyag.");\r
+               else\r
+                       logger.info(marker, "Az archiváló folyamat {} új anyagot érzékelt.", archiveList == null ? 0 : archiveList.size());\r
+\r
+               for (ArchiveItem archiveItem : archiveList) {\r
+                       createCatchedFile(Paths.get(archiveItem.getCatchedFile()));\r
+               }\r
+\r
+               return new Object[] { archiveList };\r
+       }\r
+\r
+       private boolean processPathItem(Path mediaFilePath, final List<ArchiveItem> archiveList) {\r
+               File mediaFile = mediaFilePath.toFile();\r
+\r
+               //              if (mediaFile.length() > 0)\r
+               //                      return false;\r
+\r
+               if (mediaFile.isDirectory()) {\r
+                       return false;\r
+               }\r
+\r
+               Path dotStorePath = Paths.get(mediaFilePath.getParent().toString(), STATUSFOLDER);\r
+               Path catchedFilePath = Paths.get(dotStorePath.toString(), mediaFile.getName() + CATCHEDEXT);\r
+               File catchedFile = catchedFilePath.toFile();\r
+               if (catchedFile.exists()) {\r
+                       logger.warn("{} file is already catched.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               Path jsonFilePath = Paths.get(dotStorePath.toString(), mediaFile.getName() + JSONEXT);\r
+               File jsonFile = jsonFilePath.toFile();\r
+               if (!jsonFile.exists()) {\r
+                       logger.warn("{} has no json metadata.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               ArchiveItem archiveItem = createArchiveItem(jsonFilePath, mediaFilePath, catchedFilePath);\r
+\r
+               if (archiveItem == null) {\r
+                       logger.warn("{} has no metadata specified.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               if (StringUtils.isBlank(archiveItem.getItemHouseId())) {\r
+                       logger.warn("{} has no Item HouseID specified in metadata.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               if (StringUtils.isBlank(archiveItem.getItemTitle())) {\r
+                       logger.warn("{} has no Item Title specified in metadata.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               if (StringUtils.isBlank(archiveItem.getMediaHouseId())) {\r
+                       logger.warn("{} has no Media HouseID specified in metadata.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               if (StringUtils.isBlank(archiveItem.getMediaTitle())) {\r
+                       logger.warn("{} has no Media Title specified in metadata.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               //A tenyleges archivalast vesszuk elore\r
+               if (mediaFile.length() == 0)\r
+                       archiveList.add(archiveItem);\r
+               else\r
+                       archiveList.add(0, archiveItem);\r
+               //createCatchedFile(catchedFilePath);\r
+               return true;\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/ArchiveMaterialSubmitStep.java b/server/-product/production/OMAR/jobs/steps/ArchiveMaterialSubmitStep.java
new file mode 100644 (file)
index 0000000..0aedbbe
--- /dev/null
@@ -0,0 +1,52 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\r
+import java.util.List;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+\r
+import user.commons.ListUtils;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class ArchiveMaterialSubmitStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String JOBTEMPLATE = "archive-material.xml";\r
+       private static final String KILL_DATE_DAYS = "killDateDays";\r
+       private static final String ARCHIVE = "Archiválás";\r
+       private static final String ARCHIVE_ITEM = "archiveItem";\r
+       private Marker marker;\r
+\r
+       @StepEntry\r
+       public Object[] execute(List<ArchiveItem> archiveList, int killDateDays, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               marker = jobRuntime.getSessionMarker();\r
+               if (archiveList == null || archiveList.size() == 0)\r
+                       return null;\r
+\r
+               if (jobRuntime.forkPrepare()) {\r
+                       for (int i = 0; i < archiveList.size(); i++) {\r
+                               ArchiveItem archiveItem = archiveList.get(i);\r
+                               try {\r
+                                       IJobRuntime runtime = jobEngine.submit(jobRuntime, null, JOBTEMPLATE, ARCHIVE,\r
+                                                       ListUtils.asMap(ARCHIVE_ITEM, archiveItem, KILL_DATE_DAYS, killDateDays));\r
+                                       int progress = (i + 1) * 100 / archiveList.size();\r
+                                       setProgress(progress);\r
+                                       //TODO kivezetni a submit hibaüzenetet\r
+                                       if (runtime == null)\r
+                                               throw new Exception("Submit returned null runtime");\r
+                               } catch (Exception e) {\r
+                                       logger.catching(e);\r
+                                       String fileName = new File(archiveItem.getMediaFile()).getName();\r
+                                       logger.error(marker, "A(z) '{}' állomány archiválási kísérlete sikertelen. A rendszer üzenete: {}", fileName, e.getMessage());\r
+                                       if (!archiveItem.removeCatchedFile())\r
+                                               logger.error(marker, "A(z) '{}' állomány .catched jelző állománya nem törölhető.", fileName);\r
+                                       throw e;\r
+                               }\r
+                       }\r
+               }\r
+               jobRuntime.forkWaitComplete();\r
+               return null;\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/ArchiveRecursive.java b/server/-product/production/OMAR/jobs/steps/ArchiveRecursive.java
new file mode 100644 (file)
index 0000000..3f01f32
--- /dev/null
@@ -0,0 +1,324 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\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.attribute.BasicFileAttributes;\r
+import java.text.SimpleDateFormat;\r
+import java.util.Arrays;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import org.apache.commons.io.FilenameUtils;\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 com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+import user.commons.JobStatus;\r
+import user.commons.ListUtils;\r
+import user.commons.log4j2.marker.MediaCubeMarker;\r
+import user.commons.mediatool.MediaInfo;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+import user.mediacube.metadata.interfaces.IMetadata;\r
+import user.mediacube.metadata.interfaces.IMetadataProvider;\r
+import user.mediacube.metadata.interfaces.IMetadataProviderFactory;\r
+import user.mediacube.metadata.interfaces.MetadataProviderType;\r
+import user.mediacube.metadata.interfaces.MetadataType;\r
+import user.mediacube.metadata.interfaces.PlanAirMetadataListOptions;\r
+\r
+public class ArchiveRecursive extends JobStep implements FileVisitor<Path> {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String JOBTEMPLATE = "archive-material.xml";\r
+       private static final String ITEM_TITLE = "itemTitle";\r
+       private static final String ITEM_HOUSEID = "itemHouseId";\r
+       private static final String MEDIA_HOUSEID = "mediaHouseId";\r
+       private static final String MEDIA_TITLE = "mediaTitle";\r
+       private static final String MEDIA_DESCRIPTION = "mediaDescription";\r
+       private static final String MEDIA_TYPE = "mediaType";\r
+       private static final String ARCHIVE = "Archiválás";\r
+       private static final String ARCHIVE_ITEM = "archiveItem";\r
+       private static final String KILL_DATE_DAYS = "killDateDays";\r
+       private SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd");\r
+\r
+       private List<String> skipPathNames = Arrays.asList("!ARCHIVALAS_ALATT", EscortFiles.STATUSFOLDER,\r
+                       EscortFiles.CONFLICTFOLDER);\r
+       private int limit;\r
+       private int submitted;\r
+       private int killDateDays;\r
+       private boolean disableProxy;\r
+\r
+       private boolean canReadMediaInfo(Path mediaFilePath) {\r
+               boolean result = false;\r
+               try {\r
+                       MediaInfo mi = new MediaInfo(mediaFilePath);\r
+                       mi.process();\r
+                       result = true;\r
+               } catch (Exception e) {\r
+                       logger.warn(getSessionMarker(), e.getMessage());\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private void checkArchiveItem(ArchiveItem archiveItem) throws Exception {\r
+               if (archiveItem == null)\r
+                       throw new Exception("No metadata specified.");\r
+\r
+               if (StringUtils.isBlank(archiveItem.getItemHouseId()))\r
+                       throw new Exception("No Item HouseID specified in metadata.");\r
+\r
+               if (StringUtils.isBlank(archiveItem.getItemTitle()))\r
+                       throw new Exception("No Item Title specified in metadata.");\r
+\r
+               if (StringUtils.isBlank(archiveItem.getMediaHouseId()))\r
+                       throw new Exception("No Media HouseID specified in metadata.");\r
+\r
+               if (StringUtils.isBlank(archiveItem.getMediaTitle()))\r
+                       throw new Exception("No Media Title specified in metadata.");\r
+       }\r
+\r
+       private String archiveItemJSON(ArchiveItem result) {\r
+               BasicDBObject obj = new BasicDBObject();\r
+               obj.put("itemHouseId", result.getItemHouseId());\r
+               obj.put("itemTitle", result.getItemTitle());\r
+               obj.put("mediaHouseId", result.getMediaHouseId());\r
+               obj.put("mediaTitle", result.getMediaTitle());\r
+               obj.put("mediaDescription", result.getMediaDescription());\r
+               obj.put("mediaType", result.getMediaType());\r
+               return obj.toPrettyString("");\r
+       }\r
+\r
+       private ArchiveItem createArchiveItem(Path filePath) throws Exception {\r
+               ArchiveItem result = null;\r
+\r
+               String fileName = filePath.getFileName().toString();\r
+               String mediaHouseId = FilenameUtils.removeExtension(fileName);\r
+               try {\r
+                       result = getPlanAirMetadata(mediaHouseId);\r
+\r
+                       if (result != null) {\r
+                               result.setMediaFile(filePath.toString());\r
+                               // 210617 proxy keszites tiltasa\r
+                               result.setDisableProxy(disableProxy);\r
+                       }\r
+\r
+                       logger.info(getSessionMarker(), "PlanAir query done for {}", filePath);\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), "PlanAir metadata error", e);\r
+                       // nem latja a drivert pl.\r
+                       throw e;\r
+               }\r
+\r
+//210616 Ha nincs metaadat, nem archivalunk\r
+               if (result == null) {\r
+                       result = new ArchiveItem();\r
+                       BasicFileAttributes attr = Files.readAttributes(filePath, BasicFileAttributes.class);\r
+                       result.setItemHouseId(df.format(attr.lastModifiedTime().toMillis()));\r
+                       result.setItemTitle(filePath.getParent().toString());\r
+                       result.setMediaHouseId(mediaHouseId);\r
+                       result.setMediaTitle(fileName);\r
+                       result.setMediaDescription("/ARCHIVE-TEST");\r
+                       result.setMediaType("Generic");\r
+                       result.setMediaFile(filePath.toString());\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(String sourcePath, int killDateDays, int limit, boolean disableProxy) throws Exception {\r
+               this.killDateDays = killDateDays;\r
+               this.limit = limit;\r
+               this.disableProxy = disableProxy;\r
+               logger.info(getSessionMarker(), "Starting in {}", sourcePath);\r
+               try {\r
+                       if (getJobRuntime().forkPrepare()) {\r
+                               Files.walkFileTree(Paths.get(sourcePath), this);\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), "Az '{}' mappa elérése sikertelen. A rendszer hibaüzenete: {}", sourcePath,\r
+                                       e.getMessage());\r
+               } finally {\r
+                       if (submitted > 0)\r
+                               getJobRuntime().forkWaitComplete();\r
+                       else\r
+                               getJobRuntime().cancelForkPrepare();\r
+               }\r
+               return null;\r
+       }\r
+\r
+       private ArchiveItem getPlanAirMetadata(String mediaHouseId) throws Exception {\r
+               PlanAirMetadataListOptions opt = new PlanAirMetadataListOptions();\r
+               opt.setSearch(mediaHouseId);\r
+               opt.setType(MetadataType.Material);\r
+\r
+               BasicDBObject json = null;\r
+               List<IMetadata> data = null;\r
+\r
+               IMetadataProviderFactory factory = getService(IMetadataProviderFactory.class);\r
+               if (factory == null)\r
+                       logger.info(getSessionMarker(), "IMetadataProviderFactory is null");\r
+\r
+               IMetadataProvider planairProvider = factory.getProvider(MetadataProviderType.PLANAIR);\r
+               if (planairProvider == null)\r
+                       logger.info(getSessionMarker(), "IMetadataProvider is null");\r
+\r
+               ArchiveItem result = null;\r
+               data = planairProvider.list(opt);\r
+               if (data.size() != 0)\r
+                       json = data.get(0).asJSON();\r
+               else {\r
+                       opt.setType(MetadataType.Promo);\r
+                       data = planairProvider.list(opt);\r
+                       if (data.size() != 0)\r
+                               json = data.get(0).asJSON();\r
+                       else {\r
+                               opt.setType(MetadataType.AD);\r
+                               data = planairProvider.list(opt);\r
+                               if (data.size() != 0)\r
+                                       json = data.get(0).asJSON();\r
+                       }\r
+               }\r
+               if (json != null) {\r
+                       result = new ArchiveItem();\r
+                       result.setItemHouseId(json.getString(ITEM_HOUSEID));\r
+                       result.setItemTitle(json.getString(ITEM_TITLE));\r
+                       result.setMediaHouseId(json.getString(MEDIA_HOUSEID));\r
+                       result.setMediaTitle(json.getString(MEDIA_TITLE));\r
+                       result.setMediaDescription(json.getString(MEDIA_DESCRIPTION));\r
+                       result.setMediaType(json.getString(MEDIA_TYPE));\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private boolean handleArchiveConflict(Path mediaPath) throws Exception {\r
+               boolean result = false;\r
+               String sourceFileName = mediaPath.getFileName().toString();\r
+               if (getManager().isMediaFileExists(sourceFileName)) {\r
+                       EscortFiles.createMediaCatch(mediaPath);\r
+                       result = true;\r
+               }\r
+               return result;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult postVisitDirectory(Path paramT, IOException paramIOException) throws IOException {\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes paramBasicFileAttributes)\r
+                       throws IOException {\r
+               Path dirName = dir.getFileName();\r
+\r
+               if (skipPathNames.contains(dirName.toString())) {\r
+                       logger.info(getSessionMarker(), "PreVisit skip {}", dir);\r
+                       return FileVisitResult.SKIP_SUBTREE;\r
+               } else\r
+                       logger.info(getSessionMarker(), "PreVisit {}", dir);\r
+\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+\r
+       private boolean processPathItem(Path mediaPath) throws Exception {\r
+               if (limit != 0 && submitted == limit) {\r
+                       logger.info(getSessionMarker(), "Limit reached {}, canceling", limit);\r
+                       return false;\r
+               }\r
+\r
+               String fileName = mediaPath.getFileName().toString();\r
+               if (fileName.startsWith(".") || fileName.endsWith(".nomd"))\r
+                       return false;\r
+\r
+               logger.info(getSessionMarker(), "Processing {}", mediaPath);\r
+\r
+               File mediaFile = mediaPath.toFile();  \r
+               if (mediaFile.isDirectory()) {\r
+                       //logger.info(getSessionMarker(), "Skipping directory {}", mediaPath);\r
+                       return false;\r
+               }\r
+\r
+               if (EscortFiles.isMediaCatched(mediaPath)) {\r
+                       //logger.info(getSessionMarker(), "Skipping already catched {}", mediaPath);\r
+                       return false;\r
+               }\r
+\r
+               Path nomdFile = Paths.get(mediaPath.toString() + ".nomd");\r
+\r
+               if (Files.exists(nomdFile)) {\r
+                       //logger.info(getSessionMarker(), "Skipping nomd file exists {}", nomdFile);\r
+                       return false;\r
+               }\r
+\r
+               if (handleArchiveConflict(mediaPath)) {\r
+                       logger.info(getSessionMarker(), "Skipping archive db already contains {}", mediaPath);\r
+                       return false;\r
+               }\r
+\r
+               if (!canReadMediaInfo(mediaPath)) {\r
+                       logger.info(getSessionMarker(), "Skipping cant read mediainfo {}", mediaPath);\r
+                       return false;\r
+               }\r
+\r
+               ArchiveItem archiveItem = createArchiveItem(mediaPath);\r
+\r
+               if (archiveItem == null) {\r
+                       Message msg = new ParameterizedMessage("Nincs metaadat!");\r
+                       logger.info(new MediaCubeMarker("vasary@elgekko.net,muszak@mediavivantis.hu",\r
+                                       "Értesítés problémás " + mediaPath.getFileName().toString() + " archiválásról"), msg);\r
+                       Files.createFile(nomdFile);\r
+                       return false;\r
+               }\r
+\r
+               try {\r
+                       checkArchiveItem(archiveItem);\r
+\r
+                       Map<String, Object> parameters = ListUtils.asMap(ARCHIVE_ITEM, archiveItem, KILL_DATE_DAYS, killDateDays);\r
+                       IJobRuntime runtime = getEngine().submit(getJobRuntime(), e -> {\r
+                               if (e.getStatus().equals(JobStatus.CANCELED) || e.getStatus().equals(JobStatus.SUSPENDED))\r
+                                       EscortFiles.removeMediaCatch(mediaPath);\r
+                       }, JOBTEMPLATE, ARCHIVE, 1, IJobEngine.DEFAULT_OWNER, parameters);\r
+                       if (runtime == null)\r
+                               throw new Exception("Submit returned null runtime");\r
+                       runtime.setRelated(mediaPath.toString());\r
+                       EscortFiles.createMediaCatch(mediaPath);\r
+                       String metadata = archiveItemJSON(archiveItem);\r
+                       EscortFiles.createMetadata(mediaPath.getParent().toString(), mediaPath.getFileName().toString(), metadata);\r
+                       submitted++;\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(),\r
+                                       "A(z) '{}' állomány archiválási kísérlete sikertelen. A rendszer üzenete: {}", mediaPath,\r
+                                       e.getMessage());\r
+               }\r
+\r
+               return true;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult visitFile(Path filePath, BasicFileAttributes paramBasicFileAttributes) throws IOException {\r
+               logger.info(getSessionMarker(), "Will checked {}", filePath);\r
+               try {\r
+                       processPathItem(filePath);\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+               }\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult visitFileFailed(Path filePath, IOException paramIOException) throws IOException {\r
+               logger.info("Error archive {}", filePath);\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/BatchRetrieveForkStep.java b/server/-product/production/OMAR/jobs/steps/BatchRetrieveForkStep.java
new file mode 100644 (file)
index 0000000..4f6b130
--- /dev/null
@@ -0,0 +1,76 @@
+package user.jobengine.server.steps;\r
+\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.log4j2.marker.MediaCubeFinishMarker;\r
+import user.commons.log4j2.marker.MediaCubeMarker;\r
+import user.jobengine.db.ArchivedMedia;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+import user.jobengine.server.scheduler.ScheduledJob;\r
+\r
+public class BatchRetrieveForkStep extends JobStep {\r
+       private static final String TARGET_PATH_TYPE = "targetPathType";\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String CHILD_TEMPLATE = "retrieve-ondemand.xml";\r
+       private static final String ARCHIVEDMEDIA = "archivedMedia";\r
+       private static final String RECIPIENT = "successRecipient";\r
+       private static final String HOUSEID = "houseId";\r
+       private MediaCubeMarker marker;\r
+\r
+       @StepEntry\r
+       public Object[] execute(List<ArchivedMedia> basket, String houseId, String recipient, String targetPathType, IJobEngine jobEngine, IJobRuntime jobRuntime)\r
+                       throws Exception {\r
+               marker = (MediaCubeMarker) jobRuntime.getSessionMarker();\r
+\r
+               //session szinten csak a finishMarker cimzettje az erdekes, es ezt a cimet pluszban hasznalja a konfigban megadott cimmel\r
+               //a finishMarker orokli a cim bellitast a sessionMarkertol\r
+               marker.setTo(recipient);\r
+\r
+               ((MediaCubeMarker) jobRuntime.getFinishMarker()).setTo(recipient);\r
+\r
+               if (basket == null || basket.size() == 0)\r
+                       return null;\r
+               setProgress(10);\r
+\r
+               MediaCubeMarker mailMarker = new MediaCubeMarker(recipient);\r
+               mailMarker.setSessionName("Archívum viszatöltés");\r
+               mailMarker.setSessionID(houseId);\r
+               logger.info(mailMarker, "A visszatöltések elindultak az alábbi állományokra:");\r
+\r
+               if (jobRuntime.forkPrepare()) {\r
+                       for (ArchivedMedia archivedMedia : basket) {\r
+                               logger.info(mailMarker, archivedMedia.getMedia().getMediaFilesName());\r
+                               submit(archivedMedia, recipient, houseId, targetPathType, jobEngine, jobRuntime);\r
+                       }\r
+               }\r
+               setProgress(50);\r
+               logger.info(new MediaCubeFinishMarker(mailMarker), "A visszatöltések végeztével megerősítő üzenetet küldünk.");\r
+               jobRuntime.forkWaitComplete();\r
+               setProgress(100);\r
+               return null;\r
+       }\r
+\r
+       public void submit(ArchivedMedia archivedMedia, String recipient, String houseId, String targetPathType, IJobEngine jobEngine, IJobRuntime jobRuntime)\r
+                       throws Exception {\r
+               try {\r
+                       ScheduledJob scheduledJob = jobEngine.getScheduledJob(CHILD_TEMPLATE);\r
+                       Map<String, Object> parameters = scheduledJob.getJobParameters();\r
+                       parameters.put(ARCHIVEDMEDIA, archivedMedia);\r
+                       parameters.put(HOUSEID, houseId);\r
+                       parameters.put(RECIPIENT, recipient);\r
+                       parameters.put(TARGET_PATH_TYPE, targetPathType);\r
+                       IJobRuntime child = jobEngine.submit(jobRuntime, null, CHILD_TEMPLATE, String.format("Visszatöltés %s részére", recipient), parameters);\r
+                       ((MediaCubeMarker) child.getSessionMarker()).setTo(recipient);\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       logger.error(marker, "Hiba a kötegelt visszatöltésben. A rendszer üzenete: {}", e.getMessage());\r
+               }\r
+\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/CalculateMD5Step.java b/server/-product/production/OMAR/jobs/steps/CalculateMD5Step.java
new file mode 100644 (file)
index 0000000..9db442c
--- /dev/null
@@ -0,0 +1,34 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.InputStream;\r
+import java.nio.file.Files;\r
+import java.nio.file.Paths;\r
+import java.security.DigestInputStream;\r
+import java.security.MessageDigest;\r
+\r
+import javax.xml.bind.DatatypeConverter;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+public class CalculateMD5Step extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger(CalculateMD5Step.class);\r
+\r
+       @StepEntry\r
+       public Object[] execute(String fileName) throws Exception {\r
+               logger.info(getMarker(), "Executing");\r
+\r
+               MessageDigest messageDigest = MessageDigest.getInstance("MD5");\r
+               InputStream is = Files.newInputStream(Paths.get(fileName));\r
+               DigestInputStream dis = new DigestInputStream(is, messageDigest);\r
+               byte[] digest = new byte[32768]; //32k buffer\r
+\r
+               while ((dis.read(digest)) != -1) {\r
+                       messageDigest.update(digest);\r
+               }\r
+\r
+               String md5String = DatatypeConverter.printHexBinary(digest).toUpperCase();\r
+               logger.info("calculated MD5 hash= {}", md5String);\r
+               return new Object[] { md5String };\r
+       }\r
+}
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/steps/CancelableStep.java b/server/-product/production/OMAR/jobs/steps/CancelableStep.java
new file mode 100644 (file)
index 0000000..9293427
--- /dev/null
@@ -0,0 +1,42 @@
+package user.jobengine.server.steps;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\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
+\r
+               getJobRuntime().setRelated("TESZT" + param);\r
+               for (int i = 0; i < count; i++) {\r
+                       if (getJobRuntime().isWaitingCancel())\r
+                               break;\r
+//                     if (i == 1)\r
+//                             throw new Exception("AAAAAAAAAA");\r
+\r
+                       Thread.sleep(1000);\r
+                       int progress = (i + 1) * 100 / count;\r
+                       setProgress(progress);\r
+               }\r
+\r
+//             try {\r
+//\r
+//                     logger.warn("Ez a fo logba megy");\r
+//\r
+//                     //marker="MEDIACUBE"\r
+//                     logger.warn(getMarker(), "Ez a markered logba megy");\r
+//\r
+//                     //marker="MEDIACUBE | folyamat_nev"\r
+//                     logger.warn(getJobRuntime().getSessionMarker(), "Ez a markered logba megy es a nevesitett logba");\r
+//\r
+//             } catch (Exception e) {\r
+//                     e.printStackTrace();\r
+//                     throw e;\r
+//             }\r
+               return new Object[] { param };\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/CleanupMountedLocationStep.java b/server/-product/production/OMAR/jobs/steps/CleanupMountedLocationStep.java
new file mode 100644 (file)
index 0000000..95fff73
--- /dev/null
@@ -0,0 +1,283 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.nio.file.DirectoryStream;\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.text.ParseException;\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.Date;\r
+import java.util.List;\r
+\r
+import org.apache.commons.io.FileUtils;\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.Marker;\r
+\r
+import user.jobengine.server.steps.shared.ItemManagerExtensions;\r
+\r
+public class CleanupMountedLocationStep extends JobStep implements FileVisitor<Path> {\r
+\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String PROJECTFOLDER = "PROJECT";\r
+       private static final String DATEFORMAT = "yyyyMMdd";\r
+       private static final String DOT = ".";\r
+       private static final String STATUSFOLDER = ".STATUS";\r
+       private static final String EWC2EXT = ".ewc2";\r
+       private static final String XMPEXT = ".xmp";\r
+       private static final String CATCHEDEXT = ".catched";\r
+       private static final String KILLDATEEXT = ".killdate";\r
+       private static final String JSONEXT = ".json";\r
+\r
+       private static boolean isEmpty(final Path directory) throws IOException {\r
+               try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(directory)) {\r
+                       final int[] count = new int[] { 0 };\r
+                       final int[] specialCount = new int[] { 0 };\r
+                       dirStream.forEach(p -> {\r
+                               count[0]++;\r
+                               //                              if (p.getFileName().toString().toLowerCase().equals(PROJECTFOLDER.toLowerCase()))\r
+                               //                                      specialCount[0]++;\r
+                               if (p.getFileName().toString().toLowerCase().equals(STATUSFOLDER.toLowerCase()))\r
+                                       specialCount[0]++;\r
+\r
+                       });\r
+                       if (specialCount[0] == count[0])\r
+                               return true;\r
+               }\r
+               return false;\r
+       }\r
+\r
+       private Marker marker;\r
+\r
+       final int[] allCount = new int[] { 0 };\r
+       final int[] currentCount = new int[] { 0 };\r
+\r
+       private Path sourcePath;\r
+       private SimpleDateFormat dateFormat;\r
+       private boolean skipArchiveCheck;\r
+\r
+       private Date checkExpiration(List<Path> killDateFiles) {\r
+               Date killDate = null;\r
+               for (Path killDateFile : killDateFiles) {\r
+                       Date currentKillDate = getKillDate(killDateFile);\r
+                       if (currentKillDate == null)\r
+                               continue;\r
+                       if ((killDate != null && currentKillDate.after(killDate)) || killDate == null)\r
+                               killDate = currentKillDate;\r
+               }\r
+               return new Date().after(killDate) ? killDate : null;\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(String sourceFolder, boolean skipArchiveCheck) throws Exception {\r
+               this.skipArchiveCheck = skipArchiveCheck;\r
+               marker = getSessionMarker();\r
+               sourcePath = Paths.get(sourceFolder);\r
+               DirectoryStream<Path> directoryStream = null;\r
+               if (StringUtils.isBlank(sourcePath.toString())) {\r
+                       logger.error(marker, "A folyamat 'sourcePath' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'sourceFolder' input parameter missing.");\r
+               }\r
+\r
+               if (!Files.exists(sourcePath) || !Files.isDirectory(sourcePath)) {\r
+                       logger.error(marker, "A {} mappa nem létezik.", sourceFolder);\r
+                       throw new NullPointerException(String.format("Directory %s does not exist.", sourceFolder));\r
+               }\r
+\r
+               try {\r
+                       setProgress(1);\r
+                       dateFormat = new SimpleDateFormat(DATEFORMAT);\r
+\r
+                       Files.walkFileTree(sourcePath, new SimpleFileVisitor<Path>() {\r
+                               @Override\r
+                               public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {\r
+                                       allCount[0]++;\r
+                                       return super.visitFile(file, attrs);\r
+                               }\r
+                       });\r
+                       Files.walkFileTree(sourcePath, this);\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       logger.error(marker, "Hiba a '{}' mappa feldolgozásában. A rendszer hibaüzenete: {}", sourcePath, e.getMessage());\r
+                       throw e;\r
+               } finally {\r
+                       if (directoryStream != null) {\r
+                               try {\r
+                                       directoryStream.close();\r
+                               } catch (IOException e) {\r
+                               }\r
+                       }\r
+               }\r
+               return null;\r
+       }\r
+\r
+       private Date getKillDate(Path killDateFile) {\r
+               String fileName = killDateFile.getFileName().toString();\r
+               int end = fileName.lastIndexOf(DOT);\r
+               if (end < 1)\r
+                       return null;\r
+               int start = fileName.lastIndexOf(DOT, end - 1);\r
+               if (start < 0)\r
+                       return null;\r
+               String strKillDate = fileName.substring(start + 1, end);\r
+               Date result = null;\r
+               if (StringUtils.isNumeric(strKillDate)) {\r
+                       try {\r
+                               result = dateFormat.parse(strKillDate);\r
+                       } catch (ParseException e) {\r
+                               logger.error(marker, "A {} fájl 'killdate' állománya hibás formátumú, a {} karaktersorozat nem konvertálható dátummá.", fileName, strKillDate);\r
+                               return null;\r
+                       }\r
+               } else\r
+                       logger.error(marker, "A {} fájl 'killdate' állománya hibás formátumú, az dátum helyett ez áll: '{}'.", fileName, strKillDate);\r
+               return result;\r
+       }\r
+\r
+       private List<Path> getKillDateFiles(Path filePath) {\r
+               String killDateFilePattern = String.format("%s.*%s", filePath.getFileName().toString(), KILLDATEEXT);\r
+               List<Path> result = new ArrayList<>();\r
+               Path statusPath = null;\r
+               try {\r
+                       statusPath = Paths.get(filePath.getParent().toString(), STATUSFOLDER);\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       return null;\r
+               }\r
+               File statusPathFile = statusPath.toFile();\r
+               if (statusPathFile.exists() && statusPathFile.isDirectory()) {\r
+                       try (DirectoryStream<Path> stream = Files.newDirectoryStream(statusPath, killDateFilePattern)) {\r
+                               stream.forEach(p -> result.add(p));\r
+                       } catch (Exception e) {\r
+                               logger.catching(e);\r
+                       }\r
+               }\r
+               Collections.sort(result);\r
+               return result;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {\r
+               if (!dir.equals(sourcePath) && isEmpty(dir)) {\r
+                       if (!removeExistingSpecialDirectory(dir, PROJECTFOLDER))\r
+                               return FileVisitResult.CONTINUE;\r
+                       if (!removeExistingSpecialDirectory(dir, STATUSFOLDER))\r
+                               return FileVisitResult.CONTINUE;\r
+                       if (removeFile(dir))\r
+                               logger.info(marker, "A {} üres mappa törlése sikeres.", dir);\r
+\r
+               }\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {\r
+\r
+               //A .-al kezdodo mappakat kihagyjuk\r
+               if (dir.getFileName().toString().startsWith("."))\r
+                       return FileVisitResult.SKIP_SUBTREE;\r
+\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+\r
+       private void processPathItem(Path filePath) {\r
+               currentCount[0]++;\r
+\r
+               if (filePath.getFileName().toString().startsWith("."))\r
+                       return;\r
+\r
+               int progress = currentCount[0] * 100 / allCount[0];\r
+               setProgress(progress);\r
+\r
+               logger.info("Checking {}", filePath);\r
+               List<Path> killDateFiles = getKillDateFiles(filePath);\r
+               if (killDateFiles == null || killDateFiles.size() == 0) {\r
+                       logger.warn(marker, "A {} fájlhoz nem található 'killdate' állomány.", filePath);\r
+                       return;\r
+               }\r
+\r
+               if (killDateFiles.size() != 1)\r
+                       logger.warn(marker, "A {} fájlhoz több 'killdate' állomány található, a legújabb dátum határozza meg a törlés időpontját.", filePath);\r
+\r
+               Date killDate = checkExpiration(killDateFiles);\r
+               if (killDate == null)\r
+                       return;\r
+\r
+               if (!skipArchiveCheck && filePath.toFile().length() > 0) {\r
+                       if (!ItemManagerExtensions.isArchived(getManager(), filePath)) {\r
+                               logger.error(marker, "A(z) {} anyag törlésre van kijelölve, de nem található az archívumban.", filePath);\r
+                               return;\r
+                       }\r
+               }\r
+\r
+               if (removeFiles(filePath, killDateFiles))\r
+                       logger.info(marker, "A {} fájl és kapcsolódó állományai a {} killdate bejegyzés alapján sikeresen törlődtek.", filePath.getFileName(),\r
+                                       dateFormat.format(killDate));\r
+               else\r
+                       logger.warn(marker, "A {} fájl és kapcsolódó állományai a {} killdate bejegyzés alapján csak részlegesen vagy egyáltalán nem törlődtek.",\r
+                                       filePath.getFileName(), dateFormat.format(killDate));\r
+       }\r
+\r
+       private boolean removeExistingSpecialDirectory(Path dir, String folderName) throws IOException {\r
+               File projectPath = Paths.get(dir.toString(), folderName).toFile();\r
+               if (projectPath.exists() && projectPath.isDirectory()) {\r
+                       FileUtils.deleteDirectory(projectPath);\r
+                       if (projectPath.exists()) {\r
+                               logger.warn(marker, "A {} alatti {} mappa törlése nem sikerült.", dir, folderName);\r
+                               return false;\r
+                       }\r
+               }\r
+               return true;\r
+       }\r
+\r
+       private boolean removeFile(Path filePath) {\r
+               boolean result = false;\r
+               try {\r
+                       //logger.error("REMOVE {}", filePath);\r
+                       File file = filePath.toFile();\r
+                       if (file.exists())\r
+                               result = file.delete();\r
+               } catch (Exception e) {\r
+                       logger.error(marker, "A {} fájl nem törölhető. A rendszer hibaüzenete: {}", filePath, e.getMessage());\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private boolean removeFiles(Path filePath, List<Path> killDateFiles) {\r
+               if (!removeFile(filePath))\r
+                       return false;\r
+\r
+               removeFile(Paths.get(filePath.toString() + EWC2EXT));\r
+               removeFile(Paths.get(filePath.toString() + XMPEXT));\r
+               removeFile(Paths.get(filePath.getParent().toString(), STATUSFOLDER, filePath.getFileName().toString() + CATCHEDEXT));\r
+               removeFile(Paths.get(filePath.getParent().toString(), STATUSFOLDER, filePath.getFileName().toString() + JSONEXT));\r
+\r
+               boolean result = true;\r
+               for (Path killDateFile : killDateFiles) {\r
+                       if (!removeFile(killDateFile))\r
+                               result = false;\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {\r
+               processPathItem(file);\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult visitFileFailed(Path file, IOException e) throws IOException {\r
+               logger.error(marker, "A {} fájl nem érhető el. A rendszer hibaüzenete: {}", file.toString(), e.getMessage());\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/CreateArchiveItemStep.java b/server/-product/production/OMAR/jobs/steps/CreateArchiveItemStep.java
new file mode 100644 (file)
index 0000000..ec165e8
--- /dev/null
@@ -0,0 +1,47 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Paths;\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
+import com.ibm.nosql.json.api.DB;\r
+import com.ibm.nosql.json.api.DBCollection;\r
+\r
+import user.commons.nosql.NoSQLUtils;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.Store;\r
+\r
+public class CreateArchiveItemStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(Media mediaCubeMedia, String localHiresPath) throws Exception {\r
+               DB db = NoSQLUtils.getNoSQLDB();\r
+               DBCollection collection = db.getCollection("missing_lowres");\r
+               Store highResStore = getManager().getSystemStore(false);\r
+\r
+               ArchiveItem archiveItem = null;\r
+               try {\r
+                       if (mediaCubeMedia.getMediaFilesCount() != 1) {\r
+                               throw new Exception("Expected media count is 1, found " + mediaCubeMedia.getMediaFilesCount());\r
+                       }\r
+                       if (mediaCubeMedia.getMediaFiles().get(0).getStoreId() != highResStore.getId()) {\r
+                               throw new Exception("Expected media store is a high-res store");\r
+                       }\r
+\r
+                       String name = mediaCubeMedia.getMediaFileRealName();\r
+                       archiveItem = new ArchiveItem();\r
+                       archiveItem.setMediaFile(Paths.get(localHiresPath, name).toString());\r
+                       collection.save(new BasicDBObject("name", name));\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       logger.info(getMarker(), e.getMessage());\r
+                       throw e;\r
+               } finally {\r
+                       setProgress(100);\r
+               }\r
+               return new Object[] { archiveItem };\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/CreateMissingLowresStep.java b/server/-product/production/OMAR/jobs/steps/CreateMissingLowresStep.java
new file mode 100644 (file)
index 0000000..72b4cfb
--- /dev/null
@@ -0,0 +1,95 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Paths;\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
+import com.ibm.nosql.json.api.DB;\r
+import com.ibm.nosql.json.api.DBCollection;\r
+\r
+import user.commons.log4j2.marker.MediaCubeUndoMarker;\r
+import user.commons.nosql.NoSQLUtils;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class CreateMissingLowresStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(String localHiresPath, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               Object[] result = new Object[] { null, null, "%s", null, 0, true };\r
+\r
+               DB db = NoSQLUtils.getNoSQLDB();\r
+               DBCollection collection = db.getCollection("missing_lowres");\r
+               IItemManager manager = jobEngine.getItemManager();\r
+               Media media = getFirstUntranscodedMedia(manager, collection);\r
+\r
+               try {\r
+                       if (media == null) {\r
+                               logger.info(new MediaCubeUndoMarker(getSessionMarker().getSessionID()), "Nincs feldolgozandó hiány.");\r
+                               // throw new Exception("Nincs feldolgozandó hiány.");\r
+                               cancel();\r
+                               return null;\r
+                       }\r
+\r
+                       String name = media.getMediaFileRealName();\r
+                       result[0] = media;\r
+                       ArchiveItem archiveItem = new ArchiveItem();\r
+                       archiveItem.setMediaFile(Paths.get(localHiresPath, name).toString());\r
+                       result[1] = archiveItem;\r
+                       collection.save(new BasicDBObject("name", name));\r
+                       logger.info(getSessionMarker(), "Processing mediaID: {}", media.getId());\r
+\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+                       throw e;\r
+               } finally {\r
+                       setProgress(100);\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private Media getFirstUntranscodedMedia(IItemManager manager, DBCollection collection) {\r
+               Media[] result = new Media[] { null };\r
+               // MV\r
+               String query = "SELECT mediaid FROM VW_MISSING_PROXY_IDS WHERE HOUSEID like 'M%' or HOUSEID like 'P%' or HOUSEID like 'R%' ORDER BY modified DESC";\r
+\r
+               // HTV\r
+               // String query = "SELECT mediaid FROM VW_MISSING_PROXY_IDS";\r
+               manager.executeQuery(query, rs -> {\r
+                       try {\r
+                               long mediaId = rs.getLong(1);\r
+                               Media media = manager.getMedia(mediaId);\r
+                               // a nevgeneralas miatt az eredeti MediaFilesName nem jo, a pontos nev kell\r
+                               // nekunk\r
+                               String name = media.getMediaFileRealName();\r
+                               //logger.info(getSessionMarker(), "Checking {}", name);\r
+                               long existing = collection.find(new BasicDBObject("name", name)).count();\r
+                               if (existing > 0) {\r
+                                       // logger.info(getSessionMarker(), "{} is on missing_lowres list", name);\r
+                                       return true;\r
+                               }\r
+\r
+                               // 210617 proxy keszites tiltasa\r
+                               MediaFile mf = manager.getSystemMediaFile(media);\r
+                               if (mf.isDisableProxy()) {\r
+                                       logger.info(getSessionMarker(), "Proxy disabled {}", name);\r
+                                       \r
+                                       return true;\r
+                               }\r
+\r
+                               result[0] = media;\r
+                       } catch (Exception e) {\r
+                               logger.error(e);\r
+                       }\r
+                       return false;\r
+               }, null);\r
+               return result[0];\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/DeleteFile.java b/server/-product/production/OMAR/jobs/steps/DeleteFile.java
new file mode 100644 (file)
index 0000000..539faf7
--- /dev/null
@@ -0,0 +1,22 @@
+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.RemoteFile;\r
+import user.commons.StoreUri;\r
+\r
+public class DeleteFile extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(String fileName, StoreUri tempStoreUri) throws Exception {\r
+               try {\r
+                       RemoteFile remoteFile = tempStoreUri.getRemoteFile(fileName);\r
+                       tempStoreUri.delete(remoteFile);\r
+               } catch (Exception e) {\r
+                       logger.warn(getJobRuntime().getSessionMarker(), e.getMessage());\r
+               }\r
+               return null;\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/DummyTestStep1.java b/server/-product/production/OMAR/jobs/steps/DummyTestStep1.java
new file mode 100644 (file)
index 0000000..22b3ab9
--- /dev/null
@@ -0,0 +1,23 @@
+package user.jobengine.server.steps;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+public class DummyTestStep1 extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger(DummyTestStep1.class);\r
+\r
+       @StepEntry\r
+       public Object[] execute(String param1) {\r
+               logger.info("Executing DummyTestStep1");\r
+               int var1 = 0;\r
+               if (param1.equals("Jozsi")) {\r
+                       var1 = 1;\r
+                       Thread.sleep(1000);\r
+                       setProgress(50);\r
+                       Thread.sleep(1000);\r
+                       setProgress(50);\r
+               }\r
+\r
+               return new Object[] {var1}; \r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/DummyTestStep2.java b/server/-product/production/OMAR/jobs/steps/DummyTestStep2.java
new file mode 100644 (file)
index 0000000..e7579f1
--- /dev/null
@@ -0,0 +1,20 @@
+package user.jobengine.server.steps;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+public class DummyTestStep2 extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger(DummyTestStep2.class);\r
+\r
+       @StepEntry\r
+       public Object[] execute(int var2) {\r
+               logger.info("Executing DummyTestStep2");\r
+               long var3 = 0L;\r
+               Thread.sleep(1000);\r
+               setProgress(50);\r
+               Thread.sleep(1000);\r
+               setProgress(50);\r
+\r
+               return new Object[] { var3 };\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/DummyTestStep3.java b/server/-product/production/OMAR/jobs/steps/DummyTestStep3.java
new file mode 100644 (file)
index 0000000..93d76a7
--- /dev/null
@@ -0,0 +1,17 @@
+package user.jobengine.server.steps;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+public class DummyTestStep3 extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger(DummyTestStep3.class);\r
+\r
+       @StepEntry\r
+       public void execute(long var3) {\r
+               Thread.sleep(1000);\r
+               setProgress(50);\r
+               Thread.sleep(1000);\r
+               setProgress(50);\r
+               logger.info("Executing DummyTestStep3");\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/FileCopyStep.java b/server/-product/production/OMAR/jobs/steps/FileCopyStep.java
new file mode 100644 (file)
index 0000000..c417255
--- /dev/null
@@ -0,0 +1,95 @@
+package user.jobengine.server.steps;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.IProgressEventListener;\r
+import user.commons.remotestore.ProgressEvent;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class FileCopyStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private IItemManager manager;\r
+       private Marker marker;\r
+\r
+       private void check(String sourceProtocol, String sourcePath, String sourceFileName, String targetProtocol, String targetPath, String targetFileName,\r
+                       IJobEngine jobEngine, IJobRuntime jobRuntime) {\r
+               if (jobEngine == null) {\r
+                       logger.error(marker, "A folyamatkezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing JobEngine reference.");\r
+               }\r
+               manager = jobEngine.getItemManager();\r
+               if (manager == null) {\r
+                       logger.error(marker, "Az adatbáziskezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing ItemManager reference.");\r
+               }\r
+               if (sourceProtocol == null) {\r
+                       logger.error(marker, "A forrás protokol bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'sourceProtocol' input parameter missing.");\r
+               }\r
+               if (sourcePath == null) {\r
+                       logger.error(marker, "A forrás fájl elérés bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'sourcePath' input parameter missing.");\r
+               }\r
+               if (sourceFileName == null) {\r
+                       logger.error(marker, "A forrás fájlnév bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'sourceFileName' input parameter missing.");\r
+               }\r
+               if (targetProtocol == null) {\r
+                       logger.error(marker, "A cél protokol bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'targetProtocol' input parameter missing.");\r
+               }\r
+               if (targetPath == null) {\r
+                       logger.error(marker, "A cél fájl elérés bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'targetPath' input parameter missing.");\r
+               }\r
+               if (targetFileName == null) {\r
+                       logger.error(marker, "A cél fájlnév bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'targetFileName' input parameter missing.");\r
+               }\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(String sourceProtocol, String sourcePath, String sourceFileName, String targetProtocol, String targetPath, String targetFileName,\r
+                       int killDateDays, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               marker = jobRuntime.getSessionMarker();\r
+\r
+               check(sourceProtocol, sourcePath, sourceFileName, targetProtocol, targetPath, targetFileName, jobEngine, jobRuntime);\r
+\r
+               StoreUri source = null;\r
+               StoreUri target = null;\r
+\r
+               try {\r
+                       source = manager.createStoreUri(Enum.valueOf(RemoteStoreProtocol.class, sourceProtocol), sourcePath);\r
+                       target = manager.createStoreUri(Enum.valueOf(RemoteStoreProtocol.class, targetProtocol), targetPath);\r
+                       source.addProgressListener(new IProgressEventListener() {\r
+                               @Override\r
+                               public void progressChanged(ProgressEvent evt) {\r
+                                       jobRuntime.incrementProgress(evt.getProgress());\r
+                               }\r
+                       });\r
+\r
+                       source.transferFrom(target, sourceFileName, targetFileName);\r
+                       if (killDateDays > -1)\r
+                               EscortFiles.createUNCKillDate(targetPath, targetFileName, killDateDays, marker);\r
+\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       throw e;\r
+               } finally {\r
+                       if (source != null) {\r
+                               source.cleanUp();\r
+                       }\r
+                       if (target != null) {\r
+                               target.cleanUp();\r
+                       }\r
+               }\r
+\r
+               return null;\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/GenerateJSONMetadataStep.java b/server/-product/production/OMAR/jobs/steps/GenerateJSONMetadataStep.java
new file mode 100644 (file)
index 0000000..210d735
--- /dev/null
@@ -0,0 +1,65 @@
+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.Map;\r
+\r
+import org.apache.commons.io.FilenameUtils;\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.mediaarea.MediaArea;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class GenerateJSONMetadataStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(Map<String, MediaArea> files, String sourceStoreName, String targetStoreName,\r
+                       String escortStoreFolder) {\r
+               if (!files.isEmpty()) {\r
+                       for (String fullPath : files.keySet()) {\r
+                               MediaArea mediaArea = files.get(fullPath);\r
+                               String title = FilenameUtils.getBaseName(fullPath).replace(FilenameUtils.getExtension(fullPath), "");\r
+                               String pathOnly = fullPath.substring(0, fullPath.lastIndexOf("\\") + 1);\r
+                               String filenameOnly = FilenameUtils.getBaseName(fullPath);\r
+                               Timestamp created = null;\r
+                               Timestamp modified = null;\r
+                               long frameCount = mediaArea.getFrameCount();\r
+                               long mediaId = 0;\r
+                               StoreUri sourceStoreUri = getManager().getStoreUri(sourceStoreName, RemoteStoreProtocol.LOCAL);\r
+                               StoreUri targetStoreUri = getManager().getStoreUri(targetStoreName, RemoteStoreProtocol.LOCAL);\r
+                               StoreUri escortStoreUri = getManager().getStoreUri(escortStoreFolder, RemoteStoreProtocol.LOCAL);\r
+\r
+                               try {\r
+                                       String outputPath = Paths.get(escortStoreUri.toString(true)).toString();\r
+                               } catch (Exception e1) {\r
+                                       e1.printStackTrace();\r
+                               }\r
+\r
+                               DownloadableMedia downloadable = DownloadableMedia.create(title, filenameOnly, modified, created,\r
+                                               frameCount, 0, sourceStoreUri.getId(), targetStoreUri.getId(), mediaId);\r
+                               String escortFileName = targetStoreName + "." + downloadable.getString("fileName"); // needed without\r
+                                                                                                                                                                                                       // extension\r
+                               try {\r
+                                       if (EscortFiles.createMetadataIfNotExists(pathOnly, escortFileName,\r
+                                                       downloadable.toPrettyString(""))) {\r
+                                               logger.info(getMarker(), "Archive status file created for {}", fullPath);\r
+                                       } else {\r
+                                               logger.info(getMarker(), "Archive status file already exists for {}", fullPath);\r
+                                       }\r
+                               } catch (IOException e) {\r
+                                       logger.error("{}", e.getCause());\r
+                                       e.printStackTrace();\r
+                               }\r
+                       }\r
+               } else {\r
+                       logger.info("files is empty!");\r
+               }\r
+               return null;\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/HSMMigrateStep.java b/server/-product/production/OMAR/jobs/steps/HSMMigrateStep.java
new file mode 100644 (file)
index 0000000..895b141
--- /dev/null
@@ -0,0 +1,401 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.BufferedInputStream;\r
+import java.io.BufferedOutputStream;\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.FileOutputStream;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.io.OutputStream;\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.text.SimpleDateFormat;\r
+import java.util.Arrays;\r
+import java.util.LinkedHashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.apache.commons.io.FilenameUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+import com.ibm.nosql.json.api.DB;\r
+import com.ibm.nosql.json.api.DBCollection;\r
+import com.ibm.nosql.json.api.QueryBuilder;\r
+\r
+import user.commons.IEntityBase;\r
+import user.commons.log4j2.marker.MediaCubeMarker;\r
+import user.commons.nosql.NoSQLUtils;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.db.MediaFileDAO;\r
+import user.mediacube.metadata.interfaces.IMetadata;\r
+import user.mediacube.metadata.interfaces.IMetadataProvider;\r
+import user.mediacube.metadata.interfaces.IMetadataProviderFactory;\r
+import user.mediacube.metadata.interfaces.MetadataProviderType;\r
+import user.mediacube.metadata.interfaces.MetadataType;\r
+import user.mediacube.metadata.interfaces.PlanAirMetadataListOptions;\r
+\r
+public class HSMMigrateStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String MXFEXT = ".mxf";\r
+       private static final String MOVEXT = ".mov";\r
+       private Marker marker = null;\r
+       private IMetadataProvider hsmProvider;\r
+       private Map<String, BasicDBObject> tapeContents = new LinkedHashMap<>();\r
+       private DBCollection excludes;\r
+       private DBCollection fileHistory;\r
+       private DBCollection volumeHistory;\r
+       private DB db;\r
+       private IMetadataProvider planairProvider;\r
+       private SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd");\r
+\r
+       private void cleanupHistory() {\r
+               if (db == null)\r
+                       db = NoSQLUtils.getNoSQLDB();\r
+               if (fileHistory == null)\r
+                       fileHistory = db.getCollection("hsm_migrate_file_history");\r
+               if (volumeHistory == null)\r
+                       volumeHistory = db.getCollection("hsm_migrate_volume_history");\r
+               fileHistory.drop();\r
+               volumeHistory.drop();\r
+       }\r
+\r
+       private BasicDBObject createMetadata(String volumeName, String fileName) throws Exception {\r
+\r
+               Path filePath = Paths.get(fileName);\r
+               String mediaHouseId = FilenameUtils.removeExtension(filePath.getFileName().toString());\r
+               BasicDBObject result = null;\r
+               try {\r
+                       result = getPlanAirMetadata(mediaHouseId);\r
+               } catch (Exception e) {\r
+\r
+                       logger.error("PlanAir metadata error", e);\r
+                       //nem latja a drivert pl.\r
+                       //throw e;\r
+               }\r
+\r
+               if (result == null) {\r
+                       result = new BasicDBObject();\r
+                       BasicFileAttributes attr = Files.readAttributes(filePath, BasicFileAttributes.class);\r
+                       result.put("itemHouseId", df.format(attr.lastModifiedTime().toMillis()));\r
+                       result.put("itemTitle", filePath.getParent().toString());\r
+                       result.put("mediaHouseId", mediaHouseId);\r
+                       result.put("mediaTitle", fileName);\r
+                       result.put("mediaDescription", volumeName);\r
+                       result.put("mediaType", "Generic");\r
+               }\r
+               result.put("userName", "mediacube");\r
+               return result;\r
+       }\r
+\r
+       @SuppressWarnings("serial")\r
+       @StepEntry\r
+       public Object[] execute(String sourceLocation, String targetLocation) throws Exception {\r
+               marker = getJobRuntime().getSessionMarker();\r
+               //remove from prod\r
+               //cleanupHistory();\r
+               hsmProvider = getMetadataProvider(MetadataProviderType.HSM);\r
+               if (hsmProvider == null)\r
+                       throw new NullPointerException("No HSM metadata provider available");\r
+               planairProvider = getMetadataProvider(MetadataProviderType.PLANAIR);\r
+               if (planairProvider == null)\r
+                       throw new NullPointerException("No PLANAIR metadata provider available");\r
+               Path targetPath = Paths.get(targetLocation);\r
+               try {\r
+                       List<IMetadata> volumes = hsmProvider.list(new BasicDBObject());\r
+                       for (IMetadata volume : volumes) {\r
+                               String volumeName = volume.getTitle();\r
+\r
+                               BasicDBObject historyResult = queryVolumeHistory(volumeName);\r
+                               if (historyResult != null) {\r
+                                       logger.info(marker, "A kazetta már feldolgozásra került: {}", volumeName);\r
+                                       continue;\r
+                               }\r
+                               logger.info(marker, "A kazetta feldolgozása elindul: {}", volumeName);\r
+                               List<IMetadata> contents = getContents(volumeName);\r
+                               int p = 0;\r
+                               boolean oneSuccess = false;\r
+                               boolean hasError = false;\r
+                               for (IMetadata content : contents) {\r
+                                       BasicDBObject c = content.asJSON();\r
+                                       String hsmFileName = c.getString("fileName");\r
+                                       long contentFileSize = NoSQLUtils.asLong(c, "fileSize");\r
+                                       if (!tapeContents.containsKey(hsmFileName)) {\r
+                                               tapeContents.put(hsmFileName, c);\r
+                                               Path sourceFilePath = Paths.get(sourceLocation, hsmFileName);\r
+                                               if (contentFileSize < Files.getFileStore(targetPath).getUsableSpace()) {\r
+                                                       Path targetFilePath = Paths.get(targetLocation, sourceFilePath.getFileName().toString());\r
+\r
+                                                       try {\r
+                                                               if (processHSMFile(volumeName, hsmFileName, sourceFilePath, targetFilePath)) {\r
+                                                                       oneSuccess = true;\r
+                                                               }\r
+                                                       } catch (Exception e) {\r
+                                                               hasError = true;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       setProgress(p++ * 100 / contents.size());\r
+\r
+                                       if (getJobRuntime().isWaitingCancel()) {\r
+                                               logger.info("Job canceled by user");\r
+                                               //ne mentsuk a szalagot meg\r
+                                               return null;\r
+                                       }\r
+\r
+                               }\r
+\r
+                               if (oneSuccess && !hasError) {\r
+                                       saveVolumeHistory(volumeName);\r
+                                       String subject = "A kazetta eltávolítható a HSM rendszerből: " + volumeName;\r
+                                       logger.info(new MediaCubeMarker() {\r
+                                               {\r
+                                                       setSubject(subject);\r
+                                               }\r
+                                       }, subject);\r
+                               }\r
+\r
+                               //ha mar sikerult valamit archivalni kilepunk\r
+                               if (oneSuccess)\r
+                                       break;\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.error(marker, "Hiba a migráció során. A rendszer hibaüzenete: {}", e.getMessage());\r
+                       throw e;\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       private List<IMetadata> getContents(String volumeName) throws Exception {\r
+               List<IMetadata> contents = null;\r
+               contents = hsmProvider.list(new BasicDBObject("volumeName", volumeName));\r
+               return contents;\r
+       }\r
+\r
+       protected IMetadataProvider getMetadataProvider(MetadataProviderType type) {\r
+               IMetadataProviderFactory factory = getService(IMetadataProviderFactory.class);\r
+               if (factory == null)\r
+                       return null;\r
+               return factory.getProvider(type);\r
+       }\r
+\r
+       private BasicDBObject getPlanAirMetadata(String mediaHouseId) throws Exception {\r
+               PlanAirMetadataListOptions opt = new PlanAirMetadataListOptions();\r
+               opt.setSearch(mediaHouseId);\r
+\r
+               List<IMetadata> result = null;\r
+               opt.setType(MetadataType.Material);\r
+               result = planairProvider.list(opt);\r
+               if (result.size() != 0)\r
+                       return result.get(0).asJSON();\r
+\r
+               opt.setType(MetadataType.Promo);\r
+               result = planairProvider.list(opt);\r
+               if (result.size() != 0)\r
+                       return result.get(0).asJSON();\r
+\r
+               opt.setType(MetadataType.AD);\r
+               result = planairProvider.list(opt);\r
+               if (result.size() != 0)\r
+                       return result.get(0).asJSON();\r
+\r
+               return null;\r
+       }\r
+\r
+       //true if need copy\r
+       public boolean prepareCopy(String hsmFileName, Path source, Path target) throws IOException {\r
+               boolean result = true;\r
+               BasicDBObject excludeResult = queryExclude(hsmFileName);\r
+               if (excludeResult != null) {\r
+                       logger.warn(marker, "Kivételként megjelölt: {}", hsmFileName);\r
+                       return false;\r
+               }\r
+\r
+               File sourceFile = source.toFile();\r
+               File targetFile = target.toFile();\r
+\r
+               if (!sourceFile.exists()) {\r
+                       logger.warn(marker, "A forrás nem elérhető: {}", source);\r
+                       return false;\r
+               }\r
+\r
+               //              BasicDBObject historyResult = queryFileHistory(contentFileName);\r
+               //              if (historyResult != null)\r
+               //                      return false;\r
+\r
+               //              if (!mediaFile.getName().toLowerCase().endsWith(MOVEXT.toLowerCase()) && !mediaFile.getName().toLowerCase().endsWith(MXFEXT.toLowerCase()))\r
+               //                      return;\r
+               //              logger.info("Start copy from {} to {}", sourceFilePath, targetFilePath);\r
+\r
+               boolean targetExists = targetFile.exists();\r
+\r
+               long targetLength = targetFile.length();\r
+               long sourceLength = sourceFile.length();\r
+\r
+               if (targetLength == sourceLength) {\r
+                       logger.warn(marker, "A fájl már fel van dolgozva: {}, {} -> {}", source, sourceLength, targetLength);\r
+                       return false;\r
+               }\r
+\r
+               if (targetLength > sourceLength) {\r
+                       logger.warn(marker, "A célfájl nagyobb, törlöm: {}", target);\r
+                       Files.delete(target);\r
+                       targetLength = 0;\r
+                       targetExists = false;\r
+               }\r
+\r
+               if (targetExists) {\r
+                       logger.warn(marker, "A fájl már létezik, a másolás folytatódik: {}, {} -> {}", target, sourceLength, targetLength);\r
+               } else\r
+                       logger.warn(marker, "Migrálás: {}, {} -> {}", source, sourceLength, targetLength);\r
+\r
+               return result;\r
+       }\r
+\r
+       private boolean processHSMFile(String volumeName, String hsmFileName, Path sourceFilePath, Path targetFilePath) throws Exception {\r
+               int repeat = 4;\r
+               boolean successCopy = false;\r
+\r
+               IItemManager manager = getManager();\r
+               MediaFileDAO mfDAO = (MediaFileDAO) manager.getBaseDAO(MediaFile.class);\r
+               List<IEntityBase> mediaFiles = mfDAO.getByHouseId(sourceFilePath.getFileName().toString());\r
+               if (mediaFiles != null && mediaFiles.size() > 0) {\r
+                       logger.warn(marker, "Már archivált: {}", hsmFileName);\r
+                       return false;\r
+               }\r
+\r
+               if (prepareCopy(hsmFileName, sourceFilePath, targetFilePath)) {\r
+                       while (repeat > 0) {\r
+                               try {\r
+                                       resumeableCopy(sourceFilePath, targetFilePath);\r
+                                       repeat = 0;\r
+                                       successCopy = true;\r
+                               } catch (Exception e) {\r
+                                       if (Files.exists(targetFilePath) && targetFilePath.toFile().length() == 0)\r
+                                               Files.delete(targetFilePath);\r
+                                       //logger.warn(marker, "Hiba a másolás során: {} ({})", sourceFilePath, e.getMessage());\r
+                                       repeat--;\r
+                               }\r
+                       }\r
+               }\r
+               String metadataFileName = sourceFilePath.getFileName() + EscortFiles.DOT_JSON;\r
+               Path metadataPath = Paths.get(targetFilePath.getParent().toString(), EscortFiles.STATUSFOLDER, metadataFileName);\r
+               boolean createMetadata = Files.exists(targetFilePath) && !Files.exists(metadataPath);\r
+\r
+               if (successCopy || createMetadata) {\r
+                       String metadata = null;\r
+                       try {\r
+                               metadata = createMetadata(volumeName, hsmFileName).toPrettyString("");\r
+                               EscortFiles.createMetadata(targetFilePath.getParent().toString(), targetFilePath.getFileName().toString(), metadata);\r
+                               //saveFileHistory(contentFileName);\r
+\r
+                       } catch (Exception e) {\r
+                               logger.error(marker, "Metadata error", e);\r
+                               return false;\r
+                       }\r
+                       return true;\r
+               }\r
+\r
+               logger.error(marker, "A fájl másolása nem lehetséges: {}", sourceFilePath);\r
+               return false;\r
+       }\r
+\r
+       public BasicDBObject queryExclude(String fileName) {\r
+               if (db == null)\r
+                       db = NoSQLUtils.getNoSQLDB();\r
+               if (excludes == null)\r
+                       excludes = db.getCollection("hsm_migrate_exclude");\r
+               Path filePath = Paths.get(fileName);\r
+               String pureFileName = FilenameUtils.removeExtension(filePath.getFileName().toString());\r
+               QueryBuilder qb = QueryBuilder.start("name").in(Arrays.asList(fileName, pureFileName));\r
+               BasicDBObject exceptionResult = NoSQLUtils.asSingle(excludes.find(qb.get()));\r
+               return exceptionResult;\r
+       }\r
+\r
+       public BasicDBObject queryFileHistory(String fileName) {\r
+               if (db == null)\r
+                       db = NoSQLUtils.getNoSQLDB();\r
+               if (fileHistory == null)\r
+                       fileHistory = db.getCollection("hsm_migrate_file_history");\r
+               QueryBuilder qb = QueryBuilder.start("name").in(Arrays.asList(fileName));\r
+               BasicDBObject historyResult = NoSQLUtils.asSingle(fileHistory.find(qb.get()));\r
+               return historyResult;\r
+       }\r
+\r
+       public BasicDBObject queryVolumeHistory(String volumeName) {\r
+               if (db == null)\r
+                       db = NoSQLUtils.getNoSQLDB();\r
+               if (volumeHistory == null)\r
+                       volumeHistory = db.getCollection("hsm_migrate_volume_history");\r
+               QueryBuilder qb = QueryBuilder.start("name").in(Arrays.asList(volumeName));\r
+               BasicDBObject historyResult = NoSQLUtils.asSingle(volumeHistory.find(qb.get()));\r
+               return historyResult;\r
+       }\r
+\r
+       public void resumeableCopy(Path source, Path target) throws Exception {\r
+               File sourceFile = source.toFile();\r
+               File targetFile = target.toFile();\r
+               boolean targetExists = targetFile.exists();\r
+\r
+               long targetLength = targetFile.length();\r
+               long sourceLength = sourceFile.length();\r
+\r
+               try (InputStream in = new BufferedInputStream(new FileInputStream(sourceFile));\r
+                               OutputStream out = new BufferedOutputStream(new FileOutputStream(targetFile, targetExists))) {\r
+\r
+                       byte[] buffer = new byte[128 * 1024];\r
+                       int lengthRead;\r
+\r
+                       if (targetExists)\r
+                               in.skip(targetLength);\r
+\r
+                       while ((lengthRead = in.read(buffer)) > 0) {\r
+                               out.write(buffer, 0, lengthRead);\r
+                               out.flush();\r
+                               targetLength = targetFile.length();\r
+                               if (targetLength > sourceLength) {\r
+                                       throw new Exception("Hiba! A fájl túl nagy lett.");\r
+                               }\r
+\r
+                               if (getJobRuntime().isWaitingCancel()) {\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       targetLength = targetFile.length();\r
+                       sourceLength = sourceFile.length();\r
+                       if (targetLength != sourceLength) {\r
+                               throw new Exception("Hiba! A fájl mérete nem egyezik.");\r
+                       }\r
+               }\r
+       }\r
+\r
+       private void saveFileHistory(String fileName) {\r
+               if (db == null)\r
+                       db = NoSQLUtils.getNoSQLDB();\r
+               if (fileHistory == null)\r
+                       fileHistory = db.getCollection("hsm_migrate_file_history");\r
+               BasicDBObject item = new BasicDBObject();\r
+               item.put("name", fileName);\r
+               fileHistory.save(item);\r
+\r
+       }\r
+\r
+       private void saveVolumeHistory(String volumeName) {\r
+               if (db == null)\r
+                       db = NoSQLUtils.getNoSQLDB();\r
+               if (volumeHistory == null)\r
+                       volumeHistory = db.getCollection("hsm_migrate_volume_history");\r
+               BasicDBObject item = new BasicDBObject();\r
+               item.put("name", volumeName);\r
+               volumeHistory.save(item);\r
+\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/IntegrationTestStep.java b/server/-product/production/OMAR/jobs/steps/IntegrationTestStep.java
new file mode 100644 (file)
index 0000000..081d02d
--- /dev/null
@@ -0,0 +1,128 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.util.concurrent.CountDownLatch;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.ListUtils;\r
+import user.jobengine.db.ArchivedMedia;\r
+import user.jobengine.db.Item;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.shared.ItemManagerExtensions;\r
+\r
+public class IntegrationTestStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private ArchivedMedia archivedMedia;\r
+\r
+       private void _00_test_cancelable() throws Exception {\r
+               CountDownLatch finishLatch = new CountDownLatch(1);\r
+               getEngine().submit(null, e -> {\r
+                       if (e.isRuntimeTerminated())\r
+                               finishLatch.countDown();\r
+               }, "cancelable.xml", "Test cancelable", ListUtils.asMap("param", 1));\r
+               finishLatch.await();\r
+               logger.info("_00_test_cancelable SUCCESS");\r
+       }\r
+\r
+       private void _01_test_retrieve_ondemand() throws Exception {\r
+               archivedMedia = new ArchivedMedia();\r
+               Media media = getManager().getMedia(15285);\r
+               Item item = getManager().getItem(media.getItemId());\r
+               archivedMedia.setItem(item);\r
+               archivedMedia.setMedia(media);\r
+\r
+               CountDownLatch finishLatch = new CountDownLatch(1);\r
+               getEngine().submit(null, e -> {\r
+                       if (e.isRuntimeTerminated())\r
+                               finishLatch.countDown();\r
+\r
+               }, "retrieve-ondemand.xml", "Test retrieve-ondemand",\r
+                               ListUtils.asMap("globalRetrievePath", "file://10.11.1.100", "localRetrievePath", "/mediacube/data", "materialOutputFolder", "/",\r
+                                               "promoOutputFolder", "/", "advertisementOutputFolder", "/", "octopusOutputFolder", "/", "genericOutputFolder", "/",\r
+                                               "onlineOutputFolder", "/", "killDateDays", -1, "nexioAgency", "ARCHIVE_RESTORE", "nexioPort", 2098, "nexioUserName", "administrator",\r
+                                               "nexioPassword", "system", "archivedMedia", archivedMedia, "successRecipient", "vasary@elgekko.net", "houseId",\r
+                                               archivedMedia.getMedia().getHouseId(), "targetPathType", "0"));\r
+\r
+               finishLatch.await();\r
+               Path output = Paths.get("/mediacube/data", archivedMedia.getMedia().getHouseId(),\r
+                               archivedMedia.getMedia().getHouseId() + "-ARCH-" + archivedMedia.getMedia().getMediaFileRealName());\r
+               if (!Files.exists(output))\r
+                       throw new Exception("File does not exist: " + output);\r
+\r
+               logger.info("_01_test_retrieve_ondemand SUCCESS");\r
+       }\r
+\r
+       private void _02_test_archive_material() throws Exception {\r
+               Path input = Paths.get("/mediacube/data", archivedMedia.getMedia().getHouseId(),\r
+                               archivedMedia.getMedia().getHouseId() + "-ARCH-" + archivedMedia.getMedia().getMediaFileRealName());\r
+\r
+               String outputName = "IntegrationTest_" + System.currentTimeMillis() + ".mxf";\r
+               Path output = Paths.get(input.getParent().toString(), outputName);\r
+               Files.copy(input, output);\r
+               if (!Files.exists(output))\r
+                       throw new Exception("File does not exist: " + output);\r
+\r
+               ArchiveItem archiveItem = new ArchiveItem();\r
+               archiveItem.setMediaFile(output.toString());\r
+               archiveItem.setItemHouseId(outputName);\r
+               archiveItem.setItemTitle(outputName);\r
+               archiveItem.setMediaHouseId(outputName);\r
+               archiveItem.setMediaTitle(outputName);\r
+               archiveItem.setMediaType("Generic");\r
+\r
+               CountDownLatch finishLatch = new CountDownLatch(1);\r
+               getEngine().submit(null, e -> {\r
+                       if (e.isRuntimeTerminated())\r
+                               finishLatch.countDown();\r
+               }, "archive-material.xml", "Test archive-material", ListUtils.asMap("archiveItem", archiveItem, "killDateDays", 0));\r
+               finishLatch.await();\r
+\r
+               if (!ItemManagerExtensions.isArchived(getManager(), output))\r
+                       throw new Exception("File not archived: " + output);\r
+\r
+               Files.delete(output);\r
+\r
+               logger.info("_02_test_archive_material SUCCESS");\r
+       }\r
+\r
+       private void _03_test_delete_materials() throws Exception {\r
+               Path output = Paths.get("/mediacube/data", archivedMedia.getMedia().getHouseId(),\r
+                               archivedMedia.getMedia().getHouseId() + "-ARCH-" + archivedMedia.getMedia().getMediaFileRealName());\r
+               String source = output.getParent().toString();\r
+\r
+               CountDownLatch finishLatch = new CountDownLatch(1);\r
+               getEngine().submit(null, e -> {\r
+                       if (e.isRuntimeTerminated())\r
+                               finishLatch.countDown();\r
+               }, "delete-materials.xml", "Test delete-materials", ListUtils.asMap("sourcePath", source, "skipArchiveCheck", true));\r
+               finishLatch.await();\r
+\r
+               if (Files.exists(output))\r
+                       throw new Exception("File exists: " + output);\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute() throws Exception {\r
+               getJobRuntime().setDescription("_00_test_cancelable");\r
+               _00_test_cancelable();\r
+               setProgress(25);\r
+\r
+               getJobRuntime().setDescription("_01_test_retrieve_ondemand");\r
+               _01_test_retrieve_ondemand();\r
+               setProgress(50);\r
+\r
+               getJobRuntime().setDescription("_02_test_archive_material");\r
+               _02_test_archive_material();\r
+               setProgress(75);\r
+\r
+               getJobRuntime().setDescription("_03_test_delete_materials");\r
+               _03_test_delete_materials();\r
+               setProgress(100);\r
+               return null;\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/MXFCutterStep.java b/server/-product/production/OMAR/jobs/steps/MXFCutterStep.java
new file mode 100644 (file)
index 0000000..58a5944
--- /dev/null
@@ -0,0 +1,129 @@
+package user.jobengine.server.steps;\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.Marker;\r
+\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.IProgressEventListener;\r
+import user.commons.remotestore.ProgressEvent;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+//import user.jobengine.db.Media;\r
+import user.jobengine.db.ArchivedMedia;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.Store;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class MXFCutterStep extends JobStep {\r
+       private static final String TARGETNAMEPATTERN = "-ARCH-%s";\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private IItemManager manager;\r
+       private StoreUri tempTargetUri;\r
+       private StoreUri tempSourceUri;\r
+       private String sourceFileName;\r
+       private Marker marker;\r
+       private int nexioPort;\r
+       private String nexioUserName, nexioPassword;\r
+       private String nexioHost;\r
+\r
+       protected void checkTargetPath(String targetPath) {\r
+               if (StringUtils.isBlank(targetPath)) {\r
+                       logger.error(marker, "A folyamat 'targetPath' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'targetPath' input parameter missing.");\r
+               }\r
+       }\r
+\r
+       protected StoreUri createTargetUri(IItemManager manager, String targetPath) throws NullPointerException {\r
+               StoreUri result = null;\r
+               result = manager.createStoreUri(RemoteStoreProtocol.FTP, nexioHost);\r
+               result.setPortNumber(nexioPort);\r
+               result.setUserName(nexioUserName);\r
+               result.setPassword(nexioPassword);\r
+\r
+               return result;\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(ArchivedMedia archivedMedia, String targetPath, String houseId, String successRecipient, int killDateDays, boolean useNexioTarget,\r
+                       String nexioAgency, int nexioPort, String nexioUserName, String nexioPassword, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               this.nexioPort = nexioPort;\r
+               this.nexioUserName = nexioUserName;\r
+               this.nexioPassword = nexioPassword;\r
+               nexioHost = System.getProperty("nexio.host");\r
+               marker = jobRuntime.getSessionMarker();\r
+\r
+               if (useNexioTarget && archivedMedia.getTcIn() != null && archivedMedia.getTcOut() != null) {\r
+                       setAndCheck(archivedMedia, houseId, targetPath, useNexioTarget, jobEngine);\r
+\r
+                       final IJobRuntime runtime = jobRuntime;\r
+                       sourceFileName = houseId + TARGETNAMEPATTERN;\r
+                       tempSourceUri.addProgressListener(new IProgressEventListener() {\r
+                               @Override\r
+                               public void progressChanged(ProgressEvent evt) {\r
+                                       runtime.incrementProgress(evt.getProgress());\r
+                               }\r
+                       });\r
+\r
+                       RemoteFile result = tempSourceUri.transferFrom(tempTargetUri, sourceFileName, sourceFileName);\r
+\r
+                       EscortFiles.setNEXIOKillDate(killDateDays, houseId, nexioAgency, tempTargetUri);\r
+\r
+                       logger.info("A {} videó kivágva {}s - {}s", sourceFileName, archivedMedia.getTcIn(), archivedMedia.getTcOut());\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       // private String getSourceFileName(ArchivedMedia archivedMedia, Store\r
+       // store) {\r
+       // List<MediaFile> mediaFiles = archivedMedia.getMedia().getMediaFiles();\r
+       // if (mediaFiles == null)\r
+       // return null;\r
+       // for (MediaFile mediaFile : mediaFiles) {\r
+       // if (mediaFile.getStore().getId() == store.getId())\r
+       // return mediaFile.getRelativePath();\r
+       // }\r
+       // return null;\r
+       // }\r
+\r
+       private void setAndCheck(ArchivedMedia archivedMedia, String houseId, String targetPath, boolean useNexioTarget, IJobEngine jobEngine) {\r
+               if (jobEngine == null) {\r
+                       logger.error(marker, "A folyamatkezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing JobEngine reference.");\r
+               }\r
+               manager = jobEngine.getItemManager();\r
+               if (manager == null) {\r
+                       logger.error(marker, "Az adatbáziskezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing ItemManager reference.");\r
+               }\r
+               if (archivedMedia == null) {\r
+                       logger.error(marker, "A folyamat 'mediaCubeMedia' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'mediaCubeMedia' input parameter missing.");\r
+               }\r
+               checkTargetPath(targetPath);\r
+               if (StringUtils.isBlank(houseId)) {\r
+                       logger.error(marker, "A folyamat 'houseId' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'houseId' input parameter missing.");\r
+               }\r
+               Store tsmStore = manager.getSystemStore(false);\r
+               if (tsmStore == null) {\r
+                       logger.error(marker, "A TSM rendszer beállítás nem elérhető.");\r
+                       throw new NullPointerException("System is not configured properly, missing TSM Store.");\r
+               }\r
+\r
+               tempSourceUri = manager.createStoreUri(RemoteStoreProtocol.LOCAL, targetPath);\r
+               if (tempSourceUri == null) {\r
+                       logger.error(marker, "A TSM rendszer beállítás paraméterei nem elérhetőek.");\r
+                       throw new NullPointerException("System is not configured properly, missing TSM StoreUri.");\r
+               }\r
+               tempTargetUri = createTargetUri(manager, targetPath);\r
+               // sourceFileName = getSourceFileName(archivedMedia, tsmStore);\r
+               if (sourceFileName == null) {\r
+                       logger.error(marker, "Adatbázis bejegyzés hiba, a visszatöltendő fájl neve nem található.");\r
+                       throw new NullPointerException("Database error, missing MediaFile 'relativePath'.");\r
+               }\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/MediaToolStep.java b/server/-product/production/OMAR/jobs/steps/MediaToolStep.java
new file mode 100644 (file)
index 0000000..ecc0ba2
--- /dev/null
@@ -0,0 +1,29 @@
+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.mediaarea.MediaArea;\r
+import user.jobengine.db.Media;\r
+\r
+public class MediaToolStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(ArchiveItem archiveItem, Media mediaCubeMedia) throws Exception {\r
+               Path filePath = Paths.get(archiveItem.getMediaFile());\r
+               MediaArea ma = new MediaArea(filePath);\r
+               ma.process();\r
+               long frames = ma.getFrameCount();\r
+               if (frames > 0) {\r
+                       logger.info("Media {} length is {}", filePath, frames);\r
+                       mediaCubeMedia.setLength(frames);\r
+                       getManager().modify(mediaCubeMedia);\r
+               }\r
+               return null;\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/MetadataTransformStep.java b/server/-product/production/OMAR/jobs/steps/MetadataTransformStep.java
new file mode 100644 (file)
index 0000000..c7bfb3c
--- /dev/null
@@ -0,0 +1,168 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\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.util.Date;\r
+import java.util.Set;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+\r
+import com.ibm.nosql.json.api.BasicDBList;\r
+\r
+import user.jobengine.db.Item;\r
+import user.jobengine.db.ItemManager;\r
+import user.jobengine.db.ItemType;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+/**\r
+ * Itemek es mediak krealasa az ArchiveItem objektum alapjan.\r
+ *\r
+ * @author robi\r
+ */\r
+public class MetadataTransformStep extends JobStep {\r
+       private static final String CONFLICT = ".CONFLICT";\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String ITEM_MANAGER_IS_NULL = "ItemManager is null";\r
+       public static final String DEFAULT_MEDIATYPE = "Generic";\r
+       private ItemManager itemManager;\r
+\r
+       private Marker marker;;\r
+\r
+       private void addTags(ArchiveItem archiveItem, Media mediaCubeMedia) {\r
+               BasicDBList tags = archiveItem.getTags();\r
+               if (tags != null) {\r
+                       for (Object tag : tags) {\r
+\r
+                               try {\r
+                                       String tagText = String.valueOf(tag);\r
+                                       itemManager.addMediaTag(tagText, mediaCubeMedia.getId());\r
+                                       System.out.println();\r
+\r
+                               } catch (Exception e) {\r
+                                       logger.catching(e);\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       private void checkDuplicates(ArchiveItem archiveItem, String sourceFileName) throws Exception {\r
+               if (itemManager.isMediaFileExists(sourceFileName)) {\r
+                       try {\r
+                               Path sourcePath = Paths.get(archiveItem.getMediaFile());\r
+                               Path parent = sourcePath.getParent();\r
+                               Path conflictPath = Paths.get(parent.toString(), CONFLICT);\r
+                               File folder = conflictPath.toFile();\r
+                               if (!folder.exists() || !folder.isDirectory()) {\r
+                                       Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxrwxrwx");\r
+                                       FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);\r
+                                       try {\r
+                                               Files.createDirectories(conflictPath, attr);\r
+                                       } catch (Exception e) {\r
+                                               try {\r
+                                                       Files.createDirectory(conflictPath);\r
+                                               } catch (Exception e1) {\r
+                                                       logger.catching(e);\r
+                                                       throw e;\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               Files.move(sourcePath, Paths.get(conflictPath.toString(), sourceFileName + (new Date()).getTime()));\r
+                       } catch (Exception e1) {\r
+                               logger.catching(e1);\r
+                               logger.error(marker, "Hiba az '{}' állomány mappába másolásakor. A rendszer üzenete: {}", CONFLICT, e1.getMessage());\r
+                       }\r
+                       throw new Exception("Az '" + sourceFileName + "' állomány már megtalálható az archívumban, archiválása nem lehetséges.");\r
+               }\r
+       }\r
+\r
+       private Item createItem(ArchiveItem archiveItem) {\r
+               Item mediaCubeItem = getExistingItem(archiveItem.getItemHouseId(), archiveItem.getItemTitle());\r
+               if (mediaCubeItem == null)\r
+                       mediaCubeItem = itemManager.createItem(DEFAULT_MEDIATYPE, archiveItem.getItemTitle(), archiveItem.getItemDescription(),\r
+                                       archiveItem.getItemHouseId());\r
+               return mediaCubeItem;\r
+       }\r
+\r
+       private Media createMedia(ArchiveItem archiveItem, Item mediaCubeItem, String mediaType) {\r
+               Media mediaCubeMedia;\r
+               mediaCubeMedia = itemManager.createMedia(mediaType, archiveItem.getMediaTitle(), archiveItem.getMediaDescription(), archiveItem.getMediaHouseId());\r
+               mediaCubeMedia.setLength(archiveItem.getDuration());\r
+               mediaCubeItem.appendMedia(mediaCubeMedia);\r
+\r
+               return mediaCubeMedia;\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(ArchiveItem archiveItem, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               marker = jobRuntime.getSessionMarker();\r
+               Media mediaCubeMedia = null;\r
+               itemManager = (ItemManager) jobEngine.getItemManager();\r
+               if (itemManager == null)\r
+                       throw new NullPointerException(ITEM_MANAGER_IS_NULL);\r
+               try {\r
+                       File sourceMediaFile = new File(archiveItem.getMediaFile());\r
+                       String sourceFileName = sourceMediaFile.getName();\r
+                       checkDuplicates(archiveItem, sourceFileName);\r
+                       Item mediaCubeItem = createItem(archiveItem);\r
+                       jobRuntime.incrementProgress(50);\r
+                       String mediaType = getCreateType(archiveItem);\r
+                       mediaCubeMedia = createMedia(archiveItem, mediaCubeItem, mediaType);\r
+                       //ha itemid 0 akkor merge, egyebkent media insert\r
+\r
+                       if (mediaCubeItem.getId() == 0)\r
+                               itemManager.mergeItemStructure(mediaCubeItem);\r
+                       else {\r
+                               mediaCubeMedia.setItemId(mediaCubeItem.getId());\r
+                               mediaCubeMedia.add();\r
+                       }\r
+\r
+                       addTags(archiveItem, mediaCubeMedia);\r
+\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       String fileName = new File(archiveItem.getMediaFile()).getName();\r
+                       logger.error(marker, "Az '{}' állomány nem archiválható, mert a metaadat transzformáció sikertelen. A rendszer üzenete: {}", fileName,\r
+                                       e.getMessage());\r
+                       if (!archiveItem.removeCatchedFile())\r
+                               logger.error(marker, "Az '{}' állomány .catched jelző állománya nem törölhető.", fileName);\r
+                       throw e;\r
+               } finally {\r
+                       jobRuntime.incrementProgress(100);\r
+               }\r
+               return new Object[] { mediaCubeMedia };\r
+       }\r
+\r
+       private String getCreateType(ArchiveItem archiveItem) {\r
+               String mediaType = archiveItem.getMediaType();\r
+               if (mediaType == null || mediaType.length() == 0)\r
+                       mediaType = DEFAULT_MEDIATYPE;\r
+               else {\r
+                       ItemType mediaItemType = itemManager.getItemType(mediaType);\r
+                       if (mediaItemType == null)\r
+                               itemManager.createItemType(mediaType, mediaType).add();\r
+               }\r
+               return mediaType;\r
+       }\r
+\r
+       private Item getExistingItem(String itemHouseId, String itemTitle) {\r
+               Item[] result = new Item[] { null };\r
+               String sql = String.format("select id from item where houseid='%s' and title='%s'", itemHouseId, itemTitle);\r
+               itemManager.executeQuery(sql, rs -> {\r
+                       long id = rs.getLong("id");\r
+                       result[0] = itemManager.getItem(id);\r
+                       return true;\r
+               }, null);\r
+               return result[0];\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/MetadataUpdater.java b/server/-product/production/OMAR/jobs/steps/MetadataUpdater.java
new file mode 100644 (file)
index 0000000..a28abfa
--- /dev/null
@@ -0,0 +1,297 @@
+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.sql.ResultSet;\r
+import java.text.SimpleDateFormat;\r
+import java.util.Date;\r
+import java.util.LinkedHashSet;\r
+import java.util.List;\r
+import java.util.Set;\r
+\r
+import org.apache.commons.io.FileUtils;\r
+import org.apache.ibatis.jdbc.SQL;\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 com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.server.steps.shared.MetadataTypeDetector;\r
+import user.mediacube.metadata.interfaces.IMetadata;\r
+import user.mediacube.metadata.interfaces.IMetadataProvider;\r
+import user.mediacube.metadata.interfaces.IMetadataProviderFactory;\r
+import user.mediacube.metadata.interfaces.MetadataProviderType;\r
+import user.mediacube.metadata.interfaces.MetadataType;\r
+import user.mediacube.metadata.interfaces.PlanAirMetadataListOptions;\r
+\r
+public class MetadataUpdater extends JobStep {\r
+       private static final String EMPTY = "";\r
+       private static final String DOT = ".";\r
+       private static final Logger logger = LogManager.getLogger(MetadataUpdater.class);\r
+       private Marker csvMarker = MarkerManager.getMarker("METADATA-UPDATER-CSV");\r
+\r
+       private static final String ITEM_TITLE = "itemTitle";\r
+       private static final String ITEM_HOUSEID = "itemHouseId";\r
+       private static final String MEDIA_HOUSEID = "mediaHouseId";\r
+       private static final String MEDIA_TITLE = "mediaTitle";\r
+       private static final String MEDIA_DESCRIPTION = "mediaDescription";\r
+       private static final String MEDIA_TYPE = "mediaType";\r
+       private static final String MEDIAFILE_HOUSEID = "mediaFileHouseId";\r
+\r
+       private SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");\r
+       private Set<String> includeList;\r
+\r
+       public String createQuery() {\r
+               SQL isql = new SQL();\r
+               isql.SELECT("id");\r
+               isql.FROM("STORE");\r
+               isql.WHERE("name = 'TSM'");\r
+\r
+               SQL sql = new SQL();\r
+               sql.SELECT("i.id          AS itemId");\r
+               sql.SELECT("i.houseid     AS itemHouseId");\r
+               sql.SELECT("i.title       AS itemTitle");\r
+               //sql.SELECT("i.description AS itemdescription");\r
+               sql.SELECT("m.id          AS mediaId");\r
+               sql.SELECT("m.houseid     AS mediaHouseId");\r
+               sql.SELECT("m.title       AS mediaTitle");\r
+               sql.SELECT("m.description AS mediaDescription");\r
+               sql.SELECT("mf.houseid    AS mediaFileHouseId");\r
+               sql.FROM("MEDIAFILE mf");\r
+               sql.LEFT_OUTER_JOIN("MEDIA m ON (m.id = mf.mediaid)");\r
+               sql.LEFT_OUTER_JOIN("ITEM i ON (i.id = m.itemid)");\r
+               sql.WHERE(String.format("mf.storeid = (%s)", isql.toString()));\r
+               return sql.toString();\r
+       }\r
+\r
+       public String createCountQuery() {\r
+               SQL sql = new SQL();\r
+               sql.SELECT("COUNT(*) as count");\r
+               sql.FROM("MEDIA");\r
+               return sql.toString();\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute() throws Exception {\r
+               try {\r
+\r
+                       String location = "/opt/test-mediacube/file_list_original.txt";\r
+                       includeList = loadIncludeList(location);\r
+\r
+                       IItemManager manager = getManager();\r
+                       String sql = createCountQuery();\r
+                       long[] count = new long[1];\r
+                       count[0] = 0;\r
+                       manager.executeQuery(sql, rs -> {\r
+                               try {\r
+                                       count[0] = rs.getLong("count");\r
+                                       logger.info(getSessionMarker(), "Processing rs");\r
+                               } catch (Exception e) {\r
+                                       logger.error(getMarker(), e.getMessage());\r
+                               }\r
+                               return true;\r
+                       }, null);\r
+\r
+                       logger.info(getSessionMarker(), "Count {}", count[0]);\r
+\r
+                       long[] current = new long[1];\r
+                       current[0] = 0;\r
+\r
+                       logger.info(csvMarker,\r
+                                       "Date;Name;isProgramById;includeContains;isMetadataEquals;itemHouseId;P itemHouseId;itemHouseIdEquals;itemTitle;P itemTitle;itemTitleEquals;mediaHouseId;"\r
+                                                       + "P mediaHouseId;mediaHouseIdEquals;mediaTitle;P mediaTitle;mediaTitleEquals;"\r
+                                                       + "mediaDescription;P mediaDescription;mediaDescriptionEquals;");\r
+\r
+                       sql = createQuery();\r
+                       manager.executeQuery(sql, rs -> {\r
+\r
+                               if (getJobRuntime().isWaitingCancel())\r
+                                       return false;\r
+\r
+                               current[0]++;\r
+                               processRecord(rs);\r
+                               int p = ((int) current[0] * 100) / ((int) count[0]);\r
+                               setProgress(p);\r
+                               return true;\r
+                       }, null);\r
+\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+               }\r
+               return null;\r
+       }\r
+\r
+       private String set(String value) {\r
+               return value == null ? EMPTY : value;\r
+       }\r
+\r
+       private void processRecord(ResultSet rs) {\r
+               try {\r
+                       String itemHouseId = set(rs.getString(ITEM_HOUSEID));\r
+                       String itemTitle = set(rs.getString(ITEM_TITLE));\r
+                       String mediaHouseId = set(rs.getString(MEDIA_HOUSEID));\r
+                       String mediaTitle = set(rs.getString(MEDIA_TITLE));\r
+                       String mediaDescription = set(rs.getString(MEDIA_DESCRIPTION));\r
+                       String pitemHouseId = EMPTY;\r
+                       String pitemTitle = EMPTY;\r
+                       String pmediaHouseId = EMPTY;\r
+                       String pmediaTitle = EMPTY;\r
+                       String pmediaDescription = EMPTY;\r
+\r
+                       String fileName = rs.getString(MEDIAFILE_HOUSEID);\r
+                       String mediaFileHouseId = fileName;\r
+                       if (mediaFileHouseId.contains(DOT))\r
+                               mediaFileHouseId = mediaFileHouseId.substring(0, mediaFileHouseId.lastIndexOf(DOT));\r
+\r
+                       user.jobengine.server.steps.shared.MetadataType metadataType = MetadataTypeDetector\r
+                                       .GuessMetadataType(mediaFileHouseId);\r
+\r
+                       boolean isProgramById = false;\r
+                       boolean includeContains = includeList.contains(fileName);\r
+                       boolean itemHouseIdEquals = false;\r
+                       boolean itemTitleEquals = false;\r
+                       boolean mediaHouseIdEquals = false;\r
+                       boolean mediaTitleEquals = false;\r
+                       boolean mediaDescriptionEquals = false;\r
+\r
+                       logger.info(getMarker(), "{} {}", mediaFileHouseId, metadataType);\r
+                       ArchiveItem archiveItem = getPlanAirMetadata(mediaFileHouseId);\r
+                       if (archiveItem != null) {\r
+                               isProgramById = true;\r
+\r
+                               if (isProgramById) {\r
+\r
+                                       pitemHouseId = set(archiveItem.getItemHouseId());\r
+                                       itemHouseIdEquals = pitemHouseId.equals(itemHouseId);\r
+\r
+                                       pitemTitle = set(archiveItem.getItemTitle());\r
+                                       itemTitleEquals = pitemTitle.equals(itemTitle);\r
+\r
+                                       pmediaHouseId = set(archiveItem.getMediaHouseId());\r
+                                       mediaHouseIdEquals = pmediaHouseId.equals(mediaHouseId);\r
+\r
+                                       pmediaTitle = set(archiveItem.getMediaTitle());\r
+                                       mediaTitleEquals = pmediaTitle.equals(mediaTitle);\r
+\r
+                                       pmediaDescription = set(archiveItem.getMediaDescription());\r
+                                       mediaDescriptionEquals = pmediaDescription.equals(mediaDescription);\r
+\r
+                                       boolean isMetadataEquals = itemHouseIdEquals && itemTitleEquals && mediaHouseIdEquals\r
+                                                       && mediaTitleEquals && mediaDescriptionEquals;\r
+\r
+                                       Date now = new Date(System.currentTimeMillis());\r
+                                       logger.info(csvMarker, "{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};", D(now),\r
+                                                       fileName, YN(isProgramById), YN(includeContains), YN(isMetadataEquals), itemHouseId,\r
+                                                       pitemHouseId, itemHouseIdEquals, itemTitle, pitemTitle, itemTitleEquals, mediaHouseId,\r
+                                                       pmediaHouseId, mediaHouseIdEquals, mediaTitle, pmediaTitle, mediaTitleEquals,\r
+                                                       mediaDescription, pmediaDescription, mediaDescriptionEquals);\r
+\r
+                                       logger.info(getSessionMarker(), "Processed {} {}{}{}", fileName, YN(isProgramById),\r
+                                                       YN(includeContains), YN(isMetadataEquals));\r
+                               }\r
+                       }\r
+\r
+               } catch (\r
+\r
+               Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+               }\r
+\r
+       }\r
+\r
+       private ArchiveItem getPlanAirMetadata(String mediaHouseId) throws Exception {\r
+               PlanAirMetadataListOptions opt = new PlanAirMetadataListOptions();\r
+               opt.setSearch(mediaHouseId);\r
+               opt.setType(MetadataType.Material);\r
+\r
+               BasicDBObject json = null;\r
+               List<IMetadata> data = null;\r
+\r
+               IMetadataProviderFactory factory = getService(IMetadataProviderFactory.class);\r
+               if (factory == null)\r
+                       logger.info(getSessionMarker(), "IMetadataProviderFactory is null");\r
+\r
+               IMetadataProvider planairProvider = factory.getProvider(MetadataProviderType.PLANAIR);\r
+               if (planairProvider == null)\r
+                       logger.info(getSessionMarker(), "IMetadataProvider is null");\r
+\r
+               ArchiveItem result = null;\r
+               data = planairProvider.list(opt);\r
+               if (data.size() != 0)\r
+                       json = data.get(0).asJSON();\r
+               else {\r
+                       opt.setType(MetadataType.Promo);\r
+                       data = planairProvider.list(opt);\r
+                       if (data.size() != 0)\r
+                               json = data.get(0).asJSON();\r
+                       else {\r
+                               opt.setType(MetadataType.AD);\r
+                               data = planairProvider.list(opt);\r
+                               if (data.size() != 0)\r
+                                       json = data.get(0).asJSON();\r
+                       }\r
+               }\r
+               if (json != null) {\r
+                       result = new ArchiveItem();\r
+                       result.setItemHouseId(json.getString(ITEM_HOUSEID));\r
+                       result.setItemTitle(json.getString(ITEM_TITLE));\r
+                       result.setMediaHouseId(json.getString(MEDIA_HOUSEID));\r
+                       result.setMediaTitle(json.getString(MEDIA_TITLE));\r
+                       result.setMediaDescription(json.getString(MEDIA_DESCRIPTION));\r
+                       result.setMediaType(json.getString(MEDIA_TYPE));\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private char YN(boolean value) {\r
+               return value ? 'Y' : 'N';\r
+       }\r
+\r
+       private String D(Date value) {\r
+               return value == null ? EMPTY : df.format(value);\r
+       }\r
+\r
+       private Set<String> loadIncludeList(String location) throws IOException {\r
+               logger.info(getSessionMarker(), "Loading include list {}", location);\r
+               Set<String> result = new LinkedHashSet<>();\r
+\r
+               Path path = Paths.get(location);\r
+               List<String> lines = FileUtils.readLines(path.toFile());\r
+\r
+               String lastDir = null;\r
+               for (String line : lines) {\r
+                       line = line.trim();\r
+                       if (line.startsWith("Directory of")) {\r
+                               lastDir = line;\r
+                               lastDir = lastDir.replace("Directory of", EMPTY);\r
+                               lastDir = lastDir.replace("X:", EMPTY);\r
+                               lastDir = lastDir.replace("\\", "/");\r
+                               lastDir = lastDir.trim();\r
+                       }\r
+\r
+                       if (lastDir != null && lastDir.endsWith(".STATUS"))\r
+                               continue;\r
+\r
+                       if (line.startsWith("2") && line.length() > 39) {\r
+                               String file = line.substring(39).trim();\r
+\r
+                               if (file.equals(DOT) || file.equals(".."))\r
+                                       continue;\r
+\r
+                               String len = line.substring(21, 39).trim();\r
+                               if (len.length() != 0) {\r
+                                       String fullpath = "/mnt/POLC/FINISHED_SHOWS" + lastDir + "/" + file;\r
+                                       result.add(Paths.get(fullpath).getFileName().toString());\r
+                               }\r
+                       }\r
+\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/MoveJpegToIsilonStep.java b/server/-product/production/OMAR/jobs/steps/MoveJpegToIsilonStep.java
new file mode 100644 (file)
index 0000000..3dc75b5
--- /dev/null
@@ -0,0 +1,165 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\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.StandardCopyOption;\r
+import java.nio.file.attribute.BasicFileAttributes;\r
+import java.text.ParseException;\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
+import java.util.Date;\r
+import java.util.List;\r
+\r
+import org.apache.commons.io.FilenameUtils;\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.RemoteStoreProtocol;\r
+\r
+public class MoveJpegToIsilonStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(String sourceUri, String sourceProtocol, String sourceFolder, String targetUri,\r
+                       String targetProtocol, String targetFolder, String userName, String password, int port) throws Exception {\r
+               StoreUri sourceStoreUri = new StoreUri(sourceUri);\r
+               if (sourceFolder.endsWith("/")) {\r
+                       sourceFolder = sourceFolder.substring(0, sourceFolder.length() - 1);\r
+               }\r
+\r
+               List<String> foundItems = new ArrayList<>();\r
+               sourceStoreUri.setRootPath(sourceFolder);\r
+               sourceStoreUri.setPortNumber(port);\r
+               sourceStoreUri.setPassword(password);\r
+               sourceStoreUri.setUserName(userName);\r
+               sourceStoreUri.setProtocol(RemoteStoreProtocol.valueOf(sourceProtocol));\r
+\r
+               FileVisitor<Path> visitor = new SimpleFileVisitor<Path>() {\r
+                       String fileNamePattern = "yyyymmdd";\r
+                       SimpleDateFormat dateFormatter = new SimpleDateFormat(fileNamePattern);\r
+                       Date currentDate = new Date(); // initializes with the current date\r
+                       Date dateFromFileName;\r
+                       boolean isRootFolder = true;\r
+\r
+                       @Override\r
+                       public FileVisitResult preVisitDirectory(Path folder, BasicFileAttributes attrs) throws IOException {\r
+                               FileVisitResult result = null;\r
+                               boolean isDateParseable = true;\r
+\r
+                               if (folder != null) {\r
+                                       String splitter = File.separator.replace("\\", "\\\\");\r
+                                       String[] parentFolderSegments = folder.toString().split(splitter);\r
+\r
+                                       try {\r
+                                               dateFromFileName = dateFormatter.parse(parentFolderSegments[parentFolderSegments.length - 1]);\r
+\r
+                                               if (!(dateFromFileName.compareTo(currentDate) > 0)) {\r
+                                                       if (isRootFolder) {\r
+                                                               result = FileVisitResult.CONTINUE;\r
+                                                               isRootFolder = false;\r
+                                                       } else {\r
+                                                               result = FileVisitResult.SKIP_SUBTREE;\r
+                                                       }\r
+                                               } else {\r
+                                                       result = FileVisitResult.CONTINUE;\r
+                                               }\r
+                                       } catch (ParseException e) {\r
+                                               isDateParseable = false;\r
+                                               logger.info("Illegal argument to parse as date: {}",\r
+                                                               parentFolderSegments[parentFolderSegments.length - 1]);\r
+                                       } finally {\r
+                                               isRootFolder = false;\r
+                                               if (!isDateParseable) {\r
+                                                       result = FileVisitResult.CONTINUE;\r
+                                               }\r
+                                       }\r
+                               }\r
+                               return result;\r
+                       }\r
+\r
+                       @Override\r
+                       public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException {\r
+                               logger.info("path: {}", path.toString());\r
+                               try {\r
+                                       String fileExtension = FilenameUtils.getExtension(path.toString());\r
+\r
+                                       if (fileExtension.equals("jpg") || fileExtension.equals("jpeg")) {\r
+                                               foundItems.add(path.toString());\r
+                                               StoreUri targetStoreUri = getManager()\r
+                                                               .createStoreUri(RemoteStoreProtocol.valueOf(targetProtocol), targetUri);\r
+                                               targetStoreUri.setProtocol(RemoteStoreProtocol.valueOf(targetProtocol));\r
+                                               targetStoreUri.setRootPath(targetFolder);\r
+\r
+                                               copyFile(path, Paths.get(targetStoreUri.getRootPath()));\r
+                                       }\r
+                               } catch (Exception e) {\r
+                                       logger.info("Exception: {}", e.getStackTrace());\r
+                               }\r
+                               return FileVisitResult.CONTINUE;\r
+                       }\r
+\r
+                       @Override\r
+                       public FileVisitResult visitFileFailed(Path path, IOException exc) throws IOException {\r
+                               return FileVisitResult.CONTINUE;\r
+                       }\r
+               };\r
+\r
+               try {\r
+                       Files.walkFileTree(Paths.get(sourceStoreUri.getRootPath()), visitor);\r
+               } catch (IOException e) {\r
+                       logger.info("Error processing Paths.get(sourceStoreUri.getRootPath()) '{}'. System message: {}",\r
+                                       Paths.get(sourceStoreUri.getRootPath()), e.getStackTrace());\r
+                       logger.catching(e);\r
+                       throw e;\r
+               } catch (SecurityException se) {\r
+                       logger.info("SecurityException: {}", se.getStackTrace());\r
+               } finally {\r
+               }\r
+\r
+               return new Object[] { foundItems };\r
+       }\r
+\r
+       private void copyFile(Path sourceFullPath, Path targetRootPath) {\r
+               Path targetPath = Paths.get(targetRootPath.toString(), sourceFullPath.getFileName().toString());\r
+               logger.info(getMarker(), "Root {} exists {}", targetRootPath, Files.exists(targetRootPath));\r
+\r
+               if (Files.exists(targetPath)) {\r
+                       logger.info(getMarker(), "Skipping {}, target exists", targetPath);\r
+                       return;\r
+               }\r
+\r
+               logger.info(getMarker(), "Target {} synchronization required", targetPath);\r
+\r
+               try {\r
+                       Files.copy(sourceFullPath, targetPath, StandardCopyOption.REPLACE_EXISTING);\r
+               } catch (Exception e) {\r
+                       logger.error(getMarker(), "Error synchronize {} to {}. System message: {}", sourceFullPath, targetPath,\r
+                                       e.getMessage());\r
+               }\r
+       }\r
+\r
+       protected String getPathUntilCurrentFile(String rootFolder, Path fullPath) {\r
+               String tempRootfolder = "";\r
+               if (rootFolder.contains("/") && fullPath.toString().contains("\\")) {\r
+                       tempRootfolder = rootFolder.replace('/', '\\');\r
+                       if (!tempRootfolder.endsWith("\\")) {\r
+                               tempRootfolder = tempRootfolder.concat("\\");\r
+                       }\r
+               }\r
+               if (rootFolder.contains("\\") && fullPath.toString().contains("/")) {\r
+                       tempRootfolder = rootFolder.replace('\\', '/');\r
+                       if (!tempRootfolder.endsWith("/")) {\r
+                               tempRootfolder = tempRootfolder.concat("/");\r
+                       }\r
+               }\r
+\r
+               return fullPath.toString().replace(rootFolder, "").substring(1);\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/OutputPathAndNameSelectorStep.java b/server/-product/production/OMAR/jobs/steps/OutputPathAndNameSelectorStep.java
new file mode 100644 (file)
index 0000000..f0203ca
--- /dev/null
@@ -0,0 +1,154 @@
+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
+\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.Marker;\r
+\r
+import user.jobengine.db.ArchivedMedia;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+import user.jobengine.server.steps.shared.MetadataType;\r
+import user.jobengine.server.steps.shared.MetadataTypeDetector;\r
+\r
+public class OutputPathAndNameSelectorStep extends JobStep {\r
+\r
+       private static final String TARGETNAMEPATTERN = "-ARCH-%s";\r
+\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       private Marker marker;\r
+\r
+       private void check(String localRetrievePath, String materialOutputFolder, String promoOutputFolder, String advertisementOutputFolder,\r
+                       String octopusOutputFolder, String genericOutputFolder, String houseId, String targetPathType) {\r
+               if (StringUtils.isBlank(localRetrievePath)) {\r
+                       logger.error(marker, "A folyamat 'localRetrievePath' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'localRetrievePath' input parameter missing.");\r
+               }\r
+               if (StringUtils.isBlank(materialOutputFolder)) {\r
+                       logger.error(marker, "A folyamat 'materialOutputFolder' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'materialOutputFolder' input parameter missing.");\r
+               }\r
+               if (StringUtils.isBlank(promoOutputFolder)) {\r
+                       logger.error(marker, "A folyamat 'promoOutputFolder' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'promoOutputFolder' input parameter missing.");\r
+               }\r
+               if (StringUtils.isBlank(advertisementOutputFolder)) {\r
+                       logger.error(marker, "A folyamat 'advertisementOutputFolder' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'advertisementOutputFolder' input parameter missing.");\r
+               }\r
+               if (StringUtils.isBlank(octopusOutputFolder)) {\r
+                       logger.error(marker, "A folyamat 'octopusOutputFolder' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'octopusOutputFolder' input parameter missing.");\r
+               }\r
+               if (StringUtils.isBlank(genericOutputFolder)) {\r
+                       logger.error(marker, "A folyamat 'genericOutputFolder' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'genericOutputFolder' input parameter missing.");\r
+               }\r
+               if (StringUtils.isBlank(houseId)) {\r
+                       logger.error(marker, "A folyamat 'houseId' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'houseId' input parameter missing.");\r
+               }\r
+               if (StringUtils.isBlank(targetPathType)) {\r
+                       logger.error(marker, "A folyamat 'targetPathType' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'targetPathType' input parameter missing.");\r
+               }\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(String localRetrievePath, String materialOutputFolder, String promoOutputFolder, String advertisementOutputFolder,\r
+                       String octopusOutputFolder, String genericOutputFolder, String onlineOutputFolder, String houseId, String targetPathType,\r
+                       ArchivedMedia archivedMedia, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               marker = jobRuntime.getSessionMarker();\r
+               check(localRetrievePath, materialOutputFolder, promoOutputFolder, advertisementOutputFolder, octopusOutputFolder, genericOutputFolder, houseId,\r
+                               targetPathType);\r
+               Object[] result = null;\r
+               switch (Integer.parseInt(targetPathType)) {\r
+               case 0:\r
+                       String outputFolder = getFolderById(materialOutputFolder, promoOutputFolder, advertisementOutputFolder, octopusOutputFolder, genericOutputFolder,\r
+                                       houseId, archivedMedia);\r
+                       result = localTargetInit(localRetrievePath, outputFolder, houseId, jobRuntime);\r
+                       break;\r
+               case 1:\r
+                       result = localTargetInit(localRetrievePath, onlineOutputFolder, houseId, jobRuntime);\r
+                       break;\r
+               case 2:\r
+\r
+                       if (archivedMedia.getTcIn() != null && archivedMedia.getTcOut() != null)\r
+                               result = new Object[] { genericOutputFolder, houseId, true };\r
+                       else\r
+                               result = new Object[] { null, houseId, true };\r
+                       break;\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private String getFolderById(String materialOutputFolder, String promoOutputFolder, String advertisementOutputFolder, String octopusOutputFolder,\r
+                       String genericOutputFolder, String houseId, ArchivedMedia archivedMedia) throws Exception {\r
+               String id = houseId.toUpperCase();\r
+               MetadataType mdType = MetadataTypeDetector.GuessMetadataType(id);\r
+               String result = null;\r
+\r
+               //a groovy nem latja enumnak, hanem az objektum tulajdonsaganak\r
+               switch (mdType.toString()) {\r
+               case "OctopusPlaceholder":\r
+               case "OctopusStory":\r
+                       result = octopusOutputFolder;\r
+                       break;\r
+               case "TrafficMaterial":\r
+                       result = materialOutputFolder;\r
+                       break;\r
+               case "TrafficPromo":\r
+                       result = promoOutputFolder;\r
+                       break;\r
+               case "TrafficAD":\r
+                       result = advertisementOutputFolder;\r
+                       break;\r
+               case "Generic":\r
+                       result = genericOutputFolder;\r
+                       break;\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private String getPossiblePath(String id, Path targetPath) throws IOException {\r
+               String[] result = new String[] { targetPath.toString() };\r
+               FileVisitor<Path> matcherVisitor = new SimpleFileVisitor<Path>() {\r
+                       @Override\r
+                       public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {\r
+                               String dirName = dir.getFileName().toString();\r
+                               if (dirName.startsWith(id + "-") || dirName.equals(id)) {\r
+                                       result[0] = dir.toString();\r
+                                       return FileVisitResult.TERMINATE;\r
+                               }\r
+                               return FileVisitResult.CONTINUE;\r
+                       }\r
+               };\r
+               Files.walkFileTree(targetPath.getParent(), matcherVisitor);\r
+               return result[0];\r
+       }\r
+\r
+       private Object[] localTargetInit(String localRetrievePath, String outputFolder, String houseId, IJobRuntime jobRuntime) throws IOException {\r
+               String id = houseId.toUpperCase();\r
+               String targetPath = getPossiblePath(id, Paths.get(localRetrievePath, outputFolder, id)).toString();\r
+               String targetNamePattern = houseId + TARGETNAMEPATTERN;\r
+               try {\r
+                       EscortFiles.ensureUNCFolder(Paths.get(targetPath));\r
+               } catch (Exception e) {\r
+                       logger.error(jobRuntime.getSessionMarker(), "A cél mappa '{}' nem létezik és nem hozható létre. A rendszer hibaüzenete: {}", targetPath,\r
+                                       e.getMessage());\r
+                       throw e;\r
+               }\r
+               return new Object[] { targetPath, targetNamePattern, false };\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/PrepareMediaRestoreStep.java b/server/-product/production/OMAR/jobs/steps/PrepareMediaRestoreStep.java
new file mode 100644 (file)
index 0000000..3708aa3
--- /dev/null
@@ -0,0 +1,37 @@
+package user.jobengine.server.steps;\r
+\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.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
+\r
+public class PrepareMediaRestoreStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(Media media, String tempStoreName, String tempStoreProtocol) throws Exception {\r
+               StoreUri mediaStoreUri = null;\r
+               List<MediaFile> mediaFiles = media.getMediaFiles();\r
+               if (mediaFiles.size() > 1)\r
+                       throw new Exception("Media " + media.getId() + " already has proxy");\r
+               for (MediaFile mediaFile : mediaFiles) {\r
+                       Store store = mediaFile.getStore();\r
+                       if (store.isSystem() && !store.isLowres()) {\r
+                               mediaStoreUri = store.getStoreUri(RemoteStoreProtocol.TSM);\r
+                               if (mediaStoreUri != null)\r
+                                       break;\r
+                       }\r
+               }\r
+\r
+               StoreUri tempStoreUri = getManager().getStoreUri(tempStoreName, Enum.valueOf(RemoteStoreProtocol.class, tempStoreProtocol));\r
+\r
+               return new Object[] { mediaStoreUri, tempStoreUri, media.getMediaFileRealName() };\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/PrepareRemoteTranscodeStep.java b/server/-product/production/OMAR/jobs/steps/PrepareRemoteTranscodeStep.java
new file mode 100644 (file)
index 0000000..5116b1e
--- /dev/null
@@ -0,0 +1,48 @@
+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 com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+import user.commons.configuration.SystemConfiguration;\r
+\r
+public class PrepareRemoteTranscodeStep extends JobStep {\r
+       static private final Logger logger = LogManager.getLogger();\r
+       private static boolean RANDOMIZE_ARCHIVES = SystemConfiguration.getInstance().value("tsm.randomize-archives",\r
+                       false);\r
+\r
+       @StepEntry\r
+       public Object[] execute(String profileName, String fileName) throws Exception {\r
+               String hiResRoot = "m:/";\r
+               String lowResRoot = "m:/lowres";\r
+\r
+               Path inputPath = Paths.get(hiResRoot, fileName);\r
+\r
+               String realFileName = fileName;\r
+\r
+               if (RANDOMIZE_ARCHIVES)\r
+                       realFileName = realFileName.substring(9);\r
+\r
+               String outFileName = realFileName.substring(0, realFileName.lastIndexOf(".")) + ".mp4";\r
+\r
+               Path relativeOutputPath = null;\r
+               if (realFileName.length() > 2)\r
+                       relativeOutputPath = Paths.get(realFileName.substring(0, 1), realFileName.substring(1, 2),\r
+                                       realFileName.substring(2, 3), outFileName);\r
+               else\r
+                       relativeOutputPath = Paths.get("0", outFileName);\r
+\r
+               BasicDBObject parameters = new BasicDBObject();\r
+               parameters.put("profile", profileName);\r
+               parameters.put("input", inputPath.toString());\r
+               parameters.put("output", Paths.get(lowResRoot, relativeOutputPath.toString()).toString());\r
+\r
+               logger.info("Prepared for remote transode {}", parameters);\r
+               return new Object[] { parameters, relativeOutputPath.toString() };\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/QueryMissingProxyMediaStep.java b/server/-product/production/OMAR/jobs/steps/QueryMissingProxyMediaStep.java
new file mode 100644 (file)
index 0000000..7df2bed
--- /dev/null
@@ -0,0 +1,74 @@
+package user.jobengine.server.steps;\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
+import com.ibm.nosql.json.api.DB;\r
+import com.ibm.nosql.json.api.DBCollection;\r
+\r
+import user.commons.log4j2.marker.MediaCubeUndoMarker;\r
+import user.commons.nosql.NoSQLUtils;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
+\r
+public class QueryMissingProxyMediaStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute() throws Exception {\r
+               setDescription("Looking for missing proxy");\r
+               DB db = NoSQLUtils.getNoSQLDB();\r
+               DBCollection collection = db.getCollection("missing_lowres");\r
+               Media media = getFirstUntranscodedMedia(collection);\r
+\r
+               if (media == null) {\r
+                       logger.info(new MediaCubeUndoMarker(getSessionMarker().getSessionID()), "Nincs feldolgozandó hiány.");\r
+                       cancel();\r
+                       return null;\r
+               }\r
+\r
+               String name = media.getMediaFileRealName();\r
+               collection.save(new BasicDBObject("name", name));\r
+               logger.info(getSessionMarker(), "Processing mediaID: {}", media.getId());\r
+               return new Object[] { media };\r
+       }\r
+\r
+       private Media getFirstUntranscodedMedia(DBCollection collection) {\r
+               Media[] result = new Media[] { null };\r
+               //MV\r
+               String query = "SELECT mediaid FROM VW_MISSING_PROXY_IDS WHERE HOUSEID like 'M%' or HOUSEID like 'P%' or HOUSEID like 'R%' ORDER BY modified DESC";\r
+\r
+               //HTV\r
+               //String query = "SELECT mediaid FROM VW_MISSING_PROXY_IDS";\r
+               IItemManager manager = getManager();\r
+               manager.executeQuery(query, rs -> {\r
+                       try {\r
+                               long mediaId = rs.getLong(1);\r
+                               Media media = manager.getMedia(mediaId);\r
+                               //a nevgeneralas miatt az eredeti MediaFilesName nem jo, a pontos nev kell nekunk\r
+                               String name = media.getMediaFileRealName();\r
+                               //logger.info(getSessionMarker(), "Checking {}", name);\r
+                               long existing = collection.find(new BasicDBObject("name", name)).count();\r
+                               if (existing > 0) {\r
+                                       //logger.info(getSessionMarker(), "{} is on missing_lowres list", name);\r
+                                       return true;\r
+                               }\r
+                               // 210617 proxy keszites tiltasa\r
+                               MediaFile mf = manager.getSystemMediaFile(media);\r
+                               if (mf.isDisableProxy()) {\r
+                                       //logger.info(getSessionMarker(), "Proxy disabled {}", name);\r
+                                       \r
+                                       return true;\r
+                               }\r
+\r
+                               result[0] = media;\r
+                       } catch (Exception e) {\r
+                               logger.error(e);\r
+                       }\r
+                       return false;\r
+               }, null);\r
+               return result[0];\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/RemoteJobStep.java b/server/-product/production/OMAR/jobs/steps/RemoteJobStep.java
new file mode 100644 (file)
index 0000000..d4900d7
--- /dev/null
@@ -0,0 +1,36 @@
+package user.jobengine.server.steps;\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
+import user.jobengine.server.steps.shared.MediaCubeClient;\r
+\r
+public class RemoteJobStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(String remoteServer, String template, String name, BasicDBObject remoteJobParameters) throws Exception {\r
+               setDescription("Executing on {}, template {}, profile {}", remoteServer, template, remoteJobParameters.getString("profile"));\r
+               MediaCubeClient mc = new MediaCubeClient(remoteServer);\r
+               long jobId = mc.startjob(template, name, remoteJobParameters);\r
+               logger.info(getMarker(), "Started {} on server {}", jobId, remoteServer);\r
+               while (true) {\r
+                       BasicDBObject status = mc.getStatus(jobId);\r
+                       if (status != null)\r
+                               setProgress(status.getInt("progress"));\r
+\r
+                       Thread.sleep(2000);\r
+\r
+                       String jobStatus = status.getString("status");\r
+                       if ("SUSPENDED".equals(jobStatus))\r
+                               throw new Exception(status.getString("description"));\r
+\r
+                       if ("FINISHED".equals(jobStatus))\r
+                               break;\r
+               }\r
+\r
+               return null;\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/SafeDeleteRecursiveStep.java b/server/-product/production/OMAR/jobs/steps/SafeDeleteRecursiveStep.java
new file mode 100644 (file)
index 0000000..238aae2
--- /dev/null
@@ -0,0 +1,416 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.nio.file.DirectoryStream;\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.attribute.BasicFileAttributes;\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.Collections;\r
+import java.util.Date;\r
+import java.util.LinkedHashSet;\r
+import java.util.List;\r
+import java.util.Set;\r
+\r
+import org.apache.commons.io.FileUtils;\r
+import org.apache.commons.io.FilenameUtils;\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
+import user.commons.IEntityBase;\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.mediatool.MediaInfo;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Item;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.db.MediaFileDAO;\r
+import user.jobengine.db.Store;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+import user.mediacube.metadata.interfaces.IMetadata;\r
+import user.mediacube.metadata.interfaces.IMetadataListOptions;\r
+import user.mediacube.metadata.interfaces.IMetadataProvider;\r
+import user.mediacube.metadata.interfaces.IMetadataProviderFactory;\r
+import user.mediacube.metadata.interfaces.MetadataProviderType;\r
+import user.mediacube.metadata.interfaces.MetadataType;\r
+import user.mediacube.metadata.interfaces.PlanAirMetadataListOptions;\r
+\r
+public class SafeDeleteRecursiveStep extends JobStep implements FileVisitor<Path> {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String ITEM_TITLE = "itemTitle";\r
+       private static final String ITEM_HOUSEID = "itemHouseId";\r
+       private static final String MEDIA_HOUSEID = "mediaHouseId";\r
+       private static final String MEDIA_TITLE = "mediaTitle";\r
+       private static final String MEDIA_DESCRIPTION = "mediaDescription";\r
+       private static final String MEDIA_TYPE = "mediaType";\r
+       private static final String KILLDATEEXT = ".killdate";\r
+       private SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");\r
+\r
+       private List<String> skipPathNames = Arrays.asList("!ARCHIVALAS_ALATT", EscortFiles.STATUSFOLDER,\r
+                       EscortFiles.CONFLICTFOLDER);\r
+       private Set<String> includeList;\r
+\r
+       private boolean canReadMediaInfo(Path mediaFilePath) {\r
+               boolean result = false;\r
+               try {\r
+                       MediaInfo mi = new MediaInfo(mediaFilePath);\r
+                       mi.process();\r
+                       result = true;\r
+               } catch (Exception e) {\r
+                       logger.warn(getSessionMarker(), e.getMessage());\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private boolean checkArchiveItem(ArchiveItem archiveItem, Item item, Media media) {\r
+               if (archiveItem == null)\r
+                       return false;\r
+\r
+               String itemHouseId = archiveItem.getItemHouseId() == null ? "" : archiveItem.getItemHouseId();\r
+               if (!itemHouseId.equals(item.getHouseId())) {\r
+                       logger.error(getSessionMarker(), "ItemHouseId");\r
+                       return false;\r
+               }\r
+\r
+               String itemTitle = archiveItem.getItemTitle() == null ? "" : archiveItem.getItemTitle();\r
+               if (!itemTitle.equals(item.getTitle())) {\r
+                       logger.error(getSessionMarker(), "ItemTitle");\r
+                       return false;\r
+               }\r
+               String mediaHouseId = archiveItem.getMediaHouseId() == null ? "" : archiveItem.getMediaHouseId();\r
+               if (!mediaHouseId.equals(media.getHouseId())) {\r
+                       logger.error(getSessionMarker(), "MediaHouseId");\r
+                       return false;\r
+               }\r
+               String mediaTitle = archiveItem.getMediaTitle() == null ? "" : archiveItem.getMediaTitle();\r
+               if (!mediaTitle.equals(media.getTitle())) {\r
+                       logger.error(getSessionMarker(), "MediaTitle");\r
+                       return false;\r
+               }\r
+\r
+               String mediaDescription = archiveItem.getMediaDescription() == null ? "" : archiveItem.getMediaDescription();\r
+               String storedMediaDescription = media.getDescription() == null ? "" : media.getDescription();\r
+               if (!mediaDescription.equals(storedMediaDescription)) {\r
+                       logger.error(getSessionMarker(), "MediaDescription");\r
+                       return false;\r
+               }\r
+\r
+               return true;\r
+       }\r
+\r
+       private ArchiveItem createArchiveItem(Path filePath) throws Exception {\r
+               ArchiveItem result = null;\r
+\r
+               String fileName = filePath.getFileName().toString();\r
+               String mediaHouseId = FilenameUtils.removeExtension(fileName);\r
+               try {\r
+                       result = getPlanAirMetadata(mediaHouseId);\r
+\r
+                       if (result != null)\r
+                               result.setMediaFile(filePath.toString());\r
+\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), "PlanAir metadata error", e);\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(String sourcePath) throws Exception {\r
+               logger.info(getSessionMarker(), "Starting in {}", sourcePath);\r
+               logger.info(getSessionMarker(), "{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};", "Napló időbélyeg",\r
+                               "Neve", "Elérése", "Mérete", "Létrehozva", "Módosítva", "Archiválva (MC)", "Archiválva (TSM)",\r
+                               "Méret (TSM)", ".catched", ".killdate", ".nomd", "Archivált (MC)", "Archivált (TSM)",\r
+                               "Metaadat egyezés", "Méret egyezés", "Törölhető", "Kezelendő");\r
+\r
+               try {\r
+                       String location = "/opt/test-mediacube/file_list_original.txt";\r
+                       includeList = loadIncludeList(location);\r
+                       Files.walkFileTree(Paths.get(sourcePath), this);\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), "Az '{}' mappa elérése sikertelen. A rendszer hibaüzenete: {}", sourcePath,\r
+                                       e.getMessage());\r
+               }\r
+               return null;\r
+       }\r
+\r
+       private ArchiveItem getPlanAirMetadata(String mediaHouseId) throws Exception {\r
+               PlanAirMetadataListOptions opt = new PlanAirMetadataListOptions();\r
+               opt.setSearch(mediaHouseId);\r
+               opt.setType(MetadataType.Material);\r
+\r
+               BasicDBObject json = null;\r
+               List<IMetadata> data = null;\r
+\r
+               IMetadataProviderFactory factory = getService(IMetadataProviderFactory.class);\r
+               if (factory == null)\r
+                       logger.info(getSessionMarker(), "IMetadataProviderFactory is null");\r
+\r
+               IMetadataProvider planairProvider = factory.getProvider(MetadataProviderType.PLANAIR);\r
+               if (planairProvider == null)\r
+                       logger.info(getSessionMarker(), "IMetadataProvider is null");\r
+\r
+               ArchiveItem result = null;\r
+               data = planairProvider.list(opt);\r
+               if (data.size() != 0)\r
+                       json = data.get(0).asJSON();\r
+               else {\r
+                       opt.setType(MetadataType.Promo);\r
+                       data = planairProvider.list(opt);\r
+                       if (data.size() != 0)\r
+                               json = data.get(0).asJSON();\r
+                       else {\r
+                               opt.setType(MetadataType.AD);\r
+                               data = planairProvider.list(opt);\r
+                               if (data.size() != 0)\r
+                                       json = data.get(0).asJSON();\r
+                       }\r
+               }\r
+               if (json != null) {\r
+                       result = new ArchiveItem();\r
+                       result.setItemHouseId(json.getString(ITEM_HOUSEID));\r
+                       result.setItemTitle(json.getString(ITEM_TITLE));\r
+                       result.setMediaHouseId(json.getString(MEDIA_HOUSEID));\r
+                       result.setMediaTitle(json.getString(MEDIA_TITLE));\r
+                       result.setMediaDescription(json.getString(MEDIA_DESCRIPTION));\r
+                       result.setMediaType(json.getString(MEDIA_TYPE));\r
+               }\r
+               return result;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult postVisitDirectory(Path paramT, IOException paramIOException) throws IOException {\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes paramBasicFileAttributes)\r
+                       throws IOException {\r
+               Path dirName = dir.getFileName();\r
+\r
+               if (skipPathNames.contains(dirName.toString())) {\r
+                       //logger.info(getSessionMarker(), "PreVisit skip {}", dir);\r
+                       return FileVisitResult.SKIP_SUBTREE;\r
+               } //else\r
+                       //logger.info(getSessionMarker(), "PreVisit {}", dir);\r
+\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+\r
+       private boolean processPathItem(Path mediaPath) throws Exception {\r
+               if (getJobRuntime().isWaitingCancel()) {\r
+                       cancel();\r
+                       return false;\r
+               }\r
+\r
+               BasicFileAttributes attr = Files.readAttributes(mediaPath, BasicFileAttributes.class);\r
+               File mediaFSFile = mediaPath.toFile();\r
+               String fileName = mediaPath.getFileName().toString();\r
+\r
+               if (mediaFSFile.isDirectory())\r
+                       return true;\r
+\r
+               if (fileName.startsWith(".") || fileName.endsWith(".nomd"))\r
+                       return true;\r
+\r
+               Path nomdFile = Paths.get(mediaPath.toString() + ".nomd");\r
+               ArchiveItem archiveItem = createArchiveItem(mediaPath);\r
+               List<Path> killDateFiles = getKillDateFiles(mediaPath);\r
+               MediaFile mediaFile = getMediaFile(fileName);\r
+\r
+               long size = mediaFSFile.length();\r
+               Date lastModifiedDate = new Date(attr.lastModifiedTime().toMillis());\r
+               //Date lastAccesDate = new Date(attr.lastAccessTime().toMillis());\r
+               Date createDate = new Date(attr.creationTime().toMillis());\r
+               boolean catchedExists = EscortFiles.isMediaCatched(mediaPath);\r
+               boolean noMDExists = Files.exists(nomdFile);\r
+               boolean killdateExists = killDateFiles.size() > 0;\r
+               //boolean mediaInfoAvailable = canReadMediaInfo(mediaPath);\r
+               boolean mcArchived = mediaFile != null;\r
+               boolean metadataEquals = false;\r
+               boolean tsmArchived = false;\r
+               boolean sizeEquals = false;\r
+               Date mcArchivedDate = null;\r
+               long tsmSize = 0;\r
+               Date tsmBackupDate = null;\r
+               boolean includeContains = includeList.contains(mediaPath.toString());\r
+\r
+               if (mcArchived) {\r
+                       //metadata\r
+                       Media media = getManager().getMedia(mediaFile.getMediaId());\r
+                       mcArchivedDate = media.getCreated();\r
+                       Item item = getManager().getItem(media.getItemId());\r
+                       metadataEquals = checkArchiveItem(archiveItem, item, media);\r
+\r
+                       //tsm\r
+                       String tsmFileName = mediaFile.getRelativePath();\r
+                       RemoteFile tsmFile = getTSMFile(tsmFileName);\r
+                       tsmArchived = tsmFile != null;\r
+                       if (tsmArchived) {\r
+                               tsmSize = tsmFile.getSize();\r
+                               tsmBackupDate = getTSMBackupDate(tsmFileName);\r
+                               sizeEquals = tsmSize == size;\r
+                       }\r
+               }\r
+\r
+               boolean canDelete = !noMDExists && catchedExists && killdateExists && mcArchived && tsmArchived\r
+                               && metadataEquals;\r
+               Date now = new Date(System.currentTimeMillis());\r
+               logger.info(getSessionMarker(), "{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};", D(now), fileName,\r
+                               mediaPath.getParent(), size, D(createDate), D(lastModifiedDate), D(mcArchivedDate), D(tsmBackupDate),\r
+                               tsmSize, YN(catchedExists), YN(killdateExists), YN(noMDExists), YN(mcArchived), YN(tsmArchived),\r
+                               YN(metadataEquals), YN(sizeEquals), YN(canDelete), YN(includeContains));\r
+\r
+               return true;\r
+       }\r
+\r
+       private Date getTSMBackupDate(String tsmFileName) throws Exception {\r
+               Date result = null;\r
+               IMetadataProviderFactory factory = getService(IMetadataProviderFactory.class);\r
+               if (factory == null)\r
+                       return null;\r
+               IMetadataProvider provider = factory.getProvider(MetadataProviderType.TSM);\r
+               if (provider == null)\r
+                       return null;\r
+\r
+               IMetadataListOptions opt = provider.createOptions(new BasicDBObject("fileName", tsmFileName));\r
+\r
+               List<IMetadata> tsmContents = provider.list(opt);\r
+               if (tsmContents != null && tsmContents.size() > 0) {\r
+\r
+                       for (IMetadata md : tsmContents) {\r
+                               Date backupDate = md.asJSON().getDate("backupDate");\r
+                               if (result == null)\r
+                                       result = backupDate;\r
+                               else {\r
+                                       if (backupDate.after(result))\r
+                                               result = backupDate;\r
+                               }\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private char YN(boolean value) {\r
+               return value ? 'Y' : 'N';\r
+       }\r
+\r
+       private String D(Date value) {\r
+               return value == null ? "" : df.format(value);\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult visitFile(Path filePath, BasicFileAttributes paramBasicFileAttributes) throws IOException {\r
+               //logger.info(getSessionMarker(), "Will checked {}", filePath);\r
+               try {\r
+                       if (!processPathItem(filePath))\r
+                               return FileVisitResult.TERMINATE;\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+               }\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult visitFileFailed(Path filePath, IOException paramIOException) throws IOException {\r
+               logger.info("Error archive {}", filePath);\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+\r
+       private List<Path> getKillDateFiles(Path filePath) {\r
+               String killDateFilePattern = String.format("%s.*%s", filePath.getFileName().toString(), KILLDATEEXT);\r
+               List<Path> result = new ArrayList<>();\r
+               Path statusPath = null;\r
+               try {\r
+                       statusPath = Paths.get(filePath.getParent().toString(), EscortFiles.STATUSFOLDER);\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       return null;\r
+               }\r
+               File statusPathFile = statusPath.toFile();\r
+               if (statusPathFile.exists() && statusPathFile.isDirectory()) {\r
+                       try (DirectoryStream<Path> stream = Files.newDirectoryStream(statusPath, killDateFilePattern)) {\r
+                               stream.forEach(p -> result.add(p));\r
+                       } catch (Exception e) {\r
+                               logger.catching(e);\r
+                       }\r
+               }\r
+               Collections.sort(result);\r
+               return result;\r
+       }\r
+\r
+       MediaFile getMediaFile(String fileName) {\r
+               MediaFile result = null;\r
+               MediaFileDAO mfDAO = (MediaFileDAO) getManager().getBaseDAO(MediaFile.class);\r
+               List<IEntityBase> mfList = mfDAO.getByHouseId(fileName);\r
+               if (mfList != null && mfList.size() == 1)\r
+                       result = (MediaFile) mfList.get(0);\r
+               return result;\r
+       }\r
+\r
+       RemoteFile getTSMFile(String mcFileName) {\r
+               RemoteFile result = null;\r
+               Store tsmStore = getManager().getSystemStore(false);\r
+               StoreUri tsmStoreUri = tsmStore.getSourceStoreUri(RemoteStoreProtocol.TSM);\r
+               try {\r
+                       result = tsmStoreUri.getRemoteFile(mcFileName);\r
+               } catch (Exception e) {\r
+                       logger.error(e);\r
+               } finally {\r
+                       tsmStoreUri.cleanUp();\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private Set<String> loadIncludeList(String location) throws IOException {\r
+               Set<String> result = new LinkedHashSet<>();\r
+\r
+               Path path = Paths.get(location);\r
+               List<String> lines = FileUtils.readLines(path.toFile());\r
+\r
+               String lastDir = null;\r
+               for (String line : lines) {\r
+                       line = line.trim();\r
+                       if (line.startsWith("Directory of")) {\r
+                               lastDir = line;\r
+                               lastDir = lastDir.replace("Directory of", "");\r
+                               lastDir = lastDir.replace("X:", "");\r
+                               lastDir = lastDir.replace("\\", "/");\r
+                               lastDir = lastDir.trim();\r
+                               //                              if (!lastDir.endsWith(".STATUS"))\r
+                               //                                      System.out.println(">> " + lastDir);\r
+                       }\r
+\r
+                       if (lastDir != null && lastDir.endsWith(".STATUS"))\r
+                               continue;\r
+\r
+                       if (line.startsWith("2") && line.length() > 39) {\r
+                               String file = line.substring(39).trim();\r
+\r
+                               if (file.equals(".") || file.equals(".."))\r
+                                       continue;\r
+\r
+                               String len = line.substring(21, 39).trim();\r
+                               if (len.length() != 0) {\r
+                                       String fullpath = "/mnt/POLC/FINISHED_SHOWS" + lastDir + "/" + file;\r
+                                       //System.out.println("/mnt/POLC/FINISHED_SHOWS" + lastDir + "/" + file + " : " + len);\r
+                                       result.add(fullpath);\r
+                               }\r
+                       }\r
+\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/SaveMediaProxy.java b/server/-product/production/OMAR/jobs/steps/SaveMediaProxy.java
new file mode 100644 (file)
index 0000000..3f0f667
--- /dev/null
@@ -0,0 +1,22 @@
+package user.jobengine.server.steps;\r
+\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.db.Store;\r
+\r
+public class SaveMediaProxy extends JobStep {\r
+\r
+       @StepEntry\r
+       public Object[] execute(Media media, String proxyRelativePath) throws Exception {\r
+               IItemManager manager = getManager();\r
+               Store store = manager.getCurrentLowresStore();\r
+               MediaFile mediaFile = new MediaFile();\r
+               mediaFile.setMedia(media);\r
+               mediaFile.setStore(store);\r
+               mediaFile.setFileType(manager.getFileType("Low-res"));\r
+               mediaFile.setRelativePath(proxyRelativePath);\r
+               manager.add(mediaFile);\r
+               return null;\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/TSMBackupStep.java b/server/-product/production/OMAR/jobs/steps/TSMBackupStep.java
new file mode 100644 (file)
index 0000000..b526f16
--- /dev/null
@@ -0,0 +1,239 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.sql.Timestamp;\r
+import java.util.Date;\r
+import java.util.List;\r
+\r
+import org.apache.commons.lang.RandomStringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+import org.apache.logging.log4j.message.Message;\r
+import org.apache.logging.log4j.message.ParameterizedMessage;\r
+\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.configuration.SystemConfiguration;\r
+import user.commons.mediatool.Timecode;\r
+import user.commons.mediatool.Timecode.Type;\r
+import user.commons.remotestore.IProgressEventListener;\r
+import user.commons.remotestore.IStatusEventListener;\r
+import user.commons.remotestore.ProgressEvent;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.commons.remotestore.StatusEvent;\r
+import user.jobengine.db.FileType;\r
+import user.jobengine.db.IItemManager;\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.JobEngineException;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+import user.jobengine.server.steps.shared.ItemManagerExtensions;\r
+\r
+public class TSMBackupStep extends JobStep {\r
+       private static final String MXFEXT = ".MXF";\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static boolean RANDOMIZE_ARCHIVES = SystemConfiguration.getInstance().value("tsm.randomize-archives");\r
+       private IItemManager manager;\r
+       private File sourceMediaFile;\r
+       private Store tsmStore;\r
+       private StoreUri targetUri;\r
+       private FileType fileType;\r
+       private Marker marker;\r
+\r
+       @StepEntry\r
+       public Object[] execute(ArchiveItem archiveItem, Media mediaCubeMedia, int killDateDays) throws Exception {\r
+               marker = getSessionMarker();\r
+\r
+               File sourceMediaFile = new File(archiveItem.getMediaFile());\r
+               String sourceFileName = sourceMediaFile.getName();\r
+               long fileSize = sourceMediaFile.length();\r
+\r
+               try {\r
+                       Timecode timecode = new Timecode(mediaCubeMedia.getLength(), Type.PAL);\r
+                       String details = String.format("%s (%s, %d bytes)", sourceFileName, timecode.toString(), fileSize);\r
+                       logger.info(marker, details);\r
+                       getJobRuntime().setDescription(details);\r
+               } catch (Exception e) {\r
+                       String details = String.format("%s (%d bytes)", sourceFileName, fileSize);\r
+                       getJobRuntime().setDescription(details);\r
+               }\r
+               Timecode timecode = new Timecode(mediaCubeMedia.getLength(), Type.PAL);\r
+               String details = String.format("%s (%s, %d bytes)", sourceFileName, timecode.toString(), fileSize);\r
+               getJobRuntime().setDescription(details);\r
+               try {\r
+\r
+                       setAndCheck(archiveItem, mediaCubeMedia, getEngine());\r
+\r
+                       // TODO mxf helyett az osszes kiterjesztest!!!!!\r
+                       // A dupla ellenorzes a napon beluli ismetlesek miatt kell\r
+                       long existingMediaId = archiveItem.getExistingMediaId();\r
+\r
+                       if (fileSize == 0 && existingMediaId == 0) {\r
+                               existingMediaId = ItemManagerExtensions.getExistingRundownMedia(manager,\r
+                                               sourceFileName.replace(MXFEXT, ""));\r
+                               if (existingMediaId == 0)\r
+                                       existingMediaId = -1;\r
+                       }\r
+\r
+                       if (existingMediaId == 0)\r
+                               existingMediaId = ItemManagerExtensions.getExistingRundownMedia(manager,\r
+                                               sourceFileName.replace(MXFEXT, ""));\r
+                       String targetFileName;\r
+                       if (RANDOMIZE_ARCHIVES) {\r
+                               // a-z, A-Z, 0-9. For example: WRMcpIk7, s57JwCVA\r
+                               // veletlenszeru neveket adunk!\r
+                               targetFileName = String.format("%s-%s", RandomStringUtils.randomAlphanumeric(8), sourceFileName);\r
+                       } else\r
+                               targetFileName = sourceFileName;\r
+\r
+                       if (existingMediaId == 0) {\r
+                               StoreUri sourceUri = manager.createStoreUri(RemoteStoreProtocol.LOCAL,\r
+                                               sourceMediaFile.getParent().toString());\r
+\r
+                               final IJobRuntime runtime = getJobRuntime();\r
+                               sourceUri.addProgressListener(new IProgressEventListener() {\r
+                                       @Override\r
+                                       public void progressChanged(ProgressEvent evt) {\r
+                                               runtime.incrementProgress(evt.getProgress());\r
+                                       }\r
+                               });\r
+                               sourceUri.addStatusListener(new IStatusEventListener() {\r
+                                       @Override\r
+                                       public void statusChanged(StatusEvent evt) {\r
+                                               evt.setCancel(!canContinue());\r
+                                       }\r
+                               });\r
+\r
+                               RemoteFile remoteFile = sourceUri.transferFrom(targetUri, sourceFileName, targetFileName);\r
+                       }\r
+\r
+                       if (existingMediaId > 0)\r
+                               logger.info(marker, "Az '{}' TSM mentése nem szükséges, mert már megtalálható az archívumban.",\r
+                                               sourceFileName);\r
+\r
+                       // Fel kell szabadítani, hogy a kovetkezo archivalaskor is nekifusson\r
+                       if (existingMediaId == -1) {\r
+                               logger.info(marker,\r
+                                               "Az '{}' mentése jelenleg nem lehetséges, mert a szükséges metaadat még nem található meg az archívumban.",\r
+                                               sourceFileName);\r
+                               if (!archiveItem.removeCatchedFile())\r
+                                       logger.error(marker,\r
+                                                       "Az '{}' állomány .catched jelző állománya nem törölhető. Az újabb archiválási kísérlethez annak kézi eltávolítása szükséges!",\r
+                                                       sourceMediaFile.getName());\r
+                               mediaCubeMedia.remove();\r
+                       } else {\r
+                               saveMetadata(mediaCubeMedia, sourceMediaFile, targetFileName, existingMediaId, fileSize,\r
+                                               archiveItem.isDisableProxy());\r
+                               logger.info(marker, "Az '{}' archiválása sikeres.", sourceFileName);\r
+                               if (killDateDays != 0)\r
+                                       EscortFiles.createUNCKillDate(sourceMediaFile.getParent(), sourceFileName, killDateDays, marker);\r
+                       }\r
+\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       Message m = new ParameterizedMessage("Az '{}' állomány archiválása sikertelen. A rendszer hibaüzenete: {}",\r
+                                       details, e.getMessage());\r
+                       logger.error(marker, m);\r
+                       if (!archiveItem.removeCatchedFile())\r
+                               logger.error(marker,\r
+                                               "Az '{}' állomány .catched jelző állománya nem törölhető. Az újabb archiválási kísérlethez annak kézi eltávolítása szükséges!",\r
+                                               sourceMediaFile.getName());\r
+                       throw new Exception(m.getFormattedMessage());\r
+               }\r
+               return null;\r
+       }\r
+\r
+       private void saveMetadata(Media mediaCubeMedia, File sourceFile, String targetFileName, long existingMediaId,\r
+                       long fileSize, boolean disableProxy) {\r
+\r
+               if (existingMediaId == 0) {\r
+                       MediaFile mf = manager.createMediaFile(targetFileName, fileType, tsmStore, mediaCubeMedia);\r
+                       mf.setHouseId(sourceFile.getName());\r
+                       mf.setFileSize(fileSize);\r
+                       // 210617 proxy keszites tiltasa\r
+                       mf.setDisableProxy(disableProxy);\r
+                       mf.add();\r
+               } else {\r
+                       Media existingMedia = manager.getMedia(existingMediaId);\r
+                       List<MediaFile> mediaFiles = existingMedia.getMediaFiles();\r
+                       if (mediaFiles != null) {\r
+                               for (MediaFile mf : mediaFiles) {\r
+                                       mf.setPersister(manager);\r
+                                       mf.setId(0);\r
+                                       mf.setMedia(mediaCubeMedia);\r
+                                       // mivel itt masolat keszul, nem allitunk at semmit\r
+//                                     mf.setFileSize(fileSize);\r
+//                                     mf.setDisableProxy(disableProxy);\r
+                                       mf.add();\r
+                               }\r
+                       }\r
+               }\r
+               mediaCubeMedia.setPersister(manager);\r
+\r
+               // 210614 megis maradjon az aktualis idopont\r
+               mediaCubeMedia.setArchived(new Timestamp(new Date().getTime()));\r
+\r
+               /*\r
+               try {\r
+                       BasicFileAttributes attr = Files.readAttributes(sourceFile.toPath(), BasicFileAttributes.class);\r
+                       mediaCubeMedia.setArchived(new Timestamp(attr.creationTime().toMillis()));\r
+               } catch (IOException e) {\r
+                       logger.catching(e);\r
+               }\r
+                */\r
+               mediaCubeMedia.modify();\r
+       }\r
+\r
+       private void setAndCheck(ArchiveItem archiveItem, Media mediaCubeMedia, IJobEngine jobEngine)\r
+                       throws JobEngineException, IOException {\r
+               if (jobEngine == null) {\r
+                       logger.error(marker, "Az folyamatkezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing JobEngine reference.");\r
+               }\r
+               manager = jobEngine.getItemManager();\r
+               if (manager == null) {\r
+                       logger.error(marker, "Az adatbáziskezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing ItemManager reference.");\r
+               }\r
+               if (archiveItem == null) {\r
+                       logger.error(marker, "A folyamat 'archiveItem' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, missing 'archiveItem' input parameter.");\r
+               }\r
+               sourceMediaFile = new File(archiveItem.getMediaFile());\r
+               if (sourceMediaFile == null) {\r
+                       logger.error(marker, "A folyamat 'archiveItem' bemeneti paraméter 'mediaFile' értéke üres.");\r
+                       throw new NullPointerException(\r
+                                       "System is not configured properly, missing 'mediaFile' value in 'archiveItem' input parameter.");\r
+               }\r
+               if (!sourceMediaFile.exists()) {\r
+                       logger.error(marker, "A(z) {} állomány nem létezik vagy nem érhető el.", sourceMediaFile.getName());\r
+                       throw new IOException(String.format("Input file {} does not exist or unreachable.", sourceMediaFile.getName()));\r
+               }\r
+               tsmStore = manager.getSystemStore(false);\r
+               if (tsmStore == null) {\r
+                       logger.error(marker, "A TSM rendszer beállítás nem elérhető.");\r
+                       throw new NullPointerException("System is not configured properly, missing TSM Store.");\r
+               }\r
+               targetUri = tsmStore.getSourceStoreUri(RemoteStoreProtocol.TSM);\r
+               if (targetUri == null) {\r
+                       logger.error(marker, "A TSM rendszer beállítás paraméterei nem elérhetőek.");\r
+                       throw new NullPointerException("System is not configured properly, missing TSM StoreUri.");\r
+               }\r
+               fileType = manager.getFileType("High-res");\r
+               if (fileType == null) {\r
+                       logger.error(marker, "Adatbázis bejegyzés hiba, a 'High-res' FileType nem található.");\r
+                       throw new NullPointerException("System is not configured properly, missing 'High-res' FileType.");\r
+               }\r
+               if (mediaCubeMedia == null) {\r
+                       logger.error(marker, "A folyamat 'mediaCubeMedia' bemeneti paramétere üres.");\r
+                       throw new NullPointerException(\r
+                                       "System is not configured properly, 'mediaCubeMedia' input parameter missing.");\r
+               }\r
+\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/TSMExtendedRetrieveStep.java b/server/-product/production/OMAR/jobs/steps/TSMExtendedRetrieveStep.java
new file mode 100644 (file)
index 0000000..fd22234
--- /dev/null
@@ -0,0 +1,95 @@
+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.StoreUri;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.ArchivedMedia;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+/*\r
+import user.jobengine.server.steps.EscortFiles;\r
+*/\r
+\r
+public class TSMExtendedRetrieveStep extends TSMRestoreStep {\r
+       private static String NEXIO_HOST = System.getProperty("nexio.host");\r
+       //      private static String NEXIO_HOST = SystemConfiguration.getInstance().value("services.nexio.host");\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       private boolean useNexioTarget;\r
+       private int nexioPort;\r
+       private String nexioUserName, nexioPassword;\r
+       private String nexioAgency;\r
+\r
+       @Override\r
+       protected void afterRestore(StoreUri targetUri, String targetPath, int killDateDays, String targetFileName) throws Exception {\r
+               if (useNexioTarget) {\r
+                       EscortFiles.setNEXIOKillDate(killDateDays, targetFileName, nexioAgency, targetUri);\r
+               } else {\r
+                       super.afterRestore(targetUri, targetPath, killDateDays, targetFileName);\r
+               }\r
+       }\r
+\r
+       @Override\r
+       protected void beforeRestore(StoreUri targetURI, String targetName) throws Exception {\r
+               String newTargetName = targetName;\r
+               if (targetName.contains("."))\r
+                       newTargetName = targetName.substring(0, targetName.lastIndexOf('.'));\r
+               if (useNexioTarget)\r
+                       if (targetURI.fileExists(newTargetName + ".mxf"))\r
+                               throw new Exception(String.format("%s-The newly created file name is existed.", getClass().getSimpleName()));\r
+       }\r
+\r
+       @Override\r
+       protected void checkTargetPath(String targetPath) {\r
+               if (!useNexioTarget)\r
+                       super.checkTargetPath(targetPath);\r
+       }\r
+\r
+       @Override\r
+       protected StoreUri createTargetUri(IItemManager manager, String targetPath) throws NullPointerException {\r
+               StoreUri result = null;\r
+               logger.info(getSessionMarker(), "Create target uri {}", targetPath);\r
+               if (useNexioTarget) {\r
+                       if (NEXIO_HOST == null) {\r
+                               throw new NullPointerException("Missing system property on 'nexio.host' name");\r
+                       }\r
+                       result = manager.createStoreUri(RemoteStoreProtocol.FTP, NEXIO_HOST);\r
+                       result.setPortNumber(nexioPort);\r
+                       result.setUserName(nexioUserName);\r
+                       result.setPassword(nexioPassword);\r
+               } else\r
+                       result = super.createTargetUri(manager, targetPath);\r
+               return result;\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(ArchivedMedia archivedMedia, String targetPath, String targetNamePattern, String successRecipient, int killDateDays,\r
+                       String localRetrievePath, String globalRetrievePath, boolean useNexioTarget, String nexioAgency, int nexioPort, String nexioUserName,\r
+                       String nexioPassword, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               this.useNexioTarget = useNexioTarget;\r
+               this.nexioAgency = nexioAgency;\r
+               this.nexioPort = nexioPort;\r
+               this.nexioUserName = nexioUserName;\r
+               this.nexioPassword = nexioPassword;\r
+               if (nexioPort == 0) {\r
+                       throw new NullPointerException("System is not configured properly, 'nexioPort' input parameter missing.");\r
+               }\r
+               if (nexioUserName == null) {\r
+                       throw new NullPointerException("System is not configured properly, 'nexioUserName' input parameter missing.");\r
+               }\r
+               if (nexioPassword == null) {\r
+                       throw new NullPointerException("System is not configured properly, 'nexioPassword' input parameter missing.");\r
+               }\r
+               if (nexioAgency == null) {\r
+                       throw new NullPointerException("System is not configured properly, 'nexioAgency' input parameter missing.");\r
+               }\r
+\r
+               return super.execute(archivedMedia.getMedia(), targetPath, targetNamePattern, successRecipient, killDateDays, localRetrievePath, globalRetrievePath,\r
+                               jobEngine, jobRuntime);\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/TSMRestoreStep.java b/server/-product/production/OMAR/jobs/steps/TSMRestoreStep.java
new file mode 100644 (file)
index 0000000..26d8607
--- /dev/null
@@ -0,0 +1,187 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.Paths;\r
+import java.text.Normalizer;\r
+import java.util.List;\r
+import java.util.regex.Pattern;\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.Marker;\r
+import org.apache.logging.log4j.message.Message;\r
+\r
+import user.commons.LogUtils;\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.mediatool.Timecode;\r
+import user.commons.mediatool.Timecode.Type;\r
+import user.commons.remotestore.IProgressEventListener;\r
+import user.commons.remotestore.IStatusEventListener;\r
+import user.commons.remotestore.ProgressEvent;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.commons.remotestore.StatusEvent;\r
+import user.jobengine.db.IItemManager;\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 TSMRestoreStep extends JobStep {\r
+       private static final String DOT = ".";\r
+       public static final Pattern DIACRITICS_AND_FRIENDS = Pattern.compile("[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+");\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private IItemManager manager;\r
+       private StoreUri targetUri;\r
+       private StoreUri sourceUri;\r
+       private String sourceFileName;\r
+       private Marker marker;\r
+\r
+       protected void afterRestore(StoreUri targetUri, String targetPath, int killDateDays, String targetFileName) throws IOException, Exception {\r
+               if (killDateDays != 0)\r
+                       EscortFiles.createUNCKillDate(targetPath, targetFileName, killDateDays, marker);\r
+       }\r
+\r
+       protected void beforeRestore(StoreUri targetURI, String targetFileName) throws Exception {\r
+       }\r
+\r
+       protected void checkTargetPath(String targetPath) {\r
+               if (StringUtils.isBlank(targetPath)) {\r
+                       logger.error(marker, "A folyamat 'targetPath' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'targetPath' input parameter missing.");\r
+               }\r
+       }\r
+\r
+       protected StoreUri createTargetUri(IItemManager manager, String targetPath) {\r
+               return manager.createStoreUri(RemoteStoreProtocol.LOCAL, targetPath);\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(Media mediaCubeMedia, String targetPath, String targetNamePattern, String successRecipient, int killDateDays,\r
+                       String localRetrievePath, String globalRetrievePath, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               marker = jobRuntime.getSessionMarker();\r
+               setAndCheck(mediaCubeMedia, targetPath, targetNamePattern, localRetrievePath, globalRetrievePath, jobEngine);\r
+               String targetFileName = String.format(targetNamePattern, sourceFileName);\r
+               //20210129\r
+               //targetFileName = getMaximizedFileName(mediaCubeMedia, targetFileName, 120);\r
+\r
+               Timecode timecode = new Timecode(mediaCubeMedia.getLength(), Type.PAL);\r
+               try {\r
+                       String details = String.format("%s (%s)", sourceFileName, timecode.toString());\r
+                       jobRuntime.setDescription(details);\r
+                       beforeRestore(targetUri, targetNamePattern);\r
+                       final IJobRuntime runtime = jobRuntime;\r
+                       sourceUri.addProgressListener(new IProgressEventListener() {\r
+                               @Override\r
+                               public void progressChanged(ProgressEvent evt) {\r
+                                       runtime.incrementProgress(evt.getProgress());\r
+                               }\r
+                       });\r
+                       sourceUri.addStatusListener(new IStatusEventListener() {\r
+                               @Override\r
+                               public void statusChanged(StatusEvent evt) {\r
+                                       evt.setCancel(!canContinue());\r
+                               }\r
+                       });\r
+                       RemoteFile result = sourceUri.transferFrom(targetUri, sourceFileName, targetFileName);\r
+\r
+                       String globalTargetPath = Paths.get(targetPath, targetFileName)\r
+                                       .getParent()\r
+                                       .toString()\r
+                                       .replace(Paths.get(localRetrievePath).toString(), globalRetrievePath);\r
+\r
+                       logger.info(marker,\r
+                                       "Az '{}' állomány visszatöltése sikeres volt '{}' néven. A célmappa a <a href='{}' target='_blank'>ide kattintva</a> nyitható meg.",\r
+                                       sourceFileName, targetFileName, globalTargetPath);\r
+                       afterRestore(targetUri, targetPath, killDateDays, targetFileName);\r
+\r
+               } catch (Exception e) {\r
+                       Message msg = LogUtils.format("Az '{}' állomány visszatöltése sikertelen. A rendszer hibaüzenete: {}", sourceFileName, e.getMessage());\r
+                       logger.error(marker, msg);\r
+                       // logger.error(jobRuntime.marker, msg);\r
+                       logger.catching(e);\r
+                       throw e;\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       private String getMaximizedFileName(Media mediaCubeMedia, String targetFileName, int limit) {\r
+               String name = targetFileName;\r
+               String extension = "";\r
+               if (name.contains(DOT)) {\r
+                       extension = DOT + name.substring(name.lastIndexOf(DOT) + 1);\r
+                       name = name.substring(0, name.lastIndexOf(DOT));\r
+               }\r
+               String typeName = Normalizer.normalize(mediaCubeMedia.getItemType().getName(), Normalizer.Form.NFD);\r
+               typeName = DIACRITICS_AND_FRIENDS.matcher(typeName).replaceAll("");\r
+               typeName = typeName.replace(" ", "_");\r
+\r
+               int allowedSize = limit - typeName.length() - 1 - extension.length();\r
+               if (name.length() > allowedSize)\r
+                       name = name.substring(0, allowedSize);\r
+\r
+               return String.format("%s_%s%s", name, typeName, extension);\r
+       }\r
+\r
+       private String getSourceFileName(Media mediaCubeMedia, Store store) {\r
+               List<MediaFile> mediaFiles = mediaCubeMedia.getMediaFiles();\r
+               if (mediaFiles == null)\r
+                       return null;\r
+               for (MediaFile mediaFile : mediaFiles) {\r
+                       if (mediaFile.getStore().getId() == store.getId())\r
+                               return mediaFile.getRelativePath();\r
+               }\r
+               return null;\r
+       }\r
+\r
+       private void setAndCheck(Media mediaCubeMedia, String targetPath, String targetNamePattern, String localRetrievePath, String globalRetrievePath,\r
+                       IJobEngine jobEngine) {\r
+               if (jobEngine == null) {\r
+                       logger.error(marker, "Az folyamatkezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing JobEngine reference.");\r
+               }\r
+               manager = jobEngine.getItemManager();\r
+               if (manager == null) {\r
+                       logger.error(marker, "Az adatbáziskezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing ItemManager reference.");\r
+               }\r
+               if (mediaCubeMedia == null) {\r
+                       logger.error(marker, "A folyamat 'mediaCubeMedia' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'mediaCubeMedia' input parameter missing.");\r
+               }\r
+               checkTargetPath(targetPath);\r
+               if (StringUtils.isBlank(targetNamePattern)) {\r
+                       logger.error(marker, "A folyamat 'targetNamePattern' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'targetNamePattern' input parameter missing.");\r
+               }\r
+               Store tsmStore = manager.getSystemStore(false);\r
+               if (tsmStore == null) {\r
+                       logger.error(marker, "A TSM rendszer beállítás nem elérhető.");\r
+                       throw new NullPointerException("System is not configured properly, missing TSM Store.");\r
+               }\r
+               sourceUri = tsmStore.getSourceStoreUri(RemoteStoreProtocol.TSM);\r
+               if (sourceUri == null) {\r
+                       logger.error(marker, "A TSM rendszer beállítás paraméterei nem elérhetőek.");\r
+                       throw new NullPointerException("System is not configured properly, missing TSM StoreUri.");\r
+               }\r
+               targetUri = createTargetUri(manager, targetPath);\r
+               sourceFileName = getSourceFileName(mediaCubeMedia, tsmStore);\r
+               if (sourceFileName == null) {\r
+                       logger.error(marker, "Adatbázis bejegyzés hiba, a visszatöltendő fájl neve nem található.");\r
+                       throw new NullPointerException("Database error, missing MediaFile 'relativePath'.");\r
+               }\r
+\r
+               if (StringUtils.isBlank(localRetrievePath)) {\r
+                       logger.error(marker, "A folyamat 'localRetrievePath' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'localRetrievePath' input parameter missing.");\r
+               }\r
+               if (StringUtils.isBlank(globalRetrievePath)) {\r
+                       logger.error(marker, "A folyamat 'globalRetrievePath' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'globalRetrievePath' input parameter missing.");\r
+               }\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/TSMSimpleRestoreStep.java b/server/-product/production/OMAR/jobs/steps/TSMSimpleRestoreStep.java
new file mode 100644 (file)
index 0000000..ba63212
--- /dev/null
@@ -0,0 +1,57 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Files;\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
+import user.commons.mediatool.Timecode;\r
+import user.commons.mediatool.Timecode.Type;\r
+import user.commons.remotestore.IProgressEventListener;\r
+import user.commons.remotestore.IStatusEventListener;\r
+import user.commons.remotestore.ProgressEvent;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.commons.remotestore.StatusEvent;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.db.Store;\r
+\r
+public class TSMSimpleRestoreStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(long mediaId, String targetPath) throws Exception {\r
+               String fileName = null;\r
+               try {\r
+                       Media media = getManager().getMedia(mediaId);\r
+                       MediaFile mediaFile = getManager().getSystemMediaFile(media);\r
+                       fileName = mediaFile.getRelativePath();\r
+                       Timecode timecode = new Timecode(media.getLength(), Type.PAL);\r
+                       getJobRuntime().setDescription(String.format("%s (%s)", fileName, timecode.toString()));\r
+                       Store tsmStore = getManager().getSystemStore(false);\r
+                       StoreUri sourceStoreUri = getManager().getStoreUri(tsmStore.getName(), RemoteStoreProtocol.TSM);\r
+                       sourceStoreUri.addProgressListener(new IProgressEventListener() {\r
+                               @Override\r
+                               public void progressChanged(ProgressEvent evt) {\r
+                                       setProgress(evt.getProgress());\r
+                               }\r
+                       });\r
+                       sourceStoreUri.addStatusListener(new IStatusEventListener() {\r
+                               @Override\r
+                               public void statusChanged(StatusEvent evt) {\r
+                                       evt.setCancel(!canContinue());\r
+                               }\r
+                       });\r
+                       StoreUri targetStoreUri = getManager().createStoreUri(RemoteStoreProtocol.LOCAL, targetPath);\r
+                       sourceStoreUri.transferFrom(targetStoreUri, fileName, fileName + ".part");\r
+                       Files.move(Paths.get(targetPath, fileName + ".part"), Paths.get(targetPath, fileName));\r
+               } catch (Exception e) {\r
+                       logger.error("Az '{}' állomány visszatöltése sikertelen. A rendszer üzenete: {}", fileName, e.getMessage());\r
+                       throw e;\r
+               }\r
+\r
+               return null;\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/TestForkCancelableStep.java b/server/-product/production/OMAR/jobs/steps/TestForkCancelableStep.java
new file mode 100644 (file)
index 0000000..c1b49f7
--- /dev/null
@@ -0,0 +1,35 @@
+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 = "fake-concurrent.xml";\r
+       private static final String CHILD_TEMPLATE = "cancelable.xml";\r
+       private static final Logger logger = LogManager.getLogger();\r
+       int count = 3;\r
+\r
+       @StepEntry\r
+       public Object[] execute(IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               for (int i = 0; i < count; i++) {\r
+                       IJobRuntime rt = getEngine().submit(null, e -> {\r
+                               if (e.getStatus().equals(JobStatus.SUSPENDED)) {\r
+                                       IJobRuntime rt = (IJobRuntime) e.getSource();\r
+                                       logger.info("Cleanup on SUSPEND {}, {}", rt.getId(), rt.isDisableRetry());\r
+                               }\r
+                       }, CHILD_TEMPLATE, "JOB " + i, 0, IJobEngine.DEFAULT_OWNER, ListUtils.asMap("param", i));\r
+                       \r
+                       rt.setRelated("TEST" + rt.getId());\r
+               }\r
+\r
+               logger.info("Done");\r
+               return null;\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/TranscodeFFAStranStep.java b/server/-product/production/OMAR/jobs/steps/TranscodeFFAStranStep.java
new file mode 100644 (file)
index 0000000..d09685b
--- /dev/null
@@ -0,0 +1,151 @@
+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
+\r
+import org.apache.commons.io.FilenameUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+import org.apache.logging.log4j.message.Message;\r
+import org.apache.logging.log4j.message.ParameterizedMessage;\r
+\r
+import user.commons.FFAStransAPI;\r
+import user.commons.IFFAStransAPI;\r
+import user.commons.StoreUri;\r
+import user.commons.mediatool.Timecode;\r
+import user.commons.mediatool.Timecode.Type;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.FileType;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.Store;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class TranscodeFFAStranStep extends JobStep {\r
+       private static final int POLL_INTERVALL = 3000;\r
+       private static final String MP4EXT = ".MP4";\r
+       private static final String MXFEXT = ".MXF";\r
+       private static final String LOWRES_FILETYPE = "Low-res";\r
+       private static final Logger logger = LogManager.getLogger("TranscodeFFAStranStep");\r
+       private IItemManager manager;\r
+       private Store store;\r
+       private FileType fileType;\r
+       private Media mediaCubeMedia;\r
+       private Marker marker;\r
+\r
+       @StepEntry\r
+       public Object[] execute(ArchiveItem archiveItem, Media mediaCubeMedia, String transcoderAddress, String transcoderTemplateName,\r
+                       String globalHiresSourcePath, String localLowresTargetPath, boolean deleteSource, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+\r
+               this.marker = jobRuntime.getSessionMarker();\r
+               this.manager = jobEngine.getItemManager();\r
+               this.store = check(manager.getCurrentLowresStore(), "lowres Store");\r
+               this.fileType = check(manager.getFileType(LOWRES_FILETYPE), "lowres FileType");\r
+               this.mediaCubeMedia = check(mediaCubeMedia, "mediaCubeMedia");\r
+               check(archiveItem, "archiveItem");\r
+               check(transcoderAddress, "transcoderAddress");\r
+               check(transcoderTemplateName, "transcoderTemplateName");\r
+               check(globalHiresSourcePath, "globalHiresSourcePath");\r
+               check(localLowresTargetPath, "localLowresTargetPath");\r
+\r
+               File sourceMediaFile = new File(archiveItem.getMediaFile());\r
+               logger.info("Transcoding {}", archiveItem.getMediaFile());\r
+               String sourceFileName = sourceMediaFile.getName();\r
+               Timecode timecode = new Timecode(mediaCubeMedia.getLength(), Type.PAL);\r
+\r
+               String details = String.format("%s (%s, %d bytes)", sourceFileName, timecode.toString(), sourceMediaFile.length());\r
+\r
+               StoreUri storeUri = store.getTargetStoreUri(RemoteStoreProtocol.LOCAL);\r
+               if (storeUri == null)\r
+                       throw new Exception("Can not detect proxy folder.");\r
+\r
+               String webPath = storeUri.toString(true);\r
+\r
+               Path targetPath = null;\r
+               try {\r
+                       String targetFileName = FilenameUtils.removeExtension(sourceFileName) + MP4EXT;\r
+                       targetPath = Paths.get(localLowresTargetPath, targetFileName);\r
+                       if (!Files.exists(targetPath)) {\r
+                               //                              jobRuntime.setDescription(String.format("%s: %s", jobRuntime.getDescription(), details));\r
+                               jobRuntime.setDescription(String.format("%s transzkódolása", details));\r
+                               String sourceFile = Paths.get(globalHiresSourcePath, sourceFileName).toString();\r
+                               IFFAStransAPI api = new FFAStransAPI(transcoderAddress, p -> {\r
+                                       if (p <= 100)\r
+                                               jobRuntime.incrementProgress(p);\r
+                               });\r
+\r
+                               api.submit(transcoderTemplateName, sourceFile);\r
+                               api.monitor(POLL_INTERVALL);\r
+                       }\r
+\r
+                       //a sikeres transzkod utan nem mindig van ott egybol a fajl\r
+                       long started = System.currentTimeMillis();\r
+                       while (!Files.exists(targetPath)) {\r
+                               long current = System.currentTimeMillis();\r
+                               //max 5 perc varakozas\r
+                               if (current - started > 5 * 60 * 1000)\r
+                                       throw new Exception("Transcode job target file access timed out");\r
+                               Thread.sleep(POLL_INTERVALL);\r
+                       }\r
+\r
+                       postprocess(targetPath, webPath);\r
+\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       Message m = new ParameterizedMessage("{} átkódolás hiba: {}", sourceFileName, e.getMessage());\r
+                       logger.error(marker, m);\r
+                       throw new Exception(m.getFormattedMessage());\r
+               } finally {\r
+                       try {\r
+                               if (deleteSource && sourceMediaFile != null && sourceMediaFile.exists())\r
+                                       sourceMediaFile.delete();\r
+                       } catch (Exception e) {\r
+                               logger.catching(e);\r
+                       }\r
+                       try {\r
+                               if (deleteSource && targetPath != null && Files.exists(targetPath))\r
+                                       Files.delete(targetPath);\r
+                       } catch (Exception e) {\r
+                               logger.catching(e);\r
+                       }\r
+               }\r
+               return null;\r
+       }\r
+\r
+       private void postprocess(Path transcodedFilePath, String webPath) throws IOException {\r
+               Path lowresPath = null;\r
+               try {\r
+                       String transcodedFileName = transcodedFilePath.getFileName().toString();\r
+                       String targetPath = null;\r
+                       if (transcodedFileName.indexOf(".") > 2) {\r
+                               Path subdir = Paths.get(transcodedFileName.substring(0, 1), transcodedFileName.substring(1, 2), transcodedFileName.substring(2, 3));\r
+                               EscortFiles.ensureUNCFolder(webPath, subdir.toString());\r
+                               targetPath = Paths.get(subdir.toString(), transcodedFileName).toString();\r
+                       } else {\r
+                               targetPath = transcodedFileName;\r
+                       }\r
+                       lowresPath = Paths.get(webPath, targetPath);\r
+                       int version = 1;\r
+                       while (Files.exists(lowresPath)) {\r
+                               String fileName = transcodedFileName + version + MP4EXT;\r
+                               lowresPath = Paths.get(lowresPath.toString().replace(transcodedFileName, fileName));\r
+                               targetPath = targetPath.replace(transcodedFileName, fileName);\r
+                               transcodedFileName = fileName;\r
+                               version++;\r
+                       }\r
+\r
+                       Files.move(transcodedFilePath, lowresPath);\r
+                       manager.createMediaFile(targetPath, fileType, store, mediaCubeMedia).add();\r
+               } catch (IOException e) {\r
+                       logger.catching(e);\r
+                       logger.error(marker, "A '{}' állomány mozgatása a '{}' helyre nem sikerült.", transcodedFilePath, lowresPath);\r
+                       throw e;\r
+               }\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/TransferStep.java b/server/-product/production/OMAR/jobs/steps/TransferStep.java
new file mode 100644 (file)
index 0000000..c10084f
--- /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
+\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.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
+\r
+public class TransferStep extends JobStep {\r
+       private static final String DOT_PART = ".part";\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       private void copy(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
+       @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
+                       setDescription("{} -> {} : {}", sourceStore.getName(), targetStore.getName(), sourceFileName);\r
+\r
+                       sourceStoreUri.addProgressListener(e -> setProgress(e.getProgress()));\r
+\r
+                       StoreUri currentTargetStoreUri = getTargetStoreUri(targetStoreUri);\r
+\r
+                       try {\r
+                               RemoteFile remoteFile = currentTargetStoreUri.getRemoteFile(targetFileName);\r
+                               if (remoteFile != null) {\r
+                                       logger.info("File {} already exists on target {}, skipping transfer", targetFileName, targetStore.getName());\r
+                               }\r
+                       } catch (Exception e) {\r
+                       }\r
+\r
+                       copy(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
+                       getJobRuntime().setDescription(null);\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
diff --git a/server/-product/production/OMAR/jobs/steps/UpdateGhostMediaDataStep.java b/server/-product/production/OMAR/jobs/steps/UpdateGhostMediaDataStep.java
new file mode 100644 (file)
index 0000000..39cb7b3
--- /dev/null
@@ -0,0 +1,89 @@
+package user.jobengine.server.steps;\r
+\r
+import java.util.List;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.IItemManager;\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.MetadataType;\r
+import user.jobengine.server.steps.shared.MetadataTypeDetector;\r
+\r
+public class UpdateGhostMediaDataStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private Marker marker;\r
+\r
+       @StepEntry\r
+       public Object[] execute(Media mediaCubeMedia, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               marker = jobRuntime.getSessionMarker();\r
+\r
+               IItemManager manager = jobEngine.getItemManager();\r
+               //Refresh from db\r
+               List<MediaFile> mediaFiles = manager.getMedia(mediaCubeMedia.getId()).getMediaFiles();\r
+               if (mediaFiles != null && mediaFiles.size() == 2) {\r
+                       MediaFile lowres = null;\r
+                       MediaFile highres = null;\r
+\r
+                       for (MediaFile mf : mediaFiles) {\r
+                               if (mf.getStore().getSourceStoreUri(RemoteStoreProtocol.HTTP) != null)\r
+                                       lowres = mf;\r
+                               else\r
+                                       highres = mf;\r
+                       }\r
+\r
+                       if (highres == null) {\r
+                               logger.info(marker, "Nincs highres mediaId: {}", mediaCubeMedia.getId());\r
+                               return null;\r
+                       }\r
+                       if (lowres == null) {\r
+                               logger.info(marker, "Nincs lowres mediaId: {}", mediaCubeMedia.getId());\r
+                               return null;\r
+                       }\r
+\r
+                       String id = MetadataTypeDetector.truncateExtension(highres.getRelativePath());\r
+                       id = MetadataTypeDetector.truncateVersion(id);\r
+                       boolean detect = MetadataTypeDetector.GuessMetadataType(id) == MetadataType.OctopusPlaceholder\r
+                                       || MetadataTypeDetector.GuessMetadataType(id) == MetadataType.OctopusStory;\r
+                       if (!detect) {\r
+                               logger.info(marker, "Nem bejátszó mediaId: {}, file: {}", mediaCubeMedia.getId(), highres.getRelativePath());\r
+                               return null;\r
+                       }\r
+\r
+                       Store highresStore = manager.getSystemStore(false);\r
+                       final long sourceMediaId = lowres.getId();\r
+                       final long highresMediaFileId = highres.getId();\r
+                       final String highresRealtivePath = highres.getRelativePath();\r
+\r
+                       manager.executeQuery("SELECT mediaid FROM mediafile WHERE relativepath=? and storeid=? and id!=?", rs -> {\r
+                               long mediaId = rs.getLong(1);\r
+                               Media media = manager.getMedia(mediaId);\r
+                               if (media.getMediaFilesCount() == 1) {\r
+                                       logger.info(marker, "Hiányzó szellem lowres hozzáadása {} alapján", media.getId());\r
+\r
+                                       MediaFile mf = (MediaFile) manager.get(MediaFile.class, sourceMediaId);\r
+                                       mf.setMedia(media);\r
+                                       mf.setId(0);\r
+                                       manager.add(mf);\r
+                                       media.setLength(mediaCubeMedia.getLength());\r
+                                       manager.modify(media);\r
+                               }\r
+                               return true;\r
+                       }, st -> {\r
+                               st.setString(1, highresRealtivePath);\r
+                               st.setLong(2, highresStore.getId());\r
+                               st.setLong(3, highresMediaFileId);\r
+                       });\r
+\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/ValidateProResStep.java b/server/-product/production/OMAR/jobs/steps/ValidateProResStep.java
new file mode 100644 (file)
index 0000000..e36f784
--- /dev/null
@@ -0,0 +1,32 @@
+package user.jobengine.server.steps;\r
+\r
+import java.util.HashMap;\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.mediaarea.MediaArea;\r
+\r
+public class ValidateProResStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(Map<String, MediaArea> proResFiles) {\r
+               Map<String, MediaArea> files = new HashMap<String, MediaArea>();\r
+\r
+               if (!proResFiles.isEmpty()) {\r
+                       for (String fileName : proResFiles.keySet()) {\r
+                               MediaArea mediaArea = proResFiles.get(fileName);\r
+                               String videoFormat = mediaArea.getFormat();\r
+\r
+                               if (mediaArea.getFrameRate() == 23.976 && videoFormat.equals("PRORES")) {\r
+                                       files.put(fileName, mediaArea);\r
+                               }\r
+                       }\r
+               } else {\r
+                       logger.info("proResFiles is empty!");\r
+               }\r
+               return new Object[] { files };\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/shared/EscortFiles.java b/server/-product/production/OMAR/jobs/steps/shared/EscortFiles.java
new file mode 100644 (file)
index 0000000..c888f72
--- /dev/null
@@ -0,0 +1,348 @@
+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.log4j2.marker.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> </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 = createMediaCatchFilePath(mediaFile);\r
+               ensureUNCFolder(catchedFile.getParent());\r
+               Files.createFile(catchedFile);\r
+       }\r
+\r
+       public static Path createMediaCatchFilePath(Path mediaFile) {\r
+               String fileName = mediaFile.getFileName().toString() + DOT_CATCHED;\r
+               return Paths.get(mediaFile.getParent().toString(), STATUSFOLDER, fileName);\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)\r
+                       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))\r
+                               .appendChild(xmlDocument.createTextNode(df.format(modified)));\r
+               root.appendChild(xmlDocument.createElement(RECORDTIMESTAMP))\r
+                               .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)\r
+                       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))\r
+                                       .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 Files.exists(catchedFilePath);\r
+       }\r
+\r
+       /***\r
+        * A media elérési útján alapján a .STATUS almappában vizsgálja .catch fajl\r
+        * létezését.\r
+        *\r
+        * @param mediaFile\r
+        * @return\r
+        */\r
+       public static boolean isMediaCatched(Path mediaFile) {\r
+               Path catchedFile = createMediaCatchFilePath(mediaFile);\r
+               return Files.exists(catchedFile);\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 = Files.exists(metadataPath);\r
+               return result;\r
+       }\r
+\r
+       public static void notifyRecipient(Path escortFile, Logger logger, Message msg) {\r
+               if (Files.exists(escortFile)) {\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 = createMediaCatchFilePath(mediaFile);\r
+               remove(catchedFile);\r
+       }\r
+\r
+       public static void setNEXIOKillDate(int killDateDays, String targetFileName, String nexioAgency, StoreUri targetUri)\r
+                       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,\r
+                                       nexioAgency);\r
+                       String xml = targetFileName + ".xml";\r
+                       outStream = targetFTP.storeFileStream(xml);\r
+                       if (outStream == null) {\r
+                               throw new NullPointerException(\r
+                                               "Can not open: " + targetFileName.substring(0, targetFileName.lastIndexOf('.')) + ".xml"\r
+                                                               + " Reply:" + 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) throws TransformerFactoryConfigurationError,\r
+                       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/OMAR/jobs/steps/shared/ExternalCommand.java b/server/-product/production/OMAR/jobs/steps/shared/ExternalCommand.java
new file mode 100644 (file)
index 0000000..307f36d
--- /dev/null
@@ -0,0 +1,79 @@
+package user.jobengine.server.steps.shared;\r
+\r
+import java.io.BufferedReader;\r
+import java.io.InputStreamReader;\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
+public class ExternalCommand {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private ExternalProfile profile;\r
+\r
+       public ExternalCommand(ExternalProfile profile) {\r
+               this.profile = profile;\r
+       }\r
+\r
+       public String execute(String input, String output, boolean firstResponse, IExternalCallback responseCallBack) throws Exception {\r
+               List<String> arguments = getArguments(input, output);\r
+               List<String> command = new ArrayList<>();\r
+               command.add(profile.getExecutable());\r
+               command.addAll(arguments);\r
+\r
+               ProcessBuilder processBuilder = new ProcessBuilder();\r
+               processBuilder.command(command);\r
+\r
+               String result = null;\r
+               try {\r
+                       logger.info("Executing : {}", processBuilder.command());\r
+\r
+                       Process process = processBuilder.start();\r
+                       try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {\r
+                               String line = null;\r
+                               while ((line = reader.readLine()) != null) {\r
+                                       logger.debug("Process response: {}", line);\r
+                                       if (responseCallBack != null)\r
+                                               responseCallBack.onResponse(line);\r
+                                       //System.out.println(line);\r
+                                       if (line != null && line.length() > 0) {\r
+                                               result = line;\r
+                                               if (firstResponse)\r
+                                                       break;\r
+                                       }\r
+                               }\r
+                               int exitCode = process.waitFor();\r
+                               if (exitCode != 0) {\r
+                                       StringBuilder msg = new StringBuilder();\r
+                                       try (BufferedReader errReader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {\r
+                                               String errline = null;\r
+                                               while ((errline = errReader.readLine()) != null) {\r
+                                                       msg.append(errline);\r
+                                               }\r
+                                       } catch (Exception ex) {\r
+                                       }\r
+\r
+                                       throw new Exception("Exited with error code : " + exitCode + ". " + msg);\r
+                               }\r
+                       } catch (Exception e) {\r
+                               throw e;\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.error(e);\r
+                       throw e;\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+       private List<String> getArguments(String input, String output) {\r
+               List<String> result = new ArrayList<>();\r
+\r
+               profile.getArguments().forEach(i -> {\r
+                       result.add(i.replace("%i", input).replace("%o", output));\r
+               });\r
+               return result;\r
+       }\r
+\r
+}
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/steps/shared/ExternalCommandExecutor.java b/server/-product/production/OMAR/jobs/steps/shared/ExternalCommandExecutor.java
new file mode 100644 (file)
index 0000000..a34ff7f
--- /dev/null
@@ -0,0 +1,32 @@
+package user.jobengine.server.steps.shared;\r
+\r
+import user.commons.configuration.SystemConfiguration;\r
+\r
+public class ExternalCommandExecutor {\r
+\r
+       public void execute(String profileName, String input, String output, IExternalCallback responseCallBack) throws Exception {\r
+               ExternalCommand externalCommand = getExternalCommand(profileName);\r
+               externalCommand.execute(input, output, false, responseCallBack);\r
+       }\r
+\r
+       private ExternalCommand getExternalCommand(String profileName) throws Exception {\r
+               ExternalProfilesConfig config = SystemConfiguration.getInstance().load("settings/external-commands.yaml", ExternalProfilesConfig.class);\r
+\r
+               if (config == null)\r
+                       throw new Exception("Missing external-commands.yaml configuration");\r
+\r
+               ExternalProfile selectedProfile = null;\r
+               for (ExternalProfile profile : config.getProfiles()) {\r
+                       if (profileName.equals(profile.getName())) {\r
+                               selectedProfile = profile;\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               if (selectedProfile == null)\r
+                       throw new Exception("Missing profile " + profileName + " in external-commands.yaml configuration");\r
+\r
+               return new ExternalCommand(selectedProfile);\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/shared/ExternalProfile.java b/server/-product/production/OMAR/jobs/steps/shared/ExternalProfile.java
new file mode 100644 (file)
index 0000000..68e22f4
--- /dev/null
@@ -0,0 +1,33 @@
+package user.jobengine.server.steps.shared;\r
+\r
+import java.util.List;\r
+\r
+public class ExternalProfile {\r
+       private String executable;\r
+       private String name;\r
+       private List<String> arguments;\r
+\r
+       public List<String> getArguments() {\r
+               return arguments;\r
+       }\r
+\r
+       public String getExecutable() {\r
+               return executable;\r
+       }\r
+\r
+       public String getName() {\r
+               return name;\r
+       }\r
+\r
+       public void setArguments(List<String> arguments) {\r
+               this.arguments = arguments;\r
+       }\r
+\r
+       public void setExecutable(String executable) {\r
+               this.executable = executable;\r
+       }\r
+\r
+       public void setName(String name) {\r
+               this.name = name;\r
+       }\r
+}
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/steps/shared/ExternalProfilesConfig.java b/server/-product/production/OMAR/jobs/steps/shared/ExternalProfilesConfig.java
new file mode 100644 (file)
index 0000000..7ef7729
--- /dev/null
@@ -0,0 +1,15 @@
+package user.jobengine.server.steps.shared;\r
+\r
+import java.util.List;\r
+\r
+public class ExternalProfilesConfig {\r
+       private List<ExternalProfile> profiles;\r
+\r
+       public List<ExternalProfile> getProfiles() {\r
+               return profiles;\r
+       }\r
+\r
+       public void setProfiles(List<ExternalProfile> profiles) {\r
+               this.profiles = profiles;\r
+       }\r
+}
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/steps/shared/FileSearchFilterOptions.java b/server/-product/production/OMAR/jobs/steps/shared/FileSearchFilterOptions.java
new file mode 100644 (file)
index 0000000..b5a8d0e
--- /dev/null
@@ -0,0 +1,41 @@
+package user.jobengine.server.steps.shared;\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/OMAR/jobs/steps/shared/IExternalCallback.java b/server/-product/production/OMAR/jobs/steps/shared/IExternalCallback.java
new file mode 100644 (file)
index 0000000..1e07191
--- /dev/null
@@ -0,0 +1,5 @@
+package user.jobengine.server.steps.shared;\r
+\r
+public interface IExternalCallback {\r
+       void onResponse(String data);\r
+}
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/steps/shared/ItemManagerExtensions.java b/server/-product/production/OMAR/jobs/steps/shared/ItemManagerExtensions.java
new file mode 100644 (file)
index 0000000..32f17cb
--- /dev/null
@@ -0,0 +1,94 @@
+package user.jobengine.server.steps.shared;\r
+\r
+import java.nio.file.Path;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.IResultSetConsumer;\r
+import user.jobengine.db.Store;\r
+\r
+public class ItemManagerExtensions {\r
+\r
+       public static BasicDBObject getArchiveInfo(IItemManager manager, long houseid) {\r
+               final BasicDBObject[] result = { null };\r
+               StringBuilder query = new StringBuilder();\r
+               query.append("select count(*) as count, sum(length) as duration FROM media");\r
+               query.append(" ");\r
+               query.append(String.format("where houseid='%d' and itemtypeid = 82", houseid));\r
+               query.append(" ");\r
+               query.append("group by houseid");\r
+               IResultSetConsumer consumer = rs -> {\r
+                       BasicDBObject o = new BasicDBObject();\r
+                       o.put("count", rs.getLong("count"));\r
+                       o.put("duration", rs.getLong("duration"));\r
+                       result[0] = o;\r
+                       return false;\r
+               };\r
+               manager.executeQuery(query.toString(), consumer, null);\r
+               return result[0];\r
+       }\r
+\r
+       public static long getExistingRundownMedia(IItemManager manager, String houseid) {\r
+               final long[] result = new long[] { 0 };\r
+               final String[] idToCheck = new String[] { houseid };\r
+               int pos = houseid.lastIndexOf("-");\r
+               //a hivas a CopyForArchiveNEXIOMaterialsStep-bol is johet, ott meg nincs idobelyegezve a nev!\r
+               if (pos > 0 && houseid.length() - pos > 4)\r
+                       idToCheck[0] = houseid.substring(0, pos);\r
+               MetadataType metadataType = MetadataTypeDetector.GuessMetadataType(idToCheck[0]);\r
+               if (metadataType == MetadataType.OctopusPlaceholder) {\r
+                       StringBuilder query = new StringBuilder();\r
+                       query.append("select mediaid, mediafilehouseid, filename");\r
+                       query.append(" ");\r
+                       query.append(String.format("from vw_rundown_items where mediafilehouseid like '%s%%'", idToCheck[0]));\r
+                       query.append(" ");\r
+                       query.append("order by filename, mediaid");\r
+                       IResultSetConsumer consumer = rs -> {\r
+                               String fileName = rs.getString("filename");\r
+                               if (idToCheck[0].equals(fileName)) {\r
+                                       result[0] = rs.getLong("mediaid");\r
+                                       return false;\r
+                               } else\r
+                                       return true;\r
+                       };\r
+                       manager.executeQuery(query.toString(), consumer, null);\r
+               }\r
+\r
+               return result[0];\r
+       }\r
+\r
+       static public boolean isArchived(IItemManager manager, Path filePath) {\r
+               boolean result = false;\r
+               String name = filePath.getFileName().toString();\r
+               String[] tsmName = new String[] { null };\r
+               String query = String.format("SELECT relativepath FROM MEDIAFILE WHERE houseid = '%s'", name);\r
+               manager.executeQuery(query, rs -> {\r
+                       tsmName[0] = rs.getString("relativepath");\r
+                       return false;\r
+               }, null);\r
+\r
+               Store tsmStore = manager.getSystemStore(false);\r
+               if (tsmStore == null)\r
+                       throw new NullPointerException("A TSM bejegyzés nem található!");\r
+\r
+               StoreUri tsmStoreUri = tsmStore.getSourceStoreUri(RemoteStoreProtocol.TSM);\r
+               if (tsmStoreUri == null)\r
+                       throw new NullPointerException("A TSM forrás elérése nem található!");\r
+\r
+               if (tsmName[0] != null) {\r
+                       try {\r
+                               RemoteFile remoteFile = tsmStoreUri.getRemoteFile(tsmName[0]);\r
+                               result = remoteFile != null;\r
+                       } catch (Exception e) {\r
+                               result = false;\r
+                       } finally {\r
+                               tsmStoreUri.cleanUp();\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/shared/MediaCubeClient.java b/server/-product/production/OMAR/jobs/steps/shared/MediaCubeClient.java
new file mode 100644 (file)
index 0000000..0915cc3
--- /dev/null
@@ -0,0 +1,77 @@
+package user.jobengine.server.steps.shared;\r
+\r
+import javax.ws.rs.client.Entity;\r
+import javax.ws.rs.client.Invocation.Builder;\r
+import javax.ws.rs.core.MediaType;\r
+import javax.ws.rs.core.MultivaluedMap;\r
+import javax.ws.rs.core.Response;\r
+import javax.ws.rs.core.Response.Status;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.jboss.resteasy.client.jaxrs.ResteasyClient;\r
+import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;\r
+import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;\r
+import org.jboss.resteasy.specimpl.MultivaluedMapImpl;\r
+\r
+import com.ibm.nosql.json.JSONUtil;\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+public class MediaCubeClient {\r
+       private static Logger logger = LogManager.getLogger();\r
+       private ResteasyWebTarget webTarget;\r
+\r
+       public MediaCubeClient(String address) {\r
+               ResteasyClient client = new ResteasyClientBuilder().build();\r
+               webTarget = client.target(address);\r
+       }\r
+\r
+       BasicDBObject getDbObject(String json) {\r
+               BasicDBObject result = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
+\r
+               if (result == null)\r
+                       throw new NullPointerException("API Result is null!");\r
+\r
+               if (result.containsKey("exception")) {\r
+                       BasicDBObject e = (BasicDBObject) result.get("exception");\r
+                       throw new RuntimeException(e.getString("message"));\r
+               }\r
+               //{"exception":{"message":"Invalid credentials.","publicName":"AuthenticationFailedException"}}\r
+               return result;\r
+       }\r
+\r
+       public BasicDBObject getStatus(long jobId) {\r
+               MultivaluedMap<String, Object> vars = new MultivaluedMapImpl<>();\r
+               vars.add("jobId", jobId);\r
+               Response response = query("services/rest/jobengine/jobstatus", vars).get();\r
+               if (response.getStatus() != Status.OK.getStatusCode()) {\r
+                       logger.error(response.readEntity(String.class));\r
+                       System.out.println(response.readEntity(String.class));\r
+                       return null;\r
+               }\r
+               String result = response.readEntity(String.class);\r
+               return getDbObject(result);\r
+       }\r
+\r
+       private Builder query(String path, MultivaluedMap<String, Object> vars) {\r
+               ResteasyWebTarget target = webTarget.path(path).queryParams(vars);\r
+               Builder result = target.request();\r
+               return result;\r
+       }\r
+\r
+       public long startjob(String template, String name, BasicDBObject jobParams) throws Exception {\r
+               MultivaluedMap<String, Object> vars = new MultivaluedMapImpl<>();\r
+               vars.add("template", template);\r
+               vars.add("name", name);\r
+               Response response = query("services/rest/jobengine/startjob", vars).post(Entity.entity(jobParams.toString(), MediaType.APPLICATION_JSON));\r
+\r
+               if (response.getStatus() != Status.OK.getStatusCode()) {\r
+                       logger.error(response.readEntity(String.class));\r
+                       return 0;\r
+               }\r
+\r
+               String resultObject = response.readEntity(String.class);\r
+               return Long.parseLong(resultObject);\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/shared/MediaFileSearchFilterOptions.java b/server/-product/production/OMAR/jobs/steps/shared/MediaFileSearchFilterOptions.java
new file mode 100644 (file)
index 0000000..ee467e5
--- /dev/null
@@ -0,0 +1,42 @@
+package user.jobengine.server.steps.shared;\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 MediaFileSearchFilterOptions extends FileSearchFilterOptions {\r
+\r
+       private BasicDBObject filter;\r
+\r
+       public MediaFileSearchFilterOptions(BasicDBObject filter) {\r
+               super(filter);\r
+       }\r
+\r
+       @Override\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
+               return false;\r
+       }\r
+\r
+       @Override\r
+       public boolean preAcceptDirectory(Path file) {\r
+               return true;\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/shared/MetadataType.java b/server/-product/production/OMAR/jobs/steps/shared/MetadataType.java
new file mode 100644 (file)
index 0000000..0e27bf3
--- /dev/null
@@ -0,0 +1,5 @@
+package user.jobengine.server.steps.shared;\r
+\r
+public enum MetadataType {\r
+       TrafficMaterial, TrafficPromo, TrafficAD, OctopusStory, OctopusPlaceholder, Generic\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/shared/MetadataTypeDetector.java b/server/-product/production/OMAR/jobs/steps/shared/MetadataTypeDetector.java
new file mode 100644 (file)
index 0000000..9e9e6be
--- /dev/null
@@ -0,0 +1,49 @@
+package user.jobengine.server.steps.shared;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+\r
+public class MetadataTypeDetector {\r
+\r
+       private static final String HYPHEN = "-";\r
+       private static final String DOT = ".";\r
+\r
+       private static final String REGEXP_TRAFFICMATERIALID = "^M{1}[0-9]{6}[A-Z]{1}";\r
+       private static final String REGEXP_TRAFFICADID = "^R{1}[0-9]{6}[A-Z]{1}";\r
+       private static final String REGEXP_TRAFFICPROMOID = "^P{1}[0-9]{6}[A-Z]{1}";\r
+       private static final String REGEXP_OCTOPUSSTORYID = "^[0-9]+";\r
+       private static final String REGEXP_OCTOPUSPLACEHOLDERID = "^[0-9]+_[0-9]+";\r
+       private static final String REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID = "^[0-9]+_[0-9]+-[0-9]{3}";\r
+\r
+       public static MetadataType GuessMetadataType(String id) {\r
+               if (StringUtils.isBlank(id))\r
+                       return MetadataType.Generic;\r
+               if (id.matches(REGEXP_TRAFFICMATERIALID))\r
+                       return MetadataType.TrafficMaterial;\r
+               if (id.matches(REGEXP_TRAFFICPROMOID))\r
+                       return MetadataType.TrafficPromo;\r
+               if (id.matches(REGEXP_TRAFFICADID))\r
+                       return MetadataType.TrafficAD;\r
+               if (id.matches(REGEXP_OCTOPUSSTORYID))\r
+                       return MetadataType.OctopusStory;\r
+               if (id.matches(REGEXP_OCTOPUSPLACEHOLDERID))\r
+                       return MetadataType.OctopusPlaceholder;\r
+               if (id.matches(REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID))\r
+                       return MetadataType.OctopusPlaceholder;\r
+               return MetadataType.Generic;\r
+       }\r
+\r
+       public static String truncateExtension(String name) {\r
+               String result = name;\r
+               if (result != null && result.contains(DOT))\r
+                       result = result.substring(0, result.lastIndexOf(DOT));\r
+               return result;\r
+       }\r
+\r
+       public static String truncateVersion(String name) {\r
+               String result = name;\r
+               if (result != null && result.contains(HYPHEN))\r
+                       result = result.split(HYPHEN)[0];\r
+               return result;\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/shared/TestLib.java b/server/-product/production/OMAR/jobs/steps/shared/TestLib.java
new file mode 100644 (file)
index 0000000..d12738a
--- /dev/null
@@ -0,0 +1,9 @@
+package user.jobengine.server.steps.shared;\r
+\r
+public class TestLib {\r
+\r
+       public void hello() {\r
+               TestLib1 lib = new TestLib1();\r
+               lib.helo();\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/steps/shared/TestLib1.java b/server/-product/production/OMAR/jobs/steps/shared/TestLib1.java
new file mode 100644 (file)
index 0000000..99d47e5
--- /dev/null
@@ -0,0 +1,8 @@
+package user.jobengine.server.steps.shared;\r
+\r
+public class TestLib1 {\r
+\r
+       public void hello() {\r
+               System.out.println("Hello from lib1");\r
+       }\r
+}\r
diff --git a/server/-product/production/OMAR/jobs/templates/archive-limited.xml b/server/-product/production/OMAR/jobs/templates/archive-limited.xml
new file mode 100644 (file)
index 0000000..6ea8130
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!DOCTYPE xml>\r
+\r
+<jobtemplate name="Felhasználói archiválás" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourcePath" type="java.lang.String" />\r
+                       <parameter name="killDateDays" type="java.lang.Integer" />\r
+                       <parameter name="limit" type="java.lang.Integer" />\r
+               </parameters>\r
+               <variables>\r
+                       <variable name="archiveList" type="java.util.LinkedList" />\r
+               </variables>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep id="step1" type="ArchiveListBuilderStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourcePath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="limit" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="archiveList" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>\r
+\r
+               <calljobstep id="step2" type="ArchiveMaterialSubmitStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="archiveList" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="killDateDays" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/archive-material.xml b/server/-product/production/OMAR/jobs/templates/archive-material.xml
new file mode 100644 (file)
index 0000000..973ac9f
--- /dev/null
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Anyag archiválása"  multiInstance="true"  useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="archiveItem" type="user.jobengine.server.steps.ArchiveItem" />\r
+                       <parameter name="killDateDays" type="java.lang.Integer"/>\r
+               </parameters>\r
+               <variables>\r
+                       <variable name="mediaCubeMedia" type="user.jobengine.db.Media" />\r
+               </variables>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep id="id1" type="MetadataTransformStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="archiveItem" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="mediaCubeMedia" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>\r
+               <calljobstep type="MediaToolStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="archiveItem" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="mediaCubeMedia" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>          \r
+               <calljobstep id="id2" type="TSMBackupStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="archiveItem" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="mediaCubeMedia" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="killDateDays" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/archive-ondemand.xml b/server/-product/production/OMAR/jobs/templates/archive-ondemand.xml
new file mode 100644 (file)
index 0000000..54555f6
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!DOCTYPE xml>\r
+\r
+<jobtemplate name="Felhasználói archiválás"  useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourcePath" type="java.lang.String" />\r
+                       <parameter name="killDateDays" type="java.lang.Integer" />\r
+                       <parameter name="limit" type="java.lang.Integer" />\r
+               </parameters>\r
+               <variables>\r
+                       <variable name="archiveList" type="java.util.LinkedList" />\r
+               </variables>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep id="step1" type="ArchiveListBuilderStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourcePath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="limit" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="archiveList" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>\r
+\r
+               <calljobstep id="step2" type="ArchiveMaterialSubmitStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="archiveList" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="killDateDays" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/archive-recursive.xml b/server/-product/production/OMAR/jobs/templates/archive-recursive.xml
new file mode 100644 (file)
index 0000000..02b9788
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Felhasználói archiválás" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourcePath" type="java.lang.String" />\r
+                       <parameter name="killDateDays" type="java.lang.Integer" />\r
+                       <parameter name="limit" type="java.lang.Integer" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep id="step1" type="ArchiveRecursive.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourcePath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="killDateDays" />\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/OMAR/jobs/templates/batch-retrieve-ondemand.xml b/server/-product/production/OMAR/jobs/templates/batch-retrieve-ondemand.xml
new file mode 100644 (file)
index 0000000..20332cf
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Archivált anyag visszatöltése" multiInstance="true"  useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="basket" type="java.util.ArrayList" />\r
+                       <parameter name="houseId" type="java.lang.String" />\r
+                       <parameter name="recipient" type="java.lang.String" />\r
+                       <parameter name="targetPathType" type="java.lang.String" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="BatchRetrieveForkStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="basket" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="houseId" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="recipient" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetPathType" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/calculatemd5.xml b/server/-product/production/OMAR/jobs/templates/calculatemd5.xml
new file mode 100644 (file)
index 0000000..637c763
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!DOCTYPE xml>\r
+\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="fileName" type="java.lang.String" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep remote="true" type="CalculateMD5Step.java" weight="1" >\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/cancelable.xml b/server/-product/production/OMAR/jobs/templates/cancelable.xml
new file mode 100644 (file)
index 0000000..2be289b
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="true">\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/OMAR/jobs/templates/common-copy.xml b/server/-product/production/OMAR/jobs/templates/common-copy.xml
new file mode 100644 (file)
index 0000000..7abb6fc
--- /dev/null
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Általános file másolás" multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceProtocol" type="java.lang.String"/>\r
+                       <parameter name="sourcePath" type="java.lang.String"/>\r
+                       <parameter name="sourceFileName" type="java.lang.String"/>\r
+                       <parameter name="targetProtocol" type="java.lang.String"/>\r
+                       <parameter name="targetPath" type="java.lang.String"/>\r
+                       <parameter name="targetFileName" type="java.lang.String"/>\r
+                       <parameter name="killDateDays" type="java.lang.Integer" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep id="id1" type="FileCopyStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceProtocol" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="sourcePath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="sourceFileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetProtocol" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetFileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="killDateDays" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/create-lowres-ondemand.xml b/server/-product/production/OMAR/jobs/templates/create-lowres-ondemand.xml
new file mode 100644 (file)
index 0000000..f792273
--- /dev/null
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Hiányzó PROXY videók pótlása" 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="CreateArchiveItemStep.java" 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="TSMRestoreStep.java" 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="MediaToolStep.java" 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="TranscodeFFAStranStep.java" 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="UpdateGhostMediaDataStep.java" 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/OMAR/jobs/templates/create-proxy-ffmpeg.xml b/server/-product/production/OMAR/jobs/templates/create-proxy-ffmpeg.xml
new file mode 100644 (file)
index 0000000..acb2cb6
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="true">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="input" type="java.lang.String" />\r
+                       <parameter name="output" type="java.lang.String" />\r
+                       <parameter name="profile" type="java.lang.String" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep remote="true" type="TranscodeFFMpegStep.java" weight="1" >\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="input" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="output" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="profile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/delete-materials.xml b/server/-product/production/OMAR/jobs/templates/delete-materials.xml
new file mode 100644 (file)
index 0000000..365fe19
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Anyagok törlése" multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourcePath" type="java.lang.String"/>\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep id="id1" type="CleanupMountedLocationStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourcePath" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/dummy-test-job-copy.xml b/server/-product/production/OMAR/jobs/templates/dummy-test-job-copy.xml
new file mode 100644 (file)
index 0000000..2c5d5a5
--- /dev/null
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!DOCTYPE xml>\r
+\r
+<jobtemplate useSessionLog="true">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="param1" type="java.lang.String" />\r
+               </parameters>\r
+               <variables>\r
+                       <variable name="var1" type="java.lang.Integer" />\r
+                       <variable name="var2" type="java.lang.Long" />\r
+               </variables>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="DummyTestStep1.java" weight="1" >\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="param1" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="var1" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>\r
+               <calljobstep type="DummyTestStep2.java" weight="1" >\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="var1" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="var2" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>\r
+               <calljobstep type="DummyTestStep3.java" weight="1" >\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="var2" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/dummy-test-job.xml b/server/-product/production/OMAR/jobs/templates/dummy-test-job.xml
new file mode 100644 (file)
index 0000000..2c5d5a5
--- /dev/null
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!DOCTYPE xml>\r
+\r
+<jobtemplate useSessionLog="true">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="param1" type="java.lang.String" />\r
+               </parameters>\r
+               <variables>\r
+                       <variable name="var1" type="java.lang.Integer" />\r
+                       <variable name="var2" type="java.lang.Long" />\r
+               </variables>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="DummyTestStep1.java" weight="1" >\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="param1" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="var1" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>\r
+               <calljobstep type="DummyTestStep2.java" weight="1" >\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="var1" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="var2" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>\r
+               <calljobstep type="DummyTestStep3.java" weight="1" >\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="var2" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/integration-test.xml b/server/-product/production/OMAR/jobs/templates/integration-test.xml
new file mode 100644 (file)
index 0000000..6593e5d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate>\r
+       <commands>\r
+               <calljobstep remote="true" type="IntegrationTestStep.java" weight="1" />\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/metadata-updater.xml b/server/-product/production/OMAR/jobs/templates/metadata-updater.xml
new file mode 100644 (file)
index 0000000..f516c3e
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Metaadat szinkronizálás">\r
+       <commands>\r
+               <calljobstep type="MetadataUpdater.java" />\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/migrate-hsm.xml b/server/-product/production/OMAR/jobs/templates/migrate-hsm.xml
new file mode 100644 (file)
index 0000000..faec872
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="HSM migráció" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceLocation" type="java.lang.String" />\r
+                       <parameter name="targetLocation" type="java.lang.String" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep id="step1" type="HSMMigrateStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceLocation" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetLocation" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/move-jpeg-to-isilon.xml b/server/-product/production/OMAR/jobs/templates/move-jpeg-to-isilon.xml
new file mode 100644 (file)
index 0000000..ae74dab
--- /dev/null
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!DOCTYPE xml>\r
+\r
+<jobtemplate useSessionLog="true">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceUri" type="java.lang.String"/>\r
+                       <parameter name="sourceProtocol" type="java.lang.String"/>\r
+                       <parameter name="sourceFolder" type="java.lang.String"/>\r
+                       <parameter name="targetUri" type="java.lang.String"/>\r
+                       <parameter name="targetProtocol" type="java.lang.String"/>\r
+                       <parameter name="targetFolder" type="java.lang.String"/>\r
+                       <parameter name="userName" type="java.lang.String"/>\r
+                       <parameter name="password" type="java.lang.String"/>\r
+                       <parameter name="port" type="java.lang.Integer"/>\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="MoveJpegToIsilonStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="sourceProtocol" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="sourceFolder" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetProtocol" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetFolder" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="userName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="password" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="port" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>     \r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/prores-archive.xml b/server/-product/production/OMAR/jobs/templates/prores-archive.xml
new file mode 100644 (file)
index 0000000..2d49bcb
--- /dev/null
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!DOCTYPE xml>\r
+\r
+<jobtemplate multiInstance="false" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceStoreFolder" type="java.lang.String" />\r
+                       <parameter name="sourceStoreName" type="java.lang.String" />\r
+                       <parameter name="targetStoreName" type="java.lang.String" />\r
+                       <parameter name="escortStoreFolder" type="java.lang.String" />\r
+                       <parameter name="filter" type="com.ibm.nosql.json.api.BasicDBObject" />\r
+               </parameters>\r
+               <variables>\r
+                       <variable name="foundFiles" type="java.util.List"/>\r
+                       <variable name="proResFiles" type="java.util.Map"/>\r
+                       <variable name="files" type="java.util.Map"/>\r
+               </variables>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="ProResArchiveStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceStoreFolder" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="filter" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="foundFiles" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>\r
+               <calljobstep type="AnalyzeMediaFilesStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="foundFiles" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="proResFiles" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>\r
+               <calljobstep type="ValidateProResStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="proResFiles" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="files" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>\r
+                               <calljobstep type="GenerateJSONMetadataStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="files" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="sourceStoreName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetStoreName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortStoreFolder" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/remote-transcode.xml b/server/-product/production/OMAR/jobs/templates/remote-transcode.xml
new file mode 100644 (file)
index 0000000..ce4c77b
--- /dev/null
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="true">\r
+       <declarations>\r
+               <parameters>\r
+                       <!-- Slave server address for transcode -->\r
+                       <parameter name="remoteServer" type="java.lang.String" />\r
+                       <!-- Slave server template for transcode -->\r
+                       <parameter name="transcodeTemplate" type="java.lang.String" />\r
+                       <!-- Slave server job display name -->\r
+                       <parameter name="jobName" type="java.lang.String" />\r
+                       <!-- Slave server transcode job profile -->\r
+                       <parameter name="profileName" type="java.lang.String" />\r
+                       <!-- TEMP store for media retrieve -->\r
+                       <parameter name="tempStoreName" type="java.lang.String" />\r
+                       <!-- TEMP store protocol for media retrieve -->\r
+                       <parameter name="tempStoreProtocol" type="java.lang.String" />\r
+               </parameters>\r
+               <variables>\r
+                       <!-- Media to transcode -->\r
+                       <variable name="media" type="user.jobengine.db.Media" />\r
+                       <!-- Media file name -->\r
+                       <variable name="fileName" type="java.lang.String" />\r
+                       <!-- Media store uri -->\r
+                       <variable name="mediaStoreUri" type="user.commons.StoreUri" />\r
+                       <!-- TEMP store uri -->\r
+                       <variable name="tempStoreUri" type="user.commons.StoreUri" />\r
+                       <!-- Slave server remote job parameters -->\r
+                       <variable name="remoteJobParameters" type="com.ibm.nosql.json.api.BasicDBObject" />\r
+               </variables>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="QueryMissingProxyMediaStep.java" weight="1" >\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="media" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>  \r
+               <calljobstep type="PrepareMediaRestoreStep.java" weight="1" >\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="media" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="tempStoreName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="tempStoreProtocol" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="mediaStoreUri" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="tempStoreUri" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="fileName" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>  \r
+               <calljobstep type="TransferStep.java" weight="5" >\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="mediaStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>  \r
+               <calljobstep type="PrepareRemoteTranscodeJobParametersStep.java" weight="1" >\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="profileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="remoteJobParameters" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>  \r
+               <calljobstep type="RemoteJobStep.java" weight="10" >\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="remoteServer" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="transcodeTemplate" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="jobName" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="remoteJobParameters" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/retrieve-ondemand.xml b/server/-product/production/OMAR/jobs/templates/retrieve-ondemand.xml
new file mode 100644 (file)
index 0000000..b58d8fd
--- /dev/null
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Archivált anyag visszatöltése" multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="localRetrievePath" type="java.lang.String" />\r
+                       <parameter name="globalRetrievePath" type="java.lang.String" />\r
+                       <parameter name="materialOutputFolder" type="java.lang.String" />\r
+                       <parameter name="promoOutputFolder" type="java.lang.String" />\r
+                       <parameter name="advertisementOutputFolder" type="java.lang.String" />\r
+                       <parameter name="octopusOutputFolder" type="java.lang.String" />\r
+                       <parameter name="genericOutputFolder" type="java.lang.String" />\r
+                       <parameter name="onlineOutputFolder" type="java.lang.String" />\r
+                       <parameter name="archivedMedia" type="user.jobengine.db.ArchivedMedia" />\r
+                       <parameter name="houseId" type="java.lang.String" />\r
+                       <parameter name="successRecipient" type="java.lang.String" />\r
+                       <parameter name="targetPathType" type="java.lang.String" />\r
+                       <parameter name="killDateDays" type="java.lang.Integer"/>\r
+                       <parameter name="nexioAgency" type="java.lang.String"/>\r
+                       <parameter name="nexioPort" type="java.lang.Integer"/>\r
+                       <parameter name="nexioUserName" type="java.lang.String"/>\r
+                       <parameter name="nexioPassword" type="java.lang.String"/>\r
+               </parameters>\r
+               <variables>\r
+                       <variable name="targetPath" type="java.lang.String" />\r
+                       <variable name="targetNamePattern" type="java.lang.String" />\r
+                       <variable name="useNexioTarget" type="java.lang.Boolean" />\r
+               </variables>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="OutputPathAndNameSelectorStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="localRetrievePath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="materialOutputFolder" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="promoOutputFolder" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="advertisementOutputFolder" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="octopusOutputFolder" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="genericOutputFolder" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="onlineOutputFolder" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="houseId" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetPathType" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="archivedMedia" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="targetPath" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="targetNamePattern" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="useNexioTarget" />\r
+                               </output>\r
+                       </outputs>                      \r
+               </calljobstep>\r
+               <calljobstep type="TSMExtendedRetrieveStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="archivedMedia" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="targetPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable 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
+                               <input>\r
+                                       <variable name="useNexioTarget" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioAgency" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioPort" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioUserName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioPassword" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="MXFCutterStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="archivedMedia" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="targetPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="successRecipient" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="houseId" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="killDateDays" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="useNexioTarget" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioAgency" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioPort" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioUserName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioPassword" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/retrieve.xml b/server/-product/production/OMAR/jobs/templates/retrieve.xml
new file mode 100644 (file)
index 0000000..e12fd95
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Archivált anyag visszatöltése" multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="mediaId" type="java.lang.Long" />\r
+                       <parameter name="targetPath" type="java.lang.String" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="TSMSimpleRestoreStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="mediaId" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetPath" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/safe-delete-recursive.xml b/server/-product/production/OMAR/jobs/templates/safe-delete-recursive.xml
new file mode 100644 (file)
index 0000000..bfa8e37
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Rekurzív törlés" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourcePath" type="java.lang.String" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep id="step1" type="SafeDeleteRecursive.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourcePath" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/sync-subtitles.xml b/server/-product/production/OMAR/jobs/templates/sync-subtitles.xml
new file mode 100644 (file)
index 0000000..f68c278
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!DOCTYPE xml>\r
+\r
+<jobtemplate>\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceFolder" type="java.lang.String" />\r
+                       <parameter name="filter" type="com.ibm.nosql.json.api.BasicDBObject" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep remote="true" type="PathItemsCollectorStep.java" weight="1" >\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceFolder" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="filter" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/sys-recreate-lowres.xml b/server/-product/production/OMAR/jobs/templates/sys-recreate-lowres.xml
new file mode 100644 (file)
index 0000000..9ef84b3
--- /dev/null
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Hiányzó PROXY videók pótlása" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\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
+               </parameters>\r
+               <variables>\r
+                       <variable name="mediaCubeMedia" type="user.jobengine.db.Media" />\r
+                       <variable name="targetNamePattern" type="java.lang.String" />\r
+                       <variable name="archiveItem" type="user.jobengine.server.steps.ArchiveItem" />\r
+                       <variable name="killDateDays" type="java.lang.Integer"/>\r
+                       <variable name="successRecipient" type="java.lang.String" />\r
+                       <variable name="deleteSource" type="java.lang.Boolean"/>\r
+               </variables>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="CreateMissingLowresStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="localHiresPath" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="mediaCubeMedia" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="archiveItem" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="targetNamePattern" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="successRecipient" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="killDateDays" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="deleteSource" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>\r
+               <calljobstep type="TSMRestoreStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="mediaCubeMedia" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="localHiresPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="targetNamePattern" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="successRecipient" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable 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="MediaToolStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="archiveItem" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="mediaCubeMedia" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="TranscodeFFAStranStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="archiveItem" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable 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
+                                       <variable name="deleteSource" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="UpdateGhostMediaDataStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="mediaCubeMedia" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/jobs/templates/test-fork-cancelable.xml b/server/-product/production/OMAR/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/OMAR/log/.gitignore b/server/-product/production/OMAR/log/.gitignore
new file mode 100644 (file)
index 0000000..c474102
--- /dev/null
@@ -0,0 +1,5 @@
+/delete-materials.log
+/markered-mediacube.log
+/mediacube-err.log
+/mediacube.log
+/movtest.log
diff --git a/server/-product/production/OMAR/log/2022-05/.gitignore b/server/-product/production/OMAR/log/2022-05/.gitignore
new file mode 100644 (file)
index 0000000..5e8754b
--- /dev/null
@@ -0,0 +1,6 @@
+/markered-mediacube-05-05-2022-1.log.gz
+/markered-mediacube-05-06-2022-1.log.gz
+/mediacube-05-05-2022-1.log.gz
+/mediacube-05-06-2022-1.log.gz
+/mediacube-err-05-05-2022-1.log.gz
+/mediacube-err-05-06-2022-1.log.gz
diff --git a/server/-product/production/OMAR/log/2022-05/markered-mediacube-05-09-2022-1.log.gz b/server/-product/production/OMAR/log/2022-05/markered-mediacube-05-09-2022-1.log.gz
new file mode 100644 (file)
index 0000000..5325035
Binary files /dev/null and b/server/-product/production/OMAR/log/2022-05/markered-mediacube-05-09-2022-1.log.gz differ
diff --git a/server/-product/production/OMAR/log/2022-05/mediacube-05-09-2022-1.log.gz b/server/-product/production/OMAR/log/2022-05/mediacube-05-09-2022-1.log.gz
new file mode 100644 (file)
index 0000000..b4179fc
Binary files /dev/null and b/server/-product/production/OMAR/log/2022-05/mediacube-05-09-2022-1.log.gz differ
diff --git a/server/-product/production/OMAR/log/2022-05/mediacube-err-05-09-2022-1.log.gz b/server/-product/production/OMAR/log/2022-05/mediacube-err-05-09-2022-1.log.gz
new file mode 100644 (file)
index 0000000..605ced8
Binary files /dev/null and b/server/-product/production/OMAR/log/2022-05/mediacube-err-05-09-2022-1.log.gz differ
diff --git a/server/-product/production/OMAR/mediacube.bat b/server/-product/production/OMAR/mediacube.bat
new file mode 100644 (file)
index 0000000..24a39d6
--- /dev/null
@@ -0,0 +1,17 @@
+@echo off\r
+if exist tmp rmdir tmp /s /q\r
+mkdir tmp\r
+java ^\r
+-Dorg.eclipse.epp.logging.aeri.skipReports=true ^\r
+-Declipse.ignoreApp=true ^\r
+-Dosgi.noShutdown=true ^\r
+-Dlog4j.configurationFile=settings/log4j2.xml ^\r
+-Djetty.home=settings ^\r
+-Djetty.etc.config.urls=jetty.xml ^\r
+-Djava.io.tmpdir=tmp ^\r
+-Dfile.encoding=UTF-8 ^\r
+-Dgosh.home=configuration ^\r
+-jar ../../target/products/MediaCube/linux/gtk/x86_64/plugins/org.eclipse.equinox.launcher_1.3.201.v20161025-1711.jar ^\r
+-Xms512m ^\r
+-Xmx1024m ^\r
+-console\r
diff --git a/server/-product/production/OMAR/settings/application.yaml b/server/-product/production/OMAR/settings/application.yaml
new file mode 100644 (file)
index 0000000..c870af3
--- /dev/null
@@ -0,0 +1,45 @@
+datasource:\r
+  mediacube:\r
+    url: jdbc:db2://localhost:50000/mc\r
+    user: db2admin\r
+    password: password\r
+    external-indexer: true\r
+    simple-search: true\r
+    login-timeout: 3\r
+    pool-size: 10\r
+  mediacube-nosql:\r
+    url: jdbc:db2://localhost:50000/mc\r
+    user: db2admin\r
+    password: password\r
+    schema: test\r
+    login-timeout: 3\r
+  hsm: \r
+    url: jdbc:db2://10.11.1.89:51500/tsmdb1\r
+    user: tsminst1\r
+    password: tsminst1\r
+  planair: \r
+    url: jdbc:sqlserver://10.11.254.86;databaseName=PA_Vivantis;\r
+    user: MAM\r
+    password: VDani\r
+services:\r
+  ffmpeg:\r
+    executable-location: /opt/ffmpeg/ffmpeg \r
+  mediacube:\r
+    proxy-root: /data/mediacube\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: true\r
+tsm:\r
+  randomize-archives: false \r
+  delimiter: /\r
+  node-name: JOBENGINE\r
+  fs-name: /JOBENGINE\r
+  alternate-fs-name: /JOBENGINE\r
+  hl-name: /JOBENGINE\r
+   
\ No newline at end of file
diff --git a/server/-product/production/OMAR/settings/dsm.opt b/server/-product/production/OMAR/settings/dsm.opt
new file mode 100644 (file)
index 0000000..90fcbdd
--- /dev/null
@@ -0,0 +1 @@
+SErvername       tsm.in.useribm.hu\r
diff --git a/server/-product/production/OMAR/settings/dsmopt.lock b/server/-product/production/OMAR/settings/dsmopt.lock
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/server/-product/production/OMAR/settings/external-commands.yaml b/server/-product/production/OMAR/settings/external-commands.yaml
new file mode 100644 (file)
index 0000000..5f3a3a6
--- /dev/null
@@ -0,0 +1,27 @@
+profiles:\r
+-\r
+  name: proxy\r
+  executable: /Programs/ffmpeg/bin/ffmpeg.exe\r
+  arguments:\r
+    - -y  \r
+    - -v\r
+    - error\r
+    - -progress\r
+    - pipe:1\r
+    - -i\r
+    - "%i"  \r
+    - "%o"  \r
+-\r
+  name: length\r
+  executable: /Programs/ffmpeg/bin/ffprobe.exe\r
+  arguments:\r
+    - -v\r
+    - error\r
+    - -select_streams\r
+    - v:0 \r
+    - -show_entries  \r
+    - stream=nb_frames  \r
+    - -of  \r
+    - default=noprint_wrappers=1:nokey=1  \r
+    - "%i"\r
\ No newline at end of file
diff --git a/server/-product/production/OMAR/settings/jetty.xml b/server/-product/production/OMAR/settings/jetty.xml
new file mode 100644 (file)
index 0000000..30bdeb0
--- /dev/null
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">\r
+\r
+<Configure id="Server" class="org.eclipse.jetty.server.Server">\r
+       <Call name="addConnector">\r
+               <Arg>\r
+                       <New class="org.eclipse.jetty.server.ServerConnector">\r
+                               <Arg name="server">\r
+                                       <Ref refid="Server" />\r
+                               </Arg>\r
+                               <Set name="port">\r
+                                       <Property name="jetty.http.port" default="9080" />\r
+                               </Set>\r
+                       </New>\r
+               </Arg>\r
+       </Call>\r
+\r
+<!--   <Set name="sessionIdManager"> -->\r
+<!--           <New id="idMgr" -->\r
+<!--                   class="org.eclipse.jetty.server.session.DefaultSessionIdManager"> -->\r
+<!--                   <Arg> -->\r
+<!--                           <Ref refid="Server" /> -->\r
+<!--                   </Arg> -->\r
+<!--                   <Set name="workerName">node1</Set> -->\r
+<!--           </New> -->\r
+<!--   </Set> -->\r
+\r
+       <Set name="handler">\r
+               <New id="Handlers"\r
+                       class="org.eclipse.jetty.server.handler.HandlerCollection">\r
+                       <Set name="handlers">\r
+                               <Array type="org.eclipse.jetty.server.Handler">\r
+                                       <Item>\r
+                                               <New id="Contexts"\r
+                                                       class="org.eclipse.jetty.server.handler.ContextHandlerCollection" />\r
+                                       </Item>\r
+                                       <Item>\r
+                                               <New id="DefaultHandler"\r
+                                                       class="org.eclipse.jetty.server.handler.DefaultHandler" />\r
+                                       </Item>\r
+                               </Array>\r
+                       </Set>\r
+               </New>\r
+       </Set>\r
+</Configure>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/settings/log4j2.xml b/server/-product/production/OMAR/settings/log4j2.xml
new file mode 100644 (file)
index 0000000..5f51452
--- /dev/null
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!DOCTYPE xml>\r
+\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="movTestName">${logPath}/movtest.log</Property>\r
+               <Property name="movTestPattern">${logPath}/$${date:yyyy-MM}/movtest-%d{MM-dd-yyyy}-%i.log.gz</Property>\r
+               <Property name="delete-materials.log">${logPath}/delete-materials.log</Property>\r
+               <Property name="delete-materials.pattern">${logPath}/$${date:yyyy-MM}/delete-materials-%d{MM-dd-yyyy}-%i.log.gz</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="[Media Vivantis] MediaCube rendszerüzenet" to="zombori.mark@mediavivantis.hu,varga-nagy.lajos@mediavivantis.hu,vasary@elgekko.net" from="mediacubeserver@mediavivantis.hu" smtpHost="mediavivantis-hu.mail.protection.outlook.com"\r
+                       smtpPort="25" smtpProtocol="smtp" 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%n A küldő a %F forráskód %L. sorából a %logger{1}.%M függvény volt. %n" />\r
+               </HTMLMailAppender>\r
+               <RollingFile name="movTestName" fileName="${movTestName}" filePattern="${movTestPattern}">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MOVTEST" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %markerSimpleName - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="delete-materials" fileName="${delete-materials.log}" filePattern="${delete-materials.pattern}">\r
+                       <Filters>\r
+                               <MarkerFilter marker="delete-materials.xml" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %markerSimpleName - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile" fileName="${markeredFileName}" filePattern="${markeredFilePattern}">\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 %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
+                       </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
+       </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="MarkeredMail" />-->\r
+                       <AppenderRef ref="movTestName" />\r
+                       <AppenderRef ref="delete-materials" />\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
+\r
+<!--           <logger name="org.jboss.resteasy.core" level="debug" /> -->\r
+<!--           <logger name="org.jboss.resteasy.specimpl" level="debug" /> -->\r
+<!--           <logger name="org.jboss.resteasy.plugins.server" level="debug" /> -->\r
+<!--           <logger name="org.jboss.resteasy.plugins.providers" level="debug" /> -->\r
+<!--           <logger name="user.commons.nexio" level="debug" /> -->\r
+       </Loggers>\r
+</Configuration>
\ No newline at end of file
diff --git a/server/-product/production/OMAR/settings/maestro.yaml b/server/-product/production/OMAR/settings/maestro.yaml
new file mode 100644 (file)
index 0000000..b8091a2
--- /dev/null
@@ -0,0 +1,38 @@
+sourceStoreUri:\r
+  name: Default\r
+  protocol: LOCAL\r
+  uri: "/mnt/NLE"\r
+  fileFilter: "*.mxf"\r
+  showDirectories: true\r
+alternateSourceStoreUris:\r
+- name: NLE1\r
+  protocol: LOCAL\r
+  uri: "/mnt/NLE/NLE1"\r
+  fileFilter: "*.mxf"\r
+  showDirectories: true\r
+- name: NLE2\r
+  protocol: LOCAL\r
+  uri: "/mnt/NLE/NLE2"\r
+  fileFilter: "*.mxf"\r
+  showDirectories: true\r
+- name: NLE3\r
+  protocol: LOCAL\r
+  uri: "/mnt/NLE/NLE3"\r
+  fileFilter: "*.mxf"\r
+  showDirectories: true\r
+- name: NLE4\r
+  protocol: LOCAL\r
+  uri: "/mnt/NLE/NLE4"\r
+  fileFilter: "*.mxf"\r
+  showDirectories: true\r
+- name: POLC\r
+  protocol: LOCAL\r
+  uri: "/mnt/POLC"\r
+  fileFilter: "*.mxf"\r
+  showDirectories: true\r
+targets:\r
+- name: FINISHED_SHOWS\r
+  killDateDays: 7\r
+  storeUri:\r
+    protocol: LOCAL\r
+    uri: "/mnt/PROMISE/FINISHED_SHOWS"\r
diff --git a/server/-product/production/OMAR/settings/mediacube.yaml b/server/-product/production/OMAR/settings/mediacube.yaml
new file mode 100644 (file)
index 0000000..347ca89
--- /dev/null
@@ -0,0 +1,53 @@
+jobQueuePollInterval: 1000\r
+disableHelp: true\r
+maestroDisabled: false\r
+alternateRetrieveSelector: false\r
+disableStatistics: true\r
+disableEditor: false\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
+  defaultUser: root\r
+  defaultPassword: password\r
+  adHost: intra.mediavivantis.hu\r
+  adNonSecurePort: 3268\r
+  adBaseDn: DC=intra,DC=mediavivantis,DC=hu\r
+  adAdminMap:\r
+  - G_MV_U_MUSZAK\r
+  - G_MV_U_INGEST\r
+  adSubmitterMap:\r
+  - G_ECH_U_INFORMATIKUSOK\r
+  - G_ECH_U_MUSZAKVEZETOK\r
+  - ECH-ISILON-ADMINS\r
+  adEditorMap:\r
+  - G_ECH_U_INFORMATIKUSOK\r
+  - G_ECH_U_MUSZAKVEZETOK\r
+  - ECH-ISILON-ADMINS\r
+  localAccounts:\r
+  - user: user\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