Re: FYI: Possible buggy EOGenerator code?
Re: FYI: Possible buggy EOGenerator code?
- Subject: Re: FYI: Possible buggy EOGenerator code?
- From: Chuck Hill <email@hidden>
- Date: Thu, 30 Dec 2004 14:07:34 -0800
Never alter a collection that you are enumerating. It causes undefined
results. NSEnumerator used to document this explicitly. This is one the
reasons (I think) that Iterator was added to Java:
Iterators allow the caller to remove elements from the underlying
collection during the iteration with well-defined semantics.
Chuck
At 04:46 PM 30/12/2004 -0500, Kieran Kelleher wrote:
>>>>
I have spent hours on this and I suspect (I might be wrong ... if I am
correct, then this is important to all) there is a bug in section of code
that's generated by the the typical EOGenerator base class template. I
have changed the code to solve my problem, but I am sending this as an FYI
in case you are affected and did not realize it.
If someone else has a chance to verify that I am correct, then please let
me know.
A common utility method for deleting all objects in a to-many relationship
and the default code generated by any of the EOGenerator templates I have
come across looks like this (example of an object with to-many region
objects):
public void deleteRegionsRelationship(CTRegion object) {
removeObjectFromBothSidesOfRelationshipWithKey(object, "regions");
editingContext().deleteObject(object);
}
public void deleteAllRegionsRelationships() {
Enumeration objects = regions().objectEnumerator();
while ( objects.hasMoreElements() )
deleteRegionsRelationship((CTRegion)objects.nextElement());
}
The typical EOGen templates also have these similar patterned methods for
removing the relationships only and not deleting:
public void removeFromRegionsRelationship(CTRegion object) {
if( log.isDebugEnabled() ) log.debug( "removing "+object+" from
regions relationship" );
removeObjectFromBothSidesOfRelationshipWithKey( object, "regions" );
}
public void removeAllFromRegionsRelationships() {
Enumeration objects = regions().objectEnumerator();
while ( objects.hasMoreElements() )
removeFromRegionsRelationship((CTRegion)objects.nextElement());
}
These methods are in my _Geography.java base class where
geography <<-->> region (yes a many-to-many).
My SPECIFIC problem today was with the removeAll... method. The symptom was
that all the regions were NOT being removed from the relationship. Logging
showed that after a few iterations, the enumeration began returning nulls
resulting in some regions not being removed from the relationship.
In troubleshooting, I broke the above code down into smaller parts using
NSArray theRegions = regions() and logged out the contents of the NSArray
during each iteration and to my surprise the NSArray was shrinking!
The final solution turned out to require creating a new NSMutableArray
based on the regions() NSArray and enumerating through that as shown in
this working code that works properly.
public void removeAllFromRegionsRelationships() {
NSMutableArray objects = new NSMutableArray( regions() );
if (objects != null) {
Enumeration e = objects.objectEnumerator();
while ( e.hasMoreElements() )
removeFromRegionsRelationship((CTRegion)e.nextElement());
}
}
Consequently, I _suspect_ that the deleteAll (which is common in the EOGen
templates and follows the exact same code pattern) will suffer the same
problem. I don't know whether this affects to-many relationships that are
_not_ part of a many-to-many type scenario ..... but I cannot spend more
time today setting up test cases ...... if anyone is using EOGenerator with
the standard deleteAll... method being used on a many-to-many relationship,
and has time to test it, then please provide feedback.
Regards, Kieran
________________________________________________________________
Dev Config = OS X 10.3.5 / Java 1.4.2_05 / WO 5.2.3 / XCode v1.5 / MySQL
4.0.20 / Connector-J 3.0.11
Deploy Config = OS X 10.3.5 Server / Java 1.4.2_05 / WO 5.2.3 / MySQL
4.0.20 / Connector-J 3.0.11
My Blog: http://webobjects.webhop.org/
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
.net
This email sent to email@hidden<<<<
--
Chuck Hill email@hidden
Global Village Consulting Inc. http://www.global-village.net
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden