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