From: <fab...@us...> - 2010-08-31 18:08:19
|
Revision: 5172 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5172&view=rev Author: fabiomaulo Date: 2010-08-31 18:08:13 +0000 (Tue, 31 Aug 2010) Log Message: ----------- Fix NH-2303 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/ClassExtractor.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2303/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2303/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2303/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2303/Model.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/ClassExtractor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/ClassExtractor.cs 2010-08-31 16:30:50 UTC (rev 5171) +++ trunk/nhibernate/src/NHibernate/Cfg/ClassExtractor.cs 2010-08-31 18:08:13 UTC (rev 5172) @@ -1,5 +1,4 @@ using System.Xml; -using System.Linq; using NHibernate.Util; using System.Collections.Generic; using NHibernate.Cfg.MappingSchema; @@ -95,12 +94,77 @@ string assembly = document.assembly; string @namespace = document.@namespace; - classEntries.UnionWith(document.RootClasses.Select(c=> new ClassEntry(null, c.Name, c.EntityName, assembly, @namespace))); - classEntries.UnionWith(document.SubClasses.Select(c => new ClassEntry(c.extends, c.Name, c.EntityName, assembly, @namespace))); - classEntries.UnionWith(document.JoinedSubclasses.Select(c => new ClassEntry(c.extends, c.Name, c.EntityName, assembly, @namespace))); - classEntries.UnionWith(document.UnionSubclasses.Select(c => new ClassEntry(c.extends, c.Name, c.EntityName, assembly, @namespace))); + classEntries.UnionWith(GetRootClassesEntries(assembly, @namespace, document.RootClasses)); + classEntries.UnionWith(GetSubclassesEntries(assembly, @namespace, null, document.SubClasses)); + classEntries.UnionWith(GetJoinedSubclassesEntries(assembly, @namespace, null, document.JoinedSubclasses)); + classEntries.UnionWith(GetUnionSubclassesEntries(assembly, @namespace, null, document.UnionSubclasses)); return classEntries; } + + private static IEnumerable<ClassEntry> GetRootClassesEntries(string assembly, string @namespace,IEnumerable<HbmClass> rootClasses) + { + foreach (var rootClass in rootClasses) + { + string entityName = rootClass.EntityName; + yield return new ClassEntry(null, rootClass.Name, entityName, assembly, @namespace); + foreach (var classEntry in GetSubclassesEntries(assembly, @namespace, entityName, rootClass.Subclasses)) + { + yield return classEntry; + } + foreach (var classEntry in GetJoinedSubclassesEntries(assembly, @namespace, entityName, rootClass.JoinedSubclasses)) + { + yield return classEntry; + } + foreach (var classEntry in GetUnionSubclassesEntries(assembly, @namespace, entityName, rootClass.UnionSubclasses)) + { + yield return classEntry; + } + } + } + + private static IEnumerable<ClassEntry> GetSubclassesEntries(string assembly, string @namespace, string defaultExtends, + IEnumerable<HbmSubclass> hbmSubclasses) + { + foreach (HbmSubclass subclass in hbmSubclasses) + { + string extends = subclass.extends ?? defaultExtends; + yield return new ClassEntry(extends, subclass.Name, subclass.EntityName, assembly, @namespace); + foreach (ClassEntry classEntry in GetSubclassesEntries(assembly, @namespace, subclass.EntityName,subclass.Subclasses)) + { + yield return classEntry; + } + } + } + + private static IEnumerable<ClassEntry> GetJoinedSubclassesEntries(string assembly, string @namespace, + string defaultExtends, + IEnumerable<HbmJoinedSubclass> hbmJoinedSubclasses) + { + foreach (HbmJoinedSubclass subclass in hbmJoinedSubclasses) + { + string extends = subclass.extends ?? defaultExtends; + yield return new ClassEntry(extends, subclass.Name, subclass.EntityName, assembly, @namespace); + foreach (ClassEntry classEntry in GetJoinedSubclassesEntries(assembly, @namespace, subclass.EntityName, subclass.JoinedSubclasses)) + { + yield return classEntry; + } + } + } + + private static IEnumerable<ClassEntry> GetUnionSubclassesEntries(string assembly, string @namespace, + string defaultExtends, + IEnumerable<HbmUnionSubclass> hbmUnionSubclasses) + { + foreach (HbmUnionSubclass subclass in hbmUnionSubclasses) + { + string extends = subclass.extends ?? defaultExtends; + yield return new ClassEntry(extends, subclass.Name, subclass.EntityName, assembly, @namespace); + foreach (ClassEntry classEntry in GetUnionSubclassesEntries(assembly, @namespace, subclass.EntityName,subclass.UnionSubclasses)) + { + yield return classEntry; + } + } + } } } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2303/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2303/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2303/Fixture.cs 2010-08-31 18:08:13 UTC (rev 5172) @@ -0,0 +1,19 @@ +using NHibernate.Cfg; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2303 +{ + public class Fixture + { + [Test] + public void IndependentSubclassElementCanExtendSubclass() + { + Configuration cfg = TestConfigurationHelper.GetDefaultConfiguration(); + cfg.Executing(c => c.AddResource("NHibernate.Test.NHSpecificTest.NH2303.Mappings.hbm.xml", GetType().Assembly)). + NotThrows(); + cfg.BuildSessionFactory(); + cfg.Executing(c => c.BuildSessionFactory()).NotThrows(); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2303/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2303/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2303/Mappings.hbm.xml 2010-08-31 18:08:13 UTC (rev 5172) @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2303"> + + <class name="Actor" table="actors"> + <id name="Id" column="person_id"> + <generator class="increment" /> + </id> + <discriminator column="actor-type" /> + + <subclass name="Person" discriminator-value="P" /> + + <subclass name="Role" discriminator-value="R"> + <many-to-one name="Performer" class="Person" column="performer" /> + </subclass> + </class> + + <subclass name="Developer" extends="Role" discriminator-value="R-DEV" /> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2303/Model.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2303/Model.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2303/Model.cs 2010-08-31 18:08:13 UTC (rev 5172) @@ -0,0 +1,20 @@ +namespace NHibernate.Test.NHSpecificTest.NH2303 +{ + public abstract class Actor + { + public virtual int Id { get; set; } + } + + public class Person : Actor + { + } + + public abstract class Role : Actor + { + public virtual Person Performer { get; set; } + } + + public class Developer : Role + { + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-08-31 16:30:50 UTC (rev 5171) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-08-31 18:08:13 UTC (rev 5172) @@ -467,6 +467,8 @@ <Compile Include="NHSpecificTest\NH2287\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2293\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2294\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2303\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2303\Model.cs" /> <Compile Include="TypesTest\CharClass.cs" /> <Compile Include="TypesTest\CharClassFixture.cs" /> <Compile Include="TypesTest\DateTimeClass.cs" /> @@ -2254,6 +2256,7 @@ <EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" /> <EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH2303\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2287\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2266\Mappings.hbm.xml" /> <EmbeddedResource Include="TypesTest\CharClass.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |