Skip to content

Commit

Permalink
Add JSResourceLookup to be able to interact with REST v2 resources se…
Browse files Browse the repository at this point in the history
…rvice. Add asynchronous version of serverInfo method
  • Loading branch information
Vlad Zavadskii committed Nov 14, 2013
1 parent 47e2945 commit 45f5ebc
Show file tree
Hide file tree
Showing 18 changed files with 660 additions and 57 deletions.
1 change: 1 addition & 0 deletions Classes/Core/JSConstants.h
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,7 @@
*/
@property (nonatomic, readonly) NSInteger VERSION_CODE_UNKNOWN;
@property (nonatomic, readonly) NSInteger VERSION_CODE_EMERALD;
@property (nonatomic, readonly) NSInteger VERSION_CODE_EMERALD_TWO;
/** @} */

/**
Expand Down
3 changes: 3 additions & 0 deletions Classes/Core/JSConstants.m
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,7 @@ @implementation JSConstants
@synthesize REST_SERVER_INFO_URI;
@synthesize VERSION_CODE_UNKNOWN;
@synthesize VERSION_CODE_EMERALD;
@synthesize VERSION_CODE_EMERALD_TWO;
@synthesize ICD_TYPE_BOOL;
@synthesize ICD_TYPE_SINGLE_VALUE_TEXT;
@synthesize ICD_TYPE_SINGLE_VALUE_NUMBER;
Expand Down Expand Up @@ -371,6 +372,8 @@ - (void)setRESTURIPrefixes {
- (void)setUPVersionCodes {
VERSION_CODE_UNKNOWN = 0;
VERSION_CODE_EMERALD = 50000;
VERSION_CODE_EMERALD_TWO = 50500;

}

- (void)setUPInputControlDescriptorTypes {
Expand Down
8 changes: 8 additions & 0 deletions Classes/Core/JSRESTBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,14 @@
*/
- (JSServerInfo *)serverInfo;

/**
Gets server information details asynchronously
@param delegate The delegate object
@since 1.7
*/
- (void)serverInfo:(id<JSRequestDelegate>)delegate;

/**
Cancels all requests for specified delegate object
Expand Down
50 changes: 40 additions & 10 deletions Classes/Core/JSRESTBase.m
Original file line number Diff line number Diff line change
Expand Up @@ -271,20 +271,25 @@ - (void)sendRequest:(JSRequest *)request {

- (JSServerInfo *)serverInfo {
if (!self.serverProfile.serverInfo) {
JSRequestBuilder *builder = [[JSRequestBuilder requestWithUri:[JSConstants sharedInstance].REST_SERVER_INFO_URI
method:JSRequestMethodGET] restVersion:JSRESTVersion_2];
[self sendRequest:[[[builder timeoutInterval:2] asynchronous:NO].request usingBlock:^(JSRequest *request) {
request.finishedBlock = ^(JSOperationResult *result) {
if (!result.error && result.objects.count) {
self.serverProfile.serverInfo = [result.objects objectAtIndex:0];
}
};
}]];
JSRequest *request = [self serverInfoRequest:NO];
request.finishedBlock = ^(JSOperationResult *result) {
[self setServerInfo:result];
};
[self sendRequest:request];
}

return self.serverProfile.serverInfo;
}

- (void)serverInfo:(id<JSRequestDelegate>)delegate {
JSRequest *request = [self serverInfoRequest:YES];
request.finishedBlock = ^(JSOperationResult *result) {
result = [self setServerInfo:result];
[delegate requestFinished:result];
};
[self sendRequest:request];
}

- (void)cancelRequestsWithDelegate:(id<JSRequestDelegate>)delegate {
NSMutableIndexSet *indexesOfRemovingCallBacks = [[NSMutableIndexSet alloc] init];
JSCallBack *callBack = nil;
Expand Down Expand Up @@ -388,6 +393,31 @@ - (void)deleteCookiesForServer:(JSProfile *)serverProfile {
}
}

- (JSRequest *)serverInfoRequest:(BOOL)isAsynchronous {
JSRequestBuilder *builder = [[JSRequestBuilder requestWithUri:[JSConstants sharedInstance].REST_SERVER_INFO_URI
method:JSRequestMethodGET] restVersion:JSRESTVersion_2];
[builder asynchronous:isAsynchronous];

return builder.request;
}

- (JSOperationResult *)setServerInfo:(JSOperationResult *)result {
if (result.isError && result.statusCode != 404) return result;

if (result.objects.count) {
self.serverProfile.serverInfo = [result.objects objectAtIndex:0];
} else {
self.serverProfile.serverInfo = [[JSServerInfo alloc] init];

result = [[JSOperationResult alloc] initWithStatusCode:203
allHeaderFields:result.allHeaderFields
MIMEType:result.MIMEType
error:nil];
}

return result;
}

#pragma mark -
#pragma mark RKObjectLoaderDelegate protocol callbacks

Expand Down
45 changes: 44 additions & 1 deletion Classes/Core/JSRESTResource.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@
@param uri The repository URI (i.e. /reports/samples/)
@param query Match only resources having the specified text in the name or
description (can be <code>nil</code>)
@param types Match only resources of the given type (can be <code>nil</code>)
@param types Match only resources of the given types (can be <code>nil</code>)
@param recursive Get the resources recursively and not only in the specified URI.
Used only when a search criteria is specified, either query or type
(can be <code>nil</code>)
Expand Down Expand Up @@ -206,4 +206,47 @@
*/
- (void)deleteResource:(NSString *)uri usingBlock:(void (^)(JSRequest *request))block;

//---------------------------------------------------------------------
// The Resources Service v2
//---------------------------------------------------------------------

/**
Gets the list of resource lookups for the resources available in the specified
folder and matching the specified parameters
@param uri The repository URI (i.e. /reports/samples/)
@param query Match only resources having the specified text in the name or
description (can be <code>nil</code>)
@param types Match only resources of the given types (can be <code>nil</code>)
@param recursive Get the resources recursively (can be <code>nil</code>)
@param offset Start index for requested page
@param limit The maximum number of items returned to the client. The default
is 0 (can be <code>nil</code>), meaning no limit
@param delegate A delegate object to inform of the results
@since 1.7
*/
- (void)resourceLookups:(NSString *)folderUri query:(NSString *)query types:(NSArray *)types
recursive:(BOOL)recursive offset:(NSInteger)offset limit:(NSInteger)limit delegate:(id<JSRequestDelegate>)delegate;

/**
Gets the list of resource lookups for the resources available in the specified
folder and matching the specified parameters
@param uri The repository URI (i.e. /reports/samples/)
@param query Match only resources having the specified text in the name or
description (can be <code>nil</code>)
@param types Match only resources of the given types (can be <code>nil</code>)
@param recursive Get the resources recursively (can be <code>nil</code>)
@param offset Start index for requested page
@param limit The maximum number of items returned to the client. The default
is 0 (can be <code>nil</code>), meaning no limit
@param block The block to execute with the request before sending it for processing
@since 1.7
*/
- (void)resourceLookups:(NSString *)folderUri query:(NSString *)query types:(NSArray *)types
recursive:(BOOL)recursive offset:(NSInteger)offset limit:(NSInteger)limit usingBlock:(void (^)(JSRequest *request))block;


@end
98 changes: 76 additions & 22 deletions Classes/Core/JSRESTResource.m
Original file line number Diff line number Diff line change
Expand Up @@ -30,21 +30,31 @@

#import "JSConstants.h"
#import "JSRequestBuilder.h"
#import "JSResourceLookup.h"
#import "JSResourceDescriptor.h"
#import "JSResourceParameter.h"
#import "JSRESTResource.h"
#import "JSParamsBuilder.h"

// Shared (1-st initialized) resource instance
static JSRESTResource *_sharedInstance;

// HTTP parameters
static NSString * const _parameterQuery = @"q";
static NSString * const _parameterFolderUri = @"folderUri";
static NSString * const _parameterType = @"type";
static NSString * const _parameterLimit = @"limit";
static NSString * const _parameterOffset = @"offset";
static NSString * const _parameterRecursive = @"recursive";

@implementation JSRESTResource

+ (JSRESTResource *)sharedInstance {
return _sharedInstance;
}

- (id)initWithProfile:(JSProfile *)profile {
NSArray *classesForMappings = [[NSArray alloc] initWithObjects:[JSResourceDescriptor class], nil];
NSArray *classesForMappings = [[NSArray alloc] initWithObjects:[JSResourceDescriptor class], [JSResourceLookup class], nil];

if ((self = [super initWithProfile:profile classesForMappings:classesForMappings]) && !_sharedInstance) {
_sharedInstance = self;
Expand Down Expand Up @@ -73,15 +83,27 @@ - (void)resources:(NSString *)uri usingBlock:(void (^)(JSRequest *request))block
- (void)resources:(NSString *)uri query:(NSString *)query types:(NSArray *)types
recursive:(BOOL)recursive limit:(NSInteger)limit delegate:(id<JSRequestDelegate>)delegate {
JSRequestBuilder *builder = [[JSRequestBuilder requestWithUri:[self fullResourcesUri:uri] method:JSRequestMethodGET] delegate:delegate];
[builder params:[self createParamsForResources:query types:types recursive:recursive limit:limit]];
[self sendRequest:builder.request];

JSParamsBuilder *paramsBuilder = [[JSParamsBuilder alloc] init];
[[[paramsBuilder addParameter:_parameterQuery withStringValue:query]
addParameter:_parameterType withArrayValue:types]
addParameter:_parameterLimit withIntegerValue:limit];
if (recursive) [paramsBuilder addParameter:_parameterRecursive withStringValue:[JSConstants stringFromBOOL:recursive]];

[self sendRequest:[builder params:paramsBuilder.params].request];
}

- (void)resources:(NSString *)uri query:(NSString *)query types:(NSArray *)types
recursive:(BOOL)recursive limit:(NSInteger)limit usingBlock:(void (^)(JSRequest *request))block {
JSRequestBuilder *builder = [JSRequestBuilder requestWithUri:[self fullResourcesUri:uri] method:JSRequestMethodGET];
[builder params:[self createParamsForResources:query types:types recursive:recursive limit:limit]];
[self sendRequest:[builder.request usingBlock:block]];

JSParamsBuilder *paramsBuilder = [[JSParamsBuilder alloc] init];
[[[paramsBuilder addParameter:_parameterQuery withStringValue:query]
addParameter:_parameterType withArrayValue:types]
addParameter:_parameterLimit withIntegerValue:limit];
if (recursive) [paramsBuilder addParameter:_parameterRecursive withStringValue:[JSConstants stringFromBOOL:recursive]];

[self sendRequest:[[builder params:paramsBuilder.params].request usingBlock:block]];
}

- (void)resourceWithQueryData:(NSString *)uri datasourceUri:(NSString *)datasourceUri
Expand All @@ -98,6 +120,45 @@ - (void)resourceWithQueryData:(NSString *)uri datasourceUri:(NSString *)datasour
[self sendRequest:[builder.request usingBlock:block]];
}

#pragma mark -
#pragma mark Public methods for REST V2 resources API

- (void)resourceLookups:(NSString *)folderUri query:(NSString *)query types:(NSArray *)types
recursive:(BOOL)recursive offset:(NSInteger)offset limit:(NSInteger)limit delegate:(id<JSRequestDelegate>)delegate {
JSRequestBuilder *builder = [[JSRequestBuilder requestWithUri:[JSConstants sharedInstance].REST_RESOURCES_URI method:JSRequestMethodGET]
restVersion:JSRESTVersion_2];

JSParamsBuilder *paramsBuilder = [[JSParamsBuilder alloc] init];
[[[[[[[paramsBuilder addParameter:_parameterFolderUri withStringValue:folderUri]
addParameter:_parameterQuery withStringValue:query]
addParameter:_parameterType withArrayValue:types]
addParameter:_parameterLimit withIntegerValue:limit]
addParameter:_parameterRecursive withStringValue:[JSConstants stringFromBOOL:recursive]]
addParameter:_parameterOffset withIntegerValue:offset]
addParameter:_parameterLimit withIntegerValue:limit];

[[builder params:paramsBuilder.params] delegate:delegate];
[self sendRequest:builder.request];
}

- (void)resourceLookups:(NSString *)folderUri query:(NSString *)query types:(NSArray *)types
recursive:(BOOL)recursive offset:(NSInteger)offset limit:(NSInteger)limit usingBlock:(void (^)(JSRequest *request))block {
JSRequestBuilder *builder = [[JSRequestBuilder requestWithUri:[JSConstants sharedInstance].REST_RESOURCES_URI method:JSRequestMethodGET]
restVersion:JSRESTVersion_2];

JSParamsBuilder *paramsBuilder = [[JSParamsBuilder alloc] init];
[[[[[[[paramsBuilder addParameter:_parameterFolderUri withStringValue:folderUri]
addParameter:_parameterQuery withStringValue:query]
addParameter:_parameterType withArrayValue:types]
addParameter:_parameterLimit withIntegerValue:limit]
addParameter:_parameterRecursive withStringValue:[JSConstants stringFromBOOL:recursive]]
addParameter:_parameterOffset withIntegerValue:offset]
addParameter:_parameterLimit withIntegerValue:limit];

[builder params:paramsBuilder.params];
[self sendRequest:[builder.request usingBlock:block]];
}

#pragma mark -
#pragma mark Public methods for resource API

Expand Down Expand Up @@ -138,7 +199,6 @@ - (void)modifyResource:(JSResourceDescriptor *)resource usingBlock:(void (^)(JSR
- (void)deleteResource:(NSString *)uri delegate:(id<JSRequestDelegate>)delegate {
JSRequestBuilder *builder = [[JSRequestBuilder requestWithUri:[self fullResourceUri:uri] method:JSRequestMethodDELETE] delegate:delegate];
[self sendRequest:builder.request];

}

- (void)deleteResource:(NSString *)uri usingBlock:(void (^)(JSRequest *request))block {
Expand All @@ -149,24 +209,18 @@ - (void)deleteResource:(NSString *)uri usingBlock:(void (^)(JSRequest *request))
#pragma mark -
#pragma mark Private methods

// Creates NSMutableDictionary params for resources by query, type, recursive, limit arguments
- (NSMutableDictionary *)createParamsForResources:(NSString *)query types:(NSArray *)types recursive:(BOOL)recursive limit:(NSInteger)limit {
NSMutableDictionary *params = [[NSMutableDictionary alloc] init];

if (query && query.length) {
[params setObject:query forKey:@"q"];
}
if (types && types.count) {
[params setObject:types forKey:@"type"];
}
if (recursive) {
[params setObject:@"true" forKey:@"recursive"];
- (void)addParameter:(NSString *)parameter withStringValue:(NSString *)value toDictionary:(NSMutableDictionary *)params
{
if (value && value.length) {
[params setObject:value forKey:parameter];
}
if (limit && limit > 0) {
[params setObject:[NSNumber numberWithInteger:limit] forKey:@"limit"];
}

- (void)addParameter:(NSString *)parameter withIntegerValue:(NSInteger)value toDictionary:(NSMutableDictionary *)params
{
if (value) {
[params setObject:[NSNumber numberWithInteger:value] forKey:parameter];
}

return params;
}

- (NSDictionary *)paramsForICQueryDataByDatasourceUri:(NSString *)datasourceUri resourceParameters:(NSArray *)resourceParameters {
Expand Down
2 changes: 1 addition & 1 deletion Classes/Core/JSRequest.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ typedef enum {
typedef enum {
JSRESTVersion_1,
JSRESTVersion_2
} JSRESTVersion;
} JSRESTVersion;

/**
This protocol must be implemented by objects used to retrieve request result asynchronously
Expand Down
Loading

0 comments on commit 45f5ebc

Please sign in to comment.