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