Created
October 16, 2017 16:53
-
-
Save GeorgeTsiokos/76c2c41b9406c940729d92a871a157b1 to your computer and use it in GitHub Desktop.
QuickFix SessionSettingsExtensions POC
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static class SessionSettingsExtensions | |
{ | |
public static bool TryUseWeekdaySessionSettings(this SessionSettings sessionSettings) | |
{ | |
var allSessionIds = sessionSettings.GetSessions(); | |
var result = allSessionIds.Select(sessionId => TryUseWeekdaySessionSettings(sessionSettings, sessionId)).All(x => x); | |
Console.WriteLine(sessionSettings); | |
return result; | |
} | |
public static void Archive(this SessionSettings sessionSettings) | |
{ | |
var allSessionIds = sessionSettings.GetSessions(); | |
#if(DEBUG) | |
foreach (var sessionId in allSessionIds) | |
Archive(sessionSettings, sessionId); | |
#else | |
Parallel.ForEach(allSessionIds, sessionId => Archive(sessionSettings, sessionId)); | |
#endif | |
} | |
public static bool TryUseWeekdaySessionSettings(this SessionSettings sessionSettings, SessionID sessionId) | |
{ | |
var setting = sessionSettings.Get(sessionId).OfType<KeyValuePair<string, string>>().ToDictionary(x => x.Key, x => x.Value, StringComparer.OrdinalIgnoreCase); | |
if (setting.ContainsKey(SessionSettings.START_DAY) || setting.ContainsKey(SessionSettings.END_DAY)) | |
return false; | |
if (!setting.ContainsKey(SessionSettings.START_TIME) || !setting.ContainsKey(SessionSettings.END_TIME)) | |
return false; | |
if (string.Equals(setting[SessionSettings.CONNECTION_TYPE], "acceptor", StringComparison.OrdinalIgnoreCase)) | |
return false; | |
sessionSettings.Remove(sessionId); | |
foreach (var weekday in GetWeekdays()) | |
{ | |
var sessionQualifier = GetSessionQualifier(weekday.End); | |
var weekdayId = new SessionID(sessionId.BeginString, sessionId.SenderCompID, sessionId.SenderSubID, sessionId.SenderLocationID, sessionId.TargetCompID, sessionId.TargetSubID, sessionId.TargetLocationID, sessionQualifier); | |
var settings = new Dictionary("SESSION", setting); | |
settings.SetString(SessionSettings.SESSION_QUALIFIER, sessionQualifier); | |
settings.SetDay(SessionSettings.START_DAY, weekday.Start); | |
settings.SetDay(SessionSettings.END_DAY, weekday.End); | |
sessionSettings.Set(weekdayId, settings); | |
} | |
return true; | |
} | |
static string GetSessionQualifier(DayOfWeek dayOfWeek) => $"{(int) dayOfWeek}-{dayOfWeek.ToString().ToUpperInvariant()}"; | |
public static void Archive(this SessionSettings sessionSettings, SessionID sessionId) | |
{ | |
if (IsActive(sessionSettings, sessionId)) | |
return; | |
var settings = sessionSettings.Get(sessionId); | |
var prefix = FileStore.Prefix(sessionId); | |
var destinationArchiveFileName = $"{DateTime.Now:yyyy-MM-dd}-{prefix}-{DateTime.Now:HH-mm-ss}.zip"; | |
var files = GetFiles(prefix, settings.GetString(SessionSettings.FILE_STORE_PATH)).Concat(GetFiles(prefix, settings.GetString(SessionSettings.FILE_LOG_PATH))).ToArray(); | |
if (files.Length < 1) | |
return; | |
if (!AreEmpty(files)) | |
using (var zipArchive = ZipFile.Open(destinationArchiveFileName, File.Exists(destinationArchiveFileName) ? ZipArchiveMode.Update : ZipArchiveMode.Create)) | |
{ | |
foreach (var file in files) | |
zipArchive.CreateEntryFromFile(file.FullName, file.Name, CompressionLevel.Optimal); | |
} | |
foreach (var file in files) | |
try { file.Delete(); } | |
catch { } | |
} | |
static IEnumerable<FileInfo> GetFiles(string prefix, string path) | |
{ | |
var directoryInfo = new DirectoryInfo(path); | |
return directoryInfo.EnumerateFiles($"{prefix}*.*", SearchOption.TopDirectoryOnly); | |
} | |
static bool AreEmpty(IEnumerable<FileInfo> files) | |
{ | |
bool Predicate(FileInfo file) | |
{ | |
var length = file.Name.EndsWith(".event.current.log") ? 3 : 1; | |
using (var streamReader = file.OpenText()) | |
{ | |
var lines = streamReader.ReadToEnd().Split(new[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries); | |
return lines.Length <= length; | |
} | |
} | |
return files.All(Predicate); | |
} | |
static IEnumerable<(DayOfWeek Start, DayOfWeek End)> GetWeekdays() | |
{ | |
yield return (DayOfWeek.Sunday, DayOfWeek.Monday); | |
yield return (DayOfWeek.Monday, DayOfWeek.Tuesday); | |
yield return (DayOfWeek.Tuesday, DayOfWeek.Wednesday); | |
yield return (DayOfWeek.Wednesday, DayOfWeek.Thursday); | |
yield return (DayOfWeek.Thursday, DayOfWeek.Friday); | |
} | |
static bool IsActive(SessionSettings sessionSettings, SessionID sessionId) | |
{ | |
var now = DateTime.Now; | |
var dayOfWeek = now.DayOfWeek; | |
var settings = sessionSettings.Get(sessionId); | |
if (settings.Has(SessionSettings.START_DAY) && settings.Has(SessionSettings.END_DAY)) | |
{ | |
var startDay = settings.GetDay(SessionSettings.START_DAY); | |
var endDay = settings.GetDay(SessionSettings.END_DAY); | |
if (dayOfWeek != startDay && dayOfWeek != endDay) | |
return false; | |
} | |
if (settings.Has(SessionSettings.START_TIME)) | |
{ | |
var startTime = TimeSpan.Parse(settings.GetString(SessionSettings.START_TIME)); | |
if (now.TimeOfDay < startTime) | |
return false; | |
} | |
if (settings.Has(SessionSettings.END_TIME)) | |
{ | |
var endTime = TimeSpan.Parse(settings.GetString(SessionSettings.END_TIME)); | |
if (now.TimeOfDay > endTime) | |
return false; | |
} | |
return true; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment