|
From: <fab...@us...> - 2011-04-13 19:03:54
|
Revision: 5692
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5692&view=rev
Author: fabiomaulo
Date: 2011-04-13 19:03:48 +0000 (Wed, 13 Apr 2011)
Log Message:
-----------
ConventionModelMapper safe Poid
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyToField.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/SafePoidTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs 2011-04-13 18:16:39 UTC (rev 5691)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs 2011-04-13 19:03:48 UTC (rev 5692)
@@ -15,8 +15,45 @@
protected virtual void AppendDefaultEvents()
{
+ BeforeMapClass += NoPoidGuid;
+ BeforeMapClass += NoSetterPoidToField;
}
+ protected virtual void NoSetterPoidToField(IModelInspector modelInspector, System.Type type, IClassAttributesMapper classCustomizer)
+ {
+ MemberInfo poidPropertyOrField = MembersProvider.GetEntityMembersForPoid(type).FirstOrDefault(modelInspector.IsPersistentId);
+ if(MatchNoSetterProperty(poidPropertyOrField))
+ {
+ classCustomizer.Id(idm=> idm.Access(Accessor.NoSetter));
+ }
+ }
+
+ public bool MatchNoSetterProperty(MemberInfo subject)
+ {
+ var property = subject as PropertyInfo;
+ if (property == null || property.CanWrite || !property.CanRead)
+ {
+ return false;
+ }
+ var fieldInfo = PropertyToField.GetBackFieldInfo(property);
+ if (fieldInfo != null)
+ {
+ return fieldInfo.FieldType == property.PropertyType;
+ }
+
+ return false;
+ }
+
+ protected virtual void NoPoidGuid(IModelInspector modelInspector, System.Type type, IClassAttributesMapper classCustomizer)
+ {
+ MemberInfo poidPropertyOrField = MembersProvider.GetEntityMembersForPoid(type).FirstOrDefault(mi => modelInspector.IsPersistentId(mi));
+ if (!ReferenceEquals(null, poidPropertyOrField))
+ {
+ return;
+ }
+ classCustomizer.Id(null, idm=> idm.Generator(Generators.Guid));
+ }
+
protected SimpleModelInspector SimpleModelInspector
{
get { return (SimpleModelInspector) base.ModelInspector; }
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-13 18:16:39 UTC (rev 5691)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-13 19:03:48 UTC (rev 5692)
@@ -496,6 +496,11 @@
get { return modelInspector; }
}
+ protected ICandidatePersistentMembersProvider MembersProvider
+ {
+ get { return membersProvider; }
+ }
+
public void Class<TRootEntity>(Action<IClassMapper<TRootEntity>> customizeAction) where TRootEntity : class
{
var customizer = new ClassCustomizer<TRootEntity>(explicitDeclarationsHolder, customizerHolder);
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyToField.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyToField.cs 2011-04-13 18:16:39 UTC (rev 5691)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyToField.cs 2011-04-13 19:03:48 UTC (rev 5692)
@@ -1,4 +1,6 @@
using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
using NHibernate.Properties;
namespace NHibernate.Mapping.ByCode
@@ -28,5 +30,14 @@
return FieldNamningStrategies;
}
}
+
+ public static FieldInfo GetBackFieldInfo(PropertyInfo subject)
+ {
+ const BindingFlags defaultBinding = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly;
+ return (from s in FieldNamningStrategies.Values
+ let field = subject.DeclaringType.GetField(s.GetFieldName(subject.Name), defaultBinding)
+ where field != null
+ select field).FirstOrDefault();
+ }
}
}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/SafePoidTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/SafePoidTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/SafePoidTests.cs 2011-04-13 19:03:48 UTC (rev 5692)
@@ -0,0 +1,65 @@
+using NHibernate.Mapping.ByCode;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.ConventionModelMapperTests
+{
+ public class SafePoidTests
+ {
+ private class MyClassWithoutPoid
+ {
+
+ }
+
+ private class MyClass
+ {
+ private int _id;
+ public int Id
+ {
+ get { return _id; }
+ }
+ }
+
+ [Test]
+ public void WhenClassWithoutPoidNorGeeneratorThenApplyGuid()
+ {
+ var mapper = new ConventionModelMapper();
+ mapper.Class<MyClassWithoutPoid>(x => { });
+ var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClassWithoutPoid) });
+
+ var hbmClass = hbmMapping.RootClasses[0];
+ var hbmId = hbmClass.Id;
+ hbmId.Should().Not.Be.Null();
+ hbmId.generator.Should().Not.Be.Null();
+ hbm...@cl...().Be("guid");
+ hbmId.type1.Should().Be("Guid");
+ }
+
+ [Test]
+ public void WhenClassWithoutPoidWithGeneratorThenApplyDefinedGenerator()
+ {
+ var mapper = new ConventionModelMapper();
+ mapper.Class<MyClassWithoutPoid>(x => x.Id(null, idm=> idm.Generator(Generators.Native)));
+ var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClassWithoutPoid) });
+
+ var hbmClass = hbmMapping.RootClasses[0];
+ var hbmId = hbmClass.Id;
+ hbmId.Should().Not.Be.Null();
+ hbmId.generator.Should().Not.Be.Null();
+ hbm...@cl...().Be("native");
+ hbmId.type1.Should().Be(Generators.Native.DefaultReturnType.GetNhTypeName());
+ }
+
+ [Test]
+ public void WhenPoidNoSetterThenApplyNosetter()
+ {
+ var mapper = new ConventionModelMapper();
+ mapper.Class<MyClass>(x => x.Id(mc=> mc.Id));
+ var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) });
+
+ var hbmClass = hbmMapping.RootClasses[0];
+ hbmClass.Id.access.Should().Be("nosetter.camelcase-underscore");
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-13 18:16:39 UTC (rev 5691)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-13 19:03:48 UTC (rev 5692)
@@ -511,6 +511,7 @@
<Compile Include="Linq\ByMethod\SumTests.cs" />
<Compile Include="Logging\Log4NetLoggerTest.cs" />
<Compile Include="Logging\LoggerProviderTest.cs" />
+ <Compile Include="MappingByCode\ConventionModelMapperTests\SafePoidTests.cs" />
<Compile Include="MappingByCode\ExpliticMappingTests\BagOfNestedComponentsWithParentTest.cs" />
<Compile Include="MappingByCode\ExpliticMappingTests\ClassWithComponentsTest.cs" />
<Compile Include="MappingByCode\ExpliticMappingTests\ConformistMappingRegistrationTests\ClassMappingRegistrationTest.cs" />
@@ -2976,7 +2977,6 @@
<EmbeddedResource Include="DynamicEntity\Tuplizer\Customer.hbm.xml" />
</ItemGroup>
<ItemGroup>
- <Folder Include="MappingByCode\ConventionModelMapperTests\" />
<Folder Include="Properties\" />
</ItemGroup>
<ItemGroup>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|