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