Author: torehalset
Date: Mon Sep 11 08:49:52 2006
New Revision: 442242

URL: http://svn.apache.org/viewvc?view=rev&rev=442242
Log:
 * moved from cayenne-1.2 to cayenne-3.0
 * relationship add/remove improvement

Modified:
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYCocoaCayenne.m
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.m
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.h
    incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.m

Modified: incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYCocoaCayenne.m
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYCocoaCayenne.m?view=diff&rev=442242&r1=442241&r2=442242
==============================================================================
--- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYCocoaCayenne.m 
(original)
+++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYCocoaCayenne.m Mon 
Sep 11 08:49:52 2006
@@ -25,30 +25,30 @@
 +(NSMutableDictionary *)classMapping;
 {
     NSMutableDictionary *classMapping = [NSMutableDictionary dictionary];
-    //[classMapping setObject:@"CAYRemoteSession" 
forKey:@"org.objectstyle.cayenne.remote.RemoteSession"];
-    [classMapping setObject:@"CAYNamedQuery" 
forKey:@"org.objectstyle.cayenne.query.NamedQuery"];
-    [classMapping setObject:@"CAYRelationshipQuery" 
forKey:@"org.objectstyle.cayenne.query.RelationshipQuery"];
-    [classMapping setObject:@"CAYGenericResponse" 
forKey:@"org.objectstyle.cayenne.util.GenericResponse"];
-    [classMapping setObject:@"CAYObjectId" 
forKey:@"org.objectstyle.cayenne.ObjectId"];
-    [classMapping setObject:@"CAYObjEntity" 
forKey:@"org.objectstyle.cayenne.map.ObjEntity"];
-    [classMapping setObject:@"CAYClientObjRelationship" 
forKey:@"org.objectstyle.cayenne.map.ClientObjRelationship"];
-    [classMapping setObject:@"CAYEntityResolver" 
forKey:@"org.objectstyle.cayenne.map.EntityResolver"];
-    [classMapping setObject:@"CAYDataMap" 
forKey:@"org.objectstyle.cayenne.map.DataMap"];
+    //[classMapping setObject:@"CAYRemoteSession" 
forKey:@"org.apache.cayenne.remote.RemoteSession"];
+    [classMapping setObject:@"CAYNamedQuery" 
forKey:@"org.apache.cayenne.query.NamedQuery"];
+    [classMapping setObject:@"CAYRelationshipQuery" 
forKey:@"org.apache.cayenne.query.RelationshipQuery"];
+    [classMapping setObject:@"CAYGenericResponse" 
forKey:@"org.apache.cayenne.util.GenericResponse"];
+    [classMapping setObject:@"CAYObjectId" 
forKey:@"org.apache.cayenne.ObjectId"];
+    [classMapping setObject:@"CAYObjEntity" 
forKey:@"org.apache.cayenne.map.ObjEntity"];
+    [classMapping setObject:@"CAYClientObjRelationship" 
forKey:@"org.apache.cayenne.map.ClientObjRelationship"];
+    [classMapping setObject:@"CAYEntityResolver" 
forKey:@"org.apache.cayenne.map.EntityResolver"];
+    [classMapping setObject:@"CAYDataMap" 
forKey:@"org.apache.cayenne.map.DataMap"];
     
     // message
-    [classMapping setObject:@"CAYBootstrapMessage" 
forKey:@"org.objectstyle.cayenne.remote.BootstrapMessage"];
-    [classMapping setObject:@"CAYQueryMessage" 
forKey:@"org.objectstyle.cayenne.remote.QueryMessage"];
-    [classMapping setObject:@"CAYSyncMessage" 
forKey:@"org.objectstyle.cayenne.remote.SyncMessage"];
+    [classMapping setObject:@"CAYBootstrapMessage" 
forKey:@"org.apache.cayenne.remote.BootstrapMessage"];
+    [classMapping setObject:@"CAYQueryMessage" 
forKey:@"org.apache.cayenne.remote.QueryMessage"];
+    [classMapping setObject:@"CAYSyncMessage" 
forKey:@"org.apache.cayenne.remote.SyncMessage"];
     
     // graph
-    // abstract [classMapping setObject:@"CAYNodeDiff" 
forKey:@"org.objectstyle.cayenne.graph.NodeDiff"];
-    [classMapping setObject:@"CAYCompoundDiff" 
forKey:@"org.objectstyle.cayenne.graph.CompoundDiff"];
-    [classMapping setObject:@"CAYNodeCreateOperation" 
forKey:@"org.objectstyle.cayenne.graph.NodeCreateOperation"];
-    [classMapping setObject:@"CAYNodePropertyChangeOperation" 
forKey:@"org.objectstyle.cayenne.graph.NodePropertyChangeOperation"];
-    [classMapping setObject:@"CAYNodeDeleteOperation" 
forKey:@"org.objectstyle.cayenne.graph.NodeDeleteOperation"];
-    [classMapping setObject:@"CAYNodeIdChangeOperation" 
forKey:@"org.objectstyle.cayenne.graph.NodeIdChangeOperation"];
-    [classMapping setObject:@"CAYArcCreateOperation" 
forKey:@"org.objectstyle.cayenne.graph.ArcCreateOperation"];
-    [classMapping setObject:@"CAYArcDeleteOperation" 
forKey:@"org.objectstyle.cayenne.graph.ArcDeleteOperation"];
+    // abstract [classMapping setObject:@"CAYNodeDiff" 
forKey:@"org.apache.cayenne.graph.NodeDiff"];
+    [classMapping setObject:@"CAYCompoundDiff" 
forKey:@"org.apache.cayenne.graph.CompoundDiff"];
+    [classMapping setObject:@"CAYNodeCreateOperation" 
forKey:@"org.apache.cayenne.graph.NodeCreateOperation"];
+    [classMapping setObject:@"CAYNodePropertyChangeOperation" 
forKey:@"org.apache.cayenne.graph.NodePropertyChangeOperation"];
+    [classMapping setObject:@"CAYNodeDeleteOperation" 
forKey:@"org.apache.cayenne.graph.NodeDeleteOperation"];
+    [classMapping setObject:@"CAYNodeIdChangeOperation" 
forKey:@"org.apache.cayenne.graph.NodeIdChangeOperation"];
+    [classMapping setObject:@"CAYArcCreateOperation" 
forKey:@"org.apache.cayenne.graph.ArcCreateOperation"];
+    [classMapping setObject:@"CAYArcDeleteOperation" 
forKey:@"org.apache.cayenne.graph.ArcDeleteOperation"];
     
     return classMapping;
 }

Modified: incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.m
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.m?view=diff&rev=442242&r1=442241&r2=442242
==============================================================================
--- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.m 
(original)
+++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.m Mon 
Sep 11 08:49:52 2006
@@ -145,11 +145,11 @@
 
 -(void) arcPropertyChanged:(CAYPersistentObject *)object forProperty:(NSString 
*)property fromOld:(NSObject *)oldValue toNew:(NSObject *)newValue
 {
-    NSLog(@"arc prop %@ changed from %@ to %@", property, oldValue, newValue);
+    // NSLog(@"DEBUG: arc prop %@ changed from %@ to %@", property, oldValue, 
newValue);
     
     if([oldValue isKindOfClass:[CAYPersistentObject class]])
     {
-        NSLog(@"add a arcDelete");
+        NSLog(@"add a arcDelete [EMAIL PROTECTED]@", [object class], property);
         CAYPersistentObject *ov = (CAYPersistentObject *)oldValue;
         CAYArcDeleteOperation *diff = [[CAYArcDeleteOperation alloc] 
initWithNodeId:[object objectId] targetNodeId:[ov objectId] arcId:property];
         [diffs addObject:diff];
@@ -158,7 +158,7 @@
 
     if([newValue isKindOfClass:[CAYPersistentObject class]])
     {
-        NSLog(@"add a arcCreate");
+        NSLog(@"add a arcCreate [EMAIL PROTECTED]@", [object class], property);
         CAYPersistentObject *nv = (CAYPersistentObject *)newValue;
         CAYArcCreateOperation *diff = [[CAYArcCreateOperation alloc] 
initWithNodeId:[object objectId] targetNodeId:[nv objectId] arcId:property];
         [diffs addObject:diff];
@@ -178,13 +178,13 @@
     id bootresult = [[self connection] sendMessage:bootstrapMsg];
     if([bootresult isKindOfClass:[CAYEntityResolver class]])
     {
-        NSLog(@" ****** got an CATEntityResolver");
+        NSLog(@" ****** got an CAYEntityResolver");
         CAYEntityResolver *resolver = (CAYEntityResolver *)bootresult;
         [self setEntityResolver:resolver];
     }
     else
     {
-        NSLog(@"ERROR: bootstrap answer not of type CATEntityResolver, but 
%@", [bootresult class]);
+        NSLog(@"ERROR: bootstrap answer not of type CAYEntityResolver, but 
%@", [bootresult class]);
     }
     [bootstrapMsg release];
     

Modified: 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.h
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.h?view=diff&rev=442242&r1=442241&r2=442242
==============================================================================
--- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.h 
(original)
+++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.h 
Mon Sep 11 08:49:52 2006
@@ -42,4 +42,11 @@
 -(void)setValue:(id)value forKey:(NSString *)key;
 -(id)valueForKey:(NSString *)key;
 
+-(void)setToOneTarget:(CAYPersistentObject *)value forKey:(NSString *)key 
setReverse:(BOOL)setrev;
+-(void)addToManyTarget:(CAYPersistentObject *)value forKey:(NSString *)key 
setReverse:(BOOL)setrev;
+-(void)removeToManyTarget:(CAYPersistentObject *)value forKey:(NSString *)key 
setReverse:(BOOL)setrev;
+-(void)setReverseRelationship:(CAYPersistentObject *)value forKey:(NSString 
*)key;
+-(void)unsetReverseRelationship:(CAYPersistentObject *)value forKey:(NSString 
*)key;
+
+
 @end

Modified: 
incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.m
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.m?view=diff&rev=442242&r1=442241&r2=442242
==============================================================================
--- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.m 
(original)
+++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.m 
Mon Sep 11 08:49:52 2006
@@ -86,7 +86,8 @@
 -(NSString *)description
 {
     NSString *result;
-    result = [[NSString alloc] initWithFormat:@"{objectContext = %@; objectId 
= %@; values = [EMAIL PROTECTED]", [self objectContext], [self objectId], 
values];
+       // TODO: it is dangerous to include relational values as it can result 
in a neverending loop..
+    result = [[NSString alloc] initWithFormat:@"{objectContext = %@; objectId 
= %@; values = [EMAIL PROTECTED]", [self objectContext], [self objectId], 
/*values*/ @"...(TODO)...)"];
     [result autorelease];
     return result;
 }
@@ -98,12 +99,12 @@
 
 -(void)setValue:(id)value forKey:(NSString *)key
 {
-    NSLog(@"set value %@ for key %@ of type %@", value, key, [value class]);
+    // NSLog(@"DEBUG: set value %@ for key %@ of type %@", value, key, [value 
class]);
     
     // see if the key is a relationship
     CAYObjEntity *objEntity = [[[self objectContext] entityResolver] 
lookupObjEntity:self];
     CAYClientObjRelationship *relationship = [[objEntity relationships] 
valueForKey:key];
-    
+       
     if (relationship)
     {
         
@@ -114,29 +115,44 @@
             {
                 NSLog(@"ERROR: toMany argument should be of type NSArray, not 
%@", [value class]);
             }
+                       
+                       NSArray *oldValue = [self valueForKey:key];
             
+                       // register new objects in the context
+                       // TODO: replace with autoregister stuff in willConnect
             NSEnumerator *enumerator = [value objectEnumerator];
-            // TODO: handle and give error if not CAYPersistentObject
             CAYPersistentObject *element;
             while(element = [enumerator nextObject])
             {
-                
-                // 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
+
+                       // handle new objects for the relationship
+                       NSMutableArray *newElements = [[NSMutableArray alloc] 
init];
+                       [newElements addObjectsFromArray:value];
+                       [newElements removeObjectsInArray:oldValue];
+                       enumerator = [newElements objectEnumerator];
+            while(element = [enumerator nextObject])
+            {
+                               NSLog(@"new element for rel %@: %@", key, 
element);
+                               [self addToManyTarget:element forKey:key 
setReverse:YES];
+                       }
+                       [newElements release];
+                       
+                       // handle objects that are not longer in the 
relationship
+                       NSMutableArray *removedElements = [[NSMutableArray 
alloc] init];
+                       [removedElements addObjectsFromArray:oldValue];
+                       [removedElements removeObjectsInArray:value];
+                       enumerator = [removedElements objectEnumerator];
+            while(element = [enumerator nextObject])
+            {
+                               NSLog(@"removed element for rel %@: %@", key, 
element);
+                               [self removeToManyTarget:element forKey:key 
setReverse:YES];
+                       }
+                       [removedElements release];
         }
         else 
         {
@@ -146,24 +162,15 @@
                 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]];
+                       [self setToOneTarget:value forKey:key setReverse:YES];
         }
-        
-        // handle reverse relationship
-        // TODO: handle reverse relationship without creating a neverending 
loop...
     }
     else
     {
         // a none-relationship property
         [[self objectContext] propertyChanged:self forProperty:key 
fromOld:[values objectForKey:key] toNew:value];
+               [values setValue:value forKey:key];
     }
-    
-    [values setValue:value forKey:key];
 }
 
 -(id)valueForKey:(NSString *)key
@@ -177,6 +184,135 @@
         [values setValue:val forKey:key];
     }
        return [values objectForKey:key];
+}
+
+-(void)setToOneTarget:(CAYPersistentObject *)value forKey:(NSString *)key 
setReverse:(BOOL)setrev
+{
+       NSLog(@"DEBUG: setToOneTarget value class: %@, key: %@, setrev: %@", 
[value class], key, setrev ? @"YES" : @"NO");
+       id oldTarget = [self valueForKey:key];
+       if(oldTarget == value)
+       {
+               return;
+       }
+       
+       [[self objectContext] arcPropertyChanged:self forProperty:key 
fromOld:oldTarget toNew:value];
+       
+       if(setrev)
+       {
+               if([oldTarget isKindOfClass:[CAYPersistentObject class]])
+               {
+                       // TODO: unset reverse
+                       [self unsetReverseRelationship:oldTarget forKey:key];
+               }
+               
+               if(value)
+               {
+                       [self setReverseRelationship:value forKey:key];
+               }
+       }
+       
+       [values setValue:value forKey:key];
+}
+
+-(void)addToManyTarget:(CAYPersistentObject *)value forKey:(NSString *)key 
setReverse:(BOOL)setrev
+{
+       NSLog(@"DEBUG: addToManyTarget value class: %@, key: %@, setrev: %@", 
[value class], key, setrev ? @"YES" : @"NO");
+       if(!value)
+       {
+               // TODO: throw
+               NSLog(@"ERROR. can not add nil to [EMAIL PROTECTED]@", [self 
class], key);
+               return;
+       }
+       NSMutableArray *list = [self valueForKey:key];
+       
+       [[self objectContext] arcPropertyChanged:self forProperty:key 
fromOld:nil toNew:value];
+       
+       [list addObject:value];
+       
+       if(setrev)
+       {
+               [self setReverseRelationship:value forKey:key];
+       }
+}
+
+-(void)removeToManyTarget:(CAYPersistentObject *)value forKey:(NSString *)key 
setReverse:(BOOL)setrev
+{
+       NSLog(@"DEBUG: removeToManyTarget value class: %@, key: %@, setrev: 
%@", [value class], key, setrev ? @"YES" : @"NO");
+       if(!value)
+       {
+               // TODO: throw
+               NSLog(@"ERROR. can not remove nil to [EMAIL PROTECTED]@", [self 
class], key);
+               return;
+       }
+       NSMutableArray *list = [self valueForKey:key];
+       
+       [[self objectContext] arcPropertyChanged:self forProperty:key 
fromOld:value toNew:nil];
+       // TODO:
+       /*
+        if (persistenceState == PersistenceState.COMMITTED) {
+                persistenceState = PersistenceState.MODIFIED;
+        }
+        */
+       
+       NSLog(@"DEBUG: value for [EMAIL PROTECTED]@ is of type %@", [self 
class], key, [list class]);
+       
+       [list removeObject:value];
+       
+       if(setrev)
+       {
+               [self unsetReverseRelationship:value forKey:key];
+       }
+       
+}
+
+-(void)setReverseRelationship:(CAYPersistentObject *)value forKey:(NSString 
*)key
+{
+       NSLog(@"DEBUG: setReverseRelationship value class: %@, key: %@", [value 
class], key);
+       
+       // find relationship
+    CAYObjEntity *objEntity = [[[self objectContext] entityResolver] 
lookupObjEntity:self];
+    CAYClientObjRelationship *relationship = [[objEntity relationships] 
valueForKey:key];
+       
+       // find reverse relationship. could be nil.
+       CAYObjEntity *revObjEntity = [[[self objectContext] entityResolver] 
lookupObjEntity:value];
+       CAYClientObjRelationship *revRelationship = [[revObjEntity 
relationships] valueForKey:[relationship reverseRelationshipName]];
+       
+       if(revRelationship)
+       {
+               if([revRelationship isToMany])
+               {
+                       [value addToManyTarget:self forKey:[revRelationship 
name] setReverse:NO];
+               }
+               else
+               {
+                       [value setToOneTarget:self forKey:[revRelationship 
name] setReverse:NO];
+               }
+       }
+}
+
+-(void)unsetReverseRelationship:(CAYPersistentObject *)value forKey:(NSString 
*)key
+{
+       NSLog(@"DEBUG: unsetReverseRelationship value class: %@, key: %@", 
[value class], key);
+       
+       // find relationship
+    CAYObjEntity *objEntity = [[[self objectContext] entityResolver] 
lookupObjEntity:self];
+    CAYClientObjRelationship *relationship = [[objEntity relationships] 
valueForKey:key];
+       
+       // find reverse relationship. could be nil.
+       CAYObjEntity *revObjEntity = [[[self objectContext] entityResolver] 
lookupObjEntity:value];
+       CAYClientObjRelationship *revRelationship = [[revObjEntity 
relationships] valueForKey:[relationship reverseRelationshipName]];
+       
+       if(revRelationship)
+       {
+               if([revRelationship isToMany])
+               {
+                       [value removeToManyTarget:self forKey:[revRelationship 
name] setReverse:NO];
+               }
+               else
+               {
+                       [value setToOneTarget:nil forKey:[revRelationship name] 
setReverse:NO];
+               }
+       }
 }
 
 -(void)dealloc


Reply via email to