Skip to content

Commit 648faf7

Browse files
committed
Fix NH-2303
SVN: trunk@5172
1 parent e64142e commit 648faf7

File tree

5 files changed

+131
-5
lines changed

5 files changed

+131
-5
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using NHibernate.Cfg;
2+
using NUnit.Framework;
3+
using SharpTestsEx;
4+
5+
namespace NHibernate.Test.NHSpecificTest.NH2303
6+
{
7+
public class Fixture
8+
{
9+
[Test]
10+
public void IndependentSubclassElementCanExtendSubclass()
11+
{
12+
Configuration cfg = TestConfigurationHelper.GetDefaultConfiguration();
13+
cfg.Executing(c => c.AddResource("NHibernate.Test.NHSpecificTest.NH2303.Mappings.hbm.xml", GetType().Assembly)).
14+
NotThrows();
15+
cfg.BuildSessionFactory();
16+
cfg.Executing(c => c.BuildSessionFactory()).NotThrows();
17+
}
18+
}
19+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
3+
assembly="NHibernate.Test"
4+
namespace="NHibernate.Test.NHSpecificTest.NH2303">
5+
6+
<class name="Actor" table="actors">
7+
<id name="Id" column="person_id">
8+
<generator class="increment" />
9+
</id>
10+
<discriminator column="actor-type" />
11+
12+
<subclass name="Person" discriminator-value="P" />
13+
14+
<subclass name="Role" discriminator-value="R">
15+
<many-to-one name="Performer" class="Person" column="performer" />
16+
</subclass>
17+
</class>
18+
19+
<subclass name="Developer" extends="Role" discriminator-value="R-DEV" />
20+
</hibernate-mapping>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
namespace NHibernate.Test.NHSpecificTest.NH2303
2+
{
3+
public abstract class Actor
4+
{
5+
public virtual int Id { get; set; }
6+
}
7+
8+
public class Person : Actor
9+
{
10+
}
11+
12+
public abstract class Role : Actor
13+
{
14+
public virtual Person Performer { get; set; }
15+
}
16+
17+
public class Developer : Role
18+
{
19+
}
20+
}

src/NHibernate.Test/NHibernate.Test.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,8 @@
467467
<Compile Include="NHSpecificTest\NH2287\Fixture.cs" />
468468
<Compile Include="NHSpecificTest\NH2293\Fixture.cs" />
469469
<Compile Include="NHSpecificTest\NH2294\Fixture.cs" />
470+
<Compile Include="NHSpecificTest\NH2303\Fixture.cs" />
471+
<Compile Include="NHSpecificTest\NH2303\Model.cs" />
470472
<Compile Include="TypesTest\CharClass.cs" />
471473
<Compile Include="TypesTest\CharClassFixture.cs" />
472474
<Compile Include="TypesTest\DateTimeClass.cs" />
@@ -2254,6 +2256,7 @@
22542256
<EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" />
22552257
<EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" />
22562258
<Content Include="DynamicEntity\package.html" />
2259+
<EmbeddedResource Include="NHSpecificTest\NH2303\Mappings.hbm.xml" />
22572260
<EmbeddedResource Include="NHSpecificTest\NH2287\Mappings.hbm.xml" />
22582261
<EmbeddedResource Include="NHSpecificTest\NH2266\Mappings.hbm.xml" />
22592262
<EmbeddedResource Include="TypesTest\CharClass.hbm.xml" />

src/NHibernate/Cfg/ClassExtractor.cs

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System.Xml;
2-
using System.Linq;
32
using NHibernate.Util;
43
using System.Collections.Generic;
54
using NHibernate.Cfg.MappingSchema;
@@ -95,12 +94,77 @@ public static ICollection<ClassEntry> GetClassEntries(HbmMapping document)
9594
string assembly = document.assembly;
9695
string @namespace = document.@namespace;
9796

98-
classEntries.UnionWith(document.RootClasses.Select(c=> new ClassEntry(null, c.Name, c.EntityName, assembly, @namespace)));
99-
classEntries.UnionWith(document.SubClasses.Select(c => new ClassEntry(c.extends, c.Name, c.EntityName, assembly, @namespace)));
100-
classEntries.UnionWith(document.JoinedSubclasses.Select(c => new ClassEntry(c.extends, c.Name, c.EntityName, assembly, @namespace)));
101-
classEntries.UnionWith(document.UnionSubclasses.Select(c => new ClassEntry(c.extends, c.Name, c.EntityName, assembly, @namespace)));
97+
classEntries.UnionWith(GetRootClassesEntries(assembly, @namespace, document.RootClasses));
98+
classEntries.UnionWith(GetSubclassesEntries(assembly, @namespace, null, document.SubClasses));
99+
classEntries.UnionWith(GetJoinedSubclassesEntries(assembly, @namespace, null, document.JoinedSubclasses));
100+
classEntries.UnionWith(GetUnionSubclassesEntries(assembly, @namespace, null, document.UnionSubclasses));
102101

103102
return classEntries;
104103
}
104+
105+
private static IEnumerable<ClassEntry> GetRootClassesEntries(string assembly, string @namespace,IEnumerable<HbmClass> rootClasses)
106+
{
107+
foreach (var rootClass in rootClasses)
108+
{
109+
string entityName = rootClass.EntityName;
110+
yield return new ClassEntry(null, rootClass.Name, entityName, assembly, @namespace);
111+
foreach (var classEntry in GetSubclassesEntries(assembly, @namespace, entityName, rootClass.Subclasses))
112+
{
113+
yield return classEntry;
114+
}
115+
foreach (var classEntry in GetJoinedSubclassesEntries(assembly, @namespace, entityName, rootClass.JoinedSubclasses))
116+
{
117+
yield return classEntry;
118+
}
119+
foreach (var classEntry in GetUnionSubclassesEntries(assembly, @namespace, entityName, rootClass.UnionSubclasses))
120+
{
121+
yield return classEntry;
122+
}
123+
}
124+
}
125+
126+
private static IEnumerable<ClassEntry> GetSubclassesEntries(string assembly, string @namespace, string defaultExtends,
127+
IEnumerable<HbmSubclass> hbmSubclasses)
128+
{
129+
foreach (HbmSubclass subclass in hbmSubclasses)
130+
{
131+
string extends = subclass.extends ?? defaultExtends;
132+
yield return new ClassEntry(extends, subclass.Name, subclass.EntityName, assembly, @namespace);
133+
foreach (ClassEntry classEntry in GetSubclassesEntries(assembly, @namespace, subclass.EntityName,subclass.Subclasses))
134+
{
135+
yield return classEntry;
136+
}
137+
}
138+
}
139+
140+
private static IEnumerable<ClassEntry> GetJoinedSubclassesEntries(string assembly, string @namespace,
141+
string defaultExtends,
142+
IEnumerable<HbmJoinedSubclass> hbmJoinedSubclasses)
143+
{
144+
foreach (HbmJoinedSubclass subclass in hbmJoinedSubclasses)
145+
{
146+
string extends = subclass.extends ?? defaultExtends;
147+
yield return new ClassEntry(extends, subclass.Name, subclass.EntityName, assembly, @namespace);
148+
foreach (ClassEntry classEntry in GetJoinedSubclassesEntries(assembly, @namespace, subclass.EntityName, subclass.JoinedSubclasses))
149+
{
150+
yield return classEntry;
151+
}
152+
}
153+
}
154+
155+
private static IEnumerable<ClassEntry> GetUnionSubclassesEntries(string assembly, string @namespace,
156+
string defaultExtends,
157+
IEnumerable<HbmUnionSubclass> hbmUnionSubclasses)
158+
{
159+
foreach (HbmUnionSubclass subclass in hbmUnionSubclasses)
160+
{
161+
string extends = subclass.extends ?? defaultExtends;
162+
yield return new ClassEntry(extends, subclass.Name, subclass.EntityName, assembly, @namespace);
163+
foreach (ClassEntry classEntry in GetUnionSubclassesEntries(assembly, @namespace, subclass.EntityName,subclass.UnionSubclasses))
164+
{
165+
yield return classEntry;
166+
}
167+
}
168+
}
105169
}
106170
}

0 commit comments

Comments
 (0)