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 } } }