From: <one...@us...> - 2002-12-07 09:05:44
|
Update of /cvsroot/hibernate/Hibernate/cirrus/hibernate/collections In directory sc8-pr-cvs1:/tmp/cvs-serv9434/hibernate/collections Modified Files: Bag.java List.java PersistentCollection.java Log Message: readonly bags and lists now no longer require initialization for add(), addAll() Index: Bag.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/collections/Bag.java,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** Bag.java 1 Oct 2002 01:25:29 -0000 1.16 --- Bag.java 7 Dec 2002 09:05:40 -0000 1.17 *************** *** 239,244 **** */ public boolean add(Object o) { ! write(); ! return bag.add(o); } --- 239,249 ---- */ public boolean add(Object o) { ! if ( !scheduleAdd(o) ) { ! write(); ! return bag.add(o); ! } ! else { ! return true; ! } } *************** *** 263,268 **** */ public boolean addAll(Collection c) { ! write(); ! return bag.addAll(c); } --- 268,278 ---- */ public boolean addAll(Collection c) { ! if ( !scheduleAddAll(c) ) { ! write(); ! return bag.addAll(c); ! } ! else { ! return c.size()>0; ! } } Index: List.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/collections/List.java,v retrieving revision 1.44 retrieving revision 1.45 diff -C2 -d -r1.44 -r1.45 *** List.java 26 Nov 2002 03:35:41 -0000 1.44 --- List.java 7 Dec 2002 09:05:41 -0000 1.45 *************** *** 113,118 **** */ public boolean add(Object object) { ! write(); ! return list.add(object); } --- 113,123 ---- */ public boolean add(Object object) { ! if ( !scheduleAdd(object) ) { ! write(); ! return list.add(object); ! } ! else { ! return true; ! } } *************** *** 136,142 **** * @see List#addAll(Collection) */ ! public boolean addAll(Collection arg0) { ! write(); ! return list.addAll( arg0); } --- 141,152 ---- * @see List#addAll(Collection) */ ! public boolean addAll(Collection c) { ! if ( !scheduleAddAll(c) ) { ! write(); ! return list.addAll(c); ! } ! else { ! return c.size()>0; ! } } Index: PersistentCollection.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/collections/PersistentCollection.java,v retrieving revision 1.75 retrieving revision 1.76 diff -C2 -d -r1.75 -r1.76 *** PersistentCollection.java 26 Nov 2002 03:35:41 -0000 1.75 --- PersistentCollection.java 7 Dec 2002 09:05:41 -0000 1.76 *************** *** 5,8 **** --- 5,9 ---- import cirrus.hibernate.impl.CollectionPersister; + import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; *************** *** 43,46 **** --- 44,48 ---- protected transient SessionImplementor session; protected boolean initialized; + private transient List additions; //Careful: these methods do not initialize the collection. *************** *** 58,61 **** --- 60,93 ---- if ( session!=null && session.isOpen() ) session.dirty(this); } + + private boolean mayScheduleAdd() { + return !initialized && session!=null && session.isOpen() && session.isCollectionReadOnly(this); + } + + protected final boolean scheduleAdd(Object element) { + if ( mayScheduleAdd() ) { + if (additions==null) additions = new ArrayList(10); + additions.add(element); + return true; + } + else { + return false; + } + } + + protected final boolean scheduleAddAll(Collection coll) { + if ( mayScheduleAdd() ) { + if (additions==null) additions = new ArrayList(20); + additions.addAll(coll); + return true; + } + else { + return false; + } + } + + public boolean addAll(Object obj) { + throw new AssertionFailure("Collection does not support delayed initialization"); + } protected PersistentCollection(SessionImplementor session) { *************** *** 79,86 **** public final void initialize(boolean writing) { if (!initialized) { ! if ( session!=null && session.isOpen() ) { try { session.initialize(this, writing); initialized = true; } catch (Exception e) { --- 111,123 ---- public final void initialize(boolean writing) { if (!initialized) { ! if ( session!=null && session.isOpen() ) { try { session.initialize(this, writing); initialized = true; + //do this bit after setting initialized to true or it will recurse + if (additions!=null) { + addAll(additions); + additions=null; + } } catch (Exception e) { |