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