Code Search for Developers
 
 
  

FlitSlotMO.m from redshed at Krugle


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

redshed

Code for Mac+WebObjects.

Project homepage: http://sourceforge.net/projects/redshed
Programming language(s): C,Java,Objective C
License: other

  English.lproj/
    InfoPlist.strings
  Flit.xcdatamodel/
    elements
    layout
  Flit.xcodeproj/
    project.pbxproj
    wolf.mode1
    wolf.pbxuser
  FlitKeyMO.h
  FlitKeyMO.m
  FlitSlotMO.h
  FlitSlotMO.m
  Flit_Prefix.pch
  Info.plist
  NSAssert0.h
  NSManagedObject-JRExtensions.h
  NSManagedObject-JRExtensions.m
  nsenumerate.h