Author: nicko Date: Fri Feb 17 11:20:22 2006 New Revision: 378595 URL: http://svn.apache.org/viewcvs?rev=378595&view=rev Log: Fix for LOG4NET-58 Support clean build on .NET 2.0. Updates to work around obsolete warning messages from the MS .NET 2.0 compiler.
Modified: logging/log4net/trunk/log4net.build logging/log4net/trunk/src/Appender/EventLogAppender.cs logging/log4net/trunk/src/Appender/SmtpAppender.cs logging/log4net/trunk/src/Config/XmlConfigurator.cs logging/log4net/trunk/src/Core/DefaultRepositorySelector.cs logging/log4net/trunk/src/Core/LevelMap.cs logging/log4net/trunk/src/Core/LoggerManager.cs logging/log4net/trunk/src/Repository/Hierarchy/XmlHierarchyConfigurator.cs logging/log4net/trunk/src/Util/LogLog.cs logging/log4net/trunk/src/Util/SystemInfo.cs logging/log4net/trunk/src/Util/TypeConverters/IPAddressConverter.cs logging/log4net/trunk/tests/src/Appender/RemotingAppenderTest.cs logging/log4net/trunk/tests/src/Layout/XmlLayoutTest.cs Modified: logging/log4net/trunk/log4net.build URL: http://svn.apache.org/viewcvs/logging/log4net/trunk/log4net.build?rev=378595&r1=378594&r2=378595&view=diff ============================================================================== --- logging/log4net/trunk/log4net.build (original) +++ logging/log4net/trunk/log4net.build Fri Feb 17 11:20:22 2006 @@ -408,6 +408,7 @@ <include name="System.Data.dll" /> <include name="System.Web.dll" /> <include name="System.Xml.dll" /> + <include name="System.Configuration.dll" /> <!-- allow for third party assemblies to be referenced by just storing them in the lib/<framework family>/<framework version>/<build configuration> directory --> <include name="lib/${framework::get-family(framework::get-target-framework())}/${framework::get-version(framework::get-target-framework())}/${current.build.config}/*.dll" /> </references> Modified: logging/log4net/trunk/src/Appender/EventLogAppender.cs URL: http://svn.apache.org/viewcvs/logging/log4net/trunk/src/Appender/EventLogAppender.cs?rev=378595&r1=378594&r2=378595&view=diff ============================================================================== --- logging/log4net/trunk/src/Appender/EventLogAppender.cs (original) +++ logging/log4net/trunk/src/Appender/EventLogAppender.cs Fri Feb 17 11:20:22 2006 @@ -271,13 +271,13 @@ // the application / logfile association // EventLog.DeleteEventSource(m_applicationName, m_machineName); - EventLog.CreateEventSource(m_applicationName, m_logName, m_machineName); + CreateEventSource(m_applicationName, m_logName, m_machineName); registeredLogName = EventLog.LogNameFromSourceName(m_applicationName, m_machineName); } else if (!sourceAlreadyExists) { - EventLog.CreateEventSource(m_applicationName, m_logName, m_machineName); + CreateEventSource(m_applicationName, m_logName, m_machineName); registeredLogName = EventLog.LogNameFromSourceName(m_applicationName, m_machineName); } @@ -289,6 +289,24 @@ } #endregion // Implementation of IOptionHandler + + /// <summary> + /// Create an event log source + /// </summary> + /// <remarks> + /// Uses different API calls under NET_2_0 + /// </remarks> + private static void CreateEventSource(string source, string logName, string machineName) + { +#if NET_2_0 + EventSourceCreationData eventSourceCreationData = new EventSourceCreationData(source, logName); + eventSourceCreationData.MachineName = machineName; + EventLog.CreateEventSource(eventSourceCreationData); +#else + EventLog.CreateEventSource(source, logName, machineName); +#endif + } + #region Override implementation of AppenderSkeleton Modified: logging/log4net/trunk/src/Appender/SmtpAppender.cs URL: http://svn.apache.org/viewcvs/logging/log4net/trunk/src/Appender/SmtpAppender.cs?rev=378595&r1=378594&r2=378595&view=diff ============================================================================== --- logging/log4net/trunk/src/Appender/SmtpAppender.cs (original) +++ logging/log4net/trunk/src/Appender/SmtpAppender.cs Fri Feb 17 11:20:22 2006 @@ -22,7 +22,12 @@ using System; using System.IO; + +#if NET_2_0 +using System.Net.Mail; +#else using System.Web.Mail; +#endif using log4net.Layout; using log4net.Core; @@ -299,6 +304,44 @@ writer.Write(t); } +#if NET_2_0 + // .NET 2.0 has a new API for SMTP email System.Net.Mail + // This API supports credentials and multiple hosts correctly. + // The old API is deprecated. + + // Create and configure the smtp client + SmtpClient smtpClient = new SmtpClient(); + if (m_smtpHost != null && m_smtpHost.Length > 0) + { + smtpClient.Host = m_smtpHost; + } + smtpClient.Port = m_port; + smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; + + if (m_authentication == SmtpAuthentication.Basic) + { + // Perform basic authentication + smtpClient.Credentials = new System.Net.NetworkCredential(m_username, m_password); + } + else if (m_authentication == SmtpAuthentication.Ntlm) + { + // Perform integrated authentication (NTLM) + smtpClient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; + } + + MailMessage mailMessage = new MailMessage(); + mailMessage.Body = writer.ToString(); + mailMessage.From = new MailAddress(m_from); + mailMessage.To.Add(m_to); + mailMessage.Subject = m_subject; + mailMessage.Priority = m_mailPriority; + + // TODO: Consider using SendAsync to send the message without blocking. This would be a change in + // behaviour compared to .NET 1.x. We would need a SendCompletedCallback to log errors. + smtpClient.Send(mailMessage); +#else + // .NET 1.x uses the System.Web.Mail API for sending Mail + MailMessage mailMessage = new MailMessage(); mailMessage.Body = writer.ToString(); mailMessage.From = m_from; @@ -345,14 +388,14 @@ #else if (m_authentication != SmtpAuthentication.None) { - ErrorHandler.Error("SmtpAppender: Authentication is only supported on the MS .NET 1.1 build of log4net"); + ErrorHandler.Error("SmtpAppender: Authentication is only supported on the MS .NET 1.1 or MS .NET 2.0 builds of log4net"); } if (m_port != 25) { - ErrorHandler.Error("SmtpAppender: Server Port is only supported on the MS .NET 1.1 build of log4net"); + ErrorHandler.Error("SmtpAppender: Server Port is only supported on the MS .NET 1.1 or MS .NET 2.0 builds of log4net"); } -#endif +#endif // if NET_1_1 if (m_smtpHost != null && m_smtpHost.Length > 0) { @@ -360,6 +403,7 @@ } SmtpMail.Send(mailMessage); +#endif // if NET_2_0 } catch(Exception e) { Modified: logging/log4net/trunk/src/Config/XmlConfigurator.cs URL: http://svn.apache.org/viewcvs/logging/log4net/trunk/src/Config/XmlConfigurator.cs?rev=378595&r1=378594&r2=378595&view=diff ============================================================================== --- logging/log4net/trunk/src/Config/XmlConfigurator.cs (original) +++ logging/log4net/trunk/src/Config/XmlConfigurator.cs Fri Feb 17 11:20:22 2006 @@ -153,7 +153,12 @@ #else try { - XmlElement configElement = System.Configuration.ConfigurationSettings.GetConfig("log4net") as XmlElement; + XmlElement configElement = null; +#if NET_2_0 + configElement = System.Configuration.ConfigurationManager.GetSection("log4net") as XmlElement; +#else + configElement = System.Configuration.ConfigurationSettings.GetConfig("log4net") as XmlElement; +#endif if (configElement == null) { // Failed to load the xml config using configuration settings handler @@ -613,6 +618,13 @@ #if (NETCF) // Create a text reader for the file stream XmlTextReader xmlReader = new XmlTextReader(configStream); +#elif NET_2_0 + // Allow the DTD to specify entity includes + XmlReaderSettings settings = new XmlReaderSettings(); + settings.ProhibitDtd = false; + + // Create a reader over the input stream + XmlReader xmlReader = XmlReader.Create(configStream, settings); #else // Create a validating reader around a text reader for the file stream XmlValidatingReader xmlReader = new XmlValidatingReader(new XmlTextReader(configStream)); Modified: logging/log4net/trunk/src/Core/DefaultRepositorySelector.cs URL: http://svn.apache.org/viewcvs/logging/log4net/trunk/src/Core/DefaultRepositorySelector.cs?rev=378595&r1=378594&r2=378595&view=diff ============================================================================== --- logging/log4net/trunk/src/Core/DefaultRepositorySelector.cs (original) +++ logging/log4net/trunk/src/Core/DefaultRepositorySelector.cs Fri Feb 17 11:20:22 2006 @@ -645,18 +645,7 @@ // Do this even if the repository has been configured (or claims to be), this allows overriding // of the default config files etc, if that is required. - string repositoryConfigFile = null; - - try - { - repositoryConfigFile = ConfigurationSettings.AppSettings["log4net.Config"]; - } - catch(Exception ex) - { - // If an exception is thrown here then it looks like the config file does not parse correctly. - LogLog.Error("DefaultRepositorySelector: Exception while reading ConfigurationSettings. Check your .config file is well formed XML.", ex); - } - + string repositoryConfigFile = SystemInfo.GetAppSetting("log4net.Config"); if (repositoryConfigFile != null && repositoryConfigFile.Length > 0) { // Resolve the config path relative to the application base directory URI Modified: logging/log4net/trunk/src/Core/LevelMap.cs URL: http://svn.apache.org/viewcvs/logging/log4net/trunk/src/Core/LevelMap.cs?rev=378595&r1=378594&r2=378595&view=diff ============================================================================== --- logging/log4net/trunk/src/Core/LevelMap.cs (original) +++ logging/log4net/trunk/src/Core/LevelMap.cs Fri Feb 17 11:20:22 2006 @@ -43,7 +43,7 @@ /// Mapping from level name to Level object. The /// level name is case insensitive /// </summary> - private Hashtable m_mapName2Level = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default); + private Hashtable m_mapName2Level = SystemInfo.CreateCaseInsensitiveHashtable(); #endregion Modified: logging/log4net/trunk/src/Core/LoggerManager.cs URL: http://svn.apache.org/viewcvs/logging/log4net/trunk/src/Core/LoggerManager.cs?rev=378595&r1=378594&r2=378595&view=diff ============================================================================== --- logging/log4net/trunk/src/Core/LoggerManager.cs (original) +++ logging/log4net/trunk/src/Core/LoggerManager.cs Fri Feb 17 11:20:22 2006 @@ -102,18 +102,7 @@ #else // Look for the RepositorySelector type specified in the AppSettings 'log4net.RepositorySelector' - string appRepositorySelectorTypeName = null; - - try - { - appRepositorySelectorTypeName = ConfigurationSettings.AppSettings["log4net.RepositorySelector"]; - } - catch(Exception ex) - { - // If an exception is thrown here then it looks like the config file does not parse correctly. - LogLog.Error("LoggerManager: Exception while reading ConfigurationSettings. Check your .config file is well formed XML.", ex); - } - + string appRepositorySelectorTypeName = SystemInfo.GetAppSetting("log4net.RepositorySelector"); if (appRepositorySelectorTypeName != null && appRepositorySelectorTypeName.Length > 0) { // Resolve the config string into a Type Modified: logging/log4net/trunk/src/Repository/Hierarchy/XmlHierarchyConfigurator.cs URL: http://svn.apache.org/viewcvs/logging/log4net/trunk/src/Repository/Hierarchy/XmlHierarchyConfigurator.cs?rev=378595&r1=378594&r2=378595&view=diff ============================================================================== --- logging/log4net/trunk/src/Repository/Hierarchy/XmlHierarchyConfigurator.cs (original) +++ logging/log4net/trunk/src/Repository/Hierarchy/XmlHierarchyConfigurator.cs Fri Feb 17 11:20:22 2006 @@ -135,11 +135,8 @@ } } -#if (!NETCF) - LogLog.Debug("XmlHierarchyConfigurator: Configuration update mode [" + configUpdateMode.ToString(CultureInfo.InvariantCulture) + "]."); -#else + // IMPL: The IFormatProvider argument to Enum.ToString() is deprecated in .NET 2.0 LogLog.Debug("XmlHierarchyConfigurator: Configuration update mode [" + configUpdateMode.ToString() + "]."); -#endif // Only reset configuration if overwrite flag specified if (configUpdateMode == ConfigUpdateMode.Overwrite) Modified: logging/log4net/trunk/src/Util/LogLog.cs URL: http://svn.apache.org/viewcvs/logging/log4net/trunk/src/Util/LogLog.cs?rev=378595&r1=378594&r2=378595&view=diff ============================================================================== --- logging/log4net/trunk/src/Util/LogLog.cs (original) +++ logging/log4net/trunk/src/Util/LogLog.cs Fri Feb 17 11:20:22 2006 @@ -81,8 +81,8 @@ #if !NETCF try { - InternalDebugging = OptionConverter.ToBoolean(ConfigurationSettings.AppSettings["log4net.Internal.Debug"], false); - QuietMode = OptionConverter.ToBoolean(ConfigurationSettings.AppSettings["log4net.Internal.Quiet"], false); + InternalDebugging = OptionConverter.ToBoolean(SystemInfo.GetAppSetting("log4net.Internal.Debug"), false); + QuietMode = OptionConverter.ToBoolean(SystemInfo.GetAppSetting("log4net.Internal.Quiet"), false); } catch(Exception ex) { Modified: logging/log4net/trunk/src/Util/SystemInfo.cs URL: http://svn.apache.org/viewcvs/logging/log4net/trunk/src/Util/SystemInfo.cs?rev=378595&r1=378594&r2=378595&view=diff ============================================================================== --- logging/log4net/trunk/src/Util/SystemInfo.cs (original) +++ logging/log4net/trunk/src/Util/SystemInfo.cs Fri Feb 17 11:20:22 2006 @@ -22,6 +22,7 @@ using System.Text; using System.IO; using System.Runtime.InteropServices; +using System.Collections; namespace log4net.Util { @@ -78,7 +79,7 @@ #if !NETCF // Look for log4net.NullText in AppSettings - string nullTextAppSettingsKey = ConfigurationSettings.AppSettings["log4net.NullText"]; + string nullTextAppSettingsKey = SystemInfo.GetAppSetting("log4net.NullText"); if (nullTextAppSettingsKey != null && nullTextAppSettingsKey.Length > 0) { LogLog.Debug("SystemInfo: Initializing NullText value to [" + nullTextAppSettingsKey + "]."); @@ -86,7 +87,7 @@ } // Look for log4net.NotAvailableText in AppSettings - string notAvailableTextAppSettingsKey = ConfigurationSettings.AppSettings["log4net.NotAvailableText"]; + string notAvailableTextAppSettingsKey = SystemInfo.GetAppSetting("log4net.NotAvailableText"); if (notAvailableTextAppSettingsKey != null && notAvailableTextAppSettingsKey.Length > 0) { LogLog.Debug("SystemInfo: Initializing NotAvailableText value to [" + notAvailableTextAppSettingsKey + "]."); @@ -211,6 +212,11 @@ /// <c>GetCurrentThreadId</c> is implemented inline in a header file /// and cannot be called. /// </para> + /// <para> + /// On the .NET Framework 2.0 the <c>Thread.ManagedThreadId</c> is used as this + /// gives a stable id unrelated to the operating system thread ID which may + /// change if the runtime is using fibers. + /// </para> /// </remarks> public static int CurrentThreadId { @@ -218,6 +224,8 @@ { #if NETCF return System.Threading.Thread.CurrentThread.GetHashCode(); +#elif NET_2_0 + return System.Threading.Thread.CurrentThread.ManagedThreadId; #else return AppDomain.GetCurrentThreadId(); #endif @@ -812,6 +820,36 @@ } /// <summary> + /// Lookup an application setting + /// </summary> + /// <param name="key">the application settings key to lookup</param> + /// <returns>the value for the key, or <c>null</c></returns> + /// <remarks> + /// <para> + /// Configuration APIs are not suported under the Compact Framework + /// </para> + /// </remarks> + public static string GetAppSetting(string key) + { + try + { +#if NETCF + // Configuration APIs are not suported under the Compact Framework +#elif NET_2_0 + return ConfigurationManager.AppSettings[key]; +#else + return ConfigurationSettings.AppSettings[key]; +#endif + } + catch(Exception ex) + { + // If an exception is thrown here then it looks like the config file does not parse correctly. + LogLog.Error("DefaultRepositorySelector: Exception while reading ConfigurationSettings. Check your .config file is well formed XML.", ex); + } + return null; + } + + /// <summary> /// Convert a path into a fully qualified local file path. /// </summary> /// <param name="path">The path to convert.</param> @@ -859,6 +897,24 @@ return Path.GetFullPath(Path.Combine(baseDirectory, path)); } return Path.GetFullPath(path); + } + + /// <summary> + /// Creates a new case-insensitive instance of the <see cref="Hashtable"/> class with the default initial capacity. + /// </summary> + /// <returns>A new case-insensitive instance of the <see cref="Hashtable"/> class with the default initial capacity</returns> + /// <remarks> + /// <para> + /// The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. + /// </para> + /// </remarks> + public static Hashtable CreateCaseInsensitiveHashtable() + { +#if NETCF + return new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default); +#else + return System.Collections.Specialized.CollectionsUtil.CreateCaseInsensitiveHashtable(); +#endif } #endregion Public Static Methods Modified: logging/log4net/trunk/src/Util/TypeConverters/IPAddressConverter.cs URL: http://svn.apache.org/viewcvs/logging/log4net/trunk/src/Util/TypeConverters/IPAddressConverter.cs?rev=378595&r1=378594&r2=378595&view=diff ============================================================================== --- logging/log4net/trunk/src/Util/TypeConverters/IPAddressConverter.cs (original) +++ logging/log4net/trunk/src/Util/TypeConverters/IPAddressConverter.cs Fri Feb 17 11:20:22 2006 @@ -76,6 +76,20 @@ { try { +#if NET_2_0 + // Try to resolve via DNS. This is a blocking call. + // GetHostEntry works with either an IPAddress string or a host name + IPHostEntry host = Dns.GetHostEntry(str); + if (host != null && + host.AddressList != null && + host.AddressList.Length > 0 && + host.AddressList[0] != null) + { + return host.AddressList[0]; + } +#else + // Before .NET 2 we need to try to parse the IPAddress from the string first + // Check if the string only contains IP address valid chars if (str.Trim(validIpAddressChars).Length == 0) { @@ -99,6 +113,7 @@ { return host.AddressList[0]; } +#endif } catch(Exception ex) { Modified: logging/log4net/trunk/tests/src/Appender/RemotingAppenderTest.cs URL: http://svn.apache.org/viewcvs/logging/log4net/trunk/tests/src/Appender/RemotingAppenderTest.cs?rev=378595&r1=378594&r2=378595&view=diff ============================================================================== --- logging/log4net/trunk/tests/src/Appender/RemotingAppenderTest.cs (original) +++ logging/log4net/trunk/tests/src/Appender/RemotingAppenderTest.cs Fri Feb 17 11:20:22 2006 @@ -195,7 +195,11 @@ // Setup remoting server try { +#if NET_2_0 + ChannelServices.RegisterChannel(m_remotingChannel, false); +#else ChannelServices.RegisterChannel(m_remotingChannel); +#endif } catch(Exception) { Modified: logging/log4net/trunk/tests/src/Layout/XmlLayoutTest.cs URL: http://svn.apache.org/viewcvs/logging/log4net/trunk/tests/src/Layout/XmlLayoutTest.cs?rev=378595&r1=378594&r2=378595&view=diff ============================================================================== --- logging/log4net/trunk/tests/src/Layout/XmlLayoutTest.cs (original) +++ logging/log4net/trunk/tests/src/Layout/XmlLayoutTest.cs Fri Feb 17 11:20:22 2006 @@ -58,14 +58,14 @@ private string createEventNode(string message) { return String.Format("<event logger=\"TestLogger\" timestamp=\"{0}\" level=\"INFO\" thread=\"TestThread\" domain=\"Tests\" identity=\"TestRunner\" username=\"TestRunner\"><message>{1}</message></event>\r\n", - XmlConvert.ToString(DateTime.Today), + XmlConvert.ToString(DateTime.Today, XmlDateTimeSerializationMode.Local), message); } private string createEventNode(string key, string value) { return String.Format("<event logger=\"TestLogger\" timestamp=\"{0:s}\" level=\"INFO\" thread=\"TestThread\" domain=\"Tests\" identity=\"TestRunner\" username=\"TestRunner\"><message>Test message</message><properties><data name=\"{1}\" value=\"{2}\" /></properties></event>\r\n", - XmlConvert.ToString(DateTime.Today), + XmlConvert.ToString(DateTime.Today, XmlDateTimeSerializationMode.Local), key, value); }