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