Annotation of Examples/EnterpriseObjects/FlatFileDataSource/DetailTableDataSource.m, revision 1.1

1.1     ! root        1: /* DetailTableDataSource.m
        !             2:  *
        !             3:  * A data source implementation for a detail table.
        !             4:  * 
        !             5:  * You may freely copy, distribute, and reuse the code in this example.
        !             6:  * NeXT disclaims any warranty of any kind, expressed or  implied, as to its
        !             7:  * fitness for any particular use.
        !             8:  *
        !             9:  * 
        !            10:  */
        !            11: 
        !            12: 
        !            13: 
        !            14: #import <appkit/appkit.h>
        !            15: #import <eoaccess/eoaccess.h>
        !            16: #import "DetailTableDataSource.h"
        !            17: #import "TableDataSourcePrivate.h"
        !            18: 
        !            19: @implementation DetailTableDataSource
        !            20: 
        !            21: - initWithMasterDataSource:(TableDataSource *)masterSource entity:(EOEntity *)detailEntity {
        !            22:        NSString *primaryKey;
        !            23:        NSArray *relations;
        !            24:        int i;
        !            25:        NSMutableArray *qualifiers = [[[NSMutableArray alloc] init] autorelease];
        !            26: 
        !            27:        [super init];
        !            28:        entity = [detailEntity retain];
        !            29:        master = [masterSource retain];
        !            30:        orderByKey=nil;
        !            31:        
        !            32:        primaryKey = [(EOAttribute *)[[entity primaryKeyAttributes] objectAtIndex:0] name];
        !            33:        relations = [entity relationships];
        !            34:        for (i=0; i<[relations count]; i++) {
        !            35:                EORelationship *rel=[relations objectAtIndex:i];
        !            36: 
        !            37:                if ([rel isToMany]) {
        !            38:                        EOAttribute *attr = [[rel sourceAttributes] objectAtIndex:0];
        !            39:                        if (!attr) continue;
        !            40:                        else [qualifiers addObject:[attr name]];
        !            41:                }
        !            42:        }
        !            43:        relations = [[master entity] relationships];
        !            44:        for (i=0; i<[relations count]; i++) {
        !            45:                EORelationship *rel=[relations objectAtIndex:i];
        !            46: 
        !            47:                if ([rel isToMany] && [entity isEqual:[rel destinationEntity]]) {
        !            48:                        EOAttribute *attr = [[rel destinationAttributes] objectAtIndex:0];
        !            49:                        if (!attr) continue;
        !            50:                        else [qualifiers addObject:[attr name]];
        !            51:                }
        !            52:        }
        !            53: 
        !            54:        return [self initWithTable:[master tablePath] primaryKey:primaryKey qualifierKeys:qualifiers];
        !            55: }
        !            56: 
        !            57: - (void)qualifyWithRelationshipKey:key ofObject:sourceObject {
        !            58: 
        !            59:        EORelationship *rel = [[master entity] relationshipNamed:key];
        !            60:        NSMutableDictionary *qual;
        !            61:        EOAttribute *source = [[rel sourceAttributes] objectAtIndex:0];
        !            62:        EOAttribute *dest = [[rel destinationAttributes] objectAtIndex:0];
        !            63: 
        !            64:        if (!rel) {
        !            65:                NSLog(@"Master source does not have relationship for key %@", [(NSString *)key description]);
        !            66:                [self setQualifier:nil];
        !            67:        }
        !            68:        else if (!source || !dest) {
        !            69:                NSLog(@"Master source does not have source or destination attribute");
        !            70:                [self setQualifier:nil];
        !            71:        }
        !            72:        else if (!sourceObject) {
        !            73:                [self setQualifier:nil];
        !            74:        }
        !            75:        else {
        !            76:                id linkValue;
        !            77:                linkValue = [sourceObject objectForKey:[source name]];
        !            78:                if (linkValue) {
        !            79:                        qual = [[[NSMutableDictionary alloc] init] autorelease];
        !            80:                        [qual setObject:[dest name] forKey:@QPROPERTY];
        !            81:                        [qual setObject:linkValue forKey:@QVALUE];
        !            82:                        [self setQualifier:qual];
        !            83:                }
        !            84:                else [self setQualifier:nil];
        !            85:        }       
        !            86:        /*[masterObject autorelease];
        !            87:        masterObject=[sourceObject retain];
        !            88:        [masterKey autorelease];
        !            89:        masterKey=[key retain];*/
        !            90: }
        !            91: 
        !            92: - createObject{
        !            93:        NSMutableDictionary *newObject = [super createObject];
        !            94:        NSArray *relations = [[master entity] relationships];
        !            95:        int i;
        !            96: 
        !            97:        if (!newObject) return nil;
        !            98:        for (i=0; i<[relations count]; i++) {
        !            99:                EORelationship *rel=[relations objectAtIndex:i];
        !           100: 
        !           101:                if ( ([rel isToMany]) && ([entity isEqual:[rel destinationEntity]]) ) {
        !           102:                        EOAttribute *attr = [[rel destinationAttributes] objectAtIndex:0];
        !           103:                        NSString *key = [attr name];
        !           104: 
        !           105:                        if (!attr) continue;
        !           106:                        if ( ![key isEqual:[qualifier objectForKey:@QPROPERTY]] ) {
        !           107:                                NSLog(@"qualifier %@ differs from relationship key %@ to create detail object %@", 
        !           108:                                        [(NSMutableDictionary *)qualifier description], key, [entity name]);
        !           109:                                continue;
        !           110:                        }
        !           111:                        else [newObject setObject:[qualifier objectForKey:@QVALUE] forKey:key];
        !           112:                }
        !           113:        }
        !           114: 
        !           115: 
        !           116:        return newObject;
        !           117: }
        !           118: 
        !           119: 
        !           120: @end

unix.superglobalmegacorp.com

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