You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4net-dev@logging.apache.org by ni...@apache.org on 2004/11/15 03:51:47 UTC

cvs commit: logging-log4net/src/Core DefaultRepositorySelector.cs

nicko       2004/11/14 18:51:47

  Modified:    src/Config ConfiguratorAttribute.cs
                        XmlConfiguratorAttribute.cs
               src/Core DefaultRepositorySelector.cs
  Log:
  Added support for priority ordered loading of ConfiguratorAttributes
  
  Revision  Changes    Path
  1.6       +55 -1     logging-log4net/src/Config/ConfiguratorAttribute.cs
  
  Index: ConfiguratorAttribute.cs
  ===================================================================
  RCS file: /home/cvs/logging-log4net/src/Config/ConfiguratorAttribute.cs,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- ConfiguratorAttribute.cs	2 Jun 2004 15:33:57 -0000	1.5
  +++ ConfiguratorAttribute.cs	15 Nov 2004 02:51:46 -0000	1.6
  @@ -38,14 +38,68 @@
   	/// <author>Nicko Cadell</author>
   	/// <author>Gert Driesen</author>
   	[AttributeUsage(AttributeTargets.Assembly)]
  -	public abstract class ConfiguratorAttribute : Attribute
  +	public abstract class ConfiguratorAttribute : Attribute, IComparable
   	{
  +		private int m_priority = 0;
  +
  +		/// <summary>
  +		/// Constructor used by subclasses.
  +		/// </summary>
  +		/// <param name="priority">the ordering priority for this configurator</param>
  +		/// <remarks>
  +		/// <para>
  +		/// The <paramref name="priority"/> is used to order the configurator
  +		/// attributes before they are invoked. Higher priority configurators are executed
  +		/// before lower priority ones.
  +		/// </para>
  +		/// </remarks>
  +		protected ConfiguratorAttribute(int priority)
  +		{
  +			m_priority = priority;
  +		}
  +
   		/// <summary>
   		/// Configures the <see cref="ILoggerRepository"/> for the specified assembly.
   		/// </summary>
   		/// <param name="sourceAssembly">The assembly that this attribute was defined on.</param>
   		/// <param name="targetRepository">The repository to configure.</param>
   		public abstract void Configure(Assembly sourceAssembly, ILoggerRepository targetRepository);
  +
  +		/// <summary>
  +		/// Compare this instance to another ConfiguratorAttribute
  +		/// </summary>
  +		/// <param name="obj">the object to compare to</param>
  +		/// <returns>see <see cref="IComparable.CompareTo"/></returns>
  +		/// <remarks>
  +		/// <para>
  +		/// Compares the priorities of the two <see cref="ConfiguratorAttribute"/> instances.
  +		/// Sorts by priority in descending order. Objects with the same priority are
  +		/// randomly ordered.
  +		/// </para>
  +		/// </remarks>
  +		public int CompareTo(object obj)
  +		{
  +			int result = -1;
  +
  +			if (obj != null && obj is ConfiguratorAttribute)
  +			{
  +				if (obj == (object)this)
  +				{
  +					result = 0;
  +				}
  +				else
  +				{
  +					// Compare the priorities
  +					result = ((ConfiguratorAttribute)obj).m_priority.CompareTo(m_priority);
  +					if (result == 0)
  +					{
  +						// Same priority, so have to provider some ordering
  +						result = -1;
  +					}
  +				}
  +			}
  +			return result;
  +		}
   	}
   }
   
  
  
  
  1.6       +7 -0      logging-log4net/src/Config/XmlConfiguratorAttribute.cs
  
  Index: XmlConfiguratorAttribute.cs
  ===================================================================
  RCS file: /home/cvs/logging-log4net/src/Config/XmlConfiguratorAttribute.cs,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- XmlConfiguratorAttribute.cs	2 Jun 2004 15:35:18 -0000	1.5
  +++ XmlConfiguratorAttribute.cs	15 Nov 2004 02:51:46 -0000	1.6
  @@ -53,6 +53,13 @@
   		// Class is not sealed because DOMConfiguratorAttribute extends it while it is obsoleted
   		// 
   
  +		/// <summary>
  +		/// Default constructor
  +		/// </summary>
  +		public XmlConfiguratorAttribute() : base(0) /* configurator priority 0 */
  +		{
  +		}
  +
   		#region Public Instance Properties
   
   		/// <summary>
  
  
  
  1.9       +3 -0      logging-log4net/src/Core/DefaultRepositorySelector.cs
  
  Index: DefaultRepositorySelector.cs
  ===================================================================
  RCS file: /home/cvs/logging-log4net/src/Core/DefaultRepositorySelector.cs,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- DefaultRepositorySelector.cs	1 Oct 2004 21:02:16 -0000	1.8
  +++ DefaultRepositorySelector.cs	15 Nov 2004 02:51:46 -0000	1.9
  @@ -570,6 +570,9 @@
   			object[] configAttributes = Attribute.GetCustomAttributes(assembly, typeof(log4net.Config.ConfiguratorAttribute), false);
   			if (configAttributes != null && configAttributes.Length > 0)
   			{
  +				// Sort the ConfiguratorAttributes in priority order
  +				Array.Sort(configAttributes);
  +
   				// Delegate to the attribute the job of configuring the repository
   				foreach(log4net.Config.ConfiguratorAttribute configAttr in configAttributes)
   				{