Author: torehalset Date: Mon Oct 30 14:26:19 2006 New Revision: 469299 URL: http://svn.apache.org/viewvc?view=rev&rev=469299 Log: ObjectIdQuery and basic HOLLOW handling
Added: incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectIdQuery.h incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectIdQuery.m Modified: incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYCocoaCayenne.m incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.h incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.m incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.m incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CocoaCayenne.xcodeproj/project.pbxproj Modified: incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYCocoaCayenne.m URL: http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYCocoaCayenne.m?view=diff&rev=469299&r1=469298&r2=469299 ============================================================================== --- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYCocoaCayenne.m (original) +++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYCocoaCayenne.m Mon Oct 30 14:26:19 2006 @@ -28,8 +28,6 @@ // core [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"]; @@ -39,6 +37,11 @@ [classMapping setObject:@"CAYDataMap" forKey:@"org.apache.cayenne.map.DataMap"]; [classMapping setObject:@"CAYCayenneRuntimeException" forKey:@"org.apache.cayenne.CayenneRuntimeException"]; [classMapping setObject:@"CAYMissingSessionException" forKey:@"org.apache.cayenne.remote.service.MissingSessionException"]; + + // query + [classMapping setObject:@"CAYNamedQuery" forKey:@"org.apache.cayenne.query.NamedQuery"]; + [classMapping setObject:@"CAYRelationshipQuery" forKey:@"org.apache.cayenne.query.RelationshipQuery"]; + [classMapping setObject:@"CAYObjectIdQuery" forKey:@"org.apache.cayenne.query.ObjectIdQuery"]; // message [classMapping setObject:@"CAYBootstrapMessage" forKey:@"org.apache.cayenne.remote.BootstrapMessage"]; Modified: incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.h URL: http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.h?view=diff&rev=469299&r1=469298&r2=469299 ============================================================================== --- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.h (original) +++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.h Mon Oct 30 14:26:19 2006 @@ -48,6 +48,8 @@ -(void)deleteObject:(CAYPersistentObject *)o; -(void)registerNewObject:(CAYPersistentObject *)o; +-(void)prepareForAccess:(CAYPersistentObject *)object forProperty:(NSString *)property withLazyFetching:(BOOL)lazyFaulting; + -(void)updateClassMapping; @end Modified: incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.m URL: http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.m?view=diff&rev=469299&r1=469298&r2=469299 ============================================================================== --- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.m (original) +++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectContext.m Mon Oct 30 14:26:19 2006 @@ -35,6 +35,7 @@ #import "CAYArcDeleteOperation.h" #import "CAYRelationshipQuery.h" #import "CAYGenericResponse.h" +#import "CAYObjectIdQuery.h" @implementation CAYObjectContext @@ -120,7 +121,7 @@ CAYPersistentObject *old = (CAYPersistentObject *)[objectByObjectId objectForKey:[row objectId]]; if(old) { - NSLog(@"old exist for oid. merge over values. %@ == %@", [row objectId], [old objectId]); + NSLog(@"DEBUG: old exist for oid. merge over values. %@ == %@", [row objectId], [old objectId]); // TODO: handle the state of the old object. merge over changes? or delete diffs // for objects refreshed from server? @@ -129,13 +130,13 @@ if(refreshing) { [[old valuesRaw] setDictionary:[row valuesRaw]]; - [row setPersistenceState:PSTATE_COMMITTED]; + [old setPersistenceState:PSTATE_COMMITTED]; } row = old; } else { - NSLog(@"old does not exist for oid %@", [row objectId]); + NSLog(@"DEBUG: old does not exist for oid %@", [row objectId]); [objectByObjectId setObject:row forKey:[row objectId]]; [row setPersistenceState:PSTATE_COMMITTED]; } @@ -157,19 +158,19 @@ } } - NSLog(@"query rows: %@", resultRows); + NSLog(@"DEBUG: query rows: %@", resultRows); return [resultRows autorelease]; } -(void) propertyChanged:(CAYPersistentObject *)object forProperty:(NSString *)property fromOld:(NSObject *)oldValue toNew:(NSObject *)newValue { - NSLog(@"prop %@ changed from %@ to %@", property, oldValue, newValue); + NSLog(@"DEBUG: prop %@ changed from %@ to %@", property, oldValue, newValue); CAYNodeDiff *diff = [[CAYNodePropertyChangeOperation alloc] initWithNodeId:[object objectId] property:property oldValue:oldValue newValue:newValue]; [diffs addObject:diff]; [diff release]; [object setPersistenceState:PSTATE_MODIFIED]; - NSLog(@"%i unsaved changes", [diffs count]); + NSLog(@"DEBUG: %i unsaved changes", [diffs count]); } -(void) arcPropertyChanged:(CAYPersistentObject *)object forProperty:(NSString *)property fromOld:(NSObject *)oldValue toNew:(NSObject *)newValue @@ -178,7 +179,7 @@ if([oldValue isKindOfClass:[CAYPersistentObject class]]) { - NSLog(@"add a arcDelete [EMAIL PROTECTED]@", [object class], property); + NSLog(@"DEBUG: 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]; @@ -187,7 +188,7 @@ if([newValue isKindOfClass:[CAYPersistentObject class]]) { - NSLog(@"add a arcCreate [EMAIL PROTECTED]@", [object class], property); + NSLog(@"DEBUG: 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]; @@ -386,19 +387,56 @@ [o setObjectId:nil]; } +-(void)prepareForAccess:(CAYPersistentObject *)object forProperty:(NSString *)property withLazyFetching:(BOOL)lazyFaulting +{ + if([object persistenceState] == PSTATE_HOLLOW) + { + NSLog(@"DEBUG: Object id hollow - issuing a ObjectIdQuery. %@", [object objectId]); + CAYObjectId *oid = [object objectId]; + CAYObjectIdQuery *query = [[CAYObjectIdQuery alloc] init]; + [query setObjectId:oid]; + NSError *error = nil; + NSArray *rows = [self performQuery:query error:&error]; + [query release]; + + if(!rows) + { + // TODO: do something with this error?? + NSLog(@"ERROR: %@", [error localizedDescription]); + } + + if([rows count] == 0) + { + NSLog(@"ERROR: Error resolving fault, no matching row exists in the database for ObjectId: %@", oid); + } + + if([rows count] > 1) + { + NSLog(@"ERROR: Error resolving fault, more than one row exists in the database for ObjectId: %@", oid); + } + + if([object persistenceState] != PSTATE_COMMITTED) + { + NSLog(@"ERROR: Error resolving fault for ObjectId: [EMAIL PROTECTED] Persistence state not comitted after ObjectIdQuery. %d", oid, [object persistenceState]); + } + } + + // TODO: resolve faults? +} + -(void)updateClassMapping { if([self entityResolver]) { // full class mapping for cayenne classes and all entities - NSLog(@"update class mapping from entity resolver"); + NSLog(@"DEBUG: update class mapping from entity resolver"); [[self entityResolver] updateClassMapping]; [[self connection] updateClassMapping:[[self entityResolver] classMapping]]; } else { // basic class mapping for the cayenne classes - NSLog(@"update cayenne class"); + NSLog(@"DEBUG: update cayenne class"); [[self connection] updateClassMapping:[CAYCocoaCayenne classMapping]]; } } Added: incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectIdQuery.h URL: http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectIdQuery.h?view=auto&rev=469299 ============================================================================== --- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectIdQuery.h (added) +++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectIdQuery.h Mon Oct 30 14:26:19 2006 @@ -0,0 +1,44 @@ +/***************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ****************************************************************/ + +#import <Cocoa/Cocoa.h> +#import "CAYQuery.h" +#import "CAYObjectId.h" + + [EMAIL PROTECTED] CAYObjectIdQuery : CAYQuery <NSCoding> { + + CAYObjectId *objectId; + unsigned int cachePolicy; + BOOL fetchingDataRows; + +} + +-(void)setObjectId:(CAYObjectId *)oid; +-(CAYObjectId *)objectId; +-(void)setCachePolicy:(unsigned int)cp; +-(unsigned int)cachePolicy; +-(void)setFetchingDataRows:(BOOL)fdr; +-(BOOL)isFetchingDataRows; + +#define CACHE 1 +#define CACHE_REFRESH 2 +#define CACHE_NOREFRESH 3 + [EMAIL PROTECTED] Added: incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectIdQuery.m URL: http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectIdQuery.m?view=auto&rev=469299 ============================================================================== --- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectIdQuery.m (added) +++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYObjectIdQuery.m Mon Oct 30 14:26:19 2006 @@ -0,0 +1,91 @@ +/***************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ****************************************************************/ + +#import "CAYObjectIdQuery.h" + + [EMAIL PROTECTED] CAYObjectIdQuery + +-(id)init +{ + self = [super init]; + if(self) + { + // set default values + [self setFetchingDataRows:FALSE]; + [self setCachePolicy:CACHE_REFRESH]; + } + return self; +} + +-(id)initWithCoder:(NSCoder*)coder +{ + [super init]; + [self setObjectId:[coder decodeObjectForKey:@"objectId"]]; + [self setFetchingDataRows:[coder decodeBoolForKey:@"fetchingDataRows"]]; + [self setCachePolicy:[coder decodeIntForKey:@"cachePolicy"]]; + return self; +} + +-(void)encodeWithCoder:(NSCoder*)coder +{ + [coder encodeObject:[self objectId] forKey:@"objectId"]; + [coder encodeBool:[self isFetchingDataRows] forKey:@"fetchingDataRows"]; + [coder encodeInt:[self cachePolicy] forKey:@"cachePolicy"]; +} + +-(void)setObjectId:(CAYObjectId *)oid +{ + [oid retain]; + [objectId release]; + objectId = oid; +} + +-(CAYObjectId *)objectId +{ + return objectId; +} + +-(void)setCachePolicy:(unsigned int)cp +{ + cachePolicy = cp; +} + +-(unsigned int)cachePolicy +{ + return cachePolicy; +} + +-(void)setFetchingDataRows:(BOOL)fdr +{ + fetchingDataRows = fdr; +} + +-(BOOL)isFetchingDataRows +{ + return fetchingDataRows; +} + +-(void)dealloc +{ + [self setObjectId:nil]; + [super dealloc]; +} + [EMAIL PROTECTED] Modified: incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.m URL: http://svn.apache.org/viewvc/incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.m?view=diff&rev=469299&r1=469298&r2=469299 ============================================================================== --- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.m (original) +++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CAYPersistentObject.m Mon Oct 30 14:26:19 2006 @@ -75,6 +75,12 @@ -(void)setPersistenceState:(unsigned int)state { persistenceState = state; + + if(persistenceState == PSTATE_HOLLOW) + { + NSLog(@"DEBUG: setting persistent state hollow - clearing values. %@", [self objectId]); + [[self valuesRaw] removeAllObjects]; + } } -(unsigned int)persistenceState @@ -232,6 +238,7 @@ // see http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/SearchImplementation.html -(void)setValue:(id)value forUndefinedKey:(NSString *)key { + [[self objectContext] prepareForAccess:self forProperty:key withLazyFetching:NO]; [self setPrimitiveValue:value forKey:key]; } @@ -241,7 +248,7 @@ if([val isKindOfClass:[CAYFault class]]) { CAYFault *fault = (CAYFault *)val; - NSLog(@"resolve fault %@", fault); + NSLog(@"DEBUG: resolve fault %@", fault); val = [fault resolveFault]; [values setValue:val forKey:key]; } @@ -257,6 +264,7 @@ // see http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/SearchImplementation.html -(id)valueForUndefinedKey:(NSString *)key { + [[self objectContext] prepareForAccess:self forProperty:key withLazyFetching:NO]; return [self primitiveValueForKey:key]; } 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=469299&r1=469298&r2=469299 ============================================================================== --- incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CocoaCayenne.xcodeproj/project.pbxproj (original) +++ incubator/cayenne/sandbox/CocoaCayenne/CocoaCayenne/CocoaCayenne.xcodeproj/project.pbxproj Mon Oct 30 14:26:19 2006 @@ -79,6 +79,8 @@ 444F27A90AC9EDFF0097052B /* CAYCayenneRuntimeException.m in Sources */ = {isa = PBXBuildFile; fileRef = 444F27A70AC9EDFF0097052B /* CAYCayenneRuntimeException.m */; }; 444F27F50AC9F4B80097052B /* CAYMissingSessionException.h in Headers */ = {isa = PBXBuildFile; fileRef = 444F27F30AC9F4B80097052B /* CAYMissingSessionException.h */; settings = {ATTRIBUTES = (Public, ); }; }; 444F27F60AC9F4B80097052B /* CAYMissingSessionException.m in Sources */ = {isa = PBXBuildFile; fileRef = 444F27F40AC9F4B80097052B /* CAYMissingSessionException.m */; }; + 4485B3B70AF69DE500920481 /* CAYObjectIdQuery.h in Headers */ = {isa = PBXBuildFile; fileRef = 4485B3B50AF69DE500920481 /* CAYObjectIdQuery.h */; }; + 4485B3B80AF69DE500920481 /* CAYObjectIdQuery.m in Sources */ = {isa = PBXBuildFile; fileRef = 4485B3B60AF69DE500920481 /* CAYObjectIdQuery.m */; }; 448E1BA90AC0882F00D137DF /* CAYArrayController.h in Headers */ = {isa = PBXBuildFile; fileRef = 448E1BA70AC0882F00D137DF /* CAYArrayController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 448E1BAA0AC0882F00D137DF /* CAYArrayController.m in Sources */ = {isa = PBXBuildFile; fileRef = 448E1BA80AC0882F00D137DF /* CAYArrayController.m */; }; 44BD0F9D0ABF08320005EE1E /* CAYDataMapIO.h in Headers */ = {isa = PBXBuildFile; fileRef = 44BD0F9B0ABF08320005EE1E /* CAYDataMapIO.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -166,6 +168,8 @@ 444F27A70AC9EDFF0097052B /* CAYCayenneRuntimeException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CAYCayenneRuntimeException.m; sourceTree = "<group>"; }; 444F27F30AC9F4B80097052B /* CAYMissingSessionException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CAYMissingSessionException.h; sourceTree = "<group>"; }; 444F27F40AC9F4B80097052B /* CAYMissingSessionException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CAYMissingSessionException.m; sourceTree = "<group>"; }; + 4485B3B50AF69DE500920481 /* CAYObjectIdQuery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CAYObjectIdQuery.h; sourceTree = "<group>"; }; + 4485B3B60AF69DE500920481 /* CAYObjectIdQuery.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CAYObjectIdQuery.m; sourceTree = "<group>"; }; 448E1BA70AC0882F00D137DF /* CAYArrayController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CAYArrayController.h; sourceTree = "<group>"; }; 448E1BA80AC0882F00D137DF /* CAYArrayController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CAYArrayController.m; sourceTree = "<group>"; }; 44BD0F9B0ABF08320005EE1E /* CAYDataMapIO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CAYDataMapIO.h; sourceTree = "<group>"; }; @@ -363,6 +367,8 @@ 44463D8E0AA37577006BAA58 /* CAYQuery.m */, 44463D910AA37577006BAA58 /* CAYRelationshipQuery.h */, 44463D920AA37577006BAA58 /* CAYRelationshipQuery.m */, + 4485B3B50AF69DE500920481 /* CAYObjectIdQuery.h */, + 4485B3B60AF69DE500920481 /* CAYObjectIdQuery.m */, ); name = query; sourceTree = "<group>"; @@ -438,6 +444,7 @@ 444F263F0AC975E50097052B /* CAYValidationResult.h in Headers */, 444F27A80AC9EDFF0097052B /* CAYCayenneRuntimeException.h in Headers */, 444F27F50AC9F4B80097052B /* CAYMissingSessionException.h in Headers */, + 4485B3B70AF69DE500920481 /* CAYObjectIdQuery.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -533,6 +540,7 @@ 444F26400AC975E50097052B /* CAYValidationResult.m in Sources */, 444F27A90AC9EDFF0097052B /* CAYCayenneRuntimeException.m in Sources */, 444F27F60AC9F4B80097052B /* CAYMissingSessionException.m in Sources */, + 4485B3B80AF69DE500920481 /* CAYObjectIdQuery.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; };