From: <fab...@us...> - 2011-04-26 19:20:46
|
Revision: 5768 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5768&view=rev Author: fabiomaulo Date: 2011-04-26 19:20:39 +0000 (Tue, 26 Apr 2011) Log Message: ----------- ComposedIdMapper 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/ComposedIdMapper.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs 2011-04-26 19:20:39 UTC (rev 5768) @@ -0,0 +1,52 @@ +using System; +using System.Linq; +using System.Reflection; +using NHibernate.Cfg.MappingSchema; + +namespace NHibernate.Mapping.ByCode.Impl +{ + public class ComposedIdMapper : IComposedIdMapper + { + private readonly HbmCompositeId id; + private readonly HbmMapping mapDoc; + + public ComposedIdMapper(HbmCompositeId id, HbmMapping mapDoc) + { + this.id = id; + this.mapDoc = mapDoc; + } + + public HbmCompositeId ComposedId + { + get { return id; } + } + + #region IComposedIdMapper Members + + 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); + } + + #endregion + + 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 17:36:57 UTC (rev 5767) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-26 19:20:39 UTC (rev 5768) @@ -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\ComposedIdMapper.cs" /> <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\DynamicComponentCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\DynamicComponentMapper.cs" /> <Compile Include="Mapping\ByCode\PropertyToField.cs" /> Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs 2011-04-26 19:20:39 UTC (rev 5768) @@ -0,0 +1,76 @@ +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MappersTests +{ + public class ComposedIdMapperTests + { + private class Person + { + public string Email { get; set; } + public User User { get; set; } + } + + private class User + { + public int Id { get; set; } + } + + [Test] + public void CanMapProperty() + { + var mapdoc = new HbmMapping(); + var compositeId = new HbmCompositeId(); + var mapper = new ComposedIdMapper(compositeId, mapdoc); + + mapper.Property(For<Person>.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 ComposedIdMapper(compositeId, mapdoc); + var called = false; + + mapper.Property(For<Person>.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 ComposedIdMapper(compositeId, mapdoc); + + mapper.ManyToOne(For<Person>.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 ComposedIdMapper(compositeId, mapdoc); + var called = false; + + mapper.ManyToOne(For<Person>.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 17:36:57 UTC (rev 5767) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-26 19:20:39 UTC (rev 5768) @@ -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\ComposedIdMapperTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\AnyPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\BagPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |