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; } } }