#region Apache Notice
/*****************************************************************************
* $Header: $
* $Revision: 591621 $
* $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
#region Using
using System;
using System.Collections;
using System.Collections.Specialized;
using System.IO;
using System.Text;
using System.Reflection;
using System.Threading;
using System.Xml;
using System.Xml.Schema;
using Apache.Ibatis.Common;
using Apache.Ibatis.Common.Resources;
using Apache.Ibatis.Common.Exceptions;
using Apache.Ibatis.Common.Logging;
using Apache.Ibatis.Common.Utilities;
using Apache.Ibatis.Common.Utilities.Objects;
using Apache.Ibatis.Common.Utilities.Objects.Members;
using Apache.Ibatis.Common.Xml;
using Apache.Ibatis.DataMapper.Model.Alias;
using Apache.Ibatis.DataMapper.Model.Cache;
using Apache.Ibatis.DataMapper.Model.Cache.Fifo;
using Apache.Ibatis.DataMapper.Model.Cache.Lru;
using Apache.Ibatis.DataMapper.Model.Cache.Memory;
using Apache.Ibatis.DataMapper.Model.ParameterMapping;
using Apache.Ibatis.DataMapper.Model.ResultMapping;
using Apache.Ibatis.DataMapper.Configuration.Serializers;
using Apache.Ibatis.DataMapper.Model.Sql;
using Apache.Ibatis.DataMapper.Model.Sql.Dynamic;
using Apache.Ibatis.DataMapper.Model.Sql.Dynamic.Elements;
using Apache.Ibatis.DataMapper.Model.Sql.SimpleDynamic;
using Apache.Ibatis.DataMapper.Model.Sql.Static;
using Apache.Ibatis.DataMapper.Model.Statements;
using Apache.Ibatis.DataMapper.MappedStatements;
using Apache.Ibatis.DataMapper.MappedStatements.ArgumentStrategy;
using Apache.Ibatis.DataMapper.MappedStatements.PropertyStrategy;
using Apache.Ibatis.DataMapper.Scope;
using Apache.Ibatis.DataMapper.TypeHandlers;
using Apache.Ibatis.Common.Data;
#endregion
namespace Apache.Ibatis.DataMapper.Configuration
{
///
/// Builds an ISqlMapper instance from the supplied resources (e.g. XML configuration files).
///
public class DomSqlMapBuilder
{
// #region Embedded resource
// // Which files must we allow to be used as Embedded Resources ?
// // - slqMap.config [Yes]
// // - providers.config [Yes]
// // - sqlMap files [Yes]
// // - properties file (like Database.config) [Yes]
// // see contribution, NHibernate usage,
// // see http://www.codeproject.com/csharp/EmbeddedResourceStrings.asp
// // see http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=75
// #endregion
// #region Constant
// private const string PROPERTY_ELEMENT_KEY_ATTRIB = "key";
// private const string PROPERTY_ELEMENT_VALUE_ATTRIB = "value";
// ///
// ///
// ///
// private const string DATAMAPPER_NAMESPACE_PREFIX = "mapper";
// private const string PROVIDERS_NAMESPACE_PREFIX = "provider";
// private const string MAPPING_NAMESPACE_PREFIX = "mapping";
// private const string DATAMAPPER_XML_NAMESPACE = "http://ibatis.apache.org/dataMapper";
// private const string PROVIDER_XML_NAMESPACE = "http://ibatis.apache.org/providers";
// private const string MAPPING_XML_NAMESPACE = "http://ibatis.apache.org/mapping";
// ///
// /// Default filename of main configuration file.
// ///
// public const string DEFAULT_FILE_CONFIG_NAME = "SqlMap.config";
// ///
// /// Default provider name
// ///
// private const string DEFAULT_PROVIDER_NAME = "_DEFAULT_PROVIDER_NAME";
///
/// Dot representation.
///
public const string DOT = ".";
// ///
// /// Token for SqlMapConfig xml root element.
// ///
// private const string XML_DATAMAPPER_CONFIG_ROOT = "sqlMapConfig";
// ///
// /// Token for xml path to SqlMapConfig settings element.
// ///
// private const string XML_CONFIG_SETTINGS = "sqlMapConfig/settings/setting";
// ///
// /// Token for default providers config file name.
// ///
// private const string PROVIDERS_FILE_NAME = "providers.config";
// ///
// /// Token for xml path to SqlMapConfig providers element.
// ///
// private const string XML_CONFIG_PROVIDERS = "sqlMapConfig/providers";
// ///
// /// Token for xml path to properties elements.
// ///
// private const string XML_PROPERTIES = "properties";
// ///
// /// Token for xml path to property elements.
// ///
// private const string XML_PROPERTY = "property";
// ///
// /// Token for xml path to settings add elements.
// ///
// private const string XML_SETTINGS_ADD = "/*/add";
// ///
// /// Token for xml path to global properties elements.
// ///
// private const string XML_GLOBAL_PROPERTIES = "*/add";
// ///
// /// Token for xml path to provider elements.
// ///
// private const string XML_PROVIDER = "providers/provider";
// ///
// /// Token for xml path to database provider elements.
// ///
// private const string XML_DATABASE_PROVIDER = "sqlMapConfig/database/provider";
// ///
// /// Token for xml path to database source elements.
// ///
// private const string XML_DATABASE_DATASOURCE = "sqlMapConfig/database/dataSource";
// ///
// /// Token for xml path to global type alias elements.
// ///
// private const string XML_GLOBAL_TYPEALIAS = "sqlMapConfig/alias/typeAlias";
// ///
// /// Token for xml path to global type alias elements.
// ///
// private const string XML_GLOBAL_TYPEHANDLER = "sqlMapConfig/typeHandlers/typeHandler";
// ///
// /// Token for xml path to sqlMap elements.
// ///
// private const string XML_SQLMAP = "sqlMapConfig/sqlMaps/sqlMap";
// ///
// /// Token for mapping xml root.
// ///
// private const string XML_MAPPING_ROOT = "sqlMap";
// ///
// /// Token for xml path to type alias elements.
// ///
// private const string XML_TYPEALIAS = "sqlMap/alias/typeAlias";
// ///
// /// Token for xml path to resultMap elements.
// ///
// private const string XML_RESULTMAP = "sqlMap/resultMaps/resultMap";
// ///
// /// Token for xml path to parameterMap elements.
// ///
// private const string XML_PARAMETERMAP = "sqlMap/parameterMaps/parameterMap";
// ///
// /// Token for xml path to sql elements.
// ///
// private const string SQL_STATEMENT = "sqlMap/statements/sql";
// ///
// /// Token for xml path to statement elements.
// ///
// private const string XML_STATEMENT = "sqlMap/statements/statement";
// ///
// /// Token for xml path to select elements.
// ///
// private const string XML_SELECT = "sqlMap/statements/select";
// ///
// /// Token for xml path to insert elements.
// ///
// private const string XML_INSERT = "sqlMap/statements/insert";
// ///
// /// Token for xml path to selectKey elements.
// ///
// private const string XML_SELECTKEY= "selectKey";
// ///
// /// Token for xml path to update elements.
// ///
// private const string XML_UPDATE ="sqlMap/statements/update";
// ///
// /// Token for xml path to delete elements.
// ///
// private const string XML_DELETE ="sqlMap/statements/delete";
// ///
// /// Token for xml path to procedure elements.
// ///
// private const string XML_PROCEDURE ="sqlMap/statements/procedure";
// ///
// /// Token for xml path to cacheModel elements.
// ///
// private const string XML_CACHE_MODEL = "sqlMap/cacheModels/cacheModel";
// ///
// /// Token for xml path to flushOnExecute elements.
// ///
// private const string XML_FLUSH_ON_EXECUTE = "flushOnExecute";
// ///
// /// Token for xml path to search statement elements.
// ///
// private const string XML_SEARCH_STATEMENT ="sqlMap/statements";
// ///
// /// Token for xml path to search parameterMap elements.
// ///
// private const string XML_SEARCH_PARAMETER ="sqlMap/parameterMaps/parameterMap[@id='";
// ///
// /// Token for xml path to search resultMap elements.
// ///
// private const string XML_SEARCH_RESULTMAP ="sqlMap/resultMaps/resultMap[@id='";
// ///
// /// Token for useStatementNamespaces attribute.
// ///
// private const string ATR_USE_STATEMENT_NAMESPACES = "useStatementNamespaces";
// ///
// /// Token for cacheModelsEnabled attribute.
// ///
// private const string ATR_CACHE_MODELS_ENABLED = "cacheModelsEnabled";
// ///
// /// Token for validateSqlMap attribute.
// ///
// private const string ATR_VALIDATE_SQLMAP = "validateSqlMap";
// ///
// /// Token for useReflectionOptimizer attribute.
// ///
// private const string ATR_USE_REFLECTION_OPTIMIZER = "useReflectionOptimizer";
// #endregion
// #region Fields
// private static readonly ILog _logger = LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType );
// private ConfigurationScope _configScope = null;
// private DeSerializerFactory _deSerializerFactory = null;
// private InlineParameterMapParser _paramParser = null;
// private IObjectFactory _objectFactory = null;
// private ISetAccessorFactory _setAccessorFactory = null;
// private IGetAccessorFactory _getAccessorFactory = null;
// private ISqlMapper _sqlMapper = null;
// private bool _validateSqlMapConfig = true;
// #endregion
// #region Properties
// ///
// /// Allow properties to be set before configuration.
// ///
// public NameValueCollection Properties
// {
// set { _configScope.Properties.Add(value); }
// }
// ///
// /// Allow a custom to be set before configuration.
// ///
// public ISetAccessorFactory SetAccessorFactory
// {
// set { _setAccessorFactory = value; }
// }
// ///
// /// Allow a custom to be set before configuration.
// ///
// public IGetAccessorFactory GetAccessorFactory
// {
// set { _getAccessorFactory = value; }
// }
// ///
// /// Allow a custom to be set before configuration.
// ///
// public IObjectFactory ObjectFactory
// {
// set { _objectFactory = value; }
// }
// ///
// /// Allow a custom to be set before configuration.
// ///
// public ISqlMapper SqlMapper
// {
// set { _sqlMapper = value; }
// }
// ///
// /// Enable validation of SqlMap document. This property must be set before configuration.
// ///
// public bool ValidateSqlMapConfig
// {
// set { _validateSqlMapConfig = value; }
// }
// #endregion
// #region Constructor
// ///
// /// Constructs a DomSqlMapBuilder.
// ///
// public DomSqlMapBuilder()
// {
// _configScope = new ConfigurationScope();
// _paramParser = new InlineParameterMapParser();
// _deSerializerFactory = new DeSerializerFactory(_configScope);
// }
// #endregion
// #region Configure
// ///
// /// Configure a SqlMapper from default resource file named 'SqlMap.config'.
// ///
// /// An ISqlMapper instance.
// ///
// /// The file path is relative to the application root. For ASP.Net applications
// /// this would be the same directory as the Web.config file. For other .Net
// /// applications the SqlMap.config file should be placed in the same folder
// /// as the executable.
// ///
// public ISqlMapper Configure()
// {
// return Configure(Resources.GetAsXmlDocument(DEFAULT_FILE_CONFIG_NAME, new NameValueCollection()));
// }
// ///
// /// Configure and returns an ISqlMapper instance.
// ///
// /// An xml sql map configuration document.
// /// An ISqlMapper instance.
// public ISqlMapper Configure(XmlDocument document)
// {
// return Build( document, false );
// }
// ///
// /// Configure an ISqlMapper object from a resource path.
// ///
// /// A valid uri.
// /// An ISqlMapper instance.
// public ISqlMapper Configure(string resource)
// {
// XmlDocument document = Resources.GetAsXmlDocument(resource);
// return Build( document, false);
// }
// ///
// /// Configure an ISqlMapper object from a stream.
// ///
// /// A Stream resource.
// /// An SqlMap
// public ISqlMapper Configure(Stream resource)
// {
// XmlDocument document = Resources.GetStreamAsXmlDocument( resource );
// return Build( document, false);
// }
// ///
// /// Configure and monitor the default configuration file (SqlMap.config) for modifications
// /// and automatically reconfigure SqlMap.
// ///
// /// An ISqlMapper instance.
// public ISqlMapper ConfigureAndWatch(ConfigureHandler configureDelegate)
// {
// return ConfigureAndWatch( DEFAULT_FILE_CONFIG_NAME, configureDelegate ) ;
// }
// ///
// /// Configure and monitor the configuration file for modifications
// /// and automatically reconfigure the ISqlMapper instance.
// ///
// /// A valid uri.
// ///
// /// Delegate called when the file has changed.
// ///
// /// An ISqlMapper instance.
// public ISqlMapper ConfigureAndWatch( string uri, ConfigureHandler configureDelegate )
// {
// XmlDocument document = Resources.GetAsXmlDocument(uri);
// ConfigWatcherHandler.ClearFilesMonitored();
// IResource resource = ResourceLoaderRegistry.GetResource(uri);
// ConfigWatcherHandler.AddFileToWatch(resource.FileInfo);
// TimerCallback callBakDelegate = new TimerCallback( OnConfigFileChange );
// StateConfig state = new StateConfig();
// state.FileName = resource.Uri.LocalPath;
// state.ConfigureHandler = configureDelegate;
// ISqlMapper sqlMapper = Build( document, true );
// new ConfigWatcherHandler( callBakDelegate, state );
// return sqlMapper;
// }
// ///
// /// Callback called when the SqlMap.config file has changed.
// ///
// /// The object.
// public static void OnConfigFileChange(object obj)
// {
// StateConfig state = (StateConfig)obj;
// state.ConfigureHandler( null );
// }
// #endregion
// #region Methods
// ///
// /// Build an ISqlMapper instance.
// ///
// /// An xml configuration document.
// /// A data source.
// ///
// ///
// /// Returns an ISqlMapper instance.
// private ISqlMapper Build(XmlDocument document,IDataSource dataSource,
// bool useConfigFileWatcher, bool isCallFromDao)
// {
// _configScope.SqlMapConfigDocument = document;
// _configScope.DataSource = dataSource;
// _configScope.IsCallFromDao = isCallFromDao;
// _configScope.UseConfigFileWatcher = useConfigFileWatcher;
// _configScope.XmlNamespaceManager = new XmlNamespaceManager(_configScope.SqlMapConfigDocument.NameTable);
// _configScope.XmlNamespaceManager.AddNamespace(DATAMAPPER_NAMESPACE_PREFIX, DATAMAPPER_XML_NAMESPACE);
// _configScope.XmlNamespaceManager.AddNamespace(PROVIDERS_NAMESPACE_PREFIX, PROVIDER_XML_NAMESPACE);
// _configScope.XmlNamespaceManager.AddNamespace(MAPPING_NAMESPACE_PREFIX, MAPPING_XML_NAMESPACE);
// try
// {
// if (_validateSqlMapConfig)
// {
// ValidateSchema( document.ChildNodes[1], "SqlMapConfig.xsd" );
// }
// Initialize();
// return _configScope.SqlMapper;
// }
// catch(Exception e)
// {
// throw new ConfigurationException(_configScope.ErrorContext.ToString(), e);
// }
// }
// ///
// /// Validates an XmlNode against a schema file.
// ///
// /// The doc to validate.
// /// Schema file name.
// private void ValidateSchema( XmlNode section, string schemaFileName )
// {
// XmlReader validatingReader = null;
// Stream xsdFile = null;
// _configScope.ErrorContext.Activity = "Validate SqlMap config";
// try
// {
// //Validate the document using a schema
// xsdFile = GetStream( schemaFileName );
// if (xsdFile == null)
// {
// // TODO: avoid using hard-coded value "Apache.Ibatis.DataMapper"
// throw new ConfigurationException( "Unable to locate embedded resource [Apache.Ibatis.DataMapper."+schemaFileName+"]. If you are building from source, verfiy the file is marked as an embedded resource.");
// }
// XmlSchema schema = XmlSchema.Read( xsdFile, new ValidationEventHandler(ValidationCallBack) );
// XmlReaderSettings settings = new XmlReaderSettings();
// settings.ValidationType = ValidationType.Schema;
// // Create the XmlSchemaSet class.
// XmlSchemaSet schemas = new XmlSchemaSet();
// schemas.Add(schema);
// settings.Schemas = schemas;
// validatingReader = XmlReader.Create( new XmlNodeReader(section) , settings);
// // Wire up the call back. The ValidationEvent is fired when the
// // XmlValidatingReader hits an issue validating a section of the xml
// settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
// // Validate the document
// while (validatingReader.Read()){}
// if(! _configScope.IsXmlValid )
// {
// throw new ConfigurationException( "Invalid SqlMap.config document. cause :"+_configScope.ErrorContext.Resource);
// }
// }
// finally
// {
// if( validatingReader != null ) validatingReader.Close();
// if( xsdFile != null ) xsdFile.Close();
// }
// }
// private void ValidationCallBack( object sender, ValidationEventArgs args )
// {
// _configScope.IsXmlValid = false;
// _configScope.ErrorContext.Resource += args.Message + Environment.NewLine;
// }
// ///
// /// Load statements (select, insert, update, delete), parameters, and resultMaps.
// ///
// ///
// ///
// ///
// ///
// ///
// /// Used by Dao
// public ISqlMapper Build(XmlDocument document, IDataSource dataSource, bool useConfigFileWatcher, NameValueCollection properties)
// {
// _configScope.Properties.Add(properties);
// return Build(document, dataSource, useConfigFileWatcher, true);
// }
// ///
// /// Load SqlMap configuration from
// /// from the XmlDocument passed in parameter.
// ///
// /// The xml sql map configuration.
// ///
// public ISqlMapper Build(XmlDocument document, bool useConfigFileWatcher)
// {
// return Build(document, null, useConfigFileWatcher, false);
// }
// ///
// /// Reset PreparedStatements cache
// ///
// private void Reset()
// {
// }
// ///
// /// Intialize the internal ISqlMapper instance.
// ///
// private void Initialize()
// {
// Reset();
// #region Load Global Properties
// if (_configScope.IsCallFromDao == false)
// {
// _configScope.NodeContext = _configScope.SqlMapConfigDocument.SelectSingleNode( ApplyDataMapperNamespacePrefix(XML_DATAMAPPER_CONFIG_ROOT), _configScope.XmlNamespaceManager);
// ParseGlobalProperties();
// }
// #endregion
// #region Load settings
// _configScope.ErrorContext.Activity = "loading global settings";
// XmlNodeList settings = _configScope.SqlMapConfigDocument.SelectNodes( ApplyDataMapperNamespacePrefix(XML_CONFIG_SETTINGS), _configScope.XmlNamespaceManager);
// if (settings!=null)
// {
// foreach (XmlNode setting in settings)
// {
// if (setting.Attributes[ATR_USE_STATEMENT_NAMESPACES] != null )
// {
// string value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_USE_STATEMENT_NAMESPACES].Value, _configScope.Properties);
// _configScope.UseStatementNamespaces = Convert.ToBoolean( value );
// }
// if (setting.Attributes[ATR_CACHE_MODELS_ENABLED] != null )
// {
// string value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_CACHE_MODELS_ENABLED].Value, _configScope.Properties);
// _configScope.IsCacheModelsEnabled = Convert.ToBoolean( value );
// }
// if (setting.Attributes[ATR_USE_REFLECTION_OPTIMIZER] != null )
// {
// string value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_USE_REFLECTION_OPTIMIZER].Value, _configScope.Properties);
// _configScope.UseReflectionOptimizer = Convert.ToBoolean( value );
// }
// if (setting.Attributes[ATR_VALIDATE_SQLMAP] != null )
// {
// string value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_VALIDATE_SQLMAP].Value, _configScope.Properties);
// _configScope.ValidateSqlMap = Convert.ToBoolean( value );
// }
// }
// }
// #endregion
// if (_objectFactory == null)
// {
// _objectFactory = new ObjectFactory(_configScope.UseReflectionOptimizer);
// }
// if (_setAccessorFactory == null)
// {
// _setAccessorFactory = new SetAccessorFactory(_configScope.UseReflectionOptimizer);
// }
// if (_getAccessorFactory == null)
// {
// _getAccessorFactory = new GetAccessorFactory(_configScope.UseReflectionOptimizer);
// }
// if (_sqlMapper == null)
// {
// AccessorFactory accessorFactory = new AccessorFactory(_setAccessorFactory, _getAccessorFactory);
// _configScope.SqlMapper = new SqlMapper(_objectFactory, accessorFactory);
// }
// else
// {
// _configScope.SqlMapper = _sqlMapper;
// }
// ParameterMap emptyParameterMap = new ParameterMap(_configScope.DataExchangeFactory);
// emptyParameterMap.Id = ConfigurationScope.EMPTY_PARAMETER_MAP;
// _configScope.SqlMapper.AddParameterMap( emptyParameterMap );
// _configScope.SqlMapper.IsCacheModelsEnabled = _configScope.IsCacheModelsEnabled;
// #region Cache Alias
// TypeAlias cacheAlias = new TypeAlias(typeof(MemoryCacheControler));
// cacheAlias.Name = "MEMORY";
// _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias);
// cacheAlias = new TypeAlias(typeof(LruCacheController));
// cacheAlias.Name = "LRU";
// _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias);
// cacheAlias = new TypeAlias(typeof(FifoCacheController));
// cacheAlias.Name = "FIFO";
// _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias);
// cacheAlias = new TypeAlias(typeof(AnsiStringTypeHandler));
// cacheAlias.Name = "AnsiStringTypeHandler";
// _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias);
// #endregion
// #region Load providers
// if (_configScope.IsCallFromDao == false)
// {
// GetProviders();
// }
// #endregion
// #region Load DataBase
// #region Choose the provider
// IDbProvider provider = null;
// if ( _configScope.IsCallFromDao==false )
// {
// provider = ParseProvider();
// _configScope.ErrorContext.Reset();
// }
// #endregion
// #region Load the DataSources
// _configScope.ErrorContext.Activity = "loading Database DataSource";
// XmlNode nodeDataSource = _configScope.SqlMapConfigDocument.SelectSingleNode( ApplyDataMapperNamespacePrefix(XML_DATABASE_DATASOURCE), _configScope.XmlNamespaceManager );
// if (nodeDataSource == null)
// {
// if (_configScope.IsCallFromDao == false)
// {
// throw new ConfigurationException("There's no dataSource tag in SqlMap.config.");
// }
// else // patch from Luke Yang
// {
// _configScope.SqlMapper.DataSource = _configScope.DataSource;
// }
// }
// else
// {
// if (_configScope.IsCallFromDao == false)
// {
// _configScope.ErrorContext.Resource = nodeDataSource.OuterXml.ToString();
// _configScope.ErrorContext.MoreInfo = "parse DataSource";
// DataSource dataSource = DataSourceDeSerializer.Deserialize( nodeDataSource );
// dataSource.DbProvider = provider;
// dataSource.ConnectionString = NodeUtils.ParsePropertyTokens(dataSource.ConnectionString, _configScope.Properties);
// _configScope.DataSource = dataSource;
// _configScope.SqlMapper.DataSource = _configScope.DataSource;
// }
// else
// {
// _configScope.SqlMapper.DataSource = _configScope.DataSource;
// }
// _configScope.ErrorContext.Reset();
// }
// #endregion
// #endregion
// #region Load Global TypeAlias
// foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes( ApplyDataMapperNamespacePrefix(XML_GLOBAL_TYPEALIAS), _configScope.XmlNamespaceManager))
// {
// _configScope.ErrorContext.Activity = "loading global Type alias";
// TypeAliasDeSerializer.Deserialize(xmlNode, _configScope);
// }
// _configScope.ErrorContext.Reset();
// #endregion
// #region Load TypeHandlers
// foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes( ApplyDataMapperNamespacePrefix(XML_GLOBAL_TYPEHANDLER), _configScope.XmlNamespaceManager))
// {
// try
// {
// _configScope.ErrorContext.Activity = "loading typeHandler";
// TypeHandlerDeSerializer.Deserialize( xmlNode, _configScope );
// }
// catch (Exception e)
// {
// NameValueCollection prop = NodeUtils.ParseAttributes(xmlNode, _configScope.Properties);
// throw new ConfigurationException(
// String.Format("Error registering TypeHandler class \"{0}\" for handling .Net type \"{1}\" and dbType \"{2}\". Cause: {3}",
// NodeUtils.GetStringAttribute(prop, "callback"),
// NodeUtils.GetStringAttribute(prop, "type"),
// NodeUtils.GetStringAttribute(prop, "dbType"),
// e.Message), e);
// }
// }
// _configScope.ErrorContext.Reset();
// #endregion
// #region Load sqlMap mapping files
// foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes( ApplyDataMapperNamespacePrefix(XML_SQLMAP), _configScope.XmlNamespaceManager))
// {
// _configScope.NodeContext = xmlNode;
// ConfigureSqlMap();
// }
// #endregion
// #region Attach CacheModel to statement
// if (_configScope.IsCacheModelsEnabled)
// {
// foreach(DictionaryEntry entry in _configScope.SqlMapper.MappedStatements)
// {
// _configScope.ErrorContext.Activity = "Set CacheModel to statement";
// IMappedStatement mappedStatement = (IMappedStatement)entry.Value;
// if (mappedStatement.Statement.CacheModelName.Length >0)
// {
// _configScope.ErrorContext.MoreInfo = "statement : "+mappedStatement.Statement.Id;
// _configScope.ErrorContext.Resource = "cacheModel : " +mappedStatement.Statement.CacheModelName;
// mappedStatement.Statement.CacheModel = _configScope.SqlMapper.GetCache(mappedStatement.Statement.CacheModelName);
// }
// }
// }
// _configScope.ErrorContext.Reset();
// #endregion
// #region Register Trigger Statements for Cache Models
// foreach (DictionaryEntry entry in _configScope.CacheModelFlushOnExecuteStatements)
// {
// string cacheModelId = (string)entry.Key;
// IList statementsToRegister = (IList)entry.Value;
// if (statementsToRegister != null && statementsToRegister.Count > 0)
// {
// foreach (string statementName in statementsToRegister)
// {
// IMappedStatement mappedStatement = _configScope.SqlMapper.MappedStatements[statementName] as IMappedStatement;
// if (mappedStatement != null)
// {
// CacheModel cacheModel = _configScope.SqlMapper.GetCache(cacheModelId);
// if (_logger.IsDebugEnabled)
// {
// _logger.Debug("Registering trigger statement [" + mappedStatement.Id + "] to cache model [" + cacheModel.Id + "]");
// }
// cacheModel.RegisterTriggerStatement(mappedStatement);
// }
// else
// {
// if (_logger.IsWarnEnabled)
// {
// _logger.Warn("Unable to register trigger statement [" + statementName + "] to cache model [" + cacheModelId + "]. Statement does not exist.");
// }
// }
// }
// }
// }
// #endregion
// #region Resolve resultMap / Discriminator / PropertyStategy attributes on Result/Argument Property
// foreach(DictionaryEntry entry in _configScope.SqlMapper.ResultMaps)
// {
// _configScope.ErrorContext.Activity = "Resolve 'resultMap' attribute on Result Property";
// ResultMap resultMap = (ResultMap)entry.Value;
// for(int index=0; index< resultMap.Properties.Count; index++)
// {
// ResultProperty result = resultMap.Properties[index];
// if(result.NestedResultMapName.Length >0)
// {
// result.NestedResultMap = _configScope.SqlMapper.GetResultMap(result.NestedResultMapName);
// }
// result.PropertyStrategy = PropertyStrategyFactory.Get(result);
// }
// for(int index=0; index< resultMap.Parameters.Count; index++)
// {
// ResultProperty result = resultMap.Parameters[index];
// if(result.NestedResultMapName.Length >0)
// {
// result.NestedResultMap = _configScope.SqlMapper.GetResultMap(result.NestedResultMapName);
// }
// result.ArgumentStrategy = ArgumentStrategyFactory.Get( (ArgumentProperty)result );
// }
// if (resultMap.Discriminator != null)
// {
// resultMap.Discriminator.Initialize(_configScope);
// }
// }
// _configScope.ErrorContext.Reset();
// #endregion
// }
// ///
// /// Load and initialize providers from specified file.
// ///
// private void GetProviders()
// {
// IDbProvider provider;
// XmlDocument xmlProviders;
// _configScope.ErrorContext.Activity = "loading Providers";
// XmlNode providersNode = _configScope.SqlMapConfigDocument.SelectSingleNode( ApplyDataMapperNamespacePrefix(XML_CONFIG_PROVIDERS), _configScope.XmlNamespaceManager);
// if (providersNode != null )
// {
// xmlProviders = Resources.GetAsXmlDocument( providersNode, _configScope.Properties );
// }
// else
// {
// xmlProviders = Resources.GetAsXmlDocument(PROVIDERS_FILE_NAME);
// }
// foreach (XmlNode node in xmlProviders.SelectNodes( ApplyProviderNamespacePrefix(XML_PROVIDER), _configScope.XmlNamespaceManager ) )
// {
// _configScope.ErrorContext.Resource = node.InnerXml.ToString();
// provider = ProviderDeSerializer.Deserialize(node);
// if (provider.IsEnabled)
// {
// _configScope.ErrorContext.ObjectId = provider.Name;
// _configScope.ErrorContext.MoreInfo = "initialize provider";
// provider.Initialize();
// _configScope.Providers.Add(provider.Name, provider);
// if (provider.IsDefault)
// {
// if (_configScope.Providers[DEFAULT_PROVIDER_NAME] == null)
// {
// _configScope.Providers.Add(DEFAULT_PROVIDER_NAME,provider);
// }
// else
// {
// throw new ConfigurationException(
// string.Format("Error while configuring the Provider named \"{0}\" There can be only one default Provider.",provider.Name));
// }
// }
// }
// }
// _configScope.ErrorContext.Reset();
// }
// ///
// /// Parse the provider tag.
// ///
// /// A provider object.
// private IDbProvider ParseProvider()
// {
// _configScope.ErrorContext.Activity = "load DataBase Provider";
// XmlNode node = _configScope.SqlMapConfigDocument.SelectSingleNode( ApplyDataMapperNamespacePrefix(XML_DATABASE_PROVIDER), _configScope.XmlNamespaceManager );
// if (node != null)
// {
// _configScope.ErrorContext.Resource = node.OuterXml.ToString();
// string providerName = NodeUtils.ParsePropertyTokens(node.Attributes["name"].Value, _configScope.Properties);
// _configScope.ErrorContext.ObjectId = providerName;
// if (_configScope.Providers.Contains(providerName))
// {
// return (IDbProvider) _configScope.Providers[providerName];
// }
// else
// {
// throw new ConfigurationException(
// string.Format("Error while configuring the Provider named \"{0}\". Cause : The provider is not in 'providers.config' or is not enabled.",
// providerName));
// }
// }
// else
// {
// if (_configScope.Providers.Contains(DEFAULT_PROVIDER_NAME))
// {
// return (IDbProvider) _configScope.Providers[DEFAULT_PROVIDER_NAME];
// }
// else
// {
// throw new ConfigurationException(
// string.Format("Error while configuring the SqlMap. There is no provider marked default in 'providers.config' file."));
// }
// }
// }
// ///
// /// Load sqlMap statement.
// ///
// private void ConfigureSqlMap( )
// {
// XmlNode sqlMapNode = _configScope.NodeContext;
// _configScope.ErrorContext.Activity = "loading SqlMap";
// _configScope.ErrorContext.Resource = sqlMapNode.OuterXml.ToString();
// if (_configScope.UseConfigFileWatcher)
// {
// if (sqlMapNode.Attributes["uri"] != null)
// {
// string uri = sqlMapNode.Attributes["uri"].Value;
// uri = NodeUtils.ParsePropertyTokens(uri, _configScope.Properties);
// IResource resource = ResourceLoaderRegistry.GetResource(uri);
// ConfigWatcherHandler.AddFileToWatch(resource.FileInfo);
// }
// }
// // Load the file
// _configScope.SqlMapDocument = Resources.GetAsXmlDocument(sqlMapNode, _configScope.Properties);
// if (_configScope.ValidateSqlMap)
// {
// ValidateSchema( _configScope.SqlMapDocument.ChildNodes[1], "SqlMap.xsd" );
// }
// _configScope.SqlMapNamespace = _configScope.SqlMapDocument.SelectSingleNode( ApplyMappingNamespacePrefix(XML_MAPPING_ROOT), _configScope.XmlNamespaceManager ).Attributes["namespace"].Value;
// #region Load TypeAlias
// foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes( ApplyMappingNamespacePrefix(XML_TYPEALIAS), _configScope.XmlNamespaceManager))
// {
// TypeAliasDeSerializer.Deserialize(xmlNode, _configScope);
// }
// _configScope.ErrorContext.MoreInfo = string.Empty;
// _configScope.ErrorContext.ObjectId = string.Empty;
// #endregion
// #region Load resultMap
// foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes( ApplyMappingNamespacePrefix(XML_RESULTMAP), _configScope.XmlNamespaceManager))
// {
// _configScope.ErrorContext.MoreInfo = "loading ResultMap tag";
// _configScope.NodeContext = xmlNode; // A ResultMap node
// BuildResultMap();
// }
// #endregion
// #region Load parameterMaps
// foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes( ApplyMappingNamespacePrefix(XML_PARAMETERMAP), _configScope.XmlNamespaceManager))
// {
// _configScope.ErrorContext.MoreInfo = "loading ParameterMap tag";
// _configScope.NodeContext = xmlNode; // A ParameterMap node
// BuildParameterMap();
// }
// #endregion
// #region Load statements
// #region Sql tag
// foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(SQL_STATEMENT), _configScope.XmlNamespaceManager))
// {
// _configScope.ErrorContext.MoreInfo = "loading sql tag";
// _configScope.NodeContext = xmlNode; // A sql tag
// SqlDeSerializer.Deserialize(xmlNode, _configScope);
// }
// #endregion
// #region Statement tag
// Statement statement;
// foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes( ApplyMappingNamespacePrefix(XML_STATEMENT), _configScope.XmlNamespaceManager))
// {
// _configScope.ErrorContext.MoreInfo = "loading statement tag";
// _configScope.NodeContext = xmlNode; // A statement tag
// statement = StatementDeSerializer.Deserialize(xmlNode, _configScope);
// statement.CacheModelName = _configScope.ApplyNamespace(statement.CacheModelName);
// statement.ParameterMapName = _configScope.ApplyNamespace(statement.ParameterMapName);
// //statement.ResultMapName = ApplyNamespace( statement.ResultMapName );
// if (_configScope.UseStatementNamespaces)
// {
// statement.Id = _configScope.ApplyNamespace(statement.Id);
// }
// _configScope.ErrorContext.ObjectId = statement.Id;
// statement.Initialize( _configScope );
// // Build ISql (analyse sql statement)
// ProcessSqlStatement( statement );
// // Build MappedStatement
// MappedStatement mappedStatement = new MappedStatement(_configScope.SqlMapper, statement);
// IMappedStatement mapStatement = mappedStatement;
// if (statement.CacheModelName != null && statement.CacheModelName.Length > 0 && _configScope.IsCacheModelsEnabled)
// {
// mapStatement = new CachingStatement(mappedStatement);
// }
// _configScope.SqlMapper.AddMappedStatement(mapStatement.Id, mapStatement);
// }
// #endregion
// #region Select tag
// Select select;
// foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes( ApplyMappingNamespacePrefix(XML_SELECT), _configScope.XmlNamespaceManager))
// {
// _configScope.ErrorContext.MoreInfo = "loading select tag";
// _configScope.NodeContext = xmlNode; // A select node
// select = SelectDeSerializer.Deserialize(xmlNode, _configScope);
// select.CacheModelName = _configScope.ApplyNamespace(select.CacheModelName);
// select.ParameterMapName = _configScope.ApplyNamespace(select.ParameterMapName);
// //select.ResultMapName = ApplyNamespace( select.ResultMapName );
// if (_configScope.UseStatementNamespaces)
// {
// select.Id = _configScope.ApplyNamespace(select.Id);
// }
// _configScope.ErrorContext.ObjectId = select.Id;
// select.Initialize( _configScope );
// if (select.Generate != null)
// {
// GenerateCommandText(_configScope, select);
// }
// else
// {
// // Build ISql (analyse sql statement)
// ProcessSqlStatement( select);
// }
// // Build MappedStatement
// MappedStatement mappedStatement = new SelectMappedStatement(_configScope.SqlMapper, select);
// IMappedStatement mapStatement = mappedStatement;
// if (select.CacheModelName != null && select.CacheModelName.Length> 0 && _configScope.IsCacheModelsEnabled)
// {
// mapStatement = new CachingStatement(mappedStatement);
// }
// _configScope.SqlMapper.AddMappedStatement(mapStatement.Id, mapStatement);
// }
// #endregion
// #region Insert tag
// Insert insert;
// foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes( ApplyMappingNamespacePrefix(XML_INSERT), _configScope.XmlNamespaceManager))
// {
// _configScope.ErrorContext.MoreInfo = "loading insert tag";
// _configScope.NodeContext = xmlNode; // A insert tag
// MappedStatement mappedStatement;
// insert = InsertDeSerializer.Deserialize(xmlNode, _configScope);
// insert.CacheModelName = _configScope.ApplyNamespace(insert.CacheModelName);
// insert.ParameterMapName = _configScope.ApplyNamespace(insert.ParameterMapName);
// //insert.ResultMapName = ApplyNamespace( insert.ResultMapName );
// if (_configScope.UseStatementNamespaces)
// {
// insert.Id = _configScope.ApplyNamespace(insert.Id);
// }
// _configScope.ErrorContext.ObjectId = insert.Id;
// insert.Initialize( _configScope );
// // Build ISql (analyse sql command text)
// if (insert.Generate != null)
// {
// GenerateCommandText(_configScope, insert);
// }
// else
// {
// ProcessSqlStatement( insert);
// }
// // Build MappedStatement
// mappedStatement = new InsertMappedStatement( _configScope.SqlMapper, insert);
// _configScope.SqlMapper.AddMappedStatement(mappedStatement.Id, mappedStatement);
// #region statement SelectKey
// // Set sql statement SelectKey
// if (insert.SelectKey != null)
// {
// _configScope.ErrorContext.MoreInfo = "loading selectKey tag";
// _configScope.NodeContext = xmlNode.SelectSingleNode( ApplyMappingNamespacePrefix(XML_SELECTKEY), _configScope.XmlNamespaceManager);
// insert.SelectKey.Id = insert.Id;
// insert.SelectKey.Initialize( _configScope );
// insert.SelectKey.Id += DOT + "SelectKey";
// // Initialize can also use _configScope.ErrorContext.ObjectId to get the id
// // of the parent