From 7b86f4ca62b5c07e654efcca718b7619ae31e73d Mon Sep 17 00:00:00 2001 From: Evadne Wu Date: Mon, 8 Aug 2011 20:43:51 +0800 Subject: [PATCH 1/5] IRWebAPIInterface+Validators needs defines --- IRWebAPIInterface+Validators.h | 1 + 1 file changed, 1 insertion(+) diff --git a/IRWebAPIInterface+Validators.h b/IRWebAPIInterface+Validators.h index 58eae3f..7626792 100644 --- a/IRWebAPIInterface+Validators.h +++ b/IRWebAPIInterface+Validators.h @@ -6,6 +6,7 @@ // Copyright 2011 Iridia Productions. All rights reserved. // +#import "IRWebAPIKitDefines.h" #import "IRWebAPIInterface.h" From 355b1d4194435fd97ae57f50cb95301631f6b952 Mon Sep 17 00:00:00 2001 From: Evadne Wu Date: Sun, 25 Sep 2011 22:35:54 +0800 Subject: [PATCH 2/5] updates default parser generation to accommodate JSONKit --- IRWebAPIResponseParser.m | 87 ++++++++++++++++++++++++---------------- 1 file changed, 52 insertions(+), 35 deletions(-) diff --git a/IRWebAPIResponseParser.m b/IRWebAPIResponseParser.m index 51b9ce5..9b44d40 100644 --- a/IRWebAPIResponseParser.m +++ b/IRWebAPIResponseParser.m @@ -80,51 +80,68 @@ IRWebAPIResponseParser IRWebAPIResponseQueryResponseParserMake () { IRWebAPIResponseParser IRWebAPIResponseDefaultJSONParserMake () { - NSDictionary * (^defaultJSONParser) (NSData *) = ^ NSDictionary * (NSData *inData) { - - Class classCJSONDeserializer = NSClassFromString(@"CJSONDeserializer"); - - if (!classCJSONDeserializer) - return nil; + static id parserInstance = nil; + static IRWebAPIResponseParser parserBlock = nil; + + if (parserBlock) + return parserBlock; + + NSDictionary * (^dictionarize)(id) = ^ (id incomingObject) { - if (![(NSObject *)classCJSONDeserializer respondsToSelector:@selector(deserializer)]) - return nil; - - id deserializer = [classCJSONDeserializer performSelector:@selector(deserializer)]; + if (!incomingObject) + return (NSDictionary *)nil; - if (!deserializer) - return nil; + if (![incomingObject isKindOfClass:[NSDictionary class]]) + return [NSDictionary dictionaryWithObject:incomingObject forKey:@"response"]; - SEL selDeserialize = @selector(deserialize:error:); + return (NSDictionary *)incomingObject; + + }; + + Class classJSONKit = NSClassFromString(@"JSONDecoder"); + if (classJSONKit) { + + parserInstance = [classJSONKit performSelector:@selector(decoder)]; + [parserInstance retain]; + + parserBlock = (IRWebAPIResponseParser)[[^ (NSData *incomingData) { + return dictionarize([parserInstance performSelector:@selector(objectWithData:) withObject:incomingData]); + } copy] autorelease]; - if (![deserializer respondsToSelector:selDeserialize]) - return nil; + return parserBlock; - id incomingObject; - - NSError *error = nil; - NSError **errorPointer = &error; + } + + Class classTouchJSON = NSClassFromString(@"CJSONDeserializer"); + if (classTouchJSON) { - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[deserializer methodSignatureForSelector:selDeserialize]]; - - [invocation setTarget:deserializer]; - [invocation setSelector:selDeserialize]; - [invocation setArgument:&inData atIndex:2]; - [invocation setArgument:&errorPointer atIndex:3]; - - [invocation invoke]; - [invocation getReturnValue:&incomingObject]; + parserInstance = [classTouchJSON performSelector:@selector(deserializer)]; + [parserInstance retain]; - if (!incomingObject) - return nil; + parserBlock = (IRWebAPIResponseParser)[[^ (NSData *incomingData) { + + SEL selDeserialize = @selector(deserialize:error:); + id incomingObject; - if ([incomingObject isKindOfClass:[NSDictionary class]]) - return (NSDictionary *)incomingObject; + NSError *error = nil; + NSError **errorPointer = &error; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[parserInstance methodSignatureForSelector:selDeserialize]]; + + [invocation setTarget:parserInstance]; + [invocation setSelector:selDeserialize]; + [invocation setArgument:&incomingData atIndex:2]; + [invocation setArgument:&errorPointer atIndex:3]; + [invocation invoke]; + [invocation getReturnValue:&incomingObject]; + + return dictionarize(incomingObject); + + } copy] autorelease]; - return [NSDictionary dictionaryWithObject:incomingObject forKey:@"response"]; + return parserBlock; - }; + } - return [[defaultJSONParser copy] autorelease]; + return IRWebAPIResponseDefaultParserMake(); } From 844a0fd8a03b8a155352feba4a3fedb1ae85281d Mon Sep 17 00:00:00 2001 From: Evadne Wu Date: Mon, 26 Sep 2011 11:24:36 +0800 Subject: [PATCH 3/5] enables TouchXML in IRWebAPIResponseDefaultXMLParserMake() --- IRWebAPIResponseParser.h | 1 + IRWebAPIResponseParser.m | 43 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/IRWebAPIResponseParser.h b/IRWebAPIResponseParser.h index 3bb9f25..8ec0357 100644 --- a/IRWebAPIResponseParser.h +++ b/IRWebAPIResponseParser.h @@ -12,6 +12,7 @@ extern IRWebAPIResponseParser IRWebAPIResponseDefaultParserMake (); extern IRWebAPIResponseParser IRWebAPIResponseQueryResponseParserMake (); extern IRWebAPIResponseParser IRWebAPIResponseDefaultJSONParserMake (); +extern IRWebAPIResponseParser IRWebAPIResponseDefaultXMLParserMake (); diff --git a/IRWebAPIResponseParser.m b/IRWebAPIResponseParser.m index 9b44d40..2f39791 100644 --- a/IRWebAPIResponseParser.m +++ b/IRWebAPIResponseParser.m @@ -145,3 +145,46 @@ IRWebAPIResponseParser IRWebAPIResponseDefaultJSONParserMake () { return IRWebAPIResponseDefaultParserMake(); } + +IRWebAPIResponseParser IRWebAPIResponseDefaultXMLParserMake () { + + static IRWebAPIResponseParser parserBlock = nil; + + if (parserBlock) + return parserBlock; + + Class classTouchXMLDocument = NSClassFromString(@"CXHTMLDocument"); + if (classTouchXMLDocument) { + + parserBlock = (IRWebAPIResponseParser)[[^ (NSData *incomingData) { + + SEL selInstantiate = @selector(initWithXHTMLData:encoding:options:error:); + id incomingObject = nil; + + NSError *error = nil; + NSError **errorPointer = &error; + + id parserInstance = [classTouchXMLDocument performSelector:@selector(alloc)]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[parserInstance methodSignatureForSelector:selInstantiate]]; + + NSStringEncoding stringEncoding = NSUTF8StringEncoding; + NSUInteger options = 0; + + [invocation setTarget:parserInstance]; + [invocation setSelector:selInstantiate]; + [invocation setArgument:&incomingData atIndex:2]; + [invocation setArgument:&stringEncoding atIndex:3]; + [invocation setArgument:&options atIndex:4]; + [invocation setArgument:&errorPointer atIndex:5]; + [invocation invoke]; + [invocation getReturnValue:&incomingObject]; + + } copy] autorelease]; + + return parserBlock; + + } + + return IRWebAPIResponseDefaultParserMake(); + +} From bcba7d453d8c96167354e9f01bfea44d8122f41c Mon Sep 17 00:00:00 2001 From: Evadne Wu Date: Mon, 26 Sep 2011 11:54:32 +0800 Subject: [PATCH 4/5] initial dictionarize() fixes for TouchXML wiring --- IRWebAPIResponseParser.m | 47 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/IRWebAPIResponseParser.m b/IRWebAPIResponseParser.m index 2f39791..b12b62b 100644 --- a/IRWebAPIResponseParser.m +++ b/IRWebAPIResponseParser.m @@ -153,12 +153,53 @@ IRWebAPIResponseParser IRWebAPIResponseDefaultXMLParserMake () { if (parserBlock) return parserBlock; - Class classTouchXMLDocument = NSClassFromString(@"CXHTMLDocument"); + __block NSDictionary * (^dictionarize)(id); + dictionarize = [[^ (id incomingObject) { + + if (!incomingObject) + return (NSDictionary *)nil; + + NSArray *children = [incomingObject performSelector:@selector(children)]; + NSArray *attributes = [incomingObject respondsToSelector:@selector(attributes)] ? [incomingObject performSelector:@selector(attributes)] : nil; + + NSMutableDictionary *returnedDictionary = [NSMutableDictionary dictionary]; + + if ([children count]) { + + NSMutableArray *childrenDictionaries = [NSMutableArray array]; + + for (id element in children) + [childrenDictionaries addObject:dictionarize(element)]; + + [returnedDictionary setObject:childrenDictionaries forKey:@"children"]; + + } + + if ([attributes count]) { + + NSMutableArray *attributesDictionaries = [NSMutableArray array]; + + for (id element in attributes) + [attributesDictionaries addObject:dictionarize(element)]; + + [returnedDictionary setObject:attributesDictionaries forKey:@"attributes"]; + + } + + [returnedDictionary setObject:[incomingObject performSelector:@selector(stringValue)] forKey:@"value"]; + + return returnedDictionary; + + } copy] autorelease]; + + [dictionarize retain]; + + Class classTouchXMLDocument = NSClassFromString(@"CXMLDocument"); if (classTouchXMLDocument) { parserBlock = (IRWebAPIResponseParser)[[^ (NSData *incomingData) { - SEL selInstantiate = @selector(initWithXHTMLData:encoding:options:error:); + SEL selInstantiate = @selector(initWithData:encoding:options:error:); id incomingObject = nil; NSError *error = nil; @@ -178,6 +219,8 @@ IRWebAPIResponseParser IRWebAPIResponseDefaultXMLParserMake () { [invocation setArgument:&errorPointer atIndex:5]; [invocation invoke]; [invocation getReturnValue:&incomingObject]; + + return dictionarize([incomingObject performSelector:@selector(rootElement)]); } copy] autorelease]; From e4040cd214413ab451b973f3b7ab00b70e33d467 Mon Sep 17 00:00:00 2001 From: Evadne Wu Date: Mon, 3 Oct 2011 02:24:03 +0800 Subject: [PATCH 5/5] removes use of dictionarization for our default XML parser --- IRWebAPIResponseParser.m | 90 ++++++++++++++++++++++------------------ 1 file changed, 49 insertions(+), 41 deletions(-) diff --git a/IRWebAPIResponseParser.m b/IRWebAPIResponseParser.m index b12b62b..6a780ab 100644 --- a/IRWebAPIResponseParser.m +++ b/IRWebAPIResponseParser.m @@ -153,46 +153,48 @@ IRWebAPIResponseParser IRWebAPIResponseDefaultXMLParserMake () { if (parserBlock) return parserBlock; - __block NSDictionary * (^dictionarize)(id); - dictionarize = [[^ (id incomingObject) { - - if (!incomingObject) - return (NSDictionary *)nil; - - NSArray *children = [incomingObject performSelector:@selector(children)]; - NSArray *attributes = [incomingObject respondsToSelector:@selector(attributes)] ? [incomingObject performSelector:@selector(attributes)] : nil; - - NSMutableDictionary *returnedDictionary = [NSMutableDictionary dictionary]; - - if ([children count]) { - - NSMutableArray *childrenDictionaries = [NSMutableArray array]; - - for (id element in children) - [childrenDictionaries addObject:dictionarize(element)]; - - [returnedDictionary setObject:childrenDictionaries forKey:@"children"]; - - } - - if ([attributes count]) { - - NSMutableArray *attributesDictionaries = [NSMutableArray array]; - - for (id element in attributes) - [attributesDictionaries addObject:dictionarize(element)]; - - [returnedDictionary setObject:attributesDictionaries forKey:@"attributes"]; - - } - - [returnedDictionary setObject:[incomingObject performSelector:@selector(stringValue)] forKey:@"value"]; - - return returnedDictionary; - - } copy] autorelease]; - - [dictionarize retain]; + // __block NSDictionary * (^dictionarize)(id); + // dictionarize = [[^ (id incomingObject) { + // + // if (!incomingObject) + // return (NSDictionary *)nil; + // + // NSArray *children = [incomingObject performSelector:@selector(children)]; + // NSArray *attributes = [incomingObject respondsToSelector:@selector(attributes)] ? [incomingObject performSelector:@selector(attributes)] : nil; + // + // NSMutableDictionary *returnedDictionary = [NSMutableDictionary dictionary]; + // + // [returnedDictionary setObject:[incomingObject performSelector:@selector(name)] forKey:@"name"]; + // + // if ([children count]) { + // + // NSMutableArray *childrenDictionaries = [NSMutableArray array]; + // + // for (id element in children) + // [childrenDictionaries addObject:dictionarize(element)]; + // + // [returnedDictionary setObject:childrenDictionaries forKey:@"children"]; + // + // } + // + // if ([attributes count]) { + // + // NSMutableArray *attributesDictionaries = [NSMutableArray array]; + // + // for (id element in attributes) + // [attributesDictionaries addObject:dictionarize(element)]; + // + // [returnedDictionary setObject:attributesDictionaries forKey:@"attributes"]; + // + // } + // + // [returnedDictionary setObject:[incomingObject performSelector:@selector(stringValue)] forKey:@"value"]; + // + // return returnedDictionary; + // + // } copy] autorelease]; + // + // [dictionarize retain]; Class classTouchXMLDocument = NSClassFromString(@"CXMLDocument"); if (classTouchXMLDocument) { @@ -220,7 +222,13 @@ IRWebAPIResponseParser IRWebAPIResponseDefaultXMLParserMake () { [invocation invoke]; [invocation getReturnValue:&incomingObject]; - return dictionarize([incomingObject performSelector:@selector(rootElement)]); + return [NSDictionary dictionaryWithObjectsAndKeys: + + incomingObject, @"object", + incomingData, @"data", + // dictionarize([incomingObject performSelector:@selector(rootElement)]), @"interpretation", + + nil]; } copy] autorelease];