Skip to content
Snippets Groups Projects
Commit 66f7e49e authored by juanf's avatar juanf
Browse files

SP-823 / BIS-500: Sync Fix in progress, maybe needs rollback.

SVN: 29676
parent f35b1613
No related branches found
No related tags found
No related merge requests found
......@@ -63,7 +63,10 @@ id ObjectFromJsonData(NSString *jsonDataString, NSError **error);
- (CISDOBAsyncCall *)listNavigationalEntities;
//! Get all root-level entities from the openBIS ipad service for the specified navigational entities. This should return all the entities associated with that navigational entity that are considered part of the root set. The success block will be invoked with a collection of CISDOBIpadRawEntity objects.
- (CISDOBAsyncCall *)listRootLevelEntities:(NSArray *)permIds refcons:(NSArray *)refcons;
//- (CISDOBAsyncCall *)listRootLevelEntities:(NSArray *)permIds refcons:(NSArray *)refcons;
//! Get all root-level entities from the openBIS ipad service for the specified navigational entities. This should return all the entities associated with that navigational entity that are considered part of the root set. Only returns objects that have changed since the date. The success block will be invoked with a collection of CISDOBIpadRawEntity objects.
- (CISDOBAsyncCall *)listChangesSince:(NSDate *)lastUpdateDate rootLevelEntity:(NSArray *)permIds refcons:(NSArray *)refcons;
//! Get drill information from the openBIS ipad service -- this will include information about the children of the entity and possibly their children as well. The permIds and refcons collections must have the same cardinality. The success block will be invoked with a collection of CISDOBIpadRawEntity objects.
- (CISDOBAsyncCall *)drillOnEntities:(NSArray *)permIds refcons:(NSArray *)refcons;
......
......@@ -166,7 +166,7 @@ id ObjectFromJsonData(NSString *jsonDataString, NSError **error)
CISDOBIpadServiceCall *serviceCall = [self createIpadServiceCallWithParameters: parameters];
return serviceCall;
}
/*
- (CISDOBAsyncCall *)listRootLevelEntities:(NSArray *)permIds refcons:(NSArray *)refcons
{
NSUInteger count = [permIds count];
......@@ -182,6 +182,24 @@ id ObjectFromJsonData(NSString *jsonDataString, NSError **error)
if (serviceCall.timeoutInterval < 60.) serviceCall.timeoutInterval = 60.;
return serviceCall;
}
*/
- (CISDOBAsyncCall *)listChangesSince:(NSDate *)lastUpdateDate rootLevelEntity:(NSArray *)permIds refcons:(NSArray *)refcons
{
NSUInteger count = [permIds count];
NSAssert([refcons count] == count, @"Drilling requires permIds and refcons. There must be an equal number of these.");
NSArray *entities;
entities = [self convertToEntitiesPermIds: permIds refcons: refcons count: count];
NSDictionary *parameters =
[NSDictionary dictionaryWithObjectsAndKeys:
@"ROOT", @"requestKey",
entities, @"entities",
[NSString stringWithFormat: @"%f", [lastUpdateDate timeIntervalSince1970]], @"lastupdate", nil];
CISDOBIpadServiceCall *serviceCall = [self createIpadServiceCallWithParameters: parameters];
// Make sure the timeout interval is at least 60s
if (serviceCall.timeoutInterval < 60.) serviceCall.timeoutInterval = 60.;
return serviceCall;
}
- (NSArray *)convertToEntitiesPermIds:(NSArray *)permIds refcons:(NSArray *)refcons count:(NSUInteger)count
{
......
......@@ -71,6 +71,8 @@ typedef void (^AuthenticationChallengeBlock)(CISDOBAsyncCall *call, NSURLAuthent
typedef void (^MocSaveBlock)(CISDOBIpadServiceManager *serviceManager, NSArray *deletedEntityPermIds);
typedef void (^MocPostSaveBlock)(CISDOBIpadServiceManager *serviceManager);
/**
......@@ -90,7 +92,7 @@ typedef void (^MocSaveBlock)(CISDOBIpadServiceManager *serviceManager, NSArray *
@property (readonly) NSOperationQueue *queue;
@property (readonly) NSString *sessionToken;
@property (nonatomic, getter=isOnline) BOOL online;
@property (nonatomic, getter=isSyncDone) BOOL syncDone;
@property (getter=isSyncDone) BOOL syncDone;
@property(strong, nonatomic) NSDate *lastRootSetUpdateDate;
......@@ -100,6 +102,9 @@ typedef void (^MocSaveBlock)(CISDOBIpadServiceManager *serviceManager, NSArray *
//! Called before the service manager saves the managed object context which will delete the entities with the deletedEntityPermIds
@property (copy, nonatomic) MocSaveBlock mocSaveBlock;
//! Called after the service manager successfully saves the managed object context
@property (copy, nonatomic) MocPostSaveBlock mocPostSaveBlock;
// Initialization
- (id)initWithStoreUrl:(NSURL *)storeUrl openbisUrl:(NSURL *)openbisUrl trusted:(BOOL)trusted error:(NSError **)error;
......
......@@ -164,7 +164,11 @@ static NSManagedObjectContext* GetMainThreadManagedObjectContext(NSURL* storeUrl
- (BOOL)saveManagedObjectContextDeleting:(NSArray *)deletedEntities error:(NSError **)error
{
if (self.mocSaveBlock) self.mocSaveBlock(self, deletedEntities);
return [self.managedObjectContext save: error];
BOOL success = [self.managedObjectContext save: error];
if (success) {
if (self.mocPostSaveBlock) self.mocPostSaveBlock(self);
}
return success;
}
- (void)pruneEntitiesNotifying:(CISDOBIpadServiceManagerCall *)managerCall
......@@ -319,13 +323,14 @@ static NSManagedObjectContext* GetMainThreadManagedObjectContext(NSURL* storeUrl
CISDOBAsyncCall *call = [self.service listNavigationalEntities];
CISDOBIpadServiceManagerCall *managerCall = [[CISDOBIpadServiceManagerCall alloc] initWithServiceManager: self serviceCall: call];
// Save the update date to be the time the call is constructed (i.e., before the call is made)
NSDate *timeOfCallConstruction = [NSDate date];
__weak CISDOBIpadServiceManager *weakSelf = self;
call.success = ^(id result) {
weakSelf.online = YES;
// Update the set update date
weakSelf.lastRootSetUpdateDate = [NSDate date];
self.lastRootSetUpdateDate = timeOfCallConstruction;
CISDOBIpadServiceManagerRetrieveRootSetCommand *command = [[CISDOBIpadServiceManagerRetrieveRootSetCommand alloc] init];
command.serviceManager = weakSelf;
command.serviceManagerCall = managerCall;
......@@ -651,12 +656,16 @@ static NSManagedObjectContext* GetMainThreadManagedObjectContext(NSURL* storeUrl
NSError *error;
// Remove entities that were not updated since the prune cutoff date
// Remove all entities that were not mentioned
NSFetchRequest *fetchRequest = [self.serviceManager fetchRequestForEntitiesNotUpdatedSince: self.pruneCutoffDate];
NSArray *entitiesToDelete = [self.managedObjectContext executeFetchRequest: fetchRequest error: &error];
for (CISDOBIpadEntity *entity in entitiesToDelete) {
[(NSMutableArray *)_deletedEntityPermIds addObject: entity.permId];
[self.managedObjectContext deleteObject: entity];
}
// TODO Do not pune any more (change still in progress...)
// NSFetchRequest *fetchRequest = [self.serviceManager fetchRequestForEntitiesNotUpdatedSince: self.pruneCutoffDate];
// NSArray *entitiesToDelete = [self.managedObjectContext executeFetchRequest: fetchRequest error: &error];
// for (CISDOBIpadEntity *entity in entitiesToDelete) {
// [(NSMutableArray *)_deletedEntityPermIds addObject: entity.permId];
// [self.managedObjectContext deleteObject: entity];
// }
// Could be an issue -- synchDone variable not updated in the main thread
self.serviceManager.syncDone = YES;
[[NSNotificationCenter defaultCenter] postNotificationName: CISDOBIpadServiceDidSynchPruningEntitiesNotification object: self];
success = [self.managedObjectContext save: &error];
......@@ -809,7 +818,7 @@ static NSManagedObjectContext* GetMainThreadManagedObjectContext(NSURL* storeUrl
NSArray *permIds = [NSArray arrayWithObject: navEntity.permId];
NSArray *refcons = [NSArray arrayWithObject: navEntity.refcon];
CISDOBAsyncCall *call = [self.serviceManager.service listRootLevelEntities: permIds refcons: refcons];
CISDOBAsyncCall *call = [self.serviceManager.service listChangesSince: self.serviceManager.lastRootSetUpdateDate rootLevelEntity: permIds refcons: refcons];
call.success = ^(id result) {
[self.serviceManager syncEntities: result notifying: nil];
if (currentIndex+1 == count) {
......@@ -831,7 +840,7 @@ static NSManagedObjectContext* GetMainThreadManagedObjectContext(NSURL* storeUrl
// listRootLevelEntites without arguments
NSArray *permIds = [NSArray array];
NSArray *refcons = [NSArray array];
CISDOBAsyncCall *call = [self.serviceManager.service listRootLevelEntities: permIds refcons: refcons];
CISDOBAsyncCall *call = [self.serviceManager.service listChangesSince: self.serviceManager.lastRootSetUpdateDate rootLevelEntity: permIds refcons: refcons];
call.success = ^(id result) {
[self.serviceManager syncEntities: result notifying: nil];
......
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<model name="" userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="1811" systemVersion="11G56" minimumToolsVersion="Xcode 4.3" macOSVersion="Automatic" iOSVersion="Automatic">
<model name="" userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="2057" systemVersion="12D78" minimumToolsVersion="Xcode 4.3" macOSVersion="Automatic" iOSVersion="Automatic">
<entity name="CISDOBIpadEntity" representedClassName="CISDOBIpadEntity" syncable="YES">
<attribute name="category" optional="YES" attributeType="String" indexed="YES" syncable="YES"/>
<attribute name="childrenPermIds" optional="YES" transient="YES" syncable="YES"/>
......@@ -22,6 +22,6 @@
<fetchRequest name="EntityAndChildren" entity="CISDOBIpadEntity" predicateString="SELF == $ENTITY OR permId IN $CHILDREN" fetchBatchSize="20"/>
<fetchRequest name="RootEntities" entity="CISDOBIpadEntity" predicateString="rootLevel == 0" fetchBatchSize="20"/>
<elements>
<element name="CISDOBIpadEntity" positionX="0" positionY="0" width="0" height="0"/>
<element name="CISDOBIpadEntity" positionX="0" positionY="0" width="128" height="270"/>
</elements>
</model>
\ No newline at end of file
......@@ -55,6 +55,8 @@ NSURL *StoreUrlFromOpenbisUrl(NSURL *applicationDocumentsDirectory, NSURL *openb
- (NSString *)username { return [[NSUserDefaults standardUserDefaults] stringForKey: @"openbis_username"]; }
- (NSString *)password { return [[NSUserDefaults standardUserDefaults] stringForKey: @"openbis_password"]; }
- (NSDate *)lastUpdatedDate { return [[NSUserDefaults standardUserDefaults] objectForKey: @"last_updated_date"]; }
- (NSURL *)openbisUrl {
NSString *urlString = [[NSUserDefaults standardUserDefaults] stringForKey: @"openbis_server_url"];
return [NSURL URLWithString: urlString];
......@@ -68,6 +70,11 @@ NSURL *StoreUrlFromOpenbisUrl(NSURL *applicationDocumentsDirectory, NSURL *openb
{
return [[NSUserDefaults standardUserDefaults] setObject: password forKey: @"openbis_password"];
}
- (void)setLastUpdatedDate:(NSDate *)lastUpdatedDate
{
return [[NSUserDefaults standardUserDefaults] setObject: lastUpdatedDate forKey: @"last_updated_date"];
}
- (void)setOpenbisUrl:(NSURL *)openbisUrl
{
return [[NSUserDefaults standardUserDefaults] setObject: [openbisUrl absoluteString] forKey: @"openbis_server_url"];
......@@ -274,6 +281,10 @@ NSURL *StoreUrlFromOpenbisUrl(NSURL *applicationDocumentsDirectory, NSURL *openb
if (!_serviceManager) return NO;
}
// Initialize the lastUpdateDate of the service manager from the stored state
NSDate* lastUpdatedDate = [self lastUpdatedDate];
_serviceManager.lastRootSetUpdateDate = lastUpdatedDate;
// Use a weak reference to self in blocks to avoid retain cycles
__weak CISDOBAppDelegate *weakSelf = self;
_serviceManager.authenticationChallengeBlock = ^(CISDOBAsyncCall *call, NSURLAuthenticationChallenge *challenge) {
......@@ -282,6 +293,10 @@ NSURL *StoreUrlFromOpenbisUrl(NSURL *applicationDocumentsDirectory, NSURL *openb
_serviceManager.mocSaveBlock = ^(CISDOBIpadServiceManager *serviceManager, NSArray *deletedEntityPermIds) {
[weakSelf serviceManager: serviceManager willSaveDeletingEntities: deletedEntityPermIds];
};
_serviceManager.mocPostSaveBlock = ^(CISDOBIpadServiceManager *serviceManager) {
// Update the lastUpdateDate to the time the service manager was created
[weakSelf setLastUpdatedDate: serviceManager.lastRootSetUpdateDate];
};
return YES;
}
......
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