using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text.RegularExpressions;
using System.Xml;
namespace Wayne.Lib.Log
{
///
/// Filter for a log configuration.
///
public class LogConfigFilter
{
///
/// List of subfilters
///
public readonly List SubFilters = new List();
///
/// Entity type regex
///
public string EntityTypeRegexFilter { get; set; }
///
/// Entity subtype regex
///
public string EntitySubTypeRegexFilter { get; set; }
///
/// Regex for the ID
///
public string IdRegexFilter { get; set; }
///
/// Filter level
///
public DebugLogLevel FilterLevel { get; set; }
///
/// Constructor
///
public LogConfigFilter()
{
}
///
/// Constructor
///
///
///
///
///
public LogConfigFilter(string entityTypeRegexFilter, string entitySubTypeRegexFilter, string idRegexFilter, DebugLogLevel filterLevel)
{
EntityTypeRegexFilter = entityTypeRegexFilter;
EntitySubTypeRegexFilter = entitySubTypeRegexFilter;
IdRegexFilter = idRegexFilter;
FilterLevel = filterLevel;
}
///
/// Deserialization constructor
///
///
internal LogConfigFilter(XmlNode logFilterNode)
{
XmlAttribute entityTypeAttribute = logFilterNode.Attributes["EntityType"];
if (entityTypeAttribute != null)
EntityTypeRegexFilter = entityTypeAttribute.Value;
else
EntityTypeRegexFilter = string.Empty;
XmlAttribute entitySubTypeAttribute = logFilterNode.Attributes["EntitySubType"];
if (entitySubTypeAttribute != null)
EntitySubTypeRegexFilter = entitySubTypeAttribute.Value;
else
EntitySubTypeRegexFilter = string.Empty;
XmlAttribute idAttribute = logFilterNode.Attributes["Id"];
if (idAttribute != null)
IdRegexFilter = idAttribute.Value;
else
IdRegexFilter = string.Empty;
XmlAttribute filterLevelttribute = logFilterNode.Attributes["FilterLevel"];
if (filterLevelttribute != null)
FilterLevel = EnumSupport.Parse(filterLevelttribute.Value, false, DebugLogLevel.Normal);
else
FilterLevel = DebugLogLevel.Normal;
foreach (XmlNode childNode in logFilterNode.ChildNodes)
{
if (childNode.Name.Equals("SubFilter", StringComparison.Ordinal))
{
XmlAttribute enabledAttribute = childNode.Attributes["Enabled"];
if ((enabledAttribute != null) && !XmlConvert.ToBoolean(enabledAttribute.Value))
continue;
SubFilters.Add(new LogConfigSubFilter(childNode));
}
}
}
internal bool MatchFilter(EntityCategory entityCategory, out DebugLogLevel debugLogLevel)
{
bool entityTypeMatch = (string.IsNullOrEmpty(EntityTypeRegexFilter) || Regex.IsMatch(entityCategory.Entity.EntityType, EntityTypeRegexFilter, RegexOptions.IgnoreCase));
if (entityTypeMatch)
{
bool entitySubTypeMatch = (string.IsNullOrEmpty(EntitySubTypeRegexFilter) || Regex.IsMatch(entityCategory.Entity.EntitySubType, EntitySubTypeRegexFilter, RegexOptions.IgnoreCase));
if (entitySubTypeMatch)
{
bool idMatch = string.IsNullOrEmpty(IdRegexFilter);
if (!idMatch)
{
if (entityCategory.Entity.Id == IdentifiableEntity.NoId)
idMatch = Regex.IsMatch(string.Empty, IdRegexFilter, RegexOptions.IgnoreCase);
else
idMatch = Regex.IsMatch(entityCategory.Entity.Id.ToString(CultureInfo.InvariantCulture), IdRegexFilter, RegexOptions.IgnoreCase);
}
if (idMatch)
{
foreach (LogConfigSubFilter subFilter in SubFilters)
{
if (subFilter.MatchFilter(entityCategory, out debugLogLevel))
{
// Use the first match found.
return true;
}
}
debugLogLevel = FilterLevel;
return true;
}
}
}
debugLogLevel = DebugLogLevel.Excluded;
return false;
}
///
/// ToString
///
///
public override string ToString()
{
return string.Concat("EntityType=\"", EntityTypeRegexFilter ?? string.Empty,
"\", SubType=\"", EntitySubTypeRegexFilter ?? string.Empty,
"\", Id=\"", IdRegexFilter ?? string.Empty,
"\", Level=\"", FilterLevel, "\"");
}
///
/// Serialization
///
///
internal void WriteXml(XmlWriter xmlWriter)
{
xmlWriter.WriteStartElement("Filter");
if (!string.IsNullOrEmpty(EntityTypeRegexFilter))
xmlWriter.WriteAttributeString("EntityType", EntityTypeRegexFilter ?? string.Empty);
if (!string.IsNullOrEmpty(EntitySubTypeRegexFilter))
xmlWriter.WriteAttributeString("EntitySubType", EntitySubTypeRegexFilter ?? string.Empty);
if (!string.IsNullOrEmpty(IdRegexFilter))
xmlWriter.WriteAttributeString("Id", IdRegexFilter ?? string.Empty);
xmlWriter.WriteAttributeString("FilterLevel", FilterLevel.ToString());
foreach (LogConfigSubFilter subFilter in SubFilters)
subFilter.WriteXml(xmlWriter);
xmlWriter.WriteEndElement(); // Filter
}
}
}