|
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.
|