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/07/30 16:19:11 UTC
cvs commit: logging-log4net/tests/src/Layout PatternLayoutTest.cs
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);
+ }
+ }
}
}