Annotation of Examples/EnterpriseObjects/Validation/Validation.subproj/ValidatingDelegate.m, revision 1.1.1.1

1.1       root        1: #import "ValidatingDelegate.h"
                      2: #import "KeyValueValidation.h"
                      3: 
                      4: @implementation ValidatingDelegate
                      5: 
                      6: - (void)setValidatesImmediately:(BOOL)yn
                      7: {
                      8:     validatesImmediately = yn;
                      9: }
                     10: 
                     11: - (BOOL)validatesImmediately
                     12: {
                     13:     return validatesImmediately;
                     14: }
                     15: 
                     16: - (void)reportValidationError:(NSString *)message forKey:(NSString *)key ofObject:object inController:(EOController *)controller
                     17: {
                     18:     NSString *title;
                     19:     title = [NSString stringWithFormat:@"Invalid input for: %@", key];
                     20: 
                     21:     // Let's make sure that the object with the error is selected
                     22:     [controller setSelectionIndexes:[NSArray arrayWithObject:
                     23:         [NSNumber numberWithInt:[[controller allObjects] indexOfObjectIdenticalTo:object]]]];
                     24: 
                     25:     NXRunAlertPanel([title cString], [message cString], "OK", NULL, NULL);
                     26: 
                     27:     // we could tell the controller to select the invalid object and
                     28:     // run through the associations and restore focus to the one
                     29:     // matching the key
                     30: }
                     31: 
                     32: - (void)reportValidationErrors:(NSDictionary *)errors forObject:object inController:(EOController *)controller
                     33: {
                     34:     // pick one of the errors and display it
                     35:     NSEnumerator *errorEnum = [errors keyEnumerator];
                     36:     NSString *badValueKey, *errorMessage;
                     37:     badValueKey = [errorEnum nextObject];
                     38:     errorMessage = [errors objectForKey:badValueKey];
                     39: 
                     40:     [self reportValidationError:errorMessage forKey:badValueKey ofObject:object
                     41:         inController:controller];
                     42: }
                     43: 
                     44: - (NSDictionary *)controller:(EOController *)controller willSaveEdits: (NSDictionary *)edits toObject:object;
                     45: {
                     46:     if (validatesImmediately) {
                     47:         NSMutableDictionary *converted = [NSMutableDictionary dictionaryWithCapacity:[edits count]];
                     48:         NSEnumerator *editEnum = [edits keyEnumerator];
                     49:         NSString *key;
                     50:         NSDictionary *errors;
                     51: 
                     52:         while (key = [editEnum nextObject]) {
                     53:             // construct a selector and see if the have a validation method
                     54:             id value = [[controller dataSource] coerceValue:[edits objectForKey:key] forKey:key];
                     55:             if (!value) {
                     56:                 [self reportValidationError:@"Value entered is not of correct type"
                     57:                     forKey:key ofObject:object inController:controller];
                     58:                 return nil;
                     59:             }
                     60: 
                     61:             [converted setObject:value forKey:key];
                     62:         }
                     63: 
                     64:         errors = [object validateValuesInDictionary:converted];
                     65:         if([errors count]) {
                     66:             [self reportValidationErrors:errors forObject:object inController:controller];
                     67:             // [controller discardEdits];  // throw away the bad values
                     68:             return nil;
                     69:         }
                     70:         return converted;
                     71:     }
                     72:     return edits;
                     73: }
                     74: 
                     75: 
                     76: - (EODataSourceOperationDelegateResponse)controller:(EOController *)controller
                     77:     willInsertObject:object
                     78:     inDataSource:dataSource
                     79: {
                     80:     if ([object respondsToSelector:@selector(validForInsertInDataSource:)]) {
                     81:         NSDictionary *errors = [object validForInsertInDataSource:dataSource];
                     82:         if (errors) {
                     83:             [self reportValidationErrors:errors forObject:object inController:controller];
                     84:             return EORollbackDataSourceOperation;
                     85:         }
                     86:     }
                     87:     return EOPerformDataSourceOperation;
                     88: }
                     89: 
                     90: - (EODataSourceOperationDelegateResponse)controller:(EOController *)controller
                     91:     willUpdateObject:object
                     92:     inDataSource:dataSource
                     93: {
                     94:     if ([object respondsToSelector:@selector(validForUpdateInDataSource:)]) {
                     95:         NSDictionary *errors = [object validForUpdateInDataSource:dataSource];
                     96:         if (errors) {
                     97:             [self reportValidationErrors:errors forObject:object inController:controller];
                     98:             return EORollbackDataSourceOperation;
                     99:         }
                    100:     }
                    101:     return EOPerformDataSourceOperation;
                    102: }
                    103: 
                    104: - (EODataSourceOperationDelegateResponse)controller:(EOController *)controller
                    105:     willDeleteObject:object
                    106:     inDataSource:dataSource
                    107: {
                    108:     if ([object respondsToSelector:@selector(validForDeleteInDataSource:)]) {
                    109:         NSDictionary *errors = [object validForDeleteInDataSource:dataSource];
                    110:         if (errors) {
                    111:             [self reportValidationErrors:errors forObject:object inController:controller];
                    112:             return EORollbackDataSourceOperation;
                    113:         }
                    114:     }
                    115:     return EOPerformDataSourceOperation;
                    116: }
                    117: @end
                    118: 
                    119: 
                    120: @implementation NSObject (ValidationProtocols)
                    121: // An EO can implement some or all of these methods to play a roll in its validation
                    122: - (NSArray *)keysToValidate
                    123: {
                    124:     return [NSArray array];
                    125: }
                    126: 
                    127: - (NSDictionary *)validForDataSource:(id <EODataSources>)dataSource;
                    128: {
                    129:     return [self validateValuesInDictionary:[self valuesForKeys:[self keysToValidate]]];
                    130: }
                    131: 
                    132: - (NSDictionary *)validForInsertInDataSource:(id <EODataSources>)dataSource;
                    133: {
                    134:     return [self validForDataSource:dataSource];
                    135: }
                    136: 
                    137: - (NSDictionary *)validForUpdateInDataSource:(id <EODataSources>)dataSource;
                    138: {
                    139:     return [self validForDataSource:dataSource];
                    140: }
                    141: 
                    142: - (NSDictionary *)validForDeleteInDataSource:(id <EODataSources>)dataSource;
                    143: {
                    144:     return nil;
                    145: }
                    146: @end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.