Author: torehalset
Date: Tue Sep  5 12:31:41 2006
New Revision: 440455

URL: http://svn.apache.org/viewvc?view=rev&rev=440455
Log:
more work on relationship handling++

Removed:
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYManagedArray.h
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYManagedArray.m
Modified:
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYArcCreateOperation.m
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYArcDeleteOperation.m
    
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYClientObjRelationship.h
    
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYClientObjRelationship.m
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYEntityResolver.h
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYEntityResolver.m
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYFault.m
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYNodeCreateOperation.m
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYNodeDeleteOperation.m
    
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYNodePropertyChangeOperation.m
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjEntity.h
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjEntity.m
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.h
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.m
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectId.m
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.h
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.m
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYToManyFault.m
    
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CocoaCayenne.xcodeproj/project.pbxproj

Modified: 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYArcCreateOperation.m
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYArcCreateOperation.m?view=diff&rev=440455&r1=440454&r2=440455
==============================================================================
--- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYArcCreateOperation.m 
(original)
+++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYArcCreateOperation.m 
Tue Sep  5 12:31:41 2006
@@ -72,6 +72,14 @@
     return arcId;
 }
 
+-(NSString *)description
+{
+    NSString *result;
+    result = [[NSString alloc] initWithFormat:@"CAYArcCreateOperation {nodeId 
= %@; arcId = %@; targetNodeId = %@ }", [self nodeId], [self arcId], [self 
targetNodeId]];
+    [result autorelease];
+    return result;
+}
+
 -(void)dealloc
 {
        [self setTargetNodeId:nil];

Modified: 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYArcDeleteOperation.m
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYArcDeleteOperation.m?view=diff&rev=440455&r1=440454&r2=440455
==============================================================================
--- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYArcDeleteOperation.m 
(original)
+++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYArcDeleteOperation.m 
Tue Sep  5 12:31:41 2006
@@ -72,6 +72,14 @@
     return arcId;
 }
 
+-(NSString *)description
+{
+    NSString *result;
+    result = [[NSString alloc] initWithFormat:@"CAYArcDeleteOperation {nodeId 
= %@; arcId = %@; targetNodeId = %@ }", [self nodeId], [self arcId], [self 
targetNodeId]];
+    [result autorelease];
+    return result;
+}
+
 -(void)dealloc
 {
        [self setTargetNodeId:nil];

Modified: 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYClientObjRelationship.h
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYClientObjRelationship.h?view=diff&rev=440455&r1=440454&r2=440455
==============================================================================
--- 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYClientObjRelationship.h 
(original)
+++ 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYClientObjRelationship.h 
Tue Sep  5 12:31:41 2006
@@ -25,14 +25,16 @@
        BOOL toMany;
        NSString *name;
        NSString *targetEntityName;
+    NSString *reverseRelationshipName;
        
 }
 
 -(void)setName:(NSString *)n;
 -(NSString *)name;
+-(void)setReverseRelationshipName:(NSString *)n;
+-(NSString *)reverseRelationshipName;
 -(void)setTargetEntityName:(NSString *)n;
 -(NSString *)targetEntityName;
 -(BOOL)isToMany;
-
 
 @end

Modified: 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYClientObjRelationship.m
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYClientObjRelationship.m?view=diff&rev=440455&r1=440454&r2=440455
==============================================================================
--- 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYClientObjRelationship.m 
(original)
+++ 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYClientObjRelationship.m 
Tue Sep  5 12:31:41 2006
@@ -29,6 +29,7 @@
        toMany = [coder decodeBoolForKey:@"clientToMany"];
        [self setName:[coder decodeObjectForKey:@"name"]];
        [self setTargetEntityName:[coder 
decodeObjectForKey:@"targetEntityName"]];
+       [self setReverseRelationshipName:[coder 
decodeObjectForKey:@"reverseRelationshipName"]];
        return self;
 }
 
@@ -38,6 +39,7 @@
        [coder encodeBool:toMany forKey:@"clientToMany"];
        [coder encodeObject:name forKey:@"name"];
        [coder encodeObject:targetEntityName forKey:@"targetEntityName"];
+       [coder encodeObject:reverseRelationshipName 
forKey:@"reverseRelationshipName"];
 }
 
 -(void)setName:(NSString *)n
@@ -52,6 +54,18 @@
        return name;
 }
 
+-(void)setReverseRelationshipName:(NSString *)n
+{
+    [n retain];
+    [reverseRelationshipName release];
+    reverseRelationshipName = n;
+}
+
+-(NSString *)reverseRelationshipName
+{
+    return reverseRelationshipName;
+}
+
 -(void)setTargetEntityName:(NSString *)n
 {
        [n retain];
@@ -69,10 +83,21 @@
     return toMany;
 }
 
+/*
+-(NSString *)description
+{
+    NSString *result;
+    result = [[NSString alloc] initWithFormat:@"CAYClientObjRelationship 
{toMany = %@; name = %@; targetEntityName = %@; reverseRelationshipName = 
[EMAIL PROTECTED]", [self class], [self isToMany], [self name], [self 
targetEntityName], [self reverseRelationshipName]];
+    [result autorelease];
+    return result;
+}
+*/
+
 -(void)dealloc
 {
-       [name release];
-       [targetEntityName release];
+    [self setName:nil];
+    [self setTargetEntityName:nil];
+    [self setReverseRelationshipName:nil];
        [super dealloc];
 }
 

Modified: 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYEntityResolver.h
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYEntityResolver.h?view=diff&rev=440455&r1=440454&r2=440455
==============================================================================
--- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYEntityResolver.h 
(original)
+++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYEntityResolver.h Tue 
Sep  5 12:31:41 2006
@@ -19,6 +19,9 @@
 
 #import <Cocoa/Cocoa.h>
 #import "CAYObjEntity.h"
+#import "CAYPersistentObject.h"
+
[EMAIL PROTECTED] CAYPersistentObject;
 
 @interface CAYEntityResolver : NSObject {
     NSArray *maps;
@@ -32,5 +35,6 @@
 
 -(void)updateClassMapping;
 -(CAYObjEntity *)objEntityForClass:(Class)cl;
+-(CAYObjEntity *)lookupObjEntity:(CAYPersistentObject *)dataObject;
 
 @end

Modified: 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYEntityResolver.m
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYEntityResolver.m?view=diff&rev=440455&r1=440454&r2=440455
==============================================================================
--- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYEntityResolver.m 
(original)
+++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYEntityResolver.m Tue 
Sep  5 12:31:41 2006
@@ -21,7 +21,6 @@
 #import "CAYDataMap.h"
 #import "CAYObjEntity.h"
 #import "CAYCocoaCayenne.h"
-#import <HessianObjC/BBSHessianObjC.h>
 
 @implementation CAYEntityResolver
 
@@ -98,12 +97,6 @@
             NSLog(@"Could not find cocoa class %@ for server class $@", 
[entity name], [entity serverClassName]);
         }
     }
-    
-    // hack to update hessian proxy with latest class mapping. 
-    // TODO: move to hessian connection 
-    //[BBSHessianProxy setClassMapping:[self classMapping]];
-
-    //[self setClassMapping:cm];
 }
 
 -(CAYObjEntity *)objEntityForClass:(Class)cl
@@ -127,6 +120,11 @@
     }
     
     return nil;
+}
+
+-(CAYObjEntity *)lookupObjEntity:(CAYPersistentObject *)dataObject
+{
+    return [self objEntityForClass:[dataObject class]];
 }
 
 -(void)dealloc

Modified: incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYFault.m
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYFault.m?view=diff&rev=440455&r1=440454&r2=440455
==============================================================================
--- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYFault.m (original)
+++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYFault.m Tue Sep  5 
12:31:41 2006
@@ -35,8 +35,9 @@
 
 -(void)setSourceObject:(CAYPersistentObject *)so
 {
-    [so retain];
-    [sourceObject release];
+    // source object will be our master
+    // [so retain];
+    // [sourceObject release];
     sourceObject = so;
 }
 

Modified: 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYNodeCreateOperation.m
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYNodeCreateOperation.m?view=diff&rev=440455&r1=440454&r2=440455
==============================================================================
--- 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYNodeCreateOperation.m 
(original)
+++ 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYNodeCreateOperation.m 
Tue Sep  5 12:31:41 2006
@@ -32,4 +32,12 @@
     [super encodeWithCoder:coder];
 }
 
+-(NSString *)description
+{
+    NSString *result;
+    result = [[NSString alloc] initWithFormat:@"CAYNodeCreateOperation {nodeId 
= [EMAIL PROTECTED]", [self nodeId]];
+    [result autorelease];
+    return result;
+}
+
 @end

Modified: 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYNodeDeleteOperation.m
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYNodeDeleteOperation.m?view=diff&rev=440455&r1=440454&r2=440455
==============================================================================
--- 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYNodeDeleteOperation.m 
(original)
+++ 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYNodeDeleteOperation.m 
Tue Sep  5 12:31:41 2006
@@ -33,4 +33,12 @@
     [super encodeWithCoder:coder];
 }
 
+-(NSString *)description
+{
+    NSString *result;
+    result = [[NSString alloc] initWithFormat:@"CAYNodeDeleteOperation {nodeId 
= [EMAIL PROTECTED]", [self nodeId]];
+    [result autorelease];
+    return result;
+}
+
 @end

Modified: 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYNodePropertyChangeOperation.m
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYNodePropertyChangeOperation.m?view=diff&rev=440455&r1=440454&r2=440455
==============================================================================
--- 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYNodePropertyChangeOperation.m
 (original)
+++ 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYNodePropertyChangeOperation.m
 Tue Sep  5 12:31:41 2006
@@ -91,6 +91,14 @@
     return newValue;
 }
 
+-(NSString *)description
+{
+    NSString *result;
+    result = [[NSString alloc] initWithFormat:@"CAYNodePropertyChangeOperation 
{nodeId = %@; property = %@; oldValue = %@; newValue = [EMAIL PROTECTED]", 
[self nodeId], [self property], [self oldValue], [self newValue]];
+    [result autorelease];
+    return result;
+}
+
 -(void)dealloc
 {
        [property release];

Modified: incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjEntity.h
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjEntity.h?view=diff&rev=440455&r1=440454&r2=440455
==============================================================================
--- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjEntity.h 
(original)
+++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjEntity.h Tue Sep  
5 12:31:41 2006
@@ -22,15 +22,15 @@
 
 @interface CAYObjEntity : NSObject <NSCoding> {
 
-       NSArray *attributes;
+       NSMutableDictionary *attributes;
        NSString *name;
     NSString *serverClassName;
        NSMutableDictionary *relationships;
        
 }
 
--(void)setAttributes:(NSArray *)a;
--(NSArray *)attributes;
+-(void)setAttributes:(NSMutableDictionary *)a;
+-(NSMutableDictionary *)attributes;
 -(void)setName:(NSString *)n;
 -(NSString *)name;
 -(void)setServerClassName:(NSString *)n;

Modified: incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjEntity.m
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjEntity.m?view=diff&rev=440455&r1=440454&r2=440455
==============================================================================
--- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjEntity.m 
(original)
+++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjEntity.m Tue Sep  
5 12:31:41 2006
@@ -33,7 +33,7 @@
     // remove extra entry created by hessian framework
     // TODO: fix in framework?
     [[self relationships] removeObjectForKey:@"hessianClassName"];
-    
+    [[self attributes] removeObjectForKey:@"hessianClassName"];
     
        return self;
 }
@@ -46,14 +46,14 @@
        [coder encodeObject:relationships forKey:@"relationships"];
 }
 
--(void)setAttributes:(NSArray *)a
+-(void)setAttributes:(NSMutableDictionary *)a
 {
        [a retain];
        [attributes release];
        attributes = a;
 }
 
--(NSArray *)attributes
+-(NSMutableDictionary *)attributes
 {
        return attributes;
 }

Modified: incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.h
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.h?view=diff&rev=440455&r1=440454&r2=440455
==============================================================================
--- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.h 
(original)
+++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.h Tue 
Sep  5 12:31:41 2006
@@ -22,7 +22,7 @@
 #import "CAYEntityResolver.h"
 #import "CAYPersistentObject.h"
 
[EMAIL PROTECTED] CAYPersistentObject, CAYClientConnection, CAYPersistentObject;
[EMAIL PROTECTED] CAYPersistentObject, CAYClientConnection, 
CAYPersistentObject, CAYEntityResolver;
 
 @interface CAYObjectContext : NSObject {
        CAYClientConnection *connection;
@@ -37,6 +37,7 @@
 -(CAYClientConnection *)connection;
 
 -(void) propertyChanged:(CAYPersistentObject *)object forProperty:(NSString 
*)property fromOld:(NSObject *)oldValue toNew:(NSObject *)newValue;
+-(void) arcPropertyChanged:(CAYPersistentObject *)object forProperty:(NSString 
*)property fromOld:(NSObject *)oldValue toNew:(NSObject *)newValue;
 
 -(void)commitChanges;
 

Modified: incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.m
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.m?view=diff&rev=440455&r1=440454&r2=440455
==============================================================================
--- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.m 
(original)
+++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.m Tue 
Sep  5 12:31:41 2006
@@ -34,6 +34,8 @@
 #import "CAYNodeDeleteOperation.h"
 #import "CAYCocoaCayenne.h"
 #import "CAYBootstrapMessage.h"
+#import "CAYArcCreateOperation.h"
+#import "CAYArcDeleteOperation.h"
 
 @implementation CAYObjectContext
 
@@ -82,7 +84,6 @@
         
             [row setObjectContext:self];
             // TODO: set initial persistant state
-            // TODO: check for existing objects in context with same ObjectId
             
             CAYObjEntity *objEntity = [[self entityResolver] 
objEntityForClass:[row class]];
             if(objEntity)
@@ -130,6 +131,29 @@
     NSLog(@"%i unsaved changes", [diffs count]);
 }
 
+-(void) arcPropertyChanged:(CAYPersistentObject *)object forProperty:(NSString 
*)property fromOld:(NSObject *)oldValue toNew:(NSObject *)newValue
+{
+    NSLog(@"arc prop %@ changed from %@ to %@", property, oldValue, newValue);
+    
+    if([oldValue isKindOfClass:[CAYPersistentObject class]])
+    {
+        NSLog(@"add a arcDelete");
+        CAYPersistentObject *ov = (CAYPersistentObject *)oldValue;
+        CAYArcDeleteOperation *diff = [[CAYArcDeleteOperation alloc] 
initWithNodeId:[object objectId] targetNodeId:[ov objectId] arcId:property];
+        [diffs addObject:diff];
+        [diff release];
+    }
+
+    if([newValue isKindOfClass:[CAYPersistentObject class]])
+    {
+        NSLog(@"add a arcCreate");
+        CAYPersistentObject *nv = (CAYPersistentObject *)newValue;
+        CAYArcCreateOperation *diff = [[CAYArcCreateOperation alloc] 
initWithNodeId:[object objectId] targetNodeId:[nv objectId] arcId:property];
+        [diffs addObject:diff];
+        [diff release];
+    }
+}
+
 -(void)setConnection:(CAYClientConnection *)c
 {
        [c retain];
@@ -163,7 +187,7 @@
 
 -(void)commitChanges
 {
-    NSLog(@"%i unsaved changes before commit", [diffs count]);
+    NSLog(@"%i unsaved changes before commit. %@", [diffs count], diffs);
     CAYCompoundDiff *diffWithDiffs = [[CAYCompoundDiff alloc] 
initWithDiffs:diffs];
     // TODO: handle different types?
     CAYSyncMessage *msg = [[CAYSyncMessage alloc] initWithObjectSource:nil 
type:2 senderChanges:diffWithDiffs];
@@ -212,13 +236,14 @@
     {
         randombytes[i] = rand();
     }
-    NSData *randomdata = [[NSData alloc] initWithBytesNoCopy:&randombytes 
length:8];
+    NSData *randomdata = [[NSData alloc] initWithBytes:&randombytes length:8];
     
     CAYObjectId *oid = [[CAYObjectId alloc] init];
     CAYObjEntity *objEntity = [[self entityResolver] objEntityForClass:[o 
class]];
     [oid setEntityName:[objEntity name]];
     [oid setTempKey:randomdata];
     [o setObjectId:oid];
+    [randomdata release];
     
     CAYNodeDiff *diff = [[CAYNodeCreateOperation alloc] initWithNodeId:oid];
     [diffs addObject:diff];
@@ -226,9 +251,8 @@
     
     [objectByObjectId setObject:o forKey:oid];
     
-    // TODO: init values with NSNull objects?
-    
-    NSEnumerator *enumerator = [[objEntity attributes] objectEnumerator];
+    // init values with NSNull objects
+    NSEnumerator *enumerator = [[objEntity attributes] keyEnumerator];
     NSString *attribute;
     while(attribute = [enumerator nextObject])
     {
@@ -239,6 +263,8 @@
             [[o valuesRaw] setObject:[NSNull null] forKey:attribute];
         }
     }
+    
+    // TODO: init relationship values to NSNull as well?
     
     [randomdata release];
     [oid release];

Modified: incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectId.m
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectId.m?view=diff&rev=440455&r1=440454&r2=440455
==============================================================================
--- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectId.m (original)
+++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectId.m Tue Sep  
5 12:31:41 2006
@@ -190,7 +190,19 @@
 -(NSString *)description
 {
     NSString *result;
-    result = [[NSString alloc] initWithFormat:@"CAYObjectId {entityName = %@; 
objectIdKeys = %@; singleKey = %@; singleValue = %@; tempKey = [EMAIL 
PROTECTED]", [self entityName], [self objectIdKeys], [self singleKey], [self 
singleValue], [self tempKey]];
+    if([self tempKey])
+    {
+        result = [[NSString alloc] initWithFormat:@"CAYObjectId {entityName = 
%@; tempKey = [EMAIL PROTECTED]", [self entityName], [self tempKey]];
+    }
+    else if ([self singleKey])
+    {
+        result = [[NSString alloc] initWithFormat:@"CAYObjectId {entityName = 
%@; singleKey = %@; singleValue = [EMAIL PROTECTED]", [self entityName], [self 
singleKey], [self singleValue]];
+    }
+    else
+    {
+        // should match one of the above. if not, output all values
+        result = [[NSString alloc] initWithFormat:@"CAYObjectId {entityName = 
%@; objectIdKeys = %@; singleKey = %@; singleValue = %@; tempKey = [EMAIL 
PROTECTED]", [self entityName], [self objectIdKeys], [self singleKey], [self 
singleValue], [self tempKey]];
+    }
     [result autorelease];
     return result;
 }

Modified: 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.h
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.h?view=diff&rev=440455&r1=440454&r2=440455
==============================================================================
--- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.h 
(original)
+++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.h 
Tue Sep  5 12:31:41 2006
@@ -21,7 +21,7 @@
 #import "CAYObjectId.h"
 #import "CAYObjectContext.h"
 
[EMAIL PROTECTED] CAYObjectContext;
[EMAIL PROTECTED] CAYObjectContext, CAYPersistentObject;
 
 @interface CAYPersistentObject : NSObject <NSCoding> {
        CAYObjectId *objectId;

Modified: 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.m
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.m?view=diff&rev=440455&r1=440454&r2=440455
==============================================================================
--- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.m 
(original)
+++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.m 
Tue Sep  5 12:31:41 2006
@@ -21,7 +21,8 @@
 #import "CAYObjectId.h"
 #import "CAYObjectContext.h"
 #import "CAYFault.h"
-
+#import "CAYObjEntity.h"
+#import "CAYClientObjRelationship.h"
 
 @implementation CAYPersistentObject
 
@@ -99,25 +100,70 @@
 {
     NSLog(@"set value %@ for key %@ of type %@", value, key, [value class]);
     
-    if([value isKindOfClass:[NSArray class]])
+    // see if the key is a relationship
+    CAYObjEntity *objEntity = [[[self objectContext] entityResolver] 
lookupObjEntity:self];
+    CAYClientObjRelationship *relationship = [[objEntity relationships] 
valueForKey:key];
+    
+    //if([value isKindOfClass:[NSArray class]])
+    if (relationship)
     {
-        NSEnumerator *enumerator = [value objectEnumerator];
-        // TODO: handle and give error if not CAYPersistentObject
-        CAYPersistentObject *element;
-        while(element = [enumerator nextObject])
+        
+        if ([relationship isToMany])
         {
-            if(![element objectContext])
+            // check that arg are NSArray
+            if(![value isKindOfClass:[NSArray class]])
+            {
+                NSLog(@"ERROR: toMany argument should be of type NSArray, not 
%@", [value class]);
+            }
+            
+            NSEnumerator *enumerator = [value objectEnumerator];
+            // TODO: handle and give error if not CAYPersistentObject
+            CAYPersistentObject *element;
+            while(element = [enumerator nextObject])
             {
-                [[self objectContext] registerNewObject:element];
-                // TODO: set relation both ways
+                
+                // find reverse relationship. could be nil.
+                // CAYObjEntity *revObjEntity = [[[self objectContext] 
entityResolver] lookupObjEntity:element];
+                // CAYClientObjRelationship *revRelationship = [[revObjEntity 
relationships] valueForKey:[relationship reverseRelationshipName]];
+                
+                if(![element objectContext])
+                {
+                    [[self objectContext] registerNewObject:element];
+                    
+                    // TODO: set relation both ways
+                    [[self objectContext] arcPropertyChanged:self 
forProperty:key fromOld:nil toNew:element];
+                    [[self objectContext] arcPropertyChanged:element 
forProperty:[relationship reverseRelationshipName] fromOld:nil toNew:self];
+                    // TODO: or perhaps use 'element's setValue:forKey? could 
lead to infinite loop..
+                }
             }
+            // TODO: check for new objects that have a objectContext
+            // TODO: check for objects that are not present any more
         }
-        // TODO: check for objects that are not present any more
+        else 
+        {
+            // check that arg are CAYPersistentObject
+            if(![value isKindOfClass:[CAYPersistentObject class]])
+            {
+                NSLog(@"ERROR: toMany argument should be of type 
CAYPersistentObject, not %@", [value class]);
+            }
+            
+            // a to one relationship
+            [[self objectContext] arcPropertyChanged:self forProperty:key 
fromOld:[values objectForKey:key] toNew:value];
+            
+            // find reverse relationship. could be nil.
+            // CAYObjEntity *revObjEntity = [[[self objectContext] 
entityResolver] lookupObjEntity:value];
+            // CAYClientObjRelationship *revRelationship = [[revObjEntity 
relationships] valueForKey:[relationship reverseRelationshipName]];
+        }
+        
+        // handle reverse relationship
+        // TODO: handle reverse relationship without creating a neverending 
loop...
     }
-
-    // TODO: is this for simple properties only? not for relations?
-    [[self objectContext] propertyChanged:self forProperty:key fromOld:[values 
objectForKey:key] toNew:value];
-
+    else
+    {
+        // a none-relationship property
+        [[self objectContext] propertyChanged:self forProperty:key 
fromOld:[values objectForKey:key] toNew:value];
+    }
+    
     [values setValue:value forKey:key];
 }
 

Modified: incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYToManyFault.m
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYToManyFault.m?view=diff&rev=440455&r1=440454&r2=440455
==============================================================================
--- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYToManyFault.m 
(original)
+++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYToManyFault.m Tue 
Sep  5 12:31:41 2006
@@ -21,7 +21,6 @@
 #import "CAYFault.h"
 #import "CAYRelationshipQuery.h"
 #import "CAYObjectContext.h"
-#import "CAYManagedArray.h"
 
 @implementation CAYToManyFault
 
@@ -36,14 +35,7 @@
     CAYObjectContext *ctxt = [[self sourceObject] objectContext];
     NSArray *rows = (NSArray *)[ctxt performQuery:q];
     [q release];
-    //return rows;
-    
-    // TODO: create a collection that will autoadd new objects to the context? 
check with Core Data
-    CAYManagedArray *managedRows = [[CAYManagedArray alloc] init];
-    [managedRows setArray:rows];
-    [managedRows setObjectContext:ctxt];
-    
-    return [managedRows autorelease];
+    return rows;
 }
 
 @end

Modified: 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CocoaCayenne.xcodeproj/project.pbxproj
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CocoaCayenne.xcodeproj/project.pbxproj?view=diff&rev=440455&r1=440454&r2=440455
==============================================================================
--- 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CocoaCayenne.xcodeproj/project.pbxproj
 (original)
+++ 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CocoaCayenne.xcodeproj/project.pbxproj
 Tue Sep  5 12:31:41 2006
@@ -63,11 +63,9 @@
                4448AA440AA4C55F002C2FA7 /* CAYNodeDeleteOperation.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = 4448AA420AA4C55F002C2FA7 /* 
CAYNodeDeleteOperation.m */; };
                444DA8050AA61E54006E1768 /* CAYCocoaCayenne.h in Headers */ = 
{isa = PBXBuildFile; fileRef = 444DA8030AA61E54006E1768 /* CAYCocoaCayenne.h 
*/; settings = {ATTRIBUTES = (Public, ); }; };
                444DA8060AA61E54006E1768 /* CAYCocoaCayenne.m in Sources */ = 
{isa = PBXBuildFile; fileRef = 444DA8040AA61E54006E1768 /* CAYCocoaCayenne.m 
*/; };
-               444DA9FD0AA640B8006E1768 /* CAYManagedArray.h in Headers */ = 
{isa = PBXBuildFile; fileRef = 444DA9FB0AA640B8006E1768 /* CAYManagedArray.h 
*/; settings = {ATTRIBUTES = (Public, ); }; };
-               444DA9FE0AA640B8006E1768 /* CAYManagedArray.m in Sources */ = 
{isa = PBXBuildFile; fileRef = 444DA9FC0AA640B8006E1768 /* CAYManagedArray.m 
*/; };
-               444DAB190AACB74C006E1768 /* CAYArcCreateOperation.h in Headers 
*/ = {isa = PBXBuildFile; fileRef = 444DAB170AACB74C006E1768 /* 
CAYArcCreateOperation.h */; };
+               444DAB190AACB74C006E1768 /* CAYArcCreateOperation.h in Headers 
*/ = {isa = PBXBuildFile; fileRef = 444DAB170AACB74C006E1768 /* 
CAYArcCreateOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
                444DAB1A0AACB74C006E1768 /* CAYArcCreateOperation.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = 444DAB180AACB74C006E1768 /* 
CAYArcCreateOperation.m */; };
-               444DAB270AACB7B1006E1768 /* CAYArcDeleteOperation.h in Headers 
*/ = {isa = PBXBuildFile; fileRef = 444DAB250AACB7B1006E1768 /* 
CAYArcDeleteOperation.h */; };
+               444DAB270AACB7B1006E1768 /* CAYArcDeleteOperation.h in Headers 
*/ = {isa = PBXBuildFile; fileRef = 444DAB250AACB7B1006E1768 /* 
CAYArcDeleteOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
                444DAB280AACB7B1006E1768 /* CAYArcDeleteOperation.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = 444DAB260AACB7B1006E1768 /* 
CAYArcDeleteOperation.m */; };
                44FE798F0AA3790C0040BB78 /* HessianObjC.framework in Frameworks 
*/ = {isa = PBXBuildFile; fileRef = 44FE798E0AA3790C0040BB78 /* 
HessianObjC.framework */; };
                8DC2EF530486A6940098B216 /* InfoPlist.strings in Resources */ = 
{isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings 
*/; };
@@ -91,7 +89,7 @@
                44463D6F0AA37577006BAA58 /* CAYClientMessage.h */ = {isa = 
PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = 
CAYClientMessage.h; sourceTree = "<group>"; };
                44463D700AA37577006BAA58 /* CAYClientMessage.m */ = {isa = 
PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; 
path = CAYClientMessage.m; sourceTree = "<group>"; };
                44463D710AA37577006BAA58 /* CAYClientObjRelationship.h */ = 
{isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; 
path = CAYClientObjRelationship.h; sourceTree = "<group>"; };
-               44463D720AA37577006BAA58 /* CAYClientObjRelationship.m */ = 
{isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = 
sourcecode.c.objc; path = CAYClientObjRelationship.m; sourceTree = "<group>"; };
+               44463D720AA37577006BAA58 /* CAYClientObjRelationship.m */ = 
{isa = PBXFileReference; fileEncoding = 30; languageSpecificationIdentifier = 
c.objc; lastKnownFileType = sourcecode.c.objc; path = 
CAYClientObjRelationship.m; sourceTree = "<group>"; wrapsLines = 0; };
                44463D730AA37577006BAA58 /* CAYCompoundDiff.h */ = {isa = 
PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = 
CAYCompoundDiff.h; sourceTree = "<group>"; };
                44463D740AA37577006BAA58 /* CAYCompoundDiff.m */ = {isa = 
PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; 
path = CAYCompoundDiff.m; sourceTree = "<group>"; };
                44463D750AA37577006BAA58 /* CAYDataMap.h */ = {isa = 
PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = 
CAYDataMap.h; sourceTree = "<group>"; };
@@ -136,8 +134,6 @@
                4448AA420AA4C55F002C2FA7 /* CAYNodeDeleteOperation.m */ = {isa 
= PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; 
path = CAYNodeDeleteOperation.m; sourceTree = "<group>"; };
                444DA8030AA61E54006E1768 /* CAYCocoaCayenne.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
CAYCocoaCayenne.h; sourceTree = "<group>"; };
                444DA8040AA61E54006E1768 /* CAYCocoaCayenne.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= CAYCocoaCayenne.m; sourceTree = "<group>"; };
-               444DA9FB0AA640B8006E1768 /* CAYManagedArray.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
CAYManagedArray.h; sourceTree = "<group>"; };
-               444DA9FC0AA640B8006E1768 /* CAYManagedArray.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= CAYManagedArray.m; sourceTree = "<group>"; };
                444DAB170AACB74C006E1768 /* CAYArcCreateOperation.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
CAYArcCreateOperation.h; sourceTree = "<group>"; };
                444DAB180AACB74C006E1768 /* CAYArcCreateOperation.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= CAYArcCreateOperation.m; sourceTree = "<group>"; };
                444DAB250AACB7B1006E1768 /* CAYArcDeleteOperation.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
CAYArcDeleteOperation.h; sourceTree = "<group>"; };
@@ -203,7 +199,6 @@
                08FB77AEFE84172EC02AAC07 /* Classes */ = {
                        isa = PBXGroup;
                        children = (
-                               444DA9FA0AA6409E006E1768 /* collection */,
                                444DA8AC0AA62727006E1768 /* connection */,
                                44463DCB0AA3757F006BAA58 /* fault */,
                                44463DCC0AA37586006BAA58 /* message */,
@@ -334,15 +329,6 @@
                        name = connection;
                        sourceTree = "<group>";
                };
-               444DA9FA0AA6409E006E1768 /* collection */ = {
-                       isa = PBXGroup;
-                       children = (
-                               444DA9FB0AA640B8006E1768 /* CAYManagedArray.h 
*/,
-                               444DA9FC0AA640B8006E1768 /* CAYManagedArray.m 
*/,
-                       );
-                       name = collection;
-                       sourceTree = "<group>";
-               };
 /* End PBXGroup section */
 
 /* Begin PBXHeadersBuildPhase section */
@@ -378,7 +364,6 @@
                                4448AA430AA4C55F002C2FA7 /* 
CAYNodeDeleteOperation.h in Headers */,
                                4421E61E0AA4EE2D00FBE975 /* 
CAYNodeIdChangeOperation.h in Headers */,
                                444DA8050AA61E54006E1768 /* CAYCocoaCayenne.h 
in Headers */,
-                               444DA9FD0AA640B8006E1768 /* CAYManagedArray.h 
in Headers */,
                                444DAB190AACB74C006E1768 /* 
CAYArcCreateOperation.h in Headers */,
                                444DAB270AACB7B1006E1768 /* 
CAYArcDeleteOperation.h in Headers */,
                        );
@@ -466,7 +451,6 @@
                                4448AA440AA4C55F002C2FA7 /* 
CAYNodeDeleteOperation.m in Sources */,
                                4421E61F0AA4EE2D00FBE975 /* 
CAYNodeIdChangeOperation.m in Sources */,
                                444DA8060AA61E54006E1768 /* CAYCocoaCayenne.m 
in Sources */,
-                               444DA9FE0AA640B8006E1768 /* CAYManagedArray.m 
in Sources */,
                                444DAB1A0AACB74C006E1768 /* 
CAYArcCreateOperation.m in Sources */,
                                444DAB280AACB7B1006E1768 /* 
CAYArcDeleteOperation.m in Sources */,
                        );


Reply via email to