From cf972fce693c9df93e37d33a67ec93084bcaf6dd Mon Sep 17 00:00:00 2001 From: Jeremy Ellison Date: Tue, 11 Aug 2009 06:14:59 -0400 Subject: [PATCH] * [OTRestModel allObjectsOrderedBy:] * buildModelFromXML: guards against nils * added error property to OTRestResponse, will get set on connectionDidFail:withError: * also added errorDescription which either uses the error description or the first element in the document --- OTRestClient.m | 2 +- OTRestModel.h | 5 +---- OTRestModel.m | 13 +++++++++++++ OTRestModelMapper.m | 3 +++ OTRestResponse.h | 14 ++++++++++++++ OTRestResponse.m | 19 ++++++++++++++++++- 6 files changed, 50 insertions(+), 6 deletions(-) diff --git a/OTRestClient.m b/OTRestClient.m index ef269248..115973bd 100644 --- a/OTRestClient.m +++ b/OTRestClient.m @@ -73,7 +73,7 @@ static OTRestClient* sharedClient = nil; - (OTRestRequest*)get:(NSString*)resourcePath delegate:(id)delegate callback:(SEL)callback { OTRestRequest* request = [[OTRestRequest alloc] initWithURL:[self URLForResourcePath:resourcePath] delegate:delegate callback:callback]; request.additionalHTTPHeaders = _HTTPHeaders; - [request get]; + [request get]; return request; } diff --git a/OTRestModel.h b/OTRestModel.h index 31db4f84..36679a2c 100644 --- a/OTRestModel.h +++ b/OTRestModel.h @@ -17,10 +17,6 @@ #define context [[[NSApplication sharedApplication] delegate] managedObjectContext] #endif - - -#define kResponseUserInfoKey @"ResponseUserInfoKey" - #define kRailsToXMLDateFormatterString @"yyyy-MM-dd'T'HH:mm:ss'Z'" // 2009-08-08T17:23:59Z @interface OTRestModel : NSManagedObject { @@ -37,6 +33,7 @@ // finders + (NSArray*)allObjects; ++ (NSArray*)allObjectsOrderedBy:(NSString*)key; + (id)objectWithRestId:(NSNumber*)restId; + (NSArray*)collectionWithRequest:(NSFetchRequest*)request; + (NSFetchRequest*)request; diff --git a/OTRestModel.m b/OTRestModel.m index 1a326785..eb47951a 100644 --- a/OTRestModel.m +++ b/OTRestModel.m @@ -84,6 +84,19 @@ return [self collectionWithRequest:[self request]]; } ++ (NSArray*)allObjectsOrderedBy:(NSString*)key { + NSFetchRequest* request = [self request]; + + NSSortDescriptor* sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:key + ascending:YES + selector:@selector(caseInsensitiveCompare:)] + autorelease]; + NSArray* sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; + [request setSortDescriptors:sortDescriptors]; + + return [self collectionWithRequest:request]; +} + + (id)createOrUpdateAttributesFromXML:(Element*)XML { NSNumber* objectId = [XML contentsNumberOfChildElement:@"id"]; id object = [self objectWithRestId:objectId]; diff --git a/OTRestModelMapper.m b/OTRestModelMapper.m index 9d6e6e8b..ae959f61 100644 --- a/OTRestModelMapper.m +++ b/OTRestModelMapper.m @@ -29,6 +29,9 @@ } - (id)buildModelFromXML:(Element*)XML { + if (XML == nil) { + return nil; + } NSString* elementName = [XML key]; Class class = [_elementToClassMappings objectForKey:elementName]; if (class == nil) { diff --git a/OTRestResponse.h b/OTRestResponse.h index 1265f329..16479f55 100644 --- a/OTRestResponse.h +++ b/OTRestResponse.h @@ -14,6 +14,7 @@ OTRestRequest* _request; NSHTTPURLResponse* _httpURLResponse; NSMutableData* _payload; + NSError* _error; } /** @@ -46,6 +47,12 @@ */ @property(nonatomic, readonly) NSData* payload; +/** + * The error returned if the url connection fails + */ +@property(nonatomic, readonly) NSError* error; + + /** * Initialize a new response object for a REST request */ @@ -66,4 +73,11 @@ */ - (DocumentRoot*)payloadXMLDocument; +/** + * Will determine if there is an error object and use it's localized message + * or + * take the first element out of the returned document. + */ +- (NSString*)errorDescription; + @end diff --git a/OTRestResponse.m b/OTRestResponse.m index 997fc46c..9c1d6e05 100644 --- a/OTRestResponse.m +++ b/OTRestResponse.m @@ -10,11 +10,12 @@ @implementation OTRestResponse -@synthesize payload = _payload, request = _request; +@synthesize payload = _payload, request = _request, error = _error; - (id)init { if (self = [super init]) { _payload = [[NSMutableData alloc] init]; + _error = nil; } return self; @@ -31,6 +32,7 @@ [_httpURLResponse release]; [_payload release]; [_request release]; + [_error release]; [super dealloc]; } @@ -47,6 +49,11 @@ [[_request delegate] performSelector:[_request callback] withObject:self]; } +- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { + _error = [error retain]; + [[_request delegate] performSelector:[_request callback] withObject:self]; +} + - (NSString*)localizedStatusCodeString { return [NSHTTPURLResponse localizedStringForStatusCode:[self statusCode]]; } @@ -59,6 +66,16 @@ return [DocumentRoot parseXML:[self payloadString]]; } +- (NSString*)errorDescription { + NSString* desc; + if (_error != nil) { + desc = [_error localizedDescription]; + } else { + desc = [[(Element*)[self payloadXMLDocument] selectElement:@"error"] contentsText]; + } + return desc; +} + - (NSURL*)URL { return [_httpURLResponse URL]; }