#region Apache Notice
/*****************************************************************************
* $Header: $
* $Revision$
* $Date$
*
* iBATIS.NET Data Mapper
* Copyright (C) 2004 - Gilles Bayon
*
*
* 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.Collections;
using System.Collections.Specialized;
using System.Configuration;
using System.Xml;
using IBatisNet.Common.Logging.Impl;
using ConfigurationException = IBatisNet.Common.Exceptions.ConfigurationException;
namespace IBatisNet.Common.Logging
{
///
/// Used in an application's configuration file (App.Config or Web.Config) to configure the logging subsystem.
///
///
///
/// An example configuration section that writes IBatisNet messages to the Console using the built-in Console Logger.
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
/// The following aliases are recognized for the type attribute of logFactoryAdapter:
///
///
/// - CONSOLEAlias for IBatisNet.Common.Logging.Impl.ConsoleOutLoggerFA, IBatisNet.Common
/// - TRACEAlias for IBatisNet.Common.Logging.Impl.TraceLoggerFA, IBatisNet.Common
/// - NOOPAlias IBatisNet.Common.Logging.Impl.NoOpLoggerFA, IBatisNet.Common
///
///
public class ConfigurationSectionHandler: IConfigurationSectionHandler
{
#region Fields
private static readonly string LOGFACTORYADAPTER_ELEMENT = "logFactoryAdapter";
private static readonly string LOGFACTORYADAPTER_ELEMENT_TYPE_ATTRIB = "type";
private static readonly string ARGUMENT_ELEMENT = "arg";
private static readonly string ARGUMENT_ELEMENT_KEY_ATTRIB = "key";
private static readonly string ARGUMENT_ELEMENT_VALUE_ATTRIB = "value";
#endregion
///
/// Constructor
///
public ConfigurationSectionHandler()
{
}
///
/// Retrieves the of the logger the use by looking at the logFactoryAdapter element
/// of the logging configuration element.
///
///
///
/// A object containing the specified type that implements
/// along with zero or more properties that will be
/// passed to the logger factory adapter's constructor as an .
///
private LogSetting ReadConfiguration( XmlNode section )
{
XmlNode logFactoryElement = section.SelectSingleNode( LOGFACTORYADAPTER_ELEMENT );
string factoryTypeString = string.Empty;
if ( logFactoryElement.Attributes[LOGFACTORYADAPTER_ELEMENT_TYPE_ATTRIB] != null )
factoryTypeString = logFactoryElement.Attributes[LOGFACTORYADAPTER_ELEMENT_TYPE_ATTRIB].Value;
if ( factoryTypeString == string.Empty )
{
throw new ConfigurationException
( "Required Attribute '"
+ LOGFACTORYADAPTER_ELEMENT_TYPE_ATTRIB
+ "' not found in element '"
+ LOGFACTORYADAPTER_ELEMENT
+ "'"
);
}
Type factoryType = null;
try
{
if (String.Compare(factoryTypeString, "CONSOLE", true) == 0)
{
factoryType = typeof(ConsoleOutLoggerFA);
}
else if (String.Compare(factoryTypeString, "TRACE", true) == 0)
{
factoryType = typeof(TraceLoggerFA);
}
else if (String.Compare(factoryTypeString, "NOOP", true) == 0)
{
factoryType = typeof(NoOpLoggerFA);
}
else
{
factoryType = Type.GetType( factoryTypeString, true, false );
}
}
catch ( Exception e )
{
throw new ConfigurationException
( "Unable to create type '" + factoryTypeString + "'"
, e
);
}
XmlNodeList propertyNodes = logFactoryElement.SelectNodes( ARGUMENT_ELEMENT );
NameValueCollection properties = null;
#if dotnet2
properties = new NameValueCollection(StringComparer.InvariantCultureIgnoreCase);
#else
properties = new NameValueCollection( null, new CaseInsensitiveComparer() );
#endif
foreach ( XmlNode propertyNode in propertyNodes )
{
string key = string.Empty;
string itsValue = string.Empty;
XmlAttribute keyAttrib = propertyNode.Attributes[ARGUMENT_ELEMENT_KEY_ATTRIB];
XmlAttribute valueAttrib = propertyNode.Attributes[ARGUMENT_ELEMENT_VALUE_ATTRIB];
if ( keyAttrib == null )
{
throw new ConfigurationException
( "Required Attribute '"
+ ARGUMENT_ELEMENT_KEY_ATTRIB
+ "' not found in element '"
+ ARGUMENT_ELEMENT
+ "'"
);
}
else
{
key = keyAttrib.Value;
}
if ( valueAttrib != null )
{
itsValue = valueAttrib.Value;
}
properties.Add( key, itsValue );
}
return new LogSetting( factoryType, properties );
}
#region IConfigurationSectionHandler Members
///
/// Verifies that the logFactoryAdapter element appears once in the configuration section.
///
/// The parent of the current item.
/// Additional information about the configuration process.
/// The configuration section to apply an XPath query too.
///
/// A object containing the specified logFactoryAdapter type
/// along with user supplied configuration properties.
///
public object Create(object parent, object configContext, XmlNode section)
{
int logFactoryElementsCount = section.SelectNodes( LOGFACTORYADAPTER_ELEMENT ).Count;
if ( logFactoryElementsCount > 1 )
{
throw new ConfigurationException( "Only one element allowed" );
}
else if ( logFactoryElementsCount == 1 )
{
return ReadConfiguration( section );
}
else
{
return null;
}
}
#endregion
}
}