• 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
Client side validateForDelete() workaround
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Client side validateForDelete() workaround


  • Subject: Client side validateForDelete() workaround
  • From: Florijan Stamenkovic <email@hidden>
  • Date: Wed, 8 Nov 2006 14:23:32 +0100

Hi all,


Some time ago I noticed that validaetForDelete() does not work properly in client side EOCustomObject's implementation. It turns out that the bug is in EOClassDescription.validateObjectForDelete (EOEnterpriseObject), which does not properly check relationships against deletion rules. The deletion rules however are present in the class description, so I overrode validateForDelete() in my common EO superclass. I have reported this bug quite some time ago, but it still is not fixed. Anyway, for anyone who might fight the same problem, the implementation is below. My first tests show that this works OK. Please let me know however if you find any mistakes in it.


Cheers,
Flor



/**
* Overriden because the client side implementation of
* <tt>EOClassDescription.validateObjectForDelete(EOEnterpriseObject) </tt> does not
* perform proper checking against deletion rules.<p>
*
* This implementation first invoked the superclass' implementation (which might throw),
* and thereafter checks manually for relationship deletion rules and this object's
* relationship, to verify that the object indeed is valid for deletion.
*
@throws NSValidation.ValidationException If the object is in an invalid state
for deletion
*/
public void validateForDelete(){

// exception aggregation
NSMutableArray allExceptions = null;

// superclass implementation
try{
super.validateForDelete();
}catch(NSValidation.ValidationException ex){
allExceptions = new NSMutableArray();
allExceptions.addObject(ex);
}

// get the relationships keys
NSArray toOneRelationshipKeys = toOneRelationshipKeys(),
toManyRelationshipKeys = toManyRelationshipKeys();

// get the class description, needed for deletion rule checking
EOClassDescription cd = classDescription();

// iterate through the to one relationship keys
for(int i = 0 ; i < toOneRelationshipKeys.count() ; i++){
String key = (String)toOneRelationshipKeys.objectAtIndex(i);
int deleteRule = cd.deleteRuleForRelationshipKey(key);

// if it is a deny delete rule for a relationship where the destination is
// not null, the object is invalid for deletion
if(deleteRule == EOClassDescription.DeleteRuleDeny){
if(valueForKey(key) != null){
// add an exception to the list
if(allExceptions == null) allExceptions = new NSMutableArray();
allExceptions.addObject(new NSValidation.ValidationException(
"Can not delete a "+entityName()+" that has a related "+key,
valueForKey(key),
key));
}

// if it is a cascade delete rule, we need to make sure that if there is a
// related object, it also is valid for deletion
}else if(deleteRule == EOClassDescription.DeleteRuleCascade){
Object relatedObject = valueForKey(key);
if(relatedObject != null){
try{
((EOValidation)relatedObject).validateForDelete();
}catch(NSValidation.ValidationException ex){
// add an exception to the list
if(allExceptions == null) allExceptions = new NSMutableArray();
allExceptions.addObject(new NSValidation.ValidationException(
"Can not delete a "+entityName()+" that has a related "+key+
" which isn't valid for deletion",
valueForKey(key),
key));
}
}
}
}// toOneRelationships loop


// iterate through the to many relationship keys
for(int i = 0 ; i < toManyRelationshipKeys.count() ; i++){
String key = (String)toManyRelationshipKeys.objectAtIndex(i);
int deleteRule = cd.deleteRuleForRelationshipKey(key);

// if it is a deny delete rule for a relationship where the destination is
// not null, the object is invalid for deletion
if(deleteRule == EOClassDescription.DeleteRuleDeny){
if(((Integer)valueForKeyPath(key + ".@count")).intValue() != 0){
// add an exception to the list
if(allExceptions == null) allExceptions = new NSMutableArray();
allExceptions.addObject(new NSValidation.ValidationException(
"Can not delete a "+entityName()+" that has related "+key+" records",
valueForKey(key),
key));
}

// if it is a cascade delete rule, we need to make sure that if there is a
// related object, it also is valid for deletion
}else if(deleteRule == EOClassDescription.DeleteRuleCascade){
NSArray relatedObjects = (NSArray)valueForKey(key);
int count = relatedObjects.count();
int j = 0;
try{
for( ; j < count ; j++)
((EOValidation)relatedObjects.objectAtIndex (j)).validateForDelete();
}catch(NSValidation.ValidationException ex){
// add an exception to the list
if(allExceptions == null) allExceptions = new NSMutableArray();
allExceptions.addObject(new NSValidation.ValidationException(
"Can not delete a "+entityName()+" because one of the objects in the "+
key+" relationship isn't valid for deletion",
relatedObjects.objectAtIndex(j),
key));
}
}
}// toManyRelationships loop

// check if there is something to throw
if(allExceptions != null && allExceptions.count() != 0)
throw NSValidation.ValidationException.aggregateExceptionWithExceptions (allExceptions);

// valid for deletion!
}
_______________________________________________
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
  • Prev by Date: Re: WebPdfReports and Header
  • Next by Date: Re: WebPdfReports and Header [Solved]
  • Previous by thread: Re: WebPdfReports and Header
  • Next by thread: Handy fault firing detection
  • Index(es):
    • Date
    • Thread