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)
                                {
  
  
  

Reply via email to