Skip to content

Commit

Permalink
Added parentObject in custom initializer
Browse files Browse the repository at this point in the history
  • Loading branch information
Simone Civetta committed Jun 20, 2013
1 parent 104e876 commit 1e8d48a
Show file tree
Hide file tree
Showing 18 changed files with 183 additions and 69 deletions.
2 changes: 1 addition & 1 deletion KeyValueObjectMapping/DCCustomInitialize.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

#import <Foundation/Foundation.h>

typedef id(^DCCustomInitializeBlock)(__weak Class classOfObjectToGenerate, __weak NSDictionary *values);
typedef id(^DCCustomInitializeBlock)(__weak Class classOfObjectToGenerate, __weak NSDictionary *values, __weak id parentObject);

@interface DCCustomInitialize : NSObject

Expand Down
3 changes: 2 additions & 1 deletion KeyValueObjectMapping/DCGenericConverter.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

@interface DCGenericConverter : NSObject
- (id)initWithConfiguration:(DCParserConfiguration *) configuration;
- (id)transformValue:(id)value forDynamicAttribute: (DCDynamicAttribute *) attribute dictionary:dictionary;

- (id)transformValue:(id)value forDynamicAttribute:(DCDynamicAttribute *)attribute dictionary:(NSDictionary *)dictionary parentObject:(id)parentObject;
- (id)serializeValue:(id)value forDynamicAttribute: (DCDynamicAttribute *) attribute;
@end
35 changes: 18 additions & 17 deletions KeyValueObjectMapping/DCGenericConverter.m
Original file line number Diff line number Diff line change
Expand Up @@ -36,26 +36,27 @@ - (id)initWithConfiguration:(DCParserConfiguration *) configuration {
}
return self;
}
- (id)transformValue:(id)value forDynamicAttribute: (DCDynamicAttribute *) attribute dictionary:dictionary {

- (id)transformValue:(id)value forDynamicAttribute:(DCDynamicAttribute *)attribute dictionary:(NSDictionary *)dictionary parentObject:(id)parentObject {
if([attribute isValidObject]){
BOOL valueIsKindOfDictionary = [value isKindOfClass:[NSDictionary class]];
BOOL attributeNotKindOfDictionary = ![attribute.objectMapping.classReference isSubclassOfClass:[NSDictionary class]];
if( valueIsKindOfDictionary && attributeNotKindOfDictionary ){
id parsedValue = [self parseValueForBlock:value forObjectMapping:attribute dictionary:dictionary];
if(parsedValue) {
if (valueIsKindOfDictionary && attributeNotKindOfDictionary) {
id parsedValue = [self parseValueForBlock:value forObjectMapping:attribute dictionary:dictionary parentObject:parentObject];
if (parsedValue) {
return parsedValue;
}

DCKeyValueObjectMapping *parser = [DCKeyValueObjectMapping mapperForClass:attribute.objectMapping.classReference
andConfiguration:self.configuration];
value = [parser parseDictionary:(NSDictionary *) value];
value = [parser parseDictionary:(NSDictionary *) value forParentObject:parentObject];
}else {
id parsedValue = [self parseSimpeValue:value forDynamicAttribute:attribute dictionary:dictionary];
if(parsedValue) return parsedValue;
id parsedValue = [self parseSimpleValue:value forDynamicAttribute:attribute dictionary:dictionary parentObject:parentObject];
if (parsedValue) return parsedValue;
}
}
DCSimpleConverter *simpleParser = [[DCSimpleConverter alloc] init];
return [simpleParser transformValue:value forDynamicAttribute:attribute dictionary:dictionary];
return [simpleParser transformValue:value forDynamicAttribute:attribute dictionary:dictionary parentObject:parentObject];
}

- (id)serializeValue:(id)value forDynamicAttribute: (DCDynamicAttribute *) attribute {
Expand All @@ -71,30 +72,30 @@ - (id)serializeValue:(id)value forDynamicAttribute: (DCDynamicAttribute *) attri

#pragma mark - private methods

- (id)parseSimpeValue:(id)value forDynamicAttribute:(DCDynamicAttribute *)attribute dictionary:(NSDictionary *)dictionary {
id parsedValue = [self parseValueForBlock:value forObjectMapping:attribute dictionary:dictionary];
- (id)parseSimpleValue:(id)value forDynamicAttribute:(DCDynamicAttribute *)attribute dictionary:(NSDictionary *)dictionary parentObject:(id)parentObject {
id parsedValue = [self parseValueForBlock:value forObjectMapping:attribute dictionary:dictionary parentObject:parentObject];

if(parsedValue){
return parsedValue;
}

return [self parseValueForParsers:value forDynamicAttribute:attribute dictionary:dictionary];
return [self parseValueForParsers:value forDynamicAttribute:attribute dictionary:dictionary parentObject:parentObject];
}

- (id) parseValueForParsers: (id) value forDynamicAttribute: (DCDynamicAttribute *) attribute dictionary:(NSDictionary *)dictionary{
for(id<DCValueConverter> parser in self.parsers){
- (id)parseValueForParsers:(id)value forDynamicAttribute:(DCDynamicAttribute *)attribute dictionary:(NSDictionary *)dictionary parentObject:(id)parentObject {
for (id<DCValueConverter> parser in self.parsers) {
if([parser canTransformValueForClass:attribute.objectMapping.classReference]){
return [parser transformValue:value forDynamicAttribute:attribute dictionary:dictionary];
return [parser transformValue:value forDynamicAttribute:attribute dictionary:dictionary parentObject:parentObject];
}
}
return nil;
}

- (id) parseValueForBlock: (id) value forObjectMapping: (DCDynamicAttribute *) attribute dictionary:(NSDictionary *)dictionary {
- (id)parseValueForBlock:(id)value forObjectMapping:(DCDynamicAttribute *)attribute dictionary:(NSDictionary *)dictionary parentObject:(id)parentObject {
DCObjectMapping *objectMapping = attribute.objectMapping;
for(DCCustomParser *parser in self.configuration.customParsers){
if([parser isValidToPerformBlockOnAttributeName:objectMapping.attributeName
forClass:attribute.classe]){
if ([parser isValidToPerformBlockOnAttributeName:objectMapping.attributeName
forClass:attribute.classe]) {

return parser.blockParser(dictionary, objectMapping.attributeName, attribute.classe, value);
}
Expand Down
7 changes: 5 additions & 2 deletions KeyValueObjectMapping/DCKeyValueObjectMapping.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,11 @@
- (id)initWithClass: (Class) classToGenerate
forConfiguration: (DCParserConfiguration *) configuration;

- (id) parseDictionary: (NSDictionary *) dictionary;
- (NSArray *) parseArray: (NSArray *) array;
- (id)parseDictionary:(NSDictionary *)dictionary;
- (id)parseDictionary:(NSDictionary *)dictionary forParentObject:(id)parentObject;

- (NSArray *)parseArray:(NSArray *)array;
- (NSArray *)parseArray:(NSArray *)array forParentObject:(id)parentObject;

- (NSDictionary *)serializeObject:(id)object;
- (NSArray *)serializeObjectArray:(NSArray *)objectArray;
Expand Down
26 changes: 18 additions & 8 deletions KeyValueObjectMapping/DCKeyValueObjectMapping.m
Original file line number Diff line number Diff line change
Expand Up @@ -48,23 +48,32 @@ - (id) initWithClass: (Class) classToGenerate forConfiguration: (DCParserConfigu
}
return self;
}
- (NSArray *) parseArray: (NSArray *) array {

- (NSArray *)parseArray:(NSArray *)array {
return [self parseArray:array forParentObject:nil];
}

- (NSArray *)parseArray:(NSArray *)array forParentObject:(id)parentObject {
if(!array){
return nil;
}
NSMutableArray *values = [[NSMutableArray alloc] initWithCapacity:[array count]];
for (NSDictionary *dictionary in array) {
id value = [self parseDictionary:dictionary];
id value = [self parseDictionary:dictionary forParentObject:parentObject];
[values addObject:value];
}
return [NSArray arrayWithArray:values];
}
- (id) parseDictionary: (NSDictionary *) dictionary {
if(!dictionary || !self.classToGenerate){

- (id)parseDictionary:(NSDictionary *)dictionary {
return [self parseDictionary:dictionary forParentObject:nil];
}

- (id)parseDictionary:(NSDictionary *)dictionary forParentObject:(id)parentObject {
if (!dictionary || !self.classToGenerate) {
return nil;
}
NSObject *object = [[self configuration] instantiateObjectForClass:self.classToGenerate
withValues:dictionary];
NSObject *object = [[self configuration] instantiateObjectForClass:self.classToGenerate withValues:dictionary parentObject:parentObject];

[self setValuesOnObject:object withDictionary:dictionary];
return object;
Expand Down Expand Up @@ -115,6 +124,7 @@ - (NSArray *)serializeObjectArray:(NSArray *)objectArray

return [NSArray arrayWithArray:serializedObjects];
}

- (void) parseValue: (id) value
forObject: (id) object
inAttribute: (DCDynamicAttribute *) dynamicAttribute
Expand All @@ -123,10 +133,10 @@ - (void) parseValue: (id) value
NSString *attributeName = objectMapping.attributeName;

if (objectMapping.converter) {
value = [objectMapping.converter transformValue:value forDynamicAttribute:dynamicAttribute dictionary:dictionary];
value = [objectMapping.converter transformValue:value forDynamicAttribute:dynamicAttribute dictionary:dictionary parentObject:object];
}
else {
value = [self.converter transformValue:value forDynamicAttribute:dynamicAttribute dictionary:dictionary];
value = [self.converter transformValue:value forDynamicAttribute:dynamicAttribute dictionary:dictionary parentObject:object];
}

[DCAttributeSetter assingValue:value
Expand Down
25 changes: 13 additions & 12 deletions KeyValueObjectMapping/DCNSArrayConverter.m
Original file line number Diff line number Diff line change
Expand Up @@ -33,19 +33,19 @@ - (id)initWithConfiguration:(DCParserConfiguration *)configuration{
return self;
}

- (id)transformValue:(id)values forDynamicAttribute:(DCDynamicAttribute *)attribute dictionary:(NSDictionary *)dictionary {
if(!values || values == [NSNull null] || [values count] == 0){
- (id)transformValue:(id)values forDynamicAttribute:(DCDynamicAttribute *)attribute dictionary:(NSDictionary *)dictionary parentObject:(id)parentObject {
if (!values || values == [NSNull null] || [values count] == 0) {
return nil;
}

BOOL primitiveArray = ![[[values objectAtIndex:0] class] isSubclassOfClass:[NSDictionary class]];
if(primitiveArray){
return [self parsePrimitiveValues:values dictionary:dictionary];
}else{
if (primitiveArray) {
return [self parsePrimitiveValues:values dictionary:dictionary parentObject:parentObject];
} else {
DCArrayMapping *mapper = [self.configuration arrayMapperForMapper:attribute.objectMapping];
if(mapper){
if (mapper) {
DCKeyValueObjectMapping *parser = [DCKeyValueObjectMapping mapperForClass:mapper.classForElementsOnArray andConfiguration:self.configuration];
return [parser parseArray:values];
return [parser parseArray:values forParentObject:parentObject];
}
}
return nil;
Expand All @@ -59,17 +59,18 @@ - (id)serializeValue:(id)values forDynamicAttribute:(DCDynamicAttribute *)attrib
}
return [NSArray arrayWithArray:valuesHolder];
}
- (NSArray *) parsePrimitiveValues: (NSArray *) primitiveValues dictionary:(NSDictionary *)dictionary {

- (NSArray *)parsePrimitiveValues:(NSArray *)primitiveValues dictionary:(NSDictionary *)dictionary parentObject:(id)parentObject {
DCSimpleConverter *simpleParser = [[DCSimpleConverter alloc] init];
NSMutableArray *valuesHolder = [NSMutableArray array];
for(id value in primitiveValues){
for (id value in primitiveValues) {
DCDynamicAttribute *valueClassAsAttribute = [[DCDynamicAttribute alloc] initWithClass:[value class]];
[valuesHolder addObject:[simpleParser transformValue:value forDynamicAttribute:valueClassAsAttribute dictionary:dictionary]];
[valuesHolder addObject:[simpleParser transformValue:value forDynamicAttribute:valueClassAsAttribute dictionary:dictionary parentObject:parentObject]];
}
return [NSArray arrayWithArray:valuesHolder];
}

- (BOOL)canTransformValueForClass:(Class) classe {
return [classe isSubclassOfClass:[NSArray class]];
- (BOOL)canTransformValueForClass:(Class)class {
return [class isSubclassOfClass:[NSArray class]];
}
@end
7 changes: 5 additions & 2 deletions KeyValueObjectMapping/DCNSDateConverter.m
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
//

#import "DCNSDateConverter.h"
#import "DCDynamicAttribute.h"

@interface DCNSDateConverter()
@property(nonatomic, strong) NSString *pattern;
- (BOOL) validDouble: (NSString *) doubleValue;
Expand All @@ -27,7 +29,8 @@ - (id) initWithDatePattern: (NSString *) pattern {
}
return self;
}
- (id)transformValue:(id)value forDynamicAttribute:(DCDynamicAttribute *)attribute dictionary:(NSDictionary *)dictionary {

- (id)transformValue:(id)value forDynamicAttribute:(DCDynamicAttribute *)attribute dictionary:(NSDictionary *)dictionary parentObject:(id)parentObject {
BOOL validDouble = [self validDouble:[NSString stringWithFormat:@"%@", value]];
if(validDouble){
return [NSDate dateWithTimeIntervalSince1970:[value doubleValue]];
Expand All @@ -42,7 +45,7 @@ - (id)serializeValue:(id)value forDynamicAttribute:(DCDynamicAttribute *)attribu
formatter.dateFormat = self.pattern;
return [formatter stringFromDate:value];
}
- (BOOL) canTransformValueForClass: (Class) class {
- (BOOL)canTransformValueForClass: (Class) class {
return [class isSubclassOfClass:[NSDate class]];
}
- (BOOL) validDouble: (NSString *) doubleValue {
Expand Down
10 changes: 6 additions & 4 deletions KeyValueObjectMapping/DCNSSetConverter.m
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

#import "DCNSSetConverter.h"
#import "DCNSArrayConverter.h"
#import "DCDynamicAttribute.h"

@interface DCNSSetConverter()

@property(nonatomic, strong) DCParserConfiguration *configuration;
Expand All @@ -31,17 +33,17 @@ - (id)initWithConfiguration: (DCParserConfiguration *) configuration {
return self;
}

- (id)transformValue:(id)values forDynamicAttribute:(DCDynamicAttribute *)attribute dictionary:(NSDictionary *)dictionary {
NSArray *result = [self.arrayConverter transformValue:values forDynamicAttribute:attribute dictionary:dictionary];
- (id)transformValue:(id)values forDynamicAttribute:(DCDynamicAttribute *)attribute dictionary:(NSDictionary *)dictionary parentObject:(id)parentObject {
NSArray *result = [self.arrayConverter transformValue:values forDynamicAttribute:attribute dictionary:dictionary parentObject:parentObject];
return [NSSet setWithArray:result];
}

- (id)serializeValue:(id)value forDynamicAttribute:(DCDynamicAttribute *)attribute {
return [self.arrayConverter serializeValue:value forDynamicAttribute:attribute];
}

- (BOOL)canTransformValueForClass:(Class) classe {
return [classe isSubclassOfClass:[NSSet class]];
- (BOOL)canTransformValueForClass:(Class)class {
return [class isSubclassOfClass:[NSSet class]];
}

@end
5 changes: 3 additions & 2 deletions KeyValueObjectMapping/DCNSURLConverter.m
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,21 @@
//

#import "DCNSURLConverter.h"
#import "DCDynamicAttribute.h"

@implementation DCNSURLConverter

+ (DCNSURLConverter *) urlConverter {
return [[self alloc] init];
}

- (id)transformValue:(id)value forDynamicAttribute:(DCDynamicAttribute *)attribute dictionary:(NSDictionary *)dictionary {
- (id)transformValue:(id)value forDynamicAttribute:(DCDynamicAttribute *)attribute dictionary:(NSDictionary *)dictionary parentObject:(id)parentObject {
return [NSURL URLWithString:value];
}
- (id)serializeValue:(id)value forDynamicAttribute:(DCDynamicAttribute *)attribute {
return [((NSURL *)value) absoluteString];
}
- (BOOL) canTransformValueForClass: (Class) class {
- (BOOL)canTransformValueForClass: (Class) class {
return [class isSubclassOfClass:[NSURL class]];
}

Expand Down
3 changes: 2 additions & 1 deletion KeyValueObjectMapping/DCParserConfiguration.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
- (void) addCustomInitializersObject:(DCCustomInitialize *) customInitialize;
- (void) addCustomParsersObject:(DCCustomParser *)parser;

- (id) instantiateObjectForClass: (Class) classOfObjectToGenerate withValues: (NSDictionary *) values;
- (id)instantiateObjectForClass:(Class)classOfObjectToGenerate withValues:(NSDictionary *)values;
- (id)instantiateObjectForClass:(Class)classOfObjectToGenerate withValues:(NSDictionary *)values parentObject:(id)parentObject;
- (DCArrayMapping *) arrayMapperForMapper: (DCObjectMapping *) mapper;
@end
8 changes: 6 additions & 2 deletions KeyValueObjectMapping/DCParserConfiguration.m
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,14 @@ - (void) addCustomParsersObject:(DCCustomParser *)parser {
[self.customParsers addObject:parser];
}

- (id) instantiateObjectForClass: (Class) classOfObjectToGenerate withValues: (NSDictionary *) values {
- (id)instantiateObjectForClass:(Class)classOfObjectToGenerate withValues:(NSDictionary *)values {
return [self instantiateObjectForClass:classOfObjectToGenerate withValues:values parentObject:nil];
}

- (id)instantiateObjectForClass:(Class)classOfObjectToGenerate withValues:(NSDictionary *)values parentObject:(id)parentObject {
for(DCCustomInitialize *customInitialize in self.customInitializers){
if([customInitialize isValidToPerformBlock:classOfObjectToGenerate]){
return customInitialize.blockInitialize(classOfObjectToGenerate, values);
return customInitialize.blockInitialize(classOfObjectToGenerate, values, parentObject);
}
}
return [[classOfObjectToGenerate alloc] init];
Expand Down
3 changes: 2 additions & 1 deletion KeyValueObjectMapping/DCSimpleConverter.m
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@
//

#import "DCSimpleConverter.h"
#import "DCDynamicAttribute.h"

@implementation DCSimpleConverter
- (id)transformValue:(id)value forDynamicAttribute:(DCDynamicAttribute *)attribute dictionary:(NSDictionary *)dictionary {
- (id)transformValue:(id)value forDynamicAttribute:(DCDynamicAttribute *)attribute dictionary:(NSDictionary *)dictionary parentObject:(id)parentObject {
return value;
}
-(id)serializeValue:(id)value forDynamicAttribute:(DCDynamicAttribute *)attribute{
Expand Down
8 changes: 4 additions & 4 deletions KeyValueObjectMapping/DCValueConverter.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@

@protocol DCValueConverter <NSObject>

- (id) transformValue:(id)value forDynamicAttribute:(DCDynamicAttribute *)attribute dictionary:(NSDictionary *)dictionary;
- (id) serializeValue:(id)value forDynamicAttribute:(DCDynamicAttribute *)attribute;
- (BOOL) canTransformValueForClass: (Class)classe;

@required
- (id)transformValue:(id)value forDynamicAttribute:(DCDynamicAttribute *)attribute dictionary:(NSDictionary *)dictionary parentObject:(id)parentObject;
- (id)serializeValue:(id)value forDynamicAttribute:(DCDynamicAttribute *)attribute;
- (BOOL)canTransformValueForClass:(Class)class;

@end

0 comments on commit 1e8d48a

Please sign in to comment.