/// <summary> /// Loads this configuration from a <see cref="XElement"/>. /// </summary> /// <param name="e">The xml element: its name must be GrandOutputConfiguration.</param> /// <param name="monitor">Monitor that will be used.</param> /// <returns>True on success, false if the configuration can not be read.</returns> public bool Load(XElement e, IActivityMonitor monitor) { if (e == null) { throw new ArgumentNullException("e"); } if (monitor == null) { throw new ArgumentNullException("monitor"); } try { if (e.Name != "GrandOutputConfiguration") { throw new XmlException("Element name must be <GrandOutputConfiguration>." + e.GetLineColumnString()); } // AppDomainDefaultFilter was the name before. LogFilter?globalDefaultFilter = e.GetAttributeLogFilter("GlobalDefaultFilter", false) ?? e.GetAttributeLogFilter("AppDomainDefaultFilter", false); SourceFilterApplyMode applyMode; Dictionary <string, LogFilter> sourceFilter = ReadSourceOverrideFilter(e, out applyMode, monitor); if (sourceFilter == null) { return(false); } RouteConfiguration routeConfig; using (monitor.OpenGroup(LogLevel.Trace, "Reading root Channel.", null)) { XElement channelElement = e.Element("Channel"); if (channelElement == null) { monitor.SendLine(LogLevel.Error, "Missing <Channel /> element." + e.GetLineColumnString(), null); return(false); } routeConfig = FillRoute(monitor, channelElement, new RouteConfiguration()); } // No error: set the new values. _routeConfig = routeConfig; _sourceFilter = sourceFilter; _sourceFilterApplyMode = applyMode; _globalDefaultFilter = globalDefaultFilter; return(true); } catch (Exception ex) { monitor.SendLine(LogLevel.Error, null, ex); } return(false); }
static Dictionary <string, LogFilter> ReadSourceOverrideFilter(XElement e, out SourceFilterApplyMode apply, IActivityMonitor monitor) { apply = SourceFilterApplyMode.None; using (monitor.OpenGroup(LogLevel.Trace, "Reading SourceOverrideFilter elements.", null)) { try { var s = e.Element("SourceOverrideFilter"); if (s == null) { monitor.CloseGroup("No source filtering (ApplyMode is None)."); return(new Dictionary <string, LogFilter>()); } apply = s.AttributeEnum("ApplyMode", SourceFilterApplyMode.Apply); var stranger = e.Elements("SourceOverrideFilter").Elements().FirstOrDefault(f => f.Name != "Add" && f.Name != "Remove"); if (stranger != null) { throw new XmlException("SourceOverrideFilter element must contain only Add and Remove elements." + stranger.GetLineColumnString()); } var result = e.Elements("SourceOverrideFilter") .Elements() .Select(f => new { File = f.AttributeRequired("File"), Filter = f.Name == "Add" ? f.GetRequiredAttributeLogFilter("Filter") : (LogFilter?)LogFilter.Undefined }) .Where(f => !String.IsNullOrWhiteSpace(f.File.Value)) .ToDictionary(f => f.File.Value, f => f.Filter.Value); monitor.CloseGroup(String.Format("{0} source files, ApplyMode is {1}.", result.Count, apply)); return(result); } catch (Exception ex) { monitor.SendLine(LogLevel.Error, "Error while reading SourceOverrideFilter element.", ex); return(null); } } }
/// <summary> /// Loads this configuration from a <see cref="XElement"/>. /// </summary> /// <param name="e">The xml element: its name must be GrandOutputConfiguration.</param> /// <param name="monitor">Monitor that will be used.</param> /// <returns>True on success, false if the configuration can not be read.</returns> public bool Load( XElement e, IActivityMonitor monitor ) { if( e == null ) throw new ArgumentNullException( "e" ); if( monitor == null ) throw new ArgumentNullException( "monitor" ); try { if( e.Name != "GrandOutputConfiguration" ) throw new XmlException( "Element name must be <GrandOutputConfiguration>." + e.GetLineColumnString() ); // AppDomainDefaultFilter was the name before. LogFilter? globalDefaultFilter = e.GetAttributeLogFilter( "GlobalDefaultFilter", false ) ?? e.GetAttributeLogFilter( "AppDomainDefaultFilter", false ); SourceFilterApplyMode applyMode; Dictionary<string, LogFilter> sourceFilter = ReadSourceOverrideFilter( e, out applyMode, monitor ); if( sourceFilter == null ) return false; RouteConfiguration routeConfig; using( monitor.OpenGroup( LogLevel.Trace, "Reading root Channel.", null ) ) { XElement channelElement = e.Element( "Channel" ); if( channelElement == null ) { monitor.SendLine( LogLevel.Error, "Missing <Channel /> element." + e.GetLineColumnString(), null ); return false; } routeConfig = FillRoute( monitor, channelElement, new RouteConfiguration() ); } // No error: set the new values. _routeConfig = routeConfig; _sourceFilter = sourceFilter; _sourceFilterApplyMode = applyMode; _globalDefaultFilter = globalDefaultFilter; return true; } catch( Exception ex ) { monitor.SendLine( LogLevel.Error, null, ex ); } return false; }
static Dictionary<string, LogFilter> ReadSourceOverrideFilter( XElement e, out SourceFilterApplyMode apply, IActivityMonitor monitor ) { apply = SourceFilterApplyMode.None; using( monitor.OpenGroup( LogLevel.Trace, "Reading SourceOverrideFilter elements.", null ) ) { try { var s = e.Element( "SourceOverrideFilter" ); if( s == null ) { monitor.CloseGroup( "No source filtering (ApplyMode is None)." ); return new Dictionary<string, LogFilter>(); } apply = s.AttributeEnum( "ApplyMode", SourceFilterApplyMode.Apply ); var stranger = e.Elements( "SourceOverrideFilter" ).Elements().FirstOrDefault( f => f.Name != "Add" && f.Name != "Remove" ); if( stranger != null ) { throw new XmlException( "SourceOverrideFilter element must contain only Add and Remove elements." + stranger.GetLineColumnString() ); } var result = e.Elements( "SourceOverrideFilter" ) .Elements() .Select( f => new { File = f.AttributeRequired( "File" ), Filter = f.Name == "Add" ? f.GetRequiredAttributeLogFilter( "Filter" ) : (LogFilter?)LogFilter.Undefined } ) .Where( f => !String.IsNullOrWhiteSpace( f.File.Value ) ) .ToDictionary( f => f.File.Value, f => f.Filter.Value ); monitor.CloseGroup( String.Format( "{0} source files, ApplyMode is {1}.", result.Count, apply ) ); return result; } catch( Exception ex ) { monitor.SendLine( LogLevel.Error, "Error while reading SourceOverrideFilter element.", ex ); return null; } } }