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(); + hbmId.generator.@class.Should().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(); + hbmId.generator.@class.Should().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. |