git_bsmd/bsmd.nsw.service/Service.svc.cs

95 lines
4.2 KiB
C#

using bsmd.database;
using log4net;
using System;
using System.Collections.Generic;
namespace bsmd.nsw.service
{
public class Service : IService
{
private readonly ILog _log = LogManager.GetLogger(typeof(Service));
public NSWEntry[] NSWData(string poc, string fromDateString, string toDateString)
{
List<NSWEntry> entries = new List<NSWEntry>();
DateTime? fromDate = null;
if (DateTime.TryParse(fromDateString, out DateTime fromDateParsed))
fromDate = fromDateParsed;
DateTime? toDate = null;
if (DateTime.TryParse(toDateString, out DateTime toDateParsed))
toDate = toDateParsed;
_log.InfoFormat("Received request for {0} between {1} and {2}", poc, fromDate.HasValue ? fromDate.Value.ToString() : "?", toDate.HasValue ? toDate.Value.ToString() : "?");
if (DBManager.Instance.Connect(Properties.Settings.Default.ConnectionString))
{
// add search criteria
if (!poc.IsNullOrEmpty())
{
Dictionary<MessageCore.SearchFilterType, string> filterDict = new Dictionary<MessageCore.SearchFilterType, string>();
filterDict.Add(MessageCore.SearchFilterType.FILTER_PORT, poc);
uint? from = null, to = null;
if (fromDate.HasValue)
{
from = fromDate.Value.ToUniversalTime().ToUnixTimeStamp();
}
if(toDate.HasValue)
{
to = toDate.Value.ToUniversalTime().ToUnixTimeStamp();
}
if (from.HasValue || to.HasValue)
filterDict.Add(MessageCore.SearchFilterType.FILTER_ETA, string.Format("{0}:{1}", from?.ToString() ?? "", to?.ToString() ?? ""));
int? resultLimit;
int? expectedResultNum = DBManager.Instance.GetNumCoresWithFilters(filterDict);
if ((expectedResultNum ?? 0) > 100)
resultLimit = 100;
else
resultLimit = expectedResultNum;
foreach(MessageCore core in DBManager.Instance.GetMessageCoresWithFilters(filterDict, resultLimit))
{
NSWEntry entry = new NSWEntry();
if(core.ETA.HasValue)
entry.ETA = core.ETA.Value;
entry.IMO_ENI = core.IMOENIDisplay;
entry.PoC = core.PoC;
Message agntMessage = DBManager.Instance.GetMessage(core, Message.NotificationClass.AGNT);
if ((agntMessage != null) && (agntMessage.Elements.Count > 0))
entry.AGNT = agntMessage.Elements[0] as AGNT;
Message noanodMessage = DBManager.Instance.GetMessage(core, Message.NotificationClass.NOA_NOD);
if ((noanodMessage != null) && (noanodMessage.Elements.Count > 0))
entry.NOA_NOD = noanodMessage.Elements[0] as NOA_NOD;
Message statMessage = DBManager.Instance.GetMessage(core, Message.NotificationClass.STAT);
if ((statMessage != null) && (statMessage.Elements.Count > 0))
entry.STAT = statMessage.Elements[0] as STAT;
Message infoMessage = DBManager.Instance.GetMessage(core, Message.NotificationClass.INFO);
if ((infoMessage != null) && (infoMessage.Elements.Count > 0))
entry.INFO = infoMessage.Elements[0] as INFO;
entries.Add(entry);
}
}
else
{
_log.Warn("PoC data missing - ignoring search");
}
DBManager.Instance.Disconnect();
}
else
{
_log.Error("failed to connect to database");
}
return entries.ToArray();
}
}
}