Author: rgrabowski Date: Sat Oct 10 17:53:18 2009 New Revision: 823904 URL: http://svn.apache.org/viewvc?rev=823904&view=rev Log: Allow SqlMapConfig.xml to be expressed in code:
<sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > <providers uri="file://providers.config"/> <database> <provider name="SQLite3"/> <dataSource name="ibatisnet.sqlmap" connectionString="Data Source=ibatisnet.sqlite;Version=3;"/> </database> <alias> <typeAlias alias="Account" type="Apache.Ibatis.DataMapper.Sqlite.Test.Domain.Account, Apache.Ibatis.DataMapper.Sqlite.Test"/> </alias> <sqlMaps> <sqlMap uri="file://../../Maps/Account.xml"/> </sqlMaps> </sqlMapConfig> var codeConfig = new CodeConfigurationInterpreter(engine.ConfigurationStore); codeConfig.AddDatabase(new SqliteDbProvider(), "Data Source=ibatisnet.sqlite;Version=3;"); codeConfig.AddAlias(typeof(Account), "Account"); codeConfig.AddSqlMap("file://../../Maps/Account.xml"); Added: ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Data/ProviderSerializer.cs ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Data/SqlServerDbProvider.cs ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Data/SqliteDbProvider.cs ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper.Sqlite.Test/Fixtures/CodeConfigurationInterpreterTestFixture.cs ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Configuration/Interpreters/Config/Xml/CodeConfigurationInterpreter.cs Modified: ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Apache.Ibatis.Common.csproj ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper.Sqlite.Test/Apache.Ibatis.DataMapper.Sqlite.Test.csproj ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper.Sqlite.Test/Fixtures/BaseTest.cs ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Apache.Ibatis.DataMapper.csproj ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Configuration/ModelBuilder/BuildDataSource.cs ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Configuration/ModelBuilder/LoadSetting.cs Modified: ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Apache.Ibatis.Common.csproj URL: http://svn.apache.org/viewvc/ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Apache.Ibatis.Common.csproj?rev=823904&r1=823903&r2=823904&view=diff ============================================================================== --- ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Apache.Ibatis.Common.csproj (original) +++ ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Apache.Ibatis.Common.csproj Sat Oct 10 17:53:18 2009 @@ -158,6 +158,9 @@ <Compile Include="Data\ProviderDeSerializer.cs"> <SubType>Code</SubType> </Compile> + <Compile Include="Data\ProviderSerializer.cs" /> + <Compile Include="Data\SqliteDbProvider.cs" /> + <Compile Include="Data\SqlServerDbProvider.cs" /> <Compile Include="Exceptions\ConfigurationException.cs"> <SubType>Code</SubType> </Compile> Added: ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Data/ProviderSerializer.cs URL: http://svn.apache.org/viewvc/ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Data/ProviderSerializer.cs?rev=823904&view=auto ============================================================================== --- ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Data/ProviderSerializer.cs (added) +++ ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Data/ProviderSerializer.cs Sat Oct 10 17:53:18 2009 @@ -0,0 +1,63 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 512878 $ + * $LastChangedDate: 2009-06-13 21:53:23 -0400 (Sat, 13 Jun 2009) $ + * $LastChangedBy: rgrabowski $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2008/2005 - The Apache Software Foundation + * + * + * 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 Apache.Ibatis.Common.Configuration; +#endregion + +namespace Apache.Ibatis.Common.Data +{ + public sealed class ProviderSerializer + { + /// <summary> + /// Serializes the specified <see cref="IDbProvider"/> into an <see cred="IConfiguration" /> node. + /// </summary> + public static IConfiguration Serialize(IDbProvider dbProvider) + { + IConfiguration providerConfig = new MutableConfiguration("provider", dbProvider.Id, dbProvider.Id); + providerConfig.Attributes[DataConstants.ATTRIBUTE_NAME] = dbProvider.Id; + providerConfig.Attributes[DataConstants.ATTRIBUTE_ASSEMBLYNAME] = dbProvider.AssemblyName; + providerConfig.Attributes[DataConstants.ATTRIBUTE_COMMANDBUILDERCLASS] = dbProvider.CommandBuilderClass; + providerConfig.Attributes[DataConstants.ATTRIBUTE_COMMANDCLASS] = dbProvider.DbCommandClass; + providerConfig.Attributes[DataConstants.ATTRIBUTE_CONNECTIONCLASS] = dbProvider.DbConnectionClass; + providerConfig.Attributes[DataConstants.ATTRIBUTE_DESCRIPTION] = dbProvider.Description; + providerConfig.Attributes[DataConstants.ATTRIBUTE_DEFAULT] = dbProvider.IsDefault.ToString().ToLower(); + providerConfig.Attributes[DataConstants.ATTRIBUTE_ENABLED] = dbProvider.IsEnabled.ToString().ToLower(); + providerConfig.Attributes[DataConstants.ATTRIBUTE_PARAMETERDBTYPECLASS] = dbProvider.ParameterDbTypeClass; + providerConfig.Attributes[DataConstants.ATTRIBUTE_PARAMETERDBTYPEPROPERTY] = dbProvider.ParameterDbTypeProperty; + providerConfig.Attributes[DataConstants.ATTRIBUTE_PARAMETERPREFIX] = dbProvider.ParameterPrefix; + providerConfig.Attributes[DataConstants.ATTRIBUTE_PARAMETERPREFIX] = dbProvider.ParameterPrefix; + providerConfig.Attributes[DataConstants.ATTRIBUTE_SETDBPARAMETERPRECISION] = dbProvider.SetDbParameterPrecision.ToString().ToLower(); + providerConfig.Attributes[DataConstants.ATTRIBUTE_SETDBPARAMETERSCALE] = dbProvider.SetDbParameterScale.ToString().ToLower(); + providerConfig.Attributes[DataConstants.ATTRIBUTE_SETDBPARAMETERSIZE] = dbProvider.SetDbParameterSize.ToString().ToLower(); + providerConfig.Attributes[DataConstants.ATTRIBUTE_USEDERIVEPARAMETERS] = dbProvider.UseDeriveParameters.ToString().ToLower(); + providerConfig.Attributes[DataConstants.ATTRIBUTE_USEPARAMETERPREFIXINPARAMETER] = dbProvider.UseParameterPrefixInParameter.ToString().ToLower(); + providerConfig.Attributes[DataConstants.ATTRIBUTE_USEPARAMETERPREFIXINSQL] = dbProvider.UseParameterPrefixInSql.ToString().ToLower(); + providerConfig.Attributes[DataConstants.ATTRIBUTE_USEPOSITIONALPARAMETERS] = dbProvider.UsePositionalParameters.ToString().ToLower(); + providerConfig.Attributes[DataConstants.ATTRIBUTE_ALLOWMARS] = dbProvider.AllowMARS.ToString().ToLower(); + return providerConfig; + } + } +} Added: ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Data/SqlServerDbProvider.cs URL: http://svn.apache.org/viewvc/ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Data/SqlServerDbProvider.cs?rev=823904&view=auto ============================================================================== --- ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Data/SqlServerDbProvider.cs (added) +++ ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Data/SqlServerDbProvider.cs Sat Oct 10 17:53:18 2009 @@ -0,0 +1,36 @@ +namespace Apache.Ibatis.Common.Data +{ + /// <summary> + /// System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + /// </summary> + public class SqlServerDbProvider : DbProvider + { + /// <summary> + /// Sets default values for connecting to SQL Server. + /// </summary> + public SqlServerDbProvider() + { + Id = "sqlServer"; + AssemblyName = "System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; + CommandBuilderClass = "System.Data.SqlClient.SqlCommandBuilder"; + DbCommandClass = "System.Data.SqlClient.SqlCommand"; + DbConnectionClass = "System.Data.SqlClient.SqlConnection"; + Description = "Microsoft SQL Server, provider V2.0.0.0 in framework .NET V2.0"; + IsDefault = true; + IsEnabled = true; + ParameterDbTypeClass = "System.Data.SqlDbType"; + ParameterDbTypeProperty = "SqlDbType"; + ParameterPrefix = "@"; + SetDbParameterPrecision = false; + SetDbParameterScale = false; + SetDbParameterSize = false; // ??? + UseDeriveParameters = false; // ??? + UseParameterPrefixInParameter = true; + UseParameterPrefixInSql = true; + UsePositionalParameters = false; + AllowMARS = false; + // parameterClass="System.Data.SqlClient.SqlParameter" + // dataAdapterClass="System.Data.SqlClient.SqlDataAdapter" + } + } +} Added: ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Data/SqliteDbProvider.cs URL: http://svn.apache.org/viewvc/ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Data/SqliteDbProvider.cs?rev=823904&view=auto ============================================================================== --- ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Data/SqliteDbProvider.cs (added) +++ ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.Common/Data/SqliteDbProvider.cs Sat Oct 10 17:53:18 2009 @@ -0,0 +1,35 @@ +namespace Apache.Ibatis.Common.Data +{ + /// <summary> + /// System.Data.SQLite, Version=1.0.61.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139 + /// </summary> + public class SqliteDbProvider : DbProvider + { + /// <summary> + /// Sets default values for connecting to Sqlite. + /// </summary> + public SqliteDbProvider() + { + Id = "SQLite3"; + AssemblyName = "System.Data.SQLite, Version=1.0.61.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139"; + CommandBuilderClass = "System.Data.SQLite.SQLiteCommandBuilder"; + DbCommandClass = "System.Data.SQLite.SQLiteCommand"; + DbConnectionClass = "System.Data.SQLite.SQLiteConnection"; + Description = "System.Data.SQLite, Version=1.0.61.0"; + IsDefault = true; + IsEnabled = true; + ParameterDbTypeClass = "System.Data.SQLite.SQLiteType"; + ParameterDbTypeProperty = "DbType"; + ParameterPrefix = "@"; + SetDbParameterPrecision = false; + SetDbParameterScale = false; + SetDbParameterSize = false; // ??? + UseDeriveParameters = false; // ??? + UseParameterPrefixInParameter = true; + UseParameterPrefixInSql = true; + UsePositionalParameters = false; + AllowMARS = false; + // parameterClass="System.Data.SQLite.SQLiteParameter" + } + } +} Modified: ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper.Sqlite.Test/Apache.Ibatis.DataMapper.Sqlite.Test.csproj URL: http://svn.apache.org/viewvc/ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper.Sqlite.Test/Apache.Ibatis.DataMapper.Sqlite.Test.csproj?rev=823904&r1=823903&r2=823904&view=diff ============================================================================== --- ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper.Sqlite.Test/Apache.Ibatis.DataMapper.Sqlite.Test.csproj (original) +++ ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper.Sqlite.Test/Apache.Ibatis.DataMapper.Sqlite.Test.csproj Sat Oct 10 17:53:18 2009 @@ -55,6 +55,7 @@ <ItemGroup> <Compile Include="Domain\Account.cs" /> <Compile Include="Fixtures\BaseTest.cs" /> + <Compile Include="Fixtures\CodeConfigurationInterpreterTestFixture.cs" /> <Compile Include="Fixtures\PreserveWhitespaceTestFixture.cs" /> <Compile Include="Fixtures\ScriptBase.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> Modified: ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper.Sqlite.Test/Fixtures/BaseTest.cs URL: http://svn.apache.org/viewvc/ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper.Sqlite.Test/Fixtures/BaseTest.cs?rev=823904&r1=823903&r2=823904&view=diff ============================================================================== --- ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper.Sqlite.Test/Fixtures/BaseTest.cs (original) +++ ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper.Sqlite.Test/Fixtures/BaseTest.cs Sat Oct 10 17:53:18 2009 @@ -13,20 +13,20 @@ [TestFixture] public abstract class BaseTest : ScriptBase { - protected static IDataMapper DataMapper; - - protected static ISessionFactory SessionFactory; + protected IDataMapper DataMapper; + protected ISessionFactory SessionFactory; + protected IConfigurationEngine ConfigurationEngine; [TestFixtureSetUp] protected virtual void TestFixtureSetUp() { LogManager.Adapter = new ConsoleOutLoggerFA(new NameValueCollection()); - IConfigurationEngine engine = new DefaultConfigurationEngine(); - engine.RegisterInterpreter(new XmlConfigurationInterpreter("SqlMap.config")); + ConfigurationEngine = new DefaultConfigurationEngine(); + ConfigurationEngine.RegisterInterpreter(new XmlConfigurationInterpreter("SqlMap.config")); - IMapperFactory mapperFactory = engine.BuildMapperFactory(); - SessionFactory = engine.ModelStore.SessionFactory; + IMapperFactory mapperFactory = ConfigurationEngine.BuildMapperFactory(); + SessionFactory = ConfigurationEngine.ModelStore.SessionFactory; DataMapper = ((IDataMapperAccessor)mapperFactory).DataMapper; } Added: ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper.Sqlite.Test/Fixtures/CodeConfigurationInterpreterTestFixture.cs URL: http://svn.apache.org/viewvc/ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper.Sqlite.Test/Fixtures/CodeConfigurationInterpreterTestFixture.cs?rev=823904&view=auto ============================================================================== --- ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper.Sqlite.Test/Fixtures/CodeConfigurationInterpreterTestFixture.cs (added) +++ ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper.Sqlite.Test/Fixtures/CodeConfigurationInterpreterTestFixture.cs Sat Oct 10 17:53:18 2009 @@ -0,0 +1,129 @@ +using System; +using System.Collections; +using Apache.Ibatis.Common.Configuration; +using Apache.Ibatis.Common.Data; +using Apache.Ibatis.DataMapper.Configuration; +using Apache.Ibatis.DataMapper.Configuration.Interpreters.Config.Xml; +using Apache.Ibatis.DataMapper.Sqlite.Test.Domain; +using NUnit.Framework; + +namespace Apache.Ibatis.DataMapper.Sqlite.Test.Fixtures +{ + [TestFixture] + public class CodeConfigurationInterpreterTestFixture : BaseTest + { + [Test] + public void CodeConfigurationMatchesSqlMapConfig() + { + #region SqlMapConfig.xml + /* + <sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > + <settings> + <setting useStatementNamespaces="true"/> + <setting cacheModelsEnabled="false"/> + <setting validateSqlMap="false"/> + <setting useReflectionOptimizer="false"/> + <setting preserveWhitespace="false"/> + </settings> + <providers uri="file://providers.config"/> + <database> + <provider name="SQLite3"/> + <dataSource name="ibatisnet.sqlmap" connectionString="Data Source=ibatisnet.sqlite;Version=3;"/> + </database> + <alias> + <typeAlias alias="Account" type="Apache.Ibatis.DataMapper.Sqlite.Test.Domain.Account, Apache.Ibatis.DataMapper.Sqlite.Test"/> + </alias> + <sqlMaps> + <sqlMap uri="file://../../Maps/Account.xml"/> + </sqlMaps> + </sqlMapConfig> + */ + #endregion + + // slightly awkward to creating ConfigurationSetting, then engine, then interpreter ??? + + ConfigurationSetting settings = new ConfigurationSetting(); + settings.UseStatementNamespaces = true; + settings.IsCacheModelsEnabled = false; + settings.ValidateMapperConfigFile = false; + settings.UseReflectionOptimizer = false; + settings.PreserveWhitespace = false; + + var engine = new DefaultConfigurationEngine(settings); + + CodeConfigurationInterpreter codeConfig = new CodeConfigurationInterpreter(engine.ConfigurationStore); + codeConfig.AddDatabase(new SqliteDbProvider(), "Data Source=ibatisnet.sqlite;Version=3;"); + codeConfig.AddAlias(typeof(Account), "Account"); + codeConfig.AddSqlMap("file://../../Maps/Account.xml", true); + + engine.RegisterInterpreter(codeConfig); + IMapperFactory mapperFactory = engine.BuildMapperFactory(); + IDataMapper localDataMapper = ((IDataMapperAccessor)mapperFactory).DataMapper; + + IConfigurationStore store = engine.ConfigurationStore; + IConfigurationStore baseStore = ConfigurationEngine.ConfigurationStore; + + assertConfiguration(baseStore.Properties, store.Properties); + // assertConfiguration(baseStore.Settings, store.Settings); + assertConfiguration(baseStore.Databases, store.Databases); + assertConfiguration(baseStore.TypeHandlers, store.TypeHandlers); + assertConfiguration(baseStore.Alias, store.Alias); + assertConfiguration(baseStore.CacheModels, store.CacheModels); + assertConfiguration(baseStore.ResultMaps, store.ResultMaps); + assertConfiguration(baseStore.Statements, store.Statements); + assertConfiguration(baseStore.ParameterMaps, store.ParameterMaps); + + InitScript(SessionFactory.DataSource, "../../Scripts/account-init.sql"); + + ICollection items = localDataMapper.QueryForList("Account.GetAllAccounts1", null); + Assert.IsTrue(items.Count > 1); + + items = localDataMapper.QueryForList("Account.GetAllAccounts2", null); + Assert.IsTrue(items.Count > 1); + } + + private static void assertConfiguration(IConfiguration[] x, IConfiguration[] y) + { + CollectionAssert.AreEqual(x, y, ConfigurationComparer.Instance); + } + + class ConfigurationComparer : IComparer + { + public static readonly ConfigurationComparer Instance = new ConfigurationComparer(); + + public int Compare(object x, object y) + { + IConfiguration xConfiguration = (IConfiguration)x; + IConfiguration yConfiguration = (IConfiguration)y; + + bool same = + equal(xConfiguration.Id, yConfiguration.Id) && + equal(xConfiguration.Type, yConfiguration.Type) && + equal(xConfiguration.Value, yConfiguration.Value); + + // mainly care about 0 + return same ? 0 : -1; + } + } + + static bool equal(IComparable x, IComparable y) + { + bool same = false; + + if (x == null && y == null) + { + same = true; + } + else + { + if (x != null && y != null) + { + same = x.CompareTo(y) == 0; + } + } + + return same; + } + } +} Modified: ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Apache.Ibatis.DataMapper.csproj URL: http://svn.apache.org/viewvc/ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Apache.Ibatis.DataMapper.csproj?rev=823904&r1=823903&r2=823904&view=diff ============================================================================== --- ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Apache.Ibatis.DataMapper.csproj (original) +++ ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Apache.Ibatis.DataMapper.csproj Sat Oct 10 17:53:18 2009 @@ -107,6 +107,7 @@ <Compile Include="Configuration\DefaultConfigurationEngine.cs" /> <Compile Include="Configuration\DefaultConfigurationStore.cs" /> <Compile Include="Configuration\DefaultModelBuilder.cs" /> + <Compile Include="Configuration\Interpreters\Config\Xml\CodeConfigurationInterpreter.cs" /> <Compile Include="Configuration\Interpreters\Config\Xml\Processor\Handlers\ProcessDefaultElement.cs" /> <Compile Include="Configuration\Interpreters\Config\Xml\Processor\Handlers\ProcessIncludeElement.cs" /> <Compile Include="Configuration\IConfigurationEngine.cs" /> Added: ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Configuration/Interpreters/Config/Xml/CodeConfigurationInterpreter.cs URL: http://svn.apache.org/viewvc/ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Configuration/Interpreters/Config/Xml/CodeConfigurationInterpreter.cs?rev=823904&view=auto ============================================================================== --- ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Configuration/Interpreters/Config/Xml/CodeConfigurationInterpreter.cs (added) +++ ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Configuration/Interpreters/Config/Xml/CodeConfigurationInterpreter.cs Sat Oct 10 17:53:18 2009 @@ -0,0 +1,163 @@ +using System; +using System.Xml; +using Apache.Ibatis.Common.Configuration; +using Apache.Ibatis.Common.Contracts; +using Apache.Ibatis.Common.Data; +using Apache.Ibatis.Common.Resources; +using Apache.Ibatis.DataMapper.Configuration.Interpreters.Config.Xml.Processor; + +namespace Apache.Ibatis.DataMapper.Configuration.Interpreters.Config.Xml +{ + /// <summary> + /// Allows most of the XML normally contained in SqlMapConfig.xml to be expressed in code. SqlMap items + /// continue to be processed as XML resources. + /// </summary> + /// <remarks> + /// Custom properties should be added to an instance of ConfigurationSettings passed into the engine. + /// </remarks> + /// <example> + /// <code> + /// + /// <sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > + /// <providers uri="file://providers.config"/> + /// <database> + /// <provider name="SQLite3"/> + /// <dataSource name="ibatisnet.sqlmap" connectionString="Data Source=ibatisnet.sqlite;Version=3;"/> + /// </database> + /// <alias> + /// <typeAlias alias="Account" type="Apache.Ibatis.DataMapper.Sqlite.Test.Domain.Account, Apache.Ibatis.DataMapper.Sqlite.Test"/> + /// </alias> + /// <sqlMaps> + /// <sqlMap uri="file://../../Maps/Account.xml"/> + /// </sqlMaps> + /// </sqlMapConfig> + /// + /// var codeConfig = new CodeConfigurationInterpreter(engine.ConfigurationStore); + /// codeConfig.AddDatabase(new SqliteDbProvider(), "Data Source=ibatisnet.sqlite;Version=3;"); + /// codeConfig.AddAlias(typeof(Account), "Account"); + /// codeConfig.AddSqlMap("file://../../Maps/Account.xml"); + /// </code> + /// </example> + public class CodeConfigurationInterpreter : IConfigurationInterpreter + { + private IConfigurationStore configurationStore; + + /// <summary> + /// Allows adding items to the IConfigurationStore before ProcessResource is called. + /// </summary> + public CodeConfigurationInterpreter(IConfigurationStore store) + { + Contract.Require.That(store, Is.Not.Null).When("retrieve argument configurationStore in CodeConfigurationInterpreter constructor"); + + configurationStore = store; + } + + /// <summary> + /// Should obtain the contents from the resource, + /// interpret it and populate the <see cref="IConfigurationStore"/> + /// accordingly. + /// </summary> + /// <param name="store">The store.</param> + public void ProcessResource(IConfigurationStore store) + { + configurationStore = store; + } + + /// <summary> + /// Adds a Type alias to the store. + /// </summary> + /// <remarks> + /// Uses ConfigConstants.ELEMENT_TYPEALIAS as the value for IConfiguration.Type. + /// </remarks> + /// <example> + /// <code> + /// <alias> + /// <typeAlias alias="Account" type="Apache.Ibatis.DataMapper.Sqlite.Test.Domain.Account, Apache.Ibatis.DataMapper.Sqlite.Test"/> + /// </alias> + /// </code> + /// </example> + public void AddAlias(Type type, string name) + { + IConfiguration typeAlias = new MutableConfiguration( + ConfigConstants.ELEMENT_TYPEALIAS, + name, + type.FullName + ", " + type.Assembly.GetName().Name); + + configurationStore.AddAliasConfiguration(typeAlias); + } + + /// <summary> + /// Adds a database configuration item to the store. + /// </summary> + /// <example> + /// <code> + /// <database> + /// <provider name="SQLite3"/> + /// <dataSource name="ibatisnet.sqlmap" connectionString="Data Source=ibatisnet.sqlite;Version=3;"/> + /// </database> + /// </code> + /// </example> + public void AddDatabase(IDbProvider dbProvider, string dataSourceConnectionString) + { + // hack: serialize the object to IConfiguration so it can eventually be converted back to IDbProvider + configurationStore.AddProviderConfiguration(ProviderSerializer.Serialize(dbProvider)); + + MutableConfiguration database = new MutableConfiguration(ConfigConstants.ELEMENT_DATABASE); + + MutableConfiguration provider = database.CreateChild("provider"); + provider.CreateAttribute(ConfigConstants.ATTRIBUTE_NAME, dbProvider.Id); + + MutableConfiguration dataSource = database.CreateChild("dataSource"); + dataSource.CreateAttribute(ConfigConstants.ATTRIBUTE_NAME, "defaultDataSource"); + dataSource.CreateAttribute("connectionString", dataSourceConnectionString); + + configurationStore.AddDatabaseConfiguration(database); + } + + /// <summary> + /// Adds an XML sql map configuration item. + /// </summary> + /// <param name="uri">A URI to XML data.</param> + /// <param name="validate">Validate the XML sqlMap file using SqlMap.xsd</param> + /// <example> + /// <code> + /// <sqlMaps> + /// <sqlMap uri="file://../../Maps/Account.xml"/> + /// </sqlMaps> + /// </code> + /// </example> + public void AddSqlMap(string uri, bool validate) + { + IResource resource = ResourceLoaderRegistry.GetResource(uri); + + using (resource) + { + if (validate) + { + XmlDocument document = new XmlDocument(); + document.Load(resource.Stream); + SchemaValidator.Validate(document.ChildNodes[1], "SqlMap.xsd"); + } + + resource.Stream.Position = 0; + using (XmlTextReader reader = new XmlTextReader(resource.Stream)) + { + using (XmlMappingProcessor processor = new XmlMappingProcessor()) + { + processor.Process(reader, configurationStore); + } + } + } + } + + // TODO: add support for type handlers + + /// <summary> + /// Unused. Always returns null. + /// </summary> + public IResource Resource + { + get { return null; } + } + } +} \ No newline at end of file Modified: ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Configuration/ModelBuilder/BuildDataSource.cs URL: http://svn.apache.org/viewvc/ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Configuration/ModelBuilder/BuildDataSource.cs?rev=823904&r1=823903&r2=823904&view=diff ============================================================================== --- ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Configuration/ModelBuilder/BuildDataSource.cs (original) +++ ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Configuration/ModelBuilder/BuildDataSource.cs Sat Oct 10 17:53:18 2009 @@ -42,7 +42,8 @@ IConfiguration dataBaseConfig = store.Databases[0]; IConfiguration providerConfig = dataBaseConfig.Children.Find(DataConstants.ELEMENT_PROVIDER)[0]; - IDbProvider dbProvider = dbProviderFactory.GetDbProvider(providerConfig.Value); + string key = providerConfig.Value ?? providerConfig.GetAttributeValue(DataConstants.ATTRIBUTE_NAME); + IDbProvider dbProvider = dbProviderFactory.GetDbProvider(key); dataSource = DataSourceDeSerializer.Deserialize(dbProvider, commandTimeOut, dataBaseConfig); } Modified: ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Configuration/ModelBuilder/LoadSetting.cs URL: http://svn.apache.org/viewvc/ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Configuration/ModelBuilder/LoadSetting.cs?rev=823904&r1=823903&r2=823904&view=diff ============================================================================== --- ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Configuration/ModelBuilder/LoadSetting.cs (original) +++ ibatis/cs/ibatisnet-3/trunk/src/Apache.Ibatis.DataMapper/Configuration/ModelBuilder/LoadSetting.cs Sat Oct 10 17:53:18 2009 @@ -59,8 +59,13 @@ } else if (setting.Id == ConfigConstants.ATTRIBUTE_COMMAND_TIMEOUT) { + // not documented well? not a property on ConfigurationSetting ??? commandTimeOut = Convert.ToInt32(setting.Value); } + else if (setting.Id == ConfigConstants.ATTRIBUTE_PRESERVEWHITSPACE) + { + preserveWhitespace = Convert.ToBoolean(setting.Value); + } } } }
