|
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) {
|