From: <fab...@us...> - 2011-04-05 23:07:33
|
Revision: 5618 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5618&view=rev Author: fabiomaulo Date: 2011-04-05 23:07:24 +0000 (Tue, 05 Apr 2011) Log Message: ----------- IdBag on the road Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyContainerMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractPropertyContainerMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapperEventsHandlersDefinitions.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/IdBagPropertiesCustomizer.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/IdBagMappingTest.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyContainerMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyContainerMapper.cs 2011-04-05 22:03:58 UTC (rev 5617) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyContainerMapper.cs 2011-04-05 23:07:24 UTC (rev 5618) @@ -19,6 +19,9 @@ void Map(MemberInfo property, Action<IMapPropertiesMapper> collectionMapping, Action<IMapKeyRelation> keyMapping, Action<ICollectionElementRelation> mapping); + + void IdBag(MemberInfo property, Action<IIdBagPropertiesMapper> collectionMapping, + Action<ICollectionElementRelation> mapping); } public interface IPropertyContainerMapper : ICollectionPropertiesContainerMapper, IPlainPropertyContainerMapper {} @@ -45,6 +48,10 @@ void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping); + + void IdBag<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, + Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping, + Action<ICollectionElementRelation<TElement>> mapping); } public interface IPropertyContainerMapper<TEntity> : ICollectionPropertiesContainerMapper<TEntity>, IPlainPropertyContainerMapper<TEntity> where TEntity : class {} Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractPropertyContainerMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractPropertyContainerMapper.cs 2011-04-05 22:03:58 UTC (rev 5617) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractPropertyContainerMapper.cs 2011-04-05 23:07:24 UTC (rev 5618) @@ -61,6 +61,16 @@ AddProperty(hbm); } + public void IdBag(MemberInfo property, Action<IIdBagPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) + { + var hbm = new HbmIdbag { name = property.Name }; + System.Type propertyType = property.GetPropertyOrFieldType(); + System.Type collectionElementType = propertyType.DetermineCollectionElementType(); + collectionMapping(new IdBagMapper(container, collectionElementType, hbm)); + mapping(new CollectionElementRelation(collectionElementType, MapDoc, rel => hbm.Item = rel)); + AddProperty(hbm); + } + #endregion } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-05 22:03:58 UTC (rev 5617) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-05 23:07:24 UTC (rev 5618) @@ -11,6 +11,9 @@ private readonly Dictionary<PropertyPath, List<Action<IBagPropertiesMapper>>> bagCustomizers = new Dictionary<PropertyPath, List<Action<IBagPropertiesMapper>>>(); + private readonly Dictionary<PropertyPath, List<Action<IIdBagPropertiesMapper>>> idBagCustomizers = + new Dictionary<PropertyPath, List<Action<IIdBagPropertiesMapper>>>(); + private readonly Dictionary<PropertyPath, List<Action<ICollectionPropertiesMapper>>> collectionCustomizers = new Dictionary<PropertyPath, List<Action<ICollectionPropertiesMapper>>>(); @@ -140,6 +143,11 @@ AddCustomizer(mapCustomizers, member, propertyCustomizer); } + public void AddCustomizer(PropertyPath member, Action<IIdBagPropertiesMapper> propertyCustomizer) + { + AddCustomizer(idBagCustomizers, member, propertyCustomizer); + } + public void AddCustomizer(PropertyPath member, Action<ICollectionPropertiesMapper> propertyCustomizer) { AddCustomizer(collectionCustomizers, member, propertyCustomizer); @@ -249,6 +257,12 @@ InvokeCustomizers(mapCustomizers, member, mapper); } + public void InvokeCustomizers(PropertyPath member, IIdBagPropertiesMapper mapper) + { + InvokeCustomizers(collectionCustomizers, member, mapper); + InvokeCustomizers(idBagCustomizers, member, mapper); + } + public void InvokeCustomizers(PropertyPath member, IComponentAttributesMapper mapper) { InvokeCustomizers(componentPropertyCustomizers, member, mapper); Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/IdBagPropertiesCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/IdBagPropertiesCustomizer.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/IdBagPropertiesCustomizer.cs 2011-04-05 23:07:24 UTC (rev 5618) @@ -0,0 +1,22 @@ +using System; + +namespace NHibernate.Mapping.ByCode.Impl.CustomizersImpl +{ + public class IdBagPropertiesCustomizer<TEntity, TElement> : CollectionPropertiesCustomizer<TEntity, TElement>, IIdBagPropertiesMapper<TEntity, TElement> where TEntity : class + { + public IdBagPropertiesCustomizer(IModelExplicitDeclarationsHolder explicitDeclarationsHolder, PropertyPath propertyPath, ICustomizersHolder customizersHolder) + : base(explicitDeclarationsHolder, propertyPath, customizersHolder) + { + if (explicitDeclarationsHolder == null) + { + throw new ArgumentNullException("explicitDeclarationsHolder"); + } + explicitDeclarationsHolder.AddAsIdBag(propertyPath.LocalMember); + } + + public void Id(Action<ICollectionIdMapper> idMapping) + { + CustomizersHolder.AddCustomizer(PropertyPath, (IIdBagPropertiesMapper x) => x.Id(idMapping)); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs 2011-04-05 22:03:58 UTC (rev 5617) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs 2011-04-05 23:07:24 UTC (rev 5618) @@ -164,5 +164,12 @@ ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member); base.Any(property, idTypeOfMetaType, mapping); } + + public override void IdBag<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) + { + MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); + ExplicitDeclarationsHolder.AddAsPropertySplit(typeof(TEntity), splitGroupId, member); + base.IdBag(property, collectionMapping, mapping); + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-05 22:03:58 UTC (rev 5617) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-05 23:07:24 UTC (rev 5618) @@ -160,5 +160,18 @@ { Map(property, collectionMapping, keyMapping => { }, mapping); } + + public virtual void IdBag<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, + Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping, + Action<ICollectionElementRelation<TElement>> mapping) + { + MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); + collectionMapping(new IdBagPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, member), CustomizersHolder)); + mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder)); + + MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property); + collectionMapping(new IdBagPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, memberOf), CustomizersHolder)); + mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, memberOf), CustomizersHolder)); + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs 2011-04-05 22:03:58 UTC (rev 5617) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs 2011-04-05 23:07:24 UTC (rev 5618) @@ -20,6 +20,7 @@ void AddCustomizer(PropertyPath member, Action<IBagPropertiesMapper> propertyCustomizer); void AddCustomizer(PropertyPath member, Action<IListPropertiesMapper> propertyCustomizer); void AddCustomizer(PropertyPath member, Action<IMapPropertiesMapper> propertyCustomizer); + void AddCustomizer(PropertyPath member, Action<IIdBagPropertiesMapper> propertyCustomizer); void AddCustomizer(PropertyPath member, Action<ICollectionPropertiesMapper> propertyCustomizer); void AddCustomizer(PropertyPath member, Action<IComponentAttributesMapper> propertyCustomizer); @@ -39,6 +40,7 @@ void InvokeCustomizers(PropertyPath member, IBagPropertiesMapper mapper); void InvokeCustomizers(PropertyPath member, IListPropertiesMapper mapper); void InvokeCustomizers(PropertyPath member, IMapPropertiesMapper mapper); + void InvokeCustomizers(PropertyPath member, IIdBagPropertiesMapper mapper); void InvokeCustomizers(PropertyPath member, IComponentAttributesMapper mapper); #region Collection Element relations invokers Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapperEventsHandlersDefinitions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapperEventsHandlersDefinitions.cs 2011-04-05 22:03:58 UTC (rev 5617) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapperEventsHandlersDefinitions.cs 2011-04-05 23:07:24 UTC (rev 5618) @@ -22,6 +22,8 @@ public delegate void BagMappingHandler(IModelInspector modelInspector, PropertyPath member, IBagPropertiesMapper propertyCustomizer); + public delegate void IdBagMappingHandler(IModelInspector modelInspector, PropertyPath member, IIdBagPropertiesMapper propertyCustomizer); + public delegate void ListMappingHandler(IModelInspector modelInspector, PropertyPath member, IListPropertiesMapper propertyCustomizer); public delegate void MapMappingHandler(IModelInspector modelInspector, PropertyPath member, IMapPropertiesMapper propertyCustomizer); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-05 22:03:58 UTC (rev 5617) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-05 23:07:24 UTC (rev 5618) @@ -82,6 +82,8 @@ public event BagMappingHandler BeforeMapBag; + public event IdBagMappingHandler BeforeMapIdBag; + public event ListMappingHandler BeforeMapList; public event MapMappingHandler BeforeMapMap; @@ -129,6 +131,8 @@ public event BagMappingHandler AfterMapBag; + public event IdBagMappingHandler AfterMapIdBag; + public event ListMappingHandler AfterMapList; public event MapMappingHandler AfterMapMap; @@ -242,6 +246,15 @@ } } + private void InvokeBeforeMapIdBag(PropertyPath member, IIdBagPropertiesMapper propertycustomizer) + { + IdBagMappingHandler handler = BeforeMapIdBag; + if (handler != null) + { + handler(ModelInspector, member, propertycustomizer); + } + } + private void InvokeBeforeMapList(PropertyPath member, IListPropertiesMapper propertycustomizer) { ListMappingHandler handler = BeforeMapList; @@ -404,6 +417,15 @@ } } + private void InvokeAfterMapIdBag(PropertyPath member, IIdBagPropertiesMapper propertycustomizer) + { + IdBagMappingHandler handler = AfterMapIdBag; + if (handler != null) + { + handler(ModelInspector, member, propertycustomizer); + } + } + private void InvokeAfterMapList(PropertyPath member, IListPropertiesMapper propertycustomizer) { ListMappingHandler handler = AfterMapList; @@ -769,6 +791,10 @@ { MapList(member, memberPath, propertyType, propertiesContainer, propertiesContainerType); } + else if (modelInspector.IsIdBag(property)) + { + MapIdBag(member, memberPath, propertyType, propertiesContainer, propertiesContainerType); + } else if (modelInspector.IsBag(property)) { MapBag(member, memberPath, propertyType, propertiesContainer, propertiesContainerType); @@ -888,6 +914,10 @@ { MapList(member, memberPath, propertyType, propertiesContainer, propertiesContainerType); } + else if (modelInspector.IsIdBag(property)) + { + MapIdBag(member, memberPath, propertyType, propertiesContainer, propertiesContainerType); + } else if (modelInspector.IsBag(property)) { MapBag(member, memberPath, propertyType, propertiesContainer, propertiesContainerType); @@ -1075,6 +1105,24 @@ }, cert.Map); } + private void MapIdBag(MemberInfo member, PropertyPath propertyPath, System.Type propertyType, ICollectionPropertiesContainerMapper propertiesContainer, + System.Type propertiesContainerType) + { + System.Type collectionElementType = GetCollectionElementTypeOrThrow(propertiesContainerType, member, propertyType); + ICollectionElementRelationMapper cert = DetermineCollectionElementRelationType(member, propertyPath, collectionElementType); + if(cert is OneToManyRelationMapper) + { + throw new NotSupportedException("id-bag does not suppot one-to-many relation"); + } + propertiesContainer.IdBag(member, collectionPropertiesMapper => + { + InvokeBeforeMapIdBag(propertyPath, collectionPropertiesMapper); + cert.MapCollectionProperties(collectionPropertiesMapper); + ForEachMemberPath(member, propertyPath, pp => customizerHolder.InvokeCustomizers(pp, collectionPropertiesMapper)); + InvokeAfterMapIdBag(propertyPath, collectionPropertiesMapper); + }, cert.Map); + } + private void MapOneToOne(MemberInfo member, PropertyPath propertyPath, IPlainPropertyContainerMapper propertiesContainer) { propertiesContainer.OneToOne(member, oneToOneMapper => Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-05 22:03:58 UTC (rev 5617) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-05 23:07:24 UTC (rev 5618) @@ -348,6 +348,7 @@ <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\CollectionPropertiesCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\ComponentCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\ComponentElementCustomizer.cs" /> + <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\IdBagPropertiesCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\JoinCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\JoinedSubclassCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\JoinedSubclassKeyCustomizer.cs" /> Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/IdBagMappingTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/IdBagMappingTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/IdBagMappingTest.cs 2011-04-05 23:07:24 UTC (rev 5618) @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.ExpliticMappingTests +{ + public class IdBagMappingTest + { + private class Animal + { + public int Id { get; set; } + private ICollection<Animal> children; + public ICollection<Animal> Children + { + get { return children; } + } + } + + [Test] + public void WhenIdBagWithManyToManyThenMapIt() + { + var mapper = new ModelMapper(); + mapper.Class<Animal>(map => + { + map.Id(x => x.Id, idmap => { }); + map.IdBag(x => x.Children, bag => { }, rel=> rel.ManyToMany()); + }); + var hbmMapping = mapper.CompileMappingFor(new[]{ typeof(Animal)}); + var hbmClass = hbmMapping.RootClasses[0]; + var hbmIdbag = hbmClass.Properties.OfType<HbmIdbag>().SingleOrDefault(); + hbmIdbag.Should().Not.Be.Null(); + hbmIdbag.ElementRelationship.Should().Be.InstanceOf<HbmManyToMany>(); + } + + [Test] + public void WhenIdBagWithOneToManyThenThrow() + { + var mapper = new ModelMapper(); + mapper.Class<Animal>(map => + { + map.Id(x => x.Id, idmap => { }); + map.IdBag(x => x.Children, bag => { }, rel => rel.OneToMany()); + }); + mapper.Executing(x=> x.CompileMappingFor(new[] { typeof(Animal) })).Throws<NotSupportedException>(); + } + } +} \ 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-05 22:03:58 UTC (rev 5617) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-05 23:07:24 UTC (rev 5618) @@ -519,6 +519,7 @@ <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\SubclassSequenceRegistrationTests.cs" /> <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\UnionSubclassMappingStrategyTests.cs" /> <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\UnionSubclassSequenceRegistrationTests.cs" /> + <Compile Include="MappingByCode\ExpliticMappingTests\IdBagMappingTest.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\MappingOfPrivateMembersOnRootEntity.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\NaturalIdTests.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\PoidTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |