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);
  +			}
  +		}
   	}
   }