From: <fab...@us...> - 2010-08-02 17:30:42
|
Revision: 5094 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5094&view=rev Author: fabiomaulo Date: 2010-08-02 17:30:36 +0000 (Mon, 02 Aug 2010) Log Message: ----------- Fix NH-2226 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/ConfigurationSchema/CfgXmlHelper.cs trunk/nhibernate/src/NHibernate/Cfg/ConfigurationSchema/HibernateConfiguration.cs trunk/nhibernate/src/NHibernate/Cfg/Environment.cs trunk/nhibernate/src/NHibernate/Cfg/IHibernateConfiguration.cs trunk/nhibernate/src/NHibernate.Test/CfgTest/ConfigurationSchemaFixture.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/CfgTest/CustomBytecodeProviderTest.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/ConfigurationSchema/CfgXmlHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/ConfigurationSchema/CfgXmlHelper.cs 2010-08-02 12:00:24 UTC (rev 5093) +++ trunk/nhibernate/src/NHibernate/Cfg/ConfigurationSchema/CfgXmlHelper.cs 2010-08-02 17:30:36 UTC (rev 5094) @@ -64,34 +64,10 @@ /// <summary>XPath expression for session-factory.listener nodes</summary> public static readonly XPathExpression SessionFactoryListenersExpression; - /// <summary> - /// Convert a string to <see cref="BytecodeProviderType"/>. - /// </summary> - /// <param name="byteCodeProvider">The string that represent <see cref="BytecodeProviderType"/>.</param> - /// <returns> - /// The <paramref name="byteCodeProvider"/> converted to <see cref="BytecodeProviderType"/>. - /// <see cref="BytecodeProviderType.Null"/> for invalid values. - /// </returns> - /// <remarks> - /// See <see cref="BytecodeProviderType"/> for allowed values. - /// </remarks> - public static BytecodeProviderType ByteCodeProviderConvertFrom(string byteCodeProvider) + internal static string ToConfigurationString(this BytecodeProviderType source) { - switch (byteCodeProvider) + switch (source) { - case "codedom": - return BytecodeProviderType.Codedom; - case "lcg": - return BytecodeProviderType.Lcg; - default: - return BytecodeProviderType.Null; - } - } - - internal static string ByteCodeProviderToString(BytecodeProviderType byteCodeProvider) - { - switch (byteCodeProvider) - { case BytecodeProviderType.Codedom: return "codedom"; case BytecodeProviderType.Lcg: Modified: trunk/nhibernate/src/NHibernate/Cfg/ConfigurationSchema/HibernateConfiguration.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/ConfigurationSchema/HibernateConfiguration.cs 2010-08-02 12:00:24 UTC (rev 5093) +++ trunk/nhibernate/src/NHibernate/Cfg/ConfigurationSchema/HibernateConfiguration.cs 2010-08-02 17:30:36 UTC (rev 5094) @@ -96,7 +96,7 @@ if (fromAppConfig) { xpn.MoveToFirstAttribute(); - byteCodeProviderType = CfgXmlHelper.ByteCodeProviderConvertFrom(xpn.Value); + byteCodeProviderType = xpn.Value; } else { @@ -128,12 +128,12 @@ } } - private BytecodeProviderType byteCodeProviderType = BytecodeProviderType.Lcg; + private string byteCodeProviderType = BytecodeProviderType.Lcg.ToConfigurationString(); /// <summary> /// Value for bytecode-provider system property. /// </summary> /// <remarks>Default value <see cref="BytecodeProviderType.Lcg"/>.</remarks> - public BytecodeProviderType ByteCodeProviderType + public string ByteCodeProviderType { get { return byteCodeProviderType; } } Modified: trunk/nhibernate/src/NHibernate/Cfg/Environment.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Environment.cs 2010-08-02 12:00:24 UTC (rev 5093) +++ trunk/nhibernate/src/NHibernate/Cfg/Environment.cs 2010-08-02 17:30:36 UTC (rev 5094) @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Configuration; using System.Reflection; @@ -3,5 +4,4 @@ using log4net; using NHibernate.Bytecode; -using NHibernate.Bytecode.CodeDom; using NHibernate.Cfg.ConfigurationSchema; using NHibernate.Util; @@ -218,7 +218,7 @@ return; } - GlobalProperties[PropertyBytecodeProvider] = CfgXmlHelper.ByteCodeProviderToString(nhConfig.ByteCodeProviderType); + GlobalProperties[PropertyBytecodeProvider] = nhConfig.ByteCodeProviderType; GlobalProperties[PropertyUseReflectionOptimizer] = nhConfig.UseReflectionOptimizer.ToString(); if (nhConfig.SessionFactory != null) { @@ -317,15 +317,43 @@ switch (providerName) { case "codedom": - return new BytecodeProviderImpl(); + return new Bytecode.CodeDom.BytecodeProviderImpl(); case "lcg": return new Bytecode.Lightweight.BytecodeProviderImpl(); case "null": return new NullBytecodeProvider(); default: - log.Warn("unrecognized bytecode provider [" + providerName + "], using null by default"); - return new NullBytecodeProvider(); + log.Info("custom bytecode provider [" + providerName + "]"); + return CreateCustomBytecodeProvider(providerName); } } + + private static IBytecodeProvider CreateCustomBytecodeProvider(string assemblyQualifiedName) + { + try + { + var type = ReflectHelper.ClassForName(assemblyQualifiedName); + try + { + return (IBytecodeProvider)Activator.CreateInstance(type); + } + catch (MissingMethodException ex) + { + throw new HibernateByteCodeException("Public constructor was not found for " + type, ex); + } + catch (InvalidCastException ex) + { + throw new HibernateByteCodeException(type + "Type does not implement " + typeof(IBytecodeProvider), ex); + } + catch (Exception ex) + { + throw new HibernateByteCodeException("Unable to instantiate: " + type, ex); + } + } + catch (Exception e) + { + throw new HibernateByteCodeException("Unable to create the instance of Bytecode provider; check inner exception for detail", e); + } + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Cfg/IHibernateConfiguration.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/IHibernateConfiguration.cs 2010-08-02 12:00:24 UTC (rev 5093) +++ trunk/nhibernate/src/NHibernate/Cfg/IHibernateConfiguration.cs 2010-08-02 17:30:36 UTC (rev 5094) @@ -1,10 +1,8 @@ -using NHibernate.Cfg.ConfigurationSchema; - -namespace NHibernate.Cfg +namespace NHibernate.Cfg { public interface IHibernateConfiguration { - BytecodeProviderType ByteCodeProviderType { get; } + string ByteCodeProviderType { get; } bool UseReflectionOptimizer { get; } ISessionFactoryConfiguration SessionFactory { get; } } Modified: trunk/nhibernate/src/NHibernate.Test/CfgTest/ConfigurationSchemaFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/CfgTest/ConfigurationSchemaFixture.cs 2010-08-02 12:00:24 UTC (rev 5093) +++ trunk/nhibernate/src/NHibernate.Test/CfgTest/ConfigurationSchemaFixture.cs 2010-08-02 17:30:36 UTC (rev 5094) @@ -5,6 +5,7 @@ using NHibernate.Cfg; using NHibernate.Cfg.ConfigurationSchema; using System.Xml; +using SharpTestsEx; namespace NHibernate.Test.CfgTest { @@ -28,7 +29,7 @@ public void FromAppConfigTest() { IHibernateConfiguration hc = ConfigurationManager.GetSection("hibernate-configuration") as IHibernateConfiguration; - Assert.AreEqual(BytecodeProviderType.Lcg, hc.ByteCodeProviderType); + hc.ByteCodeProviderType.Should().Be("lcg"); Assert.IsTrue(hc.UseReflectionOptimizer); Assert.AreEqual("NHibernate.Test", hc.SessionFactory.Name); } Added: trunk/nhibernate/src/NHibernate.Test/CfgTest/CustomBytecodeProviderTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/CfgTest/CustomBytecodeProviderTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/CfgTest/CustomBytecodeProviderTest.cs 2010-08-02 17:30:36 UTC (rev 5094) @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using NHibernate.Bytecode; +using NHibernate.Properties; +using NUnit.Framework; +using SharpTestsEx; +using Environment = NHibernate.Cfg.Environment; + +namespace NHibernate.Test.CfgTest +{ + public class CustomBytecodeProviderTest + { + private class MyByteCodeProvider : AbstractBytecodeProvider + { + public override IReflectionOptimizer GetReflectionOptimizer(System.Type clazz, IGetter[] getters, ISetter[] setters) + { + throw new NotImplementedException(); + } + } + private class InvalidByteCodeProvider + { + } + private class InvalidNoCtorByteCodeProvider : AbstractBytecodeProvider + { + public InvalidNoCtorByteCodeProvider(string pizza) {} + + public override IReflectionOptimizer GetReflectionOptimizer(System.Type clazz, IGetter[] getters, ISetter[] setters) + { + throw new NotImplementedException(); + } + } + + [Test] + public void WhenNoShortCutUsedThenCanBuildBytecodeProvider() + { + var properties = new Dictionary<string, string> { { Environment.PropertyBytecodeProvider, typeof(MyByteCodeProvider).AssemblyQualifiedName } }; + Executing.This(() => Environment.BuildBytecodeProvider(properties)).Should().NotThrow(); + } + + [Test] + public void WhenNoShortCutUsedThenCanBuildInstanceOfConfiguredBytecodeProvider() + { + var properties = new Dictionary<string, string> { { Environment.PropertyBytecodeProvider, typeof(MyByteCodeProvider).AssemblyQualifiedName } }; + Environment.BuildBytecodeProvider(properties).Should().Be.InstanceOf<MyByteCodeProvider>(); + } + + [Test] + public void WhenInvalidThenThrow() + { + var properties = new Dictionary<string, string> { { Environment.PropertyBytecodeProvider, typeof(InvalidByteCodeProvider).AssemblyQualifiedName } }; + Executing.This(() => Environment.BuildBytecodeProvider(properties)).Should().Throw<HibernateByteCodeException>(); + } + + [Test] + public void WhenNoDefaultCtorThenThrow() + { + var properties = new Dictionary<string, string> { { Environment.PropertyBytecodeProvider, typeof(InvalidNoCtorByteCodeProvider).AssemblyQualifiedName } }; + Executing.This(() => Environment.BuildBytecodeProvider(properties)).Should().Throw<HibernateByteCodeException>() + .And.Exception.InnerException.Message.Should().Contain("constructor was not found"); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-08-02 12:00:24 UTC (rev 5093) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-08-02 17:30:36 UTC (rev 5094) @@ -112,6 +112,7 @@ <Compile Include="CfgTest\ConfigurationFixture.cs" /> <Compile Include="CfgTest\ConfigurationSchemaFixture.cs" /> <Compile Include="CfgTest\ConfigurationSerializationTests.cs" /> + <Compile Include="CfgTest\CustomBytecodeProviderTest.cs" /> <Compile Include="CfgTest\DefaultNsAssmFixture.cs" /> <Compile Include="CfgTest\EntityCacheUsageParserFixture.cs" /> <Compile Include="CfgTest\HbmOrderingFixture.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |