From: <fab...@us...> - 2011-04-10 20:04:32
|
Revision: 5655 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5655&view=rev Author: fabiomaulo Date: 2011-04-10 20:04:25 +0000 (Sun, 10 Apr 2011) Log Message: ----------- SimpleModelInspector with default pattern to discover Sets properties Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/SetCollectionTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-10 19:27:37 UTC (rev 5654) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-10 20:04:25 UTC (rev 5655) @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; +using Iesi.Collections; namespace NHibernate.Mapping.ByCode { @@ -33,20 +34,60 @@ private Func<MemberInfo, bool, bool> isOneToMany = (m, declared) => declared; private Func<MemberInfo, bool, bool> isOneToOne = (m, declared) => declared; - private Func<MemberInfo, bool, bool> isSet = (m, declared) => declared; - private Func<MemberInfo, bool, bool> isArray = (m, declared) => declared; - private Func<MemberInfo, bool, bool> isBag = (m, declared) => declared; - private Func<MemberInfo, bool, bool> isDictionary = (m, declared) => declared; + private Func<MemberInfo, bool, bool> isSet; + private Func<MemberInfo, bool, bool> isArray; + private Func<MemberInfo, bool, bool> isBag; + private Func<MemberInfo, bool, bool> isDictionary; private Func<MemberInfo, bool, bool> isIdBag = (m, declared) => declared; - private Func<MemberInfo, bool, bool> isList = (m, declared) => declared; + private Func<MemberInfo, bool, bool> isList; public SimpleModelInspector() { isPersistentId = (m, declared) => declared || MatchPoIdPattern(m); isComponent = (t, declared) => declared || MatchComponentPattern(t); isPersistentProperty = (m, declared) => declared || MatchNoReadOnlyPropertyPattern(m); + isSet = (m, declared) => declared || MatchCollection(m, MatchSetMember); + isArray = (m, declared) => declared; + isBag = (m, declared) => declared; + isDictionary = (m, declared) => declared; + isList = (m, declared) => declared; } + public bool MatchCollection(MemberInfo subject, Predicate<MemberInfo> specificCollectionPredicate) + { + const BindingFlags defaultBinding = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly; + + if (specificCollectionPredicate(subject)) return true; + var pi = subject as PropertyInfo; + if (pi != null) + { + var fieldInfo = (from ps in PropertyToField.DefaultStrategies.Values + let fi = subject.DeclaringType.GetField(ps.GetFieldName(pi.Name), defaultBinding) + where fi != null + select fi).FirstOrDefault(); + + if (fieldInfo != null) + { + return specificCollectionPredicate(fieldInfo); + } + } + return false; + } + + protected bool MatchSetMember(MemberInfo subject) + { + var memberType = subject.GetPropertyOrFieldType(); + if (typeof(ISet).IsAssignableFrom(memberType)) + { + return true; + } + if (memberType.IsGenericType) + { + return memberType.GetGenericIntercafesTypeDefinitions().Contains(typeof(Iesi.Collections.Generic.ISet<>)); + } + return false; + } + protected bool MatchNoReadOnlyPropertyPattern(MemberInfo subject) { var isReadOnlyProperty = IsReadOnlyProperty(subject); Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/SetCollectionTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/SetCollectionTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/SetCollectionTests.cs 2011-04-10 20:04:25 UTC (rev 5655) @@ -0,0 +1,91 @@ +using System.Collections.Generic; +using System.Reflection; +using Iesi.Collections.Generic; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MixAutomapping +{ + public class SetCollectionTests + { + private class EntityWithSets + { + private ICollection<string> others; + private ISet<string> emails; + public ISet<string> NickNames { get; set; } + + public ICollection<string> Emails + { + get { return emails; } + } + + public ICollection<string> Others + { + get { return others; } + } + } + + [Test] + public void MatchWithSetProperty() + { + var mi = typeof(EntityWithSets).GetProperty("NickNames"); + var autoinspector = new SimpleModelInspector(); + var inspector = (IModelInspector)autoinspector; + + inspector.IsSet(mi).Should().Be.True(); + } + + [Test] + public void MatchWithSetField() + { + var mi = typeof(EntityWithSets).GetField("emails", BindingFlags.NonPublic | BindingFlags.Instance); + var autoinspector = new SimpleModelInspector(); + var inspector = (IModelInspector)autoinspector; + + inspector.IsSet(mi).Should().Be.True(); + } + + [Test] + public void MatchWithCollectionPropertyAndSetField() + { + var mi = typeof(EntityWithSets).GetProperty("Emails"); + var autoinspector = new SimpleModelInspector(); + var inspector = (IModelInspector)autoinspector; + + inspector.IsSet(mi).Should().Be.True(); + } + + [Test] + public void NotMatchWithCollectionField() + { + var mi = typeof(EntityWithSets).GetField("others", BindingFlags.NonPublic | BindingFlags.Instance); + var autoinspector = new SimpleModelInspector(); + var inspector = (IModelInspector)autoinspector; + + inspector.IsSet(mi).Should().Be.False(); + } + + [Test] + public void NotMatchWithCollectionProperty() + { + var mi = typeof(EntityWithSets).GetProperty("Others"); + var autoinspector = new SimpleModelInspector(); + var inspector = (IModelInspector)autoinspector; + + inspector.IsSet(mi).Should().Be.False(); + } + + [Test] + public void WhenExplicitDeclaredThenMatchWithCollectionProperty() + { + var mi = typeof(EntityWithSets).GetProperty("Others"); + var autoinspector = new SimpleModelInspector(); + var mapper = new ModelMapper(autoinspector); + mapper.Class<EntityWithSets>(map => map.Set(x => x.Others, x => { }, y=> {})); + + var inspector = (IModelInspector)autoinspector; + inspector.IsSet(mi).Should().Be.True(); + } + } +} \ 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-10 19:27:37 UTC (rev 5654) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-10 20:04:25 UTC (rev 5655) @@ -544,6 +544,7 @@ <Compile Include="MappingByCode\MixAutomapping\ComponentsTests.cs" /> <Compile Include="MappingByCode\MixAutomapping\PoidTests.cs" /> <Compile Include="MappingByCode\MixAutomapping\PropertiesExclusionTests.cs" /> + <Compile Include="MappingByCode\MixAutomapping\SetCollectionTests.cs" /> <Compile Include="MappingByCode\ModelExplicitDeclarationsHolderMergeTest.cs" /> <Compile Include="MappingByCode\NatureDemo\Naturalness\Address.cs" /> <Compile Include="MappingByCode\NatureDemo\Naturalness\Animal.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |