git_bsmd/nsw/Source/bsmd.dbh/Response.cs

125 lines
4.7 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(response.Root aResponse, string connectionString)
{
_log.InfoFormat("processing message type {0}, version {1}", aResponse.Type, aResponse.Version);
XmlSerializer serializer = new XmlSerializer(typeof(response.Root));
using(StringWriter textWriter = new StringWriter())
{
serializer.Serialize(textWriter, aResponse);
_log.Debug(textWriter.ToString());
}
if (DBManager.Instance.Connect(connectionString))
{
if (aResponse.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 < aResponse.Messages.Count; i++)
{
_log.InfoFormat("message {0} type {1}: {2}", i,
aResponse.Messages[i].Type,
aResponse.Messages[i].Text ?? "null");
switch (aResponse.Messages[i].Type)
{
case dbh.response.RootMessageType.ERROR:
MessageError messageError = new MessageError();
messageError.ErrorText = aResponse.Messages[i].Text;
// messageError.ErrorCode =
break;
case dbh.response.RootMessageType.VIOLATION:
break;
case dbh.response.RootMessageType.WARNING:
case dbh.response.RootMessageType.INFO:
default:
break;
}
}
}
Guid messageId;
if (!Guid.TryParseExact(aResponse.SenderReference, "N", out messageId))
{
_log.WarnFormat("SenderReference {0} is not a guid, skipping message processing!", aResponse.SenderReference);
return;
}
DatabaseEntity dbEntity = DBManager.Instance.GetMessageById(messageId);
if ((dbEntity != null) && (dbEntity.MessageCore != null))
{
Message aMessage = null;
if (dbEntity.GetType().IsAssignableFrom(typeof(Message)))
aMessage = (Message)dbEntity;
else
aMessage = dbEntity.MessageHeader;
switch (aResponse.Type)
{
case dbh.response.RootType.VISIT:
// neue VISIT - ID
aMessage.MessageCore.VisitId = aResponse.VisitId;
DBManager.Instance.Save(aMessage.MessageCore);
break;
case dbh.response.RootType.TRANSIT:
aMessage.MessageCore.TransitId = aResponse.TransitId;
DBManager.Instance.Save(aMessage.MessageCore);
break;
case dbh.response.RootType.CANCEL:
break;
case dbh.response.RootType.RESET:
break;
case dbh.response.RootType.DATA:
break;
}
//aMessage.Status = Message.MessageStatus.
aMessage.ReceivedAt = DateTime.Now;
aMessage.InternalStatus = Message.BSMDStatus.RESPONDED;
DBManager.Instance.Save(aMessage);
}
else
{
_log.ErrorFormat("no entry found in DB for sender reference {0}", messageId);
}
DBManager.Instance.Disconnect();
}
else
{
_log.Fatal("cannot connect to database");
}
}
}
}