git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Thu, 4 Oct 2018 14:46:37 +0000 (14:46 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Thu, 4 Oct 2018 14:46:37 +0000 (14:46 +0000)
18 files changed:
client/Maestro/Configuration/configuration-nle.json
client/Maestro/Configuration/configuration-studio.json
client/Maestro/Sources/NexioRESTSource.cs
client/MaestroShared/Targets/FTPTargetProcessor.cs
client/MaestroShared/Targets/FXPTargetProcessor.cs
client/MaestroShared/Targets/UNCTargetProcessor.cs
server/-configuration/scheduledjobs.json
server/user.jobengine.executors/src/user/jobengine/server/steps/BatchRetrieveForkStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/ImportStatisticsStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/ItemManagerExtensions.java
server/user.jobengine.osgi.db/sql/2-CreateStructure.db2
server/user.jobengine.osgi.db/sql/4-CreateTrigger.db2
server/user.jobengine.osgi.db/src/user/jobengine/db/IItemManager.java
server/user.jobengine.osgi.db/src/user/jobengine/db/ItemManager.java
server/user.jobengine.osgi.server/pages/metadatadetails.zul
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/MetadataDetailsModel.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/NewsHistoryModel.java
server/user.jobengine.osgi.server/test/user/jobengine/server/IT/Support.java

index cacd30fed7008ec49de0d47a022d112146072ec2..8baca8e5c4f7462e6e1a95c04acd6a8847686cd3 100644 (file)
@@ -1,5 +1,5 @@
 {\r
-  "title": "NLE",\r
+  "title": "UNC2FTP_NEXIO_UNC",\r
   "active": true,\r
   "startInTray": false,\r
   "enableCustomMetadataId": true,\r
         "timeout": 1000\r
       }\r
     },\r
-    {\r
-      "label": "Octopus mappába küldés",\r
-      "processor": "FTPTargetProcessor",\r
-      "tag": "Betöltés",\r
-      "outputFormat": "%ID%",\r
-      "subFolderFormat": "%IDROOT%-%TEXT%",\r
-      "killDateDays": 7,\r
-      "saveArchiveMetadata": false,\r
-      "remote": {\r
-        "address": "ftp://10.10.1.100/OCTOPUS",\r
-        "userName": "mediacube",\r
-        "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
-        "timeout": 1000\r
-      }\r
-    },\r
-    {\r
-      "label": "Megtekintőbe küldés",\r
-      "processor": "FTPTargetProcessor",\r
-      "outputFormat": "%ID%-%SOURCENAME%",\r
-      "tag": "Betöltés",\r
-      "subFolderFormat": "%IDROOT%",\r
-      "killDateDays": 7,\r
-      "saveArchiveMetadata": false,\r
-      "remote": {\r
-        "address": "ftp://10.10.1.100/OCTOPUS",\r
-        "userName": "mediacube",\r
-        "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
-        "timeout": 1000\r
-      }\r
-    },\r
-    {\r
-      "label": "Traffic mappába küldés",\r
-      "processor": "FTPTargetProcessor",\r
-      "outputFormat": "%ID%-%SOURCENAME%",\r
-      "tag": "Betöltés",\r
-      "subFolderFormat": "%IDROOT%",\r
-      "killDateDays": 7,\r
-      "saveArchiveMetadata": false,\r
-      "remote": {\r
-        "address": "ftp://10.10.1.100/PLAYOUT_NLE",\r
-        "userName": "mediacube",\r
-        "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
-        "timeout": 1000\r
-      }\r
-    },\r
-    {\r
-      "label": "Lebonyba küldés",\r
-      "processor": "FTPTargetProcessor",\r
-      "outputFormat": "%ID%",\r
-      "tag": "Betöltés",\r
-      "killDateDays": 7,\r
-      "remote": {\r
-        "address": "ftp://10.10.1.100/PLAYOUT_CHECK",\r
-        "userName": "mediacube",\r
-        "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
-        "timeout": 1000\r
-      }\r
-    },\r
     {\r
       "label": "Helyi küldés",\r
       "processor": "UNCTargetProcessor",\r
       "deleteAfterCopy": true,\r
       "temporaryCopy": true,\r
       "remote": {\r
-        "address": "ftp://10.10.1.100/ARCHIVE/ONE",\r
+        "address": "ftp://10.10.1.100/ARCHIVE/TESZT",\r
         "userName": "mediacube",\r
         "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
         "timeout": 1000\r
index 74e6e22766e3b8442d7beb1e411ed152b01271af..c33de9403f96d494394413f284f1b5bdb43c69e1 100644 (file)
@@ -1,5 +1,5 @@
 {\r
-  "title": "Stúdió",\r
+  "title": "NEXIO2UNC_FXP",\r
   "active": true,\r
   "startInTray": false,\r
   "enableCustomMetadataId": true,\r
     }\r
   ],\r
   "targets": [\r
-    {\r
-      "label": "Octopus",\r
-      "processor": "FXPTargetProcessor",\r
-      "outputFormat": "%ID%",\r
-      "tag": "Adáskész",\r
-      "subFolderFormat": "%IDROOT%-%TEXT%",\r
-      "killDateDays": 15,\r
-      "saveArchiveMetadata": false,\r
-      "remote": {\r
-        "address": "ftp://10.10.1.100:21/OCTOPUS",\r
-        "userName": "mediacube",\r
-        "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
-        "timeout": 1000\r
-      }\r
-    },\r
     {\r
       "label": "Archiválás",\r
       "processor": "FXPTargetProcessor",\r
       "outputFormat": "%ID%",\r
       "tag": "Archiválás",\r
       "saveArchiveMetadata": true,\r
+      "deleteAfterCopy":  false,\r
       "remote": {\r
-        "address": "ftp://10.10.1.100:21/ARCHIVE/ONE",\r
+        "address": "ftp://10.10.1.100:21/ARCHIVE/TESZT",\r
         "userName": "mediacube",\r
         "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
         "timeout": 1000\r
index c13bee02eeaafbe5b3a83588f84f3bcbe2d152c0..c3b463efff04d47b0224fc5463d700783ca38d8b 100644 (file)
@@ -285,7 +285,7 @@ namespace Maestro.Sources {
                     });\r
                 });\r
             }\r
-            Debug.WriteLine(string.Format("Changed {0}", item.Name));\r
+            //Debug.WriteLine(string.Format("Changed {0}", item.Name));\r
         }\r
 \r
         private void OnCreated(JToken token) {\r
@@ -301,7 +301,7 @@ namespace Maestro.Sources {
                     Source = parent\r
                 });\r
             });\r
-            Debug.WriteLine(string.Format("Created {0}", item.Name));\r
+            //Debug.WriteLine(string.Format("Created {0}", item.Name));\r
         }\r
 \r
         private void OnDeleted(JToken d) {\r
index 7d7fbd5804d3b93fc4e352ca1b150b6556059e70..a3d909ffef780f5fa1738ce7b7643bfd509a9b7e 100644 (file)
@@ -12,9 +12,9 @@ namespace MaestroShared.Targets {
 \r
     public class FTPTargetProcessor : UNCTargetProcessor {\r
         private const string PATTERN_CONCAT = "{0}{1}";\r
-        private const string _226 = "226";\r
+        protected const string _226 = "226";\r
         protected const string UPLOAD_ERROR = "Feltöltési hiba.";\r
-        private const string _200 = "200";\r
+        protected const string _200 = "200";\r
         private const string SITE0011 = "SITE 0011";\r
         private const string _1211 = "1211";\r
         private readonly Logger logger = LogManager.GetCurrentClassLogger();\r
@@ -168,7 +168,7 @@ namespace MaestroShared.Targets {
                 InternetProtocolVersions = FtpIpVersion.IPv4,\r
                 UploadDataType = FtpDataType.Binary,\r
                 DownloadDataType = FtpDataType.Binary,\r
-                Credentials = new NetworkCredential(connection.UserName, connection.Password)\r
+                Credentials = new NetworkCredential(connection.UserName, connection.Password),\r
             };\r
             result.Connect();\r
             return result;\r
index e1ee7d3e1c0b92d2903548224b165c8e0cfa31c6..8882da739f0749e634c9763c82fe09c2de030b04 100644 (file)
@@ -4,13 +4,18 @@ using MaestroShared.Target;
 using NLog;\r
 using System;\r
 using System.IO;\r
+using System.Linq;\r
+using System.Text;\r
 using System.Text.RegularExpressions;\r
 using System.Threading;\r
 using System.Windows.Forms;\r
+using System.Xml;\r
+using System.Xml.Linq;\r
 \r
 namespace MaestroShared.Targets {\r
 \r
     public class FXPTargetProcessor : FTPTargetProcessor {\r
+        protected const string DOWNLOAD_ERROR = "Letöltési hiba.";\r
         private const string LITERAL_SPACE = "%20";\r
         private const string SPACE = " ";\r
         private Logger logger = LogManager.GetCurrentClassLogger();\r
@@ -48,98 +53,117 @@ namespace MaestroShared.Targets {
             try {\r
                 sourceFTP = CreateClient(sourceConfig.Remote);\r
 \r
-                string input = Uri.UnescapeDataString(inputUri.AbsolutePath);\r
-                sourceFileLength = sourceFTP.GetFileSize(input);\r
-                bool nexioTarget = IsNexioServer(targetFTP);\r
-                if (nexioTarget)\r
-                    sourceFileLength = sourceFileLength / 2;\r
+                Input = Uri.UnescapeDataString(inputUri.AbsolutePath);\r
+                if (Input.LastIndexOf("/") == 0)\r
+                    Input = Input.Replace("/", "");\r
+                sourceFileLength = sourceFTP.GetFileSize(Input);\r
 \r
-                FtpReply replyPASV = targetFTP.Execute("PASV");\r
-                if (!replyPASV.Success)\r
-                    throw new Exception(replyPASV.ErrorMessage);\r
+                bool isNexioSource = sourceFTP.IsNexio();\r
+                //Nexio eseten frame-eket kerdunk le\r
+                if (isNexioSource)\r
+                    sourceFileLength = GetNexioLength();\r
 \r
-                Regex regex = new Regex(Regex.Escape("(") + "(.*)" + Regex.Escape(")"));\r
-                var v = regex.Match(replyPASV.Message);\r
-                string port = v.Groups[1].ToString();\r
+                string port = targetFTP.Pasv();\r
+                sourceFTP.Command("PORT " + port);\r
 \r
-                FtpReply replyPORT = sourceFTP.Execute("PORT " + port);\r
-                if (!replyPORT.Success)\r
-                    throw new Exception(replyPORT.ErrorMessage);\r
-\r
-                FtpReply sourceReplyTYPE = sourceFTP.Execute("TYPE I");\r
-                if (!sourceReplyTYPE.Success)\r
-                    throw new Exception(sourceReplyTYPE.ErrorMessage);\r
-\r
-                if (input.LastIndexOf("/") == 0)\r
-                    input = input.Replace("/", "");\r
-                FtpReply replyRETR = sourceFTP.Execute("RETR " + input);\r
+                sourceFTP.Command("TYPE I");\r
+                FtpReply replyRETR = sourceFTP.Execute("RETR " + Input);\r
 \r
+                //TODO nem lehet jobb?\r
                 if (!replyRETR.Success) {\r
-                    input = inputUri.Segments[inputUri.Segments.Length - 1];\r
-                    input = input.Replace("%20", " ");\r
-                    replyRETR = sourceFTP.Execute("RETR " + input);\r
-\r
+                    Input = inputUri.Segments[inputUri.Segments.Length - 1];\r
+                    Input = Input.Replace("%20", " ");\r
+                    replyRETR = sourceFTP.Execute("RETR " + Input);\r
                     if (!replyRETR.Success)\r
                         throw new Exception(replyRETR.ErrorMessage);\r
                 }\r
 \r
-                FtpReply targetReplyTYPE = targetFTP.Execute("TYPE I");\r
-                if (!targetReplyTYPE.Success)\r
-                    throw new Exception(targetReplyTYPE.ErrorMessage);\r
+                targetFTP.Command("TYPE I");\r
 \r
                 string currentWorkingDir = targetFTP.GetWorkingDirectory();\r
                 logger.Debug("Current target working directory is {0}", currentWorkingDir);\r
 \r
-                bool useTemporaryName = !nexioTarget && Parameters.TargetConfig.TemporaryCopy;\r
                 string targetFilePath = OutputName;\r
+                bool useTemporaryName = !targetFTP.IsNexio() && Parameters.TargetConfig.TemporaryCopy;\r
                 if (useTemporaryName)\r
                     targetFilePath = OutputName + ".tmp";\r
 \r
-                FtpReply replySTOR = targetFTP.Execute("STOR " + targetFilePath);\r
-                if (!replySTOR.Success)\r
-                    throw new Exception(replySTOR.ErrorMessage);\r
-\r
-                monitorFTP = CreateClient(Parameters.TargetConfig.Remote);\r
-                monitorFTP.SetWorkingDirectory(workingDir);\r
-                FtpReply monitorReplyTYPE = monitorFTP.Execute("TYPE I");\r
-                if (!monitorReplyTYPE.Success)\r
-                    throw new Exception(targetReplyTYPE.ErrorMessage);\r
-                //if (!FileExists(OutputName))\r
-                //    throw new Exception("A cél állomány nem jött létre.");\r
-                long lastSize = 0;\r
+                targetFTP.Command("STOR " + targetFilePath);\r
+\r
+                if (!isNexioSource) {\r
+                    monitorFTP = CreateClient(Parameters.TargetConfig.Remote);\r
+                    monitorFTP.SetWorkingDirectory(workingDir);\r
+                    monitorFTP.Command("TYPE I");\r
+                }\r
+\r
                 while (uploadedFileLength != sourceFileLength) {\r
-                    uploadedFileLength = monitorFTP.GetFileSize(OutputName);\r
-                    /*\r
-                    FtpReply statRETR = sourceFTP.Execute("STAT");\r
-                    if (!statRETR.Success)\r
-                        Debug.WriteLine($"Overall {overall}, last {lastSize}");\r
-                    else\r
-                        Debug.WriteLine($"Overall {overall}, last {lastSize} site {statRETR.Message}");\r
-*/\r
-                    if (uploadedFileLength == lastSize && uploadedFileLength > 0) {\r
-                        Progress = 100;\r
-                        break;\r
+                    if (isNexioSource) {\r
+                        string response = sourceFTP.Command("STAT");\r
+                        logger.Info("Monitor: " + response);\r
+                        if (response.EndsWith("No System Status") || response.EndsWith("Transfer Complete(TRANSACTION_SUCCESS)")) {\r
+                            Progress = 100;\r
+                            break;\r
+                        }\r
+                        if (!response.Contains("Fields Transferred"))\r
+                            throw new Exception($"Unsopported STAT response: {response}");\r
+                        long.TryParse(response.Replace("STAT Fields Transferred", "").Trim(), out uploadedFileLength);\r
+\r
+                        logger.Info($"Progress {uploadedFileLength} / {sourceFileLength}");\r
+\r
                     } else {\r
-                        int currentProgress = (int)((double)uploadedFileLength / sourceFileLength * 100);\r
-                        Progress = currentProgress > 100 ? 100 : currentProgress;\r
-                        lastSize = uploadedFileLength;\r
+                        uploadedFileLength = monitorFTP.GetFileSize(targetFilePath);\r
                     }\r
-                    Thread.Sleep(1000);\r
+                    Progress = (int)((double)uploadedFileLength / sourceFileLength * 100);\r
+                    Thread.Sleep(500);\r
                 }\r
                 if (useTemporaryName) {\r
                     if (!targetFTP.MoveFile(targetFilePath, OutputName))\r
                         throw new Exception(UPLOAD_ERROR);\r
                 }\r
-            }\r
-            catch (Exception e) {\r
+            } catch (Exception e) {\r
                 throw e;\r
             }\r
 \r
             //logger.Debug("Done");\r
         }\r
 \r
+        public static String ReadFully(Stream input) {\r
+            byte[] buffer = new byte[1024];\r
+            using (MemoryStream ms = new MemoryStream()) {\r
+                int read;\r
+                while ((read = input.Read(buffer, 0, buffer.Length)) > 0) {\r
+                    ms.Write(buffer, 0, read);\r
+                }\r
+                return ms.ToString();\r
+            }\r
+        }\r
+\r
+        private long GetNexioLength() {\r
+            long result = 0;\r
+            string xml = Input.Replace(".MXF", ".XML");\r
+            using (MemoryStream ms = new MemoryStream()) {\r
+                try {\r
+                    //Binary modban lekerdezi a meretet, ez nem tamogatott\r
+                    sourceFTP.DownloadDataType = FtpDataType.ASCII;\r
+                    if (!sourceFTP.Download(ms, xml))\r
+                        throw new Exception(DOWNLOAD_ERROR);\r
+                    //a Unicode BOM 2 byte\r
+                    ms.Seek(2, SeekOrigin.Begin);\r
+                    XDocument xdoc = XDocument.Load(ms);\r
+                    long.TryParse(xdoc.Descendants("Duration").Single().Value, out result);\r
+                    result *= 2;\r
+                } catch (Exception e) {\r
+                    logger.Error(e.Message);\r
+                    throw e;\r
+                } finally {\r
+                    sourceFTP.DownloadDataType = FtpDataType.Binary;\r
+                }\r
+            }\r
+            return result;\r
+        }\r
+\r
         protected override void ValidateTransfer() {\r
-            if (!IsNexioServer(sourceFTP) && !IsNexioServer(monitorFTP)) {\r
+            if (!targetFTP.IsNexio() && !sourceFTP.IsNexio()) {\r
                 if (sourceFileLength != uploadedFileLength)\r
                     throw new Exception(COPY_SIZE_ERROR);\r
             }\r
@@ -151,6 +175,51 @@ namespace MaestroShared.Targets {
             TerminateClient(sourceFTP);\r
         }\r
 \r
+        protected bool FileExists(FtpClient client, string path) {\r
+            long x = -1;\r
+            try {\r
+                x = client.GetFileSize(path);\r
+            } catch (Exception e) {\r
+                logger.Warn(e.Message);\r
+            }\r
+            return x > -1;\r
+        }\r
+\r
+        protected override void DeleteAfterCopy() {\r
+            logger.Debug("Deleting source: " + Input);\r
+            try {\r
+                if (FileExists(sourceFTP, Input))\r
+                    sourceFTP.DeleteFile(Input);\r
+            } catch (Exception e) {\r
+                logger.Error(e.Message);\r
+            }\r
+        }\r
+\r
+    }\r
+\r
+    public static class FtpClientExtensions {\r
+        public static String Command(this FtpClient client, String command) {\r
+            FtpReply response = client.Execute(command);\r
+            if (!response.Success)\r
+                throw new Exception($"Error executing {command}. Error message: {response.ErrorMessage}");\r
+            return response.Message;\r
+        }\r
+\r
+        public static String Pasv(this FtpClient client) {\r
+            String pasv = client.Command("PASV");\r
+            Regex regex = new Regex(Regex.Escape("(") + "(.*)" + Regex.Escape(")"));\r
+            return regex.Match(pasv).Groups[1].ToString();\r
+        }\r
+\r
+        public static bool IsNexio(this FtpClient client) {\r
+            bool result = false;\r
+            try {\r
+                //Device Type lekerdezese\r
+                string response = client.Command("SITE 0011");\r
+                result = response.Contains("1211");\r
+            } catch { }\r
+            return result;\r
+        }\r
 \r
     }\r
 }\r
index 77615dfc3f3daddbed578445bb632fa5de06f512..3a111c55416ea3d8ed7caab2366e897f88136053 100644 (file)
@@ -93,6 +93,8 @@ namespace MaestroShared.Targets {
                     Status = READY;\r
                     Message = SUCCESS;\r
                 }\r
+                if (Parameters.TargetConfig.DeleteAfterCopy)\r
+                    DeleteAfterCopy();\r
 \r
                 ExecuteCompleted();\r
             }\r
@@ -263,17 +265,6 @@ namespace MaestroShared.Targets {
         }\r
 \r
         protected virtual void AfterExecute() {\r
-\r
-            if (Parameters.SourceConfig is UNCSource && Parameters.TargetConfig.DeleteAfterCopy) {\r
-                logger.Debug("Deleting source: " + Input);\r
-                try {\r
-                    if (FileExists(inputFile.FullName))\r
-                        DeleteFile(inputFile.FullName);\r
-                } catch (Exception e) {\r
-                    logger.Error(e.Message);    \r
-                }\r
-            }\r
-\r
             logger.Trace(Strings.ENTRY);\r
             Finished = DateTime.Now;\r
             workFlowAction.finished = Finished;\r
@@ -282,6 +273,16 @@ namespace MaestroShared.Targets {
             logger.Trace(Strings.EXIT);\r
         }\r
 \r
+        protected virtual void DeleteAfterCopy() {\r
+            logger.Debug("Deleting source: " + Input);\r
+            try {\r
+                if (Parameters.SourceConfig is UNCSource && FileExists(inputFile.FullName))\r
+                    DeleteFile(inputFile.FullName);\r
+            } catch (Exception e) {\r
+                logger.Error(e.Message);\r
+            }\r
+        }\r
+\r
         protected virtual bool FileExists(string path) {\r
             return File.Exists(path);\r
         }\r
index b39af79174bcc4c4c5ee9e65081cb29fc0d8a9b0..2a8407b760b33beac065b065977fce081d1d1874 100644 (file)
@@ -17,8 +17,8 @@
          "name" : "SYS: retrieve-ondemand",\r
       "template": "retrieve-ondemand.xml",\r
       "parameters": [ \r
-       {"name": "globalRetrievePath", "value": "file://isilon.intra.echotv.hu", "type": "java.lang.String"},\r
-       {"name": "localRetrievePath", "value": "/mnt/ISILON", "type": "java.lang.String"},\r
+       {"name": "globalRetrievePath", "value": "c:\\temp", "type": "java.lang.String"},\r
+       {"name": "localRetrievePath", "value": "c:\\temp", "type": "java.lang.String"},\r
        {"name": "materialOutputFolder", "value": "PLAYOUT_NLE", "type": "java.lang.String"},\r
        {"name": "promoOutputFolder", "value": "PROMO_NLE", "type": "java.lang.String"},\r
        {"name": "advertisementOutputFolder", "value": "REKLAM_NLE", "type": "java.lang.String"},\r
@@ -64,7 +64,7 @@
       "template": "import-statistics.xml",\r
       "cronexpression": "0 0 0/1 1/1 * ? *",\r
       "parameters": [ \r
-       {"name": "daysBeforeNow", "value": 5, "type": "java.lang.Integer"}\r
+       {"name": "daysBeforeNow", "value": 7, "type": "java.lang.Integer"}\r
       ]\r
        },\r
        {\r
index cf2bc4dfc90ef888c4a3692d9422eae68624b9a8..101e9047f1020843a652b60b0cb5679e109b9a06 100644 (file)
@@ -19,23 +19,28 @@ public class BatchRetrieveForkStep extends JobStep {
        private static final String MEDIACUBEMEDIA = "mediaCubeMedia";\r
        private static final String RECIPIENT = "successRecipient";\r
        private static final String HOUSEID = "houseId";\r
-       private MediaCubeMarker marker;\r
+       private MediaCubeMarker systemMarker;\r
 \r
        @StepEntry\r
        public Object[] execute(List<Media> basket, String houseId, String recipient, String targetPathType, IJobEngine jobEngine, IJobRuntime jobRuntime)\r
                        throws Exception {\r
-               marker = (MediaCubeMarker) jobRuntime.getMarker();\r
-               marker.setTo(recipient);\r
+               systemMarker = (MediaCubeMarker) jobRuntime.getMarker();\r
+               systemMarker.setTo(recipient);\r
 \r
                if (basket == null || basket.size() == 0)\r
                        return null;\r
                setProgress(10);\r
+\r
+               //              StringBuilder sb = new StringBuilder();\r
+               //              sb.append("A visszatöltések elindultak az alábbi állományokra:</br>");\r
                if (jobRuntime.forkPrepare()) {\r
                        for (Media mediaCubeMedia : basket) {\r
+                               //                              sb.append(mediaCubeMedia.getMediaFilesName() + "</br>");\r
                                submit(mediaCubeMedia, recipient, houseId, targetPathType, jobEngine, jobRuntime);\r
                        }\r
                }\r
                setProgress(50);\r
+               //              logger.info(new MediaCubeMarker(recipient), sb.toString());\r
                jobRuntime.forkWaitComplete();\r
                setProgress(100);\r
                return null;\r
@@ -54,7 +59,7 @@ public class BatchRetrieveForkStep extends JobStep {
                        ((MediaCubeMarker) child.getMarker()).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
+                       logger.error(systemMarker, "Hiba a kötegelt visszatöltésben. A rendszer üzenete: {}", e.getMessage());\r
                }\r
 \r
        }\r
index ad00be9a05d174db833a85cfef72ca47ba1b5ab0..0ac754233a66c89b226d36d0a9901f3e373c43ee 100644 (file)
@@ -198,7 +198,8 @@ public class ImportStatisticsStep extends JobStep {
                                        BasicDBObject clip = (BasicDBObject) clipCollection.findOne(new BasicDBObject(LONGNAMEID, clipName));\r
                                        if (clip != null) {\r
                                                long duration = NoSQLUtils.asLong(clip, DURATION);\r
-                                               if (duration > 0) {\r
+                                               //az ures klipp 1 kocka hosszu\r
+                                               if (duration > 1) {\r
                                                        mosObject.put("duration", duration);\r
                                                        foundAnyClip = true;\r
                                                }\r
@@ -271,6 +272,8 @@ public class ImportStatisticsStep extends JobStep {
                                        continue;\r
 \r
                                long parentStoryId = NoSQLUtils.asLong(story, IOctopusAPI.PARENT_STORY_ID);\r
+                               logger.info("Processing parentStoryId {}", parentStoryId);\r
+\r
                                String key = String.format("%d-%s", parentStoryId, objId);\r
                                if (processed.contains(key))\r
                                        continue;\r
@@ -316,7 +319,7 @@ public class ImportStatisticsStep extends JobStep {
                                        NoSQLUtils.addLong(perReporterStat, "ingest_duration", ingestDuration);\r
                                }\r
 \r
-                               BasicDBObject archiveInfo = manager.getArchiveInfo(scheduledDate, String.valueOf(parentStoryId));\r
+                               BasicDBObject archiveInfo = ItemManagerExtensions.getArchiveInfo(manager, parentStoryId);\r
                                if (archiveInfo != null) {\r
                                        long archiveCount = archiveInfo.getLong("count");\r
                                        long archiveDuration = archiveInfo.getLong("duration");\r
index 6cc8a3169e913bc120b2fbb970e4b3cd99b6e395..2e6852d2430e513412183dc510a6878220a90222 100644 (file)
@@ -1,10 +1,31 @@
 package user.jobengine.server.steps;\r
 \r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
 import user.jobengine.db.IItemManager;\r
 import user.jobengine.db.IResultSetConsumer;\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 = { 0 };\r
                StringBuilder query = new StringBuilder();\r
index fc42b36d242bcb07a1fab89b465212c603e17aef..21ff860c6b65a8f912b0201df0cf5ec0ff71e3b1 100644 (file)
@@ -385,3 +385,35 @@ CREATE TABLE WORKFLOWACTION
 CREATE INDEX IDX_WORKFLOWACTION_FINISHED ON WORKFLOWACTION ("FINISHED")@\r
 CREATE INDEX IDX_WORKFLOWACTION_HOUSEID ON WORKFLOWACTION ("HOUSEID")@\r
 \r
+\r
+CREATE TABLE MEDIADESCRIPTION  ( \r
+       ID              BIGINT GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, CACHE 20) NOT NULL,\r
+       ITEMID          BIGINT NOT NULL,\r
+       MEDIAID         BIGINT NOT NULL,\r
+       MEDIAFILEID     BIGINT NOT NULL,\r
+       DESCRIPTION     CLOB(400000) NOT LOGGED COMPACT,\r
+       CONSTRAINT PK_MEDIADESCRIPTION PRIMARY KEY(ID)\r
+)\r
+@\r
+\r
+ALTER TABLE DB2ADMIN.MEDIADESCRIPTION\r
+       ADD CONSTRAINT FK_MEDIADESCRIPTION_MEDIAID\r
+       FOREIGN KEY(MEDIAID)\r
+       REFERENCES DB2ADMIN.MEDIA(ID)\r
+       ON DELETE CASCADE\r
+       ON UPDATE NO ACTION \r
+@\r
+ALTER TABLE DB2ADMIN.MEDIADESCRIPTION\r
+       ADD CONSTRAINT FK_MEDIADESCRIPTION_MEDIAFILEID\r
+       FOREIGN KEY(MEDIAFILEID)\r
+       REFERENCES DB2ADMIN.MEDIAFILE(ID)\r
+       ON DELETE CASCADE \r
+       ON UPDATE NO ACTION \r
+@\r
+ALTER TABLE DB2ADMIN.MEDIADESCRIPTION\r
+       ADD CONSTRAINT FK_MEDIADESCRIPTION_ITEMID\r
+       FOREIGN KEY(ITEMID)\r
+       REFERENCES DB2ADMIN.ITEM(ID)\r
+       ON DELETE CASCADE       \r
+       ON UPDATE NO ACTION \r
+@\r
index e734f3871c88676f2c0e61a61078acde91e550db..ce9888c0723701317c84f86536fd16982e9b8965 100644 (file)
 -- execute with \r
 --     db2 -td@ -vmf 2-CreateStructure.db2\r
 \r
-DROP TRIGGER TRG_INSERT_ITEM@\r
+--DROP TRIGGER TRG_INSERT_ITEM@\r
 \r
-CREATE TRIGGER TRG_INSERT_ITEM\r
-        AFTER INSERT ON ITEM\r
-        REFERENCING NEW AS r\r
-        FOR EACH ROW\r
-BEGIN ATOMIC\r
-       DECLARE x VARCHAR(255);\r
-       CALL SYSPROC.SYSTS_UPDATE(NULL, 'item_title',  NULL, 'hu_HU', :x);\r
-       CALL SYSPROC.SYSTS_UPDATE(NULL, 'item_desc',  NULL, 'hu_HU', :x);\r
-       CALL SYSPROC.SYSTS_UPDATE(NULL, 'item_houseid',  NULL, 'hu_HU', :x);\r
-END\r
-@\r
+--CREATE TRIGGER TRG_INSERT_ITEM\r
+        --AFTER INSERT ON ITEM\r
+        --REFERENCING NEW AS r\r
+        --FOR EACH ROW\r
+--BEGIN ATOMIC\r
+--     DECLARE x VARCHAR(255);\r
+--     CALL SYSPROC.SYSTS_UPDATE(NULL, 'item_title',  NULL, 'hu_HU', :x);\r
+--     CALL SYSPROC.SYSTS_UPDATE(NULL, 'item_desc',  NULL, 'hu_HU', :x);\r
+--     CALL SYSPROC.SYSTS_UPDATE(NULL, 'item_houseid',  NULL, 'hu_HU', :x);\r
+--END\r
+--@\r
+\r
+\r
+CREATE TRIGGER DB2ADMIN.TRG_MEDIAFILE_AFTER_INSERT after insert\r
+on mediafile\r
+referencing new as n\r
+for each row\r
+when (n.storeid = 1)\r
+begin atomic\r
+    insert into mediadescription (itemid, mediaid, mediafileid, description)\r
+    select \r
+        itemid,\r
+        mediaid, \r
+        mediafileid,\r
+        COALESCE(hundate(archived), '') concat ' ' \r
+        concat COALESCE(defdate(archived), '') concat ' ' \r
+        concat COALESCE(itemhouseid, '') concat ' ' \r
+        concat COALESCE(itemtitle, '') concat ' ' \r
+        concat COALESCE(itemdescription,'') concat ' ' \r
+        concat COALESCE(mediahouseid, '') concat ' ' \r
+        concat COALESCE(mediatitle, '') concat ' ' \r
+        concat COALESCE(mediadescription, '') concat ' ' \r
+        concat COALESCE(mediafilehouseid, '')\r
+    from vw_items_description \r
+    where mediafileid = n.id;\r
+end\r
+GO\r
+\r
+CREATE TRIGGER DB2ADMIN.TRG_MEDIAFILE_AFTER_UPDATE after update of HOUSEID\r
+on mediafile\r
+referencing new as n\r
+for each row\r
+when (n.storeid = 1)\r
+begin atomic\r
+    update mediadescription set description = (\r
+    select \r
+        COALESCE(hundate(archived), '') concat ' ' \r
+        concat COALESCE(defdate(archived), '') concat ' ' \r
+        concat COALESCE(itemhouseid, '') concat ' ' \r
+        concat COALESCE(itemtitle, '') concat ' ' \r
+        concat COALESCE(itemdescription,'') concat ' ' \r
+        concat COALESCE(mediahouseid, '') concat ' ' \r
+        concat COALESCE(mediatitle, '') concat ' ' \r
+        concat COALESCE(mediadescription, '') concat ' ' \r
+        concat COALESCE(mediafilehouseid, '')\r
+    from vw_items_description \r
+    where mediafileid = n.id);\r
+end\r
+GO\r
+\r
+CREATE TRIGGER DB2ADMIN.TRG_MEDIA_AFTER_UPDATE after update on media\r
+referencing new as n\r
+for each row\r
+begin atomic\r
+    update mediadescription set description = (\r
+    select \r
+        COALESCE(hundate(archived), '') concat ' ' \r
+        concat COALESCE(defdate(archived), '') concat ' ' \r
+        concat COALESCE(itemhouseid, '') concat ' ' \r
+        concat COALESCE(itemtitle, '') concat ' ' \r
+        concat COALESCE(itemdescription,'') concat ' ' \r
+        concat COALESCE(mediahouseid, '') concat ' ' \r
+        concat COALESCE(mediatitle, '') concat ' ' \r
+        concat COALESCE(mediadescription, '') concat ' ' \r
+        concat COALESCE(mediafilehouseid, '')\r
+    from vw_items_description \r
+    where mediaid = n.id);\r
+end\r
+GO\r
+\r
+CREATE TRIGGER DB2ADMIN.TRG_ITEM_AFTER_UPDATE after update on item\r
+referencing new as n\r
+for each row\r
+begin atomic\r
+    update mediadescription set description = (\r
+    select \r
+        COALESCE(hundate(archived), '') concat ' ' \r
+        concat COALESCE(defdate(archived), '') concat ' ' \r
+        concat COALESCE(itemhouseid, '') concat ' ' \r
+        concat COALESCE(itemtitle, '') concat ' ' \r
+        concat COALESCE(itemdescription,'') concat ' ' \r
+        concat COALESCE(mediahouseid, '') concat ' ' \r
+        concat COALESCE(mediatitle, '') concat ' ' \r
+        concat COALESCE(mediadescription, '') concat ' ' \r
+        concat COALESCE(mediafilehouseid, '')\r
+    from vw_items_description \r
+    where itemid = n.id);\r
+end\r
+GO\r
index a33535370ab7802bcffe7ff6d31454ab2e40f3f8..9f4fa388e3d54df45506e89158238eab52f4e3a8 100644 (file)
@@ -128,8 +128,6 @@ public interface IItemManager extends IEntityPersister {
         */\r
        List<IEntityBase> getAllCached(Class<? extends IEntityBase> baseClass);\r
 \r
-       BasicDBObject getArchiveInfo(Calendar scheduleDate, String houseId);\r
-\r
        /**\r
         * Visszaadja az entitásnak megfelelő DAO objektumot.\r
         *\r
index 2c1c95ab4ede05f0330fd39b7a8bd7fa49cd1fc4..2824fe2c162f55892cedd47c3033ce015ffd3866 100644 (file)
@@ -484,51 +484,6 @@ public class ItemManager extends MemoryCache implements IItemManager {
                return result;\r
        }\r
 \r
-       @Override\r
-       public BasicDBObject getArchiveInfo(Calendar scheduleDate, String houseId) {\r
-               BasicDBObject result = null;\r
-               ResultSet rs = null;\r
-               PreparedStatement st = null;\r
-               DefaultContext context = getDbContext();\r
-               Connection connection = context.getConnection();\r
-               SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");\r
-               try {\r
-                       String date = df.format(scheduleDate.getTime());\r
-                       String query = String.format(\r
-                                       "SELECT COUNT(*) as count, SUM(length) as duration FROM VW_ITEMS WHERE mediahouseid='%s' AND archived LIKE '%s%%' GROUP BY mediahouseid",\r
-                                       houseId, date);\r
-                       st = connection.prepareStatement(query);\r
-                       rs = st.executeQuery();\r
-                       if (rs.next()) {\r
-                               result = new BasicDBObject();\r
-                               result.put("count", rs.getLong("count"));\r
-                               result.put("duration", rs.getLong("duration"));\r
-                       }\r
-\r
-                       connection.commit();\r
-               } catch (Exception e) {\r
-                       try {\r
-                               connection.rollback();\r
-                       } catch (Exception e1) {\r
-                       }\r
-                       throwError(e);\r
-               } finally {\r
-                       try {\r
-                               if (rs != null)\r
-                                       rs.close();\r
-                       } catch (Exception e1) {\r
-                       }\r
-                       try {\r
-                               if (st != null)\r
-                                       st.close();\r
-                       } catch (Exception e1) {\r
-                       }\r
-                       putDbContext(context);\r
-               }\r
-\r
-               return result;\r
-       }\r
-\r
        @Override\r
        public IEntityBaseDAO getBaseDAO(Class<? extends IEntityBase> classInfo) {\r
                IEntityBaseDAO entityBaseDb = null;\r
index 8a578d5709822c86b00d321663ebf9d25dab7de1..2ac116336f33a66dd0a82c488de9198cb7527d3a 100644 (file)
@@ -50,7 +50,7 @@
                                        </listitem>\r
                                        <listitem id="item_description">\r
                                                <listcell label="Anyag leírása" />\r
-                                               <listcell><textbox rows="6" disabled="true" width="99%" value="@load(vm.archivedMedia.item.description)"></textbox></listcell>\r
+                                               <listcell><textbox rows="6" inplace="true" width="99%" value="@load(vm.archivedMedia.item.description) @save(vm.archivedMedia.item.description,before='save')"></textbox></listcell>\r
                                        </listitem>\r
                                        <listitem id="media_houseid">\r
                                                <listcell label="Média azonosítója:" />\r
index 32ab33f09cc3b4835043d7ea071a2513fbddf2bd..1e413dbe1f7074ae54a67ea4e039d2f0f5d62a7c 100644 (file)
@@ -99,8 +99,9 @@ public class MetadataDetailsModel extends BaseModel {
 \r
        @Command\r
        public void save() {\r
+               manager.modify(archivedMedia.getItem());\r
                manager.modify(archivedMedia.getMedia());\r
-               logger.info("Metadat of media was updated by user, id of media: {}", archivedMedia.getMedia().getHouseId());\r
+               logger.info("Metadata modified: {}", archivedMedia.getMedia().getId());\r
                wnd.detach();\r
        }\r
 \r
index c52e3af2f2fdb02a45dcf9cb4865ac8250df5293..ee5fc66bf281f2bc0db60b77a1efd9b8a0b6975c 100644 (file)
@@ -83,16 +83,17 @@ public class NewsHistoryModel {
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");\r
                StringBuilder data = new StringBuilder();\r
 \r
-               boolean headeradded = false;\r
+               for (String column : columnList) {\r
+                       data.append(column).append(";");\r
+               }\r
+               data.append("\r\n");\r
+\r
                for (BasicDBObject o : dataList) {\r
-                       if (!headeradded) {\r
-                               for (String key : o.keySet())\r
-                                       data.append(key).append(";");\r
-                               data.append("\r\n");\r
-                               headeradded = true;\r
+                       for (String column : columnList) {\r
+                               String columnData = NoSQLUtils.asString(o, column);\r
+                               columnData = columnData == null ? "" : columnData;\r
+                               data.append(columnData).append(";");\r
                        }\r
-                       for (String key : o.keySet())\r
-                               data.append(o.getString(key)).append(";");\r
                        data.append("\r\n");\r
                }\r
 \r
index 262abe82bae32921326d7fd1680d9321c88969a8..62074d692e4797e451d82790d78a334ef14d4d48 100644 (file)
@@ -362,7 +362,7 @@ public class Support {
        }\r
 \r
        private void processLowresDuplicateGroup(String fileName) {\r
-               System.out.println("*** Processing: " + fileName);\r
+               //System.out.println("*** Processing: " + fileName);\r
                String query = "select mediafileid, mediafilehouseid, relativepath from vw_items_rd_lh where filename = ?";\r
                IStatementDecorator decorator = st -> {\r
                        st.setString(1, fileName);\r
@@ -376,7 +376,7 @@ public class Support {
                        String mediaFileHouseId = rs.getString("mediafilehouseid");\r
                        if (masterMediaFile[0] == null) {\r
                                masterMediaFile[0] = mediaFile;\r
-                               System.out.println("Skipping: " + mediaFileHouseId);\r
+                               //System.out.println("Skipping: " + mediaFileHouseId);\r
                                return true;\r
                        }\r
 \r
@@ -385,7 +385,7 @@ public class Support {
 \r
                        File file = Paths.get(LOWRES_ROOT, path).toFile();\r
                        duplicateLength[0] += file.length();\r
-                       System.out.println("Inspecting: " + mediaFileHouseId + " now available " + duplicateLength[0]);\r
+                       //System.out.println("Inspecting: " + mediaFileHouseId + " now available " + duplicateLength[0]);\r
                        return true;\r
                };\r
                manager.executeQuery(query, consumer, decorator);\r
@@ -393,14 +393,24 @@ public class Support {
 \r
        @Test\r
        public void processLowresDuplicates() {\r
-               String query = "select filename from vw_items_rd_dup order by filecount";\r
-               IResultSetConsumer consumer = rs -> {\r
+               long count[] = { 0, 0 };\r
+               manager.executeQuery("select count(filecount) from vw_items_rd_dup", rs -> {\r
+                       count[0] = rs.getLong(1);\r
+                       return false;\r
+               }, null);\r
+\r
+               int progress[] = { 0, 0 };\r
+               manager.executeQuery("select filename from vw_items_rd_dup order by filecount desc", rs -> {\r
                        String fileName = rs.getString("filename");\r
                        processLowresDuplicateGroup(fileName);\r
+                       count[1]++;\r
+                       progress[1] = (int) ((double) count[1] * 100 / count[0]);\r
+                       if (progress[1] > progress[0]) {\r
+                               progress[0] = progress[1];\r
+                       }\r
+                       System.out.println("Completed " + progress[0] + " " + count[1] + "/" + count[0] + " available " + duplicateLength[0]);\r
                        return true;\r
-               };\r
-               manager.executeQuery(query, consumer, null);\r
-               System.out.println("Available will " + duplicateLength[0]);\r
+               }, null);\r
        }\r
 \r
        @Test\r