nicko       2004/07/30 07:19:11

  Modified:    src/Layout PatternLayout.cs
               tests/src/Layout PatternLayoutTest.cs
  Log:
  Added AddConverter(name,type) method to PatternLayout. This allows a custom
  converter to be bound to the instance of the PatternLayout. A ConverterInfo
  class is used to allow the converter to be specified in the Xml configuration.
  
  Revision  Changes    Path
  1.7       +73 -7     logging-log4net/src/Layout/PatternLayout.cs
  
  Index: PatternLayout.cs
  ===================================================================
  RCS file: /home/cvs/logging-log4net/src/Layout/PatternLayout.cs,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- PatternLayout.cs  1 Jun 2004 18:25:37 -0000       1.6
  +++ PatternLayout.cs  30 Jul 2004 14:19:11 -0000      1.7
  @@ -646,6 +646,8 @@
                /// </summary>
                private PatternConverter m_head;
   
  +             private Hashtable m_instanceRulesRegistry = new Hashtable();
  +
                #endregion
   
                #region Static Constructor
  @@ -765,11 +767,7 @@
                public string ConversionPattern
                {
                        get { return m_pattern; }
  -                     set
  -                     {
  -                             m_pattern = value;
  -                             m_head = CreatePatternParser(m_pattern).Parse();
  -                     }
  +                     set { m_pattern = value; }
                }
   
                /// <summary>
  @@ -786,7 +784,11 @@
                        // Add all the builtin patterns
                        foreach(DictionaryEntry entry in s_globalRulesRegistry)
                        {
  -                             patternParser.PatternConverters.Add(entry.Key, 
entry.Value);
  +                             patternParser.PatternConverters[entry.Key] = 
entry.Value;
  +                     }
  +                     foreach(DictionaryEntry entry in 
m_instanceRulesRegistry)
  +                     {
  +                             patternParser.PatternConverters[entry.Key] = 
entry.Value;
                        }
   
                        return patternParser;
  @@ -812,7 +814,7 @@
                /// </remarks>
                override public void ActivateOptions() 
                {
  -                     // nothing to do.
  +                     m_head = CreatePatternParser(m_pattern).Parse();
                }
   
                #endregion
  @@ -854,6 +856,70 @@
                }
   
                #endregion
  +
  +             /// <summary>
  +             /// Add a converter to this PatternLayout
  +             /// </summary>
  +             /// <param name="converterInfo">the converter info</param>
  +             /// <remarks>
  +             /// This version of the method is used by the configurator.
  +             /// Programatic users should use the alternative <see 
cref="AddConverter(string,Type)"/> method.
  +             /// </remarks>
  +             public void AddConverter(ConverterInfo converterInfo)
  +             {
  +                     AddConverter(converterInfo.Name, converterInfo.Type);
  +             }
  +
  +             /// <summary>
  +             /// Add a converter to this PatternLayout
  +             /// </summary>
  +             /// <param name="name">the name of the conversion pattern for 
this converter</param>
  +             /// <param name="type">the type of the converter</param>
  +             public void AddConverter(string name, Type type)
  +             {
  +                     if (name == null) throw new 
ArgumentNullException("name");
  +                     if (type == null) throw new 
ArgumentNullException("type");
  +
  +                     if (!typeof(PatternConverter).IsAssignableFrom(type))
  +                     {
  +                             throw new ArgumentException("The converter type 
specified ["+type+"] must be a subclass of log4net.Util.PatternConverter", 
"type");
  +                     }
  +                     m_instanceRulesRegistry[name] = type;
  +             }
  +
  +             /// <summary>
  +             /// Wrapper class used to map converter names to converter types
  +             /// </summary>
  +             public sealed class ConverterInfo
  +             {
  +                     private string m_name;
  +                     private Type m_type;
  +
  +                     /// <summary>
  +                     /// default constructor
  +                     /// </summary>
  +                     public ConverterInfo()
  +                     {
  +                     }
  +
  +                     /// <summary>
  +                     /// Gets or sets the name of the conversion pattern
  +                     /// </summary>
  +                     public string Name
  +                     {
  +                             get { return m_name; }
  +                             set { m_name = value; }
  +                     }
  +
  +                     /// <summary>
  +                     /// Gets or sets the type of the converter
  +                     /// </summary>
  +                     public Type Type
  +                     {
  +                             get { return m_type; }
  +                             set { m_type = value; }
  +                     }
  +             }
        }
   
        /// <summary>
  
  
  
  1.2       +38 -0     logging-log4net/tests/src/Layout/PatternLayoutTest.cs
  
  Index: PatternLayoutTest.cs
  ===================================================================
  RCS file: /home/cvs/logging-log4net/tests/src/Layout/PatternLayoutTest.cs,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- PatternLayoutTest.cs      26 Feb 2004 21:08:49 -0000      1.1
  +++ PatternLayoutTest.cs      30 Jul 2004 14:19:11 -0000      1.2
  @@ -67,5 +67,43 @@
                        Assertion.AssertEquals("Test mdc value removed", 
"(null)", stringAppender.GetString());
                        stringAppender.Reset();
                }
  +
  +             [Test] public void TestAddingCustomPattern()
  +             {
  +                     StringAppender stringAppender = new StringAppender();
  +                     PatternLayout layout = new PatternLayout();
  +
  +                     layout.AddConverter("TestAddingCustomPattern", 
typeof(TestMessagePatternConverter));
  +                     layout.ConversionPattern = "%TestAddingCustomPattern";
  +                     layout.ActivateOptions();
  +
  +                     stringAppender.Layout = layout;
  +
  +                     ILoggerRepository rep = 
LogManager.CreateRepository(Guid.NewGuid().ToString());
  +                     BasicConfigurator.Configure(rep, stringAppender);
  +
  +                     ILog log1 = LogManager.GetLogger(rep.Name, 
"TestAddingCustomPattern");
  +
  +                     log1.Info("TestMessage");
  +                     Assertion.AssertEquals("%TestAddingCustomPattern not 
registered", "TestMessage", stringAppender.GetString());
  +                     stringAppender.Reset(); 
  +             }
  +
  +             /// <summary>
  +             /// Converter to include event message
  +             /// </summary>
  +             private class TestMessagePatternConverter : 
log4net.Layout.Pattern.PatternLayoutConverter 
  +             {
  +                     /// <summary>
  +                     /// Convert the pattern to the rendered message
  +                     /// </summary>
  +                     /// <param name="writer"><see cref="TextWriter" /> that 
will receive the formatted result.</param>
  +                     /// <param name="loggingEvent">the event being 
logged</param>
  +                     /// <returns>the relevant location information</returns>
  +                     override protected void Convert(System.IO.TextWriter 
writer, LoggingEvent loggingEvent)
  +                     {
  +                             loggingEvent.WriteRenderedMessage(writer);
  +                     }
  +             }
        }
   }
  
  
  

Reply via email to