From: <fab...@us...> - 2011-04-26 22:15:57
|
Revision: 5769 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5769&view=rev Author: fabiomaulo Date: 2011-04-26 22:15:51 +0000 (Tue, 26 Apr 2011) Log Message: ----------- ComponentAsIdMapper Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdMapper.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComponentAsIdTests.cs Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdMapper.cs 2011-04-26 22:15:51 UTC (rev 5769) @@ -0,0 +1,66 @@ +using System; +using System.Linq; +using System.Reflection; +using NHibernate.Cfg.MappingSchema; + +namespace NHibernate.Mapping.ByCode.Impl +{ + public class ComponentAsIdMapper: IComponentAsIdMapper + { + private readonly IAccessorPropertyMapper accessorPropertyMapper; + private readonly HbmCompositeId id; + private readonly HbmMapping mapDoc; + + public ComponentAsIdMapper(System.Type componentType, MemberInfo declaringTypeMember, HbmCompositeId id, HbmMapping mapDoc) + { + this.id = id; + this.mapDoc = mapDoc; + id.@class = componentType.GetShortClassName(mapDoc); + accessorPropertyMapper = new AccessorPropertyMapper(declaringTypeMember.DeclaringType, declaringTypeMember.Name, x => id.access = x); + } + + public HbmCompositeId CompositeId + { + get { return id; } + } + + public void Access(Accessor accessor) + { + accessorPropertyMapper.Access(accessor); + } + + public void Access(System.Type accessorType) + { + accessorPropertyMapper.Access(accessorType); + } + + public void Class(System.Type componentType) + { + id.@class = componentType.GetShortClassName(mapDoc); + } + + public void Property(MemberInfo property, Action<IPropertyMapper> mapping) + { + var hbmProperty = new HbmKeyProperty { name = property.Name }; + mapping(new KeyPropertyMapper(property, hbmProperty)); + AddProperty(hbmProperty); + } + + public void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping) + { + var hbm = new HbmKeyManyToOne { name = property.Name }; + mapping(new KeyManyToOneMapper(property, hbm, mapDoc)); + AddProperty(hbm); + } + + protected void AddProperty(object property) + { + if (property == null) + { + throw new ArgumentNullException("property"); + } + var toAdd = new[] { property }; + id.Items = id.Items == null ? toAdd : id.Items.Concat(toAdd).ToArray(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-26 19:20:39 UTC (rev 5768) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-26 22:15:51 UTC (rev 5769) @@ -297,6 +297,7 @@ <Compile Include="Mapping\ByCode\Conformist\UnionSubclassMapping.cs" /> <Compile Include="Mapping\ByCode\ICompositeIdMapper.cs" /> <Compile Include="Mapping\ByCode\IDynamicComponentAttributesMapper.cs" /> + <Compile Include="Mapping\ByCode\Impl\ComponentAsIdMapper.cs" /> <Compile Include="Mapping\ByCode\Impl\ComposedIdMapper.cs" /> <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\DynamicComponentCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\DynamicComponentMapper.cs" /> Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComponentAsIdTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComponentAsIdTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComponentAsIdTests.cs 2011-04-26 22:15:51 UTC (rev 5769) @@ -0,0 +1,93 @@ +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MappersTests +{ + public class ComponentAsIdTests + { + private class PersonId + { + public string Email { get; set; } + public User User { get; set; } + } + + private class Person + { + public PersonId Id { get; set; } + public string Name { get; set; } + } + + private class User + { + public int Id { get; set; } + } + + [Test] + public void WhenCreatedThenSetTheComponentClass() + { + var mapdoc = new HbmMapping(); + var component = new HbmCompositeId(); + new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x=> x.Id), component, mapdoc); + + component.@class.Should().Contain("PersonId"); + } + + [Test] + public void CanMapProperty() + { + var mapdoc = new HbmMapping(); + var compositeId = new HbmCompositeId(); + var mapper = new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x => x.Id), compositeId, mapdoc); + + mapper.Property(For<PersonId>.Property(ts => ts.Email), x => { }); + + compositeId.Items.Should().Have.Count.EqualTo(1); + compositeId.Items.First().Should().Be.OfType<HbmKeyProperty>(); + compositeId.Items.OfType<HbmKeyProperty>().First().Name.Should().Be.EqualTo("Email"); + } + + [Test] + public void CallPropertyMapper() + { + var mapdoc = new HbmMapping(); + var compositeId = new HbmCompositeId(); + var mapper = new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x => x.Id), compositeId, mapdoc); + var called = false; + + mapper.Property(For<PersonId>.Property(ts => ts.Email), x => called = true); + + called.Should().Be.True(); + } + + [Test] + public void CanMapManyToOne() + { + var mapdoc = new HbmMapping(); + var compositeId = new HbmCompositeId(); + var mapper = new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x => x.Id), compositeId, mapdoc); + + mapper.ManyToOne(For<PersonId>.Property(ts => ts.User), x => { }); + + compositeId.Items.Should().Have.Count.EqualTo(1); + compositeId.Items.First().Should().Be.OfType<HbmKeyManyToOne>(); + compositeId.Items.OfType<HbmKeyManyToOne>().First().Name.Should().Be.EqualTo("User"); + } + + [Test] + public void CallMapManyToOneMapper() + { + var mapdoc = new HbmMapping(); + var compositeId = new HbmCompositeId(); + var mapper = new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x => x.Id), compositeId, mapdoc); + var called = false; + + mapper.ManyToOne(For<PersonId>.Property(ts => ts.User), x => called = true); + + called.Should().Be.True(); + } + + } +} \ 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-26 19:20:39 UTC (rev 5768) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-26 22:15:51 UTC (rev 5769) @@ -551,6 +551,7 @@ <Compile Include="MappingByCode\MappersTests\ClassMapperTests\SetPersisterTests.cs" /> <Compile Include="MappingByCode\MappersTests\ClassMapperTests\TablesSincronizationTests.cs" /> <Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" /> + <Compile Include="MappingByCode\MappersTests\ComponentAsIdTests.cs" /> <Compile Include="MappingByCode\MappersTests\ComposedIdMapperTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\AnyPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\BagPropertyOnDynamicCompoTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |