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/08/19 23:21:32 UTC

cvs commit: logging-log4net/src/Util/PatternStringConverters RandomStringPatternConverter.cs

nicko       2004/08/19 14:21:32

  Modified:    src/Util PatternString.cs
  Added:       src/Util/PatternStringConverters
                        RandomStringPatternConverter.cs
  Log:
  Added RandomStringPatternConverter
  
  Revision  Changes    Path
  1.6       +1 -0      logging-log4net/src/Util/PatternString.cs
  
  Index: PatternString.cs
  ===================================================================
  RCS file: /home/cvs/logging-log4net/src/Util/PatternString.cs,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- PatternString.cs	1 Jun 2004 17:55:46 -0000	1.5
  +++ PatternString.cs	19 Aug 2004 21:21:32 -0000	1.6
  @@ -83,6 +83,7 @@
   			s_globalRulesRegistry.Add("literal", typeof(LiteralPatternConverter));
   			s_globalRulesRegistry.Add("newline", typeof(NewLinePatternConverter));
   			s_globalRulesRegistry.Add("processid", typeof(ProcessIdPatternConverter));
  +			s_globalRulesRegistry.Add("random", typeof(RandomStringPatternConverter));
   			s_globalRulesRegistry.Add("username", typeof(UserNamePatternConverter));
   		}
   
  
  
  
  1.1                  logging-log4net/src/Util/PatternStringConverters/RandomStringPatternConverter.cs
  
  Index: RandomStringPatternConverter.cs
  ===================================================================
  #region Copyright & License
  //
  // Copyright 2001-2004 The Apache Software Foundation
  //
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  //
  // http://www.apache.org/licenses/LICENSE-2.0
  //
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  //
  #endregion
  
  using System;
  using System.Text;
  using System.IO;
  
  using log4net.Util;
  using log4net.DateFormatter;
  using log4net.Core;
  
  namespace log4net.Util.PatternStringConverters
  {
  	/// <summary>
  	/// A Pattern converter that generates a string of random characters
  	/// </summary>
  	/// <remarks>
  	/// <para>
  	/// The converter generates a string of random characters. By default
  	/// the string is length 4. This can be changed by setting the <see cref="PatternConverter.Option"/>
  	/// to the string value of the length required.
  	/// </para>
  	/// <para>
  	/// The random characters in the string are limited to uppercase letters
  	/// and numbers only.
  	/// </para>
  	/// <para>
  	/// The random number generator used by this class is not cryptographically secure.
  	/// </para>
  	/// </remarks>
  	/// <author>Nicko Cadell</author>
  	internal sealed class RandomStringPatternConverter : PatternConverter, IOptionHandler
  	{
  		/// <summary>
  		/// Shared random number generator
  		/// </summary>
  		private static readonly Random s_random = new Random();
  
  		/// <summary>
  		/// Length of random string to generate. Default length 4.
  		/// </summary>
  		private int m_length = 4;
  
  		#region Implementation of IOptionHandler
  
  		/// <summary>
  		/// Initialize the converter options
  		/// </summary>
  		/// <remarks>
  		/// <para>
  		/// This is part of the <see cref="IOptionHandler"/> delayed object
  		/// activation scheme. The <see cref="ActivateOptions"/> method must 
  		/// be called on this object after the configuration properties have
  		/// been set. Until <see cref="ActivateOptions"/> is called this
  		/// object is in an undefined state and must not be used. 
  		/// </para>
  		/// <para>
  		/// If any of the configuration properties are modified then 
  		/// <see cref="ActivateOptions"/> must be called again.
  		/// </para>
  		/// </remarks>
  		public void ActivateOptions()
  		{
  			string optionStr = Option;
  			if (optionStr != null && optionStr.Length > 0)
  			{
  				try 
  				{
  					m_length = int.Parse(optionStr);
  				}
  				catch (Exception e) 
  				{
  					LogLog.Error("RandomStringPatternConverter: Could not convert Option ["+optionStr+"] to Length Int32", e);
  				}	
  			}
  		}
  
  		#endregion
  
  		/// <summary>
  		/// Convert the pattern into the rendered message
  		/// </summary>
  		/// <param name="writer">the writer to write to</param>
  		/// <param name="state">null, state is not set</param>
  		override protected void Convert(TextWriter writer, object state) 
  		{
  			try 
  			{
  				lock(s_random)
  				{
  					for(int i=0; i<m_length; i++)
  					{
  						int randValue = s_random.Next(36);
  
  						if (randValue < 26)
  						{
  							// Letter
  							char ch = (char)('A' + randValue);
  							writer.Write(ch);
  						}
  						else if (randValue < 36)
  						{
  							// Number
  							char ch = (char)('0' + (randValue - 26));
  							writer.Write(ch);
  						}
  						else
  						{
  							// Should not get here
  							writer.Write('X');
  						}
  					}
  				}
  			}
  			catch (Exception ex) 
  			{
  				LogLog.Error("RandomStringPatternConverter: Error occurred while converting.", ex);
  			}
  		}
  	}
  }