diff --git a/openbis-ipad/BisKit/Classes/CISDOBIpadService.h b/openbis-ipad/BisKit/Classes/CISDOBIpadService.h index bdabf9c25c16cb941d1cf58071d8a45bb2c9b910..22df6c18a9a305f77a57175d8650d63680dbffe5 100644 --- a/openbis-ipad/BisKit/Classes/CISDOBIpadService.h +++ b/openbis-ipad/BisKit/Classes/CISDOBIpadService.h @@ -41,11 +41,12 @@ enum CISOBIpadServiceErrorCode { @private // Internal State BOOL _isLoggedIn; - NSDictionary *_ipadReadService; + NSDictionary *_ipadReadService; } @property(readonly) CISDOBConnection *connection; @property(strong, nonatomic) CISDOBClientPreferences *clientPreferences; +@property(strong, nonatomic) NSDate *lastRootSetUpdate; //! Designated initializer. - (id)initWithConnection:(CISDOBConnection *)connection; diff --git a/openbis-ipad/BisKit/Classes/CISDOBIpadService.m b/openbis-ipad/BisKit/Classes/CISDOBIpadService.m index 3877f372bc06306a74ad5c353dad01d8f4bda7a0..65619ad5524595b7c9572e7bdcf910e371eac793 100644 --- a/openbis-ipad/BisKit/Classes/CISDOBIpadService.m +++ b/openbis-ipad/BisKit/Classes/CISDOBIpadService.m @@ -122,7 +122,7 @@ static id OpenBisTableRowValueAtIndex(NSArray *rowData, NSUInteger index) return iPadCall; } -- (CISDOBIpadServiceCall *)createIpadServiceCallWithParameters:(NSDictionary *)parameters +- (CISDOBIpadServiceCall *)createIpadServiceCallWithParameters:(NSDictionary *)parameters updateRootSetTime:(BOOL)updateTime { CISDOBAsyncCall *connectionCall = [_connection @@ -131,18 +131,41 @@ static id OpenBisTableRowValueAtIndex(NSArray *rowData, NSUInteger index) parameters: parameters]; CISDOBIpadServiceCall *iPadCall = [self iPadCallWrappingConnectionCall: connectionCall]; + __weak CISDOBIpadService *weakSelf = self; connectionCall.success = ^(id result) { + if (updateTime) weakSelf.lastRootSetUpdate = [NSDate date]; if (iPadCall.success) { - iPadCall.success([self rawEntitiesFromResult: result]); + iPadCall.success([weakSelf rawEntitiesFromResult: result]); } }; return iPadCall; } -- (CISDOBAsyncCall *)listRootLevelEntities; +- (CISDOBIpadServiceCall *)createIpadServiceCallWithParameters:(NSDictionary *)parameters +{ + return [self createIpadServiceCallWithParameters: parameters updateRootSetTime: NO]; +} + +- (BOOL)shouldRefreshRootLevelEntitiesCall { - NSDictionary *parameters = [NSDictionary dictionaryWithObject: @"ROOT" forKey: @"requestKey"]; - CISDOBIpadServiceCall *serviceCall = [self createIpadServiceCallWithParameters: parameters]; + 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 +{ + CISDOBIpadServiceCall *serviceCall; + // If we have recently update the root set, just do a ping call + 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 if (serviceCall.timeoutInterval < 60.) serviceCall.timeoutInterval = 60.; return serviceCall; diff --git a/openbis-ipad/BisKit/Classes/CISDOBIpadServiceInternal.h b/openbis-ipad/BisKit/Classes/CISDOBIpadServiceInternal.h index 3ce542b5806ba6c7b02f7630c49b7b25a206f6a0..eb1d4336e65a6cb877d5cdc6794098da5b6941ed 100644 --- a/openbis-ipad/BisKit/Classes/CISDOBIpadServiceInternal.h +++ b/openbis-ipad/BisKit/Classes/CISDOBIpadServiceInternal.h @@ -57,3 +57,10 @@ @end +@interface CISDOBIpadService(CISDOBIpadServiceInternal) + +- (BOOL)shouldRefreshRootLevelEntitiesCall; +- (CISDOBAsyncCall *)listRootLevelEntitiesFromServer; + +@end + diff --git a/openbis-ipad/BisKit/Tests/CISDOBIpadServiceManagerTest.m b/openbis-ipad/BisKit/Tests/CISDOBIpadServiceManagerTest.m index 5cf662506220e8051c26f4c66108c942bef09f20..0f7da007de96bcff4a514ef6815d7307df0be11b 100644 --- a/openbis-ipad/BisKit/Tests/CISDOBIpadServiceManagerTest.m +++ b/openbis-ipad/BisKit/Tests/CISDOBIpadServiceManagerTest.m @@ -346,6 +346,8 @@ // The service parameters are always in the 4th position NSDictionary *oldServiceParams = [params objectAtIndex: 3]; NSMutableDictionary *serviceParams = [NSMutableDictionary dictionaryWithDictionary: oldServiceParams]; + // Force the root request, bypassing the timing checks + [serviceParams setObject: @"ROOT" forKey: @"requestKey"]; [serviceParams setObject: removedEntities forKey: @"HIDE"]; [params replaceObjectAtIndex: 3 withObject: serviceParams]; connectionCall.params = params; diff --git a/openbis-ipad/BisKit/Tests/CISDOBIpadServiceTest.m b/openbis-ipad/BisKit/Tests/CISDOBIpadServiceTest.m index 1259dae0605cca23c7d5e1c3a1ccebd973106038..aa7473b00702cfd8d5ef9319945d4c9f946b2bbf 100644 --- a/openbis-ipad/BisKit/Tests/CISDOBIpadServiceTest.m +++ b/openbis-ipad/BisKit/Tests/CISDOBIpadServiceTest.m @@ -24,6 +24,7 @@ #import "CISDOBIpadServiceTest.h" #import "CISDOBConnection.h" #import "CISDOBIpadService.h" +#import "CISDOBIpadServiceInternal.h" #import "CISDOBAsyncCall.h" @@ -62,12 +63,14 @@ 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"); + STAssertTrue([_service shouldRefreshRootLevelEntitiesCall], @"We have not yet initialized the root level entities, so we should do so now"); call = [_service listRootLevelEntities]; [self configureAndRunCallSynchronously: call]; STAssertNotNil(_callResult, @"The iPad service should have returned some entities."); NSArray *rawEntities = _callResult; 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) { NSString *summaryHeader = rawEntity.summaryHeader; diff --git a/openbis-ipad/Research/BisMac.xcodeproj/project.xcworkspace/xcuserdata/cramakri.xcuserdatad/UserInterfaceState.xcuserstate b/openbis-ipad/Research/BisMac.xcodeproj/project.xcworkspace/xcuserdata/cramakri.xcuserdatad/UserInterfaceState.xcuserstate index 6215cc6611f18dd61b6b83b9e4bb72ca6cd2726c..7c807974912002f4222bdc1cebb6dc6c2f42123e 100644 Binary files a/openbis-ipad/Research/BisMac.xcodeproj/project.xcworkspace/xcuserdata/cramakri.xcuserdatad/UserInterfaceState.xcuserstate and b/openbis-ipad/Research/BisMac.xcodeproj/project.xcworkspace/xcuserdata/cramakri.xcuserdatad/UserInterfaceState.xcuserstate differ