weitere Bugs bei der Übertragung erschlagen

This commit is contained in:
Daniel Schick 2022-12-14 18:34:22 +01:00
parent f0d3f5cbb1
commit 09220f1b9a
5 changed files with 136 additions and 47 deletions

View File

@ -45,7 +45,7 @@ namespace bsmd.dakosy
File.Delete(inputFile); // alternativ: move to archive folder File.Delete(inputFile); // alternativ: move to archive folder
} }
// remote Dateien löschen // remote Dateien löschen
SFtp.RemoveProcessedFile(remoteDir, Path.GetFileName(inputFile)); SFtp.RemoveProcessedFile(remoteDir, Path.GetFileName(inputFile), Properties.Settings.Default.SFTPSessionName);
} }
} }

View File

@ -140,7 +140,7 @@ namespace bsmd.dakosy
winscp.WaitForExit(); winscp.WaitForExit();
} }
public static void RemoveProcessedFile(string remoteDir, string filename) public static void RemoveProcessedFile(string remoteDir, string filename, string sessionName)
{ {
Process winscp = new Process(); Process winscp = new Process();
winscp.StartInfo.FileName = Properties.Settings.Default.WINSCPFullPath; winscp.StartInfo.FileName = Properties.Settings.Default.WINSCPFullPath;
@ -155,12 +155,18 @@ namespace bsmd.dakosy
// Feed in the scripting commands // Feed in the scripting commands
winscp.StandardInput.WriteLine("option batch abort"); winscp.StandardInput.WriteLine("option batch abort");
winscp.StandardInput.WriteLine("option confirm off"); winscp.StandardInput.WriteLine("option confirm off");
winscp.StandardInput.WriteLine("open " + Properties.Settings.Default.SFTPSessionName); winscp.StandardInput.WriteLine("open " + sessionName);
// winscp.StandardInput.WriteLine("ls"); // winscp.StandardInput.WriteLine("ls");
if (remoteDir != null) if (remoteDir != null)
winscp.StandardInput.WriteLine("cd " + remoteDir); winscp.StandardInput.WriteLine("cd " + remoteDir);
winscp.StandardInput.WriteLine("rm " + filename); 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(); winscp.StandardInput.Close();
// Collect all output // Collect all output

View File

@ -107,7 +107,7 @@ namespace bsmd.dbh
File.Move(inputFile, archivePath); File.Move(inputFile, archivePath);
} }
// remote Dateien löschen // 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);
} }
} }

View File

@ -60,14 +60,22 @@ namespace bsmd.dbh
root.ItemElementName = ItemChoiceType2.TransitId; root.ItemElementName = ItemChoiceType2.TransitId;
} }
if (message.Reset) if(core.Cancelled ?? false)
{
root.Type = RootType.CANCEL;
}
else if (message.Reset)
{ {
RootReportingClassesToReset rrctr = new RootReportingClassesToReset(); RootReportingClassesToReset rrctr = new RootReportingClassesToReset();
rrctr.ReportingClassToReset = new string[1]; rrctr.ReportingClassToReset = new string[1];
rrctr.ReportingClassToReset[0] = message.MessageNotificationClassDisplay; rrctr.ReportingClassToReset[0] = message.MessageNotificationClassDisplay;
root.Items = new object[0];
root.Items[0] = rrctr;
root.Type = RootType.RESET;
} }
else else
{ {
root.Type = RootType.DATA;
switch (message.MessageNotificationClass) switch (message.MessageNotificationClass)
{ {
@ -117,8 +125,7 @@ namespace bsmd.dbh
#endregion #endregion
#region STAT #region STAT
case Message.NotificationClass.STAT: case Message.NotificationClass.STAT:
root.Type = RootType.DATA;
RootSTAT rootStat = new RootSTAT(); RootSTAT rootStat = new RootSTAT();
STAT stat = message.Elements[0] as STAT; STAT stat = message.Elements[0] as STAT;
rootStat.ShipName = stat.ShipName; rootStat.ShipName = stat.ShipName;

View File

@ -32,7 +32,10 @@ namespace bsmd.dbh
if(!m.Success) { if(!m.Success) {
_log.WarnFormat("returned file doesn't follow naming convention NSW.DBH.BSMD.*:{0}", inputFile); _log.WarnFormat("returned file doesn't follow naming convention NSW.DBH.BSMD.*:{0}", inputFile);
return result; 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; 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); _log.ErrorFormat("matched file sequence number couldn't be parsed: {0}", fileSeqString);
return result; 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; bsmd.dbh.Response.Root root = null;
try try
{ {
XmlSerializer serializer = new XmlSerializer(typeof(bsmd.dbh.Response.Root)); XmlSerializer serializer = new XmlSerializer(typeof(bsmd.dbh.Response.Root));
@ -67,47 +54,136 @@ namespace bsmd.dbh
root = (bsmd.dbh.Response.Root) serializer.Deserialize(s); root = (bsmd.dbh.Response.Root) serializer.Deserialize(s);
} }
Message sentMessage = null;
MessageCore aCore = null;
if(Guid.TryParse(root.SenderReference, out Guid refGuid)) if(Guid.TryParse(root.SenderReference, out Guid refGuid))
{ {
if (!sentMessage.Id.Equals(refGuid)) // load message(s?) by file seq string
_log.WarnFormat("sender ref {0} does not match sent message id {1}", refGuid, sentMessage.Id); 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 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: case Response.RootType.VISIT:
if(root.Type == Response.RootType.VISIT) if (aCore.VisitId.IsNullOrEmpty() && !root.VisitId.IsNullOrEmpty())
{ {
if(aCore.VisitId.IsNullOrEmpty() && !root.VisitId.IsNullOrEmpty()) aCore.VisitId = root.VisitId;
{ sentMessage.SendSuccess = true;
aCore.VisitId = root.VisitId; sentMessage.Status = Message.MessageStatus.ACCEPTED;
_log.InfoFormat("Received Visit-Id {0} for core {1}", root.VisitId, aCore.Id); sentMessage.InternalStatus = Message.BSMDStatus.CONFIRMED;
} _log.InfoFormat("Received Visit-Id {0} for core {1}", root.VisitId, aCore.Id);
} }
break; break;
case Message.NotificationClass.TRANSIT: case Response.RootType.TRANSIT:
if (root.Type == Response.RootType.TRANSIT) if (aCore.TransitId.IsNullOrEmpty() && !root.TransitId.IsNullOrEmpty())
{ {
if (aCore.TransitId.IsNullOrEmpty() && !root.TransitId.IsNullOrEmpty()) aCore.TransitId = root.TransitId;
{ sentMessage.SendSuccess = true;
aCore.TransitId = root.TransitId; sentMessage.Status = Message.MessageStatus.ACCEPTED;
_log.InfoFormat("Received Transit-Id {0} for core {1}", root.TransitId, aCore.Id); sentMessage.InternalStatus = Message.BSMDStatus.CONFIRMED;
} _log.InfoFormat("Received Transit-Id {0} for core {1}", root.TransitId, aCore.Id);
} }
break; 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; 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)) if (!(aCore.Cancelled ?? false))
aCore.BSMDStatusInternal = MessageCore.BSMDStatus.RESPONDED; aCore.BSMDStatusInternal = MessageCore.BSMDStatus.RESPONDED;
DBManager.Instance.Save(aCore); DBManager.Instance.Save(aCore);
result = true; result = true;
} }