From cbb85b2711cda7e46c73ff0253a2d200de788654 Mon Sep 17 00:00:00 2001
From: cramakri <cramakri>
Date: Mon, 29 Oct 2012 10:38:21 +0000
Subject: [PATCH] Changed openBISData to use the new server-side calls

SVN: 27388
---
 .../openBIS/Research/openBISData/main.m       | 121 ++++++++++++++++--
 1 file changed, 108 insertions(+), 13 deletions(-)

diff --git a/openbis-ipad/openBIS/Research/openBISData/main.m b/openbis-ipad/openBIS/Research/openBISData/main.m
index 2d5e0eed25c..a767c8b4330 100644
--- a/openbis-ipad/openBIS/Research/openBISData/main.m
+++ b/openbis-ipad/openBIS/Research/openBISData/main.m
@@ -115,6 +115,111 @@ id RunCallSynchronously(CISDOBAsyncCall *call, int seconds)
     return callResult;
 }
 
+void CollectAllEntities(NSMutableArray *permIds, NSMutableArray *refcons, NSManagedObjectContext *moc, NSError **error)
+{
+	NSFetchRequest* request = [[NSFetchRequest alloc] init];
+	NSEntityDescription* entity = [NSEntityDescription entityForName: @"CISDOBIpadEntity" inManagedObjectContext: moc];
+    [request setEntity: entity];
+	NSArray* elements = [moc executeFetchRequest: request error: error];
+    for (CISDOBIpadEntity *entity in elements) {
+        [permIds addObject: entity.permId];
+        [refcons addObject: entity.refcon];
+    }
+}
+
+void CollectAllDrillableEntities(NSMutableArray *permIds, NSMutableArray *refcons, NSManagedObjectContext *moc, NSError **error)
+{
+	NSFetchRequest* request = [[NSFetchRequest alloc] init];
+	NSEntityDescription* entity = [NSEntityDescription entityForName: @"CISDOBIpadEntity" inManagedObjectContext: moc];
+    [request setEntity: entity];
+	NSArray* elements = [moc executeFetchRequest: request error: error];
+    for (CISDOBIpadEntity *entity in elements) {
+        if ([entity.childrenPermIds count] > 0) {
+            [permIds addObject: entity.permId];
+            [refcons addObject: entity.refcon];
+        }
+    }
+}
+
+void SynchEntityWithManagedObjectContext(CISDOBIpadRawEntity *rawEntity, NSManagedObjectModel *model, NSManagedObjectContext *moc, NSError **error)
+{
+    // Create new entities in the moc, and store them.
+    CISDOBIpadEntity *entity;
+    NSDictionary *fetchVariables = [NSDictionary dictionaryWithObject: [NSArray arrayWithObject: rawEntity.permId] forKey: @"PERM_IDS"];
+    NSFetchRequest *request = [model fetchRequestFromTemplateWithName: @"EntitiesByPermIds" substitutionVariables: fetchVariables];
+    NSArray *matchedEntities = [moc executeFetchRequest: request error: error];
+    if (!matchedEntities) return;
+    if ([matchedEntities count] > 0) {
+        entity = [matchedEntities objectAtIndex: 0];
+        [entity updateFromRawEntity: rawEntity];
+    } else {
+        entity = [NSEntityDescription insertNewObjectForEntityForName: @"CISDOBIpadEntity" inManagedObjectContext: moc];
+        [entity initializeFromRawEntity: rawEntity];
+    }
+}
+
+BOOL SaveManagedObjectContext(NSManagedObjectContext *moc, NSError **error)
+{
+    // Save the managed object context
+    BOOL success = [moc save: error];
+    if (!success) {
+        NSLog(@"Error while saving %@", (error && [*error localizedDescription] != nil) ? [*error localizedDescription] : @"Unknown Error");
+        exit(1);
+    }
+    return success;
+}
+
+void RetrieveRootLevel(CISDOBIpadService *service, int waitTime, NSManagedObjectContext *moc, NSError **error)
+{
+    CISDOBAsyncCall *call;
+    call = [service listRootLevelEntities];
+    NSArray *rawEntities = RunCallSynchronously(call, waitTime);
+    
+    NSEntityDescription *entity = [NSEntityDescription entityForName: @"CISDOBIpadEntity" inManagedObjectContext: moc];
+    NSManagedObjectModel *model = [entity managedObjectModel];
+    
+    for (CISDOBIpadRawEntity *rawEntity in rawEntities) {
+        SynchEntityWithManagedObjectContext(rawEntity, model, moc, error);
+    }
+    SaveManagedObjectContext(moc, error);
+}
+
+void RetrieveDrillEntities(CISDOBIpadService *service, int waitTime, NSManagedObjectContext *moc, NSError **error)
+{
+    NSMutableArray *drillPermIds = [NSMutableArray array];
+    NSMutableArray *drillRefcons = [NSMutableArray array];
+    CollectAllDrillableEntities(drillPermIds, drillRefcons, moc, error);
+    CISDOBAsyncCall *call;
+    call = [service drillOnEntities: drillPermIds refcons: drillRefcons];
+    NSArray *rawEntities = RunCallSynchronously(call, waitTime);
+    
+    NSEntityDescription *entity = [NSEntityDescription entityForName: @"CISDOBIpadEntity" inManagedObjectContext: moc];
+    NSManagedObjectModel *model = [entity managedObjectModel];
+    
+    for (CISDOBIpadRawEntity *rawEntity in rawEntities) {
+        SynchEntityWithManagedObjectContext(rawEntity, model, moc, error);
+    }
+    SaveManagedObjectContext(moc, error);
+}
+
+void RetrieveDetailEntities(CISDOBIpadService *service, int waitTime, NSManagedObjectContext *moc, NSError **error)
+{
+    NSMutableArray *allPermIds = [NSMutableArray array];
+    NSMutableArray *allRefcons = [NSMutableArray array];
+    CollectAllEntities(allPermIds, allRefcons, moc, error);
+    CISDOBAsyncCall *call;
+    call = [service detailsForEntities: allPermIds refcons: allRefcons];
+    NSArray *rawEntities = RunCallSynchronously(call, waitTime);
+    
+    NSEntityDescription *entity = [NSEntityDescription entityForName: @"CISDOBIpadEntity" inManagedObjectContext: moc];
+    NSManagedObjectModel *model = [entity managedObjectModel];
+    
+    for (CISDOBIpadRawEntity *rawEntity in rawEntities) {
+        SynchEntityWithManagedObjectContext(rawEntity, model, moc, error);
+    }
+    SaveManagedObjectContext(moc, error);
+}
+
 void InitializeDatabase(NSManagedObjectContext *moc, NSError **error)
 {
     NSURL *url = [NSURL URLWithString: @"https://localhost:8443"];
@@ -126,14 +231,9 @@ void InitializeDatabase(NSManagedObjectContext *moc, NSError **error)
     call = [service loginUser: @"admin" password: @"password"];
     RunCallSynchronously(call, waitTime);
     
-    call = [service listAllEntities];
-    NSArray *rawEntities = RunCallSynchronously(call, waitTime);
-    
-       for (CISDOBIpadRawEntity *rawEntity in rawEntities) {
-        // Create new entities in the moc, and store them.
-       	CISDOBIpadEntity *entity = [NSEntityDescription insertNewObjectForEntityForName: @"CISDOBIpadEntity" inManagedObjectContext: moc];
-        [entity initializeFromRawEntity: rawEntity];
-    }
+    RetrieveRootLevel(service, waitTime, moc, error);
+    RetrieveDrillEntities(service, waitTime, moc, error);
+    RetrieveDetailEntities(service, waitTime, moc, error);
 }
 
 int main(int argc, const char * argv[])
@@ -154,11 +254,6 @@ int main(int argc, const char * argv[])
         NSDate *start = [NSDate date];
         InitializeDatabase(moc, &error);
         
-        // Save the managed object context
-        if (![moc save:&error]) {
-            NSLog(@"Error while saving %@", ([error localizedDescription] != nil) ? [error localizedDescription] : @"Unknown Error");
-            exit(1);
-        }
         NSDate *end = [NSDate date];
         NSLog(@"END  Init DB (%.2f sec) %@", [end timeIntervalSinceDate: start], databaseUrl);
     }
-- 
GitLab