From: <fab...@us...> - 2011-05-17 21:23:56
|
Revision: 5834 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5834&view=rev Author: fabiomaulo Date: 2011-05-17 21:23:50 +0000 (Tue, 17 May 2011) Log Message: ----------- - Fix NH-2568 - added persister conf. support to mapping-by-code Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICollectionPropertiesMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/BagMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/CollectionPropertiesCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/IdBagMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SetMapper.cs trunk/nhibernate/src/NHibernate/Persister/PersisterFactory.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2568/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2568/UsageOfCustomCollectionPersisterTests.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2011-05-17 20:45:36 UTC (rev 5833) +++ trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2011-05-17 21:23:50 UTC (rev 5834) @@ -531,6 +531,11 @@ } } + public void AddMapping(HbmMapping mappingDocument) + { + AddDeserializedMapping(mappingDocument, "mapping_by_code"); + } + private void OnAfterBindMapping(BindMappingEventArgs bindMappingEventArgs) { var handler = AfterBindMapping; Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICollectionPropertiesMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICollectionPropertiesMapper.cs 2011-05-17 20:45:36 UTC (rev 5833) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICollectionPropertiesMapper.cs 2011-05-17 21:23:50 UTC (rev 5834) @@ -1,6 +1,7 @@ using System; using System.Linq.Expressions; using System.Reflection; +using NHibernate.Persister.Collection; using NHibernate.UserTypes; namespace NHibernate.Mapping.ByCode @@ -27,6 +28,7 @@ void Cache(Action<ICacheMapper> cacheMapping); void Filter(string filterName, Action<IFilterMapper> filterMapping); void Fetch(CollectionFetchMode fetchMode); + void Persister(System.Type persister); } public interface ICollectionPropertiesMapper<TEntity, TElement> : IEntityPropertyMapper, ICollectionSqlsMapper where TEntity : class @@ -50,5 +52,6 @@ void Cache(Action<ICacheMapper> cacheMapping); void Filter(string filterName, Action<IFilterMapper> filterMapping); void Fetch(CollectionFetchMode fetchMode); + void Persister<TPersister>() where TPersister : ICollectionPersister; } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/BagMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/BagMapper.cs 2011-05-17 20:45:36 UTC (rev 5833) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/BagMapper.cs 2011-05-17 21:23:50 UTC (rev 5834) @@ -3,6 +3,7 @@ using System.Linq; using System.Reflection; using NHibernate.Cfg.MappingSchema; +using NHibernate.Persister.Collection; using NHibernate.UserTypes; namespace NHibernate.Mapping.ByCode.Impl @@ -188,6 +189,19 @@ mapping.fetchSpecified = mapping.fetch != HbmCollectionFetchMode.Select; } + public void Persister(System.Type persister) + { + if (persister == null) + { + throw new ArgumentNullException("persister"); + } + if (!typeof(ICollectionPersister).IsAssignableFrom(persister)) + { + throw new ArgumentOutOfRangeException("persister", "Expected type implementing ICollectionPersister."); + } + mapping.persister = persister.AssemblyQualifiedName; + } + #endregion #region Implementation of IEntityPropertyMapper Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/CollectionPropertiesCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/CollectionPropertiesCustomizer.cs 2011-05-17 20:45:36 UTC (rev 5833) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/CollectionPropertiesCustomizer.cs 2011-05-17 21:23:50 UTC (rev 5834) @@ -1,6 +1,7 @@ using System; using System.Linq.Expressions; using System.Reflection; +using NHibernate.Persister.Collection; using NHibernate.UserTypes; namespace NHibernate.Mapping.ByCode.Impl.CustomizersImpl @@ -118,6 +119,11 @@ CustomizersHolder.AddCustomizer(PropertyPath, (ICollectionPropertiesMapper x) => x.Fetch(fetchMode)); } + public void Persister<TPersister>() where TPersister : ICollectionPersister + { + CustomizersHolder.AddCustomizer(PropertyPath, (ICollectionPropertiesMapper x) => x.Persister(typeof(TPersister))); + } + #endregion #region ICollectionPropertiesMapper<TEntity,TElement> Members Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/IdBagMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/IdBagMapper.cs 2011-05-17 20:45:36 UTC (rev 5833) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/IdBagMapper.cs 2011-05-17 21:23:50 UTC (rev 5834) @@ -3,6 +3,7 @@ using System.Linq; using System.Reflection; using NHibernate.Cfg.MappingSchema; +using NHibernate.Persister.Collection; using NHibernate.UserTypes; namespace NHibernate.Mapping.ByCode.Impl @@ -194,6 +195,19 @@ mapping.fetchSpecified = mapping.fetch != HbmCollectionFetchMode.Select; } + public void Persister(System.Type persister) + { + if (persister == null) + { + throw new ArgumentNullException("persister"); + } + if (!typeof(ICollectionPersister).IsAssignableFrom(persister)) + { + throw new ArgumentOutOfRangeException("persister", "Expected type implementing ICollectionPersister."); + } + mapping.persister = persister.AssemblyQualifiedName; + } + public void Id(Action<ICollectionIdMapper> idMapping) { idMapping(idMapper); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListMapper.cs 2011-05-17 20:45:36 UTC (rev 5833) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListMapper.cs 2011-05-17 21:23:50 UTC (rev 5834) @@ -3,6 +3,7 @@ using System.Linq; using System.Reflection; using NHibernate.Cfg.MappingSchema; +using NHibernate.Persister.Collection; using NHibernate.UserTypes; namespace NHibernate.Mapping.ByCode.Impl @@ -192,6 +193,19 @@ mapping.fetchSpecified = mapping.fetch != HbmCollectionFetchMode.Select; } + public void Persister(System.Type persister) + { + if (persister == null) + { + throw new ArgumentNullException("persister"); + } + if (!typeof(ICollectionPersister).IsAssignableFrom(persister)) + { + throw new ArgumentOutOfRangeException("persister", "Expected type implementing ICollectionPersister."); + } + mapping.persister = persister.AssemblyQualifiedName; + } + public void Index(Action<IListIndexMapper> listIndexMapping) { listIndexMapping(listIndexMapper); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapMapper.cs 2011-05-17 20:45:36 UTC (rev 5833) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapMapper.cs 2011-05-17 21:23:50 UTC (rev 5834) @@ -3,6 +3,7 @@ using System.Linq; using System.Reflection; using NHibernate.Cfg.MappingSchema; +using NHibernate.Persister.Collection; using NHibernate.UserTypes; namespace NHibernate.Mapping.ByCode.Impl @@ -209,6 +210,19 @@ mapping.fetchSpecified = mapping.fetch != HbmCollectionFetchMode.Select; } + public void Persister(System.Type persister) + { + if (persister == null) + { + throw new ArgumentNullException("persister"); + } + if (!typeof(ICollectionPersister).IsAssignableFrom(persister)) + { + throw new ArgumentOutOfRangeException("persister", "Expected type implementing ICollectionPersister."); + } + mapping.persister = persister.AssemblyQualifiedName; + } + #endregion #region Implementation of IEntityPropertyMapper Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SetMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SetMapper.cs 2011-05-17 20:45:36 UTC (rev 5833) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SetMapper.cs 2011-05-17 21:23:50 UTC (rev 5834) @@ -3,6 +3,7 @@ using System.Linq; using System.Reflection; using NHibernate.Cfg.MappingSchema; +using NHibernate.Persister.Collection; using NHibernate.UserTypes; namespace NHibernate.Mapping.ByCode.Impl @@ -194,6 +195,19 @@ mapping.fetchSpecified = mapping.fetch != HbmCollectionFetchMode.Select; } + public void Persister(System.Type persister) + { + if (persister == null) + { + throw new ArgumentNullException("persister"); + } + if (!typeof(ICollectionPersister).IsAssignableFrom(persister)) + { + throw new ArgumentOutOfRangeException("persister", "Expected type implementing ICollectionPersister."); + } + mapping.persister = persister.AssemblyQualifiedName; + } + #endregion #region Implementation of IEntityPropertyMapper Modified: trunk/nhibernate/src/NHibernate/Persister/PersisterFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/PersisterFactory.cs 2011-05-17 20:45:36 UTC (rev 5833) +++ trunk/nhibernate/src/NHibernate/Persister/PersisterFactory.cs 2011-05-17 21:23:50 UTC (rev 5834) @@ -1,5 +1,6 @@ using System; using System.Reflection; +using System.Text; using NHibernate.Cache; using NHibernate.Cfg; using NHibernate.Engine; @@ -38,6 +39,14 @@ typeof(ISessionFactoryImplementor) }; + private static readonly System.Type[] CollectionPersisterConstructor2Args = new System.Type[] + { + typeof(Mapping.Collection), + typeof(ICacheConcurrencyStrategy), + typeof(Configuration), + typeof(ISessionFactoryImplementor) + }; + /// <summary> /// Creates a built in Entity Persister or a custom Persister. /// </summary> @@ -78,7 +87,7 @@ } else { - return Create(persisterClass, model, cache, factory); + return Create(persisterClass, model, cache, factory, cfg); } } @@ -122,21 +131,41 @@ } public static ICollectionPersister Create(System.Type persisterClass, Mapping.Collection model, - ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory) + ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory, Configuration cfg) { ConstructorInfo pc; + var use4Parameters = false; try { pc = persisterClass.GetConstructor(CollectionPersisterConstructorArgs); + if (pc == null) + { + use4Parameters = true; + pc = persisterClass.GetConstructor(CollectionPersisterConstructor2Args); + } } catch (Exception e) { throw new MappingException("Could not get constructor for " + persisterClass.Name, e); } - + if(pc == null) + { + var messageBuilder = new StringBuilder(); + messageBuilder.AppendLine("Could not find a public constructor for " + persisterClass.Name +";"); + messageBuilder.AppendLine("- The ctor may have " + CollectionPersisterConstructorArgs.Length + " parameters of types (in order):"); + System.Array.ForEach(CollectionPersisterConstructorArgs, t=> messageBuilder.AppendLine(t.FullName)); + messageBuilder.AppendLine(); + messageBuilder.AppendLine("- The ctor may have " + CollectionPersisterConstructor2Args.Length + " parameters of types (in order):"); + System.Array.ForEach(CollectionPersisterConstructor2Args, t => messageBuilder.AppendLine(t.FullName)); + throw new MappingException(messageBuilder.ToString()); + } try { - return (ICollectionPersister) pc.Invoke(new object[] {model, cache, factory}); + if (!use4Parameters) + { + return (ICollectionPersister) pc.Invoke(new object[] {model, cache, factory}); + } + return (ICollectionPersister)pc.Invoke(new object[] { model, cache, cfg, factory }); } catch (TargetInvocationException tie) { Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2568/UsageOfCustomCollectionPersisterTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2568/UsageOfCustomCollectionPersisterTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2568/UsageOfCustomCollectionPersisterTests.cs 2011-05-17 21:23:50 UTC (rev 5834) @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using NHibernate.Cache; +using NHibernate.Cfg; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Engine; +using NHibernate.Mapping.ByCode; +using NHibernate.Persister.Collection; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2568 +{ + public class MyEntity + { + public virtual int Id { get; set; } + public virtual ICollection<MyRelated> Relateds { get; set; } + } + public class MyRelated + { + public virtual int Id { get; set; } + } + + public class UsageOfCustomCollectionPersisterTests + { + private HbmMapping GetMappings() + { + var mapper = new ModelMapper(); + mapper.Class<MyRelated>(rm=> rm.Id(x=> x.Id)); + mapper.Class<MyEntity>(rm => + { + rm.Id(x => x.Id); + rm.Bag(x => x.Relateds, am => am.Persister<MyCollectionPersister>(), rel=> rel.OneToMany()); + }); + var mappings = mapper.CompileMappingForAllExplicitAddedEntities(); + return mappings; + } + + [Test] + public void BuildingSessionFactoryShouldNotThrows() + { + Configuration cfg = TestConfigurationHelper.GetDefaultConfiguration(); + cfg.AddMapping(GetMappings()); + cfg.Executing(c=>c.BuildSessionFactory()).NotThrows(); + } + } + + public class MyCollectionPersister: OneToManyPersister + { + public MyCollectionPersister(Mapping.Collection collection, ICacheConcurrencyStrategy cache, Configuration cfg, ISessionFactoryImplementor factory) : base(collection, cache, cfg, factory) {} + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-17 20:45:36 UTC (rev 5833) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-17 21:23:50 UTC (rev 5834) @@ -804,6 +804,7 @@ <Compile Include="NHSpecificTest\NH2554\Model.cs" /> <Compile Include="NHSpecificTest\NH2565\Domain.cs" /> <Compile Include="NHSpecificTest\NH2565\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2568\UsageOfCustomCollectionPersisterTests.cs" /> <Compile Include="NHSpecificTest\NH2569\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2580\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2583\AbstractMassTestingFixture.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |