|
|
1.1 root 1: // Employee.m
2: //
3: // Created on Thu Sep 15 17:31:19 PDT 1994 by NeXT EOModeler.app Version 59
4:
5: #import "Employee.h"
6: #import "Department.h"
7: #import "ValidatingDelegate.h"
8:
9: @implementation Employee
10:
11: // Accessors
12: - (double)salary {
13: return salary;
14: }
15:
16:
17: // Key Validation
18:
19: - (NSArray *)keysToValidate
20: {
21: return [NSArray arrayWithObjects:@"salary", @"city", @"address", nil];
22: }
23:
24: - (NSString *)validateSalary:(NSNumber *)proposed
25: {
26: if ([proposed doubleValue] < 1000.0)
27: return @"Salaries must be greater than $1,000";
28:
29: return nil; // no error
30: }
31:
32: - (NSString *)validateCity:(NSString *)proposed
33: {
34: if ([proposed length] == 0)
35: return @"You must enter a city";
36: return nil;
37: }
38:
39: - (NSString *)validateAddress:(NSString *)proposed
40: {
41: if ([proposed length] > 40)
42: return @"Addresses may not be longer than 40 characters";
43: return nil;
44: }
45:
46: // Final validation ////
47: - (NSDictionary *)validForDataSource:(id <EODataSources>)dataSource
48: {
49: // By default this message is called for both insertion and update.
50: // The superclass implementation will call our per-key validators (above).
51: // We can also check any broader validation constraints. E.g. is salary+bonus
52: // at an exceptable level? In this case we message a related object (department)
53: // to see if it's okay with our settings. Department, in turn, check if our
54: // salary is within the department limits.
55: NSString *errorMessage;
56: const NSString *generalKey = @"General";
57: NSDictionary *errors;
58:
59: if (errors = [super validForDataSource:dataSource])
60: return errors;
61:
62: // check cross property validation constraints
63: // Ask our department if it's okay with our new values
64: if (errorMessage = [toDepartment validateEmployee:self])
65: return [NSDictionary dictionaryWithObjects:&errorMessage forKeys:&generalKey count:1];
66:
67: return nil;
68: }
69:
70: - (void)dealloc
71: {
72: [address autorelease];
73: [city autorelease];
74: [firstName autorelease];
75: [lastName autorelease];
76: [toDepartment dealloc];
77: [super dealloc];
78: }
79:
80:
81: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.