git_bsmd/nsw/Source/bsmd.hisnord/Response.cs
Daniel Schick b46b3606ac neue Version ENI (mit Benutzerverwaltung)
weitere Versuch mit der Schnittstelle (xsd generiert, ..)
2017-07-26 19:49:21 +00:00

107 lines
4.3 KiB
C#

using bsmd.database;
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using log4net;
namespace bsmd.hisnord
{
public class Response
{
private static ILog _log = LogManager.GetLogger(typeof(Response));
public static void ReadAnswers()
{
foreach (string answerFile in Directory.GetFiles(Properties.Settings.Default.AnswerDir))
{
// TODO: klären was man hier liest: reguläre Antwort oder Schnittstellenfehler
VisitIdResponse visitIdResponse = ReadVisitId(answerFile);
if (visitIdResponse != null)
{
_log.InfoFormat("HIS-NORD: Visit-ID {0} delivered for Core {1}", visitIdResponse.VisitId, visitIdResponse.ClientRequestId);
// update MessageCore
if (visitIdResponse.ClientRequestId != null)
{
Guid messageCoreId;
if (Guid.TryParse(visitIdResponse.ClientRequestId, out messageCoreId))
{
MessageCore answerCore = DBManager.Instance.GetMessageCoreById(messageCoreId);
if (answerCore == null)
{
_log.WarnFormat("HIS-NORD: Core not found for notification id {0}", visitIdResponse.NotificationId);
}
else
{
if (!answerCore.IsTransit)
answerCore.VisitId = visitIdResponse.VisitId;
else
answerCore.TransitId = visitIdResponse.VisitId;
answerCore.BSMDStatusInternal = MessageCore.BSMDStatus.RESPONDED;
DBManager.Instance.Save(answerCore);
}
}
else
{
_log.WarnFormat("{0} ANSWER parsed, but MessageCoreId is no Guid: {1}",
Path.GetFileName(answerFile), visitIdResponse.ClientRequestId);
}
}
else
{
_log.WarnFormat("Client request id is null in {0}", answerFile);
}
// archive file
File.Move(answerFile, Path.Combine(Properties.Settings.Default.AnswerArchiveDir, Path.GetFileName(answerFile)));
}
}
}
internal static VisitIdResponse ReadVisitId (string filename)
{
VisitIdResponse visitIdResponse = null;
try
{
XmlSerializer serializer = new XmlSerializer(typeof(bsmd.hisnord.dataset));
using (FileStream fs = new FileStream(filename, FileMode.Open))
{
// aus dem Gewühl die Antwort fischen..
dataset aDataSet = (dataset)serializer.Deserialize(fs);
if (aDataSet != null)
{
for (int i = 0; i < aDataSet.Items.Length; i++)
{
if (aDataSet.Items[i] is Envelope)
{
Envelope anEnvelope = (Envelope)aDataSet.Items[i];
if (anEnvelope.Body.Length > 0)
{
visitIdResponse = anEnvelope.Body[0].VisitIdResponse;
break;
}
}
}
}
}
}
catch (Exception ex)
{
_log.ErrorFormat("Exception occurred during deserialization: {0}", ex.Message);
}
return visitIdResponse;
}
}
}