#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 ConfigurationException = IBatisNet.Common.Exceptions.ConfigurationException; namespace IBatisNet.Common.Logging { /// /// Summary description for ConfigurationSectionHandler. /// 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() { } /// /// /// /// /// 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 { 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 = new NameValueCollection( null, new CaseInsensitiveComparer() ); 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 /// /// /// /// /// /// /// public object Create(object parent, object configContext, System.Xml.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 } }