* [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 <error> element in the document
This commit is contained in:
Jeremy Ellison
2009-08-11 06:14:59 -04:00
parent 46df302f0a
commit cf972fce69
6 changed files with 50 additions and 6 deletions

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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];

View File

@@ -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) {

View File

@@ -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 <error> element out of the returned document.
*/
- (NSString*)errorDescription;
@end

View File

@@ -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];
}