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