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