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. |