--- /dev/null
+{\r
+ "title": "Project megnyitás",\r
+ "active": false,\r
+ "startInTray": true,\r
+ "enableCustomMetadataId": true,\r
+ "defaultWindowColor": "#BDBDBD",\r
+ "partialWindowColor": "#757575",\r
+ "metadataOnly": true,\r
+ "player": {\r
+ "enabled": true,\r
+ "autoStart": false,\r
+ "segmentEditor": true\r
+ },\r
+ "source": {\r
+ "$type": "UNCSource",\r
+ "filter": "avi,wav,mxf",\r
+ "local": {\r
+ "address": "file://C:/xyz",\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
+ "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
+ },\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
+}\r
},\r
"source": {\r
"$type": "UNCSource",\r
- "filter": "avi,wav,mxf",\r
+ "filter": "mov,wav,mxf",\r
+ "foldersAutoExpand": true,\r
"local": {\r
- "address": "file://10.10.1.100/BRAAVOS/TOROKOR",\r
+ "address": "file://10.10.1.100/BRAAVOS",\r
"userName": "mediacube",\r
"password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
"timeout": 1000\r
{\r
"title": "Stúdió",\r
- "active": false,\r
+ "active": true,\r
"startInTray": false,\r
"enableCustomMetadataId": true,\r
"filter": "avi",\r
--- /dev/null
+{\r
+ "title": "TIBI SxS",\r
+ "active": false,\r
+ "startInTray": true,\r
+ "enableCustomMetadataId": true,\r
+ "defaultWindowColor": "#E0F2F1",\r
+ "partialWindowColor": "#B2DFDB",\r
+ "player": {\r
+ "enabled": true,\r
+ "autoStart": true,\r
+ "segmentEditor": true,\r
+ "extensions": [ "mxf", "mov" ]\r
+ },\r
+ "source": {\r
+ "$type": "UNCSource",\r
+ "filter": "mov,wav,mxf,jpg",\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
+ },\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
+ "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": "%ID%-%SOURCENAME%",\r
+ "saveArchiveMetadata": false,\r
+ "killDateDays": 7,\r
+ "remote": {\r
+ "address": "ftp://10.10.1.100/OCTOPUS",\r
+ "userName": "mediacube",\r
+ "password": "H7YCE8gvuGsPvN3bQSf4FTH0/4IRmoe3gKY0QvgG+wlfqS48yLhm/fDoPSRaWpDWa3RKZAnLF3pKs+lLSQX0IRVZDRCkydQP7syEwKhHztbJ+A88W9rKRF2JrQ7W6jA1",\r
+ "timeout": 1000\r
+ },\r
+ "subFolderFormat": "%IDROOT%-%TEXT%",\r
+ "tag": "Betöltés"\r
+ },\r
+ {\r
+ "label": "Traffic mappába küldés",\r
+ "processor": "FTPTargetProcessor",\r
+ "outputFormat": "%ID%-%SOURCENAME%",\r
+ "tag": "Betöltés",\r
+ "subFolderFormat": "%IDROOT%-%TEXT%",\r
+ "killDateDays": 7,\r
+ "saveArchiveMetadata": false,\r
+ "remote": {\r
+ "address": "ftp://10.10.1.100/PLAYOUT_NLE",\r
+ "userName": "mediacube",\r
+ "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+ "timeout": 1000\r
+ }\r
+ },\r
+ {\r
+ "label": "Lebonyba küldés",\r
+ "processor": "FTPTargetProcessor",\r
+ "outputFormat": "%ID%",\r
+ "tag": "Lebony",\r
+ "killDateDays": 7,\r
+ "remote": {\r
+ "address": "ftp://10.10.1.100/PLAYOUT_CHECK",\r
+ "userName": "mediacube",\r
+ "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+ "timeout": 1000\r
+ }\r
+ },\r
+ {\r
+ "label": "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
"source": {\r
"$type": "UNCSource",\r
- "filter": "avi,wav,mxf",\r
+ "filter": "mov,wav,mxf",\r
"local": {\r
- "address": "file://c:/"\r
+ "address": "file://c:/x"\r
}\r
},\r
"metadatas": [\r
"processor": "FTPTargetProcessor",\r
"outputFormat": "%ID%-%SOURCENAME%",\r
"tag": "Betöltés",\r
- "subFolderFormat": "%DATESTAMP%/%IDROOT%%TEXT%",\r
+ "subFolderFormat": "%IDROOT%-%TEXT%",\r
"killDateDays": 7,\r
"saveArchiveMetadata": false,\r
"remote": {\r
--- /dev/null
+{\r
+ "title": "Törökőr hír nyersanyag betöltő (csak MXF)",\r
+ "active": false,\r
+ "startInTray": true,\r
+ "enableCustomMetadataId": true,\r
+ "defaultWindowColor": "#10F2F1",\r
+ "partialWindowColor": "#10DFDB",\r
+ "player": {\r
+ "enabled": true,\r
+ "autoStart": false,\r
+ "segmentEditor": true\r
+ },\r
+ "source": {\r
+ "$type": "UNCSource",\r
+ "foldersAutoExpand": false,\r
+ "filter": "mxf",\r
+ "local": {\r
+ "address": "file://10.10.1.100//BRAAVOS//OCTOPUS"\r
+ },\r
+ "remote": {\r
+ "address": "ftp://10.10.1.100/OCTOPUS",\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
+ "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": "FXPTargetProcessor",\r
+ "outputFormat": "%ID%-%SOURCENAME%",\r
+ "tag": "Betöltés",\r
+ "subFolderFormat": "%IDROOT%-%TEXT%",\r
+ "killDateDays": 7,\r
+ "saveArchiveMetadata": false,\r
+ "remote": {\r
+ "address": "ftp://10.10.1.100/OCTOPUS",\r
+ "userName": "mediacube",\r
+ "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+ "timeout": 1000\r
+ }\r
+ },\r
+ {\r
+ "label": "Traffic mappába küldés",\r
+ "processor": "FXPTargetProcessor",\r
+ "outputFormat": "%ID%-%SOURCENAME%",\r
+ "tag": "Betöltés",\r
+ "subFolderFormat": "%IDROOT%-%TEXT%",\r
+ "killDateDays": 7,\r
+ "saveArchiveMetadata": false,\r
+ "remote": {\r
+ "address": "ftp://10.10.1.100/PLAYOUT_NLE",\r
+ "userName": "mediacube",\r
+ "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+ "timeout": 1000\r
+ }\r
+ },\r
+ {\r
+ "label": "Lebonyba küldés",\r
+ "processor": "FXPTargetProcessor",\r
+ "outputFormat": "%ID%",\r
+ "tag": "Lebony",\r
+ "killDateDays": 7,\r
+ "remote": {\r
+ "address": "ftp://10.10.1.100/PLAYOUT_CHECK",\r
+ "userName": "mediacube",\r
+ "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+ "timeout": 1000\r
+ }\r
+ },\r
+ {\r
+ "label": "Archiválás",\r
+ "processor": "FXPTargetProcessor",\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
- "minimizeToTray": true,\r
+ "minimizeToTray": false,\r
"userDomain": {\r
"address": "10.10.254.11",\r
"userName": "echotest",\r
--- /dev/null
+using System;\r
+using System.Collections.Concurrent;\r
+using System.IO;\r
+\r
+namespace Maestro {\r
+\r
+ public class FolderScanner<T> {\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
+\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
+ }\r
+ }\r
+\r
+ public void Put(string key, T value) {\r
+ if (cache == null)\r
+ cache = new ConcurrentDictionary<string, T>();\r
+ cache.TryAdd(key, value);\r
+ }\r
+\r
+ private string GetLastSegment(string path) {\r
+ \r
+ return Uri.UnescapeDataString(Path.GetFileName(path));\r
+ }\r
+\r
+ private T Get(string key) {\r
+ T result = default(T);\r
+ if (cache == null)\r
+ return result;\r
+ cache.TryGetValue(key, out result);\r
+ return result;\r
+ }\r
+ }\r
+}\r
<Compile Include="Commons\DataGridViewProgressColumn.cs" />\r
<Compile Include="Commons\SambaClient.cs" />\r
<Compile Include="Commons\WindowsIdentityMembers.cs" />\r
+ <Compile Include="FolderScanner.cs" />\r
<Compile Include="LoginForm.cs">\r
<SubType>Form</SubType>\r
</Compile>\r
<Compile Include="MaestroForm.Source.cs">\r
<SubType>Form</SubType>\r
</Compile>\r
+ <None Include="Configuration\ACTIVE-configuration-editor-project.json">\r
+ <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
+ </None>\r
<None Include="Configuration\configuration-archive.json">\r
<CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
</None>\r
+ <None Include="Configuration\configuration-sxs-tibi.json">\r
+ <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
+ </None>\r
+ <None Include="Configuration\configuration-torokor-t.json">\r
+ <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
+ </None>\r
<None Include="Configuration\global.json">\r
<CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
</None>\r
using Maestro.Properties;\r
+using System.Windows.Forms;\r
\r
namespace Maestro {\r
partial class MaestroForm {\r
this.treeFolders.Dock = System.Windows.Forms.DockStyle.Bottom;\r
this.treeFolders.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));\r
this.treeFolders.HotTracking = true;\r
+ this.treeFolders.Cursor = Cursors.Hand;\r
this.treeFolders.ImageIndex = 0;\r
this.treeFolders.ImageList = this.ilFolders;\r
this.treeFolders.Location = new System.Drawing.Point(10, 206);\r
QuerySegments();\r
if (movieSegments == null)\r
movieSegments = new BindingList<MovieSegment>();\r
- PlayerForm player = new PlayerForm(ref movieSegments);\r
- player.BackColor = partialColor;\r
- player.AutoStart = Configuration.Player.AutoStart;\r
- player.SegmentEditor = Configuration.Player.SegmentEditor;\r
- player.Open(SelectedSource.FileInfo);\r
- Cursor = Cursors.Default;\r
- player.ShowDialog();\r
+ OpenFile(SelectedSource.FileInfo, true);\r
UpdateDefineSegmentsStatus();\r
}\r
\r
MediaCubeMetadata metadata = Configuration.GetMetadataProvider<MediaCubeMetadata>();\r
string mcID = ARCHIVEID_PREFIX + masterId.id.ToString();\r
result.itemHouseId = string.IsNullOrEmpty(metadata?.MetadataIDFormat) ? mcID : metadata.MetadataIDFormat;\r
- result.itemTitle = String.IsNullOrEmpty(metadata?.MetadataTitleFormat) ? result.itemHouseId : metadata.MetadataTitleFormat;\r
+ result.itemTitle = result.itemHouseId;\r
result.mediaHouseId = mcID;\r
- result.mediaTitle = result.itemTitle;\r
+ result.mediaTitle = String.IsNullOrEmpty(metadata?.MetadataTitleFormat) ? result.itemHouseId : metadata.MetadataTitleFormat;\r
return result;\r
}\r
\r
using DxPlay;\r
using Maestro.Metadata;\r
using Maestro.Sources;\r
+using MaestroShared.Commons;\r
using MaestroShared.Configuration;\r
using MaestroShared.Metadata;\r
using MaestroShared.Resources;\r
\r
namespace Maestro {\r
\r
- delegate void SetTextCallback();\r
- delegate void TabControlSelectedIndex(int index);\r
+ //delegate void SetTextCallback();\r
+ //delegate void TabControlSelectedIndex(int index);\r
public partial class MaestroForm {\r
private ISource source;\r
private SourceInfo selectedSource;\r
btnShowFolders.CheckState = CheckState.Unchecked;\r
}\r
Uri address = Configuration.Source.Local.Address;\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
- foreach (var folder in folders) {\r
- TreeNode folderNode = rootNode.Nodes.Add(GetLastSegment(folder));\r
- folderNode.Nodes.Add("..");\r
- }\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
}\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
- foreach (var folder in folders) {\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
+ //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
}\r
\r
private void OnAfterSelectFolder(object sender, TreeViewEventArgs e) {\r
address = new Uri(Uri.UnescapeDataString(Path.Combine(Configuration.Source.Local.Address.LocalPath, GetPath(e.Node))));\r
if (!String.IsNullOrEmpty(address.LocalPath))\r
formTooltip.SetToolTip(groupSource, address.LocalPath);\r
- source.Reset(address.LocalPath);\r
+\r
+ if (source.Reset(address.LocalPath))\r
+ SelectedSource = null;\r
+ \r
btnShowFolders.Checked = false;\r
HideFolders();\r
}\r
if (fileSourceItem == null)\r
return;\r
dgSource.Enabled = false;\r
- Cursor = Cursors.WaitCursor;\r
- try {\r
- PlayerForm player = new PlayerForm();\r
+ OpenFile(fileSourceItem.FileInfo, false);\r
+ dgSource.Enabled = true;\r
+ }\r
+ }\r
+\r
+ private void OpenFile(FileInfo fileInfo, bool segmentEditor) {\r
+ Cursor = Cursors.WaitCursor;\r
+ try {\r
+ string[] extensions = Configuration.Player?.Extensions;\r
+\r
+ bool openInternal = false;\r
+ if (extensions != null && !String.IsNullOrEmpty(fileInfo.Extension))\r
+ openInternal = extensions.Any(e => e != null && fileInfo.Extension.Length > 0 && fileInfo.Extension.Substring(1).ToLower().Equals(e.ToLower()));\r
+\r
+ if (openInternal) {\r
+ PlayerForm player = new PlayerForm(ref movieSegments);\r
player.BackColor = partialColor;\r
player.AutoStart = Configuration.Player.AutoStart;\r
- player.Open(fileSourceItem.FileInfo);\r
+ player.SegmentEditor = Configuration.Player.SegmentEditor && segmentEditor;\r
+ player.Open(fileInfo);\r
if (!player.IsDisposed)\r
player.ShowDialog();\r
- Cursor = Cursors.Default;\r
- }\r
- catch (Exception ex) {\r
- MessageBox.Show(ex.Message);\r
+ } else {\r
+ if (segmentEditor)\r
+ return;\r
+ ProcessStartInfo psf = new ProcessStartInfo() {\r
+ FileName = fileInfo.FullName\r
+ };\r
+ Process.Start(psf);\r
}\r
\r
- dgSource.Enabled = true;\r
+ }\r
+ catch (Exception ex) {\r
+ MessageBox.Show(ex.Message);\r
+ }\r
+ finally {\r
+ Cursor = Cursors.Default;\r
}\r
}\r
\r
};\r
\r
if (SelectedMetadata.Kind == MetadataType.MediaCube) {\r
- if (true.Equals(result.ArchiveMetadata?.itemTitle?.Contains("%"))) {\r
- string title = PatternNameMaker.Get(result.ArchiveMetadata.itemTitle, result.ID, result.InputFileName, result.MetadataText);\r
- result.ArchiveMetadata.itemTitle = title;\r
- result.ArchiveMetadata.mediaTitle = title;\r
- }\r
- if (true.Equals(result.ArchiveMetadata?.itemHouseId?.Contains("%"))) {\r
- string id = PatternNameMaker.Get(result.ArchiveMetadata.itemHouseId, result.ID, result.InputFileName, result.MetadataText);\r
- if (String.IsNullOrEmpty(id))\r
- result.ArchiveMetadata.itemHouseId = result.ArchiveMetadata.mediaHouseId;\r
- else\r
- result.ArchiveMetadata.itemHouseId = id;\r
- }\r
- //result.ArchiveMetadata.mediaHouseId = id;\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
+ result.ArchiveMetadata.mediaTitle = PatternNameMaker.Get(result.ArchiveMetadata.mediaTitle, result.ID, result.InputFileName, result.MetadataText);\r
}\r
return result;\r
}\r
SetColor(groupMetadata, defaultColor);\r
SetColor(groupTarget, defaultColor);\r
SetColor(groupActions, defaultColor);\r
- ShowInTaskbar = !TrayApplicationContext.GlobalConfig.MinimizeToTray;\r
-\r
}\r
\r
private void OnMessage(IMessage message) {\r
\r
private void MaestroForm_Resize(object sender, EventArgs e) {\r
if (WindowState == FormWindowState.Minimized) {\r
- if (TrayApplicationContext.GlobalConfig.MinimizeToTray)\r
+ if (TrayApplicationContext.GlobalConfig.MinimizeToTray) \r
Visible = false;\r
}\r
}\r
\r
private void MaestroForm_FormClosing(object sender, FormClosingEventArgs e) {\r
+ //if (ModifierKeys.HasFlag()\r
if (TrayApplicationContext.GlobalConfig.MinimizeToTray)\r
Visible = false;\r
else\r
int position = jobs.IndexOf(job);\r
if (position == -1)\r
return;\r
- bindingSourceJobs.Position = position;\r
- if (chkAutoScroll.Checked)\r
+ if (chkAutoScroll.Checked) {\r
+ bindingSourceJobs.Position = position;\r
dgJobs.FirstDisplayedScrollingRowIndex = position;\r
+ }\r
});\r
job.Execute();\r
} else {\r
Config = config;\r
form.MessageBus = messageBus;\r
form.Configuration = config;\r
+ form.ShowInTaskbar = !TrayApplicationContext.GlobalConfig.MinimizeToTray;\r
\r
messageBus.Subscribe<CreateFileActionMsg>(OnFileCreated);\r
messageBus.Subscribe<RemoveFileActionMsg>(OnFileRemoved);\r
}\r
\r
public void ShowFormMinimized() {\r
- notification.Visible = false;\r
- form.WindowState = FormWindowState.Minimized;\r
form.Show();\r
+ form.WindowState = FormWindowState.Minimized;\r
+ notification.Visible = false;\r
}\r
\r
public void HideForm() {\r
form.Close();\r
form.Dispose();\r
}\r
+\r
}\r
}\r
public static GlobalInfo GlobalConfig { get; internal set; }\r
\r
public TrayApplicationContext() {\r
- string x = Regex.Replace("1234-00_aaaANYAG", "[^0-9$']", "*");\r
- Debug.WriteLine(x);\r
+ //string x = Regex.Replace("1234-00_aaaANYAG", "[^0-9$']", "*");\r
+ //Debug.WriteLine(x);\r
+\r
+ //StorageFolder musicFolder = KnownFolders.MusicLibrary;\r
}\r
\r
public static bool HasCommandlineParameter(string parameter) {\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.5")]\r
-[assembly: AssemblyFileVersion("2.0.5.5")]\r
+[assembly: AssemblyVersion("2.0.5.7")]\r
+[assembly: AssemblyFileVersion("2.0.5.7")]\r
Reset(null);\r
}\r
\r
- public void Reset(string path) {\r
- if (path != null)\r
- this.Path = path;\r
+ public bool Reset(string path) {\r
+ if (Path == null || Path.Equals(path))\r
+ return false;\r
+ Path = path;\r
Clear();\r
cache = null;\r
Shutdown();\r
+ return true;\r
}\r
\r
public FileSystemSource(Control parent, IMessageBus messageBus, bool playerEnabled, string fileExtensionFilter) {\r
if (item == null)\r
return;\r
parent.SafeCall(() => {\r
- Remove(item);\r
+ try {\r
+ Remove(item);\r
+ }\r
+ catch (Exception e) { }\r
messageBus.Send(new RemoveFileActionMsg() {\r
FileName = item.Name,\r
Source = parent\r
using System.Collections.Generic;\r
using System.IO;\r
using System.Drawing;\r
+using System.ComponentModel;\r
\r
namespace MaestroShared.Configuration {\r
\r
public bool Enabled { get; set; }\r
public bool AutoStart { get; set; }\r
public bool SegmentEditor { get; set; }\r
+ [DefaultValue(new []{"MXF"})]\r
+ [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]\r
+ public string[] Extensions { get; set; }\r
}\r
\r
public class Target {\r
int o = segment.IndexOf(UNDERSCORE);\r
if (formats[i].Contains("%") && (p > -1 || o > -1)) {\r
string pattern = null;\r
- if (p < o && p > -1)\r
+ if (p <= o && p > -1)\r
pattern = segment.Substring(0, p);\r
- else\r
+ if (pattern == null && o < p && o > -1)\r
pattern = segment.Substring(0, o);\r
+ if (pattern == null && o < p && p > -1)\r
+ pattern = segment.Substring(0, p);\r
pattern += STAR;\r
string searchResult = SearchDirectory(result, pattern);\r
if (searchResult == null)\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
+ 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
//this.OnKeyDown(e);\r
if (e.KeyCode != Keys.F5)\r
return;\r
- Refresh();\r
+ RefreshList();\r
}\r
\r
- private void Refresh() {\r
+ private void RefreshList() {\r
if (String.IsNullOrEmpty(txtFilter.Text))\r
RefreshStories();\r
else\r
private void AddStories(IEnumerable<Story> stories, bool isFolderView = false) {\r
foreach (var story in stories) {\r
string name = story.Name == null ? OctopusAPI.UNNAMED : story.Name;\r
- String ID = isFolderView ? story.ID : story.ParentStoryID;\r
+ //String ID = isFolderView ? story.ID : story.ParentStoryID;\r
+ String ID = story.ParentStoryID;\r
string label = ID;\r
if (!String.IsNullOrEmpty(story.Format))\r
label += String.Format($" [{story.Format}] {story.Name}");\r
\r
if (parameters.Configuration.DisableStoryCheck)\r
HideCheckBox(treeOctopus, storyNode);\r
- else {\r
- if (lookupStoryId != null && lookupStoryId.Equals(story.ID))\r
+\r
+ bool selectFirstChild = false;\r
+\r
+ if (lookupStoryId != null && lookupStoryId.Equals(ID)) {\r
+ if (parameters.Configuration.DisableStoryCheck)\r
+ selectFirstChild = true;\r
+ else\r
storyNode.Checked = true;\r
}\r
\r
if (parameters.Configuration.DisablePlaceHolderCheck)\r
HideCheckBox(treeOctopus, placeHolderNode);\r
else {\r
- if (lookupPlaceHolderId != null && lookupPlaceHolderId.Equals(mosObject.ObjID)) {\r
+ if ((lookupPlaceHolderId != null && lookupPlaceHolderId.Equals(mosObject.ObjID)) || selectFirstChild) {\r
+ if (selectFirstChild && selectedNode != null) {\r
+ selectFirstChild = false;\r
+ MsgBox.Warning("Fokozott flehasználói figyelemre van szükség. Az anyag kiválasztás le van tiltva a konfigurációban, így az első elérhető bejátszó került kiválasztásra.");\r
+ continue;\r
+ }\r
placeHolderNode.Checked = true;\r
storyNode.Expand();\r
placeHolderNode.EnsureVisible();\r
Story story = selectedNode.Tag as Story;\r
string text = String.IsNullOrEmpty(story.Format) ? story.Name : String.Format($"{story.Name}_{story.Format}");\r
IDChangedEvent?.Invoke(story.ParentStoryID, selectedNode.Name, text);\r
- } else\r
+ } else\r
IDChangedEvent?.Invoke(null, null, null);\r
}\r
\r
}\r
}\r
}\r
- \r
+\r
} else {\r
refreshDisabled = true;\r
dtScheduled.Value = rundown.Start;\r
cbFolders.SelectedItem = rundownToSelect;\r
}\r
}\r
- \r
+\r
}\r
txtFilter.Text = placeHolderId;\r
if (selectedNode == null)\r
\r
processor.Execute();\r
\r
- if (!TargetProcessor.READY.Equals(processor.Status) || !TargetProcessor.SKIPPED.Equals(processor.Status)) {\r
+ if (!TargetProcessor.READY.Equals(processor.Status) && !TargetProcessor.SKIPPED.Equals(processor.Status)) {\r
MsgBox.Error(processor.Message);\r
return;\r
}\r
}\r
\r
private void noFocusCueButton1_Click(object sender, EventArgs e) {\r
- Refresh();\r
+ RefreshList();\r
}\r
}\r
\r
\r
#Selenio\r
-Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl\r
--Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC_v3.zenium\r
+-Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC_v5.zenium\r
\r
#Nexio\r
-Dnexio.host=10.10.1.55\r
<argument>/command</argument>\r
<argument>"open ${remote.address} -hostkey=""${remote.hostkey}"""</argument>\r
<!-- <argument>"call ${remote.location}/stop-mediacube.sh 2>/dev/null"</argument> -->\r
-<!-- <argument>"call pcs resource disable mediacube_script"</argument> -->\r
+ <argument>"call pcs resource disable mediacube_script"</argument>\r
<!-- <argument>"call sleep 5"</argument> -->\r
<argument>"call rm -rf ${remote.location}"</argument>\r
<argument>"call mkdir ${remote.location}"</argument>\r
<executor className="user.jobengine.server.steps.MetadataTransformStep" maxConcurrent="1"/>\r
<executor className="user.jobengine.server.steps.SyncOCTOPUSDataStep" maxConcurrent="1"/>\r
<executor className="user.jobengine.server.steps.TranscodeSELENIOStep" maxConcurrent="4"/>\r
- <executor className="user.jobengine.server.steps.TSMBackupStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.TSMRestoreStep" maxConcurrent="4"/>\r
+ <executor className="user.jobengine.server.steps.TSMBackupStep" maxConcurrent="4"/>\r
+ <executor className="user.jobengine.server.steps.TSMRestoreStep" maxConcurrent="2"/>\r
+ <executor className="user.jobengine.server.steps.OutputPathAndNameSelectorStep" maxConcurrent="10"/>\r
</executors>
\ No newline at end of file
]\r
},\r
{\r
+ "active": false,\r
+ "name" : "Egy archiválás",\r
+ "template": "archive-ondemand.xml",\r
+ "executeimmediate": true,\r
+ "cronexpression": "0 0 0/1 1/1 * ? *",\r
+ "parameters": [ \r
+ {"name": "sourcePath", "value": "/mnt/ISILON/ARCHIVE/ONE", "type": "java.lang.String"},\r
+ {"name": "globalSourcePath", "value": "\\\\10.10.1.100\\BRAAVOS\\ARCHIVE\\ONE", "type": "java.lang.String"},\r
+ {"name": "transcoderTargetPath", "value": "/mnt/SELENIO", "type": "java.lang.String"},\r
+ {"name": "webPath", "value": "/mediacube/data/lowres/www/video", "type": "java.lang.String"},\r
+ {"name": "killDateDays", "value": 1, "type": "java.lang.Integer"}\r
+ ]\r
+ },\r
+ {\r
"active": false,\r
"name" : "TRAFFIC anyagok visszatöltése",\r
"template": "retrieve-traffic-missing-materials.xml",\r
*/
public enum JobStatus {
/**
- * Futtatható - a folyamat az ütemező várakozási sorában található, az
- * ütemező a megfelelő időben futtatja a gépi kódú utasításokat.
+ * Felfüggesztett - a folyamat egy manuális felfüggesztés-kérés hatására felfüggesztett állapotba került.
*/
- RUNABLE(0x0001),
- /**
- * Felfüggesztett - a folyamat egy manuális felfüggesztés-kérés hatására
- * felfüggesztett állapotba került.
- */
- SUSPENDED(0x0002),
+ SUSPENDED(0x0001),
/**
* Vége - a folyamat futása befejeződött.
*/
- FINISHED(0x0004),
+ FINISHED(0x0002),
/**
- * Végrehajtás alatt - a folyamat végrehajtó futtatja a lépést.
+ * Futtatható - a folyamat az ütemező várakozási sorában található, az ütemező a megfelelő időben futtatja a gépi kódú utasításokat.
*/
- EXECUTING(0x0008),
+ RUNABLE(0x0004),
/**
* Megszakított állapot.
*/
- CANCELED(0x0010),
+ CANCELED(0x0008),
/**
- * Végrehajtóra vár - a folyamat aktuális utasítása végrehajtót igényel,
- * annak várakozási sorában található.
+ * Végrehajtóra vár - a folyamat aktuális utasítása végrehajtót igényel, annak várakozási sorában található.
*/
- WAIT_EXECUTOR(0x0101),
+ WAIT_EXECUTOR(0x0100),
/**
- * Felfüggesztésre vár - a folyamat felfüggesztés kérelmet kapott, de még
- * nem történt meg a felfüggesztés.
+ * Válaszra vár - a folyamat egy felhasználói üzenet végrehajtása után, annak megválaszolására vár.
*/
- WAIT_SUSPEND(0x0102),
+ WAIT_USERMESSAGE(0x0102),
/**
- * Válaszra vár - a folyamat egy felhasználói üzenet végrehajtása után,
- * annak megválaszolására vár.
+ * Felfüggesztésre vár - a folyamat felfüggesztés kérelmet kapott, de még nem történt meg a felfüggesztés.
*/
- WAIT_USERMESSAGE(0x0104),
+ WAIT_SUSPEND(0x0104),
/**
- * Megszakításra vár - a folyamat megszakítási kérelmet kapott, annak
- * lefutását várja. A megszakítási folyamat eredménye CANCELED állapot lesz.
+ * Megszakításra vár - a folyamat megszakítási kérelmet kapott, annak lefutását várja. A megszakítási folyamat eredménye CANCELED állapot lesz.
+ */
+ WAIT_CANCEL(0x0108),
+ /**
+ * Végrehajtás alatt - a folyamat végrehajtó futtatja a lépést.
*/
- WAIT_CANCEL(0x0108);
+ EXECUTING(0x1000);
private final int value;
private static final String SAVING_STORY_ID = "Saving story {}";\r
private static final String SAVING_RUNDOWN = "Saving rundown : {} {}";\r
private static final String CHECKING_RUNDOWN = "Checking Rundown {} ({}/{})";\r
- private static final String FIELDS_STORIES = "stories,Story.modified,Story.name,Story.id,Story.mosObjects,Story.script,Story.type,Story.format,customColumns,CustomColumn.label,CustomColumn.value";\r
+ private static final String FIELDS_STORIES = "stories,Story.modified,Story.name,Story.id,Story.mosObjects,Story.script,Story.type,Story.format,Story.customColumns,CustomColumn.label,CustomColumn.value";\r
private static final String FIELDS_SLUGS = "slugs,Slug.story,Slug.position,Story.name,Story.id,Story.modified,Story.mosObjects,Story.script,Story.type,Story.format,Story.customColumns,CustomColumn.label,CustomColumn.value";\r
private static final String FIELDS_RUNDOWN_LIST = "id,name,modified,scheduledStart,rundownType,RundownType.name,slugs,Slug.storyId,Slug.position";\r
private static final String FIELDS_STORY_FOLDER_LIST = "id,name,modified,stories,Story.id";\r
} else\r
story.put(IOctopusAPI.MOS_OBJECTS, modifiedMOS);\r
\r
- String parentSoryId = GetCustomColumnValue(IOctopusAPI.PARENT_STORY_ID, story);\r
- if (parentSoryId == null)\r
+ String parentStoryId = GetCustomColumnValue(IOctopusAPI.PARENT_STORY_ID, story);\r
+ if (parentStoryId == null)\r
story.append(IOctopusAPI.PARENT_STORY_ID, storyID);\r
else\r
- story.append(IOctopusAPI.PARENT_STORY_ID, parentSoryId);\r
+ story.append(IOctopusAPI.PARENT_STORY_ID, parentStoryId);\r
logger.debug(SAVING_STORY_ID, storyID);\r
collection.save(story);\r
logger.trace(EXIT);\r
return mediaFiles;
}
+ public int getMediaFilesCount() {
+ return getMediaFiles() == null ? 0 : getMediaFiles().size();
+ }
+
public byte[] getPoster() {
return poster;
}
//checkParameter("StoreId", id);
this.storeId = id;
}
+
}
\ No newline at end of file
\r
<space bar="false" />\r
\r
- <div align="left" width="50%">\r
+ <div align="left" width="100%">\r
<space bar="false" />\r
<spinner constraint="no empty,min 1 max 10" value="@bind(jlm.newPriority)" width="60px" disabled="@load(jlm.updatePriorityDisabled)" />\r
<button label="Repriorizálás" onClick="@command('changeJobsPriority')" autodisable="self" disabled="@load(jlm.updatePriorityDisabled)" />\r
-<%@page import="java.util.*"%><%\r
+<%@page import="java.util.*"%>\r
+<%\r
String mediaURL = request.getParameter("mediaurl");\r
if(mediaURL == null) mediaURL = "";\r
//out.println("<BR>" + mediaURL); \r
%>\r
<head>\r
\r
- <style>\r
- .myVideoDiv-dimensions {\r
- width: 100%;\r
- height: 100%;\r
- } \r
- </style>\r
+<style>\r
+.myVideoDiv-dimensions {\r
+ width: 100%;\r
+ height: 100%;\r
+}\r
+</style>\r
\r
- <link href="/css/video-js.css" rel="stylesheet">\r
- <!-- If you'd like to support IE8 -->\r
- <script src="/js/videojs-ie8.min.js"></script>\r
- <script src="/js/video.js"></script>\r
- <script>\r
+<link href="/css/video-js.css" rel="stylesheet">\r
+<!-- If you'd like to support IE8 -->\r
+<script src="/js/videojs-ie8.min.js"></script>\r
+<script src="/js/video.js"></script>\r
+<script>\r
function resizeMediaWindow(){\r
//document frame\r
// var mediaDiv = document.getElementById("myVideoDiv");\r
\r
<body>\r
\r
-<%if(!"".equals(mediaURL) && !mediaURL.endsWith("empty.zul")){%>\r
- <video id="myVideoDiv" class="video-js" controls preload="auto" data-setup="{}">\r
- <source src="<%=mediaURL%>" type='video/mp4'>\r
- <!--source src="/zk/media_oceans.mp4" type='video/mp4' -->\r
- <!--source src="MY_VIDEO.webm" type='video/webm' -->\r
- <p class="vjs-no-js">\r
- To view this video please enable JavaScript, and consider upgrading to a web browser that\r
- <a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a>\r
- </p>\r
- </video>\r
+ <%if(!"".equals(mediaURL) && !mediaURL.endsWith("empty.zul")){%>\r
+ <video id="myVideoDiv" class="video-js" controls preload="auto"\r
+ data-setup="{}">\r
+ <script>\r
+ console.log('<%=mediaURL%>');\r
+ </script>\r
+ <source src="<%=mediaURL%>" type='video/mp4'>\r
+ <!--source src="/zk/media_oceans.mp4" type='video/mp4' -->\r
+ <!--source src="MY_VIDEO.webm" type='video/webm' -->\r
+ <p class="vjs-no-js">\r
+ To view this video please enable JavaScript, and consider upgrading\r
+ to a web browser that <a\r
+ href="http://videojs.com/html5-video-support/" target="_blank">supports\r
+ HTML5 video</a>\r
+ </p>\r
+ </video>\r
\r
-<script>\r
+ <script>\r
var player = videojs('myVideoDiv');\r
//var player = videojs.players.myVideoDiv;\r
\r
\r
</script>\r
\r
-<%}%>\r
+ <%}%>\r
\r
\r
</body>\r
<listhead sizable="true">\r
<listheader label="ID" hflex="1" align="left" />\r
<listheader label="Cím" hflex="6" align="left" />\r
+ <listheader label="Kópiák" hflex="1" align="left" />\r
</listhead>\r
<template name="model">\r
<listitem>\r
<listcell label="@load(each.houseId)" />\r
<listcell label="@load(each.title)" />\r
+ <listcell label="@load(each.mediaFilesCount)" />\r
</listitem>\r
</template>\r
</listbox>\r
void processJobStepCompletedMessage(IJobMessage message);
+ void processJobStepSkippedMessage(IJobMessage message);
+
void processReplyMessage(IJobMessage message);
void processRestartRequest(IJobMessage message);
while (!shutdown) {
try {
- IJobMessage message = messageQueue.poll(100, TimeUnit.MILLISECONDS);
- if (message != null) {
- message.process(JobEngine.this);
+ while (!messageQueue.isEmpty()) {
+ IJobMessage message = messageQueue.poll(50, TimeUnit.MILLISECONDS);
+ if (message != null) {
+ logger.info("Processing {}", message.getClass());
+ message.process(JobEngine.this);
+ }
}
} catch (InterruptedException e) {
shutdown = true;
return itemManager;
}
- private boolean isRunning;
+ private volatile boolean isRunning;
private volatile boolean shutdown = false;
private final BlockingQueue<IJobRuntime> runQueue;
private final BlockingQueue<IJobMessage> messageQueue;
private final List<JobTemplate> jobTemplates;
- private final Map<Long, IJobRuntime> jobs;
+ private final Map<Long, IJobRuntime> submittedJobs;
private final Map<String, IProgram> programs;
private final Map<String, IJobStepExecutor> executors;
- private final VM worker;
- private final MessageDispatcher dispatcher;
+ private VM worker;
+ private MessageDispatcher dispatcher;
+ private IUserMessageQueues userMessageQueues;
private final CyclicBarrier barrier;
- private final IUserMessageQueues userMessageQueues;
private final IStatusMachine statusMachine;
messageQueue = new LinkedBlockingQueue<IJobMessage>();
jobTemplates = Collections.synchronizedList(new ArrayList<JobTemplate>());
executors = new LinkedHashMap<String, IJobStepExecutor>();
- worker = new VM();
- dispatcher = new MessageDispatcher();
- userMessageQueues = new UserMessageQueues();
- jobs = createJobs();
+ submittedJobs = createJobs();
barrier = new CyclicBarrier(3);
nextJobId = new AtomicLong(0);
programs = new HashMap<String, IProgram>();
public void addToRunQueue(IJobRuntime jobRuntime) {
try {
- if (jobRuntime.getIp() == 0)
- logger.debug("Adding first Job {}-{} to run queue {}", jobRuntime.getId(), jobRuntime.getName(), jobRuntime.getProgram());
+ //if (jobRuntime.getIp() == 0)
+ logger.info("Adding Job {}-{} to run queue {}", jobRuntime.getId(), jobRuntime.getName(), jobRuntime.getProgram());
runQueue.put(jobRuntime);
} catch (Exception e) {
logger.error(e.getMessage(), e);
public synchronized void bindItemManagerService(IItemManager service) {
try {
setItemManager(service);
- loadPrograms();
- loadExecutors();
startup();
} catch (Exception e) {
logger.error("Couldn't bind itemManagerService", e);
@Override
public Job getJob(long id) {
Job result = null;
- if (jobs.containsKey(id))
- result = (Job) jobs.get(id);
+ if (submittedJobs.containsKey(id))
+ result = (Job) submittedJobs.get(id);
return result;
}
@Override
public IJobRuntime getJobById(long jobId) {
- if (!jobs.containsKey(jobId))
+ if (!submittedJobs.containsKey(jobId))
throw new NullPointerException("job");
- return jobs.get(jobId);
+ return submittedJobs.get(jobId);
}
@Override
public Map<Long, IJobRuntime> getJobs() {
- return jobs;
+ return submittedJobs;
}
protected long getNextJobId() {
for (IJobStepExecutor executor : executorList)
addStepExecutor(executor);
}
- // loadUnregisteredExecutors(stepRoot);
- // loadUnregisteredExecutors(stepsAlternateRoot);
+ loadUnregisteredExecutors(stepRoot);
+ loadUnregisteredExecutors(stepsAlternateRoot);
} catch (Exception e) {
logger.error("Error loading executors: " + e);
} finally {
statusMachine.processAction(JobAction.DONE, jobRuntime);
}
+ @Override
+ public void processJobStepSkippedMessage(IJobMessage message) {
+ IJobRuntime jobRuntime = getJobById(message.getJobId());
+ statusMachine.processAction(JobAction.SKIP, jobRuntime);
+ }
+
@Override
public void processReplyMessage(IJobMessage message) {
IJobRuntime jobRuntime = getJobById(message.getJobId());
@Override
public void removeJob(long id) {
- if (jobs.containsKey(id)) {
- IJobRuntime jobRuntime = jobs.remove(id);
+ if (submittedJobs.containsKey(id)) {
+ IJobRuntime jobRuntime = submittedJobs.remove(id);
fireJobChangedEvent(new JobChangedEvent(jobRuntime, SignalType.DELETE));
logger.info("Removed from VM {}>", jobRuntime);
}
@Override
public void sendMessage(IJobMessage jobMessage) {
- if (!shutdown)
- messageQueue.add(jobMessage);
+ messageQueue.add(jobMessage);
}
@Override
shutdown = true;
if (schedulerService != null)
schedulerService.shutdown();
+
worker.shutDown();
- dispatcher.shutDown();
shutdownExecutors();
+ dispatcher.shutDown();
try {
TSMClient.CleanUpMultithread();
@Override
public void startup() {
- worker.start();
- dispatcher.start();
try {
+ loadPrograms();
+ loadExecutors();
+
+ worker = new VM();
+ dispatcher = new MessageDispatcher();
+ userMessageQueues = new UserMessageQueues();
+
+ worker.start();
+ dispatcher.start();
+
for (IJobStepExecutor executor : executors.values())
executor.startup(this);
barrier.await();
runtime.setSubmitted(new Timestamp(System.currentTimeMillis()));
runtime.add();
addToRunQueue(runtime);
- jobs.put(runtime.getId(), runtime);
+ submittedJobs.put(runtime.getId(), runtime);
logger.info("< Added to VM {}", runtime);
}
import user.commons.JobStatus;
import user.jobengine.server.messages.JobStepCompletedMessage;
+import user.jobengine.server.messages.JobStepSkippedMessage;
import user.jobengine.server.steps.IJobStep;
public class JobStepExecutor implements IJobStepExecutor {
try {
jobRuntime = queue.poll(50, TimeUnit.MILLISECONDS);
if (jobRuntime != null) {
+ if (shutdown) {
+ jobEngine.sendMessage(new JobStepSkippedMessage(jobRuntime.getId()));
+ continue;
+ }
Object[] inputs = jobEngine.getInputsFromStack(jobRuntime);
Object[] outputs = null;
jobRuntime.setStatus(JobStatus.EXECUTING);
public enum JobAction {
/**
- * Leállítás.
+ * Le�ll�t�s.
*/
CANCEL(0x0001),
/**
- * Lépés futtatás.
+ * L�p�s futtat�s.
*/
EXECUTE(0x0002),
/**
- * Lépés kész: tényleges befejezés, vagy a megszakítás/felfüggesztés kérelem végrehajtása után.
+ * L�p�s k�sz: t�nyleges befejez�s, vagy a megszak�t�s/felf�ggeszt�s k�relem v�grehajt�sa ut�n.
*/
DONE(0x0003),
/**
- * Folytatás.
+ * Folytat�s.
*/
RESUME(0x0004),
/**
- * Folyamat futtatás.
+ * Folyamat futtat�s.
*/
RUN(0x0005),
/**
- * Felfüggesztés.
+ * Felf�ggeszt�s.
*/
SUSPEND(0x0006),
/**
- * Felhasználói üzenet.
+ * Felhaszn�l�i �zenet.
*/
MESSAGE(0x0007),
/**
- * Válasz felhasználói üzenetre.
+ * V�lasz felhaszn�l�i �zenetre.
*/
- REPLY(0x0008),
+ REPLY(0x0008),
/**
- * Kész.
+ * K�sz.
*/
- FINISH(0x0009),
- RESTART(0x000A);
+ FINISH(0x0009), RESTART(0x000A), SKIP(0x000B);
private final int value;
--- /dev/null
+package user.jobengine.server.actions;\r
+\r
+import user.commons.JobStatus;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class SkipExecutingAction implements IJobStatusAction {\r
+\r
+ @Override\r
+ public void processAction(IJobEngine jobEngine, IJobRuntime jobRuntime) {\r
+ jobRuntime.decrementInstructionPointer();\r
+ jobRuntime.setStatus(JobStatus.RUNABLE);\r
+ jobRuntime.NotifyUpdate();\r
+ jobEngine.addToRunQueue(jobRuntime);\r
+ }\r
+}\r
actions.put(new StatusMachineAction(JobAction.REPLY, JobStatus.WAIT_USERMESSAGE), new ReplyWaitUserMessageAction());\r
\r
actions.put(new StatusMachineAction(JobAction.RESTART, JobStatus.CANCELED), new RestartCanceledAction());\r
+ actions.put(new StatusMachineAction(JobAction.SKIP, JobStatus.WAIT_EXECUTOR), new SkipExecutingAction());\r
}\r
}\r
--- /dev/null
+package user.jobengine.server.messages;
+
+import user.jobengine.server.IJobEngine;
+
+public class JobStepSkippedMessage extends JobMessage {
+
+ public JobStepSkippedMessage(long jobId) {
+ super(jobId);
+ }
+
+ @Override
+ public void process(IJobEngine jobEngine) {
+ super.process(jobEngine);
+ jobEngine.processJobStepSkippedMessage(this);
+ }
+
+}
import user.jobengine.server.IJobRuntime;\r
import user.jobengine.server.JobChangedEvent;\r
import user.jobengine.server.JobEngine;\r
-import user.jobengine.server.JobRuntime;\r
\r
public class JobListModel extends BaseModel implements IJobChangedListener {\r
\r
- class JobTweaker implements Runnable {\r
- public JobTweaker() {\r
- Thread t = new Thread(this, "JobTweaker");\r
- t.start();\r
- }\r
-\r
- @Override\r
- public void run() {\r
- for (int c = 1000; true; c++) {\r
- try {\r
- for (int j = 0; j < jobList.size(); j++) {\r
- IJobRuntime job = jobList.get(j);\r
- if (j % 2 == 0) {\r
- if (job.getProgress() < 100) {\r
- job.setProgress(job.getProgress() + 2);\r
- jobEngine.fireJobChangedEvent(new JobChangedEvent(job, SignalType.UPDATE));\r
- }\r
- }\r
- if (job.getProgress() >= 100) {\r
- //calls : fireJobChangedEvent(new JobChangedEvent(job, SignalType.DELETE));\r
- jobEngine.removeJob(job.getId());\r
- jobEngine.fireJobChangedEvent(new JobChangedEvent(job, SignalType.DELETE));\r
- }\r
- }\r
-\r
- if (c % 3 == 0) {\r
- IJobRuntime newJob = createTestJob(c, 1, 50, "NEW" + c);\r
- //calls : fireJobChangedEvent(new JobChangedEvent(jobRuntime, SignalType.CREATE));\r
- jobEngine.addToRunQueue(newJob);\r
- jobEngine.fireJobChangedEvent(new JobChangedEvent(newJob, SignalType.CREATE));\r
- }\r
- Thread.sleep(1000);\r
- } catch (Exception exc) {\r
- logger.error("", exc);\r
- }\r
- }\r
- }\r
- }\r
-\r
private static final Logger logger = LogManager.getLogger();\r
private List<JobChangedEvent> jobEvents = new ArrayList<JobChangedEvent>();\r
//protected CachedListModel searchResult = null;\r
private IJobRuntime selectedJob = null;\r
private IJobEngine jobEngine = null;\r
private int newPriority = 1;\r
- private JobTweaker jobTweaker = null;\r
- private int nofJobs = 10;\r
private boolean shutdownDisabled;\r
private boolean startupDisabled;\r
\r
}\r
}\r
\r
- private IJobRuntime createTestJob(int id, int prio, int progress, String name) {\r
- IJobRuntime job = new JobRuntime();\r
- job.setId(id);\r
- job.setName(name == null ? ("Name " + id) : name);\r
- job.setPriority(prio);\r
- job.setProgress(progress);\r
- return job;\r
+ private int compare(IJobRuntime o1, IJobRuntime o2) {\r
+ return o1.getStatus().compareTo(o2.getStatus());\r
}\r
\r
@Command\r
return this.selectedJob;\r
}\r
\r
- @SuppressWarnings("unchecked")\r
@Init\r
public void init() {\r
try {\r
jobList.setMultiple(true);\r
-\r
this.jobEngine = JobEngine.getInstance();\r
\r
- if (jobEngine == null) {\r
- setStartupDisabled(true);\r
- setShutdownDisabled(true);\r
- }\r
- setShutdownDisabled(true);\r
- setStartupDisabled(true);\r
-\r
- //TESTJOBOK\r
- //test();\r
-\r
+ if (jobEngine == null)\r
+ throw new Exception("Internal error! JobEngine instance unavailable.");\r
+ setShutdownDisabled(!jobEngine.isRunning());\r
+ setStartupDisabled(jobEngine.isRunning());\r
this.jobEngine.addJobChangedEventListener(this);\r
- Map<Long, IJobRuntime> jobMap = this.jobEngine.getJobs();\r
+ initializeList();\r
\r
- jobList.addAll(jobMap.values());\r
- // List<IEntityBase> allItems = jobEngine.getItemManager().getAll(Job.class);\r
- // for (IEntityBase entity : allItems) {\r
- // jobList.add(new JobRuntime((IJob) entity));\r
- // }\r
- Collections.sort((List) jobList); //forditott sorrend?\r
} catch (Exception exc) {\r
logger.error("", exc);\r
+ setStartupDisabled(true);\r
+ setShutdownDisabled(true);\r
}\r
}\r
\r
+ private void initializeList() {\r
+ jobList.clear();\r
+ Map<Long, IJobRuntime> jobMap = this.jobEngine.getJobs();\r
+ jobList.addAll(jobMap.values());\r
+ // List<IEntityBase> allItems = jobEngine.getItemManager().getAll(Job.class);\r
+ // for (IEntityBase entity : allItems) {\r
+ // jobList.add(new JobRuntime((IJob) entity));\r
+ // }\r
+ Collections.sort(jobList, (o1, o2) -> compare(o1, o2));\r
+ }\r
+\r
public boolean isShutdownDisabled() {\r
return shutdownDisabled;\r
}\r
this.selectedJob = _selectedJob;\r
}\r
\r
- @NotifyChange({ "shutdownDisabled" })\r
+ //@NotifyChange({ "shutdownDisabled" })\r
public void setShutdownDisabled(boolean shutdownDisabled) {\r
this.shutdownDisabled = shutdownDisabled;\r
}\r
}\r
\r
@Command\r
+ @NotifyChange({ "shutdownDisabled", "startupDisabled" })\r
public void shutdown() {\r
- setShutdownDisabled(true);\r
- jobEngine.shutdown();\r
- setStartupDisabled(false);\r
+ shutdownDisabled = true;\r
+ Runnable r = new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ jobEngine.shutdown();\r
+ setStartupDisabled(false);\r
+ BindUtils.postNotifyChange(null, null, this, "startupDisabled");\r
+ }\r
+ };\r
+ Thread t = new Thread(r);\r
+ t.start();\r
}\r
\r
@Command\r
+ @NotifyChange({ "shutdownDisabled", "startupDisabled" })\r
public void startup() {\r
- setStartupDisabled(true);\r
- jobEngine.startup();\r
- setShutdownDisabled(false);\r
- }\r
-\r
- private void test() {\r
- this.jobEngine = new JobEngine();\r
- for (int j = 0; j < nofJobs; j++) {\r
- this.jobEngine.addToRunQueue(createTestJob(j, 1, j, null));\r
+ startupDisabled = true;\r
+ try {\r
+ jobEngine.startup();\r
+ } catch (Exception e) {\r
}\r
- jobTweaker = new JobTweaker();\r
+ shutdownDisabled = false;\r
+ initializeList();\r
}\r
\r
- //END OF TEST CODE ************************************************\r
}\r
import org.zkoss.zk.ui.select.Selectors;\r
import org.zkoss.zk.ui.select.annotation.Wire;\r
import org.zkoss.zul.ListModelList;\r
+import org.zkoss.zul.Messagebox;\r
import org.zkoss.zul.Window;\r
\r
import com.ibm.nosql.json.api.BasicDBObject;\r
SchedulerService scheduler = jobEngine.getScheduler();\r
ScheduledJob scheduledJob = scheduler.createScheduledJob(selectedJobElement.getDbObject());\r
scheduledJob.setJobEngine(jobEngine);\r
- for (int i = 0; i < 4; i++) {\r
+ for (int i = 0; i < 10; i++) {\r
\r
try {\r
if (!scheduledJob.isActive())\r
scheduler.executeImmediate(scheduledJob.getJobId());\r
Thread.sleep(100);\r
} catch (Exception e) {\r
- //Page not found /pages/MessageBox.zul\r
- //Messagebox.show(e.getMessage());\r
+ Messagebox.show(e.getMessage());\r
}\r
}\r
\r
boolean ret = false;\r
if (this.selectedMedia != null) {\r
List<MediaFile> mediaFiles = this.selectedMedia.getMediaFiles();\r
- for (MediaFile mf : mediaFiles) {\r
- if (mf.getStore().isLowres()) {\r
- return true;\r
+ if (mediaFiles != null) {\r
+ for (MediaFile mf : mediaFiles) {\r
+ if (mf.getStore().isLowres()) {\r
+ return true;\r
+ }\r
}\r
}\r
}\r
boolean ret = false;\r
if (this.selectedMedia != null) {\r
List<MediaFile> mediaFiles = this.selectedMedia.getMediaFiles();\r
- for (MediaFile mf : mediaFiles) {\r
- if (mf.getStore().isSystem()) {\r
- return true;\r
+ if (mediaFiles != null) {\r
+ for (MediaFile mf : mediaFiles) {\r
+ if (mf.getStore().isSystem()) {\r
+ return true;\r
+ }\r
}\r
}\r
}\r
String ret = "";\r
if (this.selectedMedia != null) {\r
List<MediaFile> mediaFiles = this.selectedMedia.getMediaFiles();\r
- for (MediaFile mf : mediaFiles) {\r
- Store store = mf.getStore();\r
- if (store.isLowres()) {\r
- StoreUri sourceStoreUri = store.getSourceStoreUri(RemoteStoreProtocol.HTTP);\r
- File f = new File("file://" + mf.getRelativePath().replace("\\", "/"));\r
- ret = String.format("%s%s%s", "/pages/mediaplayer.jsp?mediaurl=", sourceStoreUri.toString(), f.getName()).toString();\r
- break;\r
+ if (mediaFiles != null) {\r
+ for (MediaFile mf : mediaFiles) {\r
+ Store store = mf.getStore();\r
+ if (store.isLowres()) {\r
+ StoreUri sourceStoreUri = store.getSourceStoreUri(RemoteStoreProtocol.HTTP);\r
+ File f = new File("file://" + mf.getRelativePath().replace("\\", "/"));\r
+ ret = String.format("%s%s%s", "/pages/mediaplayer.jsp?mediaurl=", sourceStoreUri.toString(), f.getName()).toString();\r
+ break;\r
+ }\r
}\r
}\r
}\r
@Path("/storyFoldersByParentStoryID/{id}")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
- public Response getStoryFoldersByStoryID(@PathParam(ID) String id) {
+ public Response getStoryFoldersByParentStoryID(@PathParam(ID) String id) {
logger.trace("Entry");
Response result = null;
try {
public class TSMClient {\r
private static boolean multiThread = false;\r
private static DsmApiVersionEx apiVersionEx = null;\r
+\r
+ public static void CleanUpMultithread() throws TSMException {\r
+ if (multiThread == true) {\r
+ if (!TSMAPI.isAvailable())\r
+ return;\r
+ short rc = TSMAPI.dsmCleanUp(TSMAPIConstants.DSM_MULTITHREAD);\r
+ if (rc != TSMAPIConstants.DSM_RC_OK)\r
+ throw new TSMException(0, rc);\r
+ multiThread = false;\r
+ }\r
+ }\r
+\r
+ public static void SetUpMultithread() throws TSMException {\r
+ if (multiThread == false) {\r
+ if (!TSMAPI.isAvailable())\r
+ return;\r
+ short rc = TSMAPI.dsmSetUp(TSMAPIConstants.DSM_MULTITHREAD);\r
+ if (rc != TSMAPIConstants.DSM_RC_OK)\r
+ throw new TSMException(0, rc);\r
+ multiThread = true;\r
+ }\r
+ }\r
+\r
protected int dsmHandle = 0;\r
private String applicationType = null;\r
+\r
private boolean connected = false;\r
+\r
protected int bufferSize = 0;\r
\r
public TSMClient(String applicationType) throws Exception {\r
}\r
}\r
\r
- public void disconnect() {\r
- short rc = TSMAPI.dsmTerminate(dsmHandle);\r
- if (rc == 0)\r
- connected = false;\r
- }\r
-\r
- public int getDsmHandle(){\r
- return dsmHandle;\r
- }\r
- \r
- \r
- public void registerFilespace(String name, String type, char driveLetter, String info, long capacity, long occupancy) throws TSMException {\r
- RegFSData regFSData = new RegFSData();\r
- regFSData.setFsName(name);\r
- regFSData.setFsType(type);\r
-\r
- if (System.getProperty("os.name").toUpperCase().contains("WIN")) {\r
- DsmDosFSAttr fsAttr = new DsmDosFSAttr();\r
- fsAttr.setDriveLetter((byte) driveLetter);\r
- fsAttr.setFsInfo(info);\r
- fsAttr.setFsInfoLength((short) info.length());\r
- regFSData.setFsAttr(fsAttr);\r
- } else {\r
- DsmUnixFSAttr fsAttr = new DsmUnixFSAttr();\r
- fsAttr.setFsInfo(info);\r
- fsAttr.setFsInfoLength((short) info.length());\r
- regFSData.setFsAttr(fsAttr);\r
- }\r
- regFSData.setOccupancy(occupancy);\r
- regFSData.setCapacity(capacity);\r
- short rc;\r
- try {\r
- rc = TSMAPI.dsmRegisterFS(dsmHandle, regFSData);\r
- } catch (JNIException e) {\r
- throw new TSMException("Internal error: " + e.getMessage());\r
- }\r
- if (rc != TSMAPIConstants.DSM_RC_OK) {\r
- throw new TSMException(dsmHandle, rc);\r
- }\r
- }\r
-\r
- public void send(TSMObject object) throws NullPointerException, FileNotFoundException, IOException, TSMException {\r
- String filePath = object.getLocalFilePath();\r
- if (filePath == null) {\r
- throw new NullPointerException("localFilePath can not be null.");\r
- }\r
- File f = new File(filePath);\r
- if (!f.exists())\r
- throw new FileNotFoundException(filePath + " has not found.");\r
- long sizeEstimate = f.length();\r
- short rc;\r
- FileInputStream fis = null;\r
+ public void delete(TSMObject object) throws TSMException {\r
try {\r
- rc = TSMAPI.dsmBeginTxn(dsmHandle);\r
+ short rc = TSMAPI.dsmBeginTxn(dsmHandle);\r
if (rc != TSMAPIConstants.DSM_RC_OK)\r
throw new TSMException(dsmHandle, rc);\r
+ DsmBackupDelInfo dsmBackupDelInfo = new DsmBackupDelInfo();\r
DsmObjName objName = new DsmObjName();\r
objName.setFs(object.getFileSpaceName());\r
objName.setHl(object.getHighLevelName());\r
objName.setLl(object.getLowLevelName());\r
- objName.setObjType(TSMAPIConstants.DSM_OBJ_FILE);\r
- McBindKey mcBindKey = new McBindKey();\r
- rc = TSMAPI.dsmBindMC(dsmHandle, objName, object.getTypeDefinitionForBindMCAndSendObj(), mcBindKey);\r
- if (rc != TSMAPIConstants.DSM_RC_OK)\r
- throw new TSMException(dsmHandle, rc);\r
- ObjAttr objAttr = new ObjAttr();\r
- objAttr.setSizeEstimate(sizeEstimate);\r
- objAttr.setOwner(null);\r
- objAttr.setObjCompressed(false);\r
- objAttr.setObjInfoLength((short) 0);\r
- objAttr.setObjInfo(null);\r
- objAttr.setMcNameP(object.getManagementClassName());\r
- rc = TSMAPI.dsmSendObj(dsmHandle, object.getTypeDefinitionForBindMCAndSendObj(), object.getSendObjBuffer(), objName, objAttr, null);\r
- if (rc != TSMAPIConstants.DSM_RC_OK)\r
- throw new TSMException(dsmHandle, rc);\r
- byte buffer[] = new byte[bufferSize];\r
- fis = new FileInputStream(filePath);\r
- DataBlk dataBlk = new DataBlk();\r
- dataBlk.setBufferPtr(buffer);\r
- int length = 0;\r
- while ((length = fis.read(buffer)) > 0) {\r
- dataBlk.setBufferLen(length);\r
- rc = TSMAPI.dsmSendData(dsmHandle, dataBlk);\r
- if (rc != TSMAPIConstants.DSM_RC_OK)\r
- throw new TSMException(dsmHandle, rc);\r
- object.bytesWorked(length);\r
- }\r
- rc = TSMAPI.dsmEndSendObj(dsmHandle);\r
+ dsmBackupDelInfo.setObjName(objName);\r
+ dsmBackupDelInfo.setCopyGroup(object.getCopyGroup());\r
+ rc = TSMAPI.dsmDeleteBackupObj(dsmHandle, dsmBackupDelInfo);\r
if (rc != TSMAPIConstants.DSM_RC_OK)\r
throw new TSMException(dsmHandle, rc);\r
DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
throw new TSMException(dsmHandle, rc, endTxnExOut.getReason());\r
}\r
} catch (JNIException e1) {\r
+ throw new TSMException("Internal error: " + e1.getMessage());\r
+ } catch (TSMException e2) {\r
DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
endTxnExIn.setDsmHandle(dsmHandle);\r
endTxnExIn.setVote(TSMAPIConstants.DSM_VOTE_ABORT);\r
} catch (Exception e) {\r
}\r
;\r
- throw new TSMException("Internal error: " + e1.getMessage());\r
- } catch (TSMException e2) {\r
+ throw e2;\r
+ }\r
+ }\r
+\r
+ //Robi 2014.12.03 AVON migrator miatt.\r
+ public void deleteArchive(TSMObject object) throws TSMException {\r
+ try {\r
+ short rc = TSMAPI.dsmBeginTxn(dsmHandle);\r
+ if (rc != TSMAPIConstants.DSM_RC_OK)\r
+ throw new TSMException(dsmHandle, rc);\r
+\r
+ DsmArchiveDelInfo dsmArchiveDelInfo = new DsmArchiveDelInfo();\r
+\r
+ DsmObjName objName = new DsmObjName();\r
+ objName.setFs(object.getFileSpaceName());\r
+ objName.setHl(object.getHighLevelName());\r
+ objName.setLl(object.getLowLevelName());\r
+\r
+ dsmArchiveDelInfo.setObjName(objName);\r
+ dsmArchiveDelInfo.setCopyGroup(object.getCopyGroup());\r
+ dsmArchiveDelInfo.setObjId(object.getObjId());\r
+\r
+ rc = TSMAPI.dsmDeleteArchiveObj(dsmHandle, dsmArchiveDelInfo);\r
+\r
+ if (rc != TSMAPIConstants.DSM_RC_OK)\r
+ throw new TSMException(dsmHandle, rc);\r
DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
endTxnExIn.setDsmHandle(dsmHandle);\r
- endTxnExIn.setVote(TSMAPIConstants.DSM_VOTE_ABORT);\r
+ endTxnExIn.setVote(TSMAPIConstants.DSM_VOTE_COMMIT);\r
DsmEndTxnExOut endTxnExOut = new DsmEndTxnExOut();\r
- try {\r
- TSMAPI.dsmEndTxnEx(endTxnExIn, endTxnExOut);\r
- } catch (Exception e) {\r
+ rc = TSMAPI.dsmEndTxnEx(endTxnExIn, endTxnExOut);\r
+ if (rc != TSMAPIConstants.DSM_RC_OK) {\r
+ throw new TSMException(dsmHandle, rc, endTxnExOut.getReason());\r
}\r
- ;\r
- throw e2;\r
- } catch (IOException e3) {\r
+ } catch (JNIException e1) {\r
+ throw new TSMException("Internal error: " + e1.getMessage());\r
+ } catch (TSMException e2) {\r
DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
endTxnExIn.setDsmHandle(dsmHandle);\r
endTxnExIn.setVote(TSMAPIConstants.DSM_VOTE_ABORT);\r
} catch (Exception e) {\r
}\r
;\r
- throw e3;\r
- } finally {\r
- if (fis != null)\r
- fis.close();\r
+ throw e2;\r
}\r
}\r
\r
+ public void disconnect() {\r
+ short rc = TSMAPI.dsmTerminate(dsmHandle);\r
+ if (rc == 0)\r
+ connected = false;\r
+ }\r
+\r
+ public TSMBackupFileObject getActiveBackupFileObject(String filespaceName, String highLevelName, String lowLevelName) throws TSMException {\r
+ String fsQuery = filespaceName;\r
+ String hlQuery = highLevelName;\r
+ String llQuery = lowLevelName;\r
+ TSMBackupFileObject[] result = queryActiveBackupObjects(fsQuery, hlQuery, llQuery);\r
+ return (result.length == 0) ? null : result[0];\r
+ }\r
+\r
+ public TSMArchiveFileObject getArchiveObjects(String filespaceName, String highLevelName, String lowLevelName) throws TSMException {\r
+ TSMArchiveFileObject[] result = queryArchiveObjects(filespaceName, highLevelName, lowLevelName);\r
+ return (result.length == 0) ? null : result[0];\r
+ }\r
+\r
+ public int getBufferSize() {\r
+ return bufferSize;\r
+ }\r
+\r
+ public int getDsmHandle() {\r
+ return dsmHandle;\r
+ }\r
+\r
+ public boolean isConnected() {\r
+ return connected;\r
+ }\r
+\r
private TSMBackupFileObject[] queryActiveBackupObjects(String fsQuery, String hlQuery, String llQuery) throws TSMException {\r
TSMBackupFileObject result[] = null;\r
Vector<TSMBackupFileObject> objects = new Vector<TSMBackupFileObject>();\r
return result;\r
}\r
\r
- public TSMArchiveFileObject getArchiveObjects(String filespaceName, String highLevelName, String lowLevelName) throws TSMException {\r
- TSMArchiveFileObject[] result = queryArchiveObjects(filespaceName, highLevelName, lowLevelName);\r
- return (result.length == 0) ? null : result[0];\r
- }\r
-\r
private TSMArchiveFileObject[] queryArchiveObjects(String fsQuery, String hlQuery, String llQuery) throws TSMException {\r
TSMArchiveFileObject result[] = null;\r
Vector<TSMArchiveFileObject> objects = new Vector<TSMArchiveFileObject>();\r
}\r
}\r
\r
- public TSMBackupFileObject getActiveBackupFileObject(String filespaceName, String highLevelName, String lowLevelName) throws TSMException {\r
- String fsQuery = filespaceName;\r
- String hlQuery = highLevelName;\r
- String llQuery = lowLevelName;\r
- TSMBackupFileObject[] result = queryActiveBackupObjects(fsQuery, hlQuery, llQuery);\r
- return (result.length == 0) ? null : result[0];\r
+ public void registerFilespace(String name, String type, char driveLetter, String info, long capacity, long occupancy) throws TSMException {\r
+ RegFSData regFSData = new RegFSData();\r
+ regFSData.setFsName(name);\r
+ regFSData.setFsType(type);\r
+\r
+ if (System.getProperty("os.name").toUpperCase().contains("WIN")) {\r
+ DsmDosFSAttr fsAttr = new DsmDosFSAttr();\r
+ fsAttr.setDriveLetter((byte) driveLetter);\r
+ fsAttr.setFsInfo(info);\r
+ fsAttr.setFsInfoLength((short) info.length());\r
+ regFSData.setFsAttr(fsAttr);\r
+ } else {\r
+ DsmUnixFSAttr fsAttr = new DsmUnixFSAttr();\r
+ fsAttr.setFsInfo(info);\r
+ fsAttr.setFsInfoLength((short) info.length());\r
+ regFSData.setFsAttr(fsAttr);\r
+ }\r
+ regFSData.setOccupancy(occupancy);\r
+ regFSData.setCapacity(capacity);\r
+ short rc;\r
+ try {\r
+ rc = TSMAPI.dsmRegisterFS(dsmHandle, regFSData);\r
+ } catch (JNIException e) {\r
+ throw new TSMException("Internal error: " + e.getMessage());\r
+ }\r
+ if (rc != TSMAPIConstants.DSM_RC_OK) {\r
+ throw new TSMException(dsmHandle, rc);\r
+ }\r
}\r
\r
- public void delete(TSMObject object) throws TSMException {\r
+ public void send(TSMObject object) throws NullPointerException, FileNotFoundException, IOException, TSMException {\r
+ String filePath = object.getLocalFilePath();\r
+ if (filePath == null) {\r
+ throw new NullPointerException("localFilePath can not be null.");\r
+ }\r
+ File f = new File(filePath);\r
+ if (!f.exists())\r
+ throw new FileNotFoundException(filePath + " has not found.");\r
+ long sizeEstimate = f.length();\r
+ short rc;\r
+ FileInputStream fis = null;\r
try {\r
- short rc = TSMAPI.dsmBeginTxn(dsmHandle);\r
+ rc = TSMAPI.dsmBeginTxn(dsmHandle);\r
if (rc != TSMAPIConstants.DSM_RC_OK)\r
throw new TSMException(dsmHandle, rc);\r
- DsmBackupDelInfo dsmBackupDelInfo = new DsmBackupDelInfo();\r
DsmObjName objName = new DsmObjName();\r
objName.setFs(object.getFileSpaceName());\r
objName.setHl(object.getHighLevelName());\r
objName.setLl(object.getLowLevelName());\r
- dsmBackupDelInfo.setObjName(objName);\r
- dsmBackupDelInfo.setCopyGroup(object.getCopyGroup());\r
- rc = TSMAPI.dsmDeleteBackupObj(dsmHandle, dsmBackupDelInfo);\r
+ objName.setObjType(TSMAPIConstants.DSM_OBJ_FILE);\r
+ McBindKey mcBindKey = new McBindKey();\r
+ rc = TSMAPI.dsmBindMC(dsmHandle, objName, object.getTypeDefinitionForBindMCAndSendObj(), mcBindKey);\r
+ if (rc != TSMAPIConstants.DSM_RC_OK)\r
+ throw new TSMException(dsmHandle, rc);\r
+ ObjAttr objAttr = new ObjAttr();\r
+ objAttr.setSizeEstimate(sizeEstimate);\r
+ objAttr.setOwner(null);\r
+ objAttr.setObjCompressed(false);\r
+ objAttr.setObjInfoLength((short) 0);\r
+ objAttr.setObjInfo(null);\r
+ objAttr.setMcNameP(object.getManagementClassName());\r
+ rc = TSMAPI.dsmSendObj(dsmHandle, object.getTypeDefinitionForBindMCAndSendObj(), object.getSendObjBuffer(), objName, objAttr, null);\r
+ if (rc != TSMAPIConstants.DSM_RC_OK)\r
+ throw new TSMException(dsmHandle, rc);\r
+ byte buffer[] = new byte[bufferSize];\r
+ fis = new FileInputStream(filePath);\r
+ DataBlk dataBlk = new DataBlk();\r
+ dataBlk.setBufferPtr(buffer);\r
+ int length = 0;\r
+ while ((length = fis.read(buffer)) > 0) {\r
+ dataBlk.setBufferLen(length);\r
+ rc = TSMAPI.dsmSendData(dsmHandle, dataBlk);\r
+ if (rc != TSMAPIConstants.DSM_RC_OK)\r
+ throw new TSMException(dsmHandle, rc);\r
+ object.bytesWorked(length);\r
+ }\r
+ rc = TSMAPI.dsmEndSendObj(dsmHandle);\r
if (rc != TSMAPIConstants.DSM_RC_OK)\r
throw new TSMException(dsmHandle, rc);\r
DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
throw new TSMException(dsmHandle, rc, endTxnExOut.getReason());\r
}\r
} catch (JNIException e1) {\r
- throw new TSMException("Internal error: " + e1.getMessage());\r
- } catch (TSMException e2) {\r
DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
endTxnExIn.setDsmHandle(dsmHandle);\r
endTxnExIn.setVote(TSMAPIConstants.DSM_VOTE_ABORT);\r
} catch (Exception e) {\r
}\r
;\r
- throw e2;\r
- }\r
- }\r
-\r
- //Robi 2014.12.03 AVON migrator miatt.\r
- public void deleteArchive(TSMObject object) throws TSMException {\r
- try {\r
- short rc = TSMAPI.dsmBeginTxn(dsmHandle);\r
- if( rc != TSMAPIConstants.DSM_RC_OK )\r
- throw new TSMException(dsmHandle, rc);\r
- \r
- DsmArchiveDelInfo dsmArchiveDelInfo = new DsmArchiveDelInfo();\r
- \r
- DsmObjName objName = new DsmObjName();\r
- objName.setFs(object.getFileSpaceName());\r
- objName.setHl(object.getHighLevelName());\r
- objName.setLl(object.getLowLevelName());\r
- \r
- dsmArchiveDelInfo.setObjName(objName);\r
- dsmArchiveDelInfo.setCopyGroup(object.getCopyGroup());\r
- dsmArchiveDelInfo.setObjId(object.getObjId());\r
- \r
- rc = TSMAPI.dsmDeleteArchiveObj(dsmHandle, dsmArchiveDelInfo);\r
- \r
- if( rc != TSMAPIConstants.DSM_RC_OK )\r
- throw new TSMException(dsmHandle, rc);\r
+ throw new TSMException("Internal error: " + e1.getMessage());\r
+ } catch (TSMException e2) {\r
DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
endTxnExIn.setDsmHandle(dsmHandle);\r
- endTxnExIn.setVote(TSMAPIConstants.DSM_VOTE_COMMIT);\r
+ endTxnExIn.setVote(TSMAPIConstants.DSM_VOTE_ABORT);\r
DsmEndTxnExOut endTxnExOut = new DsmEndTxnExOut();\r
- rc = TSMAPI.dsmEndTxnEx(endTxnExIn, endTxnExOut);\r
- if( rc != TSMAPIConstants.DSM_RC_OK ) {\r
- throw new TSMException(dsmHandle, rc, endTxnExOut.getReason());\r
+ try {\r
+ TSMAPI.dsmEndTxnEx(endTxnExIn, endTxnExOut);\r
+ } catch (Exception e) {\r
}\r
- } catch(JNIException e1) {\r
- throw new TSMException("Internal error: " + e1.getMessage());\r
- } catch(TSMException e2) {\r
+ ;\r
+ throw e2;\r
+ } catch (IOException e3) {\r
DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
endTxnExIn.setDsmHandle(dsmHandle);\r
endTxnExIn.setVote(TSMAPIConstants.DSM_VOTE_ABORT);\r
DsmEndTxnExOut endTxnExOut = new DsmEndTxnExOut();\r
- try { TSMAPI.dsmEndTxnEx(endTxnExIn, endTxnExOut); } catch(Exception e) {};\r
- throw e2;\r
+ try {\r
+ TSMAPI.dsmEndTxnEx(endTxnExIn, endTxnExOut);\r
+ } catch (Exception e) {\r
+ }\r
+ ;\r
+ throw e3;\r
+ } finally {\r
+ if (fis != null)\r
+ fis.close();\r
}\r
}\r
- \r
- \r
- public boolean isConnected() {\r
- return connected;\r
- }\r
\r
public void setBufferSize(int bufferSize) {\r
this.bufferSize = bufferSize;\r
}\r
-\r
- public int getBufferSize() {\r
- return bufferSize;\r
- }\r
-\r
- public static void SetUpMultithread() throws TSMException {\r
- if (multiThread == false) {\r
- short rc = TSMAPI.dsmSetUp(TSMAPIConstants.DSM_MULTITHREAD);\r
- if (rc != TSMAPIConstants.DSM_RC_OK)\r
- throw new TSMException(0, rc);\r
- multiThread = true;\r
- }\r
- }\r
-\r
- public static void CleanUpMultithread() throws TSMException {\r
- if (multiThread == true) {\r
- short rc = TSMAPI.dsmCleanUp(TSMAPIConstants.DSM_MULTITHREAD);\r
- if (rc != TSMAPIConstants.DSM_RC_OK)\r
- throw new TSMException(0, rc);\r
- multiThread = false;\r
- }\r
- }\r
}\r
\r
public class TSMAPI {\r
\r
+ private static boolean isAvailable;\r
static {\r
- System.loadLibrary("tsmapi-1.1");\r
+ try {\r
+ System.loadLibrary("tsmapi-1.1");\r
+ isAvailable = true;\r
+ } catch (UnsatisfiedLinkError e) {\r
+ }\r
}\r
\r
- public static native void dsmQueryApiVersionEx(DsmApiVersionEx apiVersionExP) throws JNIException;\r
- public static native short dsmSetUp(boolean mtFlag);\r
- public static native short dsmCleanUp(boolean mtFlag);\r
- public static native short dsmInitEx(DsmHandle dsmHandleP, DsmInitExIn dsmInitExInP, DsmInitExOut dsmInitExOutP) throws JNIException;\r
- public static native short dsmTerminate(int dsmHandle);\r
- public static native short dsmRegisterFS(int dsmHandle, RegFSData regFilespaceP) throws JNIException;\r
+ public static native short dsmBeginArchiveQuery(int dsmHandle, QryArchiveData qryArchiveData) throws JNIException;\r
+\r
+ public static native short dsmBeginBackupQuery(int dsmHandle, QryBackupData qryBackupData) throws JNIException;\r
+\r
+ public static native short dsmBeginGetData(int dsmHandle, boolean mountWait, short getType, DsmGetList dsmGetObjListP, PartialObjData partialObjDataP)\r
+ throws JNIException;\r
+\r
public static native short dsmBeginTxn(int dsmHandle);\r
- public static native short dsmEndTxnEx(DsmEndTxnExIn endTxnExInP, DsmEndTxnExOut endTxnExOutP) throws JNIException;\r
+\r
public static native short dsmBindMC(int dsmHandle, DsmObjName objNameP, short sendType, McBindKey mcBindKeyP) throws JNIException;\r
- public static native short dsmSendObj(int dsmHandle, short sendType, Object sendBuff, DsmObjName objNameP, ObjAttr objAttrPtr, DataBlk dataBlkPtr) throws JNIException;\r
- public static native short dsmSendData(int dsmHandle, DataBlk dataBlkPtr) throws JNIException;\r
+\r
+ public static native short dsmCleanUp(boolean mtFlag);\r
+\r
+ public static native short dsmDeleteArchiveObj(int dsmHandle, DsmArchiveDelInfo dsmArchiveDelInfo) throws JNIException;\r
+\r
+ public static native short dsmDeleteBackupObj(int dsmHandle, DsmBackupDelInfo dsmBackupDelInfo) throws JNIException;\r
+\r
+ public static native short dsmEndGetData(int dsmHandle);\r
+\r
+ public static native short dsmEndGetObj(int dsmHandle);\r
+\r
+ public static native short dsmEndQuery(int dsmHandle);\r
+\r
public static native short dsmEndSendObj(int dsmHandle);\r
- public static native short dsmBeginBackupQuery(int dsmHandle, QryBackupData qryBackupData) throws JNIException;\r
- public static native short dsmGetNextBackupQObj(int dsmHandle, QryRespBackupData backupQueryResponse) throws JNIException;\r
- public static native short dsmBeginArchiveQuery(int dsmHandle, QryArchiveData qryArchiveData) throws JNIException;\r
+\r
+ public static native short dsmEndTxnEx(DsmEndTxnExIn endTxnExInP, DsmEndTxnExOut endTxnExOutP) throws JNIException;\r
+\r
+ public static native short dsmGetData(int dsmHandle, DataBlk dataBlkPtr) throws JNIException;\r
+\r
public static native short dsmGetNextArchiveQObj(int dsmHandle, QryRespArchiveData qryRespArchiveData) throws JNIException;\r
- public static native short dsmEndQuery(int dsmHandle);\r
- public static native short dsmBeginGetData(int dsmHandle, boolean mountWait, short getType, DsmGetList dsmGetObjListP, PartialObjData partialObjDataP) throws JNIException;\r
+\r
+ public static native short dsmGetNextBackupQObj(int dsmHandle, QryRespBackupData backupQueryResponse) throws JNIException;\r
+\r
public static native short dsmGetObj(int dsmHandle, long objId, DataBlk dataBlkPtr) throws JNIException;\r
- public static native short dsmGetData(int dsmHandle, DataBlk dataBlkPtr) throws JNIException;\r
- public static native short dsmEndGetObj(int dsmHandle);\r
- public static native short dsmEndGetData(int dsmHandle);\r
- public static native short dsmDeleteBackupObj(int dsmHandle, DsmBackupDelInfo dsmBackupDelInfo) throws JNIException;\r
- public static native short dsmDeleteArchiveObj(int dsmHandle, DsmArchiveDelInfo dsmArchiveDelInfo) throws JNIException;\r
+\r
+ public static native short dsmInitEx(DsmHandle dsmHandleP, DsmInitExIn dsmInitExInP, DsmInitExOut dsmInitExOutP) throws JNIException;\r
+\r
+ public static native void dsmQueryApiVersionEx(DsmApiVersionEx apiVersionExP) throws JNIException;\r
+\r
public static native String dsmRCMsg(int dsmHandle, short dsmRC);\r
+\r
+ public static native short dsmRegisterFS(int dsmHandle, RegFSData regFilespaceP) throws JNIException;\r
+\r
+ public static native short dsmSendData(int dsmHandle, DataBlk dataBlkPtr) throws JNIException;\r
+\r
+ public static native short dsmSendObj(int dsmHandle, short sendType, Object sendBuff, DsmObjName objNameP, ObjAttr objAttrPtr, DataBlk dataBlkPtr)\r
+ throws JNIException;\r
+\r
+ public static native short dsmSetUp(boolean mtFlag);\r
+\r
+ public static native short dsmTerminate(int dsmHandle);\r
+\r
+ public static boolean isAvailable() {\r
+ return isAvailable;\r
+ }\r
}\r