git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Thu, 8 Feb 2018 15:04:12 +0000 (15:04 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Thu, 8 Feb 2018 15:04:12 +0000 (15:04 +0000)
23 files changed:
client/Maestro/Configuration/-configuration-sxs.json [moved from client/Maestro/Configuration/configuration-sxs.json with 81% similarity]
client/Maestro/Configuration/configuration-grafika.json [new file with mode: 0644]
client/Maestro/Configuration/configuration-grafika1.json [new file with mode: 0644]
client/Maestro/Configuration/global.json
client/Maestro/Configuration/global.json.bak [new file with mode: 0644]
client/Maestro/Maestro.csproj
client/Maestro/Program.cs
client/Maestro/Properties/AssemblyInfo.cs
client/MaestroShared/MaestroShared.csproj
client/MaestroShared/Targets/Strings.cs [new file with mode: 0644]
client/MaestroShared/Targets/UNCTargetProcessor.cs
client/PlanAIRClient/TrafficIDSelector.cs
client/PlanAIRClient/Workers/MaterialWorker.cs
server/user.jobengine.executors/src/user/jobengine/server/steps/ImportMORPHEUSMissingMaterialsStep.java
server/user.jobengine.osgi.commons/test/user/common/octopus/test/OctopusDataMinerTest.java
server/user.jobengine.osgi.server/pages/missingmaterials.zul
server/user.jobengine.osgi.server/src/user/jobengine/server/scheduler/ScheduledJob.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/AsyncBaseModel.java [new file with mode: 0644]
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/JobListModel.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/JobSelectorModel.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/MissingMaterialsModel.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/UITask.java [new file with mode: 0644]
server/user.jobengine.osgi.server/src/user/jobengine/zk/util/SessionUtil.java

similarity index 81%
rename from client/Maestro/Configuration/configuration-sxs.json
rename to client/Maestro/Configuration/-configuration-sxs.json
index b0c683f5bca2d3b7df8db2a2dee1bf418ada0ff6..f8f351cf1c265c711747973e98fc94c322cf27d4 100644 (file)
     }\r
   ],\r
   "targets": [\r
+    {\r
+      "label": "GRAFIKA Octopus mappába küldés",\r
+      "processor": "FTPTargetProcessor",\r
+      "outputFormat": "%SOURCENAME%",\r
+      "tag": "Betöltés",\r
+      "subFolderFormat": "%IDROOT%-%TEXT%/GRAFIKA-%TIMESTAMP%",\r
+      "killDateDays": 15,\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": "Octopus mappába küldés",\r
       "processor": "FTPTargetProcessor",\r
diff --git a/client/Maestro/Configuration/configuration-grafika.json b/client/Maestro/Configuration/configuration-grafika.json
new file mode 100644 (file)
index 0000000..3e23f55
--- /dev/null
@@ -0,0 +1,80 @@
+{\r
+  "title": "Grafikai feltöltő",\r
+  "active": true,\r
+  "startInTray": false,\r
+  "enableCustomMetadataId": true,\r
+  "player": {\r
+    "enabled": true,\r
+    "autoStart": false,\r
+    "segmentEditor": false\r
+  },\r
+  "source": {\r
+    "$type": "UNCSource",\r
+    "filter": "png,tga,mov,mxf",\r
+    "local": {\r
+      "address": "file://C:/x/",\r
+      "userName": "mediacube",\r
+      "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+      "timeout": 1000\r
+    }\r
+  },\r
+  "metadatas": [\r
+    {\r
+      "$type": "OctopusMetadata",\r
+      "server": {\r
+        "address": "http://10.10.1.27/services/rest/octopus/",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "$type": "TrafficMetadata",\r
+      "server": {\r
+        "address": "Data Source=10.10.1.45\\sql16;Initial Catalog=PA_Echo;Persist Security Info=True;",\r
+        "userName": "MAM",\r
+        "password": "7RKZYBzumKjL40SJwuwiFCvX57xuCN8zay6OttUm2wbrgImyYZBHyZTUUYrXX31Ge2Uwew07HYsqh2uzdJeDBDwcVntxaHg3nIpv9Dyq/odVoiC4tUF/K+lgvKWANcrZ",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "$type": "MediaCubeMetadata",\r
+      "metadataTitleFormat": "%SOURCENAME%",\r
+      "metadataIDFormat": "%SOURCESTARTID%",\r
+      "server": {\r
+        "address": "http://10.10.1.27/services/rest/jobengine/",\r
+        "timeout": 1000\r
+      }\r
+    }\r
+  ],\r
+  "targets": [\r
+    {\r
+      "label": "Octopus mappába küldés",\r
+      "processor": "FTPTargetProcessor",\r
+      "outputFormat": "%SOURCENAME%",\r
+      "tag": "Betöltés",\r
+      "subFolderFormat": "%IDROOT%-%TEXT%/GRAFIKA-%TIMESTAMP%",\r
+      "killDateDays": 15,\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": "%SOURCENAME%",\r
+      "tag": "Betöltés",\r
+      "subFolderFormat": "%IDROOT%-%TEXT%/GRAFIKA-%TIMESTAMP%",\r
+      "killDateDays": 30,\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
+}\r
diff --git a/client/Maestro/Configuration/configuration-grafika1.json b/client/Maestro/Configuration/configuration-grafika1.json
new file mode 100644 (file)
index 0000000..3e23f55
--- /dev/null
@@ -0,0 +1,80 @@
+{\r
+  "title": "Grafikai feltöltő",\r
+  "active": true,\r
+  "startInTray": false,\r
+  "enableCustomMetadataId": true,\r
+  "player": {\r
+    "enabled": true,\r
+    "autoStart": false,\r
+    "segmentEditor": false\r
+  },\r
+  "source": {\r
+    "$type": "UNCSource",\r
+    "filter": "png,tga,mov,mxf",\r
+    "local": {\r
+      "address": "file://C:/x/",\r
+      "userName": "mediacube",\r
+      "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+      "timeout": 1000\r
+    }\r
+  },\r
+  "metadatas": [\r
+    {\r
+      "$type": "OctopusMetadata",\r
+      "server": {\r
+        "address": "http://10.10.1.27/services/rest/octopus/",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "$type": "TrafficMetadata",\r
+      "server": {\r
+        "address": "Data Source=10.10.1.45\\sql16;Initial Catalog=PA_Echo;Persist Security Info=True;",\r
+        "userName": "MAM",\r
+        "password": "7RKZYBzumKjL40SJwuwiFCvX57xuCN8zay6OttUm2wbrgImyYZBHyZTUUYrXX31Ge2Uwew07HYsqh2uzdJeDBDwcVntxaHg3nIpv9Dyq/odVoiC4tUF/K+lgvKWANcrZ",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "$type": "MediaCubeMetadata",\r
+      "metadataTitleFormat": "%SOURCENAME%",\r
+      "metadataIDFormat": "%SOURCESTARTID%",\r
+      "server": {\r
+        "address": "http://10.10.1.27/services/rest/jobengine/",\r
+        "timeout": 1000\r
+      }\r
+    }\r
+  ],\r
+  "targets": [\r
+    {\r
+      "label": "Octopus mappába küldés",\r
+      "processor": "FTPTargetProcessor",\r
+      "outputFormat": "%SOURCENAME%",\r
+      "tag": "Betöltés",\r
+      "subFolderFormat": "%IDROOT%-%TEXT%/GRAFIKA-%TIMESTAMP%",\r
+      "killDateDays": 15,\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": "%SOURCENAME%",\r
+      "tag": "Betöltés",\r
+      "subFolderFormat": "%IDROOT%-%TEXT%/GRAFIKA-%TIMESTAMP%",\r
+      "killDateDays": 30,\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
+}\r
index 69426439f258522f7bf6fa23dbcbac091758bac3..9ee4506f9cb66969615092c3267d681b1dcef69a 100644 (file)
@@ -1,8 +1,6 @@
 {\r
   "minimizeToTray":  false,\r
   "userDomain": {\r
-    "address": "10.10.254.11",\r
-    "-userName": "echotest",\r
-    "-password": "F3QcfkSEW7hq+FcEraq9xv4UdHHeVoOh7jBH1G1k9SzEayTXyiT4WQ7XKtBO/ygnCpRU97AXoKXKoqXIGP8QlVkFurRqwzo8mywEb1q2VW7dUjkJcLFtLDkqQjM39+N9"\r
+    "address": "INTRA"\r
   }\r
 }\r
diff --git a/client/Maestro/Configuration/global.json.bak b/client/Maestro/Configuration/global.json.bak
new file mode 100644 (file)
index 0000000..6942643
--- /dev/null
@@ -0,0 +1,8 @@
+{\r
+  "minimizeToTray":  false,\r
+  "userDomain": {\r
+    "address": "10.10.254.11",\r
+    "-userName": "echotest",\r
+    "-password": "F3QcfkSEW7hq+FcEraq9xv4UdHHeVoOh7jBH1G1k9SzEayTXyiT4WQ7XKtBO/ygnCpRU97AXoKXKoqXIGP8QlVkFurRqwzo8mywEb1q2VW7dUjkJcLFtLDkqQjM39+N9"\r
+  }\r
+}\r
index 9a9b1fd7177ce215a92aa2d9cff45d85478fcd0a..ad7b512469fb5059cd8b11e280af5fdbc1e6ce74 100644 (file)
     <None Include="Configuration\-configuration-transcoder.json">\r
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
     </None>\r
+    <None Include="Configuration\configuration-grafika1.json">\r
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
+    </None>\r
+    <None Include="Configuration\configuration-grafika.json">\r
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
+    </None>\r
+    <None Include="Configuration\global.json.bak">\r
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
+    </None>\r
     <None Include="Configuration\global.json">\r
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
     </None>\r
     <None Include="Resources\configuration-unc.json">\r
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r
     </None>\r
-    <None Include="Configuration\configuration-sxs.json">\r
+    <None Include="Configuration\-configuration-sxs.json">\r
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
     </None>\r
     <None Include="Configuration\-configuration-studio.json">\r
index a8e673062b781de15190c59a06fdb1fcc1a87ed5..2d74206da9e5969f1c21774a6aa647fe8947fc82 100644 (file)
@@ -190,7 +190,8 @@ namespace Maestro {
                     logger.Debug("User automatically accepted");\r
                     return;\r
                 }\r
-                UserName = GlobalConfig.UserDomain?.UserName;\r
+                if (!String.IsNullOrWhiteSpace(GlobalConfig.UserDomain?.UserName))\r
+                    UserName = GlobalConfig.UserDomain?.UserName;\r
                 if (HasCommandlineParameter(NOLOGIN))\r
                     return;\r
                 string password = GlobalConfig.UserDomain?.Password;\r
index 77b1304dc8fd45210c5371986075344af94e3d7d..8180e131e47ec1a720efe77c20158c457669372f 100644 (file)
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
 // You can specify all the values or you can default the Build and Revision Numbers\r
 // by using the '*' as shown below:\r
 // [assembly: AssemblyVersion("1.0.*")]\r
-[assembly: AssemblyVersion("2.0.7.3")]\r
-[assembly: AssemblyFileVersion("2.0.7.3")]\r
+[assembly: AssemblyVersion("2.0.7.4")]\r
+[assembly: AssemblyFileVersion("2.0.7.4")]\r
index 2fce5a6ac8bf8a6e862553399d92ec892fcb7f8e..b0e8a9a0de0d6410df17d58102671060dd7c7146 100644 (file)
     <Compile Include="Targets\FTPTargetProcessor.cs" />\r
     <Compile Include="Targets\FXPTargetProcessor.cs" />\r
     <Compile Include="Targets\ITargetProcessor.cs" />\r
+    <Compile Include="Targets\Strings.cs" />\r
     <Compile Include="Targets\TargetProcessor.cs" />\r
     <Compile Include="Targets\TargetProcessorParameter.cs" />\r
     <Compile Include="Targets\TargetUpdateTrafficMessage.cs" />\r
diff --git a/client/MaestroShared/Targets/Strings.cs b/client/MaestroShared/Targets/Strings.cs
new file mode 100644 (file)
index 0000000..40f6641
--- /dev/null
@@ -0,0 +1,6 @@
+namespace MaestroShared.Targets {\r
+    class Strings {\r
+        public static readonly string ENTRY = "Entry";\r
+        public static readonly string EXIT = "Exit";\r
+    }\r
+}\r
index 4692c005a171fedbe8a6136bb3a1dabab27e5ea8..6e8b517c92f456828a54f28b7d9cb9362862174f 100644 (file)
@@ -44,6 +44,7 @@ namespace MaestroShared.Targets {
         public WorkflowAction workFlowAction { get; set; }\r
 \r
         public override void Initialize(Control parent, TargetProcessorParameter parameters) {\r
+            logger.Trace(Strings.ENTRY);\r
             base.Initialize(parent, parameters);\r
             InputName = parameters.InputFileName;\r
             if (!String.IsNullOrEmpty(parameters.SourcePathOverride))\r
@@ -62,6 +63,7 @@ namespace MaestroShared.Targets {
             string popupMessage = parameters.TargetConfig?.PopupMessage;\r
             if (popupMessage != null && popupMessage.Length > 0)\r
                 MsgBox.Info(popupMessage);\r
+            logger.Trace(Strings.EXIT);\r
         }\r
 \r
         protected virtual void BeforeExecute() {\r
@@ -112,6 +114,7 @@ namespace MaestroShared.Targets {
         }\r
 \r
         private bool DeleteExisting(string currentFile) {\r
+            logger.Trace(Strings.ENTRY);\r
             if (FileExists(currentFile) && (Parameters.TargetConfig.DisableFileVersioning || Parameters.TargetConfig.EnableOverride || Parameters.ArchiveMetadata.ok)) {\r
                 if (Parameters.TargetConfig.NexioServer) {\r
                     Status = REVOKED;\r
@@ -133,16 +136,19 @@ namespace MaestroShared.Targets {
                     }\r
                 }\r
             }\r
+            logger.Trace(Strings.EXIT);\r
             return true;\r
         }\r
 \r
         private void ShowNexioFileExistsMessage() {\r
+            logger.Trace(Strings.ENTRY);\r
             string message = null;\r
             if (String.IsNullOrEmpty(Parameters.TargetConfig.NexioFileExistsMessage))\r
                 message = "A feltöltéshez új Octopus azonosító generálása szükséges.";\r
             else\r
                 message = Parameters.TargetConfig.NexioFileExistsMessage;\r
             MessageBox.Show(String.Format($"Az '{OutputName}' állomány már létezik. {message}"));\r
+            logger.Trace(Strings.EXIT);\r
         }\r
 \r
         protected virtual void DeleteFile(string currentFile) {\r
@@ -150,15 +156,18 @@ namespace MaestroShared.Targets {
         }\r
 \r
         private string GetOutputName() {\r
+            logger.Trace(Strings.ENTRY);\r
             if (String.IsNullOrEmpty(OutputName))\r
                 return null;\r
             string result = OutputName;\r
             if (result.Contains(DOT))\r
                 result = result.Substring(0, result.LastIndexOf(DOT));\r
+            logger.Trace(Strings.EXIT);\r
             return result;\r
         }\r
 \r
         protected override void ExecuteCompleted() {\r
+            logger.Trace(Strings.ENTRY);\r
             base.ExecuteCompleted();\r
             workFlowAction.description = SUCCESS;\r
             workFlowAction.successful = true;\r
@@ -177,9 +186,11 @@ namespace MaestroShared.Targets {
                 UpdateTrafficInformation();\r
             if (Parameters.TargetConfig.SendEmailOnSuccess && !String.IsNullOrEmpty(Parameters.TargetConfig.SuccessEmailRecipient) && !String.IsNullOrEmpty(Parameters.TargetConfig.SuccessEmailPattern))\r
                 SendEmail(Parameters.TargetConfig.SuccessEmailRecipient, Parameters.TargetConfig.SuccessEmailPattern);\r
+            logger.Trace(Strings.EXIT);\r
         }\r
 \r
         private void UpdateTrafficInformation() {\r
+            logger.Trace(Strings.ENTRY);\r
             TargetUpdateTrafficMessage message = new TargetUpdateTrafficMessage {\r
                 VariantID = Parameters.VariantID,\r
                 Ready = true,\r
@@ -187,9 +198,11 @@ namespace MaestroShared.Targets {
                 Segments = Parameters.MovieSegments\r
             };\r
             Parameters.MessageBus.Send(message);\r
+            logger.Trace(Strings.EXIT);\r
         }\r
 \r
         private void UploadNexioMetadata() {\r
+            logger.Trace(Strings.ENTRY);\r
             String xml = null;\r
             string name = GetOutputName();\r
             string description = Parameters.ArchiveMetadata?.mediaTitle;\r
@@ -201,9 +214,11 @@ namespace MaestroShared.Targets {
                 xml = NexioXML.ToXML(name, null, description, Parameters.TargetConfig.Agency);\r
             byte[] content = Encoding.Unicode.GetBytes(xml);\r
             UploadContent(name + XML_EXT, content);\r
+            logger.Trace(Strings.EXIT);\r
         }\r
 \r
         private void UploadMorpheusMetadata() {\r
+            logger.Trace(Strings.ENTRY);\r
             string name = GetOutputName();\r
             string title = Parameters.ArchiveMetadata?.itemTitle;\r
             if (!title.Equals(Parameters.ArchiveMetadata?.mediaTitle))\r
@@ -223,9 +238,11 @@ namespace MaestroShared.Targets {
             byte[] content = MorpheusXML.ToXML(title, name, Parameters.TargetConfig.DeviceIDMorpheus, type, Parameters.MovieSegments);\r
             EnsureDirectoryExistence(Parameters.TargetConfig.PathMorpheusMetadata);\r
             UploadContent(name + XML_EXT, content);\r
+            logger.Trace(Strings.EXIT);\r
         }\r
 \r
         private void SendEmail(string to, string messagePattern) {\r
+            logger.Trace(Strings.ENTRY);\r
             try {\r
                 string message = GetDynamicText(messagePattern);\r
                 Parameters.MediaCubeApi.Notify(to, message);\r
@@ -233,13 +250,16 @@ namespace MaestroShared.Targets {
             catch (Exception e) {\r
                 MessageBox.Show(parent, e.Message);\r
             }\r
+            logger.Trace(Strings.EXIT);\r
         }\r
 \r
         protected virtual void AfterExecute() {\r
+            logger.Trace(Strings.ENTRY);\r
             Finished = DateTime.Now;\r
             workFlowAction.finished = Finished;\r
             SendWorkFlowAction();\r
             Progress = 0;\r
+            logger.Trace(Strings.EXIT);\r
         }\r
 \r
         protected virtual bool FileExists(string path) {\r
@@ -247,15 +267,20 @@ namespace MaestroShared.Targets {
         }\r
 \r
         private void SendWorkFlowAction() {\r
+            logger.Trace(Strings.ENTRY);\r
             try {\r
+\r
                 Parameters?.MediaCubeApi?.Create<WorkflowAction>(workFlowAction);\r
             }\r
             catch (Exception e) {\r
+                logger.Error(e);\r
                 MessageBox.Show(parent, e.Message);\r
             }\r
+            logger.Trace(Strings.EXIT);\r
         }\r
 \r
         protected virtual string SearchDirectory(string path, string pattern) {\r
+            logger.Trace(Strings.ENTRY);\r
             string result = null;\r
             string[] dirs = Directory.GetDirectories(path, pattern);\r
             if (dirs.Length > 0)\r
@@ -268,6 +293,7 @@ namespace MaestroShared.Targets {
         }\r
 \r
         protected string DetermineWorkingDirectory(Connection connection) {\r
+            logger.Trace(Strings.ENTRY);\r
             string result = Slash(connection.Address.LocalPath);\r
             if (String.IsNullOrEmpty(Parameters.TargetConfig.SubFolderFormat))\r
                 return result;\r
@@ -296,16 +322,20 @@ namespace MaestroShared.Targets {
                     result = Slash(Path.Combine(result, segment));\r
             }\r
 \r
+            logger.Trace(Strings.EXIT);\r
             return result;\r
         }\r
 \r
         private DateTime GetKillDate() {\r
+            logger.Trace(Strings.ENTRY);\r
             DateTime result = DateTime.Now;\r
             result = result.AddDays(Parameters.TargetConfig.KillDateDays);\r
+            logger.Trace(Strings.EXIT);\r
             return result;\r
         }\r
 \r
         private void UploadKillDateFile() {\r
+            logger.Trace(Strings.ENTRY);\r
             Uri address = Parameters.TargetConfig.Remote.Address;\r
             string statusWorkDir = Path.Combine(workingDir, STATUS_FOLDER);\r
             EnsureDirectoryExistence(statusWorkDir);\r
@@ -315,9 +345,11 @@ namespace MaestroShared.Targets {
             KillDatePath = GetOutputFilePath(statusWorkDir, fileName);\r
             UploadContent(KillDatePath, new byte[] { });\r
             KillDate = date.ToString(DATE_FORMAT);\r
+            logger.Trace(Strings.EXIT);\r
         }\r
 \r
         private void CreateArchiveMetadata() {\r
+            logger.Trace(Strings.ENTRY);\r
             Uri address = Parameters.TargetConfig.Remote.Address;\r
             string statusWorkDir = Path.Combine(workingDir, STATUS_FOLDER);\r
             EnsureDirectoryExistence(statusWorkDir);\r
@@ -326,9 +358,11 @@ namespace MaestroShared.Targets {
             byte[] content = Encoding.UTF8.GetBytes(Parameters.ArchiveMetadata.ToString());\r
             string ouputPath = GetOutputFilePath(statusWorkDir, fileName);\r
             UploadContent(ouputPath, content);\r
+            logger.Trace(Strings.EXIT);\r
         }\r
 \r
         private void CreateTrafficMetadata() {\r
+            logger.Trace(Strings.ENTRY);\r
             Uri address = Parameters.TargetConfig.Remote.Address;\r
             string statusWorkDir = Path.Combine(workingDir, STATUS_FOLDER);\r
             EnsureDirectoryExistence(statusWorkDir);\r
@@ -337,6 +371,7 @@ namespace MaestroShared.Targets {
             byte[] content = Encoding.UTF8.GetBytes(Parameters.ArchiveMetadata.ToString());\r
             string ouputPath = GetOutputFilePath(statusWorkDir, fileName);\r
             UploadContent(ouputPath, content);\r
+            logger.Trace(Strings.EXIT);\r
         }\r
 \r
         protected virtual void UploadContent(string outputPath, byte[] content) {\r
@@ -363,6 +398,7 @@ namespace MaestroShared.Targets {
         }\r
 \r
         private string CreateOutputFileName() {\r
+            logger.Trace(Strings.ENTRY);\r
             string nameWithoutExtension = GetDynamicText(Parameters.TargetConfig.OutputFormat);\r
             string extension = Path.GetExtension(InputName);\r
             extension = extension.ToUpper();\r
@@ -376,6 +412,7 @@ namespace MaestroShared.Targets {
                     version++;\r
                 }\r
             }\r
+            logger.Trace(Strings.EXIT);\r
             return result.ToUpper();\r
         }\r
 \r
index 04604631732a00050d82730abc01b5d5312d24e9..40435e342904dd95c6f96a6ff9ec2cfc2ef5bdf1 100644 (file)
@@ -1,5 +1,6 @@
 using System.Windows.Forms;\r
 using System;\r
+using System.Linq;\r
 using System.Collections.Generic;\r
 using LinkDotNet.MessageHandling.Contracts;\r
 using MaestroShared.Commons;\r
@@ -106,11 +107,18 @@ namespace TrafficClient {
         private void OnSelectionChanged(DataGridViewRow actualRow) {\r
             TrafficItem trafficItem = actualRow.DataBoundItem as TrafficItem;\r
             if (String.IsNullOrEmpty(trafficItem.MediaID)) {\r
-                TrafficVersion v = trafficAPI.CreateMaterialVersion(trafficItem.EpisodeID, false);\r
-                if (v != null) {\r
-                    trafficItem.MediaID = v.MediaID;\r
-                    trafficItem.VariantID = v.VariantID;\r
+                var currentVersion = trafficAPI.GetMaterials(trafficItem.EpisodeID, false)?.FirstOrDefault();\r
+                if (currentVersion == null || String.IsNullOrEmpty(currentVersion.MediaID)) {\r
+                    TrafficVersion newVersion = trafficAPI.CreateMaterialVersion(trafficItem.EpisodeID, false);\r
+                    if (newVersion != null) {\r
+                        trafficItem.MediaID = newVersion.MediaID;\r
+                        trafficItem.VariantID = newVersion.VariantID;\r
+                    }\r
+                } else {\r
+                    trafficItem.MediaID = currentVersion.MediaID;\r
+                    trafficItem.VariantID = currentVersion.VariantID;\r
                 }\r
+\r
                 if (trafficItem.VariantID == 0 || String.IsNullOrEmpty(trafficItem.MediaID))\r
                     return;\r
             }\r
index 6f83d49d901dfbfb768d4e51cd5f2e1c701fab35..fa0b043e13f9ebeaf0e08eacb420f53d6609b7eb 100644 (file)
@@ -88,8 +88,8 @@ namespace TrafficClient.Workers {
                 TryConnect();\r
                 using (SqlCommand cmd = new SqlCommand("dbo.clIFsp_EC_MAM", connection)) {\r
                     cmd.CommandType = CommandType.StoredProcedure;\r
-                    cmd.Parameters.AddWithValue("@Operation", 1001);\r
-                    cmd.Parameters.AddWithValue("@@@Options", 1);\r
+                    cmd.Parameters.AddWithValue("@Operation", 1002);\r
+                    cmd.Parameters.AddWithValue("@@@Options", 0);\r
                     cmd.Parameters.AddWithValue("@@ItemID", DBNull.Value);\r
                     cmd.Parameters.AddWithValue("@@StrParam1", strParam);\r
 \r
index 17c1249e6b2108bb5ccc3066ed1e098cfe6eb759..65df9e6f4ee576a1bf0beb43d1c3c5b96889a15d 100644 (file)
@@ -7,11 +7,13 @@ import java.nio.file.DirectoryStream;
 import java.nio.file.Files;\r
 import java.nio.file.Path;\r
 import java.nio.file.Paths;\r
+import java.text.SimpleDateFormat;\r
 import java.util.ArrayList;\r
 import java.util.Arrays;\r
 import java.util.Date;\r
 import java.util.HashMap;\r
 import java.util.List;\r
+import java.util.Locale;\r
 import java.util.Map;\r
 import java.util.Set;\r
 \r
@@ -54,6 +56,7 @@ public class ImportMORPHEUSMissingMaterialsStep extends JobStep {
        private IJobRuntime jobRuntime;\r
        private int overall;\r
        private int current;\r
+       private final SimpleDateFormat enDateFormat = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss:S", Locale.ENGLISH);\r
 \r
        private Map<String, Integer> buildMetadataMap(Path csvFilePath, String[] data) throws Exception {\r
                Map<String, Integer> result = new HashMap<>();\r
@@ -114,7 +117,7 @@ public class ImportMORPHEUSMissingMaterialsStep extends JobStep {
 \r
                BasicDBObject dbObject = new BasicDBObject(IMPORTED, new Date());\r
                dbObject.put(CHANNEL, channel);\r
-               dbObject.put(TIME_TO_AIR.replace(" ", ""), timeToAir);\r
+               dbObject.put(TIME_TO_AIR.replace(" ", ""), enDateFormat.parse(timeToAir));\r
                dbObject.put(DURATION, duration);\r
                dbObject.put(MATERIAL_ID.replace(" ", ""), materialID);\r
                dbObject.put(TITLE, title);\r
index 9818a7ad56410bb8baae965d4062c2c5eba4ba80..cf6962ad865cb13c3f91578b5ba331e91cf02299 100644 (file)
@@ -99,6 +99,16 @@ public class OctopusDataMinerTest {
                }\r
        }\r
 \r
+       //      @Test\r
+       //      public void test1() throws ParseException {\r
+       //              SimpleDateFormat df = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss:S", Locale.ENGLISH);\r
+       //              System.out.println(df.format(new Date()));\r
+       //              String x = "10-JAN-2018 13:25:21:08";\r
+       //              Date dt = df.parse(x);\r
+       //              System.out.println(CalendarUtils.toHunString(CalendarUtils.createCalendar(dt)));\r
+       //\r
+       //      }\r
+\r
        @Test\r
        public void testClient() {\r
                ResteasyWebTarget webTarget = new ResteasyClientBuilder().build().target("http://10.10.1.28/services/rest/octopus/");\r
@@ -153,5 +163,4 @@ public class OctopusDataMinerTest {
                list2.add(new BasicDBObject("z", 3));\r
                assertTrue(list1.equals(list2));\r
        }\r
-\r
 }\r
index 5163b094d6fac6283cdf0e848bfaa1645e078d51..bfc56a340378580aedc8a3999359ca8a2eb90610 100644 (file)
@@ -7,12 +7,13 @@
        <custom-attributes org.zkoss.zul.listbox.preloadSize="50" />\r
        <div id="scdiv" width="100%" height="100%" apply="org.zkoss.bind.BindComposer"\r
                viewModel="@id('jlm') @init('user.jobengine.zk.model.MissingMaterialsModel')">\r
+               <timer id="timer" delay="500" repeats="true" onTimer="@command('uiTick')" />\r
 \r
                <space bar="false" />\r
 \r
                <div align="left" width="100%">\r
                        <space bar="false" />\r
-                       <button label="Importálás" onClick="@command('executeJob')" autodisable="self" />\r
+                       <button label="Importálás" onClick="@command('executeImportJob')" autodisable="self" disabled="@load(jlm.importDisabled)" />\r
                </div>\r
 \r
                <div height="100%" width="100%" style="background: #e3e3e3" align="left">\r
index af53871935ffff00b9fa23b1a569684e083899f1..b4dfc69c4124a03c2019584b03172750b2f7f381 100644 (file)
@@ -33,13 +33,8 @@ public class ScheduledJob extends NativeJob { //implements InterruptableJob{
 \r
        private Map<String, Object> jobParameters = new HashMap<String, Object>();\r
 \r
-       public void doJob() {\r
-               try {\r
-                       IJobRuntime runtime = jobEngine.submit(templateName, jobName, jobParameters); //new JobStart(JobStartType.IMMEDIATE)\r
-                       //                      logger.info("{} scheduled", runtime);\r
-               } catch (Exception e) {\r
-                       logger.error(e);\r
-               }\r
+       public IJobRuntime doJob() throws JobEngineException {\r
+               return jobEngine.submit(templateName, jobName, jobParameters);\r
        }\r
 \r
        public IJobRuntime doJob(IJobStatusChangedListener statusListener) throws JobEngineException {\r
@@ -51,7 +46,11 @@ public class ScheduledJob extends NativeJob { //implements InterruptableJob{
                JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();\r
                if (jobDataMap != null) {\r
                        ScheduledJob realJob = (ScheduledJob) jobDataMap.get(ScheduledJob.JOB_SERVICE_INSTANCE);\r
-                       realJob.doJob();\r
+                       try {\r
+                               realJob.doJob();\r
+                       } catch (Exception e) {\r
+                               logger.catching(e);\r
+                       }\r
                }\r
        }\r
 \r
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/AsyncBaseModel.java b/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/AsyncBaseModel.java
new file mode 100644 (file)
index 0000000..4cb6a5f
--- /dev/null
@@ -0,0 +1,35 @@
+package user.jobengine.zk.model;\r
+\r
+import java.util.Arrays;\r
+import java.util.List;\r
+import java.util.concurrent.BlockingQueue;\r
+import java.util.concurrent.LinkedBlockingQueue;\r
+\r
+import org.zkoss.bind.BindUtils;\r
+import org.zkoss.bind.annotation.Command;\r
+\r
+public class AsyncBaseModel extends BaseModel {\r
+\r
+       private BlockingQueue<UITask> uiTasks = new LinkedBlockingQueue<>();\r
+\r
+       protected void NotifyChange(String... names) {\r
+               List<String> nameList = Arrays.asList(names);\r
+               nameList.forEach(name -> BindUtils.postNotifyChange(null, null, this, name));\r
+       }\r
+\r
+       protected void registerTask(UITask task) {\r
+               try {\r
+                       uiTasks.put(task);\r
+               } catch (InterruptedException e) {\r
+               }\r
+       }\r
+\r
+       @Command\r
+       public void uiTick() {\r
+               UITask task = uiTasks.poll();\r
+               if (task == null)\r
+                       return;\r
+               task.execute();\r
+       }\r
+\r
+}\r
index d3a066a596e6e921d261ea79c05f9db9482c2353..57b9f54e89366d7dec4e78d40a6d46bf0527c942 100644 (file)
@@ -88,10 +88,9 @@ public class JobListModel extends BaseModel implements IJobChangedListener {
                                throw new Exception("Internal error! JobEngine instance unavailable.");\r
                        setShutdownDisabled(!jobEngine.isRunning());\r
                        setStartupDisabled(jobEngine.isRunning());\r
-                       \r
-                       this.jobEngine.addJobChangedEventListener(this);\r
-                       SessionUtil.addJobChangedListener(this);                        //sessionlistener fog leiratkozni\r
-                       \r
+\r
+                       SessionUtil.addJobChangedListener(this); //sessionlistener fog leiratkozni\r
+\r
                        initializeList();\r
 \r
                } catch (Exception exc) {\r
index 47f00bf87c017651541f8777f9db82ddabbfa074..ce44cd1313b6585b36cbad47cfbd27f5984ab562 100644 (file)
@@ -41,30 +41,14 @@ public class JobSelectorModel extends BaseModel {
        public void execute() {\r
                if (selectedJobElement == null)\r
                        return;\r
-\r
-               Runnable r = new Runnable() {\r
-\r
-                       @Override\r
-                       public void run() {\r
-                               SchedulerService scheduler = jobEngine.getScheduler();\r
-                               ScheduledJob scheduledJob = scheduler.createScheduledJob(selectedJobElement.getDbObject());\r
-                               scheduledJob.setJobEngine(jobEngine);\r
-                               for (int i = 0; i < 1; i++) {\r
-\r
-                                       try {\r
-                                               if (!scheduledJob.isActive())\r
-                                                       scheduler.register(scheduledJob);\r
-                                               scheduler.executeImmediate(scheduledJob.getJobId());\r
-                                               Thread.sleep(300);\r
-                                       } catch (Exception e) {\r
-                                               Messagebox.show(e.getMessage());\r
-                                       }\r
-                               }\r
-\r
-                       }\r
-               };\r
-\r
-               new Thread(r).start();\r
+               SchedulerService scheduler = jobEngine.getScheduler();\r
+               ScheduledJob scheduledJob = scheduler.createScheduledJob(selectedJobElement.getDbObject());\r
+               scheduledJob.setJobEngine(jobEngine);\r
+               try {\r
+                       scheduledJob.doJob();\r
+               } catch (Exception e) {\r
+                       Messagebox.show(e.getMessage());\r
+               }\r
                close();\r
        }\r
 \r
index e32ae11de42c6cc966bfec210f899ceed57bb017..25fe604f00b56339f010ee5853fd43d13f6be52e 100644 (file)
@@ -1,7 +1,8 @@
 package user.jobengine.zk.model;\r
 \r
+import java.util.ArrayList;\r
 import java.util.List;\r
-import java.util.concurrent.CountDownLatch;\r
+import java.util.Optional;\r
 \r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
@@ -15,48 +16,45 @@ import com.ibm.nosql.json.api.DB;
 import com.ibm.nosql.json.api.DBCollection;\r
 import com.ibm.nosql.json.api.DBCursor;\r
 \r
-import user.commons.JobStatus;\r
 import user.commons.nosql.NoSQLUtils;\r
+import user.jobengine.db.ItemManagerData.SignalType;\r
+import user.jobengine.server.IJobChangedListener;\r
 import user.jobengine.server.IJobEngine;\r
-import user.jobengine.server.IJobStatusChangedListener;\r
+import user.jobengine.server.IJobRuntime;\r
+import user.jobengine.server.JobChangedEvent;\r
 import user.jobengine.server.JobEngine;\r
-import user.jobengine.server.JobStatusChangedEvent;\r
 import user.jobengine.server.scheduler.ScheduledJob;\r
 import user.jobengine.server.scheduler.SchedulerService;\r
+import user.jobengine.zk.util.SessionUtil;\r
 \r
-public class MissingMaterialsModel extends BaseModel implements IJobStatusChangedListener {\r
+public class MissingMaterialsModel extends AsyncBaseModel implements IJobChangedListener {\r
        private static final Logger logger = LogManager.getLogger();\r
-\r
        private static final String TEMPLATE = "template";\r
        private static final String IMPORT_TEMPLATE = "import-morpheus-missing-materials.xml";\r
        private static final String COLLECTION_NAME = "missing_materials";\r
        private ListModelList<BasicDBObject> jobList = new ListModelList<BasicDBObject>();\r
        private BasicDBObject selectedJob = null;\r
        private IJobEngine jobEngine = null;\r
-       private CountDownLatch latch;\r
+       private boolean importDisabled;\r
 \r
        @Command\r
-       public void executeJob() {\r
+       public void executeImportJob() {\r
                try {\r
+                       setImportDisabled(true);\r
                        SchedulerService scheduler = jobEngine.getScheduler();\r
                        List<BasicDBObject> jobs = NoSQLUtils.asList(scheduler.getScheduleJobs());\r
                        BasicDBObject importJob = null;\r
                        for (BasicDBObject job : jobs) {\r
-                               if (IMPORT_TEMPLATE.equals(job.getString(TEMPLATE))) {\r
+                               if (isImportJob(job.getString(TEMPLATE))) {\r
                                        importJob = job;\r
                                        //logger.info(job.toString());\r
                                        break;\r
                                }\r
                        }\r
 \r
-                       latch = new CountDownLatch(1);\r
                        ScheduledJob scheduledJob = scheduler.createScheduledJob(importJob);\r
                        scheduledJob.setJobEngine(jobEngine);\r
-                       scheduledJob.doJob(this);\r
-                       latch.await();\r
-\r
-                       initializeList();\r
-\r
+                       scheduledJob.doJob();\r
                } catch (Exception e) {\r
                        logger.catching(e);\r
                        Messagebox.show(e.getMessage());\r
@@ -75,12 +73,15 @@ public class MissingMaterialsModel extends BaseModel implements IJobStatusChange
        public void init() {\r
                try {\r
                        jobList.setMultiple(true);\r
+                       SessionUtil.addJobChangedListener(this);\r
                        this.jobEngine = JobEngine.getInstance();\r
-\r
                        if (jobEngine == null)\r
                                throw new Exception("Internal error! JobEngine instance unavailable.");\r
+                       List<IJobRuntime> jobRuntimes = new ArrayList<>(jobEngine.getJobs().values());\r
+                       Optional<IJobRuntime> findFirst = jobRuntimes.stream().filter(j -> isImportJob(j.getTemplate())).findFirst();\r
+                       if (findFirst.isPresent())\r
+                               setImportDisabled(true);\r
                        initializeList();\r
-\r
                } catch (Exception e) {\r
                        logger.catching(e);\r
                }\r
@@ -97,11 +98,38 @@ public class MissingMaterialsModel extends BaseModel implements IJobStatusChange
 \r
        }\r
 \r
+       public boolean isImportDisabled() {\r
+               return importDisabled;\r
+       }\r
+\r
+       private boolean isImportJob(String template) {\r
+               return IMPORT_TEMPLATE.equals(template);\r
+       }\r
+\r
+       @Override\r
+       public void jobChanged(JobChangedEvent event) {\r
+               IJobRuntime job = event.getJob();\r
+               if (isImportJob(job.getTemplate())) {\r
+                       if (SignalType.DELETE.equals(event.getSignalType()))\r
+                               registerTask(() -> onImportCompleted());\r
+               }\r
+       }\r
+\r
+       private void onImportCompleted() {\r
+               initializeList();\r
+               setImportDisabled(false);\r
+       }\r
+\r
        @Command\r
        public void selectJob() {\r
                //only for notification\r
        }\r
 \r
+       public void setImportDisabled(boolean importDisabled) {\r
+               this.importDisabled = importDisabled;\r
+               NotifyChange("importDisabled");\r
+       }\r
+\r
        public void setJobList(ListModelList<BasicDBObject> jobList) {\r
                this.jobList = jobList;\r
        }\r
@@ -110,9 +138,4 @@ public class MissingMaterialsModel extends BaseModel implements IJobStatusChange
                this.selectedJob = selectedJob;\r
        }\r
 \r
-       @Override\r
-       public void statusChanged(JobStatusChangedEvent event) {\r
-               if (JobStatus.FINISHED.equals(event.getStatus()) || JobStatus.SUSPENDED.equals(event.getStatus()))\r
-                       latch.countDown();\r
-       }\r
 }\r
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/UITask.java b/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/UITask.java
new file mode 100644 (file)
index 0000000..71b122a
--- /dev/null
@@ -0,0 +1,5 @@
+package user.jobengine.zk.model;\r
+\r
+public interface UITask {\r
+       void execute();\r
+}
\ No newline at end of file
index 3e7a3aba19af0861c0204849580b4db84cbd500f..bc31d167437ad5ebf351b43366f1556a238509f1 100644 (file)
@@ -27,6 +27,7 @@ public class SessionUtil {
        public static final String JOBLISTENERLIST = "joblistenerlist";\r
 \r
        static public void addJobChangedListener(IJobChangedListener listener) {\r
+               JobEngine.getInstance().addJobChangedEventListener(listener);\r
                ArrayList<IJobChangedListener> list = (ArrayList<IJobChangedListener>) getAttribute(JOBLISTENERLIST);\r
                if (list == null) {\r
                        list = new ArrayList<IJobChangedListener>();\r