|
From: <fab...@us...> - 2008-08-19 13:23:24
|
Revision: 3720
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3720&view=rev
Author: fabiomaulo
Date: 2008-08-19 13:23:30 +0000 (Tue, 19 Aug 2008)
Log Message:
-----------
Start porting of new events
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs
trunk/nhibernate/src/NHibernate/Cfg/ConfigurationSchema/CfgXmlHelper.cs
trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs
trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs
trunk/nhibernate/src/NHibernate/Event/EventListeners.cs
trunk/nhibernate/src/NHibernate/Event/InitializeCollectionEvent.cs
trunk/nhibernate/src/NHibernate/Event/ListenerType.cs
trunk/nhibernate/src/NHibernate/NHibernate-2.0.csproj
trunk/nhibernate/src/NHibernate/Type/CollectionType.cs
trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate/Event/AbstractCollectionEvent.cs
trunk/nhibernate/src/NHibernate/Event/IPostCollectionRecreateEventListener.cs
trunk/nhibernate/src/NHibernate/Event/IPostCollectionRemoveEventListener.cs
trunk/nhibernate/src/NHibernate/Event/IPostCollectionUpdateEventListener.cs
trunk/nhibernate/src/NHibernate/Event/IPreCollectionRecreateEventListener.cs
trunk/nhibernate/src/NHibernate/Event/IPreCollectionRemoveEventListener.cs
trunk/nhibernate/src/NHibernate/Event/IPreCollectionUpdateEventListener.cs
trunk/nhibernate/src/NHibernate/Event/PostCollectionRecreateEvent.cs
trunk/nhibernate/src/NHibernate/Event/PostCollectionRemoveEvent.cs
trunk/nhibernate/src/NHibernate/Event/PostCollectionUpdateEvent.cs
trunk/nhibernate/src/NHibernate/Event/PreCollectionRecreateEvent.cs
trunk/nhibernate/src/NHibernate/Event/PreCollectionRemoveEvent.cs
trunk/nhibernate/src/NHibernate/Event/PreCollectionUpdateEvent.cs
trunk/nhibernate/src/NHibernate.Test/Events/
Modified: trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2008-08-18 19:58:38 UTC (rev 3719)
+++ trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -1666,93 +1666,110 @@
private void ClearListeners(ListenerType type)
{
-
switch (type)
{
case ListenerType.Autoflush:
- eventListeners.AutoFlushEventListeners = new IAutoFlushEventListener[] { };
+ eventListeners.AutoFlushEventListeners = new IAutoFlushEventListener[] {};
break;
case ListenerType.Merge:
- eventListeners.MergeEventListeners = new IMergeEventListener[] { };
+ eventListeners.MergeEventListeners = new IMergeEventListener[] {};
break;
case ListenerType.Create:
- eventListeners.PersistEventListeners = new IPersistEventListener[] { };
+ eventListeners.PersistEventListeners = new IPersistEventListener[] {};
break;
case ListenerType.CreateOnFlush:
- eventListeners.PersistOnFlushEventListeners = new IPersistEventListener[] { };
+ eventListeners.PersistOnFlushEventListeners = new IPersistEventListener[] {};
break;
case ListenerType.Delete:
- eventListeners.DeleteEventListeners = new IDeleteEventListener[] { };
+ eventListeners.DeleteEventListeners = new IDeleteEventListener[] {};
break;
case ListenerType.DirtyCheck:
- eventListeners.DirtyCheckEventListeners = new IDirtyCheckEventListener[] { };
+ eventListeners.DirtyCheckEventListeners = new IDirtyCheckEventListener[] {};
break;
case ListenerType.Evict:
- eventListeners.EvictEventListeners = new IEvictEventListener[] { };
+ eventListeners.EvictEventListeners = new IEvictEventListener[] {};
break;
case ListenerType.Flush:
- eventListeners.FlushEventListeners = new IFlushEventListener[] { };
+ eventListeners.FlushEventListeners = new IFlushEventListener[] {};
break;
case ListenerType.FlushEntity:
- eventListeners.FlushEntityEventListeners = new IFlushEntityEventListener[] { };
+ eventListeners.FlushEntityEventListeners = new IFlushEntityEventListener[] {};
break;
case ListenerType.Load:
- eventListeners.LoadEventListeners = new ILoadEventListener[] { };
+ eventListeners.LoadEventListeners = new ILoadEventListener[] {};
break;
case ListenerType.LoadCollection:
- eventListeners.InitializeCollectionEventListeners = new IInitializeCollectionEventListener[] { };
+ eventListeners.InitializeCollectionEventListeners = new IInitializeCollectionEventListener[] {};
break;
case ListenerType.Lock:
- eventListeners.LockEventListeners = new ILockEventListener[] { };
+ eventListeners.LockEventListeners = new ILockEventListener[] {};
break;
case ListenerType.Refresh:
- eventListeners.RefreshEventListeners = new IRefreshEventListener[] { };
+ eventListeners.RefreshEventListeners = new IRefreshEventListener[] {};
break;
case ListenerType.Replicate:
- eventListeners.ReplicateEventListeners = new IReplicateEventListener[] { };
+ eventListeners.ReplicateEventListeners = new IReplicateEventListener[] {};
break;
case ListenerType.SaveUpdate:
- eventListeners.SaveOrUpdateEventListeners = new ISaveOrUpdateEventListener[] { };
+ eventListeners.SaveOrUpdateEventListeners = new ISaveOrUpdateEventListener[] {};
break;
case ListenerType.Save:
- eventListeners.SaveEventListeners = new ISaveOrUpdateEventListener[] { };
+ eventListeners.SaveEventListeners = new ISaveOrUpdateEventListener[] {};
break;
case ListenerType.PreUpdate:
- eventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] { };
+ eventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] {};
break;
case ListenerType.Update:
- eventListeners.UpdateEventListeners = new ISaveOrUpdateEventListener[] { };
+ eventListeners.UpdateEventListeners = new ISaveOrUpdateEventListener[] {};
break;
case ListenerType.PreLoad:
- eventListeners.PreLoadEventListeners = new IPreLoadEventListener[] { };
+ eventListeners.PreLoadEventListeners = new IPreLoadEventListener[] {};
break;
case ListenerType.PreDelete:
- eventListeners.PreDeleteEventListeners = new IPreDeleteEventListener[] { };
+ eventListeners.PreDeleteEventListeners = new IPreDeleteEventListener[] {};
break;
case ListenerType.PreInsert:
- eventListeners.PreInsertEventListeners = new IPreInsertEventListener[] { };
+ eventListeners.PreInsertEventListeners = new IPreInsertEventListener[] {};
break;
case ListenerType.PostLoad:
- eventListeners.PostLoadEventListeners = new IPostLoadEventListener[] { };
+ eventListeners.PostLoadEventListeners = new IPostLoadEventListener[] {};
break;
case ListenerType.PostInsert:
- eventListeners.PostInsertEventListeners = new IPostInsertEventListener[] { };
+ eventListeners.PostInsertEventListeners = new IPostInsertEventListener[] {};
break;
case ListenerType.PostUpdate:
- eventListeners.PostUpdateEventListeners = new IPostUpdateEventListener[] { };
+ eventListeners.PostUpdateEventListeners = new IPostUpdateEventListener[] {};
break;
case ListenerType.PostDelete:
- eventListeners.PostDeleteEventListeners = new IPostDeleteEventListener[] { };
+ eventListeners.PostDeleteEventListeners = new IPostDeleteEventListener[] {};
break;
case ListenerType.PostCommitUpdate:
- eventListeners.PostCommitUpdateEventListeners = new IPostUpdateEventListener[] { };
+ eventListeners.PostCommitUpdateEventListeners = new IPostUpdateEventListener[] {};
break;
case ListenerType.PostCommitInsert:
- eventListeners.PostCommitInsertEventListeners = new IPostInsertEventListener[] { };
+ eventListeners.PostCommitInsertEventListeners = new IPostInsertEventListener[] {};
break;
case ListenerType.PostCommitDelete:
- eventListeners.PostCommitDeleteEventListeners = new IPostDeleteEventListener[] { };
+ eventListeners.PostCommitDeleteEventListeners = new IPostDeleteEventListener[] {};
break;
+ case ListenerType.PreCollectionRecreate:
+ eventListeners.PreCollectionRecreateEventListeners = new IPreCollectionRecreateEventListener[] {};
+ break;
+ case ListenerType.PreCollectionRemove:
+ eventListeners.PreCollectionRemoveEventListeners = new IPreCollectionRemoveEventListener[] {};
+ break;
+ case ListenerType.PreCollectionUpdate:
+ eventListeners.PreCollectionUpdateEventListeners = new IPreCollectionUpdateEventListener[] {};
+ break;
+ case ListenerType.PostCollectionRecreate:
+ eventListeners.PostCollectionRecreateEventListeners = new IPostCollectionRecreateEventListener[] {};
+ break;
+ case ListenerType.PostCollectionRemove:
+ eventListeners.PostCollectionRemoveEventListeners = new IPostCollectionRemoveEventListener[] {};
+ break;
+ case ListenerType.PostCollectionUpdate:
+ eventListeners.PostCollectionUpdateEventListeners = new IPostCollectionUpdateEventListener[] {};
+ break;
default:
log.Warn("Unrecognized listener type [" + type + "]");
break;
@@ -1856,6 +1873,24 @@
case ListenerType.PostCommitDelete:
eventListeners.PostCommitDeleteEventListeners = (IPostDeleteEventListener[])listeners;
break;
+ case ListenerType.PreCollectionRecreate:
+ eventListeners.PreCollectionRecreateEventListeners = (IPreCollectionRecreateEventListener[])listeners;
+ break;
+ case ListenerType.PreCollectionRemove:
+ eventListeners.PreCollectionRemoveEventListeners = (IPreCollectionRemoveEventListener[])listeners;
+ break;
+ case ListenerType.PreCollectionUpdate:
+ eventListeners.PreCollectionUpdateEventListeners = (IPreCollectionUpdateEventListener[])listeners;
+ break;
+ case ListenerType.PostCollectionRecreate:
+ eventListeners.PostCollectionRecreateEventListeners = (IPostCollectionRecreateEventListener[])listeners;
+ break;
+ case ListenerType.PostCollectionRemove:
+ eventListeners.PostCollectionRemoveEventListeners = (IPostCollectionRemoveEventListener[])listeners;
+ break;
+ case ListenerType.PostCollectionUpdate:
+ eventListeners.PostCollectionUpdateEventListeners = (IPostCollectionUpdateEventListener[])listeners;
+ break;
default:
log.Warn("Unrecognized listener type [" + type + "]");
break;
Modified: trunk/nhibernate/src/NHibernate/Cfg/ConfigurationSchema/CfgXmlHelper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Cfg/ConfigurationSchema/CfgXmlHelper.cs 2008-08-18 19:58:38 UTC (rev 3719)
+++ trunk/nhibernate/src/NHibernate/Cfg/ConfigurationSchema/CfgXmlHelper.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -254,6 +254,18 @@
return ListenerType.PostCommitInsert;
case "post-commit-delete":
return ListenerType.PostCommitDelete;
+ case "pre-collection-recreate":
+ return ListenerType.PreCollectionRecreate;
+ case "pre-collection-remove":
+ return ListenerType.PreCollectionRemove;
+ case "pre-collection-update":
+ return ListenerType.PreCollectionUpdate;
+ case "post-collection-recreate":
+ return ListenerType.PostCollectionRecreate;
+ case "post-collection-remove":
+ return ListenerType.PostCollectionRemove;
+ case "post-collection-update":
+ return ListenerType.PostCollectionUpdate;
default:
throw new HibernateConfigException(string.Format("Invalid ListenerType value:{0}", listenerType));
}
@@ -319,6 +331,18 @@
return "post-commit-insert";
case ListenerType.PostCommitDelete:
return "post-commit-delete";
+ case ListenerType.PreCollectionRecreate:
+ return "pre-collection-recreate";
+ case ListenerType.PreCollectionRemove:
+ return "pre-collection-remove";
+ case ListenerType.PreCollectionUpdate:
+ return "pre-collection-update";
+ case ListenerType.PostCollectionRecreate:
+ return "post-collection-recreate";
+ case ListenerType.PostCollectionRemove:
+ return "post-collection-remove";
+ case ListenerType.PostCollectionUpdate:
+ return "post-collection-update";
default:
return string.Empty;
}
Modified: trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs 2008-08-18 19:58:38 UTC (rev 3719)
+++ trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -226,6 +226,19 @@
/// <summary> Get the entity that owns this persistent collection</summary>
object GetCollectionOwner(object key, ICollectionPersister collectionPersister);
+ /// <summary> Get the entity that owned this persistent collection when it was loaded </summary>
+ /// <param name="collection">The persistent collection </param>
+ /// <returns>
+ /// The owner if its entity ID is available from the collection's loaded key
+ /// and the owner entity is in the persistence context; otherwise, returns null
+ /// </returns>
+ object GetLoadedCollectionOwnerOrNull(IPersistentCollection collection);
+
+ /// <summary> Get the ID for the entity that owned this persistent collection when it was loaded </summary>
+ /// <param name="collection">The persistent collection </param>
+ /// <returns> the owner ID if available from the collection's loaded key; otherwise, returns null </returns>
+ object GetLoadedCollectionOwnerIdOrNull(IPersistentCollection collection);
+
/// <summary> add a collection we just loaded up (still needs initializing)</summary>
void AddUninitializedCollection(ICollectionPersister persister, IPersistentCollection collection, object id);
Modified: trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs 2008-08-18 19:58:38 UTC (rev 3719)
+++ trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -80,16 +80,16 @@
// yet loaded ... for now, this is purely transient!
private Dictionary<CollectionKey, IPersistentCollection> unownedCollections;
- private bool hasNonReadOnlyEntities = false;
+ private bool hasNonReadOnlyEntities;
[NonSerialized]
- private int cascading = 0;
+ private int cascading;
[NonSerialized]
- private bool flushing = false;
+ private bool flushing;
[NonSerialized]
- private int loadCounter = 0;
+ private int loadCounter;
[NonSerialized]
private LoadContexts loadContexts;
@@ -101,6 +101,9 @@
/// <param name="session">The session "owning" this context. </param>
public StatefulPersistenceContext(ISessionImplementor session)
{
+ loadCounter = 0;
+ flushing = false;
+ cascading = 0;
this.session = session;
entitiesByKey = new Dictionary<EntityKey, object>(InitCollectionSize);
@@ -761,6 +764,52 @@
return GetEntity(new EntityKey(key, collectionPersister.OwnerEntityPersister, session.EntityMode));
}
+ /// <summary> Get the entity that owned this persistent collection when it was loaded </summary>
+ /// <param name="collection">The persistent collection </param>
+ /// <returns>
+ /// The owner, if its entity ID is available from the collection's loaded key
+ /// and the owner entity is in the persistence context; otherwise, returns null
+ /// </returns>
+ public virtual object GetLoadedCollectionOwnerOrNull(IPersistentCollection collection)
+ {
+ CollectionEntry ce = GetCollectionEntry(collection);
+ if (ce.LoadedPersister == null)
+ {
+ return null; // early exit...
+ }
+ object loadedOwner = null;
+ // TODO: an alternative is to check if the owner has changed; if it hasn't then
+ // return collection.getOwner()
+ object entityId = GetLoadedCollectionOwnerIdOrNull(ce);
+ if (entityId != null)
+ {
+ loadedOwner = GetCollectionOwner(entityId, ce.LoadedPersister);
+ }
+ return loadedOwner;
+ }
+
+ /// <summary> Get the ID for the entity that owned this persistent collection when it was loaded </summary>
+ /// <param name="collection">The persistent collection </param>
+ /// <returns> the owner ID if available from the collection's loaded key; otherwise, returns null </returns>
+ public virtual object GetLoadedCollectionOwnerIdOrNull(IPersistentCollection collection)
+ {
+ return GetLoadedCollectionOwnerIdOrNull(GetCollectionEntry(collection));
+ }
+
+ /// <summary> Get the ID for the entity that owned this persistent collection when it was loaded </summary>
+ /// <param name="ce">The collection entry </param>
+ /// <returns> the owner ID if available from the collection's loaded key; otherwise, returns null </returns>
+ private object GetLoadedCollectionOwnerIdOrNull(CollectionEntry ce)
+ {
+ if (ce == null || ce.LoadedKey == null || ce.LoadedPersister == null)
+ {
+ return null;
+ }
+ // TODO: an alternative is to check if the owner has changed; if it hasn't then
+ // get the ID from collection.getOwner()
+ return ce.LoadedPersister.CollectionType.GetIdOfOwnerOrNull(ce.LoadedKey, session);
+ }
+
/// <summary> add a collection we just loaded up (still needs initializing)</summary>
public void AddUninitializedCollection(ICollectionPersister persister, IPersistentCollection collection, object id)
{
@@ -1159,6 +1208,9 @@
#region ISerializable Members
internal StatefulPersistenceContext(SerializationInfo info, StreamingContext context)
{
+ loadCounter = 0;
+ flushing = false;
+ cascading = 0;
entitiesByKey = (Dictionary<EntityKey, object>)info.GetValue("context.entitiesByKey", typeof(Dictionary<EntityKey, object>));
entitiesByUniqueKey = (Dictionary<EntityUniqueKey, object>)info.GetValue("context.entitiesByUniqueKey", typeof(Dictionary<EntityUniqueKey, object>));
entityEntries = (IdentityMap)info.GetValue("context.entityEntries", typeof(IdentityMap));
Added: trunk/nhibernate/src/NHibernate/Event/AbstractCollectionEvent.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Event/AbstractCollectionEvent.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Event/AbstractCollectionEvent.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -0,0 +1,111 @@
+using System;
+using NHibernate.Collection;
+using NHibernate.Engine;
+using NHibernate.Persister.Collection;
+
+namespace NHibernate.Event
+{
+ /// <summary> Defines a base class for events involving collections. </summary>
+ [Serializable]
+ public abstract class AbstractCollectionEvent : AbstractEvent
+ {
+ private readonly object affectedOwner;
+ private readonly string affectedOwnerEntityName;
+ private readonly object affectedOwnerId;
+ private readonly IPersistentCollection collection;
+
+ /// <summary> Constructs an AbstractCollectionEvent object. </summary>
+ /// <param name="collectionPersister">The collection persister.</param>
+ /// <param name="collection">The collection </param>
+ /// <param name="source">The Session source </param>
+ /// <param name="affectedOwner">The owner that is affected by this event; can be null if unavailable </param>
+ /// <param name="affectedOwnerId">
+ /// The ID for the owner that is affected by this event; can be null if unavailable
+ /// that is affected by this event; can be null if unavailable
+ /// </param>
+ protected AbstractCollectionEvent(ICollectionPersister collectionPersister, IPersistentCollection collection,
+ IEventSource source, object affectedOwner, object affectedOwnerId) : base(source)
+ {
+ this.collection = collection;
+ this.affectedOwner = affectedOwner;
+ this.affectedOwnerId = affectedOwnerId;
+ affectedOwnerEntityName = GetAffectedOwnerEntityName(collectionPersister, affectedOwner, source);
+ }
+
+ public IPersistentCollection Collection
+ {
+ get { return collection; }
+ }
+
+ /// <summary> The collection owner entity that is affected by this event. </summary>
+ /// <value>
+ /// Returns null if the entity is not in the persistence context
+ /// (e.g., because the collection from a detached entity was moved to a new owner)
+ /// </value>
+ public object AffectedOwnerOrNull
+ {
+ get { return affectedOwner; }
+ }
+
+ /// <summary> Get the ID for the collection owner entity that is affected by this event. </summary>
+ /// <value>
+ /// Returns null if the ID cannot be obtained
+ /// from the collection's loaded key (e.g., a property-ref is used for the
+ /// collection and does not include the entity's ID)
+ /// </value>
+ public object AffectedOwnerIdOrNull
+ {
+ get { return affectedOwnerId; }
+ }
+
+ protected static ICollectionPersister GetLoadedCollectionPersister(IPersistentCollection collection,
+ IEventSource source)
+ {
+ CollectionEntry ce = source.PersistenceContext.GetCollectionEntry(collection);
+ return (ce == null ? null : ce.LoadedPersister);
+ }
+
+ protected static object GetLoadedOwnerOrNull(IPersistentCollection collection, IEventSource source)
+ {
+ return source.PersistenceContext.GetLoadedCollectionOwnerOrNull(collection);
+ }
+
+ protected static object GetLoadedOwnerIdOrNull(IPersistentCollection collection, IEventSource source)
+ {
+ return source.PersistenceContext.GetLoadedCollectionOwnerIdOrNull(collection);
+ }
+
+ protected static object GetOwnerIdOrNull(object owner, IEventSource source)
+ {
+ EntityEntry ownerEntry = source.PersistenceContext.GetEntry(owner);
+ return (ownerEntry == null ? null : ownerEntry.Id);
+ }
+
+ protected static string GetAffectedOwnerEntityName(ICollectionPersister collectionPersister, object affectedOwner,
+ IEventSource source)
+ {
+ // collectionPersister should not be null, but we don't want to throw
+ // an exception if it is null
+ string entityName = (collectionPersister == null ? null : collectionPersister.OwnerEntityPersister.EntityName);
+ if (affectedOwner != null)
+ {
+ EntityEntry ee = source.PersistenceContext.GetEntry(affectedOwner);
+ if (ee != null && ee.EntityName != null)
+ {
+ entityName = ee.EntityName;
+ }
+ }
+ return entityName;
+ }
+
+ /// <summary> Get the entity name for the collection owner entity that is affected by this event. </summary>
+ /// <returns>
+ /// The entity name; if the owner is not in the PersistenceContext, the
+ /// returned value may be a superclass name, instead of the actual class name
+ /// </returns>
+ public virtual string GetAffectedOwnerEntityName()
+ {
+ return affectedOwnerEntityName;
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Event/EventListeners.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Event/EventListeners.cs 2008-08-18 19:58:38 UTC (rev 3719)
+++ trunk/nhibernate/src/NHibernate/Event/EventListeners.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using NHibernate.Cfg;
using NHibernate.Event.Default;
+using NHibernate.Util;
namespace NHibernate.Event
{
@@ -13,71 +14,127 @@
{
private static readonly IDictionary<ListenerType, System.Type> eventInterfaceFromType =
new Dictionary<ListenerType, System.Type>(28);
+
static EventListeners()
{
- eventInterfaceFromType[ListenerType.Autoflush] = typeof(IAutoFlushEventListener);
- eventInterfaceFromType[ListenerType.Merge] = typeof(IMergeEventListener);
- eventInterfaceFromType[ListenerType.Create] = typeof(IPersistEventListener);
- eventInterfaceFromType[ListenerType.CreateOnFlush] = typeof(IPersistEventListener);
- eventInterfaceFromType[ListenerType.Delete] = typeof(IDeleteEventListener);
- eventInterfaceFromType[ListenerType.DirtyCheck] = typeof(IDirtyCheckEventListener);
- eventInterfaceFromType[ListenerType.Evict] = typeof(IEvictEventListener);
- eventInterfaceFromType[ListenerType.Flush] = typeof(IFlushEventListener);
- eventInterfaceFromType[ListenerType.FlushEntity] = typeof(IFlushEntityEventListener);
- eventInterfaceFromType[ListenerType.Load] = typeof(ILoadEventListener);
- eventInterfaceFromType[ListenerType.LoadCollection] = typeof(IInitializeCollectionEventListener);
- eventInterfaceFromType[ListenerType.Lock] = typeof(ILockEventListener);
- eventInterfaceFromType[ListenerType.Refresh] = typeof(IRefreshEventListener);
- eventInterfaceFromType[ListenerType.Replicate] = typeof(IReplicateEventListener);
- eventInterfaceFromType[ListenerType.SaveUpdate] = typeof(ISaveOrUpdateEventListener);
- eventInterfaceFromType[ListenerType.Save] = typeof(ISaveOrUpdateEventListener);
- eventInterfaceFromType[ListenerType.Update] = typeof(ISaveOrUpdateEventListener);
- eventInterfaceFromType[ListenerType.PreLoad] = typeof(IPreLoadEventListener);
- eventInterfaceFromType[ListenerType.PreUpdate] = typeof(IPreUpdateEventListener);
- eventInterfaceFromType[ListenerType.PreDelete] = typeof(IPreDeleteEventListener);
- eventInterfaceFromType[ListenerType.PreInsert] = typeof(IPreInsertEventListener);
- eventInterfaceFromType[ListenerType.PostLoad] = typeof(IPostLoadEventListener);
- eventInterfaceFromType[ListenerType.PostUpdate] = typeof(IPostUpdateEventListener);
- eventInterfaceFromType[ListenerType.PostDelete] = typeof(IPostDeleteEventListener);
- eventInterfaceFromType[ListenerType.PostInsert] = typeof(IPostInsertEventListener);
- eventInterfaceFromType[ListenerType.PostCommitUpdate] = typeof(IPostUpdateEventListener);
- eventInterfaceFromType[ListenerType.PostCommitDelete] = typeof(IPostDeleteEventListener);
- eventInterfaceFromType[ListenerType.PostCommitInsert] = typeof(IPostInsertEventListener);
+ eventInterfaceFromType[ListenerType.Autoflush] = typeof (IAutoFlushEventListener);
+ eventInterfaceFromType[ListenerType.Merge] = typeof (IMergeEventListener);
+ eventInterfaceFromType[ListenerType.Create] = typeof (IPersistEventListener);
+ eventInterfaceFromType[ListenerType.CreateOnFlush] = typeof (IPersistEventListener);
+ eventInterfaceFromType[ListenerType.Delete] = typeof (IDeleteEventListener);
+ eventInterfaceFromType[ListenerType.DirtyCheck] = typeof (IDirtyCheckEventListener);
+ eventInterfaceFromType[ListenerType.Evict] = typeof (IEvictEventListener);
+ eventInterfaceFromType[ListenerType.Flush] = typeof (IFlushEventListener);
+ eventInterfaceFromType[ListenerType.FlushEntity] = typeof (IFlushEntityEventListener);
+ eventInterfaceFromType[ListenerType.Load] = typeof (ILoadEventListener);
+ eventInterfaceFromType[ListenerType.LoadCollection] = typeof (IInitializeCollectionEventListener);
+ eventInterfaceFromType[ListenerType.Lock] = typeof (ILockEventListener);
+ eventInterfaceFromType[ListenerType.Refresh] = typeof (IRefreshEventListener);
+ eventInterfaceFromType[ListenerType.Replicate] = typeof (IReplicateEventListener);
+ eventInterfaceFromType[ListenerType.SaveUpdate] = typeof (ISaveOrUpdateEventListener);
+ eventInterfaceFromType[ListenerType.Save] = typeof (ISaveOrUpdateEventListener);
+ eventInterfaceFromType[ListenerType.Update] = typeof (ISaveOrUpdateEventListener);
+ eventInterfaceFromType[ListenerType.PreLoad] = typeof (IPreLoadEventListener);
+ eventInterfaceFromType[ListenerType.PreUpdate] = typeof (IPreUpdateEventListener);
+ eventInterfaceFromType[ListenerType.PreDelete] = typeof (IPreDeleteEventListener);
+ eventInterfaceFromType[ListenerType.PreInsert] = typeof (IPreInsertEventListener);
+ eventInterfaceFromType[ListenerType.PreCollectionRecreate] = typeof (IPreCollectionRecreateEventListener);
+ eventInterfaceFromType[ListenerType.PreCollectionRemove] = typeof (IPreCollectionRemoveEventListener);
+ eventInterfaceFromType[ListenerType.PreCollectionUpdate] = typeof (IPreCollectionUpdateEventListener);
+ eventInterfaceFromType[ListenerType.PostLoad] = typeof (IPostLoadEventListener);
+ eventInterfaceFromType[ListenerType.PostUpdate] = typeof (IPostUpdateEventListener);
+ eventInterfaceFromType[ListenerType.PostDelete] = typeof (IPostDeleteEventListener);
+ eventInterfaceFromType[ListenerType.PostInsert] = typeof (IPostInsertEventListener);
+ eventInterfaceFromType[ListenerType.PostCommitUpdate] = typeof (IPostUpdateEventListener);
+ eventInterfaceFromType[ListenerType.PostCommitDelete] = typeof (IPostDeleteEventListener);
+ eventInterfaceFromType[ListenerType.PostCommitInsert] = typeof (IPostInsertEventListener);
+ eventInterfaceFromType[ListenerType.PostCollectionRecreate] = typeof (IPostCollectionRecreateEventListener);
+ eventInterfaceFromType[ListenerType.PostCollectionRemove] = typeof (IPostCollectionRemoveEventListener);
+ eventInterfaceFromType[ListenerType.PostCollectionUpdate] = typeof (IPostCollectionUpdateEventListener);
+ eventInterfaceFromType = new UnmodifiableDictionary<ListenerType, System.Type>(eventInterfaceFromType);
}
- private ILoadEventListener[] loadEventListeners = new ILoadEventListener[] { new DefaultLoadEventListener() };
- private ISaveOrUpdateEventListener[] saveOrUpdateEventListeners = new ISaveOrUpdateEventListener[] { new DefaultSaveOrUpdateEventListener() };
- private IMergeEventListener[] mergeEventListeners = new IMergeEventListener[] { new DefaultMergeEventListener() };
- private IPersistEventListener[] persistEventListeners = new IPersistEventListener[] { new DefaultPersistEventListener() };
- private IPersistEventListener[] persistOnFlushEventListeners = new IPersistEventListener[] { new DefaultPersistOnFlushEventListener() };
- private IReplicateEventListener[] replicateEventListeners = new IReplicateEventListener[] { new DefaultReplicateEventListener() };
- private IDeleteEventListener[] deleteEventListeners = new IDeleteEventListener[] { new DefaultDeleteEventListener() };
- private IAutoFlushEventListener[] autoFlushEventListeners = new IAutoFlushEventListener[] { new DefaultAutoFlushEventListener() };
- private IDirtyCheckEventListener[] dirtyCheckEventListeners = new IDirtyCheckEventListener[] { new DefaultDirtyCheckEventListener() };
- private IFlushEventListener[] flushEventListeners = new IFlushEventListener[] { new DefaultFlushEventListener() };
- private IEvictEventListener[] evictEventListeners = new IEvictEventListener[] { new DefaultEvictEventListener() };
- private ILockEventListener[] lockEventListeners = new ILockEventListener[] { new DefaultLockEventListener() };
- private IRefreshEventListener[] refreshEventListeners = new IRefreshEventListener[] { new DefaultRefreshEventListener() };
- private IFlushEntityEventListener[] flushEntityEventListeners = new IFlushEntityEventListener[] { new DefaultFlushEntityEventListener() };
- private IInitializeCollectionEventListener[] initializeCollectionEventListeners = new IInitializeCollectionEventListener[] { new DefaultInitializeCollectionEventListener() };
+ private ILoadEventListener[] loadEventListeners = new ILoadEventListener[] {new DefaultLoadEventListener()};
- private IPostLoadEventListener[] postLoadEventListeners = new IPostLoadEventListener[] { new DefaultPostLoadEventListener() };
- private IPreLoadEventListener[] preLoadEventListeners = new IPreLoadEventListener[] { new DefaultPreLoadEventListener() };
+ private ISaveOrUpdateEventListener[] saveOrUpdateEventListeners = new ISaveOrUpdateEventListener[]
+ {new DefaultSaveOrUpdateEventListener()};
- private IPreDeleteEventListener[] preDeleteEventListeners = new IPreDeleteEventListener[] { };
- private IPreUpdateEventListener[] preUpdateEventListeners = new IPreUpdateEventListener[] { };
- private IPreInsertEventListener[] preInsertEventListeners = new IPreInsertEventListener[] { };
- private IPostDeleteEventListener[] postDeleteEventListeners = new IPostDeleteEventListener[] { };
- private IPostUpdateEventListener[] postUpdateEventListeners = new IPostUpdateEventListener[] { };
- private IPostInsertEventListener[] postInsertEventListeners = new IPostInsertEventListener[] { };
- private IPostDeleteEventListener[] postCommitDeleteEventListeners = new IPostDeleteEventListener[] { };
- private IPostUpdateEventListener[] postCommitUpdateEventListeners = new IPostUpdateEventListener[] { };
- private IPostInsertEventListener[] postCommitInsertEventListeners = new IPostInsertEventListener[] { };
+ private IMergeEventListener[] mergeEventListeners = new IMergeEventListener[] {new DefaultMergeEventListener()};
- private ISaveOrUpdateEventListener[] saveEventListeners = new ISaveOrUpdateEventListener[] { new DefaultSaveEventListener() };
- private ISaveOrUpdateEventListener[] updateEventListeners = new ISaveOrUpdateEventListener[] { new DefaultUpdateEventListener() };
- private IMergeEventListener[] saveOrUpdateCopyEventListeners = new IMergeEventListener[] { new DefaultSaveOrUpdateCopyEventListener() }; //saveOrUpdateCopy() is deprecated!
+ private IPersistEventListener[] persistEventListeners = new IPersistEventListener[]
+ {new DefaultPersistEventListener()};
+ private IPersistEventListener[] persistOnFlushEventListeners = new IPersistEventListener[]
+ {new DefaultPersistOnFlushEventListener()};
+
+ private IReplicateEventListener[] replicateEventListeners = new IReplicateEventListener[]
+ {new DefaultReplicateEventListener()};
+
+ private IDeleteEventListener[] deleteEventListeners = new IDeleteEventListener[] {new DefaultDeleteEventListener()};
+
+ private IAutoFlushEventListener[] autoFlushEventListeners = new IAutoFlushEventListener[]
+ {new DefaultAutoFlushEventListener()};
+
+ private IDirtyCheckEventListener[] dirtyCheckEventListeners = new IDirtyCheckEventListener[]
+ {new DefaultDirtyCheckEventListener()};
+
+ private IFlushEventListener[] flushEventListeners = new IFlushEventListener[] {new DefaultFlushEventListener()};
+ private IEvictEventListener[] evictEventListeners = new IEvictEventListener[] {new DefaultEvictEventListener()};
+ private ILockEventListener[] lockEventListeners = new ILockEventListener[] {new DefaultLockEventListener()};
+
+ private IRefreshEventListener[] refreshEventListeners = new IRefreshEventListener[]
+ {new DefaultRefreshEventListener()};
+
+ private IFlushEntityEventListener[] flushEntityEventListeners = new IFlushEntityEventListener[]
+ {new DefaultFlushEntityEventListener()};
+
+ private IInitializeCollectionEventListener[] initializeCollectionEventListeners =
+ new IInitializeCollectionEventListener[] {new DefaultInitializeCollectionEventListener()};
+
+ private IPostLoadEventListener[] postLoadEventListeners = new IPostLoadEventListener[]
+ {new DefaultPostLoadEventListener()};
+
+ private IPreLoadEventListener[] preLoadEventListeners = new IPreLoadEventListener[]
+ {new DefaultPreLoadEventListener()};
+
+ private IPreDeleteEventListener[] preDeleteEventListeners = new IPreDeleteEventListener[] {};
+ private IPreUpdateEventListener[] preUpdateEventListeners = new IPreUpdateEventListener[] {};
+ private IPreInsertEventListener[] preInsertEventListeners = new IPreInsertEventListener[] {};
+ private IPostDeleteEventListener[] postDeleteEventListeners = new IPostDeleteEventListener[] {};
+ private IPostUpdateEventListener[] postUpdateEventListeners = new IPostUpdateEventListener[] {};
+ private IPostInsertEventListener[] postInsertEventListeners = new IPostInsertEventListener[] {};
+ private IPostDeleteEventListener[] postCommitDeleteEventListeners = new IPostDeleteEventListener[] {};
+ private IPostUpdateEventListener[] postCommitUpdateEventListeners = new IPostUpdateEventListener[] {};
+ private IPostInsertEventListener[] postCommitInsertEventListeners = new IPostInsertEventListener[] {};
+
+ private IPreCollectionRecreateEventListener[] preCollectionRecreateEventListeners =
+ new IPreCollectionRecreateEventListener[] {};
+
+ private IPostCollectionRecreateEventListener[] postCollectionRecreateEventListeners =
+ new IPostCollectionRecreateEventListener[] {};
+
+ private IPreCollectionRemoveEventListener[] preCollectionRemoveEventListeners =
+ new IPreCollectionRemoveEventListener[] {};
+
+ private IPostCollectionRemoveEventListener[] postCollectionRemoveEventListeners =
+ new IPostCollectionRemoveEventListener[] {};
+
+ private IPreCollectionUpdateEventListener[] preCollectionUpdateEventListeners =
+ new IPreCollectionUpdateEventListener[] {};
+
+ private IPostCollectionUpdateEventListener[] postCollectionUpdateEventListeners =
+ new IPostCollectionUpdateEventListener[] {};
+
+ private ISaveOrUpdateEventListener[] saveEventListeners = new ISaveOrUpdateEventListener[]
+ {new DefaultSaveEventListener()};
+
+ private ISaveOrUpdateEventListener[] updateEventListeners = new ISaveOrUpdateEventListener[]
+ {new DefaultUpdateEventListener()};
+
+ private IMergeEventListener[] saveOrUpdateCopyEventListeners = new IMergeEventListener[]
+ {new DefaultSaveOrUpdateCopyEventListener()};
+ //saveOrUpdateCopy() is deprecated!
+
public ILoadEventListener[] LoadEventListeners
{
get { return loadEventListeners; }
@@ -420,11 +477,85 @@
}
}
+ public IPreCollectionRecreateEventListener[] PreCollectionRecreateEventListeners
+ {
+ get { return preCollectionRecreateEventListeners; }
+ set
+ {
+ if (value != null)
+ {
+ preCollectionRecreateEventListeners = value;
+ }
+ }
+ }
+
+ public IPostCollectionRecreateEventListener[] PostCollectionRecreateEventListeners
+ {
+ get { return postCollectionRecreateEventListeners; }
+ set
+ {
+ if (value != null)
+ {
+ postCollectionRecreateEventListeners = value;
+ }
+ }
+ }
+
+ public IPreCollectionRemoveEventListener[] PreCollectionRemoveEventListeners
+ {
+ get { return preCollectionRemoveEventListeners; }
+ set
+ {
+ if (value != null)
+ {
+ preCollectionRemoveEventListeners = value;
+ }
+ }
+ }
+
+ public IPostCollectionRemoveEventListener[] PostCollectionRemoveEventListeners
+ {
+ get { return postCollectionRemoveEventListeners; }
+ set
+ {
+ if (value != null)
+ {
+ postCollectionRemoveEventListeners = value;
+ }
+ }
+ }
+
+ public IPreCollectionUpdateEventListener[] PreCollectionUpdateEventListeners
+ {
+ get { return preCollectionUpdateEventListeners; }
+ set
+ {
+ if (value != null)
+ {
+ preCollectionUpdateEventListeners = value;
+ }
+ }
+ }
+
+ public IPostCollectionUpdateEventListener[] PostCollectionUpdateEventListeners
+ {
+ get { return postCollectionUpdateEventListeners; }
+ set
+ {
+ if (value != null)
+ {
+ postCollectionUpdateEventListeners = value;
+ }
+ }
+ }
+
public System.Type GetListenerClassFor(ListenerType type)
{
System.Type result;
if (!eventInterfaceFromType.TryGetValue(type, out result))
+ {
throw new MappingException("Unrecognized listener type [" + type + "]");
+ }
return result;
}
@@ -465,15 +596,24 @@
InitializeListeners(cfg, postCommitInsertEventListeners);
InitializeListeners(cfg, saveEventListeners);
InitializeListeners(cfg, updateEventListeners);
+
+ InitializeListeners(cfg, preCollectionRecreateEventListeners);
+ InitializeListeners(cfg, postCollectionRecreateEventListeners);
+ InitializeListeners(cfg, preCollectionRemoveEventListeners);
+ InitializeListeners(cfg, postCollectionRemoveEventListeners);
+ InitializeListeners(cfg, preCollectionUpdateEventListeners);
+ InitializeListeners(cfg, postCollectionUpdateEventListeners);
}
- private void InitializeListeners(Configuration cfg, object[] list)
+ private void InitializeListeners(Configuration cfg, object[] list)
{
foreach (object i in list)
{
IInitializable initializable = i as IInitializable;
if (initializable != null)
+ {
initializable.Initialize(cfg);
+ }
}
}
@@ -483,4 +623,4 @@
return this;
}
}
-}
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate/Event/IPostCollectionRecreateEventListener.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Event/IPostCollectionRecreateEventListener.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Event/IPostCollectionRecreateEventListener.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -0,0 +1,8 @@
+namespace NHibernate.Event
+{
+ /// <summary> Called after recreating a collection </summary>
+ public interface IPostCollectionRecreateEventListener
+ {
+ void OnPostRecreateCollection(PostCollectionRecreateEvent @event);
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate/Event/IPostCollectionRemoveEventListener.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Event/IPostCollectionRemoveEventListener.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Event/IPostCollectionRemoveEventListener.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -0,0 +1,8 @@
+namespace NHibernate.Event
+{
+ /// <summary> Called after removing a collection </summary>
+ public interface IPostCollectionRemoveEventListener
+ {
+ void OnPostRemoveCollection(PostCollectionRemoveEvent @event);
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate/Event/IPostCollectionUpdateEventListener.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Event/IPostCollectionUpdateEventListener.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Event/IPostCollectionUpdateEventListener.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -0,0 +1,8 @@
+namespace NHibernate.Event
+{
+ /// <summary> Called after updating a collection </summary>
+ public interface IPostCollectionUpdateEventListener
+ {
+ void OnPostUpdateCollection(PostCollectionUpdateEvent @event);
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate/Event/IPreCollectionRecreateEventListener.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Event/IPreCollectionRecreateEventListener.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Event/IPreCollectionRecreateEventListener.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -0,0 +1,8 @@
+namespace NHibernate.Event
+{
+ /// <summary> Called before recreating a collection </summary>
+ public interface IPreCollectionRecreateEventListener
+ {
+ void OnPreRecreateCollection(PreCollectionRecreateEvent @event);
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate/Event/IPreCollectionRemoveEventListener.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Event/IPreCollectionRemoveEventListener.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Event/IPreCollectionRemoveEventListener.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -0,0 +1,8 @@
+namespace NHibernate.Event
+{
+ /// <summary> Called before removing a collection </summary>
+ public interface IPreCollectionRemoveEventListener
+ {
+ void OnPreRemoveCollection(PreCollectionRemoveEvent @event);
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate/Event/IPreCollectionUpdateEventListener.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Event/IPreCollectionUpdateEventListener.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Event/IPreCollectionUpdateEventListener.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -0,0 +1,8 @@
+namespace NHibernate.Event
+{
+ /// <summary> Called before updating a collection </summary>
+ public interface IPreCollectionUpdateEventListener
+ {
+ void OnPreUpdateCollection(PreCollectionUpdateEvent @event);
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Event/InitializeCollectionEvent.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Event/InitializeCollectionEvent.cs 2008-08-18 19:58:38 UTC (rev 3719)
+++ trunk/nhibernate/src/NHibernate/Event/InitializeCollectionEvent.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -7,19 +7,11 @@
/// An event that occurs when a collection wants to be initialized
/// </summary>
[Serializable]
- public class InitializeCollectionEvent : AbstractEvent
+ public class InitializeCollectionEvent : AbstractCollectionEvent
{
- private readonly IPersistentCollection collection;
-
public InitializeCollectionEvent(IPersistentCollection collection, IEventSource source)
- : base(source)
- {
- this.collection = collection;
- }
-
- public IPersistentCollection Collection
- {
- get { return collection; }
- }
+ : base(
+ GetLoadedCollectionPersister(collection, source), collection, source, GetLoadedOwnerOrNull(collection, source),
+ GetLoadedOwnerIdOrNull(collection, source)) {}
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Event/ListenerType.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Event/ListenerType.cs 2008-08-18 19:58:38 UTC (rev 3719)
+++ trunk/nhibernate/src/NHibernate/Event/ListenerType.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -3,10 +3,8 @@
/// <summary>
/// Values for listener type property.
/// </summary>
- /// <remarks>Unused</remarks>
public enum ListenerType
{
- // TODO:Implement listeners and events (remove de remarks from this enum)
/// <summary>Not allowed in Xml. It represente de default value when an explicit type is assigned.</summary>
NotValidType,
/// <summary>Xml value: auto-flush</summary>
@@ -51,6 +49,12 @@
PreDelete,
/// <summary>Xml value: pre-insert</summary>
PreInsert,
+ /// <summary>Xml value: pre-collection-recreate </summary>
+ PreCollectionRecreate,
+ /// <summary>Xml value: pre-collection-remove </summary>
+ PreCollectionRemove,
+ /// <summary>Xml value: pre-collection-update </summary>
+ PreCollectionUpdate,
/// <summary>Xml value: post-load</summary>
PostLoad,
/// <summary>Xml value: post-insert</summary>
@@ -64,6 +68,12 @@
/// <summary>Xml value: post-commit-insert</summary>
PostCommitInsert,
/// <summary>Xml value: post-commit-delete</summary>
- PostCommitDelete
+ PostCommitDelete,
+ /// <summary>Xml value: post-collection-recreate </summary>
+ PostCollectionRecreate,
+ /// <summary>Xml value: post-collection-remove </summary>
+ PostCollectionRemove,
+ /// <summary>Xml value: post-collection-update </summary>
+ PostCollectionUpdate,
}
}
Added: trunk/nhibernate/src/NHibernate/Event/PostCollectionRecreateEvent.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Event/PostCollectionRecreateEvent.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Event/PostCollectionRecreateEvent.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -0,0 +1,15 @@
+using System;
+using NHibernate.Collection;
+using NHibernate.Persister.Collection;
+
+namespace NHibernate.Event
+{
+ /// <summary> An event that occurs after a collection is recreated </summary>
+ [Serializable]
+ public class PostCollectionRecreateEvent : AbstractCollectionEvent
+ {
+ public PostCollectionRecreateEvent(ICollectionPersister collectionPersister, IPersistentCollection collection,
+ IEventSource source)
+ : base(collectionPersister, collection, source, collection.Owner, GetOwnerIdOrNull(collection.Owner, source)) {}
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate/Event/PostCollectionRemoveEvent.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Event/PostCollectionRemoveEvent.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Event/PostCollectionRemoveEvent.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -0,0 +1,15 @@
+using System;
+using NHibernate.Collection;
+using NHibernate.Persister.Collection;
+
+namespace NHibernate.Event
+{
+ /// <summary> An event that occurs after a collection is removed </summary>
+ [Serializable]
+ public class PostCollectionRemoveEvent : AbstractCollectionEvent
+ {
+ public PostCollectionRemoveEvent(ICollectionPersister collectionPersister, IPersistentCollection collection,
+ IEventSource source, object loadedOwner)
+ : base(collectionPersister, collection, source, loadedOwner, GetOwnerIdOrNull(loadedOwner, source)) {}
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate/Event/PostCollectionUpdateEvent.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Event/PostCollectionUpdateEvent.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Event/PostCollectionUpdateEvent.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -0,0 +1,17 @@
+using System;
+using NHibernate.Collection;
+using NHibernate.Persister.Collection;
+
+namespace NHibernate.Event
+{
+ /// <summary> An event that occurs after a collection is updated </summary>
+ [Serializable]
+ public class PostCollectionUpdateEvent : AbstractCollectionEvent
+ {
+ public PostCollectionUpdateEvent(ICollectionPersister collectionPersister, IPersistentCollection collection,
+ IEventSource source)
+ : base(
+ collectionPersister, collection, source, GetLoadedOwnerOrNull(collection, source),
+ GetLoadedOwnerIdOrNull(collection, source)) {}
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate/Event/PreCollectionRecreateEvent.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Event/PreCollectionRecreateEvent.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Event/PreCollectionRecreateEvent.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -0,0 +1,15 @@
+using System;
+using NHibernate.Collection;
+using NHibernate.Persister.Collection;
+
+namespace NHibernate.Event
+{
+ /// <summary> An event that occurs before a collection is recreated </summary>
+ [Serializable]
+ public class PreCollectionRecreateEvent : AbstractCollectionEvent
+ {
+ public PreCollectionRecreateEvent(ICollectionPersister collectionPersister, IPersistentCollection collection,
+ IEventSource source)
+ : base(collectionPersister, collection, source, collection.Owner, GetOwnerIdOrNull(collection.Owner, source)) {}
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate/Event/PreCollectionRemoveEvent.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Event/PreCollectionRemoveEvent.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Event/PreCollectionRemoveEvent.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -0,0 +1,15 @@
+using System;
+using NHibernate.Collection;
+using NHibernate.Persister.Collection;
+
+namespace NHibernate.Event
+{
+ /// <summary> An event that occurs before a collection is removed </summary>
+ [Serializable]
+ public class PreCollectionRemoveEvent : AbstractCollectionEvent
+ {
+ public PreCollectionRemoveEvent(ICollectionPersister collectionPersister, IPersistentCollection collection,
+ IEventSource source, object loadedOwner)
+ : base(collectionPersister, collection, source, loadedOwner, GetOwnerIdOrNull(loadedOwner, source)) {}
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate/Event/PreCollectionUpdateEvent.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Event/PreCollectionUpdateEvent.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Event/PreCollectionUpdateEvent.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -0,0 +1,17 @@
+using System;
+using NHibernate.Collection;
+using NHibernate.Persister.Collection;
+
+namespace NHibernate.Event
+{
+ /// <summary> An event that occurs before a collection is updated </summary>
+ [Serializable]
+ public class PreCollectionUpdateEvent : AbstractCollectionEvent
+ {
+ public PreCollectionUpdateEvent(ICollectionPersister collectionPersister, IPersistentCollection collection,
+ IEventSource source)
+ : base(
+ collectionPersister, collection, source, GetLoadedOwnerOrNull(collection, source),
+ GetLoadedOwnerIdOrNull(collection, source)) {}
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/NHibernate-2.0.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernate-2.0.csproj 2008-08-18 19:58:38 UTC (rev 3719)
+++ trunk/nhibernate/src/NHibernate/NHibernate-2.0.csproj 2008-08-19 13:23:30 UTC (rev 3720)
@@ -638,6 +638,7 @@
<Compile Include="Engine\ValueInclusion.cs" />
<Compile Include="Engine\VersionValue.cs" />
<Compile Include="EntityMode.cs" />
+ <Compile Include="Event\AbstractCollectionEvent.cs" />
<Compile Include="Event\AbstractEvent.cs" />
<Compile Include="Event\AutoFlushEvent.cs" />
<Compile Include="Event\Default\AbstractFlushingEventListener.cs" />
@@ -693,10 +694,16 @@
<Compile Include="Event\IMergeEventListener.cs" />
<Compile Include="Event\InitializeCollectionEvent.cs" />
<Compile Include="Event\IPersistEventListener.cs" />
+ <Compile Include="Event\IPostCollectionRecreateEventListener.cs" />
+ <Compile Include="Event\IPostCollectionRemoveEventListener.cs" />
+ <Compile Include="Event\IPostCollectionUpdateEventListener.cs" />
<Compile Include="Event\IPostDeleteEventListener.cs" />
<Compile Include="Event\IPostInsertEventListener.cs" />
<Compile Include="Event\IPostLoadEventListener.cs" />
<Compile Include="Event\IPostUpdateEventListener.cs" />
+ <Compile Include="Event\IPreCollectionRecreateEventListener.cs" />
+ <Compile Include="Event\IPreCollectionRemoveEventListener.cs" />
+ <Compile Include="Event\IPreCollectionUpdateEventListener.cs" />
<Compile Include="Event\IPreDeleteEventListener.cs" />
<Compile Include="Event\IPreInsertEventListener.cs" />
<Compile Include="Event\IPreLoadEventListener.cs" />
@@ -711,10 +718,16 @@
<Compile Include="Event\LockEvent.cs" />
<Compile Include="Event\MergeEvent.cs" />
<Compile Include="Event\PersistEvent.cs" />
+ <Compile Include="Event\PostCollectionRecreateEvent.cs" />
+ <Compile Include="Event\PostCollectionRemoveEvent.cs" />
+ <Compile Include="Event\PostCollectionUpdateEvent.cs" />
<Compile Include="Event\PostDeleteEvent.cs" />
<Compile Include="Event\PostInsertEvent.cs" />
<Compile Include="Event\PostLoadEvent.cs" />
<Compile Include="Event\PostUpdateEvent.cs" />
+ <Compile Include="Event\PreCollectionRecreateEvent.cs" />
+ <Compile Include="Event\PreCollectionRemoveEvent.cs" />
+ <Compile Include="Event\PreCollectionUpdateEvent.cs" />
<Compile Include="Event\PreDeleteEvent.cs" />
<Compile Include="Event\PreInsertEvent.cs" />
<Compile Include="Event\PreLoadEvent.cs" />
Modified: trunk/nhibernate/src/NHibernate/Type/CollectionType.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Type/CollectionType.cs 2008-08-18 19:58:38 UTC (rev 3719)
+++ trunk/nhibernate/src/NHibernate/Type/CollectionType.cs 2008-08-19 13:23:30 UTC (rev 3720)
@@ -502,6 +502,42 @@
}
/// <summary>
+ /// Get the id value from the owning entity key, usually the same as the key, but might be some
+ /// other property, in the case of property-ref
+ /// </summary>
+ /// <param name="key">The collection owner key </param>
+ /// <param name="session">The session from which the request is originating. </param>
+ /// <returns>
+ /// The collection owner's id, if it can be obtained from the key;
+ /// otherwise, null is returned
+ /// </returns>
+ public virtual object GetIdOfOwnerOrNull(object key, ISessionImplementor session)
+ {
+ object ownerId = null;
+ if (foreignKeyPropertyName == null)
+ {
+ ownerId = key;
+ }
+ else
+ {
+ IType keyType = GetPersister(session).KeyType;
+ IEntityPersister ownerPersister = GetPersister(session).OwnerEntityPersister;
+ // TODO: Fix this so it will work for non-POJO entity mode
+ System.Type ownerMappedClass = ownerPersister.GetMappedClass(session.EntityMode);
+ if (ownerMappedClass.IsAssignableFrom(keyType.ReturnedClass) && keyType.ReturnedClass.IsInstanceOfType(key))
+ {
+ // the key is the owning entity itself, so get the ID from the key
+ ownerId = ownerPersister.GetIdentifier(key, session.EntityMode);
+ }
+ else
+ {
+ // TODO: check if key contains the owner ID
+ }
+ }
+ return ownerId;
+ }
+
+ /// <summary>
/// Instantiate an empty instance of the "underlying" collection (not a wrapper),
/// but with the given anticipated size (i.e. accounting for initial capacity
/// and perhaps load factor).
Modified: trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd
===================================================================
--- trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd 2008-08-18 19:58:38 UTC (rev 3719)
+++ trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd 2008-08-19 13:23:30 UTC (rev 3720)
@@ -178,6 +178,12 @@
<xs:enumeration value="post-commit-update" />
<xs:enumeration value="post-commit-insert" />
<xs:enumeration value="post-commit-delete" />
+ <xs:enumeration value="pre-collection-recreate" />
+ <xs:enumeration value="pre-collection-remove" />
+ <xs:enumeration value="pre-collection-update" />
+ <xs:enumeration value="post-collection-recreate" />
+ <xs:enumeration value="post-collection-remove" />
+ <xs:enumeration value="post-collection-update" />
</xs:restriction>
</xs:simpleType>
<xs:element name="bytecode-provider">
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj 2008-08-18 19:58:38 UTC (rev 3719)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj 2008-08-19 13:23:30 UTC (rev 3720)
@@ -1440,6 +1440,7 @@
<EmbeddedResource Include="DynamicEntity\Tuplizer\Customer.hbm.xml" />
</ItemGroup>
<ItemGroup>
+ <Folder Include="Events\" />
<Folder Include="Properties\" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|