Sic08/Yalv/YALV.Core/Providers/FileEntriesProvider.cs

85 lines
3.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Text.RegularExpressions;
using YALV.Core.Domain;
using YALV.Core.Exceptions;
namespace YALV.Core.Providers
{
public class FileEntriesProvider : AbstractEntriesProvider
{
private const string Separator = "[---]";
private const string DateTimeFormat = "yyyy-MM-dd HH:mm:ss,fff";
public override IEnumerable<LogItem> GetEntries(string dataSource, FilterParams filter)
{
if (String.IsNullOrEmpty(dataSource))
throw new ArgumentNullException("dataSource");
if (filter == null)
throw new ArgumentNullException("filter");
string pattern = filter.Pattern;
if (String.IsNullOrEmpty(pattern))
throw new NotValidValueException("filter pattern null");
FileInfo file = new FileInfo(dataSource);
if (!file.Exists)
throw new FileNotFoundException("file not found", dataSource);
Regex regex = new Regex(@"%\b(date|message|level)\b");
MatchCollection matches = regex.Matches(pattern);
using (StreamReader reader = file.OpenText())
{
string s;
while ((s = reader.ReadLine()) != null)
{
string[] items = s.Split(new[] { Separator }, StringSplitOptions.RemoveEmptyEntries);
LogItem entry = CreateEntry(items, matches);
entry.Logger = filter.Logger;
yield return entry;
}
}
}
private static LogItem CreateEntry(string[] items, MatchCollection matches)
{
if (items == null)
throw new ArgumentNullException("items");
if (matches == null)
throw new ArgumentNullException("matches");
if (items.Length != matches.Count)
throw new NotValidValueException("different length of items/matches values");
LogItem entry = new LogItem();
for (int i = 0; i < matches.Count; i++)
{
string value = items[i];
Match match = matches[i];
string name = match.Value;
switch (name)
{
case "%date":
entry.TimeStamp = DateTime.ParseExact(
value, DateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
break;
case "%message":
entry.Message = value;
break;
case "%level":
entry.Level = value;
break;
default:
throw new ArgumentOutOfRangeException(name, "unmanaged value");
}
}
return entry;
}
}
}