From: Michael D. <mik...@us...> - 2005-02-06 01:59:47
|
Update of /cvsroot/nhibernate/nhibernate/src/NHibernate/Collection In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26787/Collection Modified Files: ArrayHolder.cs Bag.cs IdentifierBag.cs List.cs Map.cs PersistentCollection.cs Set.cs SortedMap.cs SortedSet.cs Log Message: sergey's patch for the visitor pattern from h2.1. Index: Map.cs =================================================================== RCS file: /cvsroot/nhibernate/nhibernate/src/NHibernate/Collection/Map.cs,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** Map.cs 31 Dec 2004 16:36:46 -0000 1.17 --- Map.cs 6 Feb 2005 01:58:56 -0000 1.18 *************** *** 17,22 **** /// <summary></summary> protected IDictionary map; - /// <summary></summary> - protected IDictionary mapIdentifiers; /// <summary> --- 17,20 ---- *************** *** 122,131 **** // added. this.map = new ListDictionary(); - this.mapIdentifiers = new ListDictionary(); } else { this.map = new Hashtable(); - this.mapIdentifiers = new Hashtable(); } } --- 120,127 ---- *************** *** 274,295 **** } - /// <summary> - /// - /// </summary> - /// <param name="persister"></param> - /// <param name="owner"></param> - public override void EndRead( CollectionPersister persister, object owner ) - { - foreach( DictionaryEntry entry in mapIdentifiers ) - { - object index = entry.Key; - object elementIdentifier = entry.Value; - - object element = persister.ElementType.ResolveIdentifier( elementIdentifier, session, owner ); - - map[ index ] = element; - } - } - /// <summary></summary> public override ICollection Elements() --- 270,273 ---- *************** *** 335,345 **** public override object ReadFrom( IDataReader rs, CollectionPersister persister, object owner ) { ! //object element = persister.ReadElement(rs, owner, session); ! object elementIdentifier = persister.ReadElementIdentifier( rs, owner, session ); ! object index = persister.ReadIndex( rs, session ); ! map[ index ] = null; ! mapIdentifiers[ index ] = elementIdentifier; ! return elementIdentifier; } --- 313,321 ---- public override object ReadFrom( IDataReader rs, CollectionPersister persister, object owner ) { ! object element = persister.ReadElement(rs, owner, session); object index = persister.ReadIndex( rs, session ); ! ! map[ index ] = element; ! return element; } Index: PersistentCollection.cs =================================================================== RCS file: /cvsroot/nhibernate/nhibernate/src/NHibernate/Collection/PersistentCollection.cs,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** PersistentCollection.cs 31 Dec 2004 16:36:46 -0000 1.18 --- PersistentCollection.cs 6 Feb 2005 01:58:56 -0000 1.19 *************** *** 45,48 **** --- 45,49 ---- /// <summary></summary> protected bool initialized; + private bool initializing; [NonSerialized] *************** *** 194,212 **** /// <summary> ! /// As far as every client is concerned, the collection is loaded after this call! ! /// (Actually is done lazily /// </summary> - /// <param name="lazy"></param> /// <returns></returns> ! public virtual object GetInitialValue( bool lazy ) { - if( !lazy ) - { - session.Initialize( this, false ); - initialized = true; - } return this; } /// <summary></summary> public virtual object GetCachedValue() --- 195,207 ---- /// <summary> ! /// Return the user-visible collection (or array) instance /// </summary> /// <returns></returns> ! public virtual object GetValue() { return this; } + /* /// <summary></summary> public virtual object GetCachedValue() *************** *** 215,218 **** --- 210,214 ---- return this; } + */ /// <summary> *************** *** 221,271 **** public virtual void BeginRead() { ! // override on some subclasses } /// <summary> ! /// It is my thoughts to have this be the portion that takes care of ! /// converting the Identifier to the element... /// </summary> - [Obsolete( "Should be replaced with EndRead(CollectionPersister, object) - need to verify" )] public virtual void EndRead() { ! // override on some subclasses } /// <summary> - /// Called when there are no other open IDataReaders so this PersistentCollection - /// is free to resolve all of the Identifiers to their Entities (which potentially - /// involves issuing a new query and opening a new IDataReader. - /// </summary> - /// <param name="persister"></param> - /// <param name="owner"></param> - public abstract void EndRead( CollectionPersister persister, object owner ); - - /// <summary> /// /// </summary> /// <param name="writing"></param> ! public void Initialize( bool writing ) { if( !initialized ) { if( IsConnectedToSession ) { ! try { ! session.Initialize( this, writing ); ! initialized = true; ! // do this after setting initialized to true or it will recurse ! if( additions != null ) { ! DelayedAddAll( additions ); ! additions = null; } } ! catch( Exception e ) { ! log.Error( "Failed to lazily initialize a collection", e ); ! throw new LazyInitializationException( "Failed to lazily initialize a collection", e ); } } --- 217,269 ---- public virtual void BeginRead() { ! initializing = true; } /// <summary> ! /// Override on some subclasses. /// </summary> public virtual void EndRead() { ! // TODO:SYNCH:hib2.1 has this return a bool ! SetInitialized(); ! //do this bit after setting initialized to true or it will recurse ! if (additions!=null) ! { ! DelayedAddAll(additions); ! additions=null; ! //return false; ! } ! else ! { ! //return true; ! } } /// <summary> /// /// </summary> /// <param name="writing"></param> ! protected void Initialize( bool writing ) { if( !initialized ) { + if( initializing ) throw new LazyInitializationException("cannot access loading collection"); if( IsConnectedToSession ) { ! if( session.IsConnected ) { ! try { ! session.InitializeCollection( this, writing ); ! } ! catch( Exception e ) ! { ! log.Error( "Failed to lazily initialize a collection", e ); ! throw new LazyInitializationException( "Failed to lazily initialize a collection", e ); } } ! else { ! throw new LazyInitializationException( "Failed to lazily initialize a collection - session is disconnected" ); } } *************** *** 300,304 **** /// <param name="session"></param> /// <returns></returns> ! public bool SetSession( ISessionImplementor session ) { if( session == this.session ) --- 298,302 ---- /// <param name="session"></param> /// <returns></returns> ! public bool SetCurrentSession( ISessionImplementor session ) { if( session == this.session ) *************** *** 575,578 **** --- 573,582 ---- } + protected void SetInitialized() + { + initializing = false; + initialized = true; + } + #region - Hibernate Collection Proxy Classes Index: List.cs =================================================================== RCS file: /cvsroot/nhibernate/nhibernate/src/NHibernate/Collection/List.cs,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** List.cs 31 Dec 2004 16:36:46 -0000 1.16 --- List.cs 6 Feb 2005 01:58:56 -0000 1.17 *************** *** 15,22 **** private IList list; - // used to hold the Identifiers of the Elements that will later - // be moved to the list field. - private IList listIdentifiers; - /// <summary> /// --- 15,18 ---- *************** *** 97,101 **** { this.list = new ArrayList(); - this.listIdentifiers = new ArrayList(); } --- 93,96 ---- *************** *** 267,290 **** } - /// <summary> - /// - /// </summary> - /// <param name="persister"></param> - /// <param name="owner"></param> - public override void EndRead( CollectionPersister persister, object owner ) - { - for( int i = 0; i < listIdentifiers.Count; i++ ) - { - object element = persister.ElementType.ResolveIdentifier( listIdentifiers[ i ], session, owner ); - list[ i ] = element; - } - - if( Additions != null ) - { - DelayedAddAll( Additions ); - Additions = null; - } - } - /// <summary></summary> public override ICollection Elements() --- 262,265 ---- *************** *** 329,343 **** public override object ReadFrom( IDataReader rs, CollectionPersister persister, object owner ) { ! //object element = persister.ReadElement(rs, owner, session); ! object elementIdentifier = persister.ReadElementIdentifier( rs, owner, session ); ! int index = ( int ) persister.ReadIndex( rs, session ); ! for( int i = list.Count; i <= index; i++ ) { list.Insert( i, null ); - listIdentifiers.Insert( i, null ); } ! listIdentifiers[ index ] = elementIdentifier; ! //list[index] = element; ! return elementIdentifier; } --- 304,317 ---- public override object ReadFrom( IDataReader rs, CollectionPersister persister, object owner ) { ! object element = persister.ReadElement(rs, owner, session); ! int index = (int)persister.ReadIndex( rs, session ); ! ! for( int i=list.Count; i<=index; i++ ) { list.Insert( i, null ); } ! ! list[ index ] = element; ! return element; } Index: Bag.cs =================================================================== RCS file: /cvsroot/nhibernate/nhibernate/src/NHibernate/Collection/Bag.cs,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** Bag.cs 31 Dec 2004 16:36:46 -0000 1.11 --- Bag.cs 6 Feb 2005 01:58:56 -0000 1.12 *************** *** 17,23 **** { private IList bag; - // used to hold the Identifiers of the Elements that will later - // be moved to the bag field. - private IList bagIdentifiers; /// <summary> --- 17,20 ---- *************** *** 95,119 **** /// /// </summary> - /// <param name="persister"></param> - /// <param name="owner"></param> - public override void EndRead( CollectionPersister persister, object owner ) - { - for( int i = 0; i < bagIdentifiers.Count; i++ ) - { - object element = persister.ElementType.ResolveIdentifier( bagIdentifiers[ i ], session, owner ); - bag.Add( element ); - } - - if( Additions != null ) - { - DelayedAddAll( Additions ); - Additions = null; - } - } - - - /// <summary> - /// - /// </summary> /// <param name="reader"></param> /// <param name="persister"></param> --- 92,95 ---- *************** *** 122,129 **** public override object ReadFrom( IDataReader reader, CollectionPersister persister, object owner ) { ! object elementIdentifier = persister.ReadElementIdentifier( reader, owner, session ); ! bagIdentifiers.Add( elementIdentifier ); ! ! return elementIdentifier; } --- 98,104 ---- public override object ReadFrom( IDataReader reader, CollectionPersister persister, object owner ) { ! object element = persister.ReadElement( reader, owner, session ); ! bag.Add( element ); ! return element; } *************** *** 148,152 **** { this.bag = new ArrayList(); - this.bagIdentifiers = new ArrayList(); } --- 123,126 ---- Index: ArrayHolder.cs =================================================================== RCS file: /cvsroot/nhibernate/nhibernate/src/NHibernate/Collection/ArrayHolder.cs,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** ArrayHolder.cs 31 Dec 2004 16:36:46 -0000 1.14 --- ArrayHolder.cs 6 Feb 2005 01:58:56 -0000 1.15 *************** *** 16,20 **** private static readonly ILog log = LogManager.GetLogger( typeof( PersistentCollection ) ); ! private object array; [NonSerialized] --- 16,20 ---- private static readonly ILog log = LogManager.GetLogger( typeof( PersistentCollection ) ); ! private Array array; [NonSerialized] *************** *** 22,29 **** [NonSerialized] ! private IList tempList; - [NonSerialized] - private IList tempListIdentifier; /// <summary> --- 22,27 ---- [NonSerialized] ! private ArrayList tempList; /// <summary> *************** *** 34,38 **** public ArrayHolder( ISessionImplementor session, object array ) : base( session ) { ! this.array = array; initialized = true; } --- 32,36 ---- public ArrayHolder( ISessionImplementor session, object array ) : base( session ) { ! this.array = (Array) array; initialized = true; } *************** *** 45,56 **** protected override object Snapshot( CollectionPersister persister ) { ! int length = /*(array==null) ? temp.Count :*/ ( ( Array ) array ).Length; ! object result = System.Array.CreateInstance( persister.ElementClass, length ); for( int i = 0; i < length; i++ ) { ! object elt = /*(array==null) ? temp[i] :*/ ( ( Array ) array ).GetValue( i ); try { ! ( ( Array ) result ).SetValue( persister.ElementType.DeepCopy( elt ), i ); } catch( Exception e ) --- 43,54 ---- protected override object Snapshot( CollectionPersister persister ) { ! int length = /*(array==null) ? temp.Count :*/ array.Length; ! Array result = System.Array.CreateInstance( persister.ElementClass, length ); for( int i = 0; i < length; i++ ) { ! object elt = /*(array==null) ? temp[i] :*/ array.GetValue( i ); try { ! result.SetValue( persister.ElementType.DeepCopy( elt ), i ); } catch( Exception e ) *************** *** 174,188 **** public override object ReadFrom( IDataReader rs, CollectionPersister persister, object owner ) { ! //object element = persister.ReadElement(rs, owner, session); ! object elementIdentifier = persister.ReadElementIdentifier( rs, owner, session ); int index = ( int ) persister.ReadIndex( rs, session ); for( int i = tempList.Count; i <= index; i++ ) { tempList.Insert( i, null ); - tempListIdentifier.Insert( i, null ); } ! //tempList[index] = element; ! tempListIdentifier[ index ] = elementIdentifier; ! return elementIdentifier; } --- 172,183 ---- public override object ReadFrom( IDataReader rs, CollectionPersister persister, object owner ) { ! object element = persister.ReadElement(rs, owner, session); int index = ( int ) persister.ReadIndex( rs, session ); for( int i = tempList.Count; i <= index; i++ ) { tempList.Insert( i, null ); } ! tempList[index] = element; ! return element; } *************** *** 201,249 **** public override void BeginRead() { tempList = new ArrayList(); - tempListIdentifier = new ArrayList(); } - /// <summary> - /// - /// </summary> - [Obsolete( "See PersistentCollection.EndRead for reason." )] public override void EndRead() { ! array = ( ( ArrayList ) tempList ).ToArray( elementClass ); ! tempList = null; ! } ! ! /// <summary> ! /// ! /// </summary> ! /// <param name="persister"></param> ! /// <param name="owner"></param> ! public override void EndRead( CollectionPersister persister, object owner ) ! { ! array = System.Array.CreateInstance( elementClass, tempListIdentifier.Count ); ! ! for( int i = 0; i < tempListIdentifier.Count; i++ ) { ! object element = persister.ElementType.ResolveIdentifier( tempListIdentifier[ i ], session, owner ); ! ( ( Array ) array ).SetValue( element, i ); ! tempList[ i ] = element; } ! ! //tempList = null; ! //tempListIdentifier = null; ! } ! ! ! /// <summary> ! /// ! /// </summary> ! /// <param name="lazy"></param> ! /// <returns></returns> ! public override object GetInitialValue( bool lazy ) ! { ! base.GetInitialValue( false ); ! session.AddArrayHolder( this ); ! return array; } --- 196,215 ---- public override void BeginRead() { + base.BeginRead(); tempList = new ArrayList(); } public override void EndRead() { ! SetInitialized(); ! array = System.Array.CreateInstance( elementClass, tempList.Count ); ! int index = 0; ! foreach( object element in tempList ) { ! array.SetValue( element, index ); ! index++; } ! tempList = null; ! //return true; } *************** *** 309,319 **** } ! /// <summary> ! /// ! /// </summary> ! /// <returns></returns> ! public override object GetCachedValue() { - session.AddArrayHolder( this ); return array; } --- 275,280 ---- } ! public override object GetValue() { return array; } Index: SortedSet.cs =================================================================== RCS file: /cvsroot/nhibernate/nhibernate/src/NHibernate/Collection/SortedSet.cs,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** SortedSet.cs 31 Dec 2004 16:36:46 -0000 1.11 --- SortedSet.cs 6 Feb 2005 01:58:56 -0000 1.12 *************** *** 48,54 **** { internalSet = new Iesi.Collections.SortedSet( Comparer ); - // an ArrayList of the identifiers is what Set uses because there is not - // both a Key & Value to worry about - just the Key. - this.tempIdentifierList = new ArrayList(); } --- 48,51 ---- Index: SortedMap.cs =================================================================== RCS file: /cvsroot/nhibernate/nhibernate/src/NHibernate/Collection/SortedMap.cs,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** SortedMap.cs 31 Dec 2004 16:36:46 -0000 1.6 --- SortedMap.cs 6 Feb 2005 01:58:56 -0000 1.7 *************** *** 111,118 **** { this.map = new SortedList( comparer ); - // it should be okay to use just a hashtable to store the MapIdentifier because - // when the Identifiers are converted to actual entries then the Comparer should - // take care of putting them in the correct order... - this.mapIdentifiers = new Hashtable(); } --- 111,114 ---- Index: Set.cs =================================================================== RCS file: /cvsroot/nhibernate/nhibernate/src/NHibernate/Collection/Set.cs,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** Set.cs 31 Dec 2004 16:36:46 -0000 1.21 --- Set.cs 6 Feb 2005 01:58:56 -0000 1.22 *************** *** 25,29 **** /// <summary></summary> [NonSerialized] ! protected IList tempIdentifierList; /// <summary> --- 25,29 ---- /// <summary></summary> [NonSerialized] ! protected IList tempList; /// <summary> *************** *** 385,393 **** public override object ReadFrom( IDataReader rs, CollectionPersister persister, object owner ) { ! //object elementIdentifier = persister.ReadElement(rs, owner, session); ! object elementIdentifier = persister.ReadElementIdentifier( rs, owner, session ); ! ! tempIdentifierList.Add( elementIdentifier ); ! return elementIdentifier; } --- 385,391 ---- public override object ReadFrom( IDataReader rs, CollectionPersister persister, object owner ) { ! object element = persister.ReadElement(rs, owner, session); ! tempList.Add( element ); ! return element; } *************** *** 399,419 **** public override void BeginRead() { ! tempIdentifierList = new ArrayList(); } ! /// <summary> ! /// Resolves all of the Identifiers to an Entity. ! /// <see cref="PersistentCollection.BeginRead"/> ! /// </summary> ! /// <param name="owner"></param> ! /// <param name="persister"></param> ! public override void EndRead( CollectionPersister persister, object owner ) { ! foreach( object identifier in tempIdentifierList ) ! { ! object element = persister.ElementType.ResolveIdentifier( identifier, session, owner ); ! internalSet.Add( element ); ! } ! } --- 397,409 ---- public override void BeginRead() { ! tempList = new ArrayList(); } ! public override void EndRead() { ! internalSet.AddAll( tempList ); ! tempList = null; ! SetInitialized(); ! // return true; } Index: IdentifierBag.cs =================================================================== RCS file: /cvsroot/nhibernate/nhibernate/src/NHibernate/Collection/IdentifierBag.cs,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** IdentifierBag.cs 31 Dec 2004 16:36:46 -0000 1.6 --- IdentifierBag.cs 6 Feb 2005 01:58:56 -0000 1.7 *************** *** 27,31 **** { private IList values; - private IList valuesIdentifiers; private IDictionary identifiers; //element -> id --- 27,30 ---- *************** *** 245,249 **** identifiers = new Hashtable(); values = new ArrayList(); - valuesIdentifiers = new ArrayList(); } --- 244,247 ---- *************** *** 279,296 **** } - /// <summary> - /// - /// </summary> - /// <param name="persister"></param> - /// <param name="owner"></param> - public override void EndRead( CollectionPersister persister, object owner ) - { - for( int i = 0; i < valuesIdentifiers.Count; i++ ) - { - object element = persister.ElementType.ResolveIdentifier( valuesIdentifiers[ i ], session, owner ); - values[ i ] = element; - } - } - /// <summary></summary> public override ICollection Entries() --- 277,280 ---- *************** *** 425,435 **** public override object ReadFrom( IDataReader reader, CollectionPersister persister, object owner ) { ! object elementIdentifier = persister.ReadElementIdentifier( reader, owner, session ); ! values.Add( null ); ! valuesIdentifiers.Add( elementIdentifier ); ! identifiers[ values.Count - 1 ] = persister.ReadIdentifier( reader, session ); ! ! return elementIdentifier; } --- 409,416 ---- public override object ReadFrom( IDataReader reader, CollectionPersister persister, object owner ) { ! object element = persister.ReadElement( reader, owner, session ); ! values.Add( element ); identifiers[ values.Count - 1 ] = persister.ReadIdentifier( reader, session ); ! return element; } |