Show FlitSlotMO.m syntax highlighted
#import "FlitSlotMO.h"
#import "FlitKeyMO.h"
#import "NSManagedObject-JRExtensions.h"
#import "nsenumerate.h"
#import "NSAssert0.h"
enum {
FLIT_SLOT_NULL_VALUE_TYPE,
FLIT_SLOT_NUMBER_VALUE_TYPE,
FLIT_SLOT_STRING_VALUE_TYPE,
FLIT_SLOT_DATE_VALUE_TYPE,
FLIT_SLOT_DATA_VALUE_TYPE
};
@implementation FlitSlotMO
+ (id)templateObjectWithName:(NSString*)name_ inManagedObjectContext:(NSManagedObjectContext*)moc_ {
NSParameterAssert(name_);
NSParameterAssert(moc_);
//
NSFetchRequest *fetchRequest = [[[moc_ persistentStoreCoordinator] managedObjectModel] fetchRequestFromTemplateWithName:@"templateObject"
substitutionVariables:[NSDictionary dictionaryWithObject:name_ forKey:@"name"]];
NSError *error = nil;
NSArray *fetchResult = [moc_ executeFetchRequest:fetchRequest error:&error];
if (error)
return nil;
NSAssert0(fetchResult);
NSLog(@"fetchResult slots:%@", fetchResult);
nsenumerate([self fetchAllInManagedObjectContext:moc_], FlitSlotMO, slot) {
NSLog( @"slot key.name:%@ valueType:%@ valueDouble:%@ valueString:%@",
[[slot key] name],
[slot valueType],
[slot valueDouble],
[slot valueString] );
}
//
id result = nil;
switch ([fetchResult count]) {
case 0:
[[moc_ undoManager] disableUndoRegistration];
result = [self newInManagedObjectContext:moc_];
[result setValue:name_ forKey:@"flit:template"];
[moc_ processPendingChanges];
[[moc_ undoManager] enableUndoRegistration];
break;
case 1:
result = [fetchResult objectAtIndex:0];
break;
default:
NSAssert2( NO, @"0 or 1 %@ objects expected, %d found", [self className], [fetchResult count] );
}
return result;
}
- (void)setValue:(id)value_ forUndefinedKey:(NSString*)key_ {
if ([self key] == nil && [[self valueType] intValue] == FLIT_SLOT_NULL_VALUE_TYPE) {
FlitSlotMO *slot = nil;
// Look for a an existing matching slot. We could use a NSFetchRequest, but I believe just walking them will be faster.
nsenumerate([self valueForKey:@"valueSlots"], FlitSlotMO, slotIt) {
if ([[[slotIt key] name] isEqualToString:key_]) {
slot = slotIt;
break;
}
}
if (!slot) {
// No matching slot found, create one.
slot = [FlitSlotMO newInManagedObjectContext:[self managedObjectContext]];
[slot setKey:[FlitKeyMO keyForKeyName:key_ InManagedObjectContext:[self managedObjectContext]]];
[slot setValueOwner:self];
[slot setPosition:[NSNumber numberWithInt:[[self valueForKey:@"valueSlots"] count]]];
}
if (value_ == nil) {
// Nil value.
[slot setValueType:[NSNumber numberWithInt:FLIT_SLOT_NULL_VALUE_TYPE]];
[slot setValueDouble:nil];
[slot setValueString:nil];
[slot setValueData:nil];
} else if ([value_ isKindOfClass:[NSNumber class]]) {
// Number value.
[slot setValueType:[NSNumber numberWithInt:FLIT_SLOT_NUMBER_VALUE_TYPE]];
[slot setValueDouble:value_];
[slot setValueString:nil];
[slot setValueData:nil];
} else if ([value_ isKindOfClass:[NSString class]]) {
// String value;
[slot setValueType:[NSNumber numberWithInt:FLIT_SLOT_STRING_VALUE_TYPE]];
[slot setValueDouble:nil];
[slot setValueString:value_];
[slot setValueData:nil];
} else if ([value_ isKindOfClass:[NSDate class]]) {
// Date value. Note we store the time as both # of seconds and as a string. This is for both fast searching without losing the timezone info.
[slot setValueType:[NSNumber numberWithInt:FLIT_SLOT_DATE_VALUE_TYPE]];
[slot setValueDouble:[NSNumber numberWithDouble:[value_ timeIntervalSinceReferenceDate]]];
[slot setValueString:[value_ description]];
[slot setValueData:nil];
} else if ([value_ isKindOfClass:[NSData class]]) {
// Data.
[slot setValueType:[NSNumber numberWithInt:FLIT_SLOT_DATA_VALUE_TYPE]];
[slot setValueDouble:nil];
[slot setValueString:nil];
[slot setValueData:value_];
} else {
NSAssert1(NO, @"unknown value class %@", [value_ className]);
}
} else {
[super setValue:value_ forUndefinedKey:key_];
}
}
- (id)clone {
#warning TODO
return nil;
}
- (FlitSlotMO*)owner {
FlitSlotMO *keyOwner = [self keyOwner];
FlitSlotMO *valueOwner = [self valueOwner];
NSAssert0(!(keyOwner && valueOwner));
return keyOwner ? keyOwner : valueOwner;
}
//--
- (NSNumber *)position
{
NSNumber * tmpValue;
[self willAccessValueForKey: @"position"];
tmpValue = [self primitiveValueForKey: @"position"];
[self didAccessValueForKey: @"position"];
return tmpValue;
}
- (void)setPosition:(NSNumber *)value
{
[self willChangeValueForKey: @"position"];
[self setPrimitiveValue: value forKey: @"position"];
[self didChangeValueForKey: @"position"];
}
- (BOOL)validatePosition: (id *)valueRef error:(NSError **)outError
{
// Insert custom validation logic here.
return YES;
}
- (NSData *)valueData
{
NSData * tmpValue;
[self willAccessValueForKey: @"valueData"];
tmpValue = [self primitiveValueForKey: @"valueData"];
[self didAccessValueForKey: @"valueData"];
return tmpValue;
}
- (void)setValueData:(NSData *)value
{
[self willChangeValueForKey: @"valueData"];
[self setPrimitiveValue: value forKey: @"valueData"];
[self didChangeValueForKey: @"valueData"];
}
- (BOOL)validateValueData: (id *)valueRef error:(NSError **)outError
{
// Insert custom validation logic here.
return YES;
}
- (NSNumber *)valueDouble
{
NSNumber * tmpValue;
[self willAccessValueForKey: @"valueDouble"];
tmpValue = [self primitiveValueForKey: @"valueDouble"];
[self didAccessValueForKey: @"valueDouble"];
return tmpValue;
}
- (void)setValueDouble:(NSNumber *)value
{
[self willChangeValueForKey: @"valueDouble"];
[self setPrimitiveValue: value forKey: @"valueDouble"];
[self didChangeValueForKey: @"valueDouble"];
}
- (BOOL)validateValueDouble: (id *)valueRef error:(NSError **)outError
{
// Insert custom validation logic here.
return YES;
}
- (NSString *)valueString
{
NSString * tmpValue;
[self willAccessValueForKey: @"valueString"];
tmpValue = [self primitiveValueForKey: @"valueString"];
[self didAccessValueForKey: @"valueString"];
return tmpValue;
}
- (void)setValueString:(NSString *)value
{
[self willChangeValueForKey: @"valueString"];
[self setPrimitiveValue: value forKey: @"valueString"];
[self didChangeValueForKey: @"valueString"];
}
- (BOOL)validateValueString: (id *)valueRef error:(NSError **)outError
{
// Insert custom validation logic here.
return YES;
}
- (NSNumber *)valueType
{
NSNumber * tmpValue;
[self willAccessValueForKey: @"valueType"];
tmpValue = [self primitiveValueForKey: @"valueType"];
[self didAccessValueForKey: @"valueType"];
return tmpValue;
}
- (void)setValueType:(NSNumber *)value
{
[self willChangeValueForKey: @"valueType"];
[self setPrimitiveValue: value forKey: @"valueType"];
[self didChangeValueForKey: @"valueType"];
}
- (BOOL)validateValueType: (id *)valueRef error:(NSError **)outError
{
// Insert custom validation logic here.
return YES;
}
- (FlitKeyMO *)key
{
id tmpObject;
[self willAccessValueForKey: @"key"];
tmpObject = [self primitiveValueForKey: @"key"];
[self didAccessValueForKey: @"key"];
return tmpObject;
}
- (void)setKey:(FlitKeyMO *)value
{
[self willChangeValueForKey: @"key"];
[self setPrimitiveValue: value
forKey: @"key"];
[self didChangeValueForKey: @"key"];
}
- (BOOL)validateKey: (id *)valueRef error:(NSError **)outError
{
// Insert custom validation logic here.
return YES;
}
- (FlitSlotMO *)keyOwner
{
id tmpObject;
[self willAccessValueForKey: @"keyOwner"];
tmpObject = [self primitiveValueForKey: @"keyOwner"];
[self didAccessValueForKey: @"keyOwner"];
return tmpObject;
}
- (void)setKeyOwner:(FlitSlotMO *)value
{
[self willChangeValueForKey: @"keyOwner"];
[self setPrimitiveValue: value
forKey: @"keyOwner"];
[self didChangeValueForKey: @"keyOwner"];
}
- (BOOL)validateKeyOwner: (id *)valueRef error:(NSError **)outError
{
// Insert custom validation logic here.
return YES;
}
- (void)addKeySlotsObject:(FlitSlotMO *)value
{
NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
[self willChangeValueForKey:@"keySlots" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
[[self primitiveValueForKey: @"keySlots"] addObject: value];
[self didChangeValueForKey:@"keySlots" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
[changedObjects release];
}
- (void)removeKeySlotsObject:(FlitSlotMO *)value
{
NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
[self willChangeValueForKey:@"keySlots" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
[[self primitiveValueForKey: @"keySlots"] removeObject: value];
[self didChangeValueForKey:@"keySlots" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
[changedObjects release];
}
- (FlitSlotMO *)valueOwner
{
id tmpObject;
[self willAccessValueForKey: @"valueOwner"];
tmpObject = [self primitiveValueForKey: @"valueOwner"];
[self didAccessValueForKey: @"valueOwner"];
return tmpObject;
}
- (void)setValueOwner:(FlitSlotMO *)value
{
[self willChangeValueForKey: @"valueOwner"];
[self setPrimitiveValue: value
forKey: @"valueOwner"];
[self didChangeValueForKey: @"valueOwner"];
}
- (BOOL)validateValueOwner: (id *)valueRef error:(NSError **)outError
{
// Insert custom validation logic here.
return YES;
}
- (void)addValueSlotsObject:(FlitSlotMO *)value
{
NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
[self willChangeValueForKey:@"valueSlots" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
[[self primitiveValueForKey: @"valueSlots"] addObject: value];
[self didChangeValueForKey:@"valueSlots" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
[changedObjects release];
}
- (void)removeValueSlotsObject:(FlitSlotMO *)value
{
NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
[self willChangeValueForKey:@"valueSlots" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
[[self primitiveValueForKey: @"valueSlots"] removeObject: value];
[self didChangeValueForKey:@"valueSlots" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
[changedObjects release];
}
@end
See more files for this project here