From: <kp...@us...> - 2009-01-26 10:27:03
|
Revision: 4001 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4001&view=rev Author: kpixel Date: 2009-01-26 10:26:50 +0000 (Mon, 26 Jan 2009) Log Message: ----------- Port "HHH-2884 : SessionFactory close notifications" from Revision 14452 (Hibernate 3.1) Except SessionFactoryObserver and test/events/CallbackTest Revision Links: -------------- http://nhibernate.svn.sourceforge.net/nhibernate/?rev=14452&view=rev Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Event/EventListeners.cs trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Event/IDestructible.cs Modified: trunk/nhibernate/src/NHibernate/Event/EventListeners.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/EventListeners.cs 2009-01-25 19:31:49 UTC (rev 4000) +++ trunk/nhibernate/src/NHibernate/Event/EventListeners.cs 2009-01-26 10:26:50 UTC (rev 4001) @@ -12,6 +12,8 @@ [Serializable] public class EventListeners { + private readonly List<object> initializedListeners = new List<object>(); + private static readonly IDictionary<ListenerType, System.Type> eventInterfaceFromType = new Dictionary<ListenerType, System.Type>(28); @@ -607,6 +609,7 @@ private void InitializeListeners(Configuration cfg, object[] list) { + initializedListeners.AddRange(list); foreach (object i in list) { IInitializable initializable = i as IInitializable; @@ -622,5 +625,24 @@ // todo-events Not ported return this; } + + public void DestroyListeners() + { + try + { + foreach (object i in initializedListeners) + { + IDestructible destructible = i as IDestructible; + if (destructible != null) + { + destructible.Cleanup(); + } + } + } + catch (Exception e) + { + throw new HibernateException("could not destruct listeners", e); + } + } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Event/IDestructible.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/IDestructible.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Event/IDestructible.cs 2009-01-26 10:26:50 UTC (rev 4001) @@ -0,0 +1,15 @@ + +namespace NHibernate.Event +{ + /// <summary> + /// Contract for listeners which require notification of SessionFactory closing, + /// presumably to destroy internal state. + /// </summary> + public interface IDestructible + { + /// <summary> + /// Notification of <see cref="ISessionFactory"/> shutdown. + /// </summary> + void Cleanup(); + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs 2009-01-25 19:31:49 UTC (rev 4000) +++ trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs 2009-01-26 10:26:50 UTC (rev 4001) @@ -743,6 +743,8 @@ { schemaExport.Drop(false, true); } + + eventListeners.DestroyListeners(); } public void Evict(System.Type persistentClass, object id) Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-01-25 19:31:49 UTC (rev 4000) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-01-26 10:26:50 UTC (rev 4001) @@ -452,6 +452,7 @@ <Compile Include="Dialect\SybaseASA9Dialect.cs" /> <Compile Include="Driver\IfxDriver.cs" /> <Compile Include="Driver\OracleLiteDataClientDriver.cs" /> + <Compile Include="Event\IDestructible.cs" /> <Compile Include="Exceptions\ReflectionBasedSqlStateExtracter.cs" /> <Compile Include="Exceptions\SqlStateExtracter.cs" /> <Compile Include="Exceptions\TemplatedViolatedConstraintNameExtracter.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |