// // Class: Response // Current CLR: 4.0.30319.34209 // System: Microsoft Visual Studio 10.0 // Author: dani // Created: 3/1/2015 8:12:08 PM // // Copyright (c) 2015 Informatikbüro Daniel Schick. All rights reserved. using System; using System.Collections.Generic; using bsmd.database; using log4net; using System.IO; using System.Xml.Serialization; namespace bsmd.dbh { public class Response { private static ILog _log = LogManager.GetLogger("dbh Response"); public static void ProcessResponse(string VisitId, string TransitId, DateTime Timestamp, string SenderReference, response.RootType Type, List Messages, List ReportingClassesFull, List ReportingClassesPartial, List RootReportingClassesError, List ReportingClassesResetted, string connectionString) { /* XmlSerializer serializer = new XmlSerializer(typeof(response.Root)); using(StringWriter textWriter = new StringWriter()) { serializer.Serialize(textWriter, aResponse); _log.Debug(textWriter.ToString()); } */ // _log.Debug(aResponse.Serialize()); if (DBManager.Instance.Connect(connectionString)) { Guid messageId; if (!Guid.TryParseExact(SenderReference, "N", out messageId)) { _log.WarnFormat("SenderReference {0} is not a guid, skipping message processing!", SenderReference); return; } DatabaseEntity dbEntity = DBManager.Instance.GetMessageById(messageId); if (dbEntity == null) { _log.WarnFormat("Message with ID {0} not found in database, skipping", messageId); return; } if (!(dbEntity is Message)) { _log.WarnFormat("SenderReference DB Entity Object is no MessageHeader, aborting ({0})", dbEntity.GetType()); return; } Message aMessage = dbEntity as Message; switch (Type) { case dbh.response.RootType.VISIT: // neue VISIT - ID aMessage.MessageCore.VisitId = VisitId; aMessage.MessageCore.BSMDStatusInternal = MessageCore.BSMDStatus.PREPARE; DBManager.Instance.Save(aMessage.MessageCore); break; case dbh.response.RootType.TRANSIT: aMessage.MessageCore.TransitId = TransitId; aMessage.MessageCore.BSMDStatusInternal = MessageCore.BSMDStatus.PREPARE; DBManager.Instance.Save(aMessage.MessageCore); break; case dbh.response.RootType.CANCEL: if ((ReportingClassesFull != null) && (ReportingClassesFull.Count > 0) && (int) ReportingClassesFull[0].ReportingClass[0] == (int)aMessage.MessageNotificationClass) { aMessage.Cancel = true; aMessage.InternalStatus = Message.BSMDStatus.CONFIRMED; } break; case dbh.response.RootType.RESET: if ((ReportingClassesResetted != null) && (ReportingClassesResetted.Count > 0) && (int) ReportingClassesResetted[0] .ReportingClass[0] == (int)aMessage.MessageNotificationClass) { aMessage.Reset = true; aMessage.InternalStatus = Message.BSMDStatus.CONFIRMED; } break; case dbh.response.RootType.DATA: if((ReportingClassesFull != null) && (ReportingClassesFull.Count > 0) && (int) ReportingClassesFull[0].ReportingClass[0] == (int)aMessage.MessageNotificationClass) { // this was successful, save status to MessageHeader aMessage.InternalStatus = Message.BSMDStatus.CONFIRMED; aMessage.Status = Message.MessageStatus.ACCEPTED; } break; } if (Messages != null) { // Status zu den jeweiligen Nachrichten. Bei uns sollte die Anzahl hier immer 1 sein, da wir die Dinger // einzeln verschicken. for (int i = 0; i < Messages.Count; i++) { _log.InfoFormat("message {0} type {1}: {2}", i, Messages[i].Type, Messages[i].Text ?? "null"); switch (Messages[i].Type) { case dbh.response.RootMessageType.ERROR: MessageError error = new MessageError(); error.ErrorText = Messages[i].Text; _log.WarnFormat("Error received for {0}: {1}", Messages[i].Type, error.ErrorText); error.MessageHeaderId = aMessage.Id.Value; aMessage.InternalStatus = Message.BSMDStatus.ERROR; DBManager.Instance.Save(error); break; case dbh.response.RootMessageType.VIOLATION: MessageViolation violation = new MessageViolation(); violation.ViolationText = Messages[i].Text; _log.WarnFormat("Violation received for {0}: {1}", Messages[i].Type, violation.ViolationText); violation.MessageHeaderId = aMessage.Id.Value; aMessage.InternalStatus = Message.BSMDStatus.VIOLATION; DBManager.Instance.Save(violation); break; case dbh.response.RootMessageType.WARNING: _log.InfoFormat("WARNING received for {0}: {1}", Messages[i].Type, Messages[i].Text); break; case dbh.response.RootMessageType.INFO: default: _log.InfoFormat("INFO received for {0}: {1}", Messages[i].Type, Messages[i].Text); break; } } } aMessage.ReceivedAt = DateTime.Now; DBManager.Instance.Save(aMessage); DBManager.Instance.Disconnect(); } else { _log.Fatal("cannot connect to database"); } } } }