Skip to content
Snippets Groups Projects
Commit 5fb8b918 authored by cramakri's avatar cramakri
Browse files

BIS-312 SP-474 : Moved managing of refresh interval state to the service manager.

SVN: 28244
parent 872bb6d5
No related branches found
No related tags found
No related merge requests found
Showing
with 44 additions and 34 deletions
...@@ -46,7 +46,6 @@ enum CISOBIpadServiceErrorCode { ...@@ -46,7 +46,6 @@ enum CISOBIpadServiceErrorCode {
@property(readonly) CISDOBConnection *connection; @property(readonly) CISDOBConnection *connection;
@property(strong, nonatomic) CISDOBClientPreferences *clientPreferences; @property(strong, nonatomic) CISDOBClientPreferences *clientPreferences;
@property(strong, nonatomic) NSDate *lastRootSetUpdate;
//! Designated initializer. //! Designated initializer.
- (id)initWithConnection:(CISDOBConnection *)connection; - (id)initWithConnection:(CISDOBConnection *)connection;
...@@ -54,6 +53,9 @@ enum CISOBIpadServiceErrorCode { ...@@ -54,6 +53,9 @@ enum CISOBIpadServiceErrorCode {
//! Log the user into the openBIS instance. The login procedure reqests the client preferences as well. //! Log the user into the openBIS instance. The login procedure reqests the client preferences as well.
- (CISDOBAsyncCall *)loginUser:(NSString *)user password:(NSString *)password; - (CISDOBAsyncCall *)loginUser:(NSString *)user password:(NSString *)password;
//! A call that has no purpose except to inform the server that we are still here
- (CISDOBAsyncCall *)heartbeat;
//! Get all root-level entities from the openBIS ipad service, possibly along with some children as well. The success block will be invoked with a collection of CISDOBIpadRawEntity objects. //! Get all root-level entities from the openBIS ipad service, possibly along with some children as well. The success block will be invoked with a collection of CISDOBIpadRawEntity objects.
- (CISDOBAsyncCall *)listRootLevelEntities; - (CISDOBAsyncCall *)listRootLevelEntities;
......
...@@ -122,7 +122,7 @@ static id OpenBisTableRowValueAtIndex(NSArray *rowData, NSUInteger index) ...@@ -122,7 +122,7 @@ static id OpenBisTableRowValueAtIndex(NSArray *rowData, NSUInteger index)
return iPadCall; return iPadCall;
} }
- (CISDOBIpadServiceCall *)createIpadServiceCallWithParameters:(NSDictionary *)parameters updateRootSetTime:(BOOL)updateTime - (CISDOBIpadServiceCall *)createIpadServiceCallWithParameters:(NSDictionary *)parameters
{ {
CISDOBAsyncCall *connectionCall = CISDOBAsyncCall *connectionCall =
[_connection [_connection
...@@ -133,7 +133,6 @@ static id OpenBisTableRowValueAtIndex(NSArray *rowData, NSUInteger index) ...@@ -133,7 +133,6 @@ static id OpenBisTableRowValueAtIndex(NSArray *rowData, NSUInteger index)
__weak CISDOBIpadService *weakSelf = self; __weak CISDOBIpadService *weakSelf = self;
connectionCall.success = ^(id result) { connectionCall.success = ^(id result) {
if (updateTime) weakSelf.lastRootSetUpdate = [NSDate date];
if (iPadCall.success) { if (iPadCall.success) {
iPadCall.success([weakSelf rawEntitiesFromResult: result]); iPadCall.success([weakSelf rawEntitiesFromResult: result]);
} }
...@@ -141,31 +140,17 @@ static id OpenBisTableRowValueAtIndex(NSArray *rowData, NSUInteger index) ...@@ -141,31 +140,17 @@ static id OpenBisTableRowValueAtIndex(NSArray *rowData, NSUInteger index)
return iPadCall; return iPadCall;
} }
- (CISDOBIpadServiceCall *)createIpadServiceCallWithParameters:(NSDictionary *)parameters - (CISDOBAsyncCall *)heartbeat
{ {
return [self createIpadServiceCallWithParameters: parameters updateRootSetTime: NO]; NSDictionary *parameters = [NSDictionary dictionaryWithObject: @"PING" forKey: @"requestKey"];
} CISDOBIpadServiceCall *serviceCall = [self createIpadServiceCallWithParameters: parameters];
return serviceCall;
- (BOOL)shouldRefreshRootLevelEntitiesCall
{
if (!self.lastRootSetUpdate) return YES;
if (!self.clientPreferences) return YES;
NSTimeInterval rootSetRefreshInterval = self.clientPreferences.rootSetRefreshInterval;
if ([[NSDate date] timeIntervalSinceDate: self.lastRootSetUpdate] < rootSetRefreshInterval) return NO;
return YES;
} }
- (CISDOBAsyncCall *)listRootLevelEntities - (CISDOBAsyncCall *)listRootLevelEntities
{ {
CISDOBIpadServiceCall *serviceCall; NSDictionary *parameters = [NSDictionary dictionaryWithObject: @"ROOT" forKey: @"requestKey"];
// If we have recently update the root set, just do a ping call CISDOBIpadServiceCall *serviceCall = [self createIpadServiceCallWithParameters: parameters];
if ([self shouldRefreshRootLevelEntitiesCall]) {
NSDictionary *parameters = [NSDictionary dictionaryWithObject: @"ROOT" forKey: @"requestKey"];
serviceCall = [self createIpadServiceCallWithParameters: parameters updateRootSetTime: YES];
} else {
NSDictionary *parameters = [NSDictionary dictionaryWithObject: @"PING" forKey: @"requestKey"];
serviceCall = [self createIpadServiceCallWithParameters: parameters updateRootSetTime: NO];
}
// Make sure the timeout interval is at least 60s // Make sure the timeout interval is at least 60s
if (serviceCall.timeoutInterval < 60.) serviceCall.timeoutInterval = 60.; if (serviceCall.timeoutInterval < 60.) serviceCall.timeoutInterval = 60.;
return serviceCall; return serviceCall;
......
...@@ -57,10 +57,4 @@ ...@@ -57,10 +57,4 @@
@end @end
@interface CISDOBIpadService(CISDOBIpadServiceInternal)
- (BOOL)shouldRefreshRootLevelEntitiesCall;
- (CISDOBAsyncCall *)listRootLevelEntitiesFromServer;
@end
...@@ -86,6 +86,8 @@ typedef void (^MocSaveBlock)(CISDOBIpadServiceManager *serviceManager, NSArray * ...@@ -86,6 +86,8 @@ typedef void (^MocSaveBlock)(CISDOBIpadServiceManager *serviceManager, NSArray *
@property (readonly) NSString *sessionToken; @property (readonly) NSString *sessionToken;
@property (nonatomic, getter=isOnline) BOOL online; @property (nonatomic, getter=isOnline) BOOL online;
@property(strong, nonatomic) NSDate *lastRootSetUpdate;
//! Called when the service encounters an authentication challenge //! Called when the service encounters an authentication challenge
@property (copy, nonatomic) AuthenticationChallengeBlock authenticationChallengeBlock; @property (copy, nonatomic) AuthenticationChallengeBlock authenticationChallengeBlock;
......
...@@ -209,6 +209,8 @@ static NSManagedObjectContext* GetMainThreadManagedObjectContext(NSURL* storeUrl ...@@ -209,6 +209,8 @@ static NSManagedObjectContext* GetMainThreadManagedObjectContext(NSURL* storeUrl
serviceCall.success = ^(id result) { serviceCall.success = ^(id result) {
weakSelf.online = YES; weakSelf.online = YES;
// We treat prune as a synonym for the root set update call
if (prune) weakSelf.lastRootSetUpdate = [NSDate date];
// Update the cache and call the managerCall success when done // Update the cache and call the managerCall success when done
[weakSelf syncEntities: result pruning: prune notifying: managerCall]; [weakSelf syncEntities: result pruning: prune notifying: managerCall];
}; };
...@@ -248,7 +250,16 @@ static NSManagedObjectContext* GetMainThreadManagedObjectContext(NSURL* storeUrl ...@@ -248,7 +250,16 @@ static NSManagedObjectContext* GetMainThreadManagedObjectContext(NSURL* storeUrl
return managerCall; return managerCall;
} }
- (CISDOBAsyncCall *)retrieveRootLevelEntities - (BOOL)shouldRefreshRootLevelEntitiesCall
{
if (!self.lastRootSetUpdate) return YES;
if (!self.service.clientPreferences) return YES;
NSTimeInterval rootSetRefreshInterval = self.service.clientPreferences.rootSetRefreshInterval;
if ([[NSDate date] timeIntervalSinceDate: self.lastRootSetUpdate] < rootSetRefreshInterval) return NO;
return YES;
}
- (CISDOBAsyncCall *)retrieveRootLevelEntitiesFromServer
{ {
CISDOBAsyncCall *call = [self.service listRootLevelEntities]; CISDOBAsyncCall *call = [self.service listRootLevelEntities];
// get rid of entities not mentioned in the original call // get rid of entities not mentioned in the original call
...@@ -260,6 +271,17 @@ static NSManagedObjectContext* GetMainThreadManagedObjectContext(NSURL* storeUrl ...@@ -260,6 +271,17 @@ static NSManagedObjectContext* GetMainThreadManagedObjectContext(NSURL* storeUrl
return managerCall; return managerCall;
} }
- (CISDOBAsyncCall *)retrieveRootLevelEntities
{
if ([self shouldRefreshRootLevelEntitiesCall]) return [self retrieveRootLevelEntitiesFromServer];
// Make up a dummy call
CISDOBAsyncCall *call = [self.service heartbeat];
CISDOBIpadServiceManagerCall *managerCall = [self managerCallWrappingServiceCall: call pruning: NO];
return managerCall;
}
- (CISDOBAsyncCall *)drillOnEntity:(CISDOBIpadEntity *)entity - (CISDOBAsyncCall *)drillOnEntity:(CISDOBIpadEntity *)entity
{ {
CISDOBAsyncCall *call = [self.service drillOnEntityWithPermId: entity.permId refcon: entity.refcon]; CISDOBAsyncCall *call = [self.service drillOnEntityWithPermId: entity.permId refcon: entity.refcon];
......
...@@ -57,3 +57,9 @@ ...@@ -57,3 +57,9 @@
- (id)initWithServiceManager:(CISDOBIpadServiceManager *)serviceManager entity:(CISDOBIpadEntity *)entity; - (id)initWithServiceManager:(CISDOBIpadServiceManager *)serviceManager entity:(CISDOBIpadEntity *)entity;
@end @end
// Internal methods of the service manager
@interface CISDOBIpadServiceManager (CISDOBIpadServiceManagerInternal)
- (BOOL)shouldRefreshRootLevelEntitiesCall;
- (CISDOBAsyncCall *)retrieveRootLevelEntitiesFromServer;
@end
...@@ -275,7 +275,9 @@ ...@@ -275,7 +275,9 @@
- (void)testPersistEntities - (void)testPersistEntities
{ {
[self performLogin]; [self performLogin];
STAssertTrue([self.serviceManager shouldRefreshRootLevelEntitiesCall], @"We have not yet initialized the root level entities, so we should do so now");
[self performRootLevelCall]; [self performRootLevelCall];
STAssertFalse([self.serviceManager shouldRefreshRootLevelEntitiesCall], @"We have initialized the root level entities recently, no need to do it again.");
// Get drill information on some entity // Get drill information on some entity
...@@ -336,7 +338,7 @@ ...@@ -336,7 +338,7 @@
{ {
// Make a root level call, but do have some entities removed from the list // Make a root level call, but do have some entities removed from the list
CISDOBAsyncCall *call; CISDOBAsyncCall *call;
call = [self.serviceManager retrieveRootLevelEntities]; call = [self.serviceManager retrieveRootLevelEntitiesFromServer];
NSArray *removedEntities = [self.serviceManager.service convertToEntitiesPermIds: [NSArray arrayWithObject: entityToRemove.permId] refcons: [NSArray arrayWithObject: entityToRemove.refcon] count: 1]; NSArray *removedEntities = [self.serviceManager.service convertToEntitiesPermIds: [NSArray arrayWithObject: entityToRemove.permId] refcons: [NSArray arrayWithObject: entityToRemove.refcon] count: 1];
CISDOBIpadServiceCall *serviceCall = (CISDOBIpadServiceCall *)((CISDOBIpadServiceManagerCall *)call).serviceCall; CISDOBIpadServiceCall *serviceCall = (CISDOBIpadServiceCall *)((CISDOBIpadServiceManagerCall *)call).serviceCall;
...@@ -347,7 +349,6 @@ ...@@ -347,7 +349,6 @@
NSDictionary *oldServiceParams = [params objectAtIndex: 3]; NSDictionary *oldServiceParams = [params objectAtIndex: 3];
NSMutableDictionary *serviceParams = [NSMutableDictionary dictionaryWithDictionary: oldServiceParams]; NSMutableDictionary *serviceParams = [NSMutableDictionary dictionaryWithDictionary: oldServiceParams];
// Force the root request, bypassing the timing checks // Force the root request, bypassing the timing checks
[serviceParams setObject: @"ROOT" forKey: @"requestKey"];
[serviceParams setObject: removedEntities forKey: @"HIDE"]; [serviceParams setObject: removedEntities forKey: @"HIDE"];
[params replaceObjectAtIndex: 3 withObject: serviceParams]; [params replaceObjectAtIndex: 3 withObject: serviceParams];
connectionCall.params = params; connectionCall.params = params;
......
...@@ -63,14 +63,12 @@ ...@@ -63,14 +63,12 @@
STAssertNotNil(_service.clientPreferences, @"The client preferences should have been initialized"); STAssertNotNil(_service.clientPreferences, @"The client preferences should have been initialized");
STAssertEquals(_service.clientPreferences.rootSetRefreshInterval, 60. * 30., @"The default root refresh interval should be 30 min"); STAssertEquals(_service.clientPreferences.rootSetRefreshInterval, 60. * 30., @"The default root refresh interval should be 30 min");
STAssertTrue([_service shouldRefreshRootLevelEntitiesCall], @"We have not yet initialized the root level entities, so we should do so now");
call = [_service listRootLevelEntities]; call = [_service listRootLevelEntities];
[self configureAndRunCallSynchronously: call]; [self configureAndRunCallSynchronously: call];
STAssertNotNil(_callResult, @"The iPad service should have returned some entities."); STAssertNotNil(_callResult, @"The iPad service should have returned some entities.");
NSArray *rawEntities = _callResult; NSArray *rawEntities = _callResult;
STAssertTrue([rawEntities count] > 0, @"The Pad service should have returned some entities."); STAssertTrue([rawEntities count] > 0, @"The Pad service should have returned some entities.");
STAssertFalse([_service shouldRefreshRootLevelEntitiesCall], @"We have initialized the root level entities recently, no need to do it again.");
for (CISDOBIpadRawEntity *rawEntity in rawEntities) { for (CISDOBIpadRawEntity *rawEntity in rawEntities) {
NSString *summaryHeader = rawEntity.summaryHeader; NSString *summaryHeader = rawEntity.summaryHeader;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment