160 lines
7.3 KiB
C#
160 lines
7.3 KiB
C#
//
|
|
// 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<response.RootMessage> Messages,
|
|
List<bsmd.dbh.response.RootReportingClassesFullReportingClass> ReportingClassesFull,
|
|
List<bsmd.dbh.response.RootReportingClassesPartialReportingClass> ReportingClassesPartial,
|
|
List<bsmd.dbh.response.RootReportingClassesErrorReportingClass> RootReportingClassesError,
|
|
List<bsmd.dbh.response.RootReportingClassesResettedReportingClass> 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 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] == (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] == (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] == (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");
|
|
}
|
|
}
|
|
}
|
|
}
|