#region Apache Notice
/*****************************************************************************
* $Header: $
* $Revision: 576082 $
* $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.Configuration;
using System.Xml;
using Apache.Ibatis.Common;
using Apache.Ibatis.Common.Data;
using CommonExceptions = Apache.Ibatis.Common.Exceptions;
using Apache.Ibatis.Common.Utilities;
using Apache.Ibatis.Common.Utilities.Objects;
using Apache.Ibatis.Common.Utilities.Objects.Members;
using Apache.Ibatis.DataMapper.Configuration;
using Apache.Ibatis.DataMapper.DataExchange;
using Apache.Ibatis.DataMapper.TypeHandlers;
#endregion
namespace Apache.Ibatis.DataMapper.Scope
{
///
/// The ConfigurationScope maintains the state of the build process.
///
public class ConfigurationScope : IScope
{
///
/// Empty parameter map
///
public const string EMPTY_PARAMETER_MAP = "iBATIS.Empty.ParameterMap";
#region Fields
private ErrorContext _errorContext = null;
private HybridDictionary _providers = new HybridDictionary();
private HybridDictionary _sqlIncludes = new HybridDictionary();
private NameValueCollection _properties = new NameValueCollection();
private XmlDocument _sqlMapConfigDocument = null;
private XmlDocument _sqlMapDocument = null;
private XmlNode _nodeContext = null;
private bool _useConfigFileWatcher = false;
private bool _useStatementNamespaces = false;
private bool _isCacheModelsEnabled = false;
private bool _useReflectionOptimizer = true;
private bool _validateSqlMap = false;
private bool _isCallFromDao = false;
private IDataMapper dataMapper = null;
private string _sqlMapNamespace = null;
private IDataSource _dataSource = null;
private bool _isXmlValid = true;
private XmlNamespaceManager _nsmgr = null;
private HybridDictionary _cacheModelFlushOnExecuteStatements = new HybridDictionary();
#endregion
#region Constructors
///
/// Default constructor
///
public ConfigurationScope()
{
_errorContext = new ErrorContext();
_providers.Clear();
}
#endregion
#region Properties
///
/// The list of sql fragment
///
public HybridDictionary SqlIncludes
{
get { return _sqlIncludes; }
}
///
/// XmlNamespaceManager
///
public XmlNamespaceManager XmlNamespaceManager
{
set { _nsmgr = value; }
get { return _nsmgr; }
}
///
/// Set if the parser should validate the sqlMap documents
///
public bool ValidateSqlMap
{
set { _validateSqlMap = value; }
get { return _validateSqlMap; }
}
///
/// Tells us if the xml configuration file validate the schema
///
public bool IsXmlValid
{
set { _isXmlValid = value; }
get { return _isXmlValid; }
}
///
/// The current SqlMap namespace.
///
public string SqlMapNamespace
{
set { _sqlMapNamespace = value; }
get { return _sqlMapNamespace; }
}
///
/// Gets or sets the data mapper.
///
/// The data mapper.
public IDataMapper DataMapper
{
set { dataMapper = value; }
get { return dataMapper; }
}
///
/// A factory for DataExchange objects
///
public DataExchangeFactory DataExchangeFactory
{
get { return dataMapper.DataExchangeFactory; }
}
///
/// Tell us if we are in a DataAccess context.
///
public bool IsCallFromDao
{
set { _isCallFromDao = value; }
get { return _isCallFromDao; }
}
///
/// Tell us if we cache model is enabled.
///
public bool IsCacheModelsEnabled
{
set { _isCacheModelsEnabled = value; }
get { return _isCacheModelsEnabled; }
}
///
/// External data source
///
public IDataSource DataSource
{
set { _dataSource = value; }
get { return _dataSource; }
}
///
/// The current context node we are analizing
///
public XmlNode NodeContext
{
set { _nodeContext = value; }
get { return _nodeContext; }
}
///
/// The XML SqlMap config file
///
public XmlDocument SqlMapConfigDocument
{
set { _sqlMapConfigDocument = value; }
get { return _sqlMapConfigDocument; }
}
///
/// A XML SqlMap file
///
public XmlDocument SqlMapDocument
{
set { _sqlMapDocument = value; }
get { return _sqlMapDocument; }
}
///
/// Tell us if we use Configuration File Watcher
///
public bool UseConfigFileWatcher
{
set { _useConfigFileWatcher = value; }
get { return _useConfigFileWatcher; }
}
///
/// Tell us if we use statements namespaces
///
public bool UseStatementNamespaces
{
set { _useStatementNamespaces = value; }
get { return _useStatementNamespaces; }
}
///
/// Get the request's error context
///
public ErrorContext ErrorContext
{
get { return _errorContext; }
}
///
/// List of providers
///
public HybridDictionary Providers
{
get { return _providers; }
}
///
/// List of global properties
///
public NameValueCollection Properties
{
get { return _properties; }
}
///
/// Indicates if we can use reflection optimizer.
///
public bool UseReflectionOptimizer
{
get { return _useReflectionOptimizer; }
set { _useReflectionOptimizer = value; }
}
///
/// Temporary storage for mapping cache model ids (key is System.String) to statements (value is IList which contains IMappedStatements).
///
public HybridDictionary CacheModelFlushOnExecuteStatements
{
get { return _cacheModelFlushOnExecuteStatements; }
set { _cacheModelFlushOnExecuteStatements = value; }
}
#endregion
///
/// Register under Statement Name or Fully Qualified Statement Name
///
/// An Identity
/// The new Identity
public string ApplyNamespace(string id)
{
string newId = id;
if (_sqlMapNamespace != null && _sqlMapNamespace.Length > 0
&& id != null && id.Length > 0 && id.IndexOf(".") < 0)
{
newId = _sqlMapNamespace + DomSqlMapBuilder.DOT + id;
}
return newId;
}
/////
///// Resolves the type handler.
/////
///// The clazz.
///// Name of the member.
///// Type of the CLR.
///// Type of the db.
///// if set to true [for setter].
/////
//public ITypeHandler ResolveTypeHandler(
// Type clazz,
// string memberName,
// string clrType,
// string dbType,
// bool forSetter)
//{
// ITypeHandler handler = null;
// if (clazz==null)
// {
// handler = this.DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler();
// }
// else if (typeof(IDictionary).IsAssignableFrom(clazz))
// {
// // IDictionary
// if (clrType ==null ||clrType.Length == 0)
// {
// handler = this.DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler();
// }
// else
// {
// try
// {
// Type type = TypeUtils.ResolveType(clrType);
// handler = this.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(type, dbType);
// }
// catch (Exception e)
// {
// throw new CommonExceptions.ConfigurationException("Error. Could not set TypeHandler. Cause: " + e.Message, e);
// }
// }
// }
// else if (this.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(clazz, dbType) != null)
// {
// // Primitive
// handler = this.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(clazz, dbType);
// }
// else
// {
// // .NET object
// if (clrType ==null || clrType.Length == 0)
// {
// Type type = null;
// if (forSetter)
// {
// type = ObjectProbe.GetMemberTypeForSetter(clazz, memberName);
// }
// else
// {
// type = ObjectProbe.GetMemberTypeForGetter(clazz, memberName);
// }
// handler = this.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(type, dbType);
// }
// else
// {
// try
// {
// Type type = TypeUtils.ResolveType(clrType);
// handler = this.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(type, dbType);
// }
// catch (Exception e)
// {
// throw new CommonExceptions.ConfigurationException("Error. Could not set TypeHandler. Cause: " + e.Message, e);
// }
// }
// }
// return handler;
//}
}
}