--- /dev/null
+{\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
{\r
"title": "Archiválás",\r
- "active": true,\r
+ "active": false,\r
"startInTray": false,\r
"enableCustomMetadataId": true,\r
"player": {\r
"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
"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
"title": "Stúdió",\r
- "active": true,\r
+ "active": false,\r
"startInTray": false,\r
"enableCustomMetadataId": true,\r
"filter": "avi",\r
"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
"$type": "UNCSource",\r
"filter": "mov,wav,mxf",\r
"local": {\r
- "address": "file://c:/x"\r
+ "address": "file://c:/"\r
}\r
},\r
"metadatas": [\r
-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
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
}\r
\r
private string GetLastSegment(string path) {\r
- \r
+\r
return Uri.UnescapeDataString(Path.GetFileName(path));\r
}\r
\r
<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
}\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
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
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
// 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
private NexioAPI nexioAPI;\r
private string filter;\r
private string path;\r
+ private volatile bool initialized;\r
\r
public DataGridViewColumn[] Columns {\r
get {\r
};\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
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
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
} 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
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
--- /dev/null
+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
<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
};\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
using System;\r
+using System.Drawing;\r
using System.Windows.Forms;\r
\r
namespace OctopusClient {\r
\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
-namespace OctopusClient {\r
+using MaestroShared.Controls;\r
+\r
+namespace OctopusClient {\r
partial class OctopusIDSelector {\r
/// <summary> \r
/// Required designer variable.\r
/// 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
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
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
* 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);
/**
/**
* 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();
}
}
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
@Override
public String toString() {
- return String.format("!%s! %d", getName(), getId());
+ return String.format("#%s - %d - %s#", getName(), getId(), status);
}
}
public void shutdown() {
this.shutdown = true;
+ }
+
+ public void waitShutdown() {
try {
this.join();
} catch (InterruptedException e) {
//logger.info("Executor got ! {}", jobRuntime);
}
+ @Override
+ public void waitShutdown() {
+ for (Worker w : workers)
+ w.waitShutdown();
+ }
+
}
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
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
@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
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