/src/NHibernate/Event/EventListeners.cs

https://github.com/RogerKratz/nhibernate-core · C# · 640 lines · 563 code · 68 blank · 9 comment · 73 complexity · e3603675fec1586e397f29cb0a1fca9a MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using NHibernate.Cfg;
  5. using NHibernate.Event.Default;
  6. using NHibernate.Util;
  7. namespace NHibernate.Event
  8. {
  9. /// <summary>
  10. /// A convenience holder for all defined session event listeners.
  11. /// </summary>
  12. [Serializable]
  13. public class EventListeners
  14. {
  15. private readonly List<object> initializedListeners = new List<object>();
  16. private static readonly IDictionary<ListenerType, System.Type> eventInterfaceFromType =
  17. new Dictionary<ListenerType, System.Type>(28);
  18. static EventListeners()
  19. {
  20. eventInterfaceFromType[ListenerType.Autoflush] = typeof (IAutoFlushEventListener);
  21. eventInterfaceFromType[ListenerType.Merge] = typeof (IMergeEventListener);
  22. eventInterfaceFromType[ListenerType.Create] = typeof (IPersistEventListener);
  23. eventInterfaceFromType[ListenerType.CreateOnFlush] = typeof (IPersistEventListener);
  24. eventInterfaceFromType[ListenerType.Delete] = typeof (IDeleteEventListener);
  25. eventInterfaceFromType[ListenerType.DirtyCheck] = typeof (IDirtyCheckEventListener);
  26. eventInterfaceFromType[ListenerType.Evict] = typeof (IEvictEventListener);
  27. eventInterfaceFromType[ListenerType.Flush] = typeof (IFlushEventListener);
  28. eventInterfaceFromType[ListenerType.FlushEntity] = typeof (IFlushEntityEventListener);
  29. eventInterfaceFromType[ListenerType.Load] = typeof (ILoadEventListener);
  30. eventInterfaceFromType[ListenerType.LoadCollection] = typeof (IInitializeCollectionEventListener);
  31. eventInterfaceFromType[ListenerType.Lock] = typeof (ILockEventListener);
  32. eventInterfaceFromType[ListenerType.Refresh] = typeof (IRefreshEventListener);
  33. eventInterfaceFromType[ListenerType.Replicate] = typeof (IReplicateEventListener);
  34. eventInterfaceFromType[ListenerType.SaveUpdate] = typeof (ISaveOrUpdateEventListener);
  35. eventInterfaceFromType[ListenerType.Save] = typeof (ISaveOrUpdateEventListener);
  36. eventInterfaceFromType[ListenerType.Update] = typeof (ISaveOrUpdateEventListener);
  37. eventInterfaceFromType[ListenerType.PreLoad] = typeof (IPreLoadEventListener);
  38. eventInterfaceFromType[ListenerType.PreUpdate] = typeof (IPreUpdateEventListener);
  39. eventInterfaceFromType[ListenerType.PreDelete] = typeof (IPreDeleteEventListener);
  40. eventInterfaceFromType[ListenerType.PreInsert] = typeof (IPreInsertEventListener);
  41. eventInterfaceFromType[ListenerType.PreCollectionRecreate] = typeof (IPreCollectionRecreateEventListener);
  42. eventInterfaceFromType[ListenerType.PreCollectionRemove] = typeof (IPreCollectionRemoveEventListener);
  43. eventInterfaceFromType[ListenerType.PreCollectionUpdate] = typeof (IPreCollectionUpdateEventListener);
  44. eventInterfaceFromType[ListenerType.PostLoad] = typeof (IPostLoadEventListener);
  45. eventInterfaceFromType[ListenerType.PostUpdate] = typeof (IPostUpdateEventListener);
  46. eventInterfaceFromType[ListenerType.PostDelete] = typeof (IPostDeleteEventListener);
  47. eventInterfaceFromType[ListenerType.PostInsert] = typeof (IPostInsertEventListener);
  48. eventInterfaceFromType[ListenerType.PostCommitUpdate] = typeof (IPostUpdateEventListener);
  49. eventInterfaceFromType[ListenerType.PostCommitDelete] = typeof (IPostDeleteEventListener);
  50. eventInterfaceFromType[ListenerType.PostCommitInsert] = typeof (IPostInsertEventListener);
  51. eventInterfaceFromType[ListenerType.PostCollectionRecreate] = typeof (IPostCollectionRecreateEventListener);
  52. eventInterfaceFromType[ListenerType.PostCollectionRemove] = typeof (IPostCollectionRemoveEventListener);
  53. eventInterfaceFromType[ListenerType.PostCollectionUpdate] = typeof (IPostCollectionUpdateEventListener);
  54. eventInterfaceFromType = new ReadOnlyDictionary<ListenerType, System.Type>(eventInterfaceFromType);
  55. }
  56. private ILoadEventListener[] loadEventListeners = new ILoadEventListener[] {new DefaultLoadEventListener()};
  57. private ISaveOrUpdateEventListener[] saveOrUpdateEventListeners = new ISaveOrUpdateEventListener[]
  58. {new DefaultSaveOrUpdateEventListener()};
  59. private IMergeEventListener[] mergeEventListeners = new IMergeEventListener[] {new DefaultMergeEventListener()};
  60. private IPersistEventListener[] persistEventListeners = new IPersistEventListener[]
  61. {new DefaultPersistEventListener()};
  62. private IPersistEventListener[] persistOnFlushEventListeners = new IPersistEventListener[]
  63. {new DefaultPersistOnFlushEventListener()};
  64. private IReplicateEventListener[] replicateEventListeners = new IReplicateEventListener[]
  65. {new DefaultReplicateEventListener()};
  66. private IDeleteEventListener[] deleteEventListeners = new IDeleteEventListener[] {new DefaultDeleteEventListener()};
  67. private IAutoFlushEventListener[] autoFlushEventListeners = new IAutoFlushEventListener[]
  68. {new DefaultAutoFlushEventListener()};
  69. private IDirtyCheckEventListener[] dirtyCheckEventListeners = new IDirtyCheckEventListener[]
  70. {new DefaultDirtyCheckEventListener()};
  71. private IFlushEventListener[] flushEventListeners = new IFlushEventListener[] {new DefaultFlushEventListener()};
  72. private IEvictEventListener[] evictEventListeners = new IEvictEventListener[] {new DefaultEvictEventListener()};
  73. private ILockEventListener[] lockEventListeners = new ILockEventListener[] {new DefaultLockEventListener()};
  74. private IRefreshEventListener[] refreshEventListeners = new IRefreshEventListener[]
  75. {new DefaultRefreshEventListener()};
  76. private IFlushEntityEventListener[] flushEntityEventListeners = new IFlushEntityEventListener[]
  77. {new DefaultFlushEntityEventListener()};
  78. private IInitializeCollectionEventListener[] initializeCollectionEventListeners =
  79. new IInitializeCollectionEventListener[] {new DefaultInitializeCollectionEventListener()};
  80. private IPostLoadEventListener[] postLoadEventListeners = new IPostLoadEventListener[]
  81. {new DefaultPostLoadEventListener()};
  82. private IPreLoadEventListener[] preLoadEventListeners = new IPreLoadEventListener[]
  83. {new DefaultPreLoadEventListener()};
  84. private IPreDeleteEventListener[] preDeleteEventListeners = Array.Empty<IPreDeleteEventListener>();
  85. private IPreUpdateEventListener[] preUpdateEventListeners = Array.Empty<IPreUpdateEventListener>();
  86. private IPreInsertEventListener[] preInsertEventListeners = Array.Empty<IPreInsertEventListener>();
  87. private IPostDeleteEventListener[] postDeleteEventListeners = Array.Empty<IPostDeleteEventListener>();
  88. private IPostUpdateEventListener[] postUpdateEventListeners = Array.Empty<IPostUpdateEventListener>();
  89. private IPostInsertEventListener[] postInsertEventListeners = Array.Empty<IPostInsertEventListener>();
  90. private IPostDeleteEventListener[] postCommitDeleteEventListeners = Array.Empty<IPostDeleteEventListener>();
  91. private IPostUpdateEventListener[] postCommitUpdateEventListeners = Array.Empty<IPostUpdateEventListener>();
  92. private IPostInsertEventListener[] postCommitInsertEventListeners = Array.Empty<IPostInsertEventListener>();
  93. private IPreCollectionRecreateEventListener[] preCollectionRecreateEventListeners =
  94. Array.Empty<IPreCollectionRecreateEventListener>();
  95. private IPostCollectionRecreateEventListener[] postCollectionRecreateEventListeners =
  96. Array.Empty<IPostCollectionRecreateEventListener>();
  97. private IPreCollectionRemoveEventListener[] preCollectionRemoveEventListeners =
  98. Array.Empty<IPreCollectionRemoveEventListener>();
  99. private IPostCollectionRemoveEventListener[] postCollectionRemoveEventListeners =
  100. Array.Empty<IPostCollectionRemoveEventListener>();
  101. private IPreCollectionUpdateEventListener[] preCollectionUpdateEventListeners =
  102. Array.Empty<IPreCollectionUpdateEventListener>();
  103. private IPostCollectionUpdateEventListener[] postCollectionUpdateEventListeners =
  104. Array.Empty<IPostCollectionUpdateEventListener>();
  105. private ISaveOrUpdateEventListener[] saveEventListeners = new ISaveOrUpdateEventListener[]
  106. {new DefaultSaveEventListener()};
  107. private ISaveOrUpdateEventListener[] updateEventListeners = new ISaveOrUpdateEventListener[]
  108. {new DefaultUpdateEventListener()};
  109. public ILoadEventListener[] LoadEventListeners
  110. {
  111. get { return loadEventListeners; }
  112. set { loadEventListeners = value; }
  113. }
  114. public ISaveOrUpdateEventListener[] SaveOrUpdateEventListeners
  115. {
  116. get { return saveOrUpdateEventListeners; }
  117. set
  118. {
  119. if (value != null)
  120. {
  121. saveOrUpdateEventListeners = value;
  122. }
  123. }
  124. }
  125. public IMergeEventListener[] MergeEventListeners
  126. {
  127. get { return mergeEventListeners; }
  128. set
  129. {
  130. if (value != null)
  131. {
  132. mergeEventListeners = value;
  133. }
  134. }
  135. }
  136. public IPersistEventListener[] PersistEventListeners
  137. {
  138. get { return persistEventListeners; }
  139. set
  140. {
  141. if (value != null)
  142. {
  143. persistEventListeners = value;
  144. }
  145. }
  146. }
  147. public IPersistEventListener[] PersistOnFlushEventListeners
  148. {
  149. get { return persistOnFlushEventListeners; }
  150. set
  151. {
  152. if (value != null)
  153. {
  154. persistOnFlushEventListeners = value;
  155. }
  156. }
  157. }
  158. public IReplicateEventListener[] ReplicateEventListeners
  159. {
  160. get { return replicateEventListeners; }
  161. set
  162. {
  163. if (value != null)
  164. {
  165. replicateEventListeners = value;
  166. }
  167. }
  168. }
  169. public IDeleteEventListener[] DeleteEventListeners
  170. {
  171. get { return deleteEventListeners; }
  172. set
  173. {
  174. if (value != null)
  175. {
  176. deleteEventListeners = value;
  177. }
  178. }
  179. }
  180. public IAutoFlushEventListener[] AutoFlushEventListeners
  181. {
  182. get { return autoFlushEventListeners; }
  183. set
  184. {
  185. if (value != null)
  186. {
  187. autoFlushEventListeners = value;
  188. }
  189. }
  190. }
  191. public IDirtyCheckEventListener[] DirtyCheckEventListeners
  192. {
  193. get { return dirtyCheckEventListeners; }
  194. set
  195. {
  196. if (value != null)
  197. {
  198. dirtyCheckEventListeners = value;
  199. }
  200. }
  201. }
  202. public IFlushEventListener[] FlushEventListeners
  203. {
  204. get { return flushEventListeners; }
  205. set
  206. {
  207. if (value != null)
  208. {
  209. flushEventListeners = value;
  210. }
  211. }
  212. }
  213. public IEvictEventListener[] EvictEventListeners
  214. {
  215. get { return evictEventListeners; }
  216. set
  217. {
  218. if (value != null)
  219. {
  220. evictEventListeners = value;
  221. }
  222. }
  223. }
  224. public ILockEventListener[] LockEventListeners
  225. {
  226. get { return lockEventListeners; }
  227. set
  228. {
  229. if (value != null)
  230. {
  231. lockEventListeners = value;
  232. }
  233. }
  234. }
  235. public IRefreshEventListener[] RefreshEventListeners
  236. {
  237. get { return refreshEventListeners; }
  238. set
  239. {
  240. if (value != null)
  241. {
  242. refreshEventListeners = value;
  243. }
  244. }
  245. }
  246. public IFlushEntityEventListener[] FlushEntityEventListeners
  247. {
  248. get { return flushEntityEventListeners; }
  249. set
  250. {
  251. if (value != null)
  252. {
  253. flushEntityEventListeners = value;
  254. }
  255. }
  256. }
  257. public IInitializeCollectionEventListener[] InitializeCollectionEventListeners
  258. {
  259. get { return initializeCollectionEventListeners; }
  260. set
  261. {
  262. if (value != null)
  263. {
  264. initializeCollectionEventListeners = value;
  265. }
  266. }
  267. }
  268. public IPostLoadEventListener[] PostLoadEventListeners
  269. {
  270. get { return postLoadEventListeners; }
  271. set
  272. {
  273. if (value != null)
  274. {
  275. postLoadEventListeners = value;
  276. }
  277. }
  278. }
  279. public IPreLoadEventListener[] PreLoadEventListeners
  280. {
  281. get { return preLoadEventListeners; }
  282. set
  283. {
  284. if (value != null)
  285. {
  286. preLoadEventListeners = value;
  287. }
  288. }
  289. }
  290. public IPreDeleteEventListener[] PreDeleteEventListeners
  291. {
  292. get { return preDeleteEventListeners; }
  293. set
  294. {
  295. if (value != null)
  296. {
  297. preDeleteEventListeners = value;
  298. }
  299. }
  300. }
  301. public IPreUpdateEventListener[] PreUpdateEventListeners
  302. {
  303. get { return preUpdateEventListeners; }
  304. set
  305. {
  306. if (value != null)
  307. {
  308. preUpdateEventListeners = value;
  309. }
  310. }
  311. }
  312. public IPreInsertEventListener[] PreInsertEventListeners
  313. {
  314. get { return preInsertEventListeners; }
  315. set
  316. {
  317. if (value != null)
  318. {
  319. preInsertEventListeners = value;
  320. }
  321. }
  322. }
  323. public IPostDeleteEventListener[] PostDeleteEventListeners
  324. {
  325. get { return postDeleteEventListeners; }
  326. set
  327. {
  328. if (value != null)
  329. {
  330. postDeleteEventListeners = value;
  331. }
  332. }
  333. }
  334. public IPostUpdateEventListener[] PostUpdateEventListeners
  335. {
  336. get { return postUpdateEventListeners; }
  337. set
  338. {
  339. if (value != null)
  340. {
  341. postUpdateEventListeners = value;
  342. }
  343. }
  344. }
  345. public IPostInsertEventListener[] PostInsertEventListeners
  346. {
  347. get { return postInsertEventListeners; }
  348. set
  349. {
  350. if (value != null)
  351. {
  352. postInsertEventListeners = value;
  353. }
  354. }
  355. }
  356. public IPostDeleteEventListener[] PostCommitDeleteEventListeners
  357. {
  358. get { return postCommitDeleteEventListeners; }
  359. set
  360. {
  361. if (value != null)
  362. {
  363. postCommitDeleteEventListeners = value;
  364. }
  365. }
  366. }
  367. public IPostUpdateEventListener[] PostCommitUpdateEventListeners
  368. {
  369. get { return postCommitUpdateEventListeners; }
  370. set
  371. {
  372. if (value != null)
  373. {
  374. postCommitUpdateEventListeners = value;
  375. }
  376. }
  377. }
  378. public IPostInsertEventListener[] PostCommitInsertEventListeners
  379. {
  380. get { return postCommitInsertEventListeners; }
  381. set
  382. {
  383. if (value != null)
  384. {
  385. postCommitInsertEventListeners = value;
  386. }
  387. }
  388. }
  389. public ISaveOrUpdateEventListener[] SaveEventListeners
  390. {
  391. get { return saveEventListeners; }
  392. set
  393. {
  394. if (value != null)
  395. {
  396. saveEventListeners = value;
  397. }
  398. }
  399. }
  400. public ISaveOrUpdateEventListener[] UpdateEventListeners
  401. {
  402. get { return updateEventListeners; }
  403. set
  404. {
  405. if (value != null)
  406. {
  407. updateEventListeners = value;
  408. }
  409. }
  410. }
  411. public IPreCollectionRecreateEventListener[] PreCollectionRecreateEventListeners
  412. {
  413. get { return preCollectionRecreateEventListeners; }
  414. set
  415. {
  416. if (value != null)
  417. {
  418. preCollectionRecreateEventListeners = value;
  419. }
  420. }
  421. }
  422. public IPostCollectionRecreateEventListener[] PostCollectionRecreateEventListeners
  423. {
  424. get { return postCollectionRecreateEventListeners; }
  425. set
  426. {
  427. if (value != null)
  428. {
  429. postCollectionRecreateEventListeners = value;
  430. }
  431. }
  432. }
  433. public IPreCollectionRemoveEventListener[] PreCollectionRemoveEventListeners
  434. {
  435. get { return preCollectionRemoveEventListeners; }
  436. set
  437. {
  438. if (value != null)
  439. {
  440. preCollectionRemoveEventListeners = value;
  441. }
  442. }
  443. }
  444. public IPostCollectionRemoveEventListener[] PostCollectionRemoveEventListeners
  445. {
  446. get { return postCollectionRemoveEventListeners; }
  447. set
  448. {
  449. if (value != null)
  450. {
  451. postCollectionRemoveEventListeners = value;
  452. }
  453. }
  454. }
  455. public IPreCollectionUpdateEventListener[] PreCollectionUpdateEventListeners
  456. {
  457. get { return preCollectionUpdateEventListeners; }
  458. set
  459. {
  460. if (value != null)
  461. {
  462. preCollectionUpdateEventListeners = value;
  463. }
  464. }
  465. }
  466. public IPostCollectionUpdateEventListener[] PostCollectionUpdateEventListeners
  467. {
  468. get { return postCollectionUpdateEventListeners; }
  469. set
  470. {
  471. if (value != null)
  472. {
  473. postCollectionUpdateEventListeners = value;
  474. }
  475. }
  476. }
  477. public System.Type GetListenerClassFor(ListenerType type)
  478. {
  479. System.Type result;
  480. if (!eventInterfaceFromType.TryGetValue(type, out result))
  481. {
  482. throw new MappingException("Unrecognized listener type [" + type + "]");
  483. }
  484. return result;
  485. }
  486. /// <summary>
  487. /// Call <see cref="IInitializable.Initialize(Configuration)"/> on any listeners that implement
  488. /// <see cref="IInitializable"/>.
  489. /// </summary>
  490. /// <seealso cref="IInitializable"/>
  491. public virtual void InitializeListeners(Configuration cfg)
  492. {
  493. InitializeListeners(cfg, loadEventListeners);
  494. InitializeListeners(cfg, saveOrUpdateEventListeners);
  495. InitializeListeners(cfg, mergeEventListeners);
  496. InitializeListeners(cfg, persistEventListeners);
  497. InitializeListeners(cfg, persistOnFlushEventListeners);
  498. InitializeListeners(cfg, replicateEventListeners);
  499. InitializeListeners(cfg, deleteEventListeners);
  500. InitializeListeners(cfg, autoFlushEventListeners);
  501. InitializeListeners(cfg, dirtyCheckEventListeners);
  502. InitializeListeners(cfg, flushEventListeners);
  503. InitializeListeners(cfg, evictEventListeners);
  504. InitializeListeners(cfg, lockEventListeners);
  505. InitializeListeners(cfg, refreshEventListeners);
  506. InitializeListeners(cfg, flushEntityEventListeners);
  507. InitializeListeners(cfg, initializeCollectionEventListeners);
  508. InitializeListeners(cfg, postLoadEventListeners);
  509. InitializeListeners(cfg, preLoadEventListeners);
  510. InitializeListeners(cfg, preDeleteEventListeners);
  511. InitializeListeners(cfg, preUpdateEventListeners);
  512. InitializeListeners(cfg, preInsertEventListeners);
  513. InitializeListeners(cfg, postDeleteEventListeners);
  514. InitializeListeners(cfg, postUpdateEventListeners);
  515. InitializeListeners(cfg, postInsertEventListeners);
  516. InitializeListeners(cfg, postCommitDeleteEventListeners);
  517. InitializeListeners(cfg, postCommitUpdateEventListeners);
  518. InitializeListeners(cfg, postCommitInsertEventListeners);
  519. InitializeListeners(cfg, saveEventListeners);
  520. InitializeListeners(cfg, updateEventListeners);
  521. InitializeListeners(cfg, preCollectionRecreateEventListeners);
  522. InitializeListeners(cfg, postCollectionRecreateEventListeners);
  523. InitializeListeners(cfg, preCollectionRemoveEventListeners);
  524. InitializeListeners(cfg, postCollectionRemoveEventListeners);
  525. InitializeListeners(cfg, preCollectionUpdateEventListeners);
  526. InitializeListeners(cfg, postCollectionUpdateEventListeners);
  527. }
  528. private void InitializeListeners(Configuration cfg, object[] list)
  529. {
  530. initializedListeners.AddRange(list);
  531. foreach (object i in list)
  532. {
  533. IInitializable initializable = i as IInitializable;
  534. if (initializable != null)
  535. {
  536. initializable.Initialize(cfg);
  537. }
  538. }
  539. }
  540. public EventListeners ShallowCopy()
  541. {
  542. // todo-events Not ported
  543. return this;
  544. }
  545. public void DestroyListeners()
  546. {
  547. try
  548. {
  549. foreach (object i in initializedListeners)
  550. {
  551. var destructible = i as IDestructible;
  552. if (destructible != null)
  553. {
  554. destructible.Cleanup();
  555. }
  556. else
  557. {
  558. var disposable = i as IDisposable;
  559. if (disposable != null)
  560. {
  561. disposable.Dispose();
  562. }
  563. }
  564. }
  565. }
  566. catch (Exception e)
  567. {
  568. throw new HibernateException("could not destruct/dispose listeners", e);
  569. }
  570. }
  571. }
  572. }