Skip to content

Commit 37b252b

Browse files
committed
Fix NH-2103
SVN: trunk@5104
1 parent 3a9eb6c commit 37b252b

File tree

5 files changed

+120
-0
lines changed

5 files changed

+120
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using NHibernate.Cfg;
4+
using NHibernate.Cfg.Loquacious;
5+
using NHibernate.Dialect;
6+
using NUnit.Framework;
7+
using SharpTestsEx;
8+
9+
namespace NHibernate.Test.CfgTest
10+
{
11+
public class ConfigurationAddMappingEvents
12+
{
13+
private const string ProductLineMapping =
14+
@"<?xml version='1.0' encoding='utf-8' ?>
15+
<hibernate-mapping xmlns='urn:nhibernate-mapping-2.2'>
16+
<class entity-name='ProductLine'>
17+
<id name='Id' type='int'>
18+
<generator class='hilo'/>
19+
</id>
20+
<property name='Description' not-null='true' length='200' type='string'/>
21+
<bag name='Models' cascade='all' inverse='true'>
22+
<key column='productId'/>
23+
<one-to-many class='Model'/>
24+
</bag>
25+
</class>
26+
</hibernate-mapping>
27+
";
28+
private const string ModelMapping =
29+
@"<?xml version='1.0' encoding='utf-8' ?>
30+
<hibernate-mapping xmlns='urn:nhibernate-mapping-2.2'>
31+
<class entity-name='Model'>
32+
<id name='Id' type='int'>
33+
<generator class='hilo'/>
34+
</id>
35+
36+
<property name='Name' not-null='true' length='25' type='string'/>
37+
<property name='Description' not-null='true' length='200' type='string'/>
38+
<many-to-one name='ProductLine' column='productId' not-null='true' class='ProductLine'/>
39+
</class>
40+
</hibernate-mapping>
41+
";
42+
[Test]
43+
public void WhenSubscribedToBeforeBindThenRaiseEventForEachMapping()
44+
{
45+
var listOfCalls = new List<BindMappingEventArgs>();
46+
var configuration = new Configuration();
47+
configuration.DataBaseIntegration(x => x.Dialect<MsSql2008Dialect>());
48+
configuration.BeforeBindMapping += (sender, args) => { sender.Should().Be.SameInstanceAs(configuration); listOfCalls.Add(args); };
49+
50+
configuration.AddXmlString(ProductLineMapping);
51+
configuration.AddXmlString(ModelMapping);
52+
53+
listOfCalls.Count.Should().Be(2);
54+
listOfCalls.Select(x => x.FileName).All(x => x.Satisfy(filename => filename != null));
55+
listOfCalls.Select(x => x.Mapping).All(x => x.Satisfy(mappingDoc => mappingDoc != null));
56+
listOfCalls.Select(x => x.Dialect).All(x => x.Satisfy(dialect => dialect.GetType() == typeof(MsSql2008Dialect)));
57+
}
58+
59+
[Test]
60+
public void WhenSubscribedToAfterBindThenRaiseEventForEachMapping()
61+
{
62+
var listOfCalls = new List<BindMappingEventArgs>();
63+
var configuration = new Configuration();
64+
configuration.DataBaseIntegration(x => x.Dialect<MsSql2008Dialect>());
65+
configuration.AfterBindMapping += (sender, args) => { sender.Should().Be.SameInstanceAs(configuration); listOfCalls.Add(args); };
66+
67+
configuration.AddXmlString(ProductLineMapping);
68+
configuration.AddXmlString(ModelMapping);
69+
70+
listOfCalls.Count.Should().Be(2);
71+
listOfCalls.Select(x => x.FileName).All(x => x.Satisfy(filename => filename != null));
72+
listOfCalls.Select(x => x.Mapping).All(x => x.Satisfy(mappingDoc => mappingDoc != null));
73+
listOfCalls.Select(x => x.Dialect).All(x => x.Satisfy(dialect => dialect.GetType() == typeof(MsSql2008Dialect)));
74+
}
75+
}
76+
}

src/NHibernate.Test/NHibernate.Test.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@
109109
<Compile Include="Cascade\JobBatch.cs" />
110110
<Compile Include="Cascade\RefreshFixture.cs" />
111111
<Compile Include="CfgTest\AccessorsSerializableTest.cs" />
112+
<Compile Include="CfgTest\ConfigurationAddMappingEvents.cs" />
112113
<Compile Include="CfgTest\ConfigurationFixture.cs" />
113114
<Compile Include="CfgTest\ConfigurationSchemaFixture.cs" />
114115
<Compile Include="CfgTest\ConfigurationSerializationTests.cs" />
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System;
2+
using NHibernate.Cfg.MappingSchema;
3+
4+
namespace NHibernate.Cfg
5+
{
6+
public class BindMappingEventArgs: EventArgs
7+
{
8+
public BindMappingEventArgs(Dialect.Dialect dialect, HbmMapping mapping, string fileName)
9+
{
10+
Dialect = dialect;
11+
Mapping = mapping;
12+
FileName = fileName;
13+
}
14+
15+
public Dialect.Dialect Dialect { get; private set; }
16+
public HbmMapping Mapping { get; private set; }
17+
public string FileName { get; private set; }
18+
}
19+
}

src/NHibernate/Cfg/Configuration.cs

+23
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,9 @@ private void AddValidatedDocument(NamedXmlDocument doc)
496496
AddDeserializedMapping(doc.Document, doc.Name);
497497
}
498498

499+
public event EventHandler<BindMappingEventArgs> BeforeBindMapping;
500+
public event EventHandler<BindMappingEventArgs> AfterBindMapping;
501+
499502
/// <summary>
500503
/// Add mapping data using deserialized class.
501504
/// </summary>
@@ -510,9 +513,11 @@ public void AddDeserializedMapping(HbmMapping mappingDocument, string documentFi
510513
try
511514
{
512515
Dialect.Dialect dialect = Dialect.Dialect.GetDialect(properties);
516+
OnBeforeBindMapping(new BindMappingEventArgs(dialect, mappingDocument, documentFileName));
513517
Mappings mappings = CreateMappings(dialect);
514518

515519
new MappingRootBinder(mappings, dialect).Bind(mappingDocument);
520+
OnAfterBindMapping(new BindMappingEventArgs(dialect, mappingDocument, documentFileName));
516521
}
517522
catch (Exception e)
518523
{
@@ -523,6 +528,24 @@ public void AddDeserializedMapping(HbmMapping mappingDocument, string documentFi
523528
}
524529
}
525530

531+
private void OnAfterBindMapping(BindMappingEventArgs bindMappingEventArgs)
532+
{
533+
var handler = AfterBindMapping;
534+
if (handler != null)
535+
{
536+
handler(this, bindMappingEventArgs);
537+
}
538+
}
539+
540+
private void OnBeforeBindMapping(BindMappingEventArgs bindMappingEventArgs)
541+
{
542+
var handler = BeforeBindMapping;
543+
if(handler != null)
544+
{
545+
handler(this, bindMappingEventArgs);
546+
}
547+
}
548+
526549
/// <summary>
527550
/// Create a new <see cref="Mappings" /> to add classes and collection
528551
/// mappings to.

src/NHibernate/NHibernate.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,7 @@
467467
<Compile Include="Bytecode\ProxyFactoryFactoryNotConfiguredException.cs" />
468468
<Compile Include="Bytecode\UnableToLoadProxyFactoryFactoryException.cs" />
469469
<Compile Include="Cache\FakeCache.cs" />
470+
<Compile Include="Cfg\BindMappingEventArgs.cs" />
470471
<Compile Include="Cfg\EntityCacheUsage.cs" />
471472
<Compile Include="Cfg\FilterSecondPassArgs.cs" />
472473
<Compile Include="Cfg\Hbm2ddlKeyWords.cs" />

0 commit comments

Comments
 (0)