From: <fab...@us...> - 2011-04-27 14:36:22
|
Revision: 5774 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5774&view=rev Author: fabiomaulo Date: 2011-04-27 14:36:13 +0000 (Wed, 27 Apr 2011) Log Message: ----------- IModelInspector and IModelExplicitDeclarationsHolder managing composed-id Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-27 13:53:14 UTC (rev 5773) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-27 14:36:13 UTC (rev 5774) @@ -17,6 +17,7 @@ private readonly HashSet<MemberInfo> manyToManyRelations = new HashSet<MemberInfo>(); private readonly HashSet<MemberInfo> manyToOneRelations = new HashSet<MemberInfo>(); private readonly HashSet<MemberInfo> naturalIds = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> composedIds = new HashSet<MemberInfo>(); private readonly HashSet<MemberInfo> oneToManyRelations = new HashSet<MemberInfo>(); private readonly HashSet<MemberInfo> oneToOneRelations = new HashSet<MemberInfo>(); private readonly HashSet<MemberInfo> poids = new HashSet<MemberInfo>(); @@ -92,6 +93,11 @@ get { return poids; } } + public IEnumerable<MemberInfo> ComposedIds + { + get { return composedIds; } + } + public IEnumerable<MemberInfo> VersionProperties { get { return versionProperties; } @@ -330,6 +336,12 @@ poids.Add(member); } + public void AddAsPartOfComposedId(MemberInfo member) + { + persistentMembers.Add(member); + composedIds.Add(member); + } + public void AddAsVersionProperty(MemberInfo member) { persistentMembers.Add(member); @@ -502,6 +514,11 @@ return poids.Contains(member); } + public bool IsMemberOfComposedId(MemberInfo member) + { + return composedIds.Contains(member); + } + public virtual bool IsVersion(MemberInfo member) { return versionProperties.Contains(member); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-27 13:53:14 UTC (rev 5773) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-27 14:36:13 UTC (rev 5774) @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -20,6 +19,7 @@ private readonly IEnumerable<MemberInfo> oneToManyRelations = Enumerable.Empty<MemberInfo>(); private readonly IEnumerable<MemberInfo> oneToOneRelations = Enumerable.Empty<MemberInfo>(); private readonly IEnumerable<MemberInfo> poids = Enumerable.Empty<MemberInfo>(); + private readonly IEnumerable<MemberInfo> composedIds = Enumerable.Empty<MemberInfo>(); private readonly IEnumerable<MemberInfo> properties = Enumerable.Empty<MemberInfo>(); private readonly IEnumerable<MemberInfo> dynamicComponents = Enumerable.Empty<MemberInfo>(); private readonly IEnumerable<MemberInfo> persistentMembers = new HashSet<MemberInfo>(); @@ -94,6 +94,11 @@ get { return poids; } } + public IEnumerable<MemberInfo> ComposedIds + { + get { return composedIds; } + } + public IEnumerable<MemberInfo> VersionProperties { get { return versionProperties; } @@ -192,6 +197,7 @@ public void AddAsAny(MemberInfo member) {} public void AddAsPoid(MemberInfo member) {} + public void AddAsPartOfComposedId(MemberInfo member) {} public void AddAsVersionProperty(MemberInfo member) {} Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs 2011-04-27 13:53:14 UTC (rev 5773) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs 2011-04-27 14:36:13 UTC (rev 5774) @@ -32,6 +32,7 @@ IEnumerable<MemberInfo> Any { get; } IEnumerable<MemberInfo> Poids { get; } + IEnumerable<MemberInfo> ComposedIds { get; } IEnumerable<MemberInfo> VersionProperties { get; } IEnumerable<MemberInfo> NaturalIds { get; } @@ -63,6 +64,7 @@ void AddAsAny(MemberInfo member); void AddAsPoid(MemberInfo member); + void AddAsPartOfComposedId(MemberInfo member); void AddAsVersionProperty(MemberInfo member); void AddAsNaturalId(MemberInfo member); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs 2011-04-27 13:53:14 UTC (rev 5773) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs 2011-04-27 14:36:13 UTC (rev 5774) @@ -21,6 +21,7 @@ bool IsAny(MemberInfo member); bool IsPersistentId(MemberInfo member); + bool IsMemberOfComposedId(MemberInfo member); bool IsVersion(MemberInfo member); bool IsMemberOfNaturalId(MemberInfo member); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs 2011-04-27 13:53:14 UTC (rev 5773) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs 2011-04-27 14:36:13 UTC (rev 5774) @@ -19,6 +19,7 @@ private readonly HashSet<MemberInfo> oneToManyRelations = new HashSet<MemberInfo>(); private readonly HashSet<MemberInfo> oneToOneRelations = new HashSet<MemberInfo>(); private readonly HashSet<MemberInfo> poids = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> composedIds = new HashSet<MemberInfo>(); private readonly HashSet<MemberInfo> properties = new HashSet<MemberInfo>(); private readonly HashSet<MemberInfo> dynamicComponents = new HashSet<MemberInfo>(); private readonly Dictionary<MemberInfo, System.Type> dynamicComponentTemplates = new Dictionary<MemberInfo, System.Type>(); @@ -88,6 +89,11 @@ get { return poids; } } + public IEnumerable<MemberInfo> ComposedIds + { + get { return composedIds; } + } + public IEnumerable<MemberInfo> VersionProperties { get { return versionProperties; } @@ -220,6 +226,11 @@ poids.Add(member); } + public void AddAsPartOfComposedId(MemberInfo member) + { + composedIds.Add(member); + } + public void AddAsVersionProperty(MemberInfo member) { versionProperties.Add(member); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs 2011-04-27 13:53:14 UTC (rev 5773) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs 2011-04-27 14:36:13 UTC (rev 5774) @@ -24,6 +24,7 @@ System.Array.ForEach(source.Any.ToArray(), destination.AddAsAny); System.Array.ForEach(source.Poids.ToArray(), destination.AddAsPoid); + System.Array.ForEach(source.ComposedIds.ToArray(), destination.AddAsPartOfComposedId); System.Array.ForEach(source.VersionProperties.ToArray(), destination.AddAsVersionProperty); System.Array.ForEach(source.NaturalIds.ToArray(), destination.AddAsNaturalId); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-27 13:53:14 UTC (rev 5773) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-27 14:36:13 UTC (rev 5774) @@ -472,6 +472,16 @@ declaredModel.AddAsDynamicComponent(member, componentTemplate); } + IEnumerable<MemberInfo> IModelExplicitDeclarationsHolder.ComposedIds + { + get { return declaredModel.ComposedIds; } + } + + void IModelExplicitDeclarationsHolder.AddAsPartOfComposedId(MemberInfo member) + { + declaredModel.AddAsPartOfComposedId(member); + } + #endregion #region Implementation of IModelInspector @@ -554,6 +564,11 @@ return isPersistentId(member, declaredResult); } + bool IModelInspector.IsMemberOfComposedId(MemberInfo member) + { + return declaredModel.IsPersistentId(member); + } + bool IModelInspector.IsVersion(MemberInfo member) { bool declaredResult = declaredModel.IsVersion(member); Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs 2011-04-27 13:53:14 UTC (rev 5773) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs 2011-04-27 14:36:13 UTC (rev 5774) @@ -271,6 +271,17 @@ destination.GetDynamicComponentTemplate(property).Should().Be(typeof(MyClass)); } + [Test] + public void MergeComposedId() + { + var destination = new ExplicitDeclarationsHolder(); + var source = new ExplicitDeclarationsHolder(); + source.AddAsPartOfComposedId(property); + + destination.Merge(source); + destination.ComposedIds.Should().Have.Count.EqualTo(1); + } + #region Nested type: MyClass private class MyClass This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-27 18:54:54
|
Revision: 5775 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5775&view=rev Author: fabiomaulo Date: 2011-04-27 18:54:47 +0000 (Wed, 27 Apr 2011) Log Message: ----------- The end composed-id Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.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/ComponentAsIdLikeComponetAttributesMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComponentAsIdCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComposedIdCustomizer.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComponentAsIdTests.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComposedIdTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs 2011-04-27 14:36:13 UTC (rev 5774) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs 2011-04-27 18:54:47 UTC (rev 5775) @@ -42,10 +42,10 @@ void Id<TProperty>(Expression<Func<TEntity, TProperty>> idProperty, Action<IIdMapper> idMapper); void Id(FieldInfo idProperty, Action<IIdMapper> idMapper); - //void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty) where TComponent : class; - //void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty, Action<IComponentAsIdMapper<TComponent>> idMapper) where TComponent : class; + void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty) where TComponent : class; + void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty, Action<IComponentAsIdMapper<TComponent>> idMapper) where TComponent : class; - //void ComposedId(Action<IComposedIdMapper<TEntity>> idPropertiesMapping); + void ComposedId(Action<IComposedIdMapper<TEntity>> idPropertiesMapping); void Discriminator(Action<IDiscriminatorMapper> discriminatorMapping); void DiscriminatorValue(object value); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.cs 2011-04-27 14:36:13 UTC (rev 5774) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.cs 2011-04-27 18:54:47 UTC (rev 5775) @@ -23,6 +23,7 @@ void Class<TConcrete>() where TConcrete : TComponent; } - public interface IComponentAsIdMapper<TComponent> : IComponentAsIdAttributesMapper<TComponent>, IMinimalPlainPropertyContainerMapper<TComponent> where TComponent : class { } + public interface IComponentAsIdMapper<TComponent> : IComponentAsIdAttributesMapper<TComponent>, IMinimalPlainPropertyContainerMapper<TComponent> + { } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdLikeComponetAttributesMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdLikeComponetAttributesMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdLikeComponetAttributesMapper.cs 2011-04-27 18:54:47 UTC (rev 5775) @@ -0,0 +1,53 @@ +using System; +using System.Reflection; + +namespace NHibernate.Mapping.ByCode.Impl +{ + public class ComponentAsIdLikeComponetAttributesMapper : IComponentAttributesMapper + { + private readonly IComponentAsIdMapper realMapper; + + public ComponentAsIdLikeComponetAttributesMapper(IComponentAsIdMapper realMapper) + { + if (realMapper == null) + { + throw new ArgumentNullException("realMapper"); + } + this.realMapper = realMapper; + } + + #region IComponentAttributesMapper Members + + public void Access(Accessor accessor) + { + realMapper.Access(accessor); + } + + public void Access(System.Type accessorType) + { + realMapper.Access(accessorType); + } + + public void OptimisticLock(bool takeInConsiderationForOptimisticLock) {} + + public void Parent(MemberInfo parent) + { + // the mapping of the Parent can be used as a ManyToOne but could be strange to have a bidirectional relation in the PK + } + + public void Parent(MemberInfo parent, Action<IComponentParentMapper> parentMapping) {} + + public void Update(bool consideredInUpdateQuery) {} + + public void Insert(bool consideredInInsertQuery) {} + + public void Lazy(bool isLazy) {} + + public void Class(System.Type componentType) + { + realMapper.Class(componentType); + } + + #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-27 14:36:13 UTC (rev 5774) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-27 18:54:47 UTC (rev 5775) @@ -33,6 +33,9 @@ private readonly Dictionary<PropertyPath, List<Action<IComponentAttributesMapper>>> componentPropertyCustomizers = new Dictionary<PropertyPath, List<Action<IComponentAttributesMapper>>>(); + private readonly Dictionary<PropertyPath, List<Action<IComponentAsIdAttributesMapper>>> componentAsIdPropertyCustomizers = + new Dictionary<PropertyPath, List<Action<IComponentAsIdAttributesMapper>>>(); + private readonly Dictionary<PropertyPath, List<Action<IDynamicComponentAttributesMapper>>> dynamicComponentCustomizers = new Dictionary<PropertyPath, List<Action<IDynamicComponentAttributesMapper>>>(); @@ -162,6 +165,11 @@ AddCustomizer(componentPropertyCustomizers, member, propertyCustomizer); } + public void AddCustomizer(PropertyPath member, Action<IComponentAsIdAttributesMapper> propertyCustomizer) + { + AddCustomizer(componentAsIdPropertyCustomizers, member, propertyCustomizer); + } + public void AddCustomizer(PropertyPath member, Action<IDynamicComponentAttributesMapper> propertyCustomizer) { AddCustomizer(dynamicComponentCustomizers, member, propertyCustomizer); @@ -282,6 +290,11 @@ InvokeCustomizers(componentPropertyCustomizers, member, mapper); } + public void InvokeCustomizers(PropertyPath member, IComponentAsIdAttributesMapper mapper) + { + InvokeCustomizers(componentAsIdPropertyCustomizers, member, mapper); + } + public void InvokeCustomizers(PropertyPath member, IDynamicComponentAttributesMapper mapper) { InvokeCustomizers(dynamicComponentCustomizers, member, mapper); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs 2011-04-27 14:36:13 UTC (rev 5774) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs 2011-04-27 18:54:47 UTC (rev 5775) @@ -52,6 +52,23 @@ CustomizersHolder.AddCustomizer(typeof(TEntity), m => m.Id(idProperty, idMapper)); } + public void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty) where TComponent : class + { + ComponentAsId(idProperty, x => { }); + } + + public void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty, Action<IComponentAsIdMapper<TComponent>> idMapper) where TComponent : class + { + var member = TypeExtensions.DecodeMemberAccessExpression(idProperty); + var propertyPath = new PropertyPath(null, member); + idMapper(new ComponentAsIdCustomizer<TComponent>(ExplicitDeclarationsHolder, CustomizersHolder, propertyPath)); + } + + public void ComposedId(Action<IComposedIdMapper<TEntity>> idPropertiesMapping) + { + idPropertiesMapping(new ComposedIdCustomizer<TEntity>(ExplicitDeclarationsHolder, CustomizersHolder)); + } + public void Discriminator(Action<IDiscriminatorMapper> discriminatorMapping) { CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassMapper m) => m.Discriminator(discriminatorMapping)); Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComponentAsIdCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComponentAsIdCustomizer.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComponentAsIdCustomizer.cs 2011-04-27 18:54:47 UTC (rev 5775) @@ -0,0 +1,37 @@ +using System; + +namespace NHibernate.Mapping.ByCode.Impl.CustomizersImpl +{ + public class ComponentAsIdCustomizer<TComponent> : PropertyContainerCustomizer<TComponent>, IComponentAsIdMapper<TComponent> where TComponent : class + { + public ComponentAsIdCustomizer(IModelExplicitDeclarationsHolder explicitDeclarationsHolder, ICustomizersHolder customizersHolder, PropertyPath propertyPath) + : base(explicitDeclarationsHolder, customizersHolder, propertyPath) + { + if (explicitDeclarationsHolder == null) + { + throw new ArgumentNullException("explicitDeclarationsHolder"); + } + if (propertyPath == null) + { + throw new ArgumentNullException("propertyPath"); + } + explicitDeclarationsHolder.AddAsComponent(typeof (TComponent)); + explicitDeclarationsHolder.AddAsPoid(propertyPath.LocalMember); + } + + public void Class<TConcrete>() where TConcrete : TComponent + { + CustomizersHolder.AddCustomizer(PropertyPath, (IComponentAsIdAttributesMapper m) => m.Class(typeof(TConcrete))); + } + + public void Access(Accessor accessor) + { + CustomizersHolder.AddCustomizer(PropertyPath, (IComponentAsIdAttributesMapper m) => m.Access(accessor)); + } + + public void Access(System.Type accessorType) + { + CustomizersHolder.AddCustomizer(PropertyPath, (IComponentAsIdAttributesMapper m) => m.Access(accessorType)); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComposedIdCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComposedIdCustomizer.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComposedIdCustomizer.cs 2011-04-27 18:54:47 UTC (rev 5775) @@ -0,0 +1,24 @@ +using System.Reflection; + +namespace NHibernate.Mapping.ByCode.Impl.CustomizersImpl +{ + public class ComposedIdCustomizer<TEntity> : PropertyContainerCustomizer<TEntity>, IComposedIdMapper<TEntity> where TEntity : class + { + public ComposedIdCustomizer(IModelExplicitDeclarationsHolder explicitDeclarationsHolder, ICustomizersHolder customizersHolder) + : base(explicitDeclarationsHolder, customizersHolder, null) {} + + protected override void RegisterPropertyMapping<TProperty>(System.Linq.Expressions.Expression<System.Func<TEntity, TProperty>> property, System.Action<IPropertyMapper> mapping) + { + MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); + ExplicitDeclarationsHolder.AddAsPartOfComposedId(member); + base.RegisterPropertyMapping(property, mapping); + } + + protected override void RegisterManyToOneMapping<TProperty>(System.Linq.Expressions.Expression<System.Func<TEntity, TProperty>> property, System.Action<IManyToOneMapper> mapping) + { + MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); + ExplicitDeclarationsHolder.AddAsPartOfComposedId(member); + base.RegisterManyToOneMapping(property, mapping); + } + } +} \ 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-27 14:36:13 UTC (rev 5774) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs 2011-04-27 18:54:47 UTC (rev 5775) @@ -24,6 +24,7 @@ void AddCustomizer(PropertyPath member, Action<IIdBagPropertiesMapper> propertyCustomizer); void AddCustomizer(PropertyPath member, Action<ICollectionPropertiesMapper> propertyCustomizer); void AddCustomizer(PropertyPath member, Action<IComponentAttributesMapper> propertyCustomizer); + void AddCustomizer(PropertyPath member, Action<IComponentAsIdAttributesMapper> propertyCustomizer); void AddCustomizer(PropertyPath member, Action<IDynamicComponentAttributesMapper> propertyCustomizer); void InvokeCustomizers(System.Type type, IClassMapper mapper); @@ -44,6 +45,7 @@ void InvokeCustomizers(PropertyPath member, IMapPropertiesMapper mapper); void InvokeCustomizers(PropertyPath member, IIdBagPropertiesMapper mapper); void InvokeCustomizers(PropertyPath member, IComponentAttributesMapper mapper); + void InvokeCustomizers(PropertyPath member, IComponentAsIdAttributesMapper mapper); void InvokeCustomizers(PropertyPath member, IDynamicComponentAttributesMapper mapper); #region Collection Element relations invokers Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-27 14:36:13 UTC (rev 5774) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-27 18:54:47 UTC (rev 5775) @@ -731,7 +731,42 @@ InvokeBeforeMapClass(type, classMapper); InvokeClassCustomizers(type, classMapper); - MemberInfo[] naturalIdPropeties = persistentProperties.Where(mi => modelInspector.IsMemberOfNaturalId(mi)).ToArray(); + if (poidPropertyOrField != null && modelInspector.IsComponent(poidPropertyOrField.GetPropertyOrFieldType())) + { + classMapper.ComponentAsId(poidPropertyOrField, compoAsId => + { + var memberPath = new PropertyPath(null, poidPropertyOrField); + var componentMapper = new ComponentAsIdLikeComponetAttributesMapper(compoAsId); + InvokeBeforeMapComponent(memberPath, componentMapper); + + System.Type componentType = poidPropertyOrField.GetPropertyOrFieldType(); + IEnumerable<MemberInfo> componentPersistentProperties = + membersProvider.GetComponentMembers(componentType).Where(p => modelInspector.IsPersistentProperty(p)); + + customizerHolder.InvokeCustomizers(componentType, componentMapper); + ForEachMemberPath(poidPropertyOrField, memberPath, pp => customizerHolder.InvokeCustomizers(pp, compoAsId)); + InvokeAfterMapComponent(memberPath, componentMapper); + + foreach (MemberInfo property in componentPersistentProperties) + { + MapComposedIdProperties(compoAsId, new PropertyPath(memberPath, property)); + } + }); + } + + MemberInfo[] composedIdPropeties = persistentProperties.Where(mi => modelInspector.IsMemberOfComposedId(mi)).ToArray(); + if (composedIdPropeties.Length > 0) + { + classMapper.ComposedId(composedIdMapper => + { + foreach (MemberInfo property in composedIdPropeties) + { + MapComposedIdProperties(composedIdMapper, new PropertyPath(null, property)); + } + }); + } + + MemberInfo[] naturalIdPropeties = persistentProperties.Except(composedIdPropeties).Where(mi => modelInspector.IsMemberOfNaturalId(mi)).ToArray(); if (naturalIdPropeties.Length > 0) { classMapper.NaturalId(naturalIdMapper => @@ -743,7 +778,7 @@ }); } var splitGroups = modelInspector.GetPropertiesSplits(type); - var propertiesToMap = persistentProperties.Where(mi => !modelInspector.IsVersion(mi) && !modelInspector.IsVersion(mi.GetMemberFromDeclaringType())).Except(naturalIdPropeties).ToList(); + var propertiesToMap = persistentProperties.Except(naturalIdPropeties).Except(composedIdPropeties).Where(mi => !modelInspector.IsVersion(mi) && !modelInspector.IsVersion(mi.GetMemberFromDeclaringType())).ToList(); var propertiesInSplits = new HashSet<MemberInfo>(); foreach (var splitGroup in splitGroups) { @@ -838,6 +873,34 @@ } } + private void MapComposedIdProperties(IMinimalPlainPropertyContainerMapper composedIdMapper, PropertyPath propertyPath) + { + MemberInfo member = propertyPath.LocalMember; + System.Type propertyType = member.GetPropertyOrFieldType(); + var memberPath = propertyPath; + if (modelInspector.IsProperty(member)) + { + MapProperty(member, memberPath, composedIdMapper); + } + else if (modelInspector.IsManyToOne(member)) + { + MapManyToOne(member, memberPath, composedIdMapper); + } + else if (modelInspector.IsAny(member) || modelInspector.IsComponent(propertyType) || + modelInspector.IsOneToOne(member) || modelInspector.IsSet(member) + || modelInspector.IsDictionary(member) || modelInspector.IsArray(member) + || modelInspector.IsList(member) || modelInspector.IsBag(member)) + { + throw new ArgumentOutOfRangeException("propertyPath", + string.Format("The property {0} of {1} can't be part of composite-id.", + member.Name, member.DeclaringType)); + } + else + { + MapProperty(member, memberPath, composedIdMapper); + } + } + private void MapNaturalIdProperties(System.Type rootEntityType, INaturalIdMapper naturalIdMapper, MemberInfo property) { MemberInfo member = property; @@ -973,7 +1036,7 @@ }); } - private void MapProperty(MemberInfo member, PropertyPath propertyPath, IBasePlainPropertyContainerMapper propertiesContainer) + private void MapProperty(MemberInfo member, PropertyPath propertyPath, IMinimalPlainPropertyContainerMapper propertiesContainer) { propertiesContainer.Property(member, propertyMapper => { @@ -1165,7 +1228,7 @@ }); } - private void MapManyToOne(MemberInfo member, PropertyPath propertyPath, IBasePlainPropertyContainerMapper propertiesContainer) + private void MapManyToOne(MemberInfo member, PropertyPath propertyPath, IMinimalPlainPropertyContainerMapper propertiesContainer) { propertiesContainer.ManyToOne(member, manyToOneMapper => { Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-27 14:36:13 UTC (rev 5774) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-27 18:54:47 UTC (rev 5775) @@ -297,8 +297,11 @@ <Compile Include="Mapping\ByCode\Conformist\UnionSubclassMapping.cs" /> <Compile Include="Mapping\ByCode\ICompositeIdMapper.cs" /> <Compile Include="Mapping\ByCode\IDynamicComponentAttributesMapper.cs" /> + <Compile Include="Mapping\ByCode\Impl\ComponentAsIdLikeComponetAttributesMapper.cs" /> <Compile Include="Mapping\ByCode\Impl\ComponentAsIdMapper.cs" /> <Compile Include="Mapping\ByCode\Impl\ComposedIdMapper.cs" /> + <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\ComponentAsIdCustomizer.cs" /> + <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\ComposedIdCustomizer.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/ExpliticMappingTests/ComponentAsIdTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComponentAsIdTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComponentAsIdTests.cs 2011-04-27 18:54:47 UTC (rev 5775) @@ -0,0 +1,157 @@ +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.ExpliticMappingTests +{ + public class ComponentAsIdTests + { + private class MyClass + { + private IMyCompo id; + public IMyCompo Id + { + get { return id; } + set { id = value; } + } + } + + private interface IMyCompo + { + string Code { get; set; } + string Name { get; set; } + } + private class MyComponent : IMyCompo + { + public string Code { get; set; } + public string Name { get; set; } + } + + [Test] + public void WhenPropertyUsedAsComposedIdThenRegister() + { + var inspector = new ExplicitlyDeclaredModel(); + var mapper = new ModelMapper(inspector); + mapper.Class<MyClass>(map => map.ComponentAsId(x => x.Id)); + + inspector.IsPersistentId(For<MyClass>.Property(x => x.Id)).Should().Be.True(); + inspector.IsPersistentProperty(For<MyClass>.Property(x => x.Id)).Should().Be.True(); + inspector.IsComponent(typeof(IMyCompo)).Should().Be.True(); + } + + [Test] + public void WhenMapComponentAsIdThenMapItAndItsProperties() + { + var mapper = new ModelMapper(); + mapper.Class<MyClass>(map => map.ComponentAsId(x => x.Id, idmap => + { + idmap.Property(y => y.Code); + idmap.Property(y => y.Name); + })); + + var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) }); + var hbmClass = hbmMapping.RootClasses[0]; + var hbmCompositId = hbmClass.CompositeId; + var keyProperties = hbmCompositId.Items.OfType<HbmKeyProperty>(); + keyProperties.Should().Have.Count.EqualTo(2); + keyProperties.Select(x => x.Name).Should().Have.SameValuesAs("Code", "Name"); + } + + [Test] + public void WhenMapComponentAsIdAttributesThenMapAttributes() + { + var mapper = new ModelMapper(); + mapper.Class<MyClass>(map => map.ComponentAsId(x => x.Id, idmap => + { + idmap.Access(Accessor.Field); + idmap.Class<MyComponent>(); + })); + + var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) }); + var hbmClass = hbmMapping.RootClasses[0]; + var hbmCompositId = hbmClass.CompositeId; + hbmCompositId.access.Should().Contain("field"); + hbmCompositId.@class.Should().Contain("MyComponent"); + } + + [Test] + public void WhenMapComponentUsedAsComponentAsIdThenMapItAndItsProperties() + { + var mapper = new ModelMapper(); + mapper.Component<IMyCompo>(x => + { + x.Property(y => y.Code, pm => pm.Length(10)); + x.Property(y => y.Name); + }); + mapper.Class<MyClass>(map => map.ComponentAsId(x => x.Id)); + + var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) }); + var hbmClass = hbmMapping.RootClasses[0]; + var hbmCompositId = hbmClass.CompositeId; + var keyProperties = hbmCompositId.Items.OfType<HbmKeyProperty>(); + keyProperties.Should().Have.Count.EqualTo(2); + keyProperties.Select(x => x.Name).Should().Have.SameValuesAs("Code", "Name"); + keyProperties.Where(x => x.Name == "Code").Single().length.Should().Be("10"); + } + + [Test] + public void WhenMapCustomizedComponentUsedAsComponentAsIdWithCustomizationThenUseComponentAsIdCustomization() + { + var mapper = new ModelMapper(); + mapper.Component<IMyCompo>(x => + { + x.Property(y => y.Code, pm=> pm.Length(10)); + x.Property(y => y.Name, pm => pm.Length(20)); + }); + mapper.Class<MyClass>(map => map.ComponentAsId(x => x.Id, idmap => + { + idmap.Property(y => y.Code, pm => pm.Length(15)); + idmap.Property(y => y.Name, pm => pm.Length(25)); + })); + + var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) }); + var hbmClass = hbmMapping.RootClasses[0]; + var hbmCompositId = hbmClass.CompositeId; + var keyProperties = hbmCompositId.Items.OfType<HbmKeyProperty>(); + keyProperties.Select(x => x.length).Should().Have.SameValuesAs("15", "25"); + } + + [Test] + public void WhenMapAttributesOfCustomizedComponentUsedAsComponentAsIdWithCustomizationThenUseInComponentAsIdCustomization() + { + var mapper = new ModelMapper(); + mapper.Component<IMyCompo>(x => + { + x.Access(Accessor.Field); + x.Class<MyComponent>(); + }); + mapper.Class<MyClass>(map => map.ComponentAsId(x => x.Id)); + + var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) }); + var hbmClass = hbmMapping.RootClasses[0]; + var hbmCompositId = hbmClass.CompositeId; + hbmCompositId.access.Should().Contain("field"); + hbmCompositId.@class.Should().Contain("MyComponent"); + } + + [Test] + public void WhenMapAttributesOfCustomizedComponentUsedAsComponentAsIdWithCustomizationOverrideThenUseComponentAsIdCustomization() + { + var mapper = new ModelMapper(); + mapper.Component<IMyCompo>(x => + { + x.Access(Accessor.Field); + x.Class<MyComponent>(); + }); + mapper.Class<MyClass>(map => map.ComponentAsId(x => x.Id, idmap => idmap.Access(Accessor.NoSetter))); + + var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) }); + var hbmClass = hbmMapping.RootClasses[0]; + var hbmCompositId = hbmClass.CompositeId; + hbmCompositId.access.Should().Contain("nosetter"); + hbmCompositId.@class.Should().Contain("MyComponent"); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComposedIdTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComposedIdTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComposedIdTests.cs 2011-04-27 18:54:47 UTC (rev 5775) @@ -0,0 +1,119 @@ +using System; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.ExpliticMappingTests +{ + public class ComposedIdTests + { + private class MyClass + { + public int Code { get; set; } + private MyOther relation; + public MyOther Relation + { + get { return relation; } + set { relation = value; } + } + } + + private class MyOther + { + public int Id { get; set; } + } + + [Test] + public void WhenPropertyUsedAsComposedIdThenRegister() + { + var inspector = new ExplicitlyDeclaredModel(); + var mapper = new ModelMapper(inspector); + mapper.Class<MyClass>(map => + map.ComposedId(cm=> + { + cm.Property(x => x.Code); + cm.ManyToOne(x => x.Relation); + }) + ); + + inspector.IsMemberOfComposedId(For<MyClass>.Property(x => x.Code)).Should().Be.True(); + inspector.IsMemberOfComposedId(For<MyClass>.Property(x => x.Relation)).Should().Be.True(); + inspector.IsPersistentProperty(For<MyClass>.Property(x => x.Code)).Should().Be.True(); + inspector.IsPersistentProperty(For<MyClass>.Property(x => x.Relation)).Should().Be.True(); + inspector.IsPersistentId(For<MyClass>.Property(x => x.Code)).Should().Be.False(); + inspector.IsPersistentId(For<MyClass>.Property(x => x.Relation)).Should().Be.False(); + } + + [Test] + public void WhenPropertyUsedAsComposedIdThenNotUsedAsSimpleProperties() + { + var mapper = new ModelMapper(); + mapper.Class<MyClass>(map => + map.ComposedId(cm => + { + cm.Property(x => x.Code); + cm.ManyToOne(x => x.Relation); + }) + ); + var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) }); + var hbmClass = hbmMapping.RootClasses[0]; + var hbmCompositId = hbmClass.CompositeId; + hbmCompositId.Items.Should().Have.Count.EqualTo(2); + hbmClass.Properties.Should().Be.Empty(); + } + + [Test] + public void WhenPropertyUsedAsComposedIdAndPropertiesThenNotUsedAsSimpleProperties() + { + var mapper = new ModelMapper(); + mapper.Class<MyClass>(map => + { + map.ComposedId(cm => + { + cm.Property(x => x.Code); + cm.ManyToOne(x => x.Relation); + }); + map.Property(x => x.Code); + map.ManyToOne(x => x.Relation); + } + ); + HbmMapping hbmMapping = mapper.CompileMappingFor(new[] {typeof (MyClass)}); + HbmClass hbmClass = hbmMapping.RootClasses[0]; + HbmCompositeId hbmCompositId = hbmClass.CompositeId; + hbmCompositId.Items.Should().Have.Count.EqualTo(2); + hbmClass.Properties.Should().Be.Empty(); + } + + [Test] + public void WhenPropertyUsedAsComposedIdAndPropertiesAndNaturalIdThenMapOnlyAsComposedId() + { + var mapper = new ModelMapper(); + mapper.Class<MyClass>(map => + { + map.ComposedId(cm => + { + cm.Property(x => x.Code); + cm.ManyToOne(x => x.Relation); + }); + map.NaturalId(nm => + { + nm.Property(x => x.Code); + nm.ManyToOne(x => x.Relation); + }); + map.Property(x => x.Code); + map.ManyToOne(x => x.Relation); + } + ); + HbmMapping hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) }); + HbmClass hbmClass = hbmMapping.RootClasses[0]; + HbmCompositeId hbmCompositId = hbmClass.CompositeId; + hbmCompositId.Items.Should().Have.Count.EqualTo(2); + if(hbmClass.naturalid != null) + { + hbmClass.naturalid.Items.Should().Be.Null(); + } + hbmClass.Properties.Should().Be.Empty(); + } + } +} \ 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-27 14:36:13 UTC (rev 5774) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-27 18:54:47 UTC (rev 5775) @@ -519,6 +519,8 @@ <Compile Include="MappingByCode\ConventionModelMapperTests\VersionOnBaseClassIntegrationTest.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\BagOfNestedComponentsWithParentTest.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\ClassWithComponentsTest.cs" /> + <Compile Include="MappingByCode\ExpliticMappingTests\ComponentAsIdTests.cs" /> + <Compile Include="MappingByCode\ExpliticMappingTests\ComposedIdTests.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\ConformistMappingRegistrationTests\ClassMappingRegistrationTest.cs" /> <Compile Include="MappingByCode\CustomizerHolderMergeTest.cs" /> <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\SplitPropertiesRegistrationTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-27 20:51:49
|
Revision: 5776 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5776&view=rev Author: fabiomaulo Date: 2011-04-27 20:51:43 +0000 (Wed, 27 Apr 2011) Log Message: ----------- Minor fix (cleaned mapping when empty natural-id is defined) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/NaturalIdMapper.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComposedIdTests.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/NaturalIdTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs 2011-04-27 18:54:47 UTC (rev 5775) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs 2011-04-27 20:51:43 UTC (rev 5776) @@ -196,9 +196,7 @@ { if (naturalIdMapper == null) { - var hbmNaturalId = new HbmNaturalId(); - classMapping.naturalid = hbmNaturalId; - naturalIdMapper = new NaturalIdMapper(Container, hbmNaturalId, MapDoc); + naturalIdMapper = new NaturalIdMapper(Container, classMapping, MapDoc); } naturalIdMapping(naturalIdMapper); } Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/NaturalIdMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/NaturalIdMapper.cs 2011-04-27 18:54:47 UTC (rev 5775) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/NaturalIdMapper.cs 2011-04-27 20:51:43 UTC (rev 5776) @@ -6,11 +6,17 @@ { public class NaturalIdMapper : AbstractBasePropertyContainerMapper, INaturalIdMapper { + private readonly HbmClass classMapping; private readonly HbmNaturalId naturalIdmapping; - public NaturalIdMapper(System.Type rootClass, HbmNaturalId naturalIdmapping, HbmMapping mapDoc) : base(rootClass, mapDoc) + public NaturalIdMapper(System.Type rootClass, HbmClass classMapping, HbmMapping mapDoc) : base(rootClass, mapDoc) { - this.naturalIdmapping = naturalIdmapping; + if (classMapping == null) + { + throw new ArgumentNullException("classMapping"); + } + this.classMapping = classMapping; + naturalIdmapping = new HbmNaturalId(); } #region Overrides of AbstractBasePropertyContainerMapper @@ -21,6 +27,10 @@ { throw new ArgumentNullException("property"); } + if(classMapping.naturalid == null) + { + classMapping.naturalid = naturalIdmapping; + } var toAdd = new[] {property}; naturalIdmapping.Items = naturalIdmapping.Items == null ? toAdd : naturalIdmapping.Items.Concat(toAdd).ToArray(); } Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComposedIdTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComposedIdTests.cs 2011-04-27 18:54:47 UTC (rev 5775) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComposedIdTests.cs 2011-04-27 20:51:43 UTC (rev 5776) @@ -109,10 +109,7 @@ HbmClass hbmClass = hbmMapping.RootClasses[0]; HbmCompositeId hbmCompositId = hbmClass.CompositeId; hbmCompositId.Items.Should().Have.Count.EqualTo(2); - if(hbmClass.naturalid != null) - { - hbmClass.naturalid.Items.Should().Be.Null(); - } + hbmClass.naturalid.Should().Be.Null(); hbmClass.Properties.Should().Be.Empty(); } } Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/NaturalIdTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/NaturalIdTests.cs 2011-04-27 18:54:47 UTC (rev 5775) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/NaturalIdTests.cs 2011-04-27 20:51:43 UTC (rev 5776) @@ -27,7 +27,7 @@ } [Test] - public void WhenDefineRootEntityThenRegister() + public void WhenDefineNaturalIdThenRegister() { var inspector = new ExplicitlyDeclaredModel(); var mapper = new ModelMapper(inspector); @@ -51,5 +51,19 @@ inspector.IsMemberOfNaturalId(For<MyClass>.Property(x => x.MyComponent)).Should().Be.True(); inspector.IsMemberOfNaturalId(For<MyClass>.Property(x => x.Any)).Should().Be.True(); } + + [Test] + public void WhenDefineEmptyNaturalIdThenNoMapIt() + { + var mapper = new ModelMapper(); + mapper.Class<MyClass>(map => + { + map.Id(x => x.Id, idmap => { }); + map.NaturalId(nidm =>{}); + }); + var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) }); + var hbmClass = hbmMapping.RootClasses[0]; + hbmClass.naturalid.Should().Be.Null(); + } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-27 21:49:18
|
Revision: 5777 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5777&view=rev Author: fabiomaulo Date: 2011-04-27 21:49:11 +0000 (Wed, 27 Apr 2011) Log Message: ----------- Impl DynamicComponentCustomizer to set dynamic-component attributes Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IDynamicComponentAttributesMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IDynamicComponentAttributesMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IDynamicComponentAttributesMapper.cs 2011-04-27 20:51:43 UTC (rev 5776) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IDynamicComponentAttributesMapper.cs 2011-04-27 21:49:11 UTC (rev 5777) @@ -4,6 +4,7 @@ { void Update(bool consideredInUpdateQuery); void Insert(bool consideredInInsertQuery); + void Unique(bool unique); } public interface IDynamicComponentMapper : IDynamicComponentAttributesMapper, IPropertyContainerMapper { } @@ -12,6 +13,7 @@ { void Update(bool consideredInUpdateQuery); void Insert(bool consideredInInsertQuery); + void Unique(bool unique); } public interface IDynamicComponentMapper<TComponent> : IDynamicComponentAttributesMapper<TComponent>, IPropertyContainerMapper<TComponent> where TComponent : class { } Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs 2011-04-27 20:51:43 UTC (rev 5776) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs 2011-04-27 21:49:11 UTC (rev 5777) @@ -22,29 +22,34 @@ public void Access(Accessor accessor) { - throw new NotImplementedException(); + CustomizersHolder.AddCustomizer(PropertyPath, (IDynamicComponentAttributesMapper m) => m.Access(accessor)); } public void Access(System.Type accessorType) { - throw new NotImplementedException(); + CustomizersHolder.AddCustomizer(PropertyPath, (IDynamicComponentAttributesMapper m) => m.Access(accessorType)); } public void OptimisticLock(bool takeInConsiderationForOptimisticLock) { - throw new NotImplementedException(); + CustomizersHolder.AddCustomizer(PropertyPath, (IDynamicComponentAttributesMapper m) => m.OptimisticLock(takeInConsiderationForOptimisticLock)); } public void Update(bool consideredInUpdateQuery) { - throw new NotImplementedException(); + CustomizersHolder.AddCustomizer(PropertyPath, (IDynamicComponentAttributesMapper m) => m.Update(consideredInUpdateQuery)); } public void Insert(bool consideredInInsertQuery) { - throw new NotImplementedException(); + CustomizersHolder.AddCustomizer(PropertyPath, (IDynamicComponentAttributesMapper m) => m.Insert(consideredInInsertQuery)); } + public void Unique(bool unique) + { + CustomizersHolder.AddCustomizer(PropertyPath, (IDynamicComponentAttributesMapper m) => m.Unique(unique)); + } + #endregion } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-27 20:51:43 UTC (rev 5776) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-27 21:49:11 UTC (rev 5777) @@ -163,5 +163,10 @@ { component.insert = consideredInInsertQuery; } + + public void Unique(bool unique) + { + component.unique = unique; + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs 2011-04-27 20:51:43 UTC (rev 5776) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs 2011-04-27 21:49:11 UTC (rev 5777) @@ -13,7 +13,12 @@ private class Person { public int Id { get; set; } - public IDictionary Info { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + set { info = value; } + } } [Test] @@ -48,5 +53,32 @@ var hbmDynamicComponent = hbmClass.Properties.OfType<HbmDynamicComponent>().Single(); hbmDynamicComponent.Properties.OfType<HbmProperty>().Select(x => x.type1).All(x=> x.Satisfy(value=> !string.IsNullOrEmpty(value))); } + + [Test] + public void WhenMapDynCompoAttributesThenMapAttributes() + { + var mapper = new ModelMapper(); + mapper.Class<Person>(map => + { + map.Id(x => x.Id, idmap => { }); + map.Component(x => x.Info, new { MyInt = 5}, z => + { + z.Access(Accessor.Field); + z.Insert(false); + z.Update(false); + z.Unique(true); + z.OptimisticLock(false); + }); + }); + + var hbmMapping = mapper.CompileMappingFor(new[] { typeof(Person) }); + var hbmClass = hbmMapping.RootClasses[0]; + var hbmDynamicComponent = hbmClass.Properties.OfType<HbmDynamicComponent>().SingleOrDefault(); + hbmDynamicComponent.access.Should().Contain("field"); + hbmDynamicComponent.insert.Should().Be.False(); + hbmDynamicComponent.update.Should().Be.False(); + hbmDynamicComponent.optimisticlock.Should().Be.False(); + hbmDynamicComponent.unique.Should().Be.True(); + } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-27 21:53:37
|
Revision: 5778 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5778&view=rev Author: fabiomaulo Date: 2011-04-27 21:53:31 +0000 (Wed, 27 Apr 2011) Log Message: ----------- Merge of Dynamic-compo customizers Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/CustomizerHolderMergeTest.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-27 21:49:11 UTC (rev 5777) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-27 21:53:31 UTC (rev 5778) @@ -353,6 +353,7 @@ MergeDictionary(collectionRelationOneToManyCustomizers, source.collectionRelationOneToManyCustomizers); MergeDictionary(mapKeyManyToManyCustomizers, source.mapKeyManyToManyCustomizers); MergeDictionary(mapKeyElementCustomizers, source.mapKeyElementCustomizers); + MergeDictionary(dynamicComponentCustomizers, source.dynamicComponentCustomizers); } #endregion Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/CustomizerHolderMergeTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/CustomizerHolderMergeTest.cs 2011-04-27 21:49:11 UTC (rev 5777) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/CustomizerHolderMergeTest.cs 2011-04-27 21:53:31 UTC (rev 5778) @@ -328,5 +328,20 @@ called.Should().Be.True(); } + + [Test] + public void MergeShouldMergeDynamicComponentAttributesMapper() + { + var emptyHolder = new CustomizersHolder(); + var holder = new CustomizersHolder(); + var called = false; + + holder.AddCustomizer(propertyPath, (IDynamicComponentAttributesMapper x) => called = true); + emptyHolder.Merge(holder); + emptyHolder.InvokeCustomizers(propertyPath, (IDynamicComponentAttributesMapper)null); + + called.Should().Be.True(); + } + } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-27 22:04:31
|
Revision: 5779 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5779&view=rev Author: fabiomaulo Date: 2011-04-27 22:04:24 +0000 (Wed, 27 Apr 2011) Log Message: ----------- Fixed merge of component-as-id customization Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/CustomizerHolderMergeTest.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-27 21:53:31 UTC (rev 5778) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-27 22:04:24 UTC (rev 5779) @@ -354,6 +354,7 @@ MergeDictionary(mapKeyManyToManyCustomizers, source.mapKeyManyToManyCustomizers); MergeDictionary(mapKeyElementCustomizers, source.mapKeyElementCustomizers); MergeDictionary(dynamicComponentCustomizers, source.dynamicComponentCustomizers); + MergeDictionary(componentAsIdPropertyCustomizers, source.componentAsIdPropertyCustomizers); } #endregion Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/CustomizerHolderMergeTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/CustomizerHolderMergeTest.cs 2011-04-27 21:53:31 UTC (rev 5778) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/CustomizerHolderMergeTest.cs 2011-04-27 22:04:24 UTC (rev 5779) @@ -343,5 +343,18 @@ called.Should().Be.True(); } + [Test] + public void MergeShouldMergeComponentAsIdAttributesMapper() + { + var emptyHolder = new CustomizersHolder(); + var holder = new CustomizersHolder(); + var called = false; + + holder.AddCustomizer(propertyPath, (IComponentAsIdAttributesMapper x) => called = true); + emptyHolder.Merge(holder); + emptyHolder.InvokeCustomizers(propertyPath, (IComponentAsIdAttributesMapper)null); + + called.Should().Be.True(); + } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-27 22:32:10
|
Revision: 5780 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5780&view=rev Author: fabiomaulo Date: 2011-04-27 22:32:04 +0000 (Wed, 27 Apr 2011) Log Message: ----------- Passing test to check we are merging all Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-27 22:04:24 UTC (rev 5779) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-27 22:32:04 UTC (rev 5780) @@ -182,8 +182,6 @@ public void AddAsTablePerClassHierarchyEntity(System.Type type) {} - public void AddAsTablePerClassHierarchyJoinEntity(System.Type type) {} - public void AddAsTablePerConcreteClassEntity(System.Type type) {} public void AddAsOneToOneRelation(MemberInfo member) {} Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs 2011-04-27 22:04:24 UTC (rev 5779) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs 2011-04-27 22:32:04 UTC (rev 5780) @@ -1,3 +1,5 @@ +using System.Collections.Generic; +using System.Linq; using System.Reflection; using NHibernate.Mapping.ByCode; using NHibernate.Mapping.ByCode.Impl; @@ -8,6 +10,299 @@ { public class ModelExplicitDeclarationsHolderMergeTest { + private class ExplicitDeclarationsHolderMock: IModelExplicitDeclarationsHolder + { + public ExplicitDeclarationsHolderMock() + { + PropertiesGettersUsed = new HashSet<string>(); + } + private readonly HashSet<MemberInfo> any = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> arrays = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> bags = new HashSet<MemberInfo>(); + private readonly HashSet<System.Type> components = new HashSet<System.Type>(); + private readonly HashSet<MemberInfo> dictionaries = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> idBags = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> lists = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> manyToManyRelations = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> manyToOneRelations = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> naturalIds = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> oneToManyRelations = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> oneToOneRelations = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> poids = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> composedIds = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> properties = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> dynamicComponents = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> persistentMembers = new HashSet<MemberInfo>(); + private readonly HashSet<System.Type> rootEntities = new HashSet<System.Type>(); + private readonly HashSet<MemberInfo> sets = new HashSet<MemberInfo>(); + private readonly HashSet<SplitDefinition> splitDefinitions = new HashSet<SplitDefinition>(); + private readonly HashSet<System.Type> tablePerClassEntities = new HashSet<System.Type>(); + private readonly HashSet<System.Type> tablePerClassHierarchyEntities = new HashSet<System.Type>(); + private readonly HashSet<System.Type> tablePerConcreteClassEntities = new HashSet<System.Type>(); + private readonly HashSet<MemberInfo> versionProperties = new HashSet<MemberInfo>(); + + public HashSet<string> PropertiesGettersUsed { get; set; } + + #region IModelExplicitDeclarationsHolder Members + + public IEnumerable<System.Type> RootEntities + { + get + { + PropertiesGettersUsed.Add("RootEntities"); + return rootEntities; + } + } + + public IEnumerable<System.Type> Components + { + get + { + PropertiesGettersUsed.Add("Components"); + return components; + } + } + + public IEnumerable<System.Type> TablePerClassEntities + { + get + { + PropertiesGettersUsed.Add("TablePerClassEntities"); + return tablePerClassEntities; + } + } + + public IEnumerable<System.Type> TablePerClassHierarchyEntities + { + get + { + PropertiesGettersUsed.Add("TablePerClassHierarchyEntities"); + return tablePerClassHierarchyEntities; + } + } + + public IEnumerable<System.Type> TablePerConcreteClassEntities + { + get + { + PropertiesGettersUsed.Add("TablePerConcreteClassEntities"); + return tablePerConcreteClassEntities; + } + } + + public IEnumerable<MemberInfo> OneToOneRelations + { + get + { + PropertiesGettersUsed.Add("OneToOneRelations"); + return oneToOneRelations; + } + } + + public IEnumerable<MemberInfo> ManyToOneRelations + { + get + { + PropertiesGettersUsed.Add("ManyToOneRelations"); + return manyToOneRelations; + } + } + + public IEnumerable<MemberInfo> ManyToManyRelations + { + get + { + PropertiesGettersUsed.Add("ManyToManyRelations"); + return manyToManyRelations; + } + } + + public IEnumerable<MemberInfo> OneToManyRelations + { + get + { + PropertiesGettersUsed.Add("OneToManyRelations"); + return oneToManyRelations; + } + } + + public IEnumerable<MemberInfo> Any + { + get + { + PropertiesGettersUsed.Add("Any"); + return any; + } + } + + public IEnumerable<MemberInfo> Poids + { + get + { + PropertiesGettersUsed.Add("Poids"); + return poids; + } + } + + public IEnumerable<MemberInfo> ComposedIds + { + get + { + PropertiesGettersUsed.Add("ComposedIds"); + return composedIds; + } + } + + public IEnumerable<MemberInfo> VersionProperties + { + get + { + PropertiesGettersUsed.Add("VersionProperties"); + return versionProperties; + } + } + + public IEnumerable<MemberInfo> NaturalIds + { + get + { + PropertiesGettersUsed.Add("NaturalIds"); + return naturalIds; + } + } + + public IEnumerable<MemberInfo> Sets + { + get + { + PropertiesGettersUsed.Add("Sets"); + return sets; + } + } + + public IEnumerable<MemberInfo> Bags + { + get + { + PropertiesGettersUsed.Add("Bags"); + return bags; + } + } + + public IEnumerable<MemberInfo> IdBags + { + get + { + PropertiesGettersUsed.Add("IdBags"); + return idBags; + } + } + + public IEnumerable<MemberInfo> Lists + { + get + { + PropertiesGettersUsed.Add("Lists"); + return lists; + } + } + + public IEnumerable<MemberInfo> Arrays + { + get + { + PropertiesGettersUsed.Add("Arrays"); + return arrays; + } + } + + public IEnumerable<MemberInfo> Dictionaries + { + get + { + PropertiesGettersUsed.Add("Dictionaries"); + return dictionaries; + } + } + + public IEnumerable<MemberInfo> Properties + { + get + { + PropertiesGettersUsed.Add("Properties"); + return properties; + } + } + + public IEnumerable<MemberInfo> DynamicComponents + { + get + { + PropertiesGettersUsed.Add("DynamicComponents"); + return dynamicComponents; + } + } + + public IEnumerable<MemberInfo> PersistentMembers + { + get + { + PropertiesGettersUsed.Add("PersistentMembers"); + return persistentMembers; + } + } + + public IEnumerable<SplitDefinition> SplitDefinitions + { + get + { + PropertiesGettersUsed.Add("SplitDefinitions"); + return splitDefinitions; + } + } + + public IEnumerable<string> GetSplitGroupsFor(System.Type type) + { + return Enumerable.Empty<string>(); + } + + public string GetSplitGroupFor(MemberInfo member) + { + return null; + } + + public System.Type GetDynamicComponentTemplate(MemberInfo member) + { + return null; + } + + public void AddAsRootEntity(System.Type type) { } + public void AddAsComponent(System.Type type) { } + public void AddAsTablePerClassEntity(System.Type type) { } + public void AddAsTablePerClassHierarchyEntity(System.Type type) { } + public void AddAsTablePerConcreteClassEntity(System.Type type) { } + public void AddAsOneToOneRelation(MemberInfo member) { } + public void AddAsManyToOneRelation(MemberInfo member) { } + public void AddAsManyToManyRelation(MemberInfo member) { } + public void AddAsOneToManyRelation(MemberInfo member) { } + public void AddAsAny(MemberInfo member) { } + public void AddAsPoid(MemberInfo member) { } + public void AddAsPartOfComposedId(MemberInfo member) { } + public void AddAsVersionProperty(MemberInfo member) { } + public void AddAsNaturalId(MemberInfo member) { } + public void AddAsSet(MemberInfo member) { } + public void AddAsBag(MemberInfo member) { } + public void AddAsIdBag(MemberInfo member) { } + public void AddAsList(MemberInfo member) { } + public void AddAsArray(MemberInfo member) { } + public void AddAsMap(MemberInfo member) { } + public void AddAsProperty(MemberInfo member) { } + public void AddAsPersistentMember(MemberInfo member) { } + public void AddAsPropertySplit(SplitDefinition definition) { } + public void AddAsDynamicComponent(MemberInfo member, System.Type componentTemplate) { } + + #endregion + } private readonly MemberInfo property = typeof (MyClass).GetProperty("Bar"); [Test] @@ -282,6 +577,21 @@ destination.ComposedIds.Should().Have.Count.EqualTo(1); } + [Test] + public void MergeShouldGetAllPropertiesOfPatternsAppliersHolderOfBothSide() + { + // this test is to check that, at least, we are getting all properties (to avoid to forget something) + string[] propertiesOfIPatternsAppliersHolder = + typeof(IModelExplicitDeclarationsHolder).GetProperties().Select(x => x.Name).ToArray(); + + var first = new ExplicitDeclarationsHolderMock(); + var second = new ExplicitDeclarationsHolderMock(); + + first.Merge(second); + + second.PropertiesGettersUsed.Should().Have.SameValuesAs(propertiesOfIPatternsAppliersHolder); + } + #region Nested type: MyClass private class MyClass This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-28 18:47:39
|
Revision: 5786 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5786&view=rev Author: fabiomaulo Date: 2011-04-28 18:47:30 +0000 (Thu, 28 Apr 2011) Log Message: ----------- by-code: Preparing to add new API for private/protected properties/fields Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetPropertyOrFieldMatchingNameTest.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs 2011-04-28 12:43:58 UTC (rev 5785) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs 2011-04-28 18:47:30 UTC (rev 5786) @@ -9,8 +9,9 @@ { public static class TypeExtensions { - private const BindingFlags PublicPropertiesOfClassHierarchy = + private const BindingFlags PropertiesOfClassHierarchy = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy; + private const BindingFlags PropertiesOrFieldOfClass = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly; public static IEnumerable<System.Type> GetBaseTypes(this System.Type type) { @@ -410,12 +411,97 @@ public static bool HasPublicPropertyOf(this System.Type source, System.Type typeOfProperty) { - return GetFirstPropertyOfType(source, typeOfProperty, PublicPropertiesOfClassHierarchy) != null; + return GetFirstPropertyOfType(source, typeOfProperty, PropertiesOfClassHierarchy) != null; } public static bool HasPublicPropertyOf(this System.Type source, System.Type typeOfProperty, Func<PropertyInfo, bool> acceptPropertyClauses) { - return GetFirstPropertyOfType(source, typeOfProperty, PublicPropertiesOfClassHierarchy, acceptPropertyClauses) != null; + return GetFirstPropertyOfType(source, typeOfProperty, PropertiesOfClassHierarchy, acceptPropertyClauses) != null; } + + /// <summary> + /// Try to find a property or field from a given type. + /// </summary> + /// <param name="source">The type</param> + /// <param name="memberName">The property or field name.</param> + /// <returns> + /// A <see cref="PropertyInfo"/> or a <see cref="FieldInfo"/> where the member is found; null otherwise. + /// </returns> + /// <remarks> + /// Where found the member is returned always from the declaring type. + /// </remarks> + public static MemberInfo GetPropertyOrFieldMatchingName(this System.Type source, string memberName) + { + if (source == null) + { + throw new ArgumentNullException("source"); + } + if (memberName == null) + { + return null; + } + var nameToFind = memberName.Trim(); + var members = source.GetPropertiesOfHierarchy().Concat(source.GetFieldsOfHierarchy()).Concat(source.GetPropertiesOfInterfacesImplemented()); + return members.FirstOrDefault(x => x.Name == nameToFind); + } + + private static IEnumerable<MemberInfo> GetPropertiesOfInterfacesImplemented(this System.Type source) + { + if (source.IsInterface) + { + foreach (var interfaceProperty in source.GetInterfaceProperties()) + { + yield return interfaceProperty; + } + yield break; + } + foreach (var @interface in source.GetInterfaces()) + { + foreach (var interfaceProperty in @interface.GetInterfaceProperties()) + { + yield return interfaceProperty; + } + } + } + + private static IEnumerable<MemberInfo> GetPropertiesOfHierarchy(this System.Type type) + { + if(type.IsInterface) + { + yield break; + } + System.Type analizing = type; + while (analizing != null && analizing != typeof(object)) + { + foreach (PropertyInfo propertyInfo in analizing.GetProperties(PropertiesOrFieldOfClass)) + { + yield return propertyInfo; + } + analizing = analizing.BaseType; + } + } + + private static IEnumerable<MemberInfo> GetFieldsOfHierarchy(this System.Type type) + { + if (type.IsInterface) + { + yield break; + } + System.Type analizing = type; + while (analizing != null && analizing != typeof(object)) + { + foreach (FieldInfo fieldInfo in GetUserDeclaredFields(analizing)) + { + yield return fieldInfo; + } + analizing = analizing.BaseType; + } + } + + private static IEnumerable<FieldInfo> GetUserDeclaredFields(System.Type type) + { + // can't find another way to exclude fields generated by the compiler (for both auto-properties and anonymous-types) + return type.GetFields(PropertiesOrFieldOfClass).Where(x => !x.Name.StartsWith("<")); + } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetPropertyOrFieldMatchingNameTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetPropertyOrFieldMatchingNameTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetPropertyOrFieldMatchingNameTest.cs 2011-04-28 18:47:30 UTC (rev 5786) @@ -0,0 +1,178 @@ +using System; +using System.Reflection; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; +namespace NHibernate.Test.MappingByCode.TypeExtensionsTests +{ + public class GetPropertyOrFieldMatchingNameTest + { + private class MyClass + { + private int pField; + private int PrivateProperty { get; set; } + private int AnotherPrivateProperty { get; set; } + protected int ProtectedProperty { get; set; } + private int Method() { return 0; } + } + + private class Inherited: MyClass + { + private int pField; + private int PrivateProperty { get; set; } + } + + private interface IInterface + { + int Something { get; set; } + int SomethingElse { get; set; } + } + + private class MyClassWithExplicitImpl: IInterface + { + int IInterface.Something + { + get + { + throw new System.NotImplementedException(); + } + set + { + throw new System.NotImplementedException(); + } + } + + public int SomethingElse + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + } + + [Test] + public void WhenNullTypeThenThrows() + { + Executing.This(() => ((System.Type)null).GetPropertyOrFieldMatchingName("A")).Should().Throw<ArgumentNullException>(); + } + + [Test] + public void WhenAskNullThenNull() + { + typeof(MyClass).GetPropertyOrFieldMatchingName(null).Should().Be.Null(); + } + + [Test] + public void WhenAskNotExistentThenNull() + { + typeof(MyClass).GetPropertyOrFieldMatchingName("NotExistent").Should().Be.Null(); + } + + [Test] + public void WhenAskPrivateFieldThenFindIt() + { + var memberInfo = typeof(MyClass).GetPropertyOrFieldMatchingName("pField"); + memberInfo.Should().Not.Be.Null(); + memberInfo.Name.Should().Be("pField"); + memberInfo.Should().Be.InstanceOf<FieldInfo>().And.ValueOf.DeclaringType.Should().Be(typeof(MyClass)); + } + + [Test] + public void WhenAskPrivateFieldWithBlanksThenFindIt() + { + var memberInfo = typeof(MyClass).GetPropertyOrFieldMatchingName(" pField "); + memberInfo.Should().Not.Be.Null(); + memberInfo.Name.Should().Be("pField"); + memberInfo.Should().Be.InstanceOf<FieldInfo>().And.ValueOf.DeclaringType.Should().Be(typeof(MyClass)); + } + + [Test] + public void WhenAskPrivatePropertyThenFindIt() + { + var memberInfo = typeof(MyClass).GetPropertyOrFieldMatchingName("PrivateProperty"); + memberInfo.Should().Not.Be.Null(); + memberInfo.Name.Should().Be("PrivateProperty"); + memberInfo.Should().Be.InstanceOf<PropertyInfo>().And.ValueOf.DeclaringType.Should().Be(typeof(MyClass)); + } + + [Test] + public void WhenAskProtectedPropertyThenFindIt() + { + var memberInfo = typeof(MyClass).GetPropertyOrFieldMatchingName("ProtectedProperty"); + memberInfo.Should().Not.Be.Null(); + memberInfo.Name.Should().Be("ProtectedProperty"); + memberInfo.Should().Be.InstanceOf<PropertyInfo>().And.ValueOf.DeclaringType.Should().Be(typeof(MyClass)); + } + + [Test] + public void WhenAskMethodThenNull() + { + typeof(MyClass).GetPropertyOrFieldMatchingName("Method").Should().Be.Null(); + } + + [Test] + public void WhenAskPrivateFieldOnInheritedThenFindItOnInherited() + { + var memberInfo = typeof(Inherited).GetPropertyOrFieldMatchingName("pField"); + memberInfo.Should().Not.Be.Null(); + memberInfo.Name.Should().Be("pField"); + memberInfo.DeclaringType.Should().Be(typeof(Inherited)); + memberInfo.ReflectedType.Should().Be(typeof(Inherited)); + memberInfo.Should().Be.InstanceOf<FieldInfo>(); + } + + [Test] + public void WhenAskPrivatePropertyOnInheritedThenFindItOnInherited() + { + var memberInfo = typeof(Inherited).GetPropertyOrFieldMatchingName("PrivateProperty"); + memberInfo.Should().Not.Be.Null(); + memberInfo.Name.Should().Be("PrivateProperty"); + memberInfo.DeclaringType.Should().Be(typeof(Inherited)); + memberInfo.ReflectedType.Should().Be(typeof(Inherited)); + memberInfo.Should().Be.InstanceOf<PropertyInfo>(); + } + + [Test] + public void WhenAskPrivatePropertyOfBaseOnInheritedThenFindItOnBase() + { + var memberInfo = typeof(Inherited).GetPropertyOrFieldMatchingName("AnotherPrivateProperty"); + memberInfo.Should().Not.Be.Null(); + memberInfo.Name.Should().Be("AnotherPrivateProperty"); + memberInfo.DeclaringType.Should().Be(typeof(MyClass)); + memberInfo.ReflectedType.Should().Be(typeof(MyClass)); + memberInfo.Should().Be.InstanceOf<PropertyInfo>(); + } + + [Test] + public void WhenAskPropertyOfInterfaceThenFindIt() + { + var memberInfo = typeof(IInterface).GetPropertyOrFieldMatchingName("Something"); + memberInfo.Should().Not.Be.Null(); + memberInfo.Name.Should().Be("Something"); + memberInfo.DeclaringType.Should().Be(typeof(IInterface)); + memberInfo.ReflectedType.Should().Be(typeof(IInterface)); + memberInfo.Should().Be.InstanceOf<PropertyInfo>(); + } + + [Test] + public void WhenAskPropertyOfExplicitInterfaceThenFindItOnInterface() + { + var memberInfo = typeof(MyClassWithExplicitImpl).GetPropertyOrFieldMatchingName("Something"); + memberInfo.Should().Not.Be.Null(); + memberInfo.Name.Should().Be("Something"); + memberInfo.DeclaringType.Should().Be(typeof(IInterface)); + memberInfo.ReflectedType.Should().Be(typeof(IInterface)); + memberInfo.Should().Be.InstanceOf<PropertyInfo>(); + } + + [Test] + public void WhenAskPropertyOfImplementedInterfaceThenFindItOnType() + { + var memberInfo = typeof(MyClassWithExplicitImpl).GetPropertyOrFieldMatchingName("SomethingElse"); + memberInfo.Should().Not.Be.Null(); + memberInfo.Name.Should().Be("SomethingElse"); + memberInfo.DeclaringType.Should().Be(typeof(MyClassWithExplicitImpl)); + memberInfo.ReflectedType.Should().Be(typeof(MyClassWithExplicitImpl)); + memberInfo.Should().Be.InstanceOf<PropertyInfo>(); + } + } +} \ 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-28 12:43:58 UTC (rev 5785) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-28 18:47:30 UTC (rev 5786) @@ -612,6 +612,7 @@ <Compile Include="MappingByCode\TypeExtensionsTests\GetFirstImplementorConcreteClassesTest.cs" /> <Compile Include="MappingByCode\TypeExtensionsTests\GetFirstImplementorTest.cs" /> <Compile Include="MappingByCode\TypeExtensionsTests\GetMemberFromInterfacesTest.cs" /> + <Compile Include="MappingByCode\TypeExtensionsTests\GetPropertyOrFieldMatchingNameTest.cs" /> <Compile Include="MappingByCode\TypeExtensionsTests\TypeExtensionsTest.cs" /> <Compile Include="MappingByCode\TypeNameUtilTests.cs" /> <Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Fixture.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-28 22:49:48
|
Revision: 5787 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5787&view=rev Author: fabiomaulo Date: 2011-04-28 22:49:42 +0000 (Thu, 28 Apr 2011) Log Message: ----------- GetMemberFromReflectedType implemented Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetMemberFromReflectedTest.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs 2011-04-28 18:47:30 UTC (rev 5786) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs 2011-04-28 22:49:42 UTC (rev 5787) @@ -420,6 +420,61 @@ } /// <summary> + /// Given a property or a field try to get the member from a given possible inherited type. + /// </summary> + /// <param name="member">The member to find.</param> + /// <param name="reflectedType">The type where find the member.</param> + /// <returns>The member from the reflected-type or the original <paramref name="member"/> where the <paramref name="member"/> is not accessible from <paramref name="reflectedType"/>.</returns> + public static MemberInfo GetMemberFromReflectedType(this MemberInfo member, System.Type reflectedType) + { + if (member == null) + { + throw new ArgumentNullException("member"); + } + if (reflectedType == null) + { + throw new ArgumentNullException("reflectedType"); + } + var field = member as FieldInfo; + if (field != null && field.IsPrivate) + { + return member; + } + var property = member as PropertyInfo; + if (property != null) + { + var propertyGetter = property.GetGetMethod(true); + if (propertyGetter.IsPrivate) + { + return member; + } + if (property.DeclaringType.IsInterface) + { + System.Type[] interfaces = reflectedType.GetInterfaces(); + var @interface = property.DeclaringType; + if (!interfaces.Contains(@interface)) + { + return member; + } + var reflectedCandidateProps = reflectedType.GetProperties(PropertiesOfClassHierarchy); + InterfaceMapping memberMap = reflectedType.GetInterfaceMap(@interface); + for (int i = 0; i < memberMap.TargetMethods.Length; i++) + { + if (memberMap.InterfaceMethods[i] == propertyGetter) + { + return reflectedCandidateProps.Single(pi => pi.GetGetMethod(true) == memberMap.TargetMethods[i]); + } + } + return member; + } + } + var reflectedTypeProperties = reflectedType.GetProperties(PropertiesOfClassHierarchy); + var members = reflectedTypeProperties.Cast<MemberInfo>().Concat(reflectedType.GetFields(PropertiesOfClassHierarchy)); + var result = members.FirstOrDefault(m=> m.Name.Equals(member.Name) && m.GetPropertyOrFieldType().Equals(member.GetPropertyOrFieldType())); + return result ?? member; + } + + /// <summary> /// Try to find a property or field from a given type. /// </summary> /// <param name="source">The type</param> Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetMemberFromReflectedTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetMemberFromReflectedTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetMemberFromReflectedTest.cs 2011-04-28 22:49:42 UTC (rev 5787) @@ -0,0 +1,133 @@ +using System; +using System.Reflection; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.TypeExtensionsTests +{ + public class GetMemberFromReflectedTest + { + private const BindingFlags PrivateMembersFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly; + + private class MyClass + { + private int pField; + private int PrivateProperty { get; set; } + public int AnotherProperty { get; set; } + protected int ProtectedProperty { get; set; } + private int Method() { return 0; } + } + + private class Inherited : MyClass + { + private int pField; + private int PrivateProperty { get; set; } + } + + private interface IInterface + { + int Something { get; set; } + int SomethingElse { get; set; } + } + + private class MyClassWithExplicitImpl : IInterface + { + int IInterface.Something + { + get + { + throw new System.NotImplementedException(); + } + set + { + throw new System.NotImplementedException(); + } + } + + public int SomethingElse + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + } + + [Test] + public void WhenNullMemberThenThrows() + { + Executing.This(() => ((MemberInfo)null).GetMemberFromReflectedType(typeof(MyClass))).Should().Throw<ArgumentNullException>(); + } + + [Test] + public void WhenNullTypeThenThrows() + { + Executing.This(() => typeof(MyClassWithExplicitImpl).GetProperty("SomethingElse").GetMemberFromReflectedType(null)).Should().Throw<ArgumentNullException>(); + } + + [Test] + public void WhenNotExistentThenOriginal() + { + var propertyInfo = typeof(MyClassWithExplicitImpl).GetProperty("SomethingElse"); + propertyInfo.GetMemberFromReflectedType(typeof(object)).Should().Be(propertyInfo); + } + + [Test] + public void WhenNotAccessibleFieldThenOriginal() + { + var memberInfo = typeof(MyClass).GetField("pField", PrivateMembersFlags); + memberInfo.GetMemberFromReflectedType(typeof(Inherited)).Should().Be(memberInfo); + } + + [Test] + public void WhenNotAccessiblePropertyThenOriginal() + { + var memberInfo = typeof(MyClass).GetProperty("PrivateProperty", PrivateMembersFlags); + memberInfo.GetMemberFromReflectedType(typeof(Inherited)).Should().Be(memberInfo); + } + + [Test] + public void WhenAccessiblePropertyThenReflected() + { + var memberInfo = typeof(MyClass).GetProperty("ProtectedProperty", PrivateMembersFlags); + var result = memberInfo.GetMemberFromReflectedType(typeof(Inherited)); + result.ReflectedType.Should().Be(typeof(Inherited)); + result.DeclaringType.Should().Be(typeof(MyClass)); + } + + [Test] + public void WhenPrivateFieldOnInheritedThenFindItOnInherited() + { + var memberInfo = typeof(Inherited).GetField("pField", PrivateMembersFlags); + var result = memberInfo.GetMemberFromReflectedType(typeof(MyClass)); + result.ReflectedType.Should().Be(typeof(Inherited)); + result.DeclaringType.Should().Be(typeof(Inherited)); + } + + [Test] + public void WhenPublicPropertyOfBaseOnInheritedThenFindItOnInherited() + { + var memberInfo = typeof(MyClass).GetProperty("AnotherProperty"); + var result = memberInfo.GetMemberFromReflectedType(typeof(Inherited)); + result.ReflectedType.Should().Be(typeof(Inherited)); + result.DeclaringType.Should().Be(typeof(MyClass)); + } + + [Test] + public void WhenPropertyOfInterfaceThenFindItOnClass() + { + var memberInfo = typeof(IInterface).GetProperty("SomethingElse"); + var result = memberInfo.GetMemberFromReflectedType(typeof(MyClassWithExplicitImpl)); + result.DeclaringType.Should().Be(typeof(MyClassWithExplicitImpl)); + result.ReflectedType.Should().Be(typeof(MyClassWithExplicitImpl)); + } + + [Test] + public void WhenPropertyOfExplicitInterfaceThenFindItOnClass() + { + var memberInfo = typeof(IInterface).GetProperty("Something"); + var result = memberInfo.GetMemberFromReflectedType(typeof(MyClassWithExplicitImpl)); + result.DeclaringType.Should().Be(typeof(MyClassWithExplicitImpl)); + result.ReflectedType.Should().Be(typeof(MyClassWithExplicitImpl)); + } + } +} \ 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-28 18:47:30 UTC (rev 5786) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-28 22:49:42 UTC (rev 5787) @@ -612,6 +612,7 @@ <Compile Include="MappingByCode\TypeExtensionsTests\GetFirstImplementorConcreteClassesTest.cs" /> <Compile Include="MappingByCode\TypeExtensionsTests\GetFirstImplementorTest.cs" /> <Compile Include="MappingByCode\TypeExtensionsTests\GetMemberFromInterfacesTest.cs" /> + <Compile Include="MappingByCode\TypeExtensionsTests\GetMemberFromReflectedTest.cs" /> <Compile Include="MappingByCode\TypeExtensionsTests\GetPropertyOrFieldMatchingNameTest.cs" /> <Compile Include="MappingByCode\TypeExtensionsTests\TypeExtensionsTest.cs" /> <Compile Include="MappingByCode\TypeNameUtilTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-29 16:52:02
|
Revision: 5788 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5788&view=rev Author: fabiomaulo Date: 2011-04-29 16:51:56 +0000 (Fri, 29 Apr 2011) Log Message: ----------- SimpleModelInspector managing polymorphic registration Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/TypeExtensionsTest.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/PolymorphicPropertiesMapping.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-28 22:49:42 UTC (rev 5787) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-29 16:51:56 UTC (rev 5788) @@ -530,108 +530,108 @@ bool IModelInspector.IsOneToOne(MemberInfo member) { - bool declaredResult = declaredModel.IsOneToOne(member); + bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsOneToOne(m)); return isOneToOne(member, declaredResult); } bool IModelInspector.IsManyToOne(MemberInfo member) { - bool declaredResult = declaredModel.IsManyToOne(member); + bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsManyToOne(m)); return isManyToOne(member, declaredResult); } bool IModelInspector.IsManyToMany(MemberInfo member) { - bool declaredResult = declaredModel.IsManyToMany(member); + bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsManyToMany(m)); return isManyToMany(member, declaredResult); } bool IModelInspector.IsOneToMany(MemberInfo member) { - bool declaredResult = declaredModel.IsOneToMany(member); + bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsOneToMany(m)); return isOneToMany(member, declaredResult); } bool IModelInspector.IsAny(MemberInfo member) { - bool declaredResult = declaredModel.IsAny(member); + bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsAny(m)); return isAny(member, declaredResult); } bool IModelInspector.IsPersistentId(MemberInfo member) { - bool declaredResult = declaredModel.IsPersistentId(member); + bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsPersistentId(m)); return isPersistentId(member, declaredResult); } bool IModelInspector.IsMemberOfComposedId(MemberInfo member) { - return declaredModel.IsPersistentId(member); + return declaredModel.IsMemberOfComposedId(member); } bool IModelInspector.IsVersion(MemberInfo member) { - bool declaredResult = declaredModel.IsVersion(member); + bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsVersion(m)); return isVersion(member, declaredResult); } bool IModelInspector.IsMemberOfNaturalId(MemberInfo member) { - bool declaredResult = declaredModel.IsMemberOfNaturalId(member); + bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsMemberOfNaturalId(m)); return isMemberOfNaturalId(member, declaredResult); } bool IModelInspector.IsPersistentProperty(MemberInfo member) { - bool declaredResult = declaredModel.IsPersistentProperty(member); + bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsPersistentProperty(m)); return isPersistentProperty(member, declaredResult); } bool IModelInspector.IsSet(MemberInfo role) { - bool declaredResult = declaredModel.IsSet(role); + bool declaredResult = DeclaredPolymorphicMatch(role, m => declaredModel.IsSet(m)); return isSet(role, declaredResult); } bool IModelInspector.IsBag(MemberInfo role) { - bool declaredResult = declaredModel.IsBag(role); + bool declaredResult = DeclaredPolymorphicMatch(role, m => declaredModel.IsBag(m)); return isBag(role, declaredResult); } bool IModelInspector.IsIdBag(MemberInfo role) { - bool declaredResult = declaredModel.IsIdBag(role); + bool declaredResult = DeclaredPolymorphicMatch(role, m => declaredModel.IsIdBag(m)); return isIdBag(role, declaredResult); } bool IModelInspector.IsList(MemberInfo role) { - bool declaredResult = declaredModel.IsList(role); + bool declaredResult = DeclaredPolymorphicMatch(role, m => declaredModel.IsList(m)); return isList(role, declaredResult); } bool IModelInspector.IsArray(MemberInfo role) { - bool declaredResult = declaredModel.IsArray(role); + bool declaredResult = DeclaredPolymorphicMatch(role, m => declaredModel.IsArray(m)); return isArray(role, declaredResult); } bool IModelInspector.IsDictionary(MemberInfo role) { - bool declaredResult = declaredModel.IsDictionary(role); + bool declaredResult = DeclaredPolymorphicMatch(role, m => declaredModel.IsDictionary(m)); return isDictionary(role, declaredResult); } bool IModelInspector.IsProperty(MemberInfo member) { - bool declaredResult = declaredModel.IsProperty(member); + bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsProperty(m)); return isProperty(member, declaredResult); } bool IModelInspector.IsDynamicComponent(MemberInfo member) { - bool declaredResult = declaredModel.IsDynamicComponent(member); + bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsDynamicComponent(m)); return isDynamicComponent(member, declaredResult); } @@ -652,6 +652,13 @@ #endregion + protected virtual bool DeclaredPolymorphicMatch(MemberInfo member, Func<MemberInfo, bool> declaredMatch) + { + return declaredMatch(member) + || member.GetMemberFromDeclaringClasses().Any(declaredMatch) + || member.GetPropertyFromInterfaces().Any(declaredMatch); + } + public void IsRootEntity(Func<System.Type, bool, bool> match) { if (match == null) Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs 2011-04-28 22:49:42 UTC (rev 5787) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs 2011-04-29 16:51:56 UTC (rev 5788) @@ -170,9 +170,36 @@ { return source; } - return source.DeclaringType.GetProperty(source.Name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly); + if (source is PropertyInfo) + { + return source.DeclaringType.GetProperty(source.Name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly); + } + if (source is FieldInfo) + { + return source.DeclaringType.GetField(source.Name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly); + } + return null; } + public static IEnumerable<MemberInfo> GetMemberFromDeclaringClasses(this MemberInfo source) + { + if (source == null) + { + throw new ArgumentNullException("source"); + } + if (source is PropertyInfo) + { + var reflectedType = source.ReflectedType; + var memberType = source.GetPropertyOrFieldType(); + return reflectedType.GetPropertiesOfHierarchy().Cast<PropertyInfo>().Where(x => source.Name.Equals(x.Name) && memberType.Equals(x.PropertyType)).Cast<MemberInfo>(); + } + if (source is FieldInfo) + { + return new[] { source.GetMemberFromDeclaringType() }; + } + return Enumerable.Empty<MemberInfo>(); + } + public static IEnumerable<MemberInfo> GetPropertyFromInterfaces(this MemberInfo source) { if (source == null) Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/PolymorphicPropertiesMapping.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/PolymorphicPropertiesMapping.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/PolymorphicPropertiesMapping.cs 2011-04-29 16:51:56 UTC (rev 5788) @@ -0,0 +1,99 @@ +using System; +using System.Reflection; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MixAutomapping +{ + public class PolymorphicPropertiesMapping + { + const BindingFlags RootClassPropertiesBindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy; + + private interface IBaseEntity + { + int Id { get; } + } + + private class BaseEntity : IBaseEntity + { + public int Id { get; protected set; } + public DateTime LastChange { get { return DateTime.Now; } } + } + + private interface IProduct : IBaseEntity + { + string Description { get;} + } + + private abstract class BaseProduct : BaseEntity, IProduct + { + public abstract string Description { get; } + } + + private class Product : BaseProduct + { + public override string Description + { + get { return "blah"; } + } + } + + [Test] + public void WhenMapIdThroughBaseInterfaceThenFindIt() + { + var inspector = (IModelInspector)new SimpleModelInspector(); + var mapper = new ModelMapper(inspector); + mapper.Class<IBaseEntity>( + map => + { + map.Id(x => x.Id, idmap => { }); + }); + inspector.IsPersistentId(typeof(Product).GetProperty("Id", RootClassPropertiesBindingFlags)).Should().Be.True(); + } + + [Test] + public void WhenMapPropertyThroughBaseConcreteClassThenFindIt() + { + var inspector = (IModelInspector)new SimpleModelInspector(); + var mapper = new ModelMapper(inspector); + + mapper.Class<BaseEntity>(map => map.Property(x => x.LastChange)); + + inspector.IsPersistentProperty(typeof(Product).GetProperty("LastChange", RootClassPropertiesBindingFlags)).Should().Be.True(); + } + + [Test] + public void WhenMapPropertyThroughBaseInterfaceThenFindIt() + { + var inspector = (IModelInspector)new SimpleModelInspector(); + var mapper = new ModelMapper(inspector); + + mapper.Class<IProduct>(map => map.Property(x => x.Description)); + + inspector.IsPersistentProperty(typeof(Product).GetProperty("Description", RootClassPropertiesBindingFlags)).Should().Be.True(); + } + + [Test] + public void WhenMapPropertyThroughBaseAbstractClassThenFindIt() + { + var inspector = (IModelInspector)new SimpleModelInspector(); + var mapper = new ModelMapper(inspector); + + mapper.Class<BaseProduct>(map => map.Property(x => x.Description)); + + inspector.IsPersistentProperty(typeof(Product).GetProperty("Description", RootClassPropertiesBindingFlags)).Should().Be.True(); + } + + [Test] + public void WhenMapPropertyThroughClassThenFindIt() + { + var inspector = (IModelInspector)new SimpleModelInspector(); + var mapper = new ModelMapper(inspector); + + mapper.Class<Product>(map => map.Property(x => x.Description)); + + inspector.IsPersistentProperty(typeof(Product).GetProperty("Description", RootClassPropertiesBindingFlags)).Should().Be.True(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/TypeExtensionsTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/TypeExtensionsTest.cs 2011-04-28 22:49:42 UTC (rev 5787) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/TypeExtensionsTest.cs 2011-04-29 16:51:56 UTC (rev 5788) @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Linq; using System.Reflection; using NHibernate.Mapping.ByCode; using NUnit.Framework; @@ -203,5 +204,41 @@ typeof(MyBaseClass).HasPublicPropertyOf(typeof(string), x => false).Should().Be.False(); typeof(MyBaseClass).HasPublicPropertyOf(typeof(string), x => true).Should().Be.True(); } + + private abstract class MyAbstract + { + protected int aField; + public abstract string Description { get; } + } + + private class MyConcrete : MyAbstract + { + public override string Description + { + get { return "blah"; } + } + } + + [Test] + public void GetMemberFromDeclaringClasses_WhenPropertyThenFindAbstract() + { + var member = typeof(MyConcrete).GetProperty("Description", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy); + var found = member.GetMemberFromDeclaringClasses().ToList(); + found.Count.Should().Be(2); + var concreteMember = For<MyConcrete>.Property(x => x.Description).GetMemberFromReflectedType(typeof(MyConcrete)); + var abstractMember = For<MyAbstract>.Property(x => x.Description); + found.Should().Have.SameValuesAs(concreteMember, abstractMember); + } + + [Test] + public void GetMemberFromDeclaringClasses_WhenFieldThenFindAbstract() + { + var member = typeof(MyConcrete).GetField("aField", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy); + var found = member.GetMemberFromDeclaringClasses().ToList(); + found.Count.Should().Be(1); + var foundMember = found.Single(); + foundMember.DeclaringType.Should().Be(typeof(MyAbstract)); + foundMember.ReflectedType.Should().Be(typeof(MyAbstract)); + } } } \ 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-28 22:49:42 UTC (rev 5787) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-29 16:51:56 UTC (rev 5788) @@ -592,6 +592,7 @@ <Compile Include="MappingByCode\MixAutomapping\ManyToOneTest.cs" /> <Compile Include="MappingByCode\MixAutomapping\OneToManyTests.cs" /> <Compile Include="MappingByCode\MixAutomapping\PoidTests.cs" /> + <Compile Include="MappingByCode\MixAutomapping\PolymorphicPropertiesMapping.cs" /> <Compile Include="MappingByCode\MixAutomapping\PropertiesExclusionTests.cs" /> <Compile Include="MappingByCode\MixAutomapping\RootEntityTests.cs" /> <Compile Include="MappingByCode\MixAutomapping\SetCollectionTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-29 18:28:23
|
Revision: 5789 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5789&view=rev Author: fabiomaulo Date: 2011-04-29 18:28:17 +0000 (Fri, 29 Apr 2011) Log Message: ----------- by-code : Breaking change with Alpha2 to map private/protected members Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/NaturalIdCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/PropertyToFieldAccessorTest.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/PropertiesExclusionTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs 2011-04-29 16:51:56 UTC (rev 5788) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs 2011-04-29 18:28:17 UTC (rev 5789) @@ -28,7 +28,7 @@ { void Property<TProperty>(Expression<Func<TContainer, TProperty>> property); void Property<TProperty>(Expression<Func<TContainer, TProperty>> property, Action<IPropertyMapper> mapping); - void Property(FieldInfo member, Action<IPropertyMapper> mapping); + void Property(string notVidiblePropertyOrFieldName, Action<IPropertyMapper> mapping); void ManyToOne<TProperty>(Expression<Func<TContainer, TProperty>> property, Action<IManyToOneMapper> mapping) where TProperty : class; void ManyToOne<TProperty>(Expression<Func<TContainer, TProperty>> property) where TProperty : class; Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs 2011-04-29 16:51:56 UTC (rev 5788) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs 2011-04-29 18:28:17 UTC (rev 5789) @@ -117,10 +117,12 @@ base.RegisterPropertyMapping(property, mapping); } - protected override void RegisterFieldMapping(FieldInfo member, Action<IPropertyMapper> mapping) + protected override void RegisterNoVisiblePropertyMapping(string notVidiblePropertyOrFieldName, System.Action<IPropertyMapper> mapping) { + MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + ExplicitDeclarationsHolder.AddAsPropertySplit(new SplitDefinition(typeof(TEntity), splitGroupId, member)); - base.RegisterFieldMapping(member, mapping); + base.RegisterNoVisiblePropertyMapping(notVidiblePropertyOrFieldName, mapping); } protected override void RegisterComponentMapping<TComponent>(Expression<Func<TEntity, TComponent>> property, Action<IComponentMapper<TComponent>> mapping) Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/NaturalIdCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/NaturalIdCustomizer.cs 2011-04-29 16:51:56 UTC (rev 5788) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/NaturalIdCustomizer.cs 2011-04-29 18:28:17 UTC (rev 5789) @@ -16,10 +16,14 @@ base.RegisterPropertyMapping(property, mapping); } - protected override void RegisterFieldMapping(FieldInfo member, System.Action<IPropertyMapper> mapping) + protected override void RegisterNoVisiblePropertyMapping(string notVidiblePropertyOrFieldName, System.Action<IPropertyMapper> mapping) { + MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); + ExplicitDeclarationsHolder.AddAsNaturalId(member); - base.RegisterFieldMapping(member, mapping); + ExplicitDeclarationsHolder.AddAsNaturalId(memberOf); + base.RegisterNoVisiblePropertyMapping(notVidiblePropertyOrFieldName, mapping); } protected override void RegisterComponentMapping<TComponent>(System.Linq.Expressions.Expression<System.Func<TEntity, TComponent>> property, System.Action<IComponentMapper<TComponent>> mapping) Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-29 16:51:56 UTC (rev 5788) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-29 18:28:17 UTC (rev 5789) @@ -49,15 +49,21 @@ explicitDeclarationsHolder.AddAsProperty(memberOf); } - public void Property(FieldInfo member, Action<IPropertyMapper> mapping) + public void Property(string notVidiblePropertyOrFieldName, Action<IPropertyMapper> mapping) { - RegisterFieldMapping(member, mapping); + RegisterNoVisiblePropertyMapping(notVidiblePropertyOrFieldName, mapping); } - protected virtual void RegisterFieldMapping(FieldInfo member, Action<IPropertyMapper> mapping) + protected virtual void RegisterNoVisiblePropertyMapping(string notVidiblePropertyOrFieldName, Action<IPropertyMapper> mapping) { + // even seems repetitive, before unify this registration with the registration using Expression take in account that reflection operations + // done unsing expressions are faster than those done with pure reflection. + MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping); + CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, memberOf), mapping); explicitDeclarationsHolder.AddAsProperty(member); + explicitDeclarationsHolder.AddAsProperty(memberOf); } public void Component<TComponent>(Expression<Func<TEntity, TComponent>> property, Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/PropertyToFieldAccessorTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/PropertyToFieldAccessorTest.cs 2011-04-29 16:51:56 UTC (rev 5788) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/PropertyToFieldAccessorTest.cs 2011-04-29 18:28:17 UTC (rev 5789) @@ -50,9 +50,8 @@ [Test] public void WhenFieldAccessToField() { - var member = typeof(MyClass).GetField("aField",BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly); var mapper = new ConventionModelMapper(); - mapper.Class<MyClass>(mc => mc.Property(member, x => { })); + mapper.Class<MyClass>(mc => mc.Property("aField", x => { })); var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) }); var hbmClass = hbmMapping.RootClasses[0]; Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs 2011-04-29 16:51:56 UTC (rev 5788) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs 2011-04-29 18:28:17 UTC (rev 5789) @@ -25,7 +25,7 @@ map.Column("MyClassId"); map.Generator(Generators.HighLow, gmap => gmap.Params(new { max_low = 100 })); }); - ca.Property(ForClass<MyClass>.Field("something"), map => map.Length(150)); + ca.Property("something", map => map.Length(150)); }); var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) }); var hbmClass = hbmMapping.RootClasses[0]; Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/PropertiesExclusionTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/PropertiesExclusionTests.cs 2011-04-29 16:51:56 UTC (rev 5788) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/PropertiesExclusionTests.cs 2011-04-29 18:28:17 UTC (rev 5789) @@ -84,7 +84,7 @@ { var autoinspector = new SimpleModelInspector(); var mapper = new ModelMapper(autoinspector); - mapper.Class<MyEntity>(map => map.Property(ForClass<MyEntity>.Field("pizza"), x => { })); + mapper.Class<MyEntity>(map => map.Property("pizza", x => { })); var inspector = (IModelInspector)autoinspector; var pi = typeof(MyEntity).GetField("pizza", BindingFlags.Instance | BindingFlags.NonPublic); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-29 21:16:29
|
Revision: 5790 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5790&view=rev Author: fabiomaulo Date: 2011-04-29 21:16:22 +0000 (Fri, 29 Apr 2011) Log Message: ----------- Customizers with mapping of not visible members Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyContainerMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/AllPropertiesRegistrationTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs 2011-04-29 18:28:17 UTC (rev 5789) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs 2011-04-29 21:16:22 UTC (rev 5790) @@ -32,6 +32,7 @@ void ManyToOne<TProperty>(Expression<Func<TContainer, TProperty>> property, Action<IManyToOneMapper> mapping) where TProperty : class; void ManyToOne<TProperty>(Expression<Func<TContainer, TProperty>> property) where TProperty : class; + void ManyToOne<TProperty>(string notVidiblePropertyOrFieldName, Action<IManyToOneMapper> mapping) where TProperty : class; } public interface IBasePlainPropertyContainerMapper<TContainer> : IMinimalPlainPropertyContainerMapper<TContainer> @@ -39,16 +40,24 @@ void Component<TComponent>(Expression<Func<TContainer, TComponent>> property, Action<IComponentMapper<TComponent>> mapping) where TComponent : class; void Component<TComponent>(Expression<Func<TContainer, TComponent>> property) where TComponent : class; - void Component<TComponent>(Expression<Func<TContainer, IDictionary>> property, TComponent dynamicComponentTemplate, Action<IDynamicComponentMapper<TComponent>> mapping) where TComponent : class; + void Component<TComponent>(string notVidiblePropertyOrFieldName, + Action<IComponentMapper<TComponent>> mapping) where TComponent : class; + void Component<TComponent>(string notVidiblePropertyOrFieldName) where TComponent : class; + void Component<TComponent>(string notVidiblePropertyOrFieldName, + TComponent dynamicComponentTemplate, + Action<IDynamicComponentMapper<TComponent>> mapping) where TComponent : class; + void Any<TProperty>(Expression<Func<TContainer, TProperty>> property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) where TProperty : class; + void Any<TProperty>(string notVidiblePropertyOrFieldName, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) where TProperty : class; } public interface IPlainPropertyContainerMapper<TContainer> : IBasePlainPropertyContainerMapper<TContainer> { void OneToOne<TProperty>(Expression<Func<TContainer, TProperty>> property, Action<IOneToOneMapper> mapping) where TProperty : class; + void OneToOne<TProperty>(string notVidiblePropertyOrFieldName, Action<IOneToOneMapper> mapping) where TProperty : class; } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyContainerMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyContainerMapper.cs 2011-04-29 18:28:17 UTC (rev 5789) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyContainerMapper.cs 2011-04-29 21:16:22 UTC (rev 5790) @@ -33,35 +33,63 @@ Action<ICollectionElementRelation<TElement>> mapping); void Set<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping); + void Set<TElement>(string notVidiblePropertyOrFieldName, + Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping, + Action<ICollectionElementRelation<TElement>> mapping); + void Set<TElement>(string notVidiblePropertyOrFieldName, + Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping); void Bag<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping); void Bag<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping); + void Bag<TElement>(string notVidiblePropertyOrFieldName, + Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping, + Action<ICollectionElementRelation<TElement>> mapping); + void Bag<TElement>(string notVidiblePropertyOrFieldName, + Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping); void List<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping); void List<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping); + void List<TElement>(string notVidiblePropertyOrFieldName, + Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping, + Action<ICollectionElementRelation<TElement>> mapping); + void List<TElement>(string notVidiblePropertyOrFieldName, + Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping); void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<IMapKeyRelation<TKey>> keyMapping, Action<ICollectionElementRelation<TElement>> mapping); - void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping); void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping); + void Map<TKey, TElement>(string notVidiblePropertyOrFieldName, + Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, + Action<IMapKeyRelation<TKey>> keyMapping, + Action<ICollectionElementRelation<TElement>> mapping); + void Map<TKey, TElement>(string notVidiblePropertyOrFieldName, + Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, + Action<ICollectionElementRelation<TElement>> mapping); + void Map<TKey, TElement>(string notVidiblePropertyOrFieldName, + Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping); void IdBag<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping); void IdBag<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping); + void IdBag<TElement>(string notVidiblePropertyOrFieldName, + Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping, + Action<ICollectionElementRelation<TElement>> mapping); + void IdBag<TElement>(string notVidiblePropertyOrFieldName, + Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping); } public interface IPropertyContainerMapper<TEntity> : ICollectionPropertiesContainerMapper<TEntity>, IPlainPropertyContainerMapper<TEntity> where TEntity : class {} Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-29 18:28:17 UTC (rev 5789) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-29 21:16:22 UTC (rev 5790) @@ -43,10 +43,7 @@ { MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property); - CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping); - CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, memberOf), mapping); - explicitDeclarationsHolder.AddAsProperty(member); - explicitDeclarationsHolder.AddAsProperty(memberOf); + RegistePropertyMapping(mapping, member, memberOf); } public void Property(string notVidiblePropertyOrFieldName, Action<IPropertyMapper> mapping) @@ -60,12 +57,18 @@ // done unsing expressions are faster than those done with pure reflection. MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); - CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping); - CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, memberOf), mapping); - explicitDeclarationsHolder.AddAsProperty(member); - explicitDeclarationsHolder.AddAsProperty(memberOf); + RegistePropertyMapping(mapping, member, memberOf); } + protected void RegistePropertyMapping(Action<IPropertyMapper> mapping, params MemberInfo[] members) + { + foreach (var member in members) + { + CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping); + explicitDeclarationsHolder.AddAsProperty(member); + } + } + public void Component<TComponent>(Expression<Func<TEntity, TComponent>> property, Action<IComponentMapper<TComponent>> mapping) where TComponent : class { @@ -80,11 +83,19 @@ where TComponent : class { MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); - mapping(new ComponentCustomizer<TComponent>(explicitDeclarationsHolder, CustomizersHolder, new PropertyPath(PropertyPath, member))); MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property); - mapping(new ComponentCustomizer<TComponent>(explicitDeclarationsHolder, CustomizersHolder, new PropertyPath(PropertyPath, memberOf))); + RegisterComponentMapping<TComponent>(mapping, member, memberOf); } + protected void RegisterComponentMapping<TComponent>(Action<IComponentMapper<TComponent>> mapping, params MemberInfo[] members) + where TComponent : class + { + foreach (var member in members) + { + mapping(new ComponentCustomizer<TComponent>(explicitDeclarationsHolder, CustomizersHolder, new PropertyPath(PropertyPath, member))); + } + } + public void Component<TComponent>(Expression<Func<TEntity, IDictionary>> property, TComponent dynamicComponentTemplate, Action<IDynamicComponentMapper<TComponent>> mapping) where TComponent : class @@ -95,11 +106,19 @@ protected virtual void RegisterDynamicComponentMapping<TComponent>(Expression<Func<TEntity, IDictionary>> property, Action<IDynamicComponentMapper<TComponent>> mapping) where TComponent : class { MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); - mapping(new DynamicComponentCustomizer<TComponent>(explicitDeclarationsHolder, CustomizersHolder, new PropertyPath(PropertyPath, member))); MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property); - mapping(new DynamicComponentCustomizer<TComponent>(explicitDeclarationsHolder, CustomizersHolder, new PropertyPath(PropertyPath, memberOf))); + RegisterDynamicComponentMapping<TComponent>(mapping, member, memberOf); } + protected void RegisterDynamicComponentMapping<TComponent>(Action<IDynamicComponentMapper<TComponent>> mapping, params MemberInfo[] members) + where TComponent : class + { + foreach (var member in members) + { + mapping(new DynamicComponentCustomizer<TComponent>(explicitDeclarationsHolder, CustomizersHolder, new PropertyPath(PropertyPath, member))); + } + } + public void ManyToOne<TProperty>(Expression<Func<TEntity, TProperty>> property, Action<IManyToOneMapper> mapping) where TProperty : class { @@ -110,13 +129,20 @@ where TProperty : class { MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); - CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping); MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property); - CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, memberOf), mapping); - explicitDeclarationsHolder.AddAsManyToOneRelation(member); - explicitDeclarationsHolder.AddAsManyToOneRelation(memberOf); + RegisterManyToOneMapping<TProperty>(mapping, member, memberOf); } + protected void RegisterManyToOneMapping<TProperty>(Action<IManyToOneMapper> mapping, params MemberInfo[] members) + where TProperty : class + { + foreach (var member in members) + { + CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping); + explicitDeclarationsHolder.AddAsManyToOneRelation(member); + } + } + public void ManyToOne<TProperty>(Expression<Func<TEntity, TProperty>> property) where TProperty : class { ManyToOne(property, x => { }); @@ -126,13 +152,20 @@ where TProperty : class { MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); - CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping); MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property); - CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, memberOf), mapping); - explicitDeclarationsHolder.AddAsOneToOneRelation(member); - explicitDeclarationsHolder.AddAsOneToOneRelation(memberOf); + RegisterOneToOneMapping<TProperty>(mapping, member, memberOf); } + protected void RegisterOneToOneMapping<TProperty>(Action<IOneToOneMapper> mapping, params MemberInfo[] members) + where TProperty : class + { + foreach (var member in members) + { + CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping); + explicitDeclarationsHolder.AddAsOneToOneRelation(member); + } + } + public void Any<TProperty>(Expression<Func<TEntity, TProperty>> property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) where TProperty : class { @@ -143,15 +176,22 @@ where TProperty : class { MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); - CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), am => am.IdType(idTypeOfMetaType)); - CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping); MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property); - CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, memberOf), mapping); - CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, memberOf), am => am.IdType(idTypeOfMetaType)); - explicitDeclarationsHolder.AddAsAny(member); - explicitDeclarationsHolder.AddAsAny(memberOf); + RegisterAnyMapping<TProperty>(mapping, idTypeOfMetaType, member, memberOf); } + protected void RegisterAnyMapping<TProperty>(Action<IAnyMapper> mapping, System.Type idTypeOfMetaType, params MemberInfo[] members) + where TProperty : class + { + foreach (var member in members) + { + CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), am => am.IdType(idTypeOfMetaType)); + CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping); + + explicitDeclarationsHolder.AddAsAny(member); + } + } + public void Set<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) @@ -168,14 +208,19 @@ protected virtual void RegisterSetMapping<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) { MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); - collectionMapping(new SetPropertiesCustomizer<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 SetPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, memberOf), CustomizersHolder)); - mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder)); + RegisterSetMapping<TElement>(collectionMapping, mapping, member, memberOf); } + protected void RegisterSetMapping<TElement>(Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping, params MemberInfo[] members) + { + foreach (var member in members) + { + collectionMapping(new SetPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, member), CustomizersHolder)); + mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder)); + } + } + public void Bag<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) @@ -191,14 +236,19 @@ protected virtual void RegisterBagMapping<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) { MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); - collectionMapping(new BagPropertiesCustomizer<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 BagPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, memberOf), CustomizersHolder)); - mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, memberOf), CustomizersHolder)); + RegisterBagMapping<TElement>(collectionMapping, mapping, member, memberOf); } + protected void RegisterBagMapping<TElement>(Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping, params MemberInfo[] members) + { + foreach (var member in members) + { + collectionMapping(new BagPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, member), CustomizersHolder)); + mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder)); + } + } + public void List<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) @@ -214,14 +264,19 @@ protected virtual void RegisterListMapping<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) { MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); - collectionMapping(new ListPropertiesCustomizer<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 ListPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, memberOf), CustomizersHolder)); - mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder)); + RegisterListMapping<TElement>(collectionMapping, mapping, member, memberOf); } + protected void RegisterListMapping<TElement>(Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping, params MemberInfo[] members) + { + foreach (var member in members) + { + collectionMapping(new ListPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, member), CustomizersHolder)); + mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder)); + } + } + public void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<IMapKeyRelation<TKey>> keyMapping, @@ -238,18 +293,21 @@ protected virtual void RegisterMapMapping<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<IMapKeyRelation<TKey>> keyMapping, Action<ICollectionElementRelation<TElement>> mapping) { MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); - var memberPath = new PropertyPath(PropertyPath, member); - collectionMapping(new MapPropertiesCustomizer<TEntity, TKey, TElement>(explicitDeclarationsHolder, memberPath, CustomizersHolder)); - keyMapping(new MapKeyRelationCustomizer<TKey>(explicitDeclarationsHolder, memberPath, CustomizersHolder)); - mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, memberPath, CustomizersHolder)); - MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property); - var memberOfPath = new PropertyPath(PropertyPath, memberOf); - collectionMapping(new MapPropertiesCustomizer<TEntity, TKey, TElement>(explicitDeclarationsHolder, memberOfPath, CustomizersHolder)); - keyMapping(new MapKeyRelationCustomizer<TKey>(explicitDeclarationsHolder, memberOfPath, CustomizersHolder)); - mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, memberOfPath, CustomizersHolder)); + RegisterMapMapping<TKey, TElement>(collectionMapping, keyMapping, mapping, member, memberOf); } + protected virtual void RegisterMapMapping<TKey, TElement>(Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<IMapKeyRelation<TKey>> keyMapping, Action<ICollectionElementRelation<TElement>> mapping, params MemberInfo[] members) + { + foreach (var member in members) + { + var memberPath = new PropertyPath(PropertyPath, member); + collectionMapping(new MapPropertiesCustomizer<TEntity, TKey, TElement>(explicitDeclarationsHolder, memberPath, CustomizersHolder)); + keyMapping(new MapKeyRelationCustomizer<TKey>(explicitDeclarationsHolder, memberPath, CustomizersHolder)); + mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, memberPath, CustomizersHolder)); + } + } + public void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) @@ -273,12 +331,122 @@ protected virtual void RegisterIdBagMapping<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)); + RegisterIdBagMapping<TElement>(collectionMapping, mapping, member, memberOf); } + + protected virtual void RegisterIdBagMapping<TElement>(Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping,params MemberInfo[] members) + { + foreach (var member in members) + { + collectionMapping(new IdBagPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, member), CustomizersHolder)); + mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder)); + } + } + + public void Set<TElement>(string notVidiblePropertyOrFieldName, Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) + { + MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); + RegisterSetMapping<TElement>(collectionMapping, mapping, member, memberOf); + } + + public void Set<TElement>(string notVidiblePropertyOrFieldName, Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping) + { + Set(notVidiblePropertyOrFieldName, collectionMapping, x => { }); + } + + public void Bag<TElement>(string notVidiblePropertyOrFieldName, Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) + { + MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); + RegisterBagMapping<TElement>(collectionMapping, mapping, member, memberOf); + } + + public void Bag<TElement>(string notVidiblePropertyOrFieldName, Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping) + { + Bag(notVidiblePropertyOrFieldName, collectionMapping, x => { }); + } + + public void List<TElement>(string notVidiblePropertyOrFieldName, Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) + { + MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); + RegisterListMapping<TElement>(collectionMapping, mapping, member, memberOf); + } + + public void List<TElement>(string notVidiblePropertyOrFieldName, Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping) + { + List(notVidiblePropertyOrFieldName, collectionMapping, x => { }); + } + + public void Map<TKey, TElement>(string notVidiblePropertyOrFieldName, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<IMapKeyRelation<TKey>> keyMapping, Action<ICollectionElementRelation<TElement>> mapping) + { + MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); + RegisterMapMapping<TKey, TElement>(collectionMapping, keyMapping, mapping, member, memberOf); + } + + public void Map<TKey, TElement>(string notVidiblePropertyOrFieldName, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) + { + Map(notVidiblePropertyOrFieldName, collectionMapping, x => { }, mapping); + } + + public void Map<TKey, TElement>(string notVidiblePropertyOrFieldName, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping) + { + Map(notVidiblePropertyOrFieldName, collectionMapping, x => { }, y => { }); + } + + public void IdBag<TElement>(string notVidiblePropertyOrFieldName, Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) + { + MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); + RegisterIdBagMapping<TElement>(collectionMapping, mapping, member, memberOf); + } + + public void IdBag<TElement>(string notVidiblePropertyOrFieldName, Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping) + { + IdBag(notVidiblePropertyOrFieldName, collectionMapping, x => { }); + } + + public void ManyToOne<TProperty>(string notVidiblePropertyOrFieldName, Action<IManyToOneMapper> mapping) where TProperty : class + { + MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); + RegisterManyToOneMapping<TProperty>(mapping, member, memberOf); + } + + public void Component<TComponent>(string notVidiblePropertyOrFieldName, Action<IComponentMapper<TComponent>> mapping) where TComponent : class + { + MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); + RegisterComponentMapping<TComponent>(mapping, member, memberOf); + } + + public void Component<TComponent>(string notVidiblePropertyOrFieldName) where TComponent : class + { + Component<TComponent>(notVidiblePropertyOrFieldName, x => { }); + } + + public void Component<TComponent>(string notVidiblePropertyOrFieldName, TComponent dynamicComponentTemplate, Action<IDynamicComponentMapper<TComponent>> mapping) where TComponent : class + { + MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); + RegisterDynamicComponentMapping<TComponent>(mapping, member, memberOf); + } + + public void Any<TProperty>(string notVidiblePropertyOrFieldName, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) where TProperty : class + { + MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); + RegisterAnyMapping<TProperty>(mapping, idTypeOfMetaType, member, memberOf); + } + + public void OneToOne<TProperty>(string notVidiblePropertyOrFieldName, Action<IOneToOneMapper> mapping) where TProperty : class + { + MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); + RegisterOneToOneMapping<TProperty>(mapping, member, memberOf); + } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/AllPropertiesRegistrationTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/AllPropertiesRegistrationTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/AllPropertiesRegistrationTests.cs 2011-04-29 21:16:22 UTC (rev 5790) @@ -0,0 +1,260 @@ +using System; +using System.Collections; +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 AllPropertiesRegistrationTests + { + private class MyClass + { + public int Id { get; set; } + private int simple; + public int Simple + { + get { return simple; } + set { simple = value; } + } + + private IList<string> complexType; + public IList<string> ComplexType + { + get { return complexType; } + set { complexType = value; } + } + + private IEnumerable<string> bag; + public IEnumerable<string> Bag + { + get { return bag; } + set { bag = value; } + } + + private IEnumerable<MyCompo> idBag; + public IEnumerable<MyCompo> IdBag + { + get { return idBag; } + set { idBag = value; } + } + + private IEnumerable<string> set; + public IEnumerable<string> Set + { + get { return set; } + set { set = value; } + } + + private IEnumerable<string> list; + public IEnumerable<string> List + { + get { return list; } + set { list = value; } + } + + private IDictionary<int, string> map; + public IDictionary<int, string> Map + { + get { return map; } + set { map = value; } + } + + private MyCompo compo; + public MyCompo Compo + { + get { return compo; } + set { compo = value; } + } + + private Related oneToOne; + public Related OneToOne + { + get { return oneToOne; } + set { oneToOne = value; } + } + + private Related manyToOne; + public Related ManyToOne + { + get { return manyToOne; } + set { manyToOne = value; } + } + + private object any; + public object Any + { + get { return any; } + set { any = value; } + } + + private IDictionary dynamicCompo; + public IDictionary DynamicCompo + { + get { return dynamicCompo; } + set { dynamicCompo = value; } + } + } + + private class MyCompo + { + public int Something { get; set; } + } + private class Related + { + public int Id { get; set; } + } + + private class Inherited:MyClass + { + + } + + [Test] + public void WhenMapPropertiesInTheInheritedThenMapInBase() + { + // without ignoring MyClass as root-class I will try to map all properties using the inherited class. + // NH have to recognize the case and, following Object-Relational-Mapping rules, map those properties in the base class. + // Where needed, using the SimpleModelInspector, the user can revert this behavior checking the DeclaringType and ReflectedType of the persistent member. + var mapper = new ModelMapper(); + mapper.Class<MyClass>(mc => mc.Id(x => x.Id)); + mapper.JoinedSubclass<Inherited>(mc => + { + mc.Property(x => x.Simple, map => map.Access(Accessor.Field)); + mc.Property(x => x.ComplexType, map => map.Access(Accessor.Field)); + mc.Bag(x => x.Bag, y => y.Access(Accessor.Field)); + mc.IdBag(x => x.IdBag, y => y.Access(Accessor.Field)); + mc.List(x => x.List, y => y.Access(Accessor.Field)); + mc.Set(x => x.Set, y => y.Access(Accessor.Field)); + mc.Map(x => x.Map, y => y.Access(Accessor.Field)); + mc.OneToOne(x => x.OneToOne, y => y.Access(Accessor.Field)); + mc.ManyToOne(x => x.ManyToOne, y => y.Access(Accessor.Field)); + mc.Any(x => x.Any, typeof(int), y => y.Access(Accessor.Field)); + mc.Component(x => x.DynamicCompo, new { A=2 }, y => y.Access(Accessor.Field)); + mc.Component(x => x.Compo, y => + { + y.Access(Accessor.Field); + y.Property(c => c.Something); + }); + }); + var mappings = mapper.CompileMappingForAllExplicitAddedEntities(); + var hbmClass = mappings.RootClasses[0]; + var hbmJoinedSubclass = mappings.JoinedSubclasses[0]; + hbmClass.Properties.Select(p => p.Name).Should().Have.SameValuesAs("Simple", "ComplexType", "Bag", "IdBag", "List", "Set", "Map", "Compo", "OneToOne", "ManyToOne", "Any", "DynamicCompo"); + hbmClass.Properties.Select(p => p.Access).All(x=> x.Satisfy(access=> access.Contains("field."))); + hbmJoinedSubclass.Properties.Should().Be.Empty(); + } + + [Test] + public void WhenMapPropertiesInTheBaseJumpedClassThenMapInInherited() + { + // ignoring MyClass and using Inherited, as root-class, I will try to map all properties using the base class. + // NH have to recognize the case and map those properties in the inherited. + var inspector = new SimpleModelInspector(); + inspector.IsRootEntity((type, declared) => type == typeof(Inherited)); + var mapper = new ModelMapper(); + mapper.Class<MyClass>(mc => + { + mc.Id(x => x.Id); + mc.Property(x => x.Simple, map => map.Access(Accessor.Field)); + mc.Property(x => x.ComplexType, map => map.Access(Accessor.Field)); + mc.Bag(x => x.Bag, y => y.Access(Accessor.Field)); + mc.IdBag(x => x.IdBag, y => y.Access(Accessor.Field)); + mc.List(x => x.List, y => y.Access(Accessor.Field)); + mc.Set(x => x.Set, y => y.Access(Accessor.Field)); + mc.Map(x => x.Map, y => y.Access(Accessor.Field)); + mc.OneToOne(x => x.OneToOne, y => y.Access(Accessor.Field)); + mc.ManyToOne(x => x.ManyToOne, y => y.Access(Accessor.Field)); + mc.Any(x => x.Any, typeof(int), y => y.Access(Accessor.Field)); + mc.Component(x => x.DynamicCompo, new { A = 2 }, y => y.Access(Accessor.Field)); + mc.Component(x => x.Compo, y => + { + y.Access(Accessor.Field); + y.Property(c => c.Something); + }); + }); + mapper.Class<Inherited>(mc =>{}); + + var mappings = mapper.CompileMappingForAllExplicitAddedEntities(); + var hbmClass = mappings.RootClasses[0]; + mappings.JoinedSubclasses.Should().Be.Empty(); + hbmClass.Properties.Select(p => p.Name).Should().Have.SameValuesAs("Simple", "ComplexType", "Bag", "IdBag", "List", "Set", "Map", "Compo", "OneToOne", "ManyToOne", "Any", "DynamicCompo"); + hbmClass.Properties.Select(p => p.Access).All(x => x.Satisfy(access => access.Contains("field."))); + } + + [Test] + public void WhenMapPropertiesInTheInheritedUsingMemberNameThenMapInBase() + { + // without ignoring MyClass as root-class I will try to map all properties using the inherited class. + // NH have to recognize the case and, following Object-Relational-Mapping rules, map those properties in the base class. + var mapper = new ModelMapper(); + mapper.Class<MyClass>(mc => mc.Id(x => x.Id)); + mapper.JoinedSubclass<Inherited>(mc => + { + mc.Property("Simple", map => map.Access(Accessor.Field)); + mc.Property("ComplexType", map => map.Access(Accessor.Field)); + mc.Bag<string>("Bag", y => y.Access(Accessor.Field)); + mc.IdBag<MyCompo>("IdBag", y => y.Access(Accessor.Field)); + mc.List<string>("List", y => y.Access(Accessor.Field)); + mc.Set<string>("Set", y => y.Access(Accessor.Field)); + mc.Map<int, string>("Map", y => y.Access(Accessor.Field)); + mc.OneToOne<Related>("OneToOne", y => y.Access(Accessor.Field)); + mc.ManyToOne<Related>("ManyToOne", y => y.Access(Accessor.Field)); + mc.Any<object>("Any", typeof(int), y => y.Access(Accessor.Field)); + mc.Component("DynamicCompo", new { A = 2 }, y => y.Access(Accessor.Field)); + mc.Component<MyCompo>("Compo", y => + { + y.Access(Accessor.Field); + y.Property(c => c.Something); + }); + }); + var mappings = mapper.CompileMappingForAllExplicitAddedEntities(); + var hbmClass = mappings.RootClasses[0]; + var hbmJoinedSubclass = mappings.JoinedSubclasses[0]; + hbmClass.Properties.Select(p => p.Name).Should().Have.SameValuesAs("Simple", "ComplexType", "Bag", "IdBag", "List", "Set", "Map", "Compo", "OneToOne", "ManyToOne", "Any", "DynamicCompo"); + hbmClass.Properties.Select(p => p.Access).All(x => x.Satisfy(access => access.Contains("field."))); + hbmJoinedSubclass.Properties.Should().Be.Empty(); + } + + [Test] + public void WhenMapPropertiesInTheBaseJumpedClassUsingMemberNameThenMapInInherited() + { + // ignoring MyClass and using Inherited, as root-class, I will try to map all properties using the base class. + // NH have to recognize the case and map those properties in the inherited. + var inspector = new SimpleModelInspector(); + inspector.IsRootEntity((type, declared) => type == typeof (Inherited)); + var mapper = new ModelMapper(); + mapper.Class<MyClass>(mc => + { + mc.Id(x => x.Id); + mc.Property("Simple", map => map.Access(Accessor.Field)); + mc.Property("ComplexType", map => map.Access(Accessor.Field)); + mc.Bag<string>("Bag", y => y.Access(Accessor.Field)); + mc.IdBag<MyCompo>("IdBag", y => y.Access(Accessor.Field)); + mc.List<string>("List", y => y.Access(Accessor.Field)); + mc.Set<string>("Set", y => y.Access(Accessor.Field)); + mc.Map<int, string>("Map", y => y.Access(Accessor.Field)); + mc.OneToOne<Related>("OneToOne", y => y.Access(Accessor.Field)); + mc.ManyToOne<Related>("ManyToOne", y => y.Access(Accessor.Field)); + mc.Any<object>("Any", typeof (int), y => y.Access(Accessor.Field)); + mc.Component("DynamicCompo", new {A = 2}, y => y.Access(Accessor.Field)); + mc.Component<MyCompo>("Compo", y => + { + y.Access(Accessor.Field); + y.Property(c => c.Something); + }); + }); + mapper.Class<Inherited>(mc => { }); + + HbmMapping mappings = mapper.CompileMappingForAllExplicitAddedEntities(); + HbmClass hbmClass = mappings.RootClasses[0]; + mappings.JoinedSubclasses.Should().Be.Empty(); + hbmClass.Properties.Select(p => p.Name).Should().Have.SameValuesAs("Simple", "ComplexType", "Bag", "IdBag", "List", "Set", "Map", "Compo", "OneToOne", "ManyToOne", "Any", + "DynamicCompo"); + hbmClass.Properties.Select(p => p.Access).All(x => x.Satisfy(access => access.Contains("field."))); + } + } +} \ 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-29 18:28:17 UTC (rev 5789) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-29 21:16:22 UTC (rev 5790) @@ -517,6 +517,7 @@ <Compile Include="MappingByCode\ConventionModelMapperTests\PropertyToFieldAccessorTest.cs" /> <Compile Include="MappingByCode\ConventionModelMapperTests\SafePoidTests.cs" /> <Compile Include="MappingByCode\ConventionModelMapperTests\VersionOnBaseClassIntegrationTest.cs" /> + <Compile Include="MappingByCode\ExpliticMappingTests\AllPropertiesRegistrationTests.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\BagOfNestedComponentsWithParentTest.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\ClassWithComponentsTest.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\ComponentAsIdTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-29 21:31:46
|
Revision: 5791 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5791&view=rev Author: fabiomaulo Date: 2011-04-29 21:31:40 +0000 (Fri, 29 Apr 2011) Log Message: ----------- Class Customizers with mapping of not visible id/version Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs 2011-04-29 21:16:22 UTC (rev 5790) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs 2011-04-29 21:31:40 UTC (rev 5791) @@ -40,10 +40,12 @@ { void Id<TProperty>(Expression<Func<TEntity, TProperty>> idProperty); void Id<TProperty>(Expression<Func<TEntity, TProperty>> idProperty, Action<IIdMapper> idMapper); - void Id(FieldInfo idProperty, Action<IIdMapper> idMapper); + void Id(string notVidiblePropertyOrFieldName, Action<IIdMapper> idMapper); void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty) where TComponent : class; void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty, Action<IComponentAsIdMapper<TComponent>> idMapper) where TComponent : class; + void ComponentAsId<TComponent>(string notVidiblePropertyOrFieldName) where TComponent : class; + void ComponentAsId<TComponent>(string notVidiblePropertyOrFieldName, Action<IComponentAsIdMapper<TComponent>> idMapper) where TComponent : class; void ComposedId(Action<IComposedIdMapper<TEntity>> idPropertiesMapping); @@ -54,6 +56,7 @@ void Schema(string schemaName); void Mutable(bool isMutable); void Version<TProperty>(Expression<Func<TEntity, TProperty>> versionProperty, Action<IVersionMapper> versionMapping); + void Version(string notVidiblePropertyOrFieldName, Action<IVersionMapper> versionMapping); void NaturalId(Action<IBasePlainPropertyContainerMapper<TEntity>> naturalIdPropertiesMapping, Action<INaturalIdAttributesMapper> naturalIdMapping); void NaturalId(Action<IBasePlainPropertyContainerMapper<TEntity>> naturalIdPropertiesMapping); void Cache(Action<ICacheMapper> cacheMapping); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs 2011-04-29 21:16:22 UTC (rev 5790) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs 2011-04-29 21:31:40 UTC (rev 5791) @@ -43,13 +43,15 @@ CustomizersHolder.AddCustomizer(typeof (TEntity), m => m.Id(member, idMapper)); } - public void Id(FieldInfo idProperty, Action<IIdMapper> idMapper) + public void Id(string notVidiblePropertyOrFieldName, Action<IIdMapper> idMapper) { - if (idProperty != null) + MemberInfo member = null; + if (notVidiblePropertyOrFieldName != null) { - ExplicitDeclarationsHolder.AddAsPoid(idProperty); + member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + ExplicitDeclarationsHolder.AddAsPoid(member); } - CustomizersHolder.AddCustomizer(typeof(TEntity), m => m.Id(idProperty, idMapper)); + CustomizersHolder.AddCustomizer(typeof(TEntity), m => m.Id(member, idMapper)); } public void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty) where TComponent : class @@ -64,6 +66,18 @@ idMapper(new ComponentAsIdCustomizer<TComponent>(ExplicitDeclarationsHolder, CustomizersHolder, propertyPath)); } + public void ComponentAsId<TComponent>(string notVidiblePropertyOrFieldName) where TComponent : class + { + ComponentAsId<TComponent>(notVidiblePropertyOrFieldName, x => { }); + } + + public void ComponentAsId<TComponent>(string notVidiblePropertyOrFieldName, Action<IComponentAsIdMapper<TComponent>> idMapper) where TComponent : class + { + var member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + var propertyPath = new PropertyPath(null, member); + idMapper(new ComponentAsIdCustomizer<TComponent>(ExplicitDeclarationsHolder, CustomizersHolder, propertyPath)); + } + public void ComposedId(Action<IComposedIdMapper<TEntity>> idPropertiesMapping) { idPropertiesMapping(new ComposedIdCustomizer<TEntity>(ExplicitDeclarationsHolder, CustomizersHolder)); @@ -110,6 +124,13 @@ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Version(member, versionMapping)); } + public void Version(string notVidiblePropertyOrFieldName, Action<IVersionMapper> versionMapping) + { + var member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + ExplicitDeclarationsHolder.AddAsVersionProperty(member); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Version(member, versionMapping)); + } + public void NaturalId(Action<IBasePlainPropertyContainerMapper<TEntity>> naturalIdPropertiesMapping, Action<INaturalIdAttributesMapper> naturalIdMapping) { naturalIdPropertiesMapping(new NaturalIdCustomizer<TEntity>(ExplicitDeclarationsHolder, CustomizersHolder)); Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs 2011-04-29 21:16:22 UTC (rev 5790) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs 2011-04-29 21:31:40 UTC (rev 5791) @@ -11,6 +11,7 @@ public class MyClass { private int id; + private int version; private string something; } @@ -20,11 +21,12 @@ var mapper = new ModelMapper(); mapper.Class<MyClass>(ca => { - ca.Id(ForClass<MyClass>.Field("id"), map => + ca.Id("id", map => { map.Column("MyClassId"); map.Generator(Generators.HighLow, gmap => gmap.Params(new { max_low = 100 })); }); + ca.Version("version", map => { }); ca.Property("something", map => map.Length(150)); }); var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) }); @@ -39,6 +41,8 @@ hbmGenerator.@class.Should().Be("hilo"); hbmGenerator.param[0].name.Should().Be("max_low"); hbmGenerator.param[0].GetText().Should().Be("100"); + var hbmVersion = hbmClass.Version; + hbmVersion.name.Should().Be("version"); var hbmProperty = hbmClass.Properties.OfType<HbmProperty>().Single(); hbmProperty.name.Should().Be("something"); hbmProperty.access.Should().Be("field"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-29 22:51:14
|
Revision: 5792 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5792&view=rev Author: fabiomaulo Date: 2011-04-29 22:51:08 +0000 (Fri, 29 Apr 2011) Log Message: ----------- not visible checking declared types Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/AllPropertiesRegistrationTests.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs 2011-04-29 21:31:40 UTC (rev 5791) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs 2011-04-29 22:51:08 UTC (rev 5792) @@ -18,6 +18,9 @@ throw new ArgumentNullException("explicitDeclarationsHolder"); } explicitDeclarationsHolder.AddAsRootEntity(typeof (TEntity)); + + // Add an empty customizer as a way to register the class as explicity declared + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => { }); } private Dictionary<string, IJoinMapper<TEntity>> JoinCustomizers Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-29 21:31:40 UTC (rev 5791) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-29 22:51:08 UTC (rev 5792) @@ -55,7 +55,7 @@ { // even seems repetitive, before unify this registration with the registration using Expression take in account that reflection operations // done unsing expressions are faster than those done with pure reflection. - MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName); MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); RegistePropertyMapping(mapping, member, memberOf); } @@ -346,7 +346,13 @@ public void Set<TElement>(string notVidiblePropertyOrFieldName, Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) { - MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName); + var collectionElementType = member.GetPropertyOrFieldType().DetermineCollectionElementType(); + if(!typeof(TElement).Equals(collectionElementType)) + { + throw new MappingException(string.Format("Wrong collection element type. For the property/field '{0}' of {1} was expected a collection of {2} but was {3}", + notVidiblePropertyOrFieldName, typeof (TEntity).FullName, typeof (TElement).Name, collectionElementType.Name)); + } MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); RegisterSetMapping<TElement>(collectionMapping, mapping, member, memberOf); } @@ -358,7 +364,13 @@ public void Bag<TElement>(string notVidiblePropertyOrFieldName, Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) { - MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName); + var collectionElementType = member.GetPropertyOrFieldType().DetermineCollectionElementType(); + if (!typeof(TElement).Equals(collectionElementType)) + { + throw new MappingException(string.Format("Wrong collection element type. For the property/field '{0}' of {1} was expected a collection of {2} but was {3}", + notVidiblePropertyOrFieldName, typeof(TEntity).FullName, typeof(TElement).Name, collectionElementType.Name)); + } MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); RegisterBagMapping<TElement>(collectionMapping, mapping, member, memberOf); } @@ -370,7 +382,13 @@ public void List<TElement>(string notVidiblePropertyOrFieldName, Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) { - MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName); + var collectionElementType = member.GetPropertyOrFieldType().DetermineCollectionElementType(); + if (!typeof(TElement).Equals(collectionElementType)) + { + throw new MappingException(string.Format("Wrong collection element type. For the property/field '{0}' of {1} was expected a collection of {2} but was {3}", + notVidiblePropertyOrFieldName, typeof(TEntity).FullName, typeof(TElement).Name, collectionElementType.Name)); + } MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); RegisterListMapping<TElement>(collectionMapping, mapping, member, memberOf); } @@ -382,7 +400,15 @@ public void Map<TKey, TElement>(string notVidiblePropertyOrFieldName, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<IMapKeyRelation<TKey>> keyMapping, Action<ICollectionElementRelation<TElement>> mapping) { - MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName); + var propertyOrFieldType = member.GetPropertyOrFieldType(); + var keyType = propertyOrFieldType.DetermineDictionaryKeyType(); + var collectionElementType = propertyOrFieldType.DetermineDictionaryValueType(); + if (!typeof(TElement).Equals(collectionElementType) || !typeof(TKey).Equals(keyType)) + { + throw new MappingException(string.Format("Wrong collection element type. For the property/field '{0}' of {1} was expected a dictionary of {2}/{3} but was {4}/{5}", + notVidiblePropertyOrFieldName, typeof(TEntity).FullName, typeof(TKey).Name, keyType.Name ,typeof(TElement).Name, collectionElementType.Name)); + } MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); RegisterMapMapping<TKey, TElement>(collectionMapping, keyMapping, mapping, member, memberOf); } @@ -399,7 +425,13 @@ public void IdBag<TElement>(string notVidiblePropertyOrFieldName, Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) { - MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName); + var collectionElementType = member.GetPropertyOrFieldType().DetermineCollectionElementType(); + if (!typeof(TElement).Equals(collectionElementType)) + { + throw new MappingException(string.Format("Wrong collection element type. For the property/field '{0}' of {1} was expected a collection of {2} but was {3}", + notVidiblePropertyOrFieldName, typeof(TEntity).FullName, typeof(TElement).Name, collectionElementType.Name)); + } MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); RegisterIdBagMapping<TElement>(collectionMapping, mapping, member, memberOf); } @@ -411,14 +443,26 @@ public void ManyToOne<TProperty>(string notVidiblePropertyOrFieldName, Action<IManyToOneMapper> mapping) where TProperty : class { - MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName); + var propertyOrFieldType = member.GetPropertyOrFieldType(); + if (!typeof(TProperty).Equals(propertyOrFieldType)) + { + throw new MappingException(string.Format("Wrong relation type. For the property/field '{0}' of {1} was expected a many-to-one with {2} but was {3}", + notVidiblePropertyOrFieldName, typeof(TEntity).FullName, typeof(TProperty).Name, propertyOrFieldType.Name)); + } MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); RegisterManyToOneMapping<TProperty>(mapping, member, memberOf); } public void Component<TComponent>(string notVidiblePropertyOrFieldName, Action<IComponentMapper<TComponent>> mapping) where TComponent : class { - MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName); + var propertyOrFieldType = member.GetPropertyOrFieldType(); + if (!typeof(TComponent).Equals(propertyOrFieldType)) + { + throw new MappingException(string.Format("Wrong relation type. For the property/field '{0}' of {1} was expected a component of {2} but was {3}", + notVidiblePropertyOrFieldName, typeof(TEntity).FullName, typeof(TComponent).Name, propertyOrFieldType.Name)); + } MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); RegisterComponentMapping<TComponent>(mapping, member, memberOf); } @@ -430,23 +474,45 @@ public void Component<TComponent>(string notVidiblePropertyOrFieldName, TComponent dynamicComponentTemplate, Action<IDynamicComponentMapper<TComponent>> mapping) where TComponent : class { - MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName); MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); RegisterDynamicComponentMapping<TComponent>(mapping, member, memberOf); } public void Any<TProperty>(string notVidiblePropertyOrFieldName, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) where TProperty : class { - MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName); + var propertyOrFieldType = member.GetPropertyOrFieldType(); + if (!typeof(TProperty).Equals(propertyOrFieldType)) + { + throw new MappingException(string.Format("Wrong relation type. For the property/field '{0}' of {1} was expected a heterogeneous (any) of type {2} but was {3}", + notVidiblePropertyOrFieldName, typeof(TEntity).FullName, typeof(TProperty).Name, propertyOrFieldType.Name)); + } MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); RegisterAnyMapping<TProperty>(mapping, idTypeOfMetaType, member, memberOf); } public void OneToOne<TProperty>(string notVidiblePropertyOrFieldName, Action<IOneToOneMapper> mapping) where TProperty : class { - MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName); + MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName); + var propertyOrFieldType = member.GetPropertyOrFieldType(); + if (!typeof(TProperty).Equals(propertyOrFieldType)) + { + throw new MappingException(string.Format("Wrong relation type. For the property/field '{0}' of {1} was expected a one-to-one with {2} but was {3}", + notVidiblePropertyOrFieldName, typeof(TEntity).FullName, typeof(TProperty).Name, propertyOrFieldType.Name)); + } MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity)); RegisterOneToOneMapping<TProperty>(mapping, member, memberOf); } + + public static MemberInfo GetPropertyOrFieldMatchingNameOrThrow(string memberName) + { + var result = typeof(TEntity).GetPropertyOrFieldMatchingName(memberName); + if (result == null) + { + throw new MappingException(string.Format("Member not found. The member '{0}' does not exists in type {1}", memberName, typeof(TEntity).FullName)); + } + return result; + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-29 21:31:40 UTC (rev 5791) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-29 22:51:08 UTC (rev 5792) @@ -214,10 +214,10 @@ BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; var modelInspector = (IModelInspector) this; - return !subject.IsEnum && !subject.Namespace.StartsWith("System") /* hack */&& !modelInspector.IsEntity(subject) - && - !subject.GetProperties(flattenHierarchyMembers).Cast<MemberInfo>().Concat( - subject.GetFields(flattenHierarchyMembers)).Any(m => modelInspector.IsPersistentId(m)); + return !subject.IsEnum && (subject.Namespace == null || !subject.Namespace.StartsWith("System")) /* hack */ + && !modelInspector.IsEntity(subject) + && !subject.GetProperties(flattenHierarchyMembers).Cast<MemberInfo>().Concat( + subject.GetFields(flattenHierarchyMembers)).Any(m => modelInspector.IsPersistentId(m)); } protected bool MatchEntity(System.Type subject) Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/AllPropertiesRegistrationTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/AllPropertiesRegistrationTests.cs 2011-04-29 21:31:40 UTC (rev 5791) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/AllPropertiesRegistrationTests.cs 2011-04-29 22:51:08 UTC (rev 5792) @@ -154,8 +154,9 @@ // ignoring MyClass and using Inherited, as root-class, I will try to map all properties using the base class. // NH have to recognize the case and map those properties in the inherited. var inspector = new SimpleModelInspector(); + inspector.IsEntity((type, declared) => type == typeof(Inherited)); inspector.IsRootEntity((type, declared) => type == typeof(Inherited)); - var mapper = new ModelMapper(); + var mapper = new ModelMapper(inspector); mapper.Class<MyClass>(mc => { mc.Id(x => x.Id); @@ -225,8 +226,9 @@ // ignoring MyClass and using Inherited, as root-class, I will try to map all properties using the base class. // NH have to recognize the case and map those properties in the inherited. var inspector = new SimpleModelInspector(); - inspector.IsRootEntity((type, declared) => type == typeof (Inherited)); - var mapper = new ModelMapper(); + inspector.IsEntity((type, declared) => type == typeof(Inherited)); + inspector.IsRootEntity((type, declared) => type == typeof(Inherited)); + var mapper = new ModelMapper(inspector); mapper.Class<MyClass>(mc => { mc.Id(x => x.Id); @@ -256,5 +258,126 @@ "DynamicCompo"); hbmClass.Properties.Select(p => p.Access).All(x => x.Satisfy(access => access.Contains("field."))); } + + [Test] + public void WhenMapBagWithWrongElementTypeThenThrows() + { + var mapper = new ModelMapper(); + Executing.This(() => + mapper.Class<MyClass>(mc => + { + mc.Id(x => x.Id); + mc.Bag<int>("Bag", y => y.Access(Accessor.Field)); + })).Should().Throw<MappingException>(); + } + + [Test] + public void WhenMapIdBagWithWrongElementTypeThenThrows() + { + var mapper = new ModelMapper(); + Executing.This(() => + mapper.Class<MyClass>(mc => + { + mc.Id(x => x.Id); + mc.IdBag<int>("IdBag", y => y.Access(Accessor.Field)); + })).Should().Throw<MappingException>(); + } + + [Test] + public void WhenMapSetWithWrongElementTypeThenThrows() + { + var mapper = new ModelMapper(); + Executing.This(() => + mapper.Class<MyClass>(mc => + { + mc.Id(x => x.Id); + mc.Set<int>("Set", y => y.Access(Accessor.Field)); + })).Should().Throw<MappingException>(); + } + + [Test] + public void WhenMapListWithWrongElementTypeThenThrows() + { + var mapper = new ModelMapper(); + Executing.This(() => + mapper.Class<MyClass>(mc => + { + mc.Id(x => x.Id); + mc.Set<int>("Set", y => y.Access(Accessor.Field)); + })).Should().Throw<MappingException>(); + } + + [Test] + public void WhenMapDictionaryWithWrongKeyTypeThenThrows() + { + var mapper = new ModelMapper(); + Executing.This(() => + mapper.Class<MyClass>(mc => + { + mc.Id(x => x.Id); + mc.Map<string, string>("Map", y => y.Access(Accessor.Field)); + })).Should().Throw<MappingException>(); + } + + [Test] + public void WhenMapDictionaryWithWrongValueTypeThenThrows() + { + var mapper = new ModelMapper(); + Executing.This(() => + mapper.Class<MyClass>(mc => + { + mc.Id(x => x.Id); + mc.Map<int, int>("Map", y => y.Access(Accessor.Field)); + })).Should().Throw<MappingException>(); + } + + [Test] + public void WhenMapComponentWithWrongElementTypeThenThrows() + { + var mapper = new ModelMapper(); + Executing.This(() => + mapper.Class<MyClass>(mc => + { + mc.Id(x => x.Id); + mc.Component<object>("Compo", y => y.Access(Accessor.Field)); + })).Should().Throw<MappingException>(); + } + + + [Test] + public void WhenMapOneToOneWithWrongTypeThenThrows() + { + var mapper = new ModelMapper(); + Executing.This(() => + mapper.Class<MyClass>(mc => + { + mc.Id(x => x.Id); + mc.OneToOne<object>("OneToOne", y => y.Access(Accessor.Field)); + })).Should().Throw<MappingException>(); + } + + [Test] + public void WhenMapManyToOneWithWrongTypeThenThrows() + { + var mapper = new ModelMapper(); + Executing.This(() => + mapper.Class<MyClass>(mc => + { + mc.Id(x => x.Id); + mc.ManyToOne<object>("ManyToOne", y => y.Access(Accessor.Field)); + })).Should().Throw<MappingException>(); + } + + [Test] + public void WhenMapAnyWithWrongTypeThenThrows() + { + var mapper = new ModelMapper(); + Executing.This(() => + mapper.Class<MyClass>(mc => + { + mc.Id(x => x.Id); + mc.Any<Related>("Any", typeof(int),y => y.Access(Accessor.Field)); + })).Should().Throw<MappingException>(); + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs 2011-04-29 21:31:40 UTC (rev 5791) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs 2011-04-29 22:51:08 UTC (rev 5792) @@ -48,5 +48,16 @@ hbmProperty.access.Should().Be("field"); hbmProperty.length.Should().Be("150"); } + + [Test] + public void WhenPrivateMemberDoesNotExistsThenThrow() + { + var mapper = new ModelMapper(); + Executing.This(() => + mapper.Class<MyClass>(ca => + { + ca.Property("pizza", map => map.Length(150)); + })).Should().Throw<MappingException>(); + } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-05-02 14:09:06
|
Revision: 5793 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5793&view=rev Author: fabiomaulo Date: 2011-05-02 14:08:59 +0000 (Mon, 02 May 2011) Log Message: ----------- Fix NH-2673, NH-1090, NH-1344 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cache/QueryKey.cs trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs trunk/nhibernate/src/NHibernate/Cfg/Loquacious/CacheConfiguration.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Loader/QueryLoader.cs trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs trunk/nhibernate/src/NHibernate/Loader/Custom/CustomLoader.cs trunk/nhibernate/src/NHibernate/Loader/Loader.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2673/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2673/Blog.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2673/CachingWithTrasformerTests.cs Modified: trunk/nhibernate/src/NHibernate/Cache/QueryKey.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cache/QueryKey.cs 2011-04-29 22:51:08 UTC (rev 5792) +++ trunk/nhibernate/src/NHibernate/Cache/QueryKey.cs 2011-05-02 14:08:59 UTC (rev 5793) @@ -61,6 +61,11 @@ hashCode = ComputeHashCode(); } + public bool HasResultTrasformer + { + get { return customTransformer != null; } + } + public QueryKey SetFirstRows(int[] firstRows) { multiQueriesFirstRows = firstRows; Modified: trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs 2011-04-29 22:51:08 UTC (rev 5792) +++ trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs 2011-05-02 14:08:59 UTC (rev 5793) @@ -77,7 +77,7 @@ IList cacheable = new List<object>(result.Count + 1) {ts}; for (int i = 0; i < result.Count; i++) { - if (returnTypes.Length == 1) + if (returnTypes.Length == 1 && !key.HasResultTrasformer) { cacheable.Add(returnTypes[0].Disassemble(result[i], session, null)); } Modified: trunk/nhibernate/src/NHibernate/Cfg/Loquacious/CacheConfiguration.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Loquacious/CacheConfiguration.cs 2011-04-29 22:51:08 UTC (rev 5792) +++ trunk/nhibernate/src/NHibernate/Cfg/Loquacious/CacheConfiguration.cs 2011-05-02 14:08:59 UTC (rev 5793) @@ -35,15 +35,21 @@ public void Provider<TProvider>() where TProvider : ICacheProvider { - cfg.SetProperty(Environment.CacheProvider, typeof (TProvider).AssemblyQualifiedName); + UseSecondLevelCache = true; + cfg.SetProperty(Environment.CacheProvider, typeof(TProvider).AssemblyQualifiedName); } public void QueryCache<TFactory>() where TFactory : IQueryCache { + UseSecondLevelCache = true; UseQueryCache = true; cfg.SetProperty(Environment.QueryCacheFactory, typeof(TFactory).AssemblyQualifiedName); } + private bool UseSecondLevelCache + { + set { cfg.SetProperty(Environment.UseSecondLevelCache, value.ToString().ToLowerInvariant()); } + } #endregion } @@ -66,6 +72,7 @@ public ICacheConfiguration Through<TProvider>() where TProvider : ICacheProvider { + fc.Configuration.SetProperty(Environment.UseSecondLevelCache, "true"); fc.Configuration.SetProperty(Environment.CacheProvider, typeof(TProvider).AssemblyQualifiedName); return this; } @@ -106,6 +113,8 @@ public ICacheConfiguration Through<TFactory>() where TFactory : IQueryCache { + cc.Configuration.SetProperty(Environment.UseSecondLevelCache, "true"); + cc.Configuration.SetProperty(Environment.UseQueryCache, "true"); cc.Configuration.SetProperty(Environment.QueryCacheFactory, typeof(TFactory).AssemblyQualifiedName); return cc; } Modified: trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Loader/QueryLoader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Loader/QueryLoader.cs 2011-04-29 22:51:08 UTC (rev 5792) +++ trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Loader/QueryLoader.cs 2011-05-02 14:08:59 UTC (rev 5793) @@ -300,7 +300,7 @@ return List(session, queryParameters, _queryTranslator.QuerySpaces, _queryReturnTypes); } - protected override IList GetResultList(IList results, IResultTransformer resultTransformer) + public override IList GetResultList(IList results, IResultTransformer resultTransformer) { // meant to handle dynamic instantiation queries... HolderInstantiator holderInstantiator = HolderInstantiator.GetHolderInstantiator(_selectNewTransformer, Modified: trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs 2011-04-29 22:51:08 UTC (rev 5792) +++ trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs 2011-05-02 14:08:59 UTC (rev 5793) @@ -1512,7 +1512,7 @@ } } - protected override IList GetResultList(IList results, IResultTransformer resultTransformer) + public override IList GetResultList(IList results, IResultTransformer resultTransformer) { HolderInstantiator holderInstantiator = HolderInstantiator.CreateClassicHolderInstantiator(holderConstructor, resultTransformer); Modified: trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2011-04-29 22:51:08 UTC (rev 5792) +++ trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2011-05-02 14:08:59 UTC (rev 5793) @@ -26,7 +26,7 @@ private int timeout = RowSelection.NoValue; private int fetchSize = RowSelection.NoValue; private ISessionImplementor session; - private IResultTransformer resultTransformer = CriteriaSpecification.RootEntity; + private IResultTransformer resultTransformer; private bool cacheable; private string cacheRegion; private CacheMode? cacheMode; Modified: trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2011-04-29 22:51:08 UTC (rev 5792) +++ trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2011-05-02 14:08:59 UTC (rev 5793) @@ -14,6 +14,7 @@ using NHibernate.SqlCommand; using NHibernate.Transform; using NHibernate.Type; +using NHibernate.Util; namespace NHibernate.Impl { @@ -91,7 +92,6 @@ } } - private IList ListUsingQueryCache() { IQueryCache queryCache = session.Factory.GetQueryCache(cacheRegion); @@ -141,21 +141,28 @@ protected virtual IList GetResultList(IList results) { - if (resultTransformer != null) + for (int i = 0; i < loaders.Count; i++) { - for (int i = 0; i < results.Count; i++) + CriteriaLoader loader = loaders[i]; + results[i] = loader.GetResultList((IList)results[i], parameters[i].ResultTransformer); + IList tmpResults; + if (resultCollectionGenericType[i] == typeof (object)) { - results[i] = resultTransformer.TransformList((IList)results[i]); + tmpResults = new ArrayList(); } + else + { + tmpResults = (IList) Activator.CreateInstance(typeof (List<>).MakeGenericType(resultCollectionGenericType[i])); + } + ArrayHelper.AddAll(tmpResults, (IList)results[i]); + + results[i] = tmpResults; } - else + if (resultTransformer != null) { for (int i = 0; i < results.Count; i++) { - CriteriaImpl critImp = criteriaQueries[i] as CriteriaImpl; - if (critImp == null || critImp.ResultTransformer == null) - continue; - results[i] = critImp.ResultTransformer.TransformList((IList)results[i]); + results[i] = resultTransformer.TransformList((IList)results[i]); } } return results; @@ -205,15 +212,7 @@ hydratedObjects[i] = entitySpan == 0 ? null : new ArrayList(entitySpan); EntityKey[] keys = new EntityKey[entitySpan]; QueryParameters queryParameters = parameters[i]; - IList tmpResults; - if (resultCollectionGenericType[i] == typeof(object)) - { - tmpResults = new ArrayList(); - } - else - { - tmpResults = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(resultCollectionGenericType[i])); - } + IList tmpResults = new ArrayList(); RowSelection selection = parameters[i].RowSelection; createSubselects[i] = loader.IsSubselectLoadingEnabled; @@ -238,6 +237,7 @@ } tmpResults.Add(o); } + results.Add(tmpResults); reader.NextResult(); } Modified: trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2011-04-29 22:51:08 UTC (rev 5792) +++ trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2011-05-02 14:08:59 UTC (rev 5793) @@ -453,7 +453,8 @@ for (int i = 0; i < len; ++i) { // First use the transformer of each query transformig each row and then the list - results[i] = GetTransformedResults((IList)results[i], GetQueryHolderInstantiator(i)); + // DONE: The behavior when the query has a 'new' istead a trasformer is delegated to the Loader + results[i] = translators[i].Loader.GetResultList((IList)results[i], Parameters[i].ResultTransformer); // then use the MultiQueryTransformer (if it has some sense...) using, as source, the transformed result. results[i] = GetTransformedResults((IList)results[i], multiqueryHolderInstatiator); } @@ -475,15 +476,6 @@ return holderInstantiator.ResultTransformer.TransformList(source); } - private HolderInstantiator GetQueryHolderInstantiator(int queryPosition) - { - // TODO : we need a test to check the behavior when the query has a 'new' istead a trasformer - // we should take the HolderInstantiator directly from QueryTranslator... taking care with Parameters. - return Parameters[queryPosition].ResultTransformer != null ? - new HolderInstantiator(Parameters[queryPosition].ResultTransformer, translators[queryPosition].ReturnAliases) - : HolderInstantiator.NoopInstantiator; - } - private HolderInstantiator GetMultiQueryHolderInstatiator() { return HasMultiQueryResultTrasformer() ? new HolderInstantiator(resultTransformer, null) : HolderInstantiator.NoopInstantiator; Modified: trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs 2011-04-29 22:51:08 UTC (rev 5792) +++ trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs 2011-05-02 14:08:59 UTC (rev 5793) @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Data; using Iesi.Collections.Generic; +using NHibernate.Criterion; using NHibernate.Engine; using NHibernate.Impl; using NHibernate.Persister.Entity; @@ -78,7 +79,6 @@ ISessionImplementor session) { object[] result; - string[] aliases; if (translator.HasProjection) { @@ -101,14 +101,17 @@ } position += numColumns; } - aliases = translator.ProjectedAliases; } else { result = row; - aliases = userAliases; } - return translator.RootCriteria.ResultTransformer.TransformTuple(result, aliases); + + if (resultTransformer == null && result.Length == 1) + { + return result[0]; + } + return result; } protected override SqlString ApplyLocks(SqlString sqlSelectString, IDictionary<string, LockMode> lockModes, @@ -161,9 +164,20 @@ return lockModesArray; } - protected override IList GetResultList(IList results, IResultTransformer resultTransformer) + public override IList GetResultList(IList results, IResultTransformer resultTransformer) { - return translator.RootCriteria.ResultTransformer.TransformList(results); + var transformer = resultTransformer ?? CriteriaSpecification.RootEntity; + for (int i = 0; i < results.Count; i++) + { + var row = results[i] as object[]; + if(row == null) + { + row = new object[] { results[i] }; + } + object result = transformer.TransformTuple(row, translator.HasProjection ? translator.ProjectedAliases : userAliases); + results[i] = result; + } + return transformer.TransformList(results); } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Loader/Custom/CustomLoader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Custom/CustomLoader.cs 2011-04-29 22:51:08 UTC (rev 5792) +++ trunk/nhibernate/src/NHibernate/Loader/Custom/CustomLoader.cs 2011-05-02 14:08:59 UTC (rev 5793) @@ -280,7 +280,7 @@ return rowProcessor.BuildResultRow(row, rs, resultTransformer != null, session); } - protected override IList GetResultList(IList results, IResultTransformer resultTransformer) + public override IList GetResultList(IList results, IResultTransformer resultTransformer) { // meant to handle dynamic instantiation queries...(Copy from QueryLoader) HolderInstantiator holderInstantiator = Modified: trunk/nhibernate/src/NHibernate/Loader/Loader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2011-04-29 22:51:08 UTC (rev 5792) +++ trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2011-05-02 14:08:59 UTC (rev 5793) @@ -628,7 +628,7 @@ collectionPersister); } - protected virtual IList GetResultList(IList results, IResultTransformer resultTransformer) + public virtual IList GetResultList(IList results, IResultTransformer resultTransformer) { return results; } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2673/Blog.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2673/Blog.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2673/Blog.cs 2011-05-02 14:08:59 UTC (rev 5793) @@ -0,0 +1,34 @@ +using Iesi.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.NH2673 +{ + public class Blog + { + public Blog() + { + Posts = new HashedSet<Post>(); + Comments = new HashedSet<Comment>(); + } + + public virtual int Id { get; set; } + public virtual string Author { get; set; } + public virtual string Name { get; set; } + public virtual ISet<Post> Posts { get; set; } + public virtual ISet<Comment> Comments { get; set; } + } + + public class Post + { + public virtual int Id { get; protected set; } + public virtual string Title { get; set; } + public virtual string Body { get; set; } + } + + + public class Comment + { + public virtual int Id { get; protected set; } + public virtual string Title { get; set; } + public virtual string Body { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2673/CachingWithTrasformerTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2673/CachingWithTrasformerTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2673/CachingWithTrasformerTests.cs 2011-05-02 14:08:59 UTC (rev 5793) @@ -0,0 +1,157 @@ +using System; +using System.Collections; +using NHibernate.Cache; +using NHibernate.Cfg; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Transform; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2673 +{ + public class CachingWithTrasformerTests: TestCaseMappingByCode + { + protected override HbmMapping GetMappings() + { + var mapper = new ConventionModelMapper(); + mapper.BeforeMapClass += (inspector, type, map) => map.Id(x => x.Generator(Generators.HighLow)); + mapper.BeforeMapClass += (inspector, type, map) => map.Cache(x => x.Usage(CacheUsage.ReadWrite)); + mapper.BeforeMapSet += (inspector, property, map) => + { + map.Cascade(Mapping.ByCode.Cascade.All); + map.Cache(x => x.Usage(CacheUsage.ReadWrite)); + }; + var mapping = mapper.CompileMappingFor(new[] { typeof(Blog), typeof(Post), typeof(Comment) }); + return mapping; + } + + protected override void Configure(Cfg.Configuration configuration) + { + configuration.Cache(x => + { + x.Provider<HashtableCacheProvider>(); + x.UseQueryCache = true; + }); + } + + private class Scenario: IDisposable + { + private readonly ISessionFactory factory; + + public Scenario(ISessionFactory factory) + { + this.factory = factory; + using (var session= factory.OpenSession()) + using (var tx = session.BeginTransaction()) + { + var blog = new Blog { Author = "Gabriel", Name = "Keep on running" }; + blog.Posts.Add(new Post { Title = "First post", Body = "Some text" }); + blog.Posts.Add(new Post { Title = "Second post", Body = "Some other text" }); + blog.Posts.Add(new Post { Title = "Third post", Body = "Third post text" }); + + + blog.Comments.Add(new Comment { Title = "First comment", Body = "Some text" }); + blog.Comments.Add(new Comment { Title = "Second comment", Body = "Some other text" }); + session.Save(blog); + tx.Commit(); + } + } + + public void Dispose() + { + using (var session = factory.OpenSession()) + using (var tx = session.BeginTransaction()) + { + session.CreateQuery("delete from Comment").ExecuteUpdate(); + session.CreateQuery("delete from Post").ExecuteUpdate(); + session.CreateQuery("delete from Blog").ExecuteUpdate(); + tx.Commit(); + } + } + } + + [Test] + public void WhenQueryThenNotThrows() + { + using (new Scenario(Sfi)) + { + using (var session = OpenSession()) + using (var tx = session.BeginTransaction()) + { + var query = session.CreateQuery("from Blog b where b.Author = : author") + .SetString("author", "Gabriel") + .SetCacheable(true) + .SetResultTransformer(new DistinctRootEntityResultTransformer()); + query.Executing(q=> q.List<Blog>()).NotThrows(); + tx.Commit(); + } + } + } + + [Test] + public void WhenCriteriaThenNotThrows() + { + using (new Scenario(Sfi)) + { + using (var session = OpenSession()) + using (var tx = session.BeginTransaction()) + { + var query = session.QueryOver<Blog>().Where(x => x.Author == "Gabriel") + .TransformUsing(new DistinctRootEntityResultTransformer()) + .Cacheable(); + query.Executing(q => q.List<Blog>()).NotThrows(); + tx.Commit(); + } + } + } + + private class BlogAuthorDto + { + public string BlogName { get; set; } + public string AuthorName { get; set; } + } + + private class BlogAuthorTrasformer : IResultTransformer + { + public object TransformTuple(object[] tuple, string[] aliases) + { + return new BlogAuthorDto { BlogName = tuple[0].ToString(), AuthorName = tuple[1].ToString() }; + } + + public IList TransformList(IList collection) + { + return collection; + } + } + + [Test] + public void WhenCriteriaProjectionThenNotThrows() + { + // during the fix of NH-2673 was faund another bug related to cacheability of criteria with projection + trasformer + // then found reported as NH-1090 + var transformer = new BlogAuthorTrasformer(); + using (new Scenario(Sfi)) + { + using (var session = OpenSession()) + using (var tx = session.BeginTransaction()) + { + var query = session.QueryOver<Blog>().Select(x=> x.Author, x=> x.Name).Where(x => x.Author == "Gabriel") + .TransformUsing(transformer) + .Cacheable(); + query.List<BlogAuthorDto>(); + tx.Commit(); + } + using (var session = OpenSession()) + using (var tx = session.BeginTransaction()) + { + var query = session.QueryOver<Blog>().Select(x => x.Author, x => x.Name).Where(x => x.Author == "Gabriel") + .TransformUsing(transformer) + .Cacheable(); + query.Executing(q => q.List<BlogAuthorDto>()).NotThrows(); + tx.Commit(); + } + } + } + } +} \ 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-29 22:51:08 UTC (rev 5792) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-02 14:08:59 UTC (rev 5793) @@ -810,6 +810,8 @@ <Compile Include="NHSpecificTest\NH2632\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2660And2661\DomainClass.cs" /> <Compile Include="NHSpecificTest\NH2660And2661\Test.cs" /> + <Compile Include="NHSpecificTest\NH2673\Blog.cs" /> + <Compile Include="NHSpecificTest\NH2673\CachingWithTrasformerTests.cs" /> <Compile Include="NHSpecificTest\Properties\CompositePropertyRefTest.cs" /> <Compile Include="NHSpecificTest\Properties\DynamicEntityTest.cs" /> <Compile Include="NHSpecificTest\Properties\Model.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-05-02 14:27:05
|
Revision: 5794 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5794&view=rev Author: fabiomaulo Date: 2011-05-02 14:26:59 +0000 (Mon, 02 May 2011) Log Message: ----------- Fix NH-2685 and any other possible not safe call to the logger Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Logging.cs trunk/nhibernate/src/NHibernate.Test/Logging/Log4NetLoggerTest.cs Modified: trunk/nhibernate/src/NHibernate/Logging.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Logging.cs 2011-05-02 14:08:59 UTC (rev 5793) +++ trunk/nhibernate/src/NHibernate/Logging.cs 2011-05-02 14:26:59 UTC (rev 5794) @@ -374,72 +374,86 @@ public void Error(object message) { - ErrorDelegate(logger, message); + if (IsErrorEnabled) + ErrorDelegate(logger, message); } public void Error(object message, Exception exception) { - ErrorExceptionDelegate(logger,message,exception); + if (IsErrorEnabled) + ErrorExceptionDelegate(logger, message, exception); } public void ErrorFormat(string format, params object[] args) { - ErrorFormatDelegate(logger, format, args); + if (IsErrorEnabled) + ErrorFormatDelegate(logger, format, args); } public void Fatal(object message) { - FatalDelegate(logger, message); + if (IsFatalEnabled) + FatalDelegate(logger, message); } public void Fatal(object message, Exception exception) { - FatalExceptionDelegate(logger,message,exception); + if (IsFatalEnabled) + FatalExceptionDelegate(logger, message, exception); } public void Debug(object message) { - DebugDelegate(logger, message); + if (IsDebugEnabled) + DebugDelegate(logger, message); } public void Debug(object message, Exception exception) { - DebugExceptionDelegate(logger, message, exception); + if (IsDebugEnabled) + DebugExceptionDelegate(logger, message, exception); } public void DebugFormat(string format, params object[] args) { - DebugFormatDelegate(logger, format, args); + if (IsDebugEnabled) + DebugFormatDelegate(logger, format, args); } public void Info(object message) { - InfoDelegate(logger, message); + if (IsInfoEnabled) + InfoDelegate(logger, message); } public void Info(object message, Exception exception) { - InfoExceptionDelegate(logger, message, exception); + if (IsInfoEnabled) + InfoExceptionDelegate(logger, message, exception); } public void InfoFormat(string format, params object[] args) { - InfoFormatDelegate(logger, format, args); + if (IsInfoEnabled) + InfoFormatDelegate(logger, format, args); } public void Warn(object message) { - WarnDelegate(logger, message); + if (IsWarnEnabled) + WarnDelegate(logger, message); } public void Warn(object message, Exception exception) { - WarnExceptionDelegate(logger, message, exception); + if (IsWarnEnabled) + WarnExceptionDelegate(logger, message, exception); } public void WarnFormat(string format, params object[] args) { - WarnFormatDelegate(logger, format, args); + if (IsWarnEnabled) + WarnFormatDelegate(logger, format, args); } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/Logging/Log4NetLoggerTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Logging/Log4NetLoggerTest.cs 2011-05-02 14:08:59 UTC (rev 5793) +++ trunk/nhibernate/src/NHibernate.Test/Logging/Log4NetLoggerTest.cs 2011-05-02 14:26:59 UTC (rev 5794) @@ -214,7 +214,7 @@ get { isDebugEnabled++; - return false; + return true; } } @@ -223,7 +223,7 @@ get { isInfoEnabled++; - return false; + return true; } } @@ -232,7 +232,7 @@ get { isWarnEnabled++; - return false; + return true; } } @@ -241,7 +241,7 @@ get { isErrorEnabled++; - return false; + return true; } } @@ -250,7 +250,7 @@ get { isFatalEnabled++; - return false; + return true; } } } @@ -299,11 +299,11 @@ logMock.errorFormat.Should().Be(1); logMock.fatal.Should().Be(1); logMock.fatalException.Should().Be(1); - logMock.isDebugEnabled.Should().Be(1); - logMock.isInfoEnabled.Should().Be(1); - logMock.isWarnEnabled.Should().Be(1); - logMock.isErrorEnabled.Should().Be(1); - logMock.isFatalEnabled.Should().Be(1); + logMock.isDebugEnabled.Should().Be.GreaterThan(1); + logMock.isInfoEnabled.Should().Be.GreaterThan(1); + logMock.isWarnEnabled.Should().Be.GreaterThan(1); + logMock.isErrorEnabled.Should().Be.GreaterThan(1); + logMock.isFatalEnabled.Should().Be.GreaterThan(1); } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-05-02 15:41:59
|
Revision: 5795 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5795&view=rev Author: fabiomaulo Date: 2011-05-02 15:41:52 +0000 (Mon, 02 May 2011) Log Message: ----------- Fixed NH-2686 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Linq/ResultTransformer.cs trunk/nhibernate/src/NHibernate/Transform/AliasToBeanConstructorResultTransformer.cs trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs trunk/nhibernate/src/NHibernate/Transform/AliasToEntityMapResultTransformer.cs trunk/nhibernate/src/NHibernate/Transform/DistinctRootEntityResultTransformer.cs trunk/nhibernate/src/NHibernate/Transform/PassThroughResultTransformer.cs trunk/nhibernate/src/NHibernate/Transform/RootEntityResultTransformer.cs trunk/nhibernate/src/NHibernate/Transform/ToListResultTransformer.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/TransformTests/ImplementationOfEqualityTests.cs Modified: trunk/nhibernate/src/NHibernate/Linq/ResultTransformer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/ResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794) +++ trunk/nhibernate/src/NHibernate/Linq/ResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795) @@ -57,5 +57,33 @@ var list = new ArrayList {transformResult}; return list; } + + public bool Equals(ResultTransformer other) + { + if (ReferenceEquals(null, other)) + { + return false; + } + if (ReferenceEquals(this, other)) + { + return true; + } + return Equals(other._listTransformation, _listTransformation) && Equals(other._itemTransformation, _itemTransformation); + } + + public override bool Equals(object obj) + { + return Equals(obj as ResultTransformer); + } + + public override int GetHashCode() + { + unchecked + { + var lt = (_listTransformation != null ? _listTransformation.GetHashCode() : 0); + var it = (_itemTransformation != null ? _itemTransformation.GetHashCode() : 0); + return (lt * 397) ^ (it * 17); + } + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Transform/AliasToBeanConstructorResultTransformer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transform/AliasToBeanConstructorResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794) +++ trunk/nhibernate/src/NHibernate/Transform/AliasToBeanConstructorResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795) @@ -7,10 +7,14 @@ [Serializable] public class AliasToBeanConstructorResultTransformer : IResultTransformer { - private ConstructorInfo constructor; + private readonly ConstructorInfo constructor; public AliasToBeanConstructorResultTransformer(ConstructorInfo constructor) { + if (constructor == null) + { + throw new ArgumentNullException("constructor"); + } this.constructor = constructor; } @@ -33,5 +37,28 @@ { return collection; } + + public bool Equals(AliasToBeanConstructorResultTransformer other) + { + if (ReferenceEquals(null, other)) + { + return false; + } + if (ReferenceEquals(this, other)) + { + return true; + } + return Equals(other.constructor, constructor); + } + + public override bool Equals(object obj) + { + return Equals(obj as AliasToBeanConstructorResultTransformer); + } + + public override int GetHashCode() + { + return constructor.GetHashCode(); + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794) +++ trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795) @@ -111,5 +111,28 @@ { return collection; } + + public override bool Equals(object obj) + { + return Equals(obj as AliasToBeanResultTransformer); + } + + public bool Equals(AliasToBeanResultTransformer other) + { + if (ReferenceEquals(null, other)) + { + return false; + } + if (ReferenceEquals(this, other)) + { + return true; + } + return Equals(other.resultClass, resultClass); + } + + public override int GetHashCode() + { + return resultClass.GetHashCode(); + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Transform/AliasToEntityMapResultTransformer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transform/AliasToEntityMapResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794) +++ trunk/nhibernate/src/NHibernate/Transform/AliasToEntityMapResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795) @@ -6,6 +6,8 @@ [Serializable] public class AliasToEntityMapResultTransformer : IResultTransformer { + private static readonly object Hasher = new object(); + public object TransformTuple(object[] tuple, string[] aliases) { IDictionary result = new Hashtable(); @@ -26,5 +28,19 @@ { return collection; } + + public override bool Equals(object obj) + { + if (obj == null) + { + return false; + } + return obj.GetHashCode() == Hasher.GetHashCode(); + } + + public override int GetHashCode() + { + return Hasher.GetHashCode(); + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Transform/DistinctRootEntityResultTransformer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transform/DistinctRootEntityResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794) +++ trunk/nhibernate/src/NHibernate/Transform/DistinctRootEntityResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795) @@ -10,6 +10,7 @@ public class DistinctRootEntityResultTransformer : IResultTransformer { private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(DistinctRootEntityResultTransformer)); + private static readonly object Hasher = new object(); internal sealed class Identity { @@ -58,5 +59,19 @@ } return result; } + + public override bool Equals(object obj) + { + if (obj == null) + { + return false; + } + return obj.GetHashCode() == Hasher.GetHashCode(); + } + + public override int GetHashCode() + { + return Hasher.GetHashCode(); + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Transform/PassThroughResultTransformer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transform/PassThroughResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794) +++ trunk/nhibernate/src/NHibernate/Transform/PassThroughResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795) @@ -6,6 +6,8 @@ [Serializable] public class PassThroughResultTransformer : IResultTransformer { + private static readonly object Hasher = new object(); + #region IResultTransformer Members public object TransformTuple(object[] tuple, string[] aliases) @@ -19,5 +21,19 @@ } #endregion + + public override bool Equals(object obj) + { + if (obj == null) + { + return false; + } + return obj.GetHashCode() == Hasher.GetHashCode(); + } + + public override int GetHashCode() + { + return Hasher.GetHashCode(); + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Transform/RootEntityResultTransformer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transform/RootEntityResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794) +++ trunk/nhibernate/src/NHibernate/Transform/RootEntityResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795) @@ -6,6 +6,8 @@ [Serializable] public class RootEntityResultTransformer : IResultTransformer { + private static readonly object Hasher = new object(); + public object TransformTuple(object[] tuple, string[] aliases) { return tuple[tuple.Length - 1]; @@ -15,5 +17,19 @@ { return collection; } + + public override bool Equals(object obj) + { + if (obj == null) + { + return false; + } + return obj.GetHashCode() == Hasher.GetHashCode(); + } + + public override int GetHashCode() + { + return Hasher.GetHashCode(); + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Transform/ToListResultTransformer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transform/ToListResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794) +++ trunk/nhibernate/src/NHibernate/Transform/ToListResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795) @@ -10,6 +10,8 @@ [Serializable] public class ToListResultTransformer : IResultTransformer { + private static readonly object Hasher = new object(); + public object TransformTuple(object[] tuple, string[] aliases) { return new ArrayList(tuple); @@ -19,5 +21,19 @@ { return list; } + + public override bool Equals(object obj) + { + if (obj == null) + { + return false; + } + return obj.GetHashCode() == Hasher.GetHashCode(); + } + + public override int GetHashCode() + { + return Hasher.GetHashCode(); + } } } \ 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-02 14:26:59 UTC (rev 5794) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-02 15:41:52 UTC (rev 5795) @@ -856,6 +856,7 @@ <Compile Include="TestDialect.cs" /> <Compile Include="TestDialects\PostgreSQL82TestDialect.cs" /> <Compile Include="TestDialects\SQLiteTestDialect.cs" /> + <Compile Include="TransformTests\ImplementationOfEqualityTests.cs" /> <Compile Include="TypesTest\CharClass.cs" /> <Compile Include="TypesTest\CharClassFixture.cs" /> <Compile Include="TypesTest\DateTimeClass.cs" /> Added: trunk/nhibernate/src/NHibernate.Test/TransformTests/ImplementationOfEqualityTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TransformTests/ImplementationOfEqualityTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TransformTests/ImplementationOfEqualityTests.cs 2011-05-02 15:41:52 UTC (rev 5795) @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using NHibernate.Linq; +using NHibernate.Transform; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.TransformTests +{ + public class ImplementationOfEqualityTests + { + private readonly IEnumerable<System.Type> transformerTypes = typeof(IResultTransformer).Assembly.GetTypes().Where(t => typeof(IResultTransformer).IsAssignableFrom(t) && t.IsClass).ToList(); + + [Test] + public void AllEmbeddedTransformersOverridesEqualsAndGetHashCode() + { + foreach (var transformerType in transformerTypes) + { + var declaredMethods = transformerType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + declaredMethods.Select(x => x.Name).Should("The type "+transformerType+" does not implement Equals").Contain("Equals"); + declaredMethods.Select(x => x.Name).Should("The type " + transformerType + " does not implement GetHashCode").Contain("GetHashCode"); + } + } + + [Test] + public void AllEmbeddedTransformersWithDefaultCtorHasEqualityWorkingAsSingleton() + { + foreach (var transformerType in transformerTypes) + { + IResultTransformer transformer1; + try + { + transformer1 = (IResultTransformer)Activator.CreateInstance(transformerType); + } + catch (Exception e) + { + // The transformer does not have default ctor + Console.WriteLine(transformerType); + Console.WriteLine(e); + continue; + } + var transformer2= (IResultTransformer)Activator.CreateInstance(transformerType); + transformer1.Should().Be.EqualTo(transformer2); + transformer1.GetHashCode().Should().Be.EqualTo(transformer2.GetHashCode()); + } + } + + [Test] + public void AliasToBeanResultTransformer_ShouldHaveEqualityBasedOnCtorParameter() + { + var transformer1 = new AliasToBeanResultTransformer(typeof(object)); + var transformer2 = new AliasToBeanResultTransformer(typeof(object)); + transformer1.Should().Be.EqualTo(transformer2); + transformer1.GetHashCode().Should().Be.EqualTo(transformer2.GetHashCode()); + + var transformer3 = new AliasToBeanResultTransformer(typeof(int)); + transformer1.Should().Not.Be.EqualTo(transformer3); + transformer1.GetHashCode().Should().Not.Be.EqualTo(transformer3.GetHashCode()); + } + + [Test] + public void AliasToBeanConstructorResultTransformer_ShouldHaveEqualityBasedOnCtorParameter() + { + var emptyCtor = new System.Type[0]; + var transformer1 = new AliasToBeanConstructorResultTransformer(typeof(object).GetConstructor(emptyCtor)); + var transformer2 = new AliasToBeanConstructorResultTransformer(typeof(object).GetConstructor(emptyCtor)); + transformer1.Should().Be.EqualTo(transformer2); + transformer1.GetHashCode().Should().Be.EqualTo(transformer2.GetHashCode()); + + var transformer3 = new AliasToBeanConstructorResultTransformer(typeof(ImplementationOfEqualityTests).GetConstructor(emptyCtor)); + transformer1.Should().Not.Be.EqualTo(transformer3); + transformer1.GetHashCode().Should().Not.Be.EqualTo(transformer3.GetHashCode()); + } + + public delegate void DoNothingDelegate(); + public delegate void DoNothingDelegate1(); + [Test] + public void LinqResultTransformer_ShouldHaveEqualityBasedOnCtorParameter() + { + DoNothingDelegate d1 = () => { }; + DoNothingDelegate d2 = () => { }; + var transformer1 = new ResultTransformer(d1, d2); + var transformer2 = new ResultTransformer(d1, d2); + transformer1.Should().Be.EqualTo(transformer2); + transformer1.GetHashCode().Should().Be.EqualTo(transformer2.GetHashCode()); + + DoNothingDelegate1 d3 = () => { }; + var transformer3 = new ResultTransformer(d1, d3); + transformer1.Should().Not.Be.EqualTo(transformer3); + transformer1.GetHashCode().Should().Not.Be.EqualTo(transformer3.GetHashCode()); + } + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-05-06 12:28:23
|
Revision: 5798 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5798&view=rev Author: fabiomaulo Date: 2011-05-06 12:28:17 +0000 (Fri, 06 May 2011) Log Message: ----------- Support of Generated for properties Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/KeyPropertyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyGeneration.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyMapper.cs 2011-05-03 21:33:56 UTC (rev 5797) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyMapper.cs 2011-05-06 12:28:17 UTC (rev 5798) @@ -19,5 +19,6 @@ void Update(bool consideredInUpdateQuery); void Insert(bool consideredInInsertQuery); void Lazy(bool isLazy); + void Generated(PropertyGeneration generation); } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/KeyPropertyMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/KeyPropertyMapper.cs 2011-05-03 21:33:56 UTC (rev 5797) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/KeyPropertyMapper.cs 2011-05-06 12:28:17 UTC (rev 5798) @@ -215,6 +215,11 @@ // lazy is not supported by HbmKeyProperty } + public void Generated(PropertyGeneration generation) + { + // generated is not supported by HbmKeyProperty + } + private bool ColumnTagIsRequired(HbmColumn hbm) { return hbm.precision != null || hbm.scale != null || hbm.notnull || hbm.unique Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs 2011-05-03 21:33:56 UTC (rev 5797) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs 2011-05-06 12:28:17 UTC (rev 5798) @@ -259,6 +259,15 @@ propertyMapping.lazy = isLazy; } + public void Generated(PropertyGeneration generation) + { + if (generation == null) + { + return; + } + propertyMapping.generated = generation.ToHbm(); + } + private void ResetColumnPlainValues() { propertyMapping.column = null; Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyGeneration.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyGeneration.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyGeneration.cs 2011-05-06 12:28:17 UTC (rev 5798) @@ -0,0 +1,37 @@ +using NHibernate.Cfg.MappingSchema; + +namespace NHibernate.Mapping.ByCode +{ + public abstract class PropertyGeneration + { + public static PropertyGeneration Never = new NeverPropertyGeneration(); + public static PropertyGeneration Insert = new InsertPropertyGeneration(); + public static PropertyGeneration Always = new AlwaysPropertyGeneration(); + + internal abstract HbmPropertyGeneration ToHbm(); + + public class AlwaysPropertyGeneration : PropertyGeneration + { + internal override HbmPropertyGeneration ToHbm() + { + return HbmPropertyGeneration.Always; + } + } + + public class InsertPropertyGeneration : PropertyGeneration + { + internal override HbmPropertyGeneration ToHbm() + { + return HbmPropertyGeneration.Insert; + } + } + + public class NeverPropertyGeneration : PropertyGeneration + { + internal override HbmPropertyGeneration ToHbm() + { + return HbmPropertyGeneration.Never; + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-05-03 21:33:56 UTC (rev 5797) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-05-06 12:28:17 UTC (rev 5798) @@ -304,6 +304,7 @@ <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\ComposedIdCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\DynamicComponentCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\DynamicComponentMapper.cs" /> + <Compile Include="Mapping\ByCode\PropertyGeneration.cs" /> <Compile Include="Mapping\ByCode\PropertyToField.cs" /> <Compile Include="Mapping\ByCode\SimpleModelInspector.cs" /> <Compile Include="Mapping\ByCode\ExplicitlyDeclaredModel.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-05-08 22:59:25
|
Revision: 5800 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5800&view=rev Author: fabiomaulo Date: 2011-05-08 22:59:17 +0000 (Sun, 08 May 2011) Log Message: ----------- Fixed class registration ambiguity resolution Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/ComponentMappingRegistrationTests.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/JoinedSubclassMappingStrategyTests.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/RootClassMappingStrategyTests.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassMappingStrategyTests.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/UnionSubclassMappingStrategyTests.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/AbstractExplicitlyDeclaredModel.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/CallCustomConditions.cs Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/AbstractExplicitlyDeclaredModel.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/AbstractExplicitlyDeclaredModel.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/AbstractExplicitlyDeclaredModel.cs 2011-05-08 22:59:17 UTC (rev 5800) @@ -0,0 +1,571 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace NHibernate.Mapping.ByCode +{ + public abstract class AbstractExplicitlyDeclaredModel : IModelExplicitDeclarationsHolder + { + private readonly HashSet<MemberInfo> any = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> arrays = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> bags = new HashSet<MemberInfo>(); + private readonly HashSet<System.Type> components = new HashSet<System.Type>(); + private readonly HashSet<MemberInfo> dictionaries = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> idBags = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> lists = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> manyToManyRelations = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> manyToOneRelations = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> naturalIds = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> composedIds = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> oneToManyRelations = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> oneToOneRelations = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> poids = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> properties = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> dynamicComponents = new HashSet<MemberInfo>(); + private readonly Dictionary<MemberInfo, System.Type> dynamicComponentTemplates = new Dictionary<MemberInfo, System.Type>(); + private readonly HashSet<MemberInfo> persistentMembers = new HashSet<MemberInfo>(); + private readonly HashSet<System.Type> rootEntities = new HashSet<System.Type>(); + private readonly HashSet<MemberInfo> sets = new HashSet<MemberInfo>(); + private readonly HashSet<System.Type> tablePerClassEntities = new HashSet<System.Type>(); + private readonly HashSet<System.Type> tablePerClassHierarchyEntities = new HashSet<System.Type>(); + private readonly HashSet<System.Type> tablePerConcreteClassEntities = new HashSet<System.Type>(); + private readonly HashSet<MemberInfo> versionProperties = new HashSet<MemberInfo>(); + private readonly Dictionary<System.Type, HashSet<string>> typeSplitGroups = new Dictionary<System.Type, HashSet<string>>(); + private readonly Dictionary<MemberInfo, string> memberSplitGroup = new Dictionary<MemberInfo, string>(); + private readonly HashSet<SplitDefinition> splitDefinitions = new HashSet<SplitDefinition>(); + + #region Delayed registrations + // To allow a free organization of mappings, especially in presence of a IModelMapper not based exclusivelly on pure declarative mapping, and then + // provide a descriptive exception when there are some ambiguity, we have to delay the registration as late as we can + // (in practice to the moment we have to give a certain asnwer about the strategy used to represent a System.Type hierarchy). + private readonly Queue<System.Action> delayedRootEntityRegistrations = new Queue<System.Action>(); + private readonly Dictionary<System.Type, List<Action<System.Type>>> delayedEntityRegistrations = new Dictionary<System.Type, List<Action<System.Type>>>(); + + #endregion + + public IEnumerable<System.Type> RootEntities + { + get { return rootEntities; } + } + + public IEnumerable<System.Type> Components + { + get { return components; } + } + + public IEnumerable<System.Type> TablePerClassEntities + { + get { return tablePerClassEntities; } + } + + public IEnumerable<System.Type> TablePerClassHierarchyEntities + { + get { return tablePerClassHierarchyEntities; } + } + + public IEnumerable<System.Type> TablePerConcreteClassEntities + { + get { return tablePerConcreteClassEntities; } + } + + public IEnumerable<MemberInfo> OneToOneRelations + { + get { return oneToOneRelations; } + } + + public IEnumerable<MemberInfo> ManyToOneRelations + { + get { return manyToOneRelations; } + } + + public IEnumerable<MemberInfo> ManyToManyRelations + { + get { return manyToManyRelations; } + } + + public IEnumerable<MemberInfo> OneToManyRelations + { + get { return oneToManyRelations; } + } + + public IEnumerable<MemberInfo> Any + { + get { return any; } + } + + public IEnumerable<MemberInfo> Poids + { + get { return poids; } + } + + public IEnumerable<MemberInfo> ComposedIds + { + get { return composedIds; } + } + + public IEnumerable<MemberInfo> VersionProperties + { + get { return versionProperties; } + } + + public IEnumerable<MemberInfo> NaturalIds + { + get { return naturalIds; } + } + + public IEnumerable<MemberInfo> Sets + { + get { return sets; } + } + + public IEnumerable<MemberInfo> Bags + { + get { return bags; } + } + + public IEnumerable<MemberInfo> IdBags + { + get { return idBags; } + } + + public IEnumerable<MemberInfo> Lists + { + get { return lists; } + } + + public IEnumerable<MemberInfo> Arrays + { + get { return arrays; } + } + + public IEnumerable<MemberInfo> Dictionaries + { + get { return dictionaries; } + } + + public IEnumerable<MemberInfo> Properties + { + get { return properties; } + } + + public IEnumerable<MemberInfo> DynamicComponents + { + get { return dynamicComponents; } + } + + public IEnumerable<MemberInfo> PersistentMembers + { + get { return persistentMembers; } + } + + public IEnumerable<SplitDefinition> SplitDefinitions + { + get { return splitDefinitions; } + } + + public IEnumerable<string> GetSplitGroupsFor(System.Type type) + { + HashSet<string> splitsGroupsIds; + if (typeSplitGroups.TryGetValue(type, out splitsGroupsIds)) + { + return splitsGroupsIds; + } + return Enumerable.Empty<string>(); + } + + public string GetSplitGroupFor(MemberInfo member) + { + var memberKey = member.GetMemberFromDeclaringType(); + string splitGroup; + if (memberSplitGroup.TryGetValue(memberKey, out splitGroup)) + { + return splitGroup; + } + return null; + } + + public void AddAsRootEntity(System.Type type) + { + rootEntities.Add(type); + if (IsComponent(type)) + { + throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName)); + } + } + + public abstract bool IsComponent(System.Type type); + + public void AddAsComponent(System.Type type) + { + components.Add(type); + var rootEntity = GetSingleRootEntityOrNull(type); + if (rootEntity != null) + { + throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName)); + } + } + + public void AddAsTablePerClassEntity(System.Type type) + { + AddAsTablePerClassEntity(type, false); + } + + protected virtual void AddAsTablePerClassEntity(System.Type type, bool rootEntityMustExists) + { + if(!rootEntityMustExists) + { + delayedRootEntityRegistrations.Enqueue(() => System.Array.ForEach(GetRootEntitentitiesOf(type).ToArray(), root=> tablePerClassEntities.Add(root))); + EnlistTypeRegistration(type, t => AddAsTablePerClassEntity(t, true)); + return; + } + if (IsComponent(type)) + { + throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName)); + } + var rootEntity = GetSingleRootEntityOrNull(type); + if (rootEntity != null) + { + if (rootEntity.Equals(type)) + { + throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-class strategy", type.FullName)); + } + if (IsMappedFor(tablePerClassHierarchyEntities, type) || IsMappedFor(tablePerConcreteClassEntities, type)) + { + throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName)); + } + } + else + { + throw new MappingException(string.Format("The root entity for {0} was never registered", type.FullName)); + } + } + + public void AddAsTablePerClassHierarchyEntity(System.Type type) + { + AddAsTablePerClassHierarchyEntity(type, false); + } + + protected virtual void AddAsTablePerClassHierarchyEntity(System.Type type, bool rootEntityMustExists) + { + if (!rootEntityMustExists) + { + delayedRootEntityRegistrations.Enqueue(() => System.Array.ForEach(GetRootEntitentitiesOf(type).ToArray(), root => tablePerClassHierarchyEntities.Add(root))); + EnlistTypeRegistration(type, t => AddAsTablePerClassHierarchyEntity(t, true)); + return; + } + + if (IsComponent(type)) + { + throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName)); + } + var rootEntity = GetSingleRootEntityOrNull(type); + if (rootEntity != null) + { + if (rootEntity.Equals(type)) + { + throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-class-hierarchy strategy", type.FullName)); + } + if (IsMappedFor(tablePerClassEntities, type) || IsMappedFor(tablePerConcreteClassEntities, type)) + { + throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName)); + } + } + else + { + throw new MappingException(string.Format("The root entity for {0} was never registered", type.FullName)); + } + } + + public void AddAsTablePerConcreteClassEntity(System.Type type) + { + AddAsTablePerConcreteClassEntity(type, false); + } + + protected virtual void AddAsTablePerConcreteClassEntity(System.Type type, bool rootEntityMustExists) + { + if (!rootEntityMustExists) + { + delayedRootEntityRegistrations.Enqueue(() => System.Array.ForEach(GetRootEntitentitiesOf(type).ToArray(), root => tablePerConcreteClassEntities.Add(root))); + EnlistTypeRegistration(type, t => AddAsTablePerConcreteClassEntity(t, true)); + return; + } + + if (IsComponent(type)) + { + throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName)); + } + var rootEntity = GetSingleRootEntityOrNull(type); + if (rootEntity != null) + { + if (rootEntity.Equals(type)) + { + throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-concrete-class strategy", type.FullName)); + } + if (IsMappedFor(tablePerClassEntities, type) || IsMappedFor(tablePerClassHierarchyEntities, type)) + { + throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName)); + } + } + else + { + throw new MappingException(string.Format("The root entity for {0} was never registered", type.FullName)); + } + } + + public void AddAsOneToOneRelation(MemberInfo member) + { + persistentMembers.Add(member); + oneToOneRelations.Add(member); + } + + public void AddAsManyToOneRelation(MemberInfo member) + { + persistentMembers.Add(member); + manyToOneRelations.Add(member); + } + + public void AddAsManyToManyRelation(MemberInfo member) + { + persistentMembers.Add(member); + manyToManyRelations.Add(member); + } + + public void AddAsOneToManyRelation(MemberInfo member) + { + persistentMembers.Add(member); + oneToManyRelations.Add(member); + } + + public void AddAsAny(MemberInfo member) + { + persistentMembers.Add(member); + any.Add(member); + } + + public void AddAsPoid(MemberInfo member) + { + persistentMembers.Add(member); + poids.Add(member); + } + + public void AddAsPartOfComposedId(MemberInfo member) + { + persistentMembers.Add(member); + composedIds.Add(member); + } + + public void AddAsVersionProperty(MemberInfo member) + { + persistentMembers.Add(member); + versionProperties.Add(member); + } + + public void AddAsNaturalId(MemberInfo member) + { + persistentMembers.Add(member); + naturalIds.Add(member); + } + + public void AddAsSet(MemberInfo member) + { + persistentMembers.Add(member); + sets.Add(member); + } + + public void AddAsBag(MemberInfo member) + { + persistentMembers.Add(member); + bags.Add(member); + } + + public void AddAsIdBag(MemberInfo member) + { + persistentMembers.Add(member); + idBags.Add(member); + } + + public void AddAsList(MemberInfo member) + { + persistentMembers.Add(member); + lists.Add(member); + } + + public void AddAsArray(MemberInfo member) + { + persistentMembers.Add(member); + arrays.Add(member); + } + + public void AddAsMap(MemberInfo member) + { + persistentMembers.Add(member); + dictionaries.Add(member); + } + + public void AddAsProperty(MemberInfo member) + { + persistentMembers.Add(member); + properties.Add(member); + } + + public void AddAsPersistentMember(MemberInfo member) + { + persistentMembers.Add(member); + } + + public void AddAsPropertySplit(SplitDefinition definition) + { + if (definition == null) + { + return; + } + /* Note: if the user "jump/exclude" a class and then map the property in two subclasses the usage of GetMemberFromDeclaringType() may cause a problem + for a legal usage... we will see when the case happen */ + System.Type propertyContainer = definition.On; + string splitGroupId = definition.GroupId; + MemberInfo member = definition.Member; + var memberKey = member.GetMemberFromDeclaringType(); + string splitGroup; + if (!memberSplitGroup.TryGetValue(memberKey, out splitGroup)) + { + AddTypeSplits(propertyContainer, splitGroupId); + memberSplitGroup[memberKey] = splitGroupId; + } + + splitDefinitions.Add(definition); + } + + public void AddAsDynamicComponent(MemberInfo member, System.Type componentTemplate) + { + persistentMembers.Add(member); + dynamicComponents.Add(member); + dynamicComponentTemplates[member] = componentTemplate; + } + + private void AddTypeSplits(System.Type propertyContainer, string splitGroupId) + { + HashSet<string> splitsGroupsIds; + typeSplitGroups.TryGetValue(propertyContainer, out splitsGroupsIds); + if(splitsGroupsIds == null) + { + splitsGroupsIds = new HashSet<string>(); + typeSplitGroups[propertyContainer] = splitsGroupsIds; + } + splitsGroupsIds.Add(splitGroupId); + } + + public virtual System.Type GetDynamicComponentTemplate(MemberInfo member) + { + System.Type template; + dynamicComponentTemplates.TryGetValue(member, out template); + return template ?? typeof(object); + } + + protected System.Type GetSingleRootEntityOrNull(System.Type entityType) + { + var rootTypes = GetRootEntitentitiesOf(entityType).ToList(); + if(rootTypes.Count > 1) + { + var sb = new StringBuilder(1024); + sb.AppendLine(string.Format("Ambiguous mapping for {0}. More than one root entities was found:", entityType.FullName)); + foreach (var rootType in rootTypes.AsEnumerable().Reverse()) + { + sb.AppendLine(rootType.FullName); + } + sb.AppendLine("Possible solutions:"); + sb.AppendLine("- Merge the mappings of root entity in the one is representing the real root of the hierarchy."); + sb.AppendLine("- Inject a IModelInspector with a logic to discover the real root-entity."); + throw new MappingException(sb.ToString()); + } + return rootTypes.SingleOrDefault(IsRootEntity); + } + + protected IEnumerable<System.Type> GetRootEntitentitiesOf(System.Type entityType) + { + if (entityType == null) + { + yield break; + } + if(IsRootEntity(entityType)) + { + yield return entityType; + } + foreach (var type in entityType.GetBaseTypes().Where(IsRootEntity)) + { + yield return type; + } + } + + public abstract bool IsRootEntity(System.Type entityType); + + protected bool IsMappedForTablePerClassEntities(System.Type type) + { + return IsMappedFor(tablePerClassEntities, type); + } + + protected bool IsMappedForTablePerClassHierarchyEntities(System.Type type) + { + return IsMappedFor(tablePerClassHierarchyEntities, type); + } + + protected bool IsMappedForTablePerConcreteClassEntities(System.Type type) + { + return IsMappedFor(tablePerConcreteClassEntities, type); + } + + private bool IsMappedFor(ICollection<System.Type> explicitMappedEntities, System.Type type) + { + bool isExplicitMapped = explicitMappedEntities.Contains(type); + bool isDerived = false; + + if (!isExplicitMapped) + { + isDerived = type.GetBaseTypes().Any(explicitMappedEntities.Contains); + if (isDerived) + { + explicitMappedEntities.Add(type); + } + } + return isExplicitMapped || isDerived; + } + + protected void EnlistTypeRegistration(System.Type type, Action<System.Type> registration) + { + List<Action<System.Type>> actions; + if (!delayedEntityRegistrations.TryGetValue(type, out actions)) + { + actions = new List<Action<System.Type>>(); + delayedEntityRegistrations[type] = actions; + } + actions.Add(registration); + } + + protected void ExecuteDelayedTypeRegistration(System.Type type) + { + ExecuteDelayedRootEntitiesRegistrations(); + List<Action<System.Type>> actions; + if (delayedEntityRegistrations.TryGetValue(type, out actions)) + { + foreach (var action in actions) + { + action(type); + } + } + } + + protected void ExecuteDelayedRootEntitiesRegistrations() + { + while (delayedRootEntityRegistrations.Count > 0) + { + delayedRootEntityRegistrations.Dequeue().Invoke(); + } + } + + protected bool HasDelayedEntityRegistration(System.Type type) + { + return delayedEntityRegistrations.ContainsKey(type); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-05-06 14:14:41 UTC (rev 5799) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-05-08 22:59:17 UTC (rev 5800) @@ -1,470 +1,32 @@ -using System; using System.Collections.Generic; using System.Linq; using System.Reflection; namespace NHibernate.Mapping.ByCode { - public class ExplicitlyDeclaredModel : IModelInspector, IModelExplicitDeclarationsHolder + public class ExplicitlyDeclaredModel : AbstractExplicitlyDeclaredModel, IModelInspector { - private readonly HashSet<MemberInfo> any = new HashSet<MemberInfo>(); - private readonly HashSet<MemberInfo> arrays = new HashSet<MemberInfo>(); - private readonly HashSet<MemberInfo> bags = new HashSet<MemberInfo>(); - private readonly HashSet<System.Type> components = new HashSet<System.Type>(); - private readonly HashSet<MemberInfo> dictionaries = new HashSet<MemberInfo>(); - private readonly HashSet<MemberInfo> idBags = new HashSet<MemberInfo>(); - private readonly HashSet<MemberInfo> lists = new HashSet<MemberInfo>(); - private readonly HashSet<MemberInfo> manyToManyRelations = new HashSet<MemberInfo>(); - private readonly HashSet<MemberInfo> manyToOneRelations = new HashSet<MemberInfo>(); - private readonly HashSet<MemberInfo> naturalIds = new HashSet<MemberInfo>(); - private readonly HashSet<MemberInfo> composedIds = new HashSet<MemberInfo>(); - private readonly HashSet<MemberInfo> oneToManyRelations = new HashSet<MemberInfo>(); - private readonly HashSet<MemberInfo> oneToOneRelations = new HashSet<MemberInfo>(); - private readonly HashSet<MemberInfo> poids = new HashSet<MemberInfo>(); - private readonly HashSet<MemberInfo> properties = new HashSet<MemberInfo>(); - private readonly HashSet<MemberInfo> dynamicComponents = new HashSet<MemberInfo>(); - private readonly Dictionary<MemberInfo, System.Type> dynamicComponentTemplates = new Dictionary<MemberInfo, System.Type>(); - private readonly HashSet<MemberInfo> persistentMembers = new HashSet<MemberInfo>(); - private readonly HashSet<System.Type> rootEntities = new HashSet<System.Type>(); - private readonly HashSet<MemberInfo> sets = new HashSet<MemberInfo>(); - private readonly HashSet<System.Type> tablePerClassEntities = new HashSet<System.Type>(); - private readonly HashSet<System.Type> tablePerClassHierarchyEntities = new HashSet<System.Type>(); - private readonly HashSet<System.Type> tablePerConcreteClassEntities = new HashSet<System.Type>(); - private readonly HashSet<MemberInfo> versionProperties = new HashSet<MemberInfo>(); - private readonly Dictionary<System.Type, Action<System.Type>> delayedEntityRegistrations = new Dictionary<System.Type, Action<System.Type>>(); - private readonly Dictionary<System.Type, HashSet<string>> typeSplitGroups = new Dictionary<System.Type, HashSet<string>>(); - private readonly Dictionary<MemberInfo, string> memberSplitGroup = new Dictionary<MemberInfo, string>(); - private readonly HashSet<SplitDefinition> splitDefinitions = new HashSet<SplitDefinition>(); - - #region IModelExplicitDeclarationsHolder Members - - public IEnumerable<System.Type> RootEntities - { - get { return rootEntities; } - } - - public IEnumerable<System.Type> Components - { - get { return components; } - } - - public IEnumerable<System.Type> TablePerClassEntities - { - get { return tablePerClassEntities; } - } - - public IEnumerable<System.Type> TablePerClassHierarchyEntities - { - get { return tablePerClassHierarchyEntities; } - } - - public IEnumerable<System.Type> TablePerConcreteClassEntities - { - get { return tablePerConcreteClassEntities; } - } - - public IEnumerable<MemberInfo> OneToOneRelations - { - get { return oneToOneRelations; } - } - - public IEnumerable<MemberInfo> ManyToOneRelations - { - get { return manyToOneRelations; } - } - - public IEnumerable<MemberInfo> ManyToManyRelations - { - get { return manyToManyRelations; } - } - - public IEnumerable<MemberInfo> OneToManyRelations - { - get { return oneToManyRelations; } - } - - public IEnumerable<MemberInfo> Any - { - get { return any; } - } - - public IEnumerable<MemberInfo> Poids - { - get { return poids; } - } - - public IEnumerable<MemberInfo> ComposedIds - { - get { return composedIds; } - } - - public IEnumerable<MemberInfo> VersionProperties - { - get { return versionProperties; } - } - - public IEnumerable<MemberInfo> NaturalIds - { - get { return naturalIds; } - } - - public IEnumerable<MemberInfo> Sets - { - get { return sets; } - } - - public IEnumerable<MemberInfo> Bags - { - get { return bags; } - } - - public IEnumerable<MemberInfo> IdBags - { - get { return idBags; } - } - - public IEnumerable<MemberInfo> Lists - { - get { return lists; } - } - - public IEnumerable<MemberInfo> Arrays - { - get { return arrays; } - } - - public IEnumerable<MemberInfo> Dictionaries - { - get { return dictionaries; } - } - - public IEnumerable<MemberInfo> Properties - { - get { return properties; } - } - - public IEnumerable<MemberInfo> DynamicComponents - { - get { return dynamicComponents; } - } - - public IEnumerable<MemberInfo> PersistentMembers - { - get { return persistentMembers; } - } - - public IEnumerable<SplitDefinition> SplitDefinitions - { - get { return splitDefinitions; } - } - - public IEnumerable<string> GetSplitGroupsFor(System.Type type) - { - HashSet<string> splitsGroupsIds; - if (typeSplitGroups.TryGetValue(type, out splitsGroupsIds)) - { - return splitsGroupsIds; - } - return Enumerable.Empty<string>(); - } - - public string GetSplitGroupFor(MemberInfo member) - { - var memberKey = member.GetMemberFromDeclaringType(); - string splitGroup; - if (memberSplitGroup.TryGetValue(memberKey, out splitGroup)) - { - return splitGroup; - } - return null; - } - - public void AddAsRootEntity(System.Type type) - { - if (IsComponent(type)) - { - throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName)); - } - rootEntities.Add(type); - } - - public void AddAsComponent(System.Type type) - { - var rootEntity = GetRootEntityOrNull(type); - if (rootEntity != null) - { - throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName)); - } - components.Add(type); - } - - public void AddAsTablePerClassEntity(System.Type type) - { - AddAsTablePerClassEntity(type, false); - } - - public void AddAsTablePerClassEntity(System.Type type, bool rootEntityMustExists) - { - if (IsComponent(type)) - { - throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName)); - } - var rootEntity = GetRootEntityOrNull(type); - if (rootEntity != null) - { - if (rootEntity.Equals(type)) - { - throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-class strategy", type.FullName)); - } - if (IsMappedFor(tablePerClassHierarchyEntities, type) || IsMappedFor(tablePerConcreteClassEntities, type)) - { - throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName)); - } - tablePerClassEntities.Add(rootEntity); - } - else - { - if(rootEntityMustExists) - { - throw new MappingException(string.Format("The root entity for {0} was never registered", type.FullName)); - } - EnlistTypeRegistration(type, t => AddAsTablePerClassEntity(t, true)); - } - } - - public void AddAsTablePerClassHierarchyEntity(System.Type type) - { - AddAsTablePerClassHierarchyEntity(type, false); - } - - public void AddAsTablePerClassHierarchyEntity(System.Type type, bool rootEntityMustExists) - { - if (IsComponent(type)) - { - throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName)); - } - var rootEntity = GetRootEntityOrNull(type); - if (rootEntity != null) - { - if (rootEntity.Equals(type)) - { - throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-class-hierarchy strategy", type.FullName)); - } - if (IsMappedFor(tablePerClassEntities, type) || IsMappedFor(tablePerConcreteClassEntities, type)) - { - throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName)); - } - tablePerClassHierarchyEntities.Add(rootEntity); - } - else - { - if (rootEntityMustExists) - { - throw new MappingException(string.Format("The root entity for {0} was never registered", type.FullName)); - } - EnlistTypeRegistration(type, t => AddAsTablePerClassHierarchyEntity(t, true)); - } - } - - public void AddAsTablePerConcreteClassEntity(System.Type type) - { - AddAsTablePerConcreteClassEntity(type, false); - } - - public void AddAsTablePerConcreteClassEntity(System.Type type, bool rootEntityMustExists) - { - if (IsComponent(type)) - { - throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName)); - } - var rootEntity = GetRootEntityOrNull(type); - if (rootEntity != null) - { - if (rootEntity.Equals(type)) - { - throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-concrete-class strategy", type.FullName)); - } - if (IsMappedFor(tablePerClassEntities, type) || IsMappedFor(tablePerClassHierarchyEntities, type)) - { - throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName)); - } - tablePerConcreteClassEntities.Add(rootEntity); - } - else - { - if (rootEntityMustExists) - { - throw new MappingException(string.Format("The root entity for {0} was never registered", type.FullName)); - } - EnlistTypeRegistration(type, t => AddAsTablePerConcreteClassEntity(t, true)); - } - } - - public void AddAsOneToOneRelation(MemberInfo member) - { - persistentMembers.Add(member); - oneToOneRelations.Add(member); - } - - public void AddAsManyToOneRelation(MemberInfo member) - { - persistentMembers.Add(member); - manyToOneRelations.Add(member); - } - - public void AddAsManyToManyRelation(MemberInfo member) - { - persistentMembers.Add(member); - manyToManyRelations.Add(member); - } - - public void AddAsOneToManyRelation(MemberInfo member) - { - persistentMembers.Add(member); - oneToManyRelations.Add(member); - } - - public void AddAsAny(MemberInfo member) - { - persistentMembers.Add(member); - any.Add(member); - } - - public void AddAsPoid(MemberInfo member) - { - persistentMembers.Add(member); - poids.Add(member); - } - - public void AddAsPartOfComposedId(MemberInfo member) - { - persistentMembers.Add(member); - composedIds.Add(member); - } - - public void AddAsVersionProperty(MemberInfo member) - { - persistentMembers.Add(member); - versionProperties.Add(member); - } - - public void AddAsNaturalId(MemberInfo member) - { - persistentMembers.Add(member); - naturalIds.Add(member); - } - - public void AddAsSet(MemberInfo member) - { - persistentMembers.Add(member); - sets.Add(member); - } - - public void AddAsBag(MemberInfo member) - { - persistentMembers.Add(member); - bags.Add(member); - } - - public void AddAsIdBag(MemberInfo member) - { - persistentMembers.Add(member); - idBags.Add(member); - } - - public void AddAsList(MemberInfo member) - { - persistentMembers.Add(member); - lists.Add(member); - } - - public void AddAsArray(MemberInfo member) - { - persistentMembers.Add(member); - arrays.Add(member); - } - - public void AddAsMap(MemberInfo member) - { - persistentMembers.Add(member); - dictionaries.Add(member); - } - - public void AddAsProperty(MemberInfo member) - { - persistentMembers.Add(member); - properties.Add(member); - } - - public void AddAsPersistentMember(MemberInfo member) - { - persistentMembers.Add(member); - } - - public void AddAsPropertySplit(SplitDefinition definition) - { - if (definition == null) - { - return; - } - /* Note: if the user "jump/exclude" a class and then map the property in two subclasses the usage of GetMemberFromDeclaringType() may cause a problem - for a legal usage... we will see when the case happen */ - System.Type propertyContainer = definition.On; - string splitGroupId = definition.GroupId; - MemberInfo member = definition.Member; - var memberKey = member.GetMemberFromDeclaringType(); - string splitGroup; - if (!memberSplitGroup.TryGetValue(memberKey, out splitGroup)) - { - AddTypeSplits(propertyContainer, splitGroupId); - memberSplitGroup[memberKey] = splitGroupId; - } - - splitDefinitions.Add(definition); - } - - public void AddAsDynamicComponent(MemberInfo member, System.Type componentTemplate) - { - persistentMembers.Add(member); - dynamicComponents.Add(member); - dynamicComponentTemplates[member] = componentTemplate; - } - - private void AddTypeSplits(System.Type propertyContainer, string splitGroupId) - { - HashSet<string> splitsGroupsIds; - typeSplitGroups.TryGetValue(propertyContainer, out splitsGroupsIds); - if(splitsGroupsIds == null) - { - splitsGroupsIds = new HashSet<string>(); - typeSplitGroups[propertyContainer] = splitsGroupsIds; - } - splitsGroupsIds.Add(splitGroupId); - } - - #endregion - #region Implementation of IModelInspector - public virtual bool IsRootEntity(System.Type type) + public override bool IsRootEntity(System.Type type) { - return rootEntities.Contains(type); + return RootEntities.Contains(type); } - public virtual bool IsComponent(System.Type type) + public override bool IsComponent(System.Type type) { - return components.Contains(type); + return Components.Contains(type); } public virtual bool IsEntity(System.Type type) { - return rootEntities.Contains(type) || type.GetBaseTypes().Any(t => rootEntities.Contains(t)) || HasDelayedEntityRegistration(type); + return RootEntities.Contains(type) || type.GetBaseTypes().Any(t => RootEntities.Contains(t)) || HasDelayedEntityRegistration(type); } public virtual bool IsTablePerClass(System.Type type) { ExecuteDelayedTypeRegistration(type); - return IsMappedFor(tablePerClassEntities, type); + return IsMappedForTablePerClassEntities(type); } public virtual bool IsTablePerClassSplit(System.Type type, object splitGroupId, MemberInfo member) @@ -475,166 +37,110 @@ public virtual bool IsTablePerClassHierarchy(System.Type type) { ExecuteDelayedTypeRegistration(type); - return IsMappedFor(tablePerClassHierarchyEntities, type); + return IsMappedForTablePerClassHierarchyEntities(type); } public virtual bool IsTablePerConcreteClass(System.Type type) { ExecuteDelayedTypeRegistration(type); - return IsMappedFor(tablePerConcreteClassEntities, type); + return IsMappedForTablePerConcreteClassEntities(type); } public virtual bool IsOneToOne(MemberInfo member) { - return oneToOneRelations.Contains(member); + return OneToOneRelations.Contains(member); } public virtual bool IsManyToOne(MemberInfo member) { - return manyToOneRelations.Contains(member); + return ManyToOneRelations.Contains(member); } public virtual bool IsManyToMany(MemberInfo member) { - return manyToManyRelations.Contains(member); + return ManyToManyRelations.Contains(member); } public virtual bool IsOneToMany(MemberInfo member) { - return oneToManyRelations.Contains(member); + return OneToManyRelations.Contains(member); } public virtual bool IsAny(MemberInfo member) { - return any.Contains(member); + return Any.Contains(member); } public virtual bool IsPersistentId(MemberInfo member) { - return poids.Contains(member); + return Poids.Contains(member); } public bool IsMemberOfComposedId(MemberInfo member) { - return composedIds.Contains(member); + return ComposedIds.Contains(member); } public virtual bool IsVersion(MemberInfo member) { - return versionProperties.Contains(member); + return VersionProperties.Contains(member); } public virtual bool IsMemberOfNaturalId(MemberInfo member) { - return naturalIds.Contains(member); + return NaturalIds.Contains(member); } public virtual bool IsPersistentProperty(MemberInfo member) { - return persistentMembers.Contains(member); + return PersistentMembers.Contains(member); } public virtual bool IsSet(MemberInfo role) { - return sets.Contains(role); + return Sets.Contains(role); } public virtual bool IsBag(MemberInfo role) { - return bags.Contains(role); + return Bags.Contains(role); } public virtual bool IsIdBag(MemberInfo role) { - return idBags.Contains(role); + return IdBags.Contains(role); } public virtual bool IsList(MemberInfo role) { - return lists.Contains(role); + return Lists.Contains(role); } public virtual bool IsArray(MemberInfo role) { - return arrays.Contains(role); + return Arrays.Contains(role); } public virtual bool IsDictionary(MemberInfo role) { - return dictionaries.Contains(role); + return Dictionaries.Contains(role); } public virtual bool IsProperty(MemberInfo member) { - return properties.Contains(member); + return Properties.Contains(member); } - public bool IsDynamicComponent(MemberInfo member) + public virtual bool IsDynamicComponent(MemberInfo member) { - return dynamicComponents.Contains(member); + return DynamicComponents.Contains(member); } - public System.Type GetDynamicComponentTemplate(MemberInfo member) + public virtual IEnumerable<string> GetPropertiesSplits(System.Type type) { - System.Type template; - dynamicComponentTemplates.TryGetValue(member, out template); - return template ?? typeof(object); - } - - public IEnumerable<string> GetPropertiesSplits(System.Type type) - { return GetSplitGroupsFor(type); } #endregion - - protected System.Type GetRootEntityOrNull(System.Type entityType) - { - if (entityType == null) - { - return null; - } - if (IsRootEntity(entityType)) - { - return entityType; - } - return entityType.GetBaseTypes().SingleOrDefault(IsRootEntity); - } - - protected bool IsMappedFor(ICollection<System.Type> explicitMappedEntities, System.Type type) - { - bool isExplicitMapped = explicitMappedEntities.Contains(type); - bool isDerived = false; - - if (!isExplicitMapped) - { - isDerived = type.GetBaseTypes().Any(explicitMappedEntities.Contains); - if (isDerived) - { - explicitMappedEntities.Add(type); - } - } - return isExplicitMapped || isDerived; - } - - protected void EnlistTypeRegistration(System.Type type, Action<System.Type> registration) - { - delayedEntityRegistrations.Add(type, registration); - } - - protected void ExecuteDelayedTypeRegistration(System.Type type) - { - Action<System.Type> registration; - if(delayedEntityRegistrations.TryGetValue(type, out registration)) - { - delayedEntityRegistrations.Remove(type); - registration(type); - } - } - - protected bool HasDelayedEntityRegistration(System.Type type) - { - return delayedEntityRegistrations.ContainsKey(type); - } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-05-06 14:14:41 UTC (rev 5799) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-05-08 22:59:17 UTC (rev 5800) @@ -11,8 +11,151 @@ /// </summary> public class SimpleModelInspector : IModelInspector, IModelExplicitDeclarationsHolder { - private readonly ExplicitlyDeclaredModel declaredModel = new ExplicitlyDeclaredModel(); + private class MixinDeclaredModel : AbstractExplicitlyDeclaredModel + { + private readonly IModelInspector inspector; + public MixinDeclaredModel(IModelInspector inspector) + { + this.inspector = inspector; + } + + public override bool IsComponent(System.Type type) + { + return Components.Contains(type); + } + + public override bool IsRootEntity(System.Type entityType) + { + return inspector.IsRootEntity(entityType); + } + + public bool IsEntity(System.Type type) + { + return RootEntities.Contains(type) || type.GetBaseTypes().Any(t => RootEntities.Contains(t)) || HasDelayedEntityRegistration(type); + } + + public bool IsTablePerClass(System.Type type) + { + ExecuteDelayedTypeRegistration(type); + return IsMappedForTablePerClassEntities(type); + } + + public bool IsTablePerClassSplit(System.Type type, object splitGroupId, MemberInfo member) + { + return Equals(splitGroupId, GetSplitGroupFor(member)); + } + + public bool IsTablePerClassHierarchy(System.Type type) + { + ExecuteDelayedTypeRegistration(type); + return IsMappedForTablePerClassHierarchyEntities(type); + } + + public bool IsTablePerConcreteClass(System.Type type) + { + ExecuteDelayedTypeRegistration(type); + return IsMappedForTablePerConcreteClassEntities(type); + } + + public bool IsOneToOne(MemberInfo member) + { + return OneToOneRelations.Contains(member); + } + + public bool IsManyToOne(MemberInfo member) + { + return ManyToOneRelations.Contains(member); + } + + public bool IsManyToMany(MemberInfo member) + { + return ManyToManyRelations.Contains(member); + } + + public bool IsOneToMany(MemberInfo member) + { + return OneToManyRelations.Contains(member); + } + + public bool IsAny(MemberInfo member) + { + return Any.Contains(member); + } + + public bool IsPersistentId(MemberInfo member) + { + return Poids.Contains(member); + } + + public bool IsMemberOfComposedId(MemberInfo member) + { + return ComposedIds.Contains(member); + } + + public bool IsVersion(MemberInfo member) + { + return VersionProperties.Contains(member); + } + + public bool IsMemberOfNaturalId(MemberInfo member) + { + return NaturalIds.Contains(member); + } + + public bool IsPersistentProperty(MemberInfo member) + { + return PersistentMembers.Contains(member); + } + + public bool IsSet(MemberInfo role) + { + return Sets.Contains(role); + } + + public bool IsBag(MemberInfo role) + { + return Bags.Contains(role); + } + + public bool IsIdBag(MemberInfo role) + { + return IdBags.Contains(role); + } + + public bool IsList(MemberInfo role) + { + return Lists.Contains(role); + } + + public bool IsArray(MemberInfo role) + { + return Arrays.Contains(role); + } + + public bool IsDictionary(MemberInfo role) + { + return Dictionaries.Contains(role); + } + + public bool IsProperty(MemberInfo member) + { + return Properties.Contains(member); + } + + public bool IsDynamicComponent(MemberInfo member) + { + return DynamicComponents.Contains(member); + } + + public IEnumerable<string> GetPropertiesSplits(System.Type type) + { + return GetSplitGroupsFor(type); + } + } + + private readonly MixinDeclaredModel declaredModel; + private Func<System.Type, bool, bool> isEntity = (t, declared) => declared; private Func<System.Type, bool, bool> isRootEntity; private Func<System.Type, bool, bool> isTablePerClass; @@ -56,11 +199,12 @@ isDictionary = (m, declared) => declared || MatchCollection(m, MatchDictionaryMember); isManyToOne = (m, declared) => declared || MatchManyToOne(m); isOneToMany = (m, declared) => declared || MatchOneToMany(m); + declaredModel = new MixinDeclaredModel(this); } private bool MatchRootEntity(System.Type type) { - return type.IsClass && typeof(object).Equals(type.BaseType); + return type.IsClass && typeof(object).Equals(type.BaseType) && ((IModelInspector)this).IsEntity(type); } private bool MatchTablePerClass(System.Type type) @@ -213,6 +357,10 @@ const BindingFlags flattenHierarchyMembers = BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; + if (declaredModel.IsEntity(subject)) + { + return false; + } var modelInspector = (IModelInspector) this; return !subject.IsEnum && (subject.Namespace == null || !subject.Namespace.StartsWith("System")) /* hack */ && !modelInspector.IsEntity(subject) @@ -224,7 +372,10 @@ { const BindingFlags flattenHierarchyMembers = BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; - + if(declaredModel.Components.Contains(subject)) + { + return false; + } var modelInspector = (IModelInspector) this; return subject.IsClass && subject.GetProperties(flattenHierarchyMembers).Cast<MemberInfo>().Concat(subject.GetFields(flattenHierarchyMembers)).Any(m => modelInspector.IsPersistentId(m)); @@ -488,13 +639,13 @@ bool IModelInspector.IsRootEntity(System.Type type) { - bool declaredResult = declaredModel.IsRootEntity(type); + bool declaredResult = declaredModel.RootEntities.Contains(type); return isRootEntity(type, declaredResult); } bool IModelInspector.IsComponent(System.Type type) { - bool declaredResult = declaredModel.IsComponent(type); + bool declaredResult = declaredModel.Components.Contains(type); return isComponent(type, declaredResult); } Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-05-06 14:14:41 UTC (rev 5799) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-05-08 22:59:17 UTC (rev 5800) @@ -284,6 +284,7 @@ <Compile Include="Mapping\Any.cs" /> <Compile Include="Mapping\Array.cs" /> <Compile Include="Mapping\Bag.cs" /> + <Compile Include="Mapping\ByCode\AbstractExplicitlyDeclaredModel.cs" /> <Compile Include="Mapping\ByCode\CacheInclude.cs" /> <Compile Include="Mapping\ByCode\CacheUsage.cs" /> <Compile Include="Mapping\ByCode\Cascade.cs" /> Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/ComponentMappingRegistrationTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/ComponentMappingRegistrationTests.cs 2011-05-06 14:14:41 UTC (rev 5799) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/ComponentMappingRegistrationTests.cs 2011-05-08 22:59:17 UTC (rev 5800) @@ -42,27 +42,39 @@ public void WhenRegisteredAsComponetThenCantRegisterAsJoinedSubclass() { var inspector = new ExplicitlyDeclaredModel(); - inspector.AddAsComponent(typeof(MyComponent)); + inspector.AddAsComponent(typeof (MyComponent)); - inspector.Executing(x => x.AddAsTablePerClassEntity(typeof(MyComponent))).Throws<MappingException>(); + Executing.This(() => + { + inspector.AddAsTablePerClassEntity(typeof (MyComponent)); + inspector.IsTablePerClass(typeof (MyComponent)); + }).Should().Throw<MappingException>(); } [Test] public void WhenRegisteredAsComponetThenCantRegisterAsSubclass() { var inspector = new ExplicitlyDeclaredModel(); - inspector.AddAsComponent(typeof(MyComponent)); + inspector.AddAsComponent(typeof (MyComponent)); - inspector.Executing(x => x.AddAsTablePerClassHierarchyEntity(typeof(MyComponent))).Throws<MappingException>(); + Executing.This(() => + { + inspector.AddAsTablePerClassHierarchyEntity(typeof (MyComponent)); + inspector.IsTablePerClassHierarchy(typeof (MyComponent)); + }).Should().Throw<MappingException>(); } [Test] public void WhenRegisteredAsComponetThenCantRegisterAsUnionSubclass() { var inspector = new ExplicitlyDeclaredModel(); - inspector.AddAsComponent(typeof(MyComponent)); + inspector.AddAsComponent(typeof (MyComponent)); - inspector.Executing(x => x.AddAsTablePerConcreteClassEntity(typeof(MyComponent))).Throws<MappingException>(); + Executing.This(() => + { + inspector.AddAsTablePerConcreteClassEntity(typeof (MyComponent)); + inspector.IsTablePerConcreteClass(typeof (MyComponent)); + }).Should().Throw<MappingException>(); } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/JoinedSubclassMappingStrategyTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/JoinedSubclassMappingStrategyTests.cs 2011-05-06 14:14:41 UTC (rev 5799) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/JoinedSubclassMappingStrategyTests.cs 2011-05-08 22:59:17 UTC (rev 5800) @@ -47,20 +47,28 @@ public void WhenRegisteredAsJoinedSubclassThenCantRegisterAsSubclass() { var inspector = new ExplicitlyDeclaredModel(); - inspector.AddAsRootEntity(typeof(MyClass)); - inspector.AddAsTablePerClassEntity(typeof(Inherited1)); + inspector.AddAsRootEntity(typeof (MyClass)); + inspector.AddAsTablePerClassEntity(typeof (Inherited1)); - inspector.Executing(x => x.AddAsTablePerClassHierarchyEntity(typeof(Inherited1))).Throws<MappingException>(); + Executing.This(() => + { + inspector.AddAsTablePerClassHierarchyEntity(typeof (Inherited1)); + inspector.IsTablePerClass(typeof (Inherited1)); + }).Should().Throw<MappingException>(); } [Test] public void WhenRegisteredAsJoinedSubclassThenCantRegisterAsUnionSubclass() { var inspector = new ExplicitlyDeclaredModel(); - inspector.AddAsRootEntity(typeof(MyClass)); - inspector.AddAsTablePerClassEntity(typeof(Inherited1)); + inspector.AddAsRootEntity(typeof (MyClass)); + inspector.AddAsTablePerClassEntity(typeof (Inherited1)); - inspector.Executing(x => x.AddAsTablePerConcreteClassEntity(typeof(Inherited1))).Throws<MappingException>(); + Executing.This(() => + { + inspector.AddAsTablePerConcreteClassEntity(typeof (Inherited1)); + inspector.IsTablePerClass(typeof (Inherited1)); + }).Should().Throw<MappingException>(); } [Test] Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/RootClassMappingStrategyTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/RootClassMappingStrategyTests.cs 2011-05-06 14:14:41 UTC (rev 5799) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/RootClassMappingStrategyTests.cs 2011-05-08 22:59:17 UTC (rev 5800) @@ -103,24 +103,36 @@ public void WhenRegisteredAsRootThenCantRegisterAsSubclass() { var inspector = new ExplicitlyDeclaredModel(); - inspector.AddAsRootEntity(typeof(MyClass)); - inspector.Executing(x=> x.AddAsTablePerClassEntity(typeof(MyClass))).Throws<MappingException>(); + inspector.AddAsRootEntity(typeof (MyClass)); + Executing.This(() => + { + inspector.AddAsTablePerClassHierarchyEntity(typeof (MyClass)); + inspector.IsTablePerClassHierarchy(typeof (MyClass)); + }).Should().Throw<MappingException>(); } [Test] public void WhenRegisteredAsRootThenCantRegisterAsJoinedSubclass() { var inspector = new ExplicitlyDeclaredModel(); - inspector.AddAsRootEntity(typeof(MyClass)); - inspector.Executing(x => x.AddAsTablePerClassEntity(typeof(MyClass))).Throws<MappingException>(); + inspector.AddAsRootEntity(typeof (MyClass)); + Executing.This(() => + { + inspector.AddAsTablePerClassEntity(typeof (MyClass)); + inspector.IsTablePerClass(typeof (MyClass)); + }).Should().Throw<MappingException>(); } [Test] public void WhenRegisteredAsRootThenCantRegisterAsUnionSubclass() { var inspector = new ExplicitlyDeclaredModel(); - inspector.AddAsRootEntity(typeof(MyClass)); - inspector.Executing(x => x.AddAsTablePerClassEntity(typeof(MyClass))).Throws<MappingException>(); + inspector.AddAsRootEntity(typeof (MyClass)); + Executing.This(() => + { + inspector.AddAsTablePerConcreteClassEntity(typeof (MyClass)); + inspector.IsTablePerClass(typeof (MyClass)); + }).Should().Throw<MappingException>(); } [Test] @@ -131,5 +143,18 @@ inspector.IsEntity(typeof(MyClass)).Should().Be.True(); } + + [Test] + public void WhenMultipleRootRegisteredThenThrowsMappingException() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsRootEntity(typeof(MyClass)); + inspector.AddAsRootEntity(typeof(Inherited1)); + Executing.This(()=> + { + inspector.AddAsTablePerClassEntity(typeof(Inherited2)); + inspector.IsTablePerClass(typeof(Inherited2)); + }).Should().Throw<MappingException>(); + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassMappingStrategyTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassMappingStrategyTests.cs 2011-05-06 14:14:41 UTC (rev 5799) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassMappingStrategyTests.cs 2011-05-08 22:59:17 UTC (rev 5800) @@ -50,17 +50,25 @@ inspector.AddAsRootEntity(typeof(MyClass)); inspector.AddAsTablePerClassHierarchyEntity(typeof(Inherited1)); - inspector.Executing(x => x.AddAsTablePerClassEntity(typeof(Inherited1))).Throws<MappingException>(); + Executing.This(() => + { + inspector.AddAsTablePerClassEntity(typeof(Inherited1)); + inspector.IsTablePerClass(typeof(Inherited1)); + }).Should().Throw<MappingException>(); } [Test] public void WhenRegisteredAsSubclassThenCantRegisterAsUnionSubclass() { var inspector = new ExplicitlyDeclaredModel(); - inspector.AddAsRootEntity(typeof(MyClass)); - inspector.AddAsTablePerClassHierarchyEntity(typeof(Inherited1)); + inspector.AddAsRootEntity(typeof (MyClass)); + inspector.AddAsTablePerClassHierarchyEntity(typeof (Inherited1)); - inspector.Executing(x => x.AddAsTablePerConcreteClassEntity(typeof(Inherited1))).Throws<MappingException>(); + Executing.This(() => + { + inspector.AddAsTablePerConcreteClassEntity(typeof (Inherited1)); + inspector.IsTablePerClassHierarchy(typeof (Inherited1)); + }).Should().Throw<MappingException>(); } [Test] Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/UnionSubclassMappingStrategyTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/UnionSubclassMappingStrategyTests.cs 2011-05-06 14:14:41 UTC (rev 5799) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/UnionSubclassMappingStrategyTests.cs 2011-05-08 22:59:17 UTC (rev 5800) @@ -47,20 +47,28 @@ public void WhenRegisteredAsUnionSubclassThenCantRegisterAsSubclass() { var inspector = new ExplicitlyDeclaredModel(); - inspector.AddAsRootEntity(typeof(MyClass)); - inspector.AddAsTablePerConcreteClassEntity(typeof(Inherited1)); + inspector.AddAsRootEntity(typeof (MyClass)); + inspector.AddAsTablePerConcreteClassEntity(typeof (Inherited1)); - inspector.Executing(x => x.AddAsTablePerClassHierarchyEntity(typeof(Inherited1))).Throws<MappingException>(); + Executing.This(() => + { + inspector.AddAsTablePerClassHierarchyEntity(typeof (Inherited1)); + inspector.IsTablePerConcreteClass(typeof (Inherited1)); + }).Should().Throw<MappingException>(); } [Test] public void WhenRegisteredAsUnionSubclassThenCantRegisterAsJoinedSubclass() { var inspector = new ExplicitlyDeclaredModel(); - inspector.AddAsRootEntity(typeof(MyClass)); - inspector.AddAsTablePerConcreteClassEntity(typeof(Inherited1)); + inspector.AddAsRootEntity(typeof (MyClass)); + inspector.AddAsTablePerConcreteClassEntity(typeof (Inherited1)); - inspector.Executing(x => x.AddAsTablePerClassEntity(typeof(Inherited1))).Throws<MappingException>(); + Executing.This(() => + { + inspector.AddAsTablePerClassEntity(typeof (Inherited1)); + inspector.IsTablePerConcreteClass(typeof (Inherited1)); + }).Should().Throw<MappingException>(); } [Test] Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/CallCustomConditions.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/CallCustomConditions.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/CallCustomConditions.cs 2011-05-08 22:59:17 UTC (rev 5800) @@ -0,0 +1,68 @@ +using System; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MixAutomapping +{ + public class CallCustomConditions + { + public enum ActivityType + { + Form = 1, + Custom = 2, + Email = 3 + } + + private class Activity : Entity + { + public virtual string Title { get; set; } + } + + private interface IEntity<T> + { + T Id { get; } + } + + private class Entity : IEntity<Guid> + { + #region IEntity<Guid> Members + + public virtual Guid Id { get; private set; } + + #endregion + } + + private class FormActivity : Activity { } + + [Test] + public void WhenCustomizeConditionsThenUseCustomConditionsToRecognizeRootEntities() + { + System.Type baseEntityType = typeof(Entity); + var inspector = new SimpleModelInspector(); + inspector.IsEntity((t, declared) => baseEntityType.IsAssignableFrom(t) && baseEntityType != t && !t.IsInterface); + inspector.IsRootEntity((t, declared) => baseEntityType.Equals(t.BaseType)); + + var mapper = new ModelMapper(inspector); + mapper.Class<Entity>(map => map.Id(x => x.Id, + m => + { + m.Generator(Generators.Guid); + m.Column("ID"); + })); + + mapper.Class<Activity>(map => + { + map.Discriminator(dm => + { + dm.Column("DISCRIMINATOR_TYPE"); + dm.NotNullable(true); + }); + map.DiscriminatorValue(0); + }); + mapper.Subclass<FormActivity>(map => map.DiscriminatorValue(1)); + + mapper.Executing(m=> m.CompileMappingFor(new[] { typeof(Activity), typeof(FormActivity) })).NotThrows(); + } + } +} \ 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-06 14:14:41 UTC (rev 5799) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-08 22:59:17 UTC (rev 5800) @@ -585,6 +585,7 @@ <Compile Include="MappingByCode\MappersTests\UnionSubclassMapperTests\TablesSincronizationTests.cs" /> <Compile Include="MappingByCode\MixAutomapping\ArrayCollectionTests.cs" /> <Compile Include="MappingByCode\MixAutomapping\BagCollectionTests.cs" /> + <Compile Include="MappingByCode\MixAutomapping\CallCustomConditions.cs" /> <Compile Include="MappingByCode\MixAutomapping\Compone... [truncated message content] |
From: <fab...@us...> - 2011-05-09 14:14:18
|
Revision: 5801 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5801&view=rev Author: fabiomaulo Date: 2011-05-09 14:14:11 +0000 (Mon, 09 May 2011) Log Message: ----------- Fix NH-2510 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Type/TypeHelper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2510/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2510/Fixture.cs Modified: trunk/nhibernate/src/NHibernate/Type/TypeHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TypeHelper.cs 2011-05-08 22:59:17 UTC (rev 5800) +++ trunk/nhibernate/src/NHibernate/Type/TypeHelper.cs 2011-05-09 14:14:11 UTC (rev 5801) @@ -61,10 +61,17 @@ /// <returns></returns> public static object[] Assemble(object[] row, ICacheAssembler[] types, ISessionImplementor session, object owner) { - object[] assembled = new object[row.Length]; + var assembled = new object[row.Length]; for (int i = 0; i < row.Length; i++) { - assembled[i] = types[i].Assemble(row[i], session, owner); + if (row[i] == LazyPropertyInitializer.UnfetchedProperty || row[i] == BackrefPropertyAccessor.Unknown) + { + assembled[i] = row[i]; + } + else + { + assembled[i] = types[i].Assemble(row[i], session, owner); + } } return assembled; } @@ -110,10 +117,17 @@ public static object[] Replace(object[] original, object[] target, IType[] types, ISessionImplementor session, object owner, IDictionary copiedAlready) { - object[] copied = new object[original.Length]; + var copied = new object[original.Length]; for (int i = 0; i < original.Length; i++) { - copied[i] = types[i].Replace(original[i], target[i], session, owner, copiedAlready); + if (original[i] == LazyPropertyInitializer.UnfetchedProperty || original[i] == BackrefPropertyAccessor.Unknown) + { + copied[i] = target[i]; + } + else + { + copied[i] = types[i].Replace(original[i], target[i], session, owner, copiedAlready); + } } return copied; } @@ -225,7 +239,7 @@ for (int i = 0; i < span; i++) { bool dirty = - // TODO H3: x[ i ] != LazyPropertyInitializer.UnfetchedProperty && //x is the "current" state + currentState[i] != LazyPropertyInitializer.UnfetchedProperty && properties[i].IsDirtyCheckable(anyUninitializedProperties) && properties[i].Type.IsDirty(previousState[i], currentState[i], includeColumns[i], session); @@ -276,7 +290,7 @@ for (int i = 0; i < span; i++) { bool dirty = - // TODO H3: x[ i ] != LazyPropertyInitializer.UnfetchedProperty && //x is the "current" state + currentState[i] != LazyPropertyInitializer.UnfetchedProperty && properties[i].IsDirtyCheckable(anyUninitializedProperties) && properties[i].Type.IsModified(previousState[i], currentState[i], includeColumns[i], session); Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2510/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2510/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2510/Fixture.cs 2011-05-09 14:14:11 UTC (rev 5801) @@ -0,0 +1,77 @@ +using System; +using NHibernate.Cache; +using NHibernate.Cfg; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH2510 +{ + public class Image + { + public virtual int Id { get; set; } + public virtual byte[] Data { get; set; } + } + public class Fixture: TestCaseMappingByCode + { + protected override HbmMapping GetMappings() + { + var mapper = new ModelMapper(); + mapper.Class<Image>(rc => + { + rc.Cache(map => map.Usage(CacheUsage.NonstrictReadWrite)); + rc.Id(x=> x.Id); + rc.Property(x => x.Data, map=> map.Lazy(true)); + }); + var mappings = mapper.CompileMappingForAllExplicitAddedEntities(); + return mappings; + } + + protected override void Configure(Cfg.Configuration configuration) + { + configuration.Cache(x=> x.Provider<HashtableCacheProvider>()); + } + + private class Scenario: IDisposable + { + private readonly ISessionFactory factory; + + public Scenario(ISessionFactory factory) + { + this.factory = factory; + using (var session = factory.OpenSession()) + using (session.BeginTransaction()) + { + session.Persist(new Image { Id = 1 }); + session.Transaction.Commit(); + } + } + + public void Dispose() + { + using (var session = factory.OpenSession()) + using (session.BeginTransaction()) + { + session.CreateQuery("delete from Image").ExecuteUpdate(); + session.Transaction.Commit(); + } + } + } + + [Test] + public void WhenReadFromCacheThenDoesNotThrow() + { + using (new Scenario(Sfi)) + { + using (ISession s = OpenSession()) + { + var book = s.Get<Image>(1); + } + using (ISession s = OpenSession()) + { + var book = s.Get<Image>(1); + } + } + } + } +} \ 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-08 22:59:17 UTC (rev 5800) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-09 14:14:11 UTC (rev 5801) @@ -784,6 +784,7 @@ <Compile Include="NHSpecificTest\NH2505\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2507\Animal.cs" /> <Compile Include="NHSpecificTest\NH2507\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2510\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2527\FixtureWithNoBatcher.cs" /> <Compile Include="NHSpecificTest\NH2527\Model.cs" /> <Compile Include="NHSpecificTest\NH2530\Domain.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-05-09 16:00:18
|
Revision: 5802 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5802&view=rev Author: fabiomaulo Date: 2011-05-09 16:00:11 +0000 (Mon, 09 May 2011) Log Message: ----------- Fix NH-2684 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/ConfigurationExtensions.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Cfg/Loquacious/INamedQueryDefinitionBuilder.cs trunk/nhibernate/src/NHibernate.Test/CfgTest/Loquacious/NamedQueryTests.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/ConfigurationExtensions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/ConfigurationExtensions.cs 2011-05-09 14:14:11 UTC (rev 5801) +++ trunk/nhibernate/src/NHibernate/Cfg/ConfigurationExtensions.cs 2011-05-09 16:00:11 UTC (rev 5802) @@ -1,6 +1,7 @@ using System; using NHibernate.Cfg.Loquacious; using NHibernate.Context; +using NHibernate.Engine; using NHibernate.Hql; using NHibernate.Linq.Functions; using NHibernate.Util; @@ -136,6 +137,26 @@ return configuration; } + public static Configuration AddNamedQuery(this Configuration configuration, string queryIdentifier, Action<INamedQueryDefinitionBuilder> namedQueryDefinition) + { + if (configuration == null) + { + throw new ArgumentNullException("configuration"); + } + if (queryIdentifier == null) + { + throw new ArgumentNullException("queryIdentifier"); + } + if (namedQueryDefinition == null) + { + throw new ArgumentNullException("namedQueryDefinition"); + } + var builder = new NamedQueryDefinitionBuilder(); + namedQueryDefinition(builder); + configuration.NamedQueries.Add(queryIdentifier, builder.Build()); + return configuration; + } + private static Mappings GetMappings(Configuration configuration) { Dialect.Dialect dialect = Dialect.Dialect.GetDialect(configuration.Properties); Added: trunk/nhibernate/src/NHibernate/Cfg/Loquacious/INamedQueryDefinitionBuilder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Loquacious/INamedQueryDefinitionBuilder.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Cfg/Loquacious/INamedQueryDefinitionBuilder.cs 2011-05-09 16:00:11 UTC (rev 5802) @@ -0,0 +1,79 @@ +using System.Collections.Generic; +using NHibernate.Engine; + +namespace NHibernate.Cfg.Loquacious +{ + public interface INamedQueryDefinitionBuilder + { + bool IsCacheable { get; set; } + string CacheRegion { get; set; } + int FetchSize { get; set; } + int Timeout { get; set; } + FlushMode FlushMode { get; set; } + string Query { get; set; } + bool IsReadOnly { get; set; } + string Comment { get; set; } + CacheMode? CacheMode { get; set; } + } + + internal class NamedQueryDefinitionBuilder : INamedQueryDefinitionBuilder + { + private int fetchSize = -1; + private int timeout = -1; + + public NamedQueryDefinitionBuilder() + { + FlushMode = FlushMode.Unspecified; + } + + #region INamedQueryDefinitionBuilder Members + + public bool IsCacheable { get; set; } + public string CacheRegion { get; set; } + + public int FetchSize + { + get { return fetchSize; } + set + { + if (value > 0) + { + fetchSize = value; + } + else + { + fetchSize = -1; + } + } + } + + public int Timeout + { + get { return timeout; } + set + { + if (value > 0) + { + timeout = value; + } + else + { + timeout = -1; + } + } + } + + public FlushMode FlushMode { get; set; } + public string Query { get; set; } + public bool IsReadOnly { get; set; } + public string Comment { get; set; } + public CacheMode? CacheMode { get; set; } + + #endregion + + public NamedQueryDefinition Build() + { + return new NamedQueryDefinition(Query, IsCacheable, CacheRegion, Timeout, FetchSize, FlushMode, CacheMode ,IsReadOnly, Comment, new Dictionary<string, string>(1)); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-05-09 14:14:11 UTC (rev 5801) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-05-09 16:00:11 UTC (rev 5802) @@ -113,6 +113,7 @@ <Compile Include="Cache\Timestamper.cs" /> <Compile Include="Cache\UpdateTimestampsCache.cs" /> <Compile Include="CallbackException.cs" /> + <Compile Include="Cfg\Loquacious\INamedQueryDefinitionBuilder.cs" /> <Compile Include="Cfg\MappingsQueue.cs" /> <Compile Include="Cfg\Configuration.cs" /> <Compile Include="Cfg\ConfigurationSectionHandler.cs" /> Added: trunk/nhibernate/src/NHibernate.Test/CfgTest/Loquacious/NamedQueryTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/CfgTest/Loquacious/NamedQueryTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/CfgTest/Loquacious/NamedQueryTests.cs 2011-05-09 16:00:11 UTC (rev 5802) @@ -0,0 +1,76 @@ +using System.Linq; +using NHibernate.Cfg; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.CfgTest.Loquacious +{ + public class NamedQueryTests + { + [Test] + public void AddSimpleNamedQuery() + { + var configure = new Configuration(); + configure.AddNamedQuery("aQuery", b => + { + b.Query = "from System.Object o"; + }); + + configure.NamedQueries.Should().Have.Count.EqualTo(1); + configure.NamedQueries.Keys.Single().Should().Be("aQuery"); + configure.NamedQueries.Values.Single().Query.Should().Be("from System.Object o"); + } + + [Test] + public void WhenSetInvalidFetchSizeThenLeaveDefault() + { + var configure = new Configuration(); + configure.AddNamedQuery("aQuery", b => + { + b.Query = "from System.Object o"; + b.FetchSize = 0; + }); + + configure.NamedQueries.Values.Single().FetchSize.Should().Be(-1); + } + + [Test] + public void WhenSetValidFetchSizeThenSetValue() + { + var configure = new Configuration(); + configure.AddNamedQuery("aQuery", b => + { + b.Query = "from System.Object o"; + b.FetchSize = 15; + }); + + configure.NamedQueries.Values.Single().FetchSize.Should().Be(15); + } + + [Test] + public void WhenSetInvalidTimeoutThenLeaveDefault() + { + var configure = new Configuration(); + configure.AddNamedQuery("aQuery", b => + { + b.Query = "from System.Object o"; + b.Timeout = 0; + }); + + configure.NamedQueries.Values.Single().Timeout.Should().Be(-1); + } + + [Test] + public void WhenSetValidTimeoutThenSetValue() + { + var configure = new Configuration(); + configure.AddNamedQuery("aQuery", b => + { + b.Query = "from System.Object o"; + b.Timeout = 123; + }); + + configure.NamedQueries.Values.Single().Timeout.Should().Be(123); + } + } +} \ 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-09 14:14:11 UTC (rev 5801) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-09 16:00:11 UTC (rev 5802) @@ -151,6 +151,7 @@ <Compile Include="CfgTest\Loquacious\EntityCacheConfigurationFixture.cs" /> <Compile Include="CfgTest\Loquacious\EntityToCache.cs" /> <Compile Include="CfgTest\Loquacious\LambdaConfigurationFixture.cs" /> + <Compile Include="CfgTest\Loquacious\NamedQueryTests.cs" /> <Compile Include="CfgTest\Loquacious\TypeDefinitionFixture.cs" /> <Compile Include="CfgTest\MappingDocumentAggregatorTests.cs" /> <Compile Include="CfgTest\MappingDocumentParserTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-05-09 22:19:25
|
Revision: 5805 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5805&view=rev Author: fabiomaulo Date: 2011-05-09 22:19:18 +0000 (Mon, 09 May 2011) Log Message: ----------- Passing test for NH-2100 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2100/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2100/Domain.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2100/Fixture.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs 2011-05-09 21:20:24 UTC (rev 5804) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs 2011-05-09 22:19:18 UTC (rev 5805) @@ -29,14 +29,19 @@ BeforeMapComponent += ComponentParentNoSetterToField; BeforeMapBag += MemberToFieldAccessor; + BeforeMapIdBag += MemberToFieldAccessor; BeforeMapSet += MemberToFieldAccessor; BeforeMapMap += MemberToFieldAccessor; BeforeMapList += MemberToFieldAccessor; + BeforeMapBag += MemberNoSetterToField; + BeforeMapIdBag += MemberNoSetterToField; BeforeMapSet += MemberNoSetterToField; BeforeMapMap += MemberNoSetterToField; BeforeMapList += MemberNoSetterToField; + BeforeMapBag += MemberReadOnlyAccessor; + BeforeMapIdBag += MemberReadOnlyAccessor; BeforeMapSet += MemberReadOnlyAccessor; BeforeMapMap += MemberReadOnlyAccessor; BeforeMapList += MemberReadOnlyAccessor; Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2100/Domain.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2100/Domain.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2100/Domain.cs 2011-05-09 22:19:18 UTC (rev 5805) @@ -0,0 +1,60 @@ +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace NHibernate.Test.NHSpecificTest.NH2100 +{ + public abstract class DomainObject + { + public virtual int ID { get; set; } + public virtual int EntityVersion { get; set; } + } + + public class Class1 : DomainObject + { + private readonly IList<Class2> _class2List = new List<Class2>(); + + public virtual void AddClass2(Class2 toAdd) + { + if (false == _class2List.Contains(toAdd)) + { + _class2List.Add(toAdd); + toAdd.AddClass1(this); + } + } + + public virtual ReadOnlyCollection<Class2> Class2List + { + get { return new ReadOnlyCollection<Class2>(_class2List); } + } + } + + public class Class1DTO : DTO + { + public Class2DTO[] Class2Ary { get; set; } + } + + /// <summary> + /// RG + /// </summary> + public class Class2 : DomainObject + { + private readonly IList<Class1> _class1List = new List<Class1>(); + + public virtual void AddClass1(Class1 toAdd) + { + if (false == _class1List.Contains(toAdd)) + { + _class1List.Add(toAdd); + toAdd.AddClass2(this); + } + } + } + + public class Class2DTO : DTO { } + + public abstract class DTO + { + public int ID; + public int EntityVersion; + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2100/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2100/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2100/Fixture.cs 2011-05-09 22:19:18 UTC (rev 5805) @@ -0,0 +1,121 @@ +using System; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2100 +{ + public class Fixture : TestCaseMappingByCode + { + protected override HbmMapping GetMappings() + { + var mapper = new ConventionModelMapper(); + System.Type baseEntityType = typeof (DomainObject); + mapper.IsEntity((t, declared) => baseEntityType.IsAssignableFrom(t) && !baseEntityType.Equals(t)); + mapper.IsRootEntity((t, declared) => baseEntityType.Equals(t.BaseType)); + mapper.Class<DomainObject>(r => + { + r.Version(x => x.EntityVersion, map => { }); + r.Id(x => x.ID, map => map.Generator(Generators.Native)); + }); + mapper.Class<Class1>(r => { r.IdBag(x => x.Class2List, map => map.Inverse(true), rel => rel.ManyToMany()); }); + mapper.Class<Class2>(r => { r.IdBag<Class1>("_class1List", map => { }, rel => rel.ManyToMany()); }); + HbmMapping mappings = mapper.CompileMappingFor(new[] {typeof (Class1), typeof (Class2)}); + Console.WriteLine(mappings.AsString()); + return mappings; + } + + [Test] + public void WhenTwoTransactionInSameSessionThenNotChangeVersion() + { + // the second transaction does not change the entity state + Class1 c1_1; + Class1 c1_2; + Class2 c2_1; + Class2 c2_2; + int originalVersionC1_1; + int originalVersionC1_2; + int originalVersionC2_1; + int originalVersionC2_2; + c1_1 = new Class1(); + c1_2 = new Class1(); + + c2_1 = new Class2(); + c2_2 = new Class2(); + + c1_1.AddClass2(c2_1); + c1_2.AddClass2(c2_2); + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + s.Save(c2_1); + s.Save(c1_1); + s.Save(c2_2); + s.Save(c1_2); + tx.Commit(); + } + originalVersionC1_1 = c1_1.EntityVersion; + originalVersionC1_2 = c1_2.EntityVersion; + originalVersionC2_1 = c2_1.EntityVersion; + originalVersionC2_2 = c2_2.EntityVersion; + + using (ITransaction tx = s.BeginTransaction()) + { + s.Refresh(c1_1); // The addition of these two Refresh calls fixes the entity version issue + s.Refresh(c1_2); + + var class1dto = + new Class1DTO {ID = c1_1.ID, EntityVersion = c1_1.EntityVersion}; + + if (c1_1.Class2List.Count > 0) + { + class1dto.Class2Ary = new Class2DTO[c1_1.Class2List.Count]; + for (int i = 0; i < c1_1.Class2List.Count; ++i) + { + Class2 cl2 = c1_1.Class2List[i]; + class1dto.Class2Ary[i] = new Class2DTO {ID = cl2.ID, EntityVersion = cl2.EntityVersion}; + } + } + + tx.Commit(); + } + // After close the second transaction the version was not changed + c1_1.EntityVersion.Should().Be(originalVersionC1_1); + c1_2.EntityVersion.Should().Be(originalVersionC1_2); + c2_1.EntityVersion.Should().Be(originalVersionC2_1); + c2_2.EntityVersion.Should().Be(originalVersionC2_2); + } + + // After close the session the version was not changed + c1_1.EntityVersion.Should().Be(originalVersionC1_1); + c1_2.EntityVersion.Should().Be(originalVersionC1_2); + c2_1.EntityVersion.Should().Be(originalVersionC2_1); + c2_2.EntityVersion.Should().Be(originalVersionC2_2); + + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + c2_1 = s.Get<Class2>(c2_1.ID); + c1_1 = s.Get<Class1>(c1_1.ID); + c2_2 = s.Get<Class2>(c2_2.ID); + c1_2 = s.Get<Class1>(c1_2.ID); + + // to be 100% sure the version was not changed in DB + c1_1.EntityVersion.Should().Be(originalVersionC1_1); + c1_2.EntityVersion.Should().Be(originalVersionC1_2); + c2_1.EntityVersion.Should().Be(originalVersionC2_1); + c2_2.EntityVersion.Should().Be(originalVersionC2_2); + + s.Delete(c2_1); + s.Delete(c1_1); + s.Delete(c2_2); + s.Delete(c1_2); + tx.Commit(); + } + } + } + } +} \ 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-09 21:20:24 UTC (rev 5804) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-09 22:19:18 UTC (rev 5805) @@ -662,6 +662,8 @@ <Compile Include="NHSpecificTest\NH2043\Domain.cs" /> <Compile Include="NHSpecificTest\NH2043\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2056\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2100\Domain.cs" /> + <Compile Include="NHSpecificTest\NH2100\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2111\A.cs" /> <Compile Include="NHSpecificTest\NH2111\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2112\Fixture.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-05-10 16:57:31
|
Revision: 5807 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5807&view=rev Author: fabiomaulo Date: 2011-05-10 16:57:24 +0000 (Tue, 10 May 2011) Log Message: ----------- Fix NH-2697 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Engine/ISessionFactoryImplementor.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/PolymorphicQuerySourceDetector.cs trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleGroupItem.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleItem.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/SampleTest.cs Modified: trunk/nhibernate/src/NHibernate/Engine/ISessionFactoryImplementor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/ISessionFactoryImplementor.cs 2011-05-09 22:21:23 UTC (rev 5806) +++ trunk/nhibernate/src/NHibernate/Engine/ISessionFactoryImplementor.cs 2011-05-10 16:57:24 UTC (rev 5807) @@ -86,9 +86,9 @@ /// <summary> /// Get the names of all persistent classes that implement/extend the given interface/class /// </summary> - /// <param name="className"></param> - /// <returns></returns> - string[] GetImplementors(string className); + /// <param name="entityOrClassName">The entity-name, the class name or full name, the imported class name.</param> + /// <returns>All implementors class names.</returns> + string[] GetImplementors(string entityOrClassName); /// <summary> /// Get a class name, using query language imports Modified: trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/PolymorphicQuerySourceDetector.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/PolymorphicQuerySourceDetector.cs 2011-05-09 22:21:23 UTC (rev 5806) +++ trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/PolymorphicQuerySourceDetector.cs 2011-05-10 16:57:24 UTC (rev 5807) @@ -20,34 +20,31 @@ _sessionFactoryHelper = new SessionFactoryHelper(sfi); } - public Dictionary<IASTNode, IASTNode[]> Process(IASTNode tree) - { - foreach (var querySource in new QuerySourceDetector(tree).LocateQuerySources()) - { - var className = GetClassName(querySource); - var classType = _sessionFactoryHelper.GetImportedClass(className); + public Dictionary<IASTNode, IASTNode[]> Process(IASTNode tree) + { + foreach (var querySource in new QuerySourceDetector(tree).LocateQuerySources()) + { + var className = GetClassName(querySource); + string[] implementors = _sfi.GetImplementors(className); + AddImplementorsToMap(querySource, className, implementors); + } - AddImplementorsToMap(querySource, classType == null ? className : classType.FullName); - } + return _map; + } - return _map; - } + private void AddImplementorsToMap(IASTNode querySource, string className, string[] implementors) + { + if (implementors.Length == 1 && implementors[0] == className) + { + // No need to change things + return; + } - private void AddImplementorsToMap(IASTNode querySource, string className) - { - var implementors = _sfi.GetImplementors(className); + _map.Add(querySource, + implementors.Select(implementor => MakeIdent(querySource, implementor)).ToArray()); + } - if (implementors.Length == 1 && implementors[0] == className) - { - // No need to change things - return; - } - - _map.Add(querySource, - implementors.Select(implementor => MakeIdent(querySource, implementor)).ToArray()); - } - - private static string GetClassName(IASTNode querySource) + private static string GetClassName(IASTNode querySource) { switch (querySource.Type) { Modified: trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs 2011-05-09 22:21:23 UTC (rev 5806) +++ trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs 2011-05-10 16:57:24 UTC (rev 5807) @@ -588,22 +588,22 @@ /// given class or interface, accounting for implicit/explicit polymorphism settings /// and excluding mapped subclasses/joined-subclasses of other classes in the result. /// </summary> - public string[] GetImplementors(string className) + public string[] GetImplementors(string entityOrClassName) { System.Type clazz = null; // NH Different implementation for performance: a class without at least a namespace sure can't be found by reflection - if (className.IndexOf('.') > 0) + if (entityOrClassName.IndexOf('.') > 0) { IEntityPersister checkPersister; // NH Different implementation: we have better performance checking, first of all, if we know the class // and take the System.Type directly from the persister (className have high probability to be entityName) - if (entityPersisters.TryGetValue(className, out checkPersister)) + if (entityPersisters.TryGetValue(entityOrClassName, out checkPersister)) { if(!checkPersister.EntityMetamodel.HasPocoRepresentation) { // we found the persister but it is a dynamic entity without class - return new[] { className }; + return new[] { entityOrClassName }; } // NH : take care with this because we are forcing the Poco EntityMode clazz = checkPersister.GetMappedClass(EntityMode.Poco); @@ -613,7 +613,7 @@ { try { - clazz = ReflectHelper.ClassForFullNameOrNull(className); + clazz = ReflectHelper.ClassForFullNameOrNull(entityOrClassName); } catch (Exception) { @@ -624,29 +624,40 @@ if (clazz == null) { - return new[] {className}; //for a dynamic-class + // try to get the class from imported names + string importedName = GetImportedClassName(entityOrClassName); + if (importedName != null) + { + clazz = System.Type.GetType(importedName, false); + } } + if (clazz == null) + { + return new[] {entityOrClassName}; //for a dynamic-class + } + List<string> results = new List<string>(); foreach (IEntityPersister p in entityPersisters.Values) { IQueryable q = p as IQueryable; if (q != null) { - string testClassName = q.EntityName; - bool isMappedClass = className.Equals(testClassName); + string registeredEntityName = q.EntityName; + // NH: as entity-name we are using the FullName but in HQL we allow just the Name, the class is mapped even when its FullName match the entity-name + bool isMappedClass = entityOrClassName.Equals(registeredEntityName) || clazz.FullName.Equals(registeredEntityName); if (q.IsExplicitPolymorphism) { if (isMappedClass) { - return new string[] {testClassName}; // NOTE EARLY EXIT + return new string[] {registeredEntityName}; // NOTE EARLY EXIT } } else { if (isMappedClass) { - results.Add(testClassName); + results.Add(registeredEntityName); } else { @@ -665,7 +676,7 @@ } if (!assignableSuperclass) { - results.Add(testClassName); + results.Add(registeredEntityName); } } } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleGroupItem.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleGroupItem.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleGroupItem.cs 2011-05-10 16:57:24 UTC (rev 5807) @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NHibernate.Test.NHSpecificTest.NH2697 +{ + public class ArticleGroupItem + { + public virtual int Articlegroupid { get; set; } + public virtual string Name { get; set; } + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleItem.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleItem.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleItem.cs 2011-05-10 16:57:24 UTC (rev 5807) @@ -0,0 +1,15 @@ + + +using System; +namespace NHibernate.Test.NHSpecificTest.NH2697 + +{ + public class ArticleItem + { + public virtual int Articleid { get; set; } + public virtual Int16 IsFavorite { get; set; } + public virtual string Name { get; set; } + public virtual ArticleGroupItem Articlegroup { get; set; } + + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/Mappings.hbm.xml 2011-05-10 16:57:24 UTC (rev 5807) @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8" ?> + +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.Test" namespace="NHibernate.Test.NHSpecificTest.NH2697"> + + <class name="ArticleItem" table="ARTICLES" lazy="true" dynamic-update="true" + entity-name="Article" polymorphism="explicit"> + <id name="Articleid" column="ARTICLEID" type="int" unsaved-value="0"> + <generator class="native" > + <param name="sequence">gen_articles_id</param> + </generator> + </id> + <property name="IsFavorite" column="ISFAVORITE" type="short" not-null="true"/> + <many-to-one name="Articlegroup" column="ARTICLEGROUPID" class="ArticleGroupItem" cascade="none" not-null="false"/> + <property name="Name" column="NAME" type="string" length="200" not-null="false"/> + </class> + + <class name="ArticleItem" table="ACTIVITY_ARTICLES" lazy="true" dynamic-update="true" + entity-name="ActivityArticle" polymorphism="explicit"> + <id name="Articleid" column="ARTICLEID" type="int" unsaved-value="0"> + <generator class="native" > + <param name="sequence">gen_articles_id</param> + </generator> + </id> + <property name="Name" column="NAME" type="string" length="200" not-null="false"/> + </class> + + <class name="ArticleGroupItem" table="ARTICLEGROUPS" lazy="true" dynamic-update="true"> + <id name="Articlegroupid" column="ARTICLEGROUPID" type="int" unsaved-value="0"> + <generator class="native" > + <param name="sequence">gen_pk_ArticleGroups</param> + </generator> + </id> + <property name="Name" column="NAME" type="string" length="200" not-null="false"/> + </class> + +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/SampleTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/SampleTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/SampleTest.cs 2011-05-10 16:57:24 UTC (rev 5807) @@ -0,0 +1,149 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using NHibernate.Dialect; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2697 +{ + [TestFixture] + public class SampleTest : BugTestCase + { + protected override void OnSetUp() + { + base.OnSetUp(); + using (ISession session = this.OpenSession()) { + ArticleGroupItem agrp_1 = new ArticleGroupItem(); + agrp_1.Name = "Article group 1"; + session.Save(agrp_1); + ArticleGroupItem agrp_2 = new ArticleGroupItem(); + agrp_2.Name = "Article group 2"; + session.Save(agrp_2); + session.Flush(); + + ArticleItem article_1 = new ArticleItem(); + article_1.Articlegroup = agrp_1; + article_1.Name = "Article 1 grp 1"; + article_1.IsFavorite = 0; + session.Save("Article", article_1); + + ArticleItem article_2 = new ArticleItem(); + article_2.Articlegroup = agrp_1; + article_2.Name = "Article 2 grp 1"; + article_2.IsFavorite = 1; + session.Save("Article", article_2); + + ArticleItem article_3 = new ArticleItem(); + article_3.Articlegroup = agrp_2; + article_3.Name = "Article 1 grp 2"; + article_3.IsFavorite = 0; + session.Save("Article", article_3); + + session.Flush(); + } + } + + protected override void OnTearDown() + { + base.OnTearDown(); + + + using (ISession session = this.OpenSession()) { + IList<ArticleItem> list = session.CreateCriteria("Article").List<ArticleItem>(); + foreach (ArticleItem item in list) + session.Delete("Article", item); + session.Flush(); + } + + //Articles where not removed (!?) + //using (ISession session = this.OpenSession()) { + // string hql = "from Article"; + // session.Delete(hql); + // session.Flush(); + //} + + using (ISession session = this.OpenSession()) { + string hql = "from ArticleGroupItem"; + session.Delete(hql); + session.Flush(); + } + + } + + [Test] + public void Can_GetListOfArticleGroups() + { + string HQL; + IList<ArticleGroupItem> result; + + //add new + using (ISession session = this.OpenSession()) { + ArticleGroupItem item = new ArticleGroupItem(); + item.Name = "Test article group"; + session.Save(item); + session.Flush(); + } + + HQL = "from ArticleGroupItem"; + using (ISession session = this.OpenSession()) { + result = session.CreateQuery(HQL).List<ArticleGroupItem>(); + } + result.Count.Should().Be.GreaterThan(0); + } + + [Test] + public void Can_GetListOfArticles() + { + string HQL; + IList<ArticleItem> result; + + //add new + using (ISession session = this.OpenSession()) { + ArticleItem item = new ArticleItem(); + item.Name = "Test article"; + item.IsFavorite = 0; + session.Save("Article", item); + session.Flush(); + } + + //here first problem, no entities are returned <======== + HQL = "from Article"; + using (ISession session = this.OpenSession()) { + result = session.CreateQuery(HQL).List<ArticleItem>(); + } + result.Count.Should().Be.GreaterThan(0); + } + + + + [Test] + public void Can_SetArticleFavoriteWithHQL_NamedParam() + { + string HQL; + IList<ArticleItem> result; + + Int16 isFavValue = 1; + + //set isFavorite for all articles + HQL = "update Article a set a.IsFavorite= :Fav"; + using (ISession session = this.OpenSession()) { + session.CreateQuery(HQL) + .SetInt16("Fav", isFavValue) //Exception !! + //.SetParameter("Fav", isFavValue) //Exception also !! + .ExecuteUpdate(); + + session.Flush(); + } + + //Check if some articles have isFavorite=1 + HQL = "from Article a where a.IsFavorite=1"; + using (ISession session = this.OpenSession()) { + result = session.CreateQuery(HQL).List<ArticleItem>(); + } + result.Count.Should().Be.GreaterThan(0); + + } + } +} Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-09 22:21:23 UTC (rev 5806) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-10 16:57:24 UTC (rev 5807) @@ -819,6 +819,9 @@ <Compile Include="NHSpecificTest\NH2660And2661\Test.cs" /> <Compile Include="NHSpecificTest\NH2673\Blog.cs" /> <Compile Include="NHSpecificTest\NH2673\CachingWithTrasformerTests.cs" /> + <Compile Include="NHSpecificTest\NH2697\ArticleGroupItem.cs" /> + <Compile Include="NHSpecificTest\NH2697\ArticleItem.cs" /> + <Compile Include="NHSpecificTest\NH2697\SampleTest.cs" /> <Compile Include="NHSpecificTest\Properties\CompositePropertyRefTest.cs" /> <Compile Include="NHSpecificTest\Properties\DynamicEntityTest.cs" /> <Compile Include="NHSpecificTest\Properties\Model.cs" /> @@ -2661,6 +2664,7 @@ <EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> + <EmbeddedResource Include="NHSpecificTest\NH2697\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1642\Mappings.hbm.xml" /> <EmbeddedResource Include="Stateless\Contact.hbm.xml" /> <EmbeddedResource Include="Stateless\Fetching\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-05-10 23:09:46
|
Revision: 5810 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5810&view=rev Author: fabiomaulo Date: 2011-05-10 23:09:40 +0000 (Tue, 10 May 2011) Log Message: ----------- The problem with ProxyCache seems fixed Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/ProxyCache.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1789/ProxyEqualityProblemTest.cs Modified: trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/ProxyCache.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/ProxyCache.cs 2011-05-10 18:21:57 UTC (rev 5809) +++ trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/ProxyCache.cs 2011-05-10 23:09:40 UTC (rev 5810) @@ -8,12 +8,13 @@ using System; using System.Collections.Generic; +using NHibernate.Util; namespace NHibernate.Proxy.DynamicProxy { public class ProxyCache : IProxyCache { - private readonly Dictionary<ProxyCacheEntry, System.Type> cache = new Dictionary<ProxyCacheEntry, System.Type>(); + private readonly IDictionary<ProxyCacheEntry, System.Type> cache = new ThreadSafeDictionary<ProxyCacheEntry, System.Type>(new Dictionary<ProxyCacheEntry, System.Type>()); private readonly object syncObject = new object(); #region IProxyCache Members Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1789/ProxyEqualityProblemTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1789/ProxyEqualityProblemTest.cs 2011-05-10 18:21:57 UTC (rev 5809) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1789/ProxyEqualityProblemTest.cs 2011-05-10 23:09:40 UTC (rev 5810) @@ -96,7 +96,7 @@ /// <summary> /// That's how I discovered something was wrong: here my object is not found in the collection, even if it's there. /// </summary> - [Test, Ignore("To investigate. When run with the whole tests suit it fail...probably something related with the ProxyCache.")] + [Test]//, Ignore("To investigate. When run with the whole tests suit it fail...probably something related with the ProxyCache.")] public void TestTheProblemWithCollection() { using (ISession session = OpenSession()) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-05-12 16:27:17
|
Revision: 5811 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5811&view=rev Author: fabiomaulo Date: 2011-05-12 16:27:11 +0000 (Thu, 12 May 2011) Log Message: ----------- Fix NH-2690 NH-2421 NH-2422 thanks to Andrei Alecu Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/LinqFutureFixture.cs trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs Modified: trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2011-05-10 23:09:40 UTC (rev 5810) +++ trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2011-05-12 16:27:11 UTC (rev 5811) @@ -515,7 +515,7 @@ ITranslator translator = Translators[i]; QueryParameters parameter = Parameters[i]; IList tempResults; - if (resultCollectionGenericType[i] == typeof(object)) + if (resultCollectionGenericType[i] == typeof(object) || parameter.ResultTransformer != null) { tempResults = new ArrayList(); } Modified: trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs 2011-05-10 23:09:40 UTC (rev 5810) +++ trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs 2011-05-12 16:27:11 UTC (rev 5811) @@ -4,6 +4,7 @@ using System.Linq.Expressions; using NHibernate.Engine; using NHibernate.Impl; +using Remotion.Linq; namespace NHibernate.Linq { @@ -48,20 +49,20 @@ public static IEnumerable<T> ToFuture<T>(this IQueryable<T> query) { - var nhQueryable = query as NhQueryable<T>; + var nhQueryable = query as QueryableBase<T>; if (nhQueryable == null) - throw new NotSupportedException("You can also use the AsFuture() method on NhQueryable"); + throw new NotSupportedException("Query needs to be of type QueryableBase<T>"); - var future = ((INhQueryProvider)nhQueryable.Provider).ExecuteFuture(nhQueryable.Expression); + var future = ((INhQueryProvider) nhQueryable.Provider).ExecuteFuture(nhQueryable.Expression); return (IEnumerable<T>)future; } public static IFutureValue<T> ToFutureValue<T>(this IQueryable<T> query) { - var nhQueryable = query as NhQueryable<T>; + var nhQueryable = query as QueryableBase<T>; if (nhQueryable == null) - throw new NotSupportedException("You can also use the AsFuture() method on NhQueryable"); + throw new NotSupportedException("Query needs to be of type QueryableBase<T>"); var future = ((INhQueryProvider)nhQueryable.Provider).ExecuteFuture(nhQueryable.Expression); if(future is DelayedEnumerator<T>) Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/LinqFutureFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/LinqFutureFixture.cs 2011-05-10 23:09:40 UTC (rev 5810) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/LinqFutureFixture.cs 2011-05-12 16:27:11 UTC (rev 5811) @@ -75,6 +75,83 @@ } [Test] + public void CanUseFutureQueryWithAnonymousType() + { + using (var s = sessions.OpenSession()) + { + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); + + var persons = s.Query<Person>() + .Select(p => new {Id = p.Id, Name = p.Name}) + .ToFuture(); + var persons5 = s.Query<Person>() + .Select(p => new { Id = p.Id, Name = p.Name }) + .Take(5) + .ToFuture(); + + using (var logSpy = new SqlLogSpy()) + { + persons5.ToList(); // initialize the enumerable + persons.ToList(); + + var events = logSpy.Appender.GetEvents(); + Assert.AreEqual(1, events.Length); + } + } + } + + + + [Test] + public void CanUseFutureFetchQuery() + { + using (var s = sessions.OpenSession()) + using (var tx = s.BeginTransaction()) + { + var p1 = new Person {Name = "Parent"}; + var p2 = new Person {Parent = p1, Name = "Child"}; + p1.Children.Add(p2); + s.Save(p1); + s.Save(p2); + tx.Commit(); + + s.Clear(); // we don't want caching + } + + using (var s = sessions.OpenSession()) + { + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); + + var persons = s.Query<Person>() + .FetchMany(p => p.Children) + .ToFuture(); + var persons10 = s.Query<Person>() + .FetchMany(p => p.Children) + .Take(10) + .ToFuture(); + + + using (var logSpy = new SqlLogSpy()) + { + + Assert.That(persons.Any(x => x.Children.Any()), "No children found"); + Assert.That(persons10.Any(x => x.Children.Any()), "No children found"); + + var events = logSpy.Appender.GetEvents(); + Assert.AreEqual(1, events.Length); + } + } + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete("from Person"); + tx.Commit(); + } + } + + + [Test] public void TwoFuturesRunInTwoRoundTrips() { using (var s = sessions.OpenSession()) Modified: trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs 2011-05-10 23:09:40 UTC (rev 5810) +++ trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs 2011-05-12 16:27:11 UTC (rev 5811) @@ -503,6 +503,48 @@ } } + [Test] + public void CanGetResultsInAGenericListClass() + { + using (ISession s = OpenSession()) + using (var tx = s.BeginTransaction()) + { + var item1 = new Item() { Id = 1, Name = "test item"}; + var item2 = new Item() { Id = 2, Name = "test child", Parent = item1 }; + s.Save(item1); + s.Save(item2); + + tx.Commit(); + s.Clear(); + } + + + using (ISession s = OpenSession()) + { + + + IQuery getItems = s.CreateQuery("from Item"); + IQuery parents = s.CreateQuery("select Parent from Item"); + + IList results = s.CreateMultiQuery() + .Add(getItems) + .Add<Item>(parents) + .List(); + + Assert.That(results[0], Is.InstanceOf<ArrayList>()); + Assert.That(results[1], Is.InstanceOf<List<Item>>()); + } + + using (ISession s = OpenSession()) + using (var tx = s.BeginTransaction()) + { + s.Delete("from Item"); + tx.Commit(); + } + } + + + public class ResultTransformerStub : IResultTransformer { private bool _wasTransformTupleCalled; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |