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