|
From: <fab...@us...> - 2011-04-10 18:32:41
|
Revision: 5653
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5653&view=rev
Author: fabiomaulo
Date: 2011-04-10 18:32:35 +0000 (Sun, 10 Apr 2011)
Log Message:
-----------
SimpleModelInspector with default pattern to discover Components
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/ComponentsTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-10 18:15:26 UTC (rev 5652)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-10 18:32:35 UTC (rev 5653)
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Linq;
using System.Reflection;
namespace NHibernate.Mapping.ByCode
@@ -18,7 +19,7 @@
private Func<System.Type, bool, bool> isTablePerClassHierarchy = (t, declared) => declared;
private Func<System.Type, bool, bool> isTablePerConcreteClass = (t, declared) => declared;
private Func<System.Type, IEnumerable<string>, IEnumerable<string>> splitsForType = (t, declared) => declared;
- private Func<System.Type, bool, bool> isComponent = (t, declared) => declared;
+ private Func<System.Type, bool, bool> isComponent;
private Func<MemberInfo, bool, bool> isPersistentId;
private Func<MemberInfo, bool, bool> isPersistentProperty = (m, declared) => declared;
@@ -42,6 +43,7 @@
public SimpleModelInspector()
{
isPersistentId = (m, declared) => declared || MatchPoIdPattern(m);
+ isComponent = (t, declared) => declared || MatchComponentPattern(t);
}
protected bool MatchPoIdPattern(MemberInfo subject)
@@ -53,6 +55,18 @@
|| (name.StartsWith(subject.DeclaringType.Name) && name.Equals(subject.DeclaringType.Name + "id", StringComparison.InvariantCultureIgnoreCase));
}
+ protected bool MatchComponentPattern(System.Type subject)
+ {
+ const BindingFlags flattenHierarchyMembers =
+ 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));
+ }
+
#region IModelExplicitDeclarationsHolder Members
IEnumerable<System.Type> IModelExplicitDeclarationsHolder.RootEntities
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/ComponentsTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/ComponentsTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/ComponentsTests.cs 2011-04-10 18:32:35 UTC (rev 5653)
@@ -0,0 +1,79 @@
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.MixAutomapping
+{
+ public class ComponentsTests
+ {
+ // a class without Poid is a Component
+ private class AComponent
+ {
+ public string S { get; set; }
+ }
+ private class AEntity
+ {
+ public int Id { get; set; }
+ }
+ private class Entity
+ {
+ private int id;
+ }
+
+ private enum Something
+ {
+
+ }
+
+ [Test]
+ public void WhenAClassIsExplicitlyDeclaredAsComponentThenIsComponent()
+ {
+ var autoinspector = new SimpleModelInspector();
+ var mapper = new ModelMapper(autoinspector);
+ mapper.Component<AEntity>(map => { });
+
+ var inspector = (IModelInspector)autoinspector;
+ inspector.IsComponent(typeof(AEntity)).Should().Be.True();
+ }
+
+ [Test]
+ public void ClassWithoutPoidIsComponent()
+ {
+ var autoinspector = new SimpleModelInspector();
+ var inspector = (IModelInspector)autoinspector;
+ inspector.IsComponent(typeof(AComponent)).Should().Be.True();
+ }
+
+ [Test]
+ public void ClassWithPoidIsNotComponent()
+ {
+ var autoinspector = new SimpleModelInspector();
+ var inspector = (IModelInspector)autoinspector;
+ inspector.IsComponent(typeof(AEntity)).Should().Be.False();
+ }
+
+ [Test]
+ public void ClassWithPoidFieldIsNotComponent()
+ {
+ var autoinspector = new SimpleModelInspector();
+ var inspector = (IModelInspector)autoinspector;
+ inspector.IsComponent(typeof(Entity)).Should().Be.False();
+ }
+
+ [Test]
+ public void EnumIsNotComponent()
+ {
+ var autoinspector = new SimpleModelInspector();
+ var inspector = (IModelInspector)autoinspector;
+ inspector.IsComponent(typeof(Something)).Should().Be.False();
+ }
+
+ [Test]
+ public void StringIsNotComponent()
+ {
+ var autoinspector = new SimpleModelInspector();
+ var inspector = (IModelInspector)autoinspector;
+ inspector.IsComponent(typeof(string)).Should().Be.False();
+ }
+ }
+}
\ 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 18:15:26 UTC (rev 5652)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-10 18:32:35 UTC (rev 5653)
@@ -541,6 +541,7 @@
<Compile Include="MappingByCode\MappersTests\IdBagMapperTest.cs" />
<Compile Include="MappingByCode\MappersTests\JoinMapperTests.cs" />
<Compile Include="MappingByCode\MappersTests\SubclassMapperWithJoinPropertiesTest.cs" />
+ <Compile Include="MappingByCode\MixAutomapping\ComponentsTests.cs" />
<Compile Include="MappingByCode\MixAutomapping\PoidTests.cs" />
<Compile Include="MappingByCode\ModelExplicitDeclarationsHolderMergeTest.cs" />
<Compile Include="MappingByCode\NatureDemo\Naturalness\Address.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|