git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Thu, 30 Nov 2017 16:07:10 +0000 (16:07 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Thu, 30 Nov 2017 16:07:10 +0000 (16:07 +0000)
23 files changed:
client/Maestro/Configuration/ACTIVE-configuration-nle.json [new file with mode: 0644]
client/Maestro/Configuration/configuration-archive.json
client/Maestro/Configuration/configuration-studio.json
client/Maestro/Configuration/configuration-sxs.json
client/Maestro/FolderScanner.cs
client/Maestro/Installer/installforge-installer-project.ifp
client/Maestro/Maestro.csproj
client/Maestro/MaestroForm.Source.cs
client/Maestro/MaestroForm.Target.cs
client/Maestro/Properties/AssemblyInfo.cs
client/Maestro/Sources/NexioRESTSource.cs
client/MaestroShared/Controls/CheckableTreeView.cs [new file with mode: 0644]
client/MaestroShared/MaestroShared.csproj
client/MediaCubeClient/NexioAPI.cs
client/OctopusClient/CheckableTreeView.cs
client/OctopusClient/OctopusIDSelector.Designer.cs
client/OctopusClient/OctopusIDSelector.cs
server/user.jobengine.osgi.server/src/user/jobengine/server/IJobStepExecutor.java
server/user.jobengine.osgi.server/src/user/jobengine/server/JobEngine.java
server/user.jobengine.osgi.server/src/user/jobengine/server/JobRuntime.java
server/user.jobengine.osgi.server/src/user/jobengine/server/JobStepExecutor.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/JobListModel.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/JobSelectorModel.java

diff --git a/client/Maestro/Configuration/ACTIVE-configuration-nle.json b/client/Maestro/Configuration/ACTIVE-configuration-nle.json
new file mode 100644 (file)
index 0000000..30ee703
--- /dev/null
@@ -0,0 +1,183 @@
+{\r
+  "title": "NLE",\r
+  "active": true,\r
+  "startInTray": false,\r
+  "enableCustomMetadataId": true,\r
+  "defaultWindowColor": "#E1BEE7",\r
+  "partialWindowColor": "#F3E5F5",\r
+  "player": {\r
+    "enabled": true,\r
+    "autoStart": false,\r
+    "segmentEditor": true\r
+  },\r
+  "source": {\r
+    "$type": "UNCSource",\r
+    "filter": "avi,wav,mxf",\r
+    "foldersAutoExpand": true,\r
+    "local": {\r
+      "address": "file://c:/x"\r
+    }\r
+  },\r
+  "metadatas": [\r
+    {\r
+      "$type": "OctopusMetadata",\r
+      "disableStoryCheck": true,\r
+      "server": {\r
+        "address": "http://10.10.1.27/services/rest/octopus/",\r
+        "timeout": 1000\r
+      },\r
+      "projectSettings": {\r
+        "templateRoot": {\r
+          "address": "file://10.10.1.100/BRAAVOS/.MAESTRO",\r
+          "userName": "mediacube",\r
+          "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+          "timeout": 1000\r
+        },\r
+        "templateName": "ALAPTIMELINE.ezp",\r
+        "target": {\r
+          "label": "Projekt létrehozása",\r
+          "processor": "UNCTargetProcessor",\r
+          "outputFormat": "%ID%-%TEXT%",\r
+          "subFolderFormat": "%IDROOT%-%TEXT%/PROJECT",\r
+          "disableFileVersioning": true,\r
+          "remote": {\r
+            "address": "file://10.10.1.100/BRAAVOS/OCTOPUS",\r
+            "userName": "mediacube",\r
+            "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+            "timeout": 1000\r
+          }\r
+        },\r
+        "disableOpenProject": false,\r
+        "disableOpenSourceFolder": false\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
+      "local": {\r
+        "address": "file://10.10.1.100/OCTOPUS",\r
+        "userName": "mediacube",\r
+        "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "$type": "MediaCubeMetadata",\r
+      "server": {\r
+        "address": "http://10.10.1.27/services/rest/jobengine/",\r
+        "timeout": 1000\r
+      }\r
+    }\r
+  ],\r
+  "targets": [\r
+    {\r
+      "label": "Stúdióba küldés",\r
+      "processor": "FTPTargetProcessor",\r
+      "outputFormat": "%ID%",\r
+      "tag": "Betöltés",\r
+      "nexioServer": true,\r
+      "nexioFileExistsMessage": "A feltöltéshez új 'placeholder' generálása szükséges az Octopus rendszerben, az anyagon belül az ALT+1 billenytűkombináció segítségével.",\r
+      "killDateDays": 7,\r
+      "disableFileVersioning": true,\r
+      "agency": "MAESTRO-NLE",\r
+      "reference": [ "Napi megtekintőbe","Online archívba" ],\r
+      "remote": {\r
+        "address": "ftp://10.10.1.55:2098",\r
+        "userName": "administrator",\r
+        "password": "+QtkeQdCTiOvZOgK/kUND4pO4/D+//r7ZIyluwMMdiqMEgO8iJErAG10ooWhPfiljQeXrdeyMzo7gWEZtcWpNSomGeDIbdMyQwtpqmMo1VEM3A27ZfzigY09YD46ECRh",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "label": "Napi megtekintőbe",\r
+      "processor": "FTPTargetProcessor",\r
+      "outputFormat": "%ID%",\r
+      "tag": "Online",\r
+      "disableFileVersioning": true,\r
+      "killDateDays": 2,\r
+      "saveArchiveMetadata": false,\r
+      "remote": {\r
+        "address": "ftp://10.10.1.100/OCTOPUS/_NAPI_MEGTEKINTO",\r
+        "userName": "mediacube",\r
+        "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "label": "Online archívba",\r
+      "processor": "FTPTargetProcessor",\r
+      "subFolderFormat": "%DATESTAMP%",\r
+      "outputFormat": "%ID%-%TEXT%",\r
+      "tag": "Online",\r
+      "disableFileVersioning": true,\r
+      "killDateDays": 0,\r
+      "saveArchiveMetadata": false,\r
+      "remote": {\r
+        "address": "ftp://10.10.1.100/MEGTEKINTO_ARCHIVE",\r
+        "userName": "mediacube",\r
+        "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+       {\r
+      "label": "TQC check",\r
+      "processor": "FTPTargetProcessor",\r
+      "outputFormat": "%ID%-%SOURCENAME%",\r
+      "tag": "Betöltés",\r
+      "killDateDays": 7,\r
+      "saveArchiveMetadata": false,\r
+      "remote": {\r
+        "address": "ftp://10.10.1.100/TQC/CHECK",\r
+        "userName": "mediacube",\r
+        "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "label": "TQC promo",\r
+      "processor": "FTPTargetProcessor",\r
+      "outputFormat": "%ID%-%SOURCENAME%",\r
+      "tag": "Betöltés",\r
+      "killDateDays": 7,\r
+      "saveArchiveMetadata": false,\r
+      "remote": {\r
+        "address": "ftp://10.10.1.100/TQC/PROMO",\r
+        "userName": "mediacube",\r
+        "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "label": "TQC reklám",\r
+      "processor": "FTPTargetProcessor",\r
+      "outputFormat": "%ID%-%SOURCENAME%",\r
+      "tag": "Betöltés",\r
+      "killDateDays": 7,\r
+      "saveArchiveMetadata": false,\r
+      "remote": {\r
+        "address": "ftp://10.10.1.100/TQC/REKLAM",\r
+        "userName": "mediacube",\r
+        "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "label": "Archiválás",\r
+      "processor": "FTPTargetProcessor",\r
+      "outputFormat": "%ID%",\r
+      "tag": "Archiválás",\r
+      "saveArchiveMetadata": true,\r
+      "remote": {\r
+        "address": "ftp://10.10.1.100/ARCHIVE",\r
+        "userName": "mediacube",\r
+        "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+        "timeout": 1000\r
+      }\r
+    }\r
+  ]\r
+}\r
index 47daba991983937847d6dc677100dbf45c16486c..784321bb550f03fffba0d9564c02d17845e26149 100644 (file)
@@ -1,6 +1,6 @@
 {\r
   "title": "Archiválás",\r
-  "active": true,\r
+  "active": false,\r
   "startInTray": false,\r
   "enableCustomMetadataId": true,\r
   "player": {\r
@@ -11,9 +11,9 @@
   "source": {\r
     "$type": "UNCSource",\r
     "filter": "mov,wav,mxf",\r
-    "foldersAutoExpand": true,\r
+    "foldersAutoExpand": false,\r
     "local": {\r
-      "address": "file://10.10.1.100/BRAAVOS",\r
+      "address": "file://10.10.1.100/BRAAVOS/MEGTEKINTO_ARCHIVE",\r
       "userName": "mediacube",\r
       "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
       "timeout": 1000\r
@@ -22,6 +22,7 @@
   "metadatas": [\r
     {\r
       "$type": "OctopusMetadata",\r
+      "disableStoryCheck": true,\r
       "server": {\r
         "address": "http://10.10.1.27/services/rest/octopus/",\r
         "timeout": 1000\r
index d1b924fef166ff72456eec014eed2d9a9f10e1be..8a9e20f802f9a1dbcfd233f406b1c610db64f5ed 100644 (file)
@@ -1,6 +1,6 @@
 {\r
   "title": "Stúdió",\r
-  "active": true,\r
+  "active": false,\r
   "startInTray": false,\r
   "enableCustomMetadataId": true,\r
   "filter": "avi",\r
@@ -9,7 +9,7 @@
   "source": {\r
     "$type": "NEXIOSource",\r
     "local": {\r
-      "address": "ws://10.10.1.28/services/nexio"\r
+      "address": "ws://10.10.1.27/services/nexio"\r
     },\r
     "remote": {\r
       "address": "ftp://10.10.1.55:2098",\r
index 7d6ab651fd6df7b8111c7ee8a02ac423605c8bff..03fa1bfa17a6688daee4c3fdfab4f42741118447 100644 (file)
@@ -12,7 +12,7 @@
     "$type": "UNCSource",\r
     "filter": "mov,wav,mxf",\r
     "local": {\r
-      "address": "file://c:/x"\r
+      "address": "file://c:/"\r
     }\r
   },\r
   "metadatas": [\r
index 557f8289b5d459ed17df84a8c2912880bfbfed7c..3d2606064223b0cd74423e2664d3eb3dda694d23 100644 (file)
@@ -1,10 +1,12 @@
-using System;\r
+using NLog;\r
+using System;\r
 using System.Collections.Concurrent;\r
 using System.IO;\r
 \r
 namespace Maestro {\r
 \r
     public class FolderScanner<T> {\r
+        private static readonly Logger logger = LogManager.GetCurrentClassLogger();\r
         public delegate void FoundFileSystemEntry(T parent, string entry, string label, bool isDirectory);\r
         public event FoundFileSystemEntry OnFoundFileSystemEntry;\r
         private ConcurrentDictionary<string, T> cache;\r
@@ -12,14 +14,31 @@ namespace Maestro {
         public void EnumerateDirectories(string path) {\r
             if (!Directory.Exists(path))\r
                 return;\r
-            foreach (var entry in Directory.EnumerateDirectories(path, "*", SearchOption.AllDirectories)) {\r
-                OnFoundFileSystemEntry?.Invoke(\r
-                    Get(Path.GetDirectoryName(entry)), \r
-                    entry, \r
-                    Uri.UnescapeDataString(Path.GetFileName(entry)), \r
-                    true\r
-                );\r
+            try {\r
+                foreach (string entry in Directory.GetDirectories(path)) {\r
+                    logger.Info(entry);\r
+                    T parent = Get(Path.GetDirectoryName(entry));\r
+                    string label = Uri.UnescapeDataString(Path.GetFileName(entry));\r
+                    OnFoundFileSystemEntry?.Invoke(parent, entry, label, true);\r
+                    EnumerateDirectories(entry);\r
+                }\r
             }\r
+            catch (Exception e) {\r
+                logger.Error(e);\r
+            }\r
+\r
+            //var directories = Directory.EnumerateDirectories(path, "*", SearchOption.AllDirectories);\r
+            //try {\r
+            //    foreach (var entry in directories) {\r
+            //        logger.Info(entry);\r
+            //        T parent = Get(Path.GetDirectoryName(entry));\r
+            //        string label = Uri.UnescapeDataString(Path.GetFileName(entry));\r
+            //        OnFoundFileSystemEntry?.Invoke(parent, entry, label, true);\r
+            //    }\r
+            //}\r
+            //catch (Exception e) {\r
+            //    logger.Error(e);\r
+            //}\r
         }\r
 \r
         public void Put(string key, T value) {\r
@@ -29,7 +48,7 @@ namespace Maestro {
         }\r
 \r
         private string GetLastSegment(string path) {\r
-            \r
+\r
             return Uri.UnescapeDataString(Path.GetFileName(path));\r
         }\r
 \r
index 2745a0967707f14e437f00daa9bc4fae41e4979d..1e50aabd5fb67105e33cfd4092727f0d597784a1 100644 (file)
Binary files a/client/Maestro/Installer/installforge-installer-project.ifp and b/client/Maestro/Installer/installforge-installer-project.ifp differ
index 483fae64b6ab000eb6380a5c889d8b8ff7c88a80..510b101f5fb2dc10abfa5c4fb5887fbd0e680702 100644 (file)
     <None Include="Configuration\ACTIVE-configuration-editor-project.json">\r
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
     </None>\r
+    <None Include="Configuration\ACTIVE-configuration-nle.json">\r
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
+    </None>\r
     <None Include="Configuration\configuration-archive.json">\r
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
     </None>\r
index 54e27ad8ca093bc99263ab425c7df1ff57221c7f..ae7a66ae4c4b23eaca053c364c245f5cd2cd7fe5 100644 (file)
@@ -93,63 +93,56 @@ namespace Maestro {
             }\r
             Uri address = Configuration.Source.Local.Address;\r
 \r
-            \r
-            TreeNode rootNode = treeFolders.Nodes.Add(Path.GetFileName(address.LocalPath));\r
-\r
-            FolderScanner<TreeNode> scanner = new FolderScanner<TreeNode>();\r
-            scanner.Put(address.LocalPath, rootNode);\r
-            scanner.OnFoundFileSystemEntry += (parent, entry, label, isDirectory) => {\r
-                //logger.Trace($"{parent} *** {entry}");\r
-                TreeNode node = parent.Nodes.Add(label);\r
-                scanner.Put(entry, node);\r
-            };\r
-\r
-            treeFolders.BeginUpdate();\r
-            scanner.EnumerateDirectories(address.LocalPath);\r
-            if ((Configuration.Source as UNCSource).FoldersAutoExpand)\r
-                treeFolders.ExpandAll();\r
-            rootNode.EnsureVisible();\r
-            treeFolders.EndUpdate();\r
-            //if (!Directory.Exists(address.LocalPath))\r
-            //    return;\r
-            //string[] folders = Directory.GetDirectories(address.LocalPath);\r
-            //TreeNode rootNode = treeFolders.Nodes.Add(GetLastSegment(Configuration.Source.Local.Address.ToString()));\r
-            //var orderedFolders = folders.OrderBy(n => n);\r
-            //foreach (var folder in orderedFolders) {\r
-            //    TreeNode folderNode = rootNode.Nodes.Add(GetLastSegment(folder));\r
-            //    folderNode.Nodes.Add("..");\r
-            //}\r
-        }\r
 \r
-        private void HideFolders() {\r
-            dgSource.Visible = true;\r
-            treeFolders.Visible = false;\r
-            treeFolders.Nodes.Clear();\r
+            if (!Directory.Exists(address.LocalPath))\r
+                return;\r
+            string label = Path.GetFileName(address.LocalPath);\r
+            label = String.IsNullOrEmpty(label) ? address.LocalPath : label;\r
+            TreeNode rootNode = treeFolders.Nodes.Add(label);\r
+            //FolderScanner<TreeNode> scanner = new FolderScanner<TreeNode>();\r
+            //scanner.Put(address.LocalPath, rootNode);\r
+            //scanner.OnFoundFileSystemEntry += (parent, entry, label, isDirectory) => {\r
+            //    //logger.Trace($"{parent} *** {entry}");\r
+            //    TreeNode node = parent.Nodes.Add(label);\r
+            //    scanner.Put(entry, node);\r
+            //};\r
+\r
+            //treeFolders.BeginUpdate();\r
+            //scanner.EnumerateDirectories(address.LocalPath);\r
+            //if ((Configuration.Source as UNCSource).FoldersAutoExpand)\r
+            //    treeFolders.ExpandAll();\r
+            //rootNode.EnsureVisible();\r
+            //treeFolders.Sort();\r
+            //treeFolders.EndUpdate();\r
+            AddFolders(address, rootNode);\r
         }\r
 \r
-        private string GetPath(TreeNode node) {\r
-            TreeNode treeNode = node;\r
-            StringBuilder sb = new StringBuilder();\r
-            sb.Append(treeNode.Text);\r
-            while (treeNode.Level != 1) {\r
-                treeNode = treeNode.Parent;\r
-                sb.Insert(0, "/");\r
-                sb.Insert(0, treeNode.Text);\r
+        private void AddFolders(Uri address, TreeNode parent) {\r
+            string[] folders = null;\r
+            try {\r
+                folders = Directory.GetDirectories(address.LocalPath);\r
             }\r
-            return sb.ToString();\r
+            catch (Exception ex) {\r
+                MsgBox.Error(ex.Message);\r
+            }\r
+            if (folders == null)\r
+                return;\r
+            treeFolders.BeginUpdate();\r
+            foreach (var folder in folders) {\r
+                TreeNode folderNode = parent.Nodes.Add(GetLastSegment(folder));\r
+                folderNode.Nodes.Add("..");\r
+            }\r
+            treeFolders.Sort();\r
+            parent.EnsureVisible();\r
+            treeFolders.EndUpdate();\r
         }\r
 \r
         private void OnBeforeExpandFolder(object sender, TreeViewCancelEventArgs e) {\r
-            //if (e.Node.Nodes.Count != 1 || !"..".Equals(e.Node.Nodes[0].Text))\r
-            //    return;\r
-            //e.Node.Nodes.Clear();\r
-            //Uri address = new Uri(Path.Combine(Configuration.Source.Local.Address.LocalPath, GetPath(e.Node)));\r
-            //string[] folders = Directory.GetDirectories(address.LocalPath);\r
-            //var orderedFolders = folders.OrderBy(n => n);\r
-            //foreach (var folder in orderedFolders) {\r
-            //    TreeNode folderNode = e.Node.Nodes.Add(GetLastSegment(folder));\r
-            //    folderNode.Nodes.Add("..");\r
-            //}\r
+            if (e.Node.Nodes.Count != 1 || !"..".Equals(e.Node.Nodes[0].Text))\r
+                return;\r
+            e.Node.Nodes.Clear();\r
+            Uri address = new Uri(Path.Combine(Configuration.Source.Local.Address.LocalPath, GetPath(e.Node)));\r
+            AddFolders(address, e.Node);\r
         }\r
 \r
         private void OnAfterSelectFolder(object sender, TreeViewEventArgs e) {\r
@@ -172,6 +165,24 @@ namespace Maestro {
             HideFolders();\r
         }\r
 \r
+        private void HideFolders() {\r
+            dgSource.Visible = true;\r
+            treeFolders.Visible = false;\r
+            treeFolders.Nodes.Clear();\r
+        }\r
+\r
+        private string GetPath(TreeNode node) {\r
+            TreeNode treeNode = node;\r
+            StringBuilder sb = new StringBuilder();\r
+            sb.Append(treeNode.Text);\r
+            while (treeNode.Level != 1) {\r
+                treeNode = treeNode.Parent;\r
+                sb.Insert(0, "/");\r
+                sb.Insert(0, treeNode.Text);\r
+            }\r
+            return sb.ToString();\r
+        }\r
+\r
         private void OnShowFolders(object sender, EventArgs e) {\r
             if (btnShowFolders.CheckState == CheckState.Checked) {\r
                 HideFolders();\r
index 986dbd6996fbb7fef9452c8220ffd82c7ecdc60c..92282781f5da89cc524339a124d092e8bf2aace3 100644 (file)
@@ -163,7 +163,7 @@ namespace Maestro {
                 MessageBus = MessageBus\r
             };\r
 \r
-            if (SelectedMetadata.Kind == MetadataType.MediaCube) {\r
+            if (SelectedMetadata.Kind == MetadataType.MediaCube && result.ArchiveMetadata != null) {\r
                 result.ArchiveMetadata.itemHouseId = PatternNameMaker.Get(result.ArchiveMetadata.itemHouseId, result.ID, result.InputFileName, result.MetadataText);\r
                 result.ArchiveMetadata.itemTitle = PatternNameMaker.Get(result.ArchiveMetadata.itemTitle, result.ID, result.InputFileName, result.MetadataText);\r
                 result.ArchiveMetadata.mediaHouseId = PatternNameMaker.Get(result.ArchiveMetadata.mediaHouseId, result.ID, result.InputFileName, result.MetadataText);\r
index 12eaceb37fd784cdb05785187b463d78ef71bab6..af91e83ce8455106f58e94d839d23e367624d29b 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.5.7")]\r
-[assembly: AssemblyFileVersion("2.0.5.7")]\r
+[assembly: AssemblyVersion("2.0.5.8")]\r
+[assembly: AssemblyFileVersion("2.0.5.8")]\r
index 524ddbfebda057304ebd099664389dcb706aee38..8fc6d2b5a72acd8ee43864e753f37d149ddb7abc 100644 (file)
@@ -30,6 +30,7 @@ namespace Maestro.Sources {
         private NexioAPI nexioAPI;\r
         private string filter;\r
         private string path;\r
+        private volatile bool initialized;\r
 \r
         public DataGridViewColumn[] Columns {\r
             get {\r
@@ -68,7 +69,7 @@ namespace Maestro.Sources {
                 };\r
                 foreach (DataGridViewColumn column in result)\r
                     column.HeaderCell.Style.Font = new Font(parent.Font, FontStyle.Regular);\r
-                \r
+\r
                 return result;\r
             }\r
         }\r
@@ -186,12 +187,18 @@ namespace Maestro.Sources {
                     OnList(d);\r
                     break;\r
                 case NexioAPI.CREATE:\r
+                    if (!initialized)\r
+                        return;\r
                     OnCreated(d);\r
                     break;\r
                 case NexioAPI.DELETE:\r
+                    if (!initialized)\r
+                        return;\r
                     OnDeleted(d);\r
                     break;\r
                 case NexioAPI.UPDATE:\r
+                    if (!initialized)\r
+                        return;\r
                     OnChanged(d);\r
                     break;\r
             }\r
@@ -222,19 +229,22 @@ namespace Maestro.Sources {
             if (l == null)\r
                 return;\r
             l.Children().ToList().Select(t => CreateItem(t, false)).Where(x => x.CanHandle(acceptableAgencies)).OrderByDescending(i => i.Created).ToList().ForEach(i => parent.SafeCall(() => Add(i)));\r
+            initialized = true;\r
         }\r
 \r
         private void OnChanged(JToken token) {\r
             if (!String.IsNullOrEmpty(filter))\r
                 return;\r
             string id = token[ID].ToString();\r
-            var item = Items.Where(x => x.ID == id).SingleOrDefault();\r
+            var item = Items.Where(x => x.ID == id).FirstOrDefault();\r
             if (item == null) {\r
-                item = CreateItem(token, true);\r
+                item = CreateItem(token, initialized);\r
                 if (!item.CanHandle(acceptableAgencies))\r
                     return;\r
                 parent.SafeCall(() => {\r
                     Add(item);\r
+                    if (!initialized)\r
+                        return;\r
                     messageBus.Send(new ModifyFileActionMsg() {\r
                         FileName = item.Name,\r
                         Source = parent\r
@@ -243,10 +253,12 @@ namespace Maestro.Sources {
             } else {\r
                 parent.SafeCall(() => {\r
                     SetItem(ref item, token);\r
-                    item.IsHighlighted = true;\r
+                    item.IsHighlighted = initialized;\r
                     if (item.CanHandle(acceptableAgencies))\r
                         return;\r
                     Remove(item);\r
+                    if (!initialized)\r
+                        return;\r
                     messageBus.Send(new RemoveFileActionMsg() {\r
                         FileName = item.Name,\r
                         Source = parent\r
@@ -276,7 +288,7 @@ namespace Maestro.Sources {
             if (!String.IsNullOrEmpty(filter))\r
                 return;\r
             string id = d[ID].ToString();\r
-            var item = this.Where(i => i.ID != null && i.ID.Equals(id)).SingleOrDefault();\r
+            var item = this.Where(i => i.ID != null && i.ID.Equals(id)).FirstOrDefault();\r
             if (item == null)\r
                 return;\r
             parent.SafeCall(() => {\r
diff --git a/client/MaestroShared/Controls/CheckableTreeView.cs b/client/MaestroShared/Controls/CheckableTreeView.cs
new file mode 100644 (file)
index 0000000..8b1ac6e
--- /dev/null
@@ -0,0 +1,52 @@
+using System;\r
+using System.Drawing;\r
+using System.Windows.Forms;\r
+\r
+namespace MaestroShared.Controls {\r
+    class CheckableTreeView : TreeView {\r
+        public delegate void OnNodeDoubleClick(object sender, TreeNodeMouseClickEventArgs args);\r
+\r
+        public OnNodeDoubleClick NodeDoubleClick;\r
+        private readonly bool[] disableCheckBoxLevels;\r
+\r
+        public CheckableTreeView(bool[] disableCheckBoxLevels) {\r
+            DrawMode = TreeViewDrawMode.OwnerDrawText;\r
+            DrawNode += OnDrawNode;\r
+            this.disableCheckBoxLevels = disableCheckBoxLevels;\r
+        }\r
+\r
+        void OnDrawNode(object sender, DrawTreeNodeEventArgs e) {\r
+            Graphics g = e.Graphics;\r
+            if ((e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected || (e.State & TreeNodeStates.Focused) == TreeNodeStates.Focused) {\r
+                using (SolidBrush brush = new SolidBrush(Color.Gainsboro)) {\r
+                    e.Graphics.FillRectangle(brush, e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height);\r
+                }\r
+                bool disableHack = false;\r
+                if (disableCheckBoxLevels.Length > e.Node.Level && disableCheckBoxLevels[e.Node.Level])\r
+                    disableHack = true;\r
+\r
+                if (!disableHack) {\r
+                    using (Pen pen = new Pen(Color.Black)) {\r
+                        pen.Width = 1;\r
+                        e.Graphics.DrawLine(pen, e.Bounds.X, e.Bounds.Y + 2, e.Bounds.X, e.Bounds.Y + e.Bounds.Height - 4);\r
+                    }\r
+                }\r
+            }\r
+            TextRenderer.DrawText(e.Graphics, e.Node.Text, Font, e.Bounds, ForeColor, TextFormatFlags.Left | TextFormatFlags.Top);\r
+        }\r
+\r
+        protected override void WndProc(ref Message m) {\r
+            // Suppress WM_LBUTTONDBLCLK\r
+            if (m.Msg == 0x203) {\r
+                var point = PointToClient(Cursor.Position);\r
+                TreeNode node = GetNodeAt(point);\r
+                TreeNodeMouseClickEventArgs args = new TreeNodeMouseClickEventArgs(node, MouseButtons.Left, 2, point.X, point.Y);\r
+                NodeDoubleClick?.Invoke(this, args);\r
+                m.Result = IntPtr.Zero;\r
+            } else\r
+                base.WndProc(ref m);\r
+        }\r
+\r
+    }\r
+\r
+}\r
index 2bb82374f430d63bb6a8415e11310f261b78de7a..4ac948d8bc9c91f184275276cb350801c2fe8549 100644 (file)
@@ -90,6 +90,9 @@
     <Compile Include="Configuration\KeysColorConverter.cs" />\r
     <Compile Include="Configuration\KeysPasswordConverter.cs" />\r
     <Compile Include="Configuration\KnownTypesBinder.cs" />\r
+    <Compile Include="Controls\CheckableTreeView.cs">\r
+      <SubType>Component</SubType>\r
+    </Compile>\r
     <Compile Include="Controls\ColorSlider.cs">\r
       <SubType>Component</SubType>\r
     </Compile>\r
index 546617b7bb11f346f0a435320354b539d56aeec9..55319e341601ce259e64b443173660a483959c24 100644 (file)
@@ -40,7 +40,7 @@ namespace NexioClient {
             };\r
 \r
             ws.OnMessage += (sender, e) => {\r
-                Debug.WriteLine("OnMessage: " + e.Data);\r
+                //Debug.WriteLine("OnMessage: " + e.Data);\r
             };\r
             ws.OnMessage += p;\r
 \r
index 60773a376a12686379fa1fced4f68eec48fb8d54..338691af73f31471ed63784592be082392cd62bb 100644 (file)
@@ -1,4 +1,5 @@
 using System;\r
+using System.Drawing;\r
 using System.Windows.Forms;\r
 \r
 namespace OctopusClient {\r
@@ -7,6 +8,33 @@ namespace OctopusClient {
 \r
         public OnNodeDoubleClick NodeDoubleClick;\r
 \r
+        public bool[] DisableCheckBoxLevels { get; set; }\r
+\r
+        public CheckableTreeView() {\r
+            DrawMode = TreeViewDrawMode.OwnerDrawText;\r
+            DrawNode += OnDrawNode;\r
+        }\r
+\r
+        void OnDrawNode(object sender, DrawTreeNodeEventArgs e) {\r
+            Graphics g = e.Graphics;\r
+            if ((e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected || (e.State & TreeNodeStates.Focused) == TreeNodeStates.Focused) {\r
+                using (SolidBrush brush = new SolidBrush(Color.Gainsboro)) {\r
+                    e.Graphics.FillRectangle(brush, e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height);\r
+                }\r
+                bool disableHack = false;\r
+                if (DisableCheckBoxLevels.Length > e.Node.Level && DisableCheckBoxLevels[e.Node.Level])\r
+                    disableHack = true;\r
+\r
+                if (!disableHack) {\r
+                    using (Pen pen = new Pen(Color.Black)) {\r
+                        pen.Width = 1;\r
+                        e.Graphics.DrawLine(pen, e.Bounds.X, e.Bounds.Y + 2, e.Bounds.X, e.Bounds.Y + e.Bounds.Height - 4);\r
+                    }\r
+                }\r
+            }\r
+            TextRenderer.DrawText(e.Graphics, e.Node.Text, Font, e.Bounds, ForeColor, TextFormatFlags.Left | TextFormatFlags.Top);\r
+        }\r
+\r
         protected override void WndProc(ref Message m) {\r
             // Suppress WM_LBUTTONDBLCLK\r
             if (m.Msg == 0x203) {\r
index 8d0617be284b5b631a6c9db09225c1ede881f106..17c36687d67dea78c30bc2fada992d01991d6105 100644 (file)
@@ -1,4 +1,6 @@
-namespace OctopusClient {\r
+using MaestroShared.Controls;\r
+\r
+namespace OctopusClient {\r
     partial class OctopusIDSelector {\r
         /// <summary> \r
         /// Required designer variable.\r
@@ -23,7 +25,7 @@
         /// the contents of this method with the code editor.\r
         /// </summary>\r
         private void InitializeComponent() {\r
-            this.treeOctopus = new OctopusClient.CheckableTreeView();\r
+            this.treeOctopus = new CheckableTreeView();\r
             this.pSeparator = new System.Windows.Forms.Panel();\r
             this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\r
             this.cbFolders = new System.Windows.Forms.ComboBox();\r
index 79f8f646b9655a0e736a72d8f83a62ab4fb0046a..8a505086a85ca7f05f65331338d8f4e7ff64c6c3 100644 (file)
@@ -30,6 +30,7 @@ namespace OctopusClient {
         public OctopusParameters Parameters {\r
             set {\r
                 parameters = value;\r
+                treeOctopus.DisableCheckBoxLevels = new[] { parameters.Configuration.DisableStoryCheck, parameters.Configuration.DisablePlaceHolderCheck };\r
                 client = new OctopusAPI(value.Configuration.Server.Address.OriginalString, value.Configuration.Server.UserName, value.Configuration.Server.Password, value.Configuration.Server.Timeout, value.MessageBus);\r
                 rbRundown.Checked = true;\r
                 RefreshFolders();\r
@@ -63,26 +64,7 @@ namespace OctopusClient {
             InitializeComponent();\r
             InitializeControls();\r
             treeOctopus.AfterCheck += OnTreeAfterCheck;\r
-            treeOctopus.DrawMode = TreeViewDrawMode.OwnerDrawText;\r
-            treeOctopus.DrawNode += OnDrawNode;\r
-            treeOctopus.NodeDoubleClick += OnNodeDoubleClick;\r
-        }\r
-\r
-        void OnDrawNode(object sender, DrawTreeNodeEventArgs e) {\r
-            Graphics g = e.Graphics;\r
-            if ((e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected || (e.State & TreeNodeStates.Focused) == TreeNodeStates.Focused) {\r
-                using (SolidBrush brush = new SolidBrush(Color.Gainsboro)) {\r
-                    e.Graphics.FillRectangle(brush, e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height);\r
-                }\r
-                if ((e.Node.Level == 0 && !parameters.Configuration.DisableStoryCheck) ||\r
-                    e.Node.Level == 1 && !parameters.Configuration.DisablePlaceHolderCheck) {\r
-                    using (Pen pen = new Pen(Color.Black)) {\r
-                        pen.Width = 1;\r
-                        e.Graphics.DrawLine(pen, e.Bounds.X, e.Bounds.Y + 2, e.Bounds.X, e.Bounds.Y + e.Bounds.Height - 4);\r
-                    }\r
-                }\r
-            }\r
-            TextRenderer.DrawText(e.Graphics, e.Node.Text, treeOctopus.Font, e.Bounds, treeOctopus.ForeColor, TextFormatFlags.Left | TextFormatFlags.Top);\r
+            treeOctopus.NodeDoubleClick = OnNodeDoubleClick;\r
         }\r
 \r
         private void InitializeControls() {\r
index a6266894ab5feb8820eddd1a4759aebd72d9f0a5..991accaac2cb30729f8b0fee90c2c5ec936b2524 100644 (file)
@@ -8,15 +8,23 @@ import user.jobengine.server.steps.IJobStep;
  * Folyamat l�p�s v�grehajt� interface.
  */
 public interface IJobStepExecutor {
+       void changePriority(IJobRuntime runtime);
+
+       boolean containsRuntime(IJobRuntime runtime);
+
+       void create(String name, int maxConcurrent) throws JobEngineException;
+
+       int getMaxConcurrent();
+
+       PriorityBlockingQueue<IJobRuntime> getQueue();
+
        /**
         * V�grehajt� l�p�s implement�ci�j�nak lek�rdez�se.
-        * 
+        *
         * @return L�p�s implement�ci�.
         */
        Class<IJobStep> getStepClass();
 
-       void create(String name, int maxConcurrent) throws JobEngineException;
-
        void revoke(IJobRuntime jobRuntime);
 
        /**
@@ -31,18 +39,12 @@ public interface IJobStepExecutor {
 
        /**
         * Folyamat elhelyez�se a v�grehajt� v�rakoz�si sor�ba.
-        * 
+        *
         * @param job
         *            Folyamat.
         */
        void submit(IJobRuntime job);
 
-       int getMaxConcurrent();
-
-       PriorityBlockingQueue<IJobRuntime> getQueue();
-
-       boolean containsRuntime(IJobRuntime runtime);
-
-       void changePriority(IJobRuntime runtime);
+       void waitShutdown();
 
 }
index e573a2eb2e5007b17bd8e521599c0d19642bc7ad..5b0d9c2aa17d57796bf6081f4cedebcf10d88d47 100644 (file)
@@ -742,11 +742,17 @@ public class JobEngine implements IJobEngine {
        }
 
        private void shutdownExecutors() {
-               if (executors != null)
-                       for (IJobStepExecutor executor : executors.values()) {
-                               logger.info("Stopping executor {}", executor.getStepClass());
-                               executor.shutdown();
-                       }
+               if (executors == null)
+                       return;
+               for (IJobStepExecutor executor : executors.values()) {
+                       logger.trace("Notify executor {}", executor.getStepClass());
+                       executor.shutdown();
+               }
+               for (IJobStepExecutor executor : executors.values()) {
+                       logger.info("Stopping executor {}", executor.getStepClass());
+                       executor.shutdown();
+               }
+
        }
 
        @Override
index 2dfdf4931c21bd03cfeab744b178593e54de38d2..4ccf2d88c1201c69fa321caa499e00aa770a595b 100644 (file)
@@ -525,7 +525,7 @@ public class JobRuntime extends Job implements IJobRuntime {
 
        @Override
        public String toString() {
-               return String.format("!%s! %d", getName(), getId());
+               return String.format("#%s - %d - %s#", getName(), getId(), status);
        }
 
 }
index 993105f14361ab543949d80514c467b94e8554bc..257909053b059f78a31dbcdabfe8f61902604d59 100644 (file)
@@ -72,6 +72,9 @@ public class JobStepExecutor implements IJobStepExecutor {
 
                public void shutdown() {
                        this.shutdown = true;
+               }
+
+               public void waitShutdown() {
                        try {
                                this.join();
                        } catch (InterruptedException e) {
@@ -216,4 +219,10 @@ public class JobStepExecutor implements IJobStepExecutor {
                //logger.info("Executor got ! {}", jobRuntime);
        }
 
+       @Override
+       public void waitShutdown() {
+               for (Worker w : workers)
+                       w.waitShutdown();
+       }
+
 }
index 0f610d2848a006884ea807d7c97e7b8f30d7887b..ed7579849346d79c9bfbb57ce7809e4cd1dc57e9 100644 (file)
@@ -24,9 +24,11 @@ import user.jobengine.server.JobChangedEvent;
 import user.jobengine.server.JobEngine;\r
 \r
 public class JobListModel extends BaseModel implements IJobChangedListener {\r
+       private class EnableServerStart {\r
+       }\r
 \r
        private static final Logger logger = LogManager.getLogger();\r
-       private List<JobChangedEvent> jobEvents = new ArrayList<JobChangedEvent>();\r
+       private List<Object> jobEvents = new ArrayList<Object>();\r
        //protected CachedListModel searchResult = null;\r
        private ListModelList<IJobRuntime> jobList = new ListModelList<IJobRuntime>();\r
        private IJobRuntime selectedJob = null;\r
@@ -136,16 +138,23 @@ public class JobListModel extends BaseModel implements IJobChangedListener {
                synchronized (jobEvents) {\r
                        if (jobEvents.size() > 0) {\r
                                boolean mustRefreshList = false;\r
-                               for (JobChangedEvent event : jobEvents) {\r
-                                       IJobRuntime job = event.getJob();\r
-                                       if (event.getSignalType().equals(SignalType.DELETE)) {\r
-                                               this.jobList.remove(event.getJob());\r
-                                               mustRefreshList = true;\r
-                                       } else if (event.getSignalType().equals(SignalType.CREATE)) {\r
-                                               this.jobList.add(event.getJob());\r
-                                               mustRefreshList = true;\r
-                                       } else if (event.getSignalType().equals(SignalType.UPDATE)) {\r
-                                               this.jobList.notifyChange(job);\r
+                               for (Object event : jobEvents) {\r
+                                       if (event instanceof JobChangedEvent) {\r
+                                               JobChangedEvent jobEvent = (JobChangedEvent) event;\r
+                                               IJobRuntime job = jobEvent.getJob();\r
+                                               if (jobEvent.getSignalType().equals(SignalType.DELETE)) {\r
+                                                       this.jobList.remove(jobEvent.getJob());\r
+                                                       mustRefreshList = true;\r
+                                               } else if (jobEvent.getSignalType().equals(SignalType.CREATE)) {\r
+                                                       this.jobList.add(jobEvent.getJob());\r
+                                                       mustRefreshList = true;\r
+                                               } else if (jobEvent.getSignalType().equals(SignalType.UPDATE)) {\r
+                                                       this.jobList.notifyChange(job);\r
+                                               }\r
+                                       }\r
+                                       if (event instanceof EnableServerStart) {\r
+                                               setStartupDisabled(false);\r
+                                               BindUtils.postNotifyChange(null, null, this, "startupDisabled");\r
                                        }\r
                                }\r
                                if (mustRefreshList) {\r
@@ -192,8 +201,9 @@ public class JobListModel extends BaseModel implements IJobChangedListener {
                        @Override\r
                        public void run() {\r
                                jobEngine.shutdown();\r
-                               setStartupDisabled(false);\r
-                               BindUtils.postNotifyChange(null, null, this, "startupDisabled");\r
+                               synchronized (jobEvents) {\r
+                                       jobEvents.add(new EnableServerStart());\r
+                               }\r
                        }\r
                };\r
                Thread t = new Thread(r);\r
index cb3fb00c7a8dfb1a93bf27ceda59661b1684c5ee..17d8c81e77da4eae91faa2005c99cd544371e937 100644 (file)
@@ -44,7 +44,7 @@ public class JobSelectorModel extends BaseModel {
                SchedulerService scheduler = jobEngine.getScheduler();\r
                ScheduledJob scheduledJob = scheduler.createScheduledJob(selectedJobElement.getDbObject());\r
                scheduledJob.setJobEngine(jobEngine);\r
-               for (int i = 0; i < 10; i++) {\r
+               for (int i = 0; i < 1; i++) {\r
 \r
                        try {\r
                                if (!scheduledJob.isActive())\r