• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: FYI: Possible buggy EOGenerator code?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: FYI: Possible buggy EOGenerator code?


  • Subject: Re: FYI: Possible buggy EOGenerator code?
  • From: Kieran Kelleher <email@hidden>
  • Date: Thu, 30 Dec 2004 23:41:13 -0500

The thing is that the code was actually removing the relationships one at a time, not modifying the objects themselves ..... seemed unusual that the fixed list of region EOs originally returned would change due to removing from both sides of relationship since the region EOs themselves were not being deleted.

In any case, anyone using Jon Rentzch's or David LeBer's EOGenerator templates will notice that the deleteAllFromRelationship methods are using this type of enumeration and removing scenario, so just make sure if you are using those auto-generated methods, that they are working properly.

The eogenerator generated code for a removeAllFrom should be something like:
public void removeAllFromRegionsRelationships() {
NSMutableArray relatedEOs = regions().mutableClone();
Enumeration objects = relatedEOs.objectEnumerator();
while ( objects.hasMoreElements() )
removeFromRegionsRelationship((CTRegion)objects.nextElement());
}


 instead of:
    public void removeAllFromRegionsRelationships() {
	    Enumeration objects = regions().objectEnumerator();
	    while ( objects.hasMoreElements() )
		removeFromRegionsRelationship((CTRegion)objects.nextElement());
    }

Regards, Kieran

On Dec 30, 2004, at 5:07 PM, Chuck Hill wrote:

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:
village
.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
  • Follow-Ups:
    • Re: FYI: Possible buggy EOGenerator code?
      • From: Chuck Hill <email@hidden>
References: 
 >Re: FYI: Possible buggy EOGenerator code? (From: Chuck Hill <email@hidden>)

  • Prev by Date: Re: FYI: Possible buggy EOGenerator code?
  • Next by Date: WebService WSDL Headers
  • Previous by thread: Re: FYI: Possible buggy EOGenerator code?
  • Next by thread: Re: FYI: Possible buggy EOGenerator code?
  • Index(es):
    • Date
    • Thread