From 09220f1b9a7efa35ae647645033b4be2c604fefb Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Wed, 14 Dec 2022 18:34:22 +0100 Subject: [PATCH] =?UTF-8?q?weitere=20Bugs=20bei=20der=20=C3=9Cbertragung?= =?UTF-8?q?=20erschlagen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsmd.dakosy/Response.cs | 2 +- bsmd.dakosy/sftp.cs | 10 ++- bsmd.dbh/MessageController.cs | 2 +- bsmd.dbh/RequestUtil.cs | 13 ++- bsmd.dbh/ResponseUtil.cs | 156 +++++++++++++++++++++++++--------- 5 files changed, 136 insertions(+), 47 deletions(-) diff --git a/bsmd.dakosy/Response.cs b/bsmd.dakosy/Response.cs index 61dc18c9..708ad964 100644 --- a/bsmd.dakosy/Response.cs +++ b/bsmd.dakosy/Response.cs @@ -45,7 +45,7 @@ namespace bsmd.dakosy File.Delete(inputFile); // alternativ: move to archive folder } // remote Dateien löschen - SFtp.RemoveProcessedFile(remoteDir, Path.GetFileName(inputFile)); + SFtp.RemoveProcessedFile(remoteDir, Path.GetFileName(inputFile), Properties.Settings.Default.SFTPSessionName); } } diff --git a/bsmd.dakosy/sftp.cs b/bsmd.dakosy/sftp.cs index 8ab67eb3..700fdb37 100644 --- a/bsmd.dakosy/sftp.cs +++ b/bsmd.dakosy/sftp.cs @@ -140,7 +140,7 @@ namespace bsmd.dakosy winscp.WaitForExit(); } - public static void RemoveProcessedFile(string remoteDir, string filename) + public static void RemoveProcessedFile(string remoteDir, string filename, string sessionName) { Process winscp = new Process(); winscp.StartInfo.FileName = Properties.Settings.Default.WINSCPFullPath; @@ -155,12 +155,18 @@ namespace bsmd.dakosy // Feed in the scripting commands winscp.StandardInput.WriteLine("option batch abort"); winscp.StandardInput.WriteLine("option confirm off"); - winscp.StandardInput.WriteLine("open " + Properties.Settings.Default.SFTPSessionName); + winscp.StandardInput.WriteLine("open " + sessionName); // winscp.StandardInput.WriteLine("ls"); if (remoteDir != null) winscp.StandardInput.WriteLine("cd " + remoteDir); winscp.StandardInput.WriteLine("rm " + filename); + if (remoteDir != null) + { + // move back up since winscp session remembers the last folder + winscp.StandardInput.WriteLine("cd .."); + winscp.StandardInput.WriteLine("cd .."); + } winscp.StandardInput.Close(); // Collect all output diff --git a/bsmd.dbh/MessageController.cs b/bsmd.dbh/MessageController.cs index 138403f9..617ee9e9 100644 --- a/bsmd.dbh/MessageController.cs +++ b/bsmd.dbh/MessageController.cs @@ -107,7 +107,7 @@ namespace bsmd.dbh File.Move(inputFile, archivePath); } // remote Dateien löschen - bsmd.dakosy.SFtp.RemoveProcessedFile(Properties.Settings.Default.RemoteOutgoingFolder, Path.GetFileName(inputFile)); + bsmd.dakosy.SFtp.RemoveProcessedFile(Properties.Settings.Default.RemoteOutgoingFolder, Path.GetFileName(inputFile), Properties.Settings.Default.SFTPSessionName); } } diff --git a/bsmd.dbh/RequestUtil.cs b/bsmd.dbh/RequestUtil.cs index 8242acdf..62ab8232 100644 --- a/bsmd.dbh/RequestUtil.cs +++ b/bsmd.dbh/RequestUtil.cs @@ -60,14 +60,22 @@ namespace bsmd.dbh root.ItemElementName = ItemChoiceType2.TransitId; } - if (message.Reset) + if(core.Cancelled ?? false) + { + root.Type = RootType.CANCEL; + } + else if (message.Reset) { RootReportingClassesToReset rrctr = new RootReportingClassesToReset(); rrctr.ReportingClassToReset = new string[1]; rrctr.ReportingClassToReset[0] = message.MessageNotificationClassDisplay; + root.Items = new object[0]; + root.Items[0] = rrctr; + root.Type = RootType.RESET; } else { + root.Type = RootType.DATA; switch (message.MessageNotificationClass) { @@ -117,8 +125,7 @@ namespace bsmd.dbh #endregion #region STAT - case Message.NotificationClass.STAT: - root.Type = RootType.DATA; + case Message.NotificationClass.STAT: RootSTAT rootStat = new RootSTAT(); STAT stat = message.Elements[0] as STAT; rootStat.ShipName = stat.ShipName; diff --git a/bsmd.dbh/ResponseUtil.cs b/bsmd.dbh/ResponseUtil.cs index 9e1e6d9a..5599c741 100644 --- a/bsmd.dbh/ResponseUtil.cs +++ b/bsmd.dbh/ResponseUtil.cs @@ -32,7 +32,10 @@ namespace bsmd.dbh if(!m.Success) { _log.WarnFormat("returned file doesn't follow naming convention NSW.DBH.BSMD.*:{0}", inputFile); return result; - } + } + + // Achtung! Die laufende Nummer der rücklaufenden Datei ist _nicht_ dieselbe und kann zur Identifikation der Meldeklasse + // nicht verwendet werden string fileSeqString = m.Groups[1].Value; @@ -41,24 +44,8 @@ namespace bsmd.dbh _log.ErrorFormat("matched file sequence number couldn't be parsed: {0}", fileSeqString); return result; } - - // load message(s?) by file seq string - Message sentMessage = DBManager.Instance.GetMessageByFileSeqNum(fileSeqNum); - if(sentMessage == null) - { - _log.ErrorFormat("cannot find a message for file sequence number {0}", fileSeqNum); - return result; - } - - MessageCore aCore = DBManager.Instance.GetMessageCoreById(sentMessage.MessageCoreId.Value); - if(aCore == null) - { - _log.ErrorFormat("There is no core with id {0}", sentMessage.MessageCoreId.Value); - return result; - } - + bsmd.dbh.Response.Root root = null; - try { XmlSerializer serializer = new XmlSerializer(typeof(bsmd.dbh.Response.Root)); @@ -67,47 +54,136 @@ namespace bsmd.dbh root = (bsmd.dbh.Response.Root) serializer.Deserialize(s); } + Message sentMessage = null; + MessageCore aCore = null; + if(Guid.TryParse(root.SenderReference, out Guid refGuid)) { - if (!sentMessage.Id.Equals(refGuid)) - _log.WarnFormat("sender ref {0} does not match sent message id {1}", refGuid, sentMessage.Id); + // load message(s?) by file seq string + sentMessage = DBManager.Instance.GetMessageById(refGuid) as Message; + if (sentMessage == null) + { + _log.ErrorFormat("cannot find a message for file sequence number {0}", fileSeqNum); + return result; + } + + aCore = DBManager.Instance.GetMessageCoreById(sentMessage.MessageCoreId.Value); + if (aCore == null) + { + _log.ErrorFormat("There is no core with id {0}", sentMessage.MessageCoreId.Value); + return result; + } } else { - _log.WarnFormat("sender ref {0} is no guid", root.SenderReference); + _log.ErrorFormat("sender ref {0} is no guid", root.SenderReference); + return result; } - switch(sentMessage.MessageNotificationClass) + switch(root.Type) { - case Message.NotificationClass.VISIT: - if(root.Type == Response.RootType.VISIT) + case Response.RootType.VISIT: + if (aCore.VisitId.IsNullOrEmpty() && !root.VisitId.IsNullOrEmpty()) { - if(aCore.VisitId.IsNullOrEmpty() && !root.VisitId.IsNullOrEmpty()) - { - aCore.VisitId = root.VisitId; - _log.InfoFormat("Received Visit-Id {0} for core {1}", root.VisitId, aCore.Id); - } + aCore.VisitId = root.VisitId; + sentMessage.SendSuccess = true; + sentMessage.Status = Message.MessageStatus.ACCEPTED; + sentMessage.InternalStatus = Message.BSMDStatus.CONFIRMED; + _log.InfoFormat("Received Visit-Id {0} for core {1}", root.VisitId, aCore.Id); } break; - case Message.NotificationClass.TRANSIT: - if (root.Type == Response.RootType.TRANSIT) + case Response.RootType.TRANSIT: + if (aCore.TransitId.IsNullOrEmpty() && !root.TransitId.IsNullOrEmpty()) { - if (aCore.TransitId.IsNullOrEmpty() && !root.TransitId.IsNullOrEmpty()) - { - aCore.TransitId = root.TransitId; - _log.InfoFormat("Received Transit-Id {0} for core {1}", root.TransitId, aCore.Id); - } + aCore.TransitId = root.TransitId; + sentMessage.SendSuccess = true; + sentMessage.Status = Message.MessageStatus.ACCEPTED; + sentMessage.InternalStatus = Message.BSMDStatus.CONFIRMED; + _log.InfoFormat("Received Transit-Id {0} for core {1}", root.TransitId, aCore.Id); } break; - default: - - + case Response.RootType.DATA: + if(root.ReportingClassesFull.ReportingClass.Length > 0) + { + _log.InfoFormat("Message {0} confirmed (full), {1} messages", sentMessage.MessageNotificationClassDisplay, root.Messages.Length); + sentMessage.SendSuccess = true; + sentMessage.Status = Message.MessageStatus.ACCEPTED; + sentMessage.InternalStatus = Message.BSMDStatus.CONFIRMED; + } + if (root.ReportingClassesPartial.ReportingClass.Length > 0) + { + _log.WarnFormat("Message {0} confirmed (partial), {1} messages", sentMessage.MessageNotificationClassDisplay, root.Messages.Length); + sentMessage.SendSuccess = true; + sentMessage.Status = Message.MessageStatus.ACCEPTED; + sentMessage.InternalStatus = Message.BSMDStatus.VIOLATION; + } + if (root.ReportingClassesError.ReportingClass.Length > 0) + { + _log.ErrorFormat("Message {0} rejected, {1} messages", sentMessage.MessageNotificationClassDisplay, root.Messages.Length); + sentMessage.SendSuccess = false; + sentMessage.Status = Message.MessageStatus.REJECTED; + sentMessage.InternalStatus = Message.BSMDStatus.ERROR; + sentMessage.StatusInfo = "Errors reported"; + } + break; + case Response.RootType.RESET: + if(root.ReportingClassesResetted.ReportingClass.Length > 0) + { + _log.InfoFormat("Message {0} RESET confirmed, {1} messages", sentMessage.MessageNotificationClassDisplay, root.Messages.Length); ; + sentMessage.SendSuccess = false; // bestätigter Reset setzt grünen Buppel zurück + sentMessage.Status = Message.MessageStatus.ACCEPTED; + sentMessage.InternalStatus = Message.BSMDStatus.CONFIRMED; + } + break; + case Response.RootType.CANCEL: + _log.InfoFormat("Core {0} CANCEL confirmed", aCore.DisplayId); + aCore.BSMDStatusInternal = MessageCore.BSMDStatus.RESPONDED; break; } + // "alte" Meldungen entfernen + foreach (MessageError existingError in sentMessage.ErrorList) + DBManager.Instance.Delete(existingError); + + foreach (MessageViolation existingViolation in sentMessage.ViolationList) + DBManager.Instance.Delete(existingViolation); + + foreach (Response.RootMessage rootMessage in root.Messages) + { + _log.InfoFormat("Message[{0}]: {1} {2} {3}", rootMessage.ID, rootMessage.Type, rootMessage.Location, rootMessage.Text); + switch(rootMessage.Type) + { + case Response.RootMessageType.ERROR: + MessageError me = new MessageError(); + me.MessageHeaderId = sentMessage.Id.Value; + me.MessageHeader = sentMessage; + me.ErrorText = rootMessage.Text; + DBManager.Instance.Save(me); + break; + case Response.RootMessageType.VIOLATION: + MessageViolation mv = new MessageViolation(); + mv.MessageHeaderId = sentMessage.Id.Value; + mv.MessageHeader = sentMessage; + mv.ViolationText = rootMessage.Text; + DBManager.Instance.Save(mv); + break; + case Response.RootMessageType.XSD_ERROR: + // TODO + break; + case Response.RootMessageType.INFO: + // TODO + break; + case Response.RootMessageType.WARNING: + // TODO + break; + } + } + + DBManager.Instance.Save(sentMessage); + if (!(aCore.Cancelled ?? false)) aCore.BSMDStatusInternal = MessageCore.BSMDStatus.RESPONDED; - + DBManager.Instance.Save(aCore); result = true; }