|
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.
|