Retry failed browser or node service requests that may have an updated URL in the...
[pithos-macos] / pithos-macos / PithosObjectNode.m
index fc797f1..ffe8fd1 100644 (file)
@@ -2,7 +2,7 @@
 //  PithosObjectNode.m
 //  pithos-macos
 //
-// Copyright 2011-2012 GRNET S.A. All rights reserved.
+// Copyright 2011-2013 GRNET S.A. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or
 // without modification, are permitted provided that the following
 #import "PithosObjectNodeInfoController.h"
 
 @implementation PithosObjectNode
-@synthesize pithos, pithosContainer, pithosObject, versions;
+@synthesize pithosContainer, pithosObject, versions, applyMetadataObjectRequest, refreshMetadataObjectRequest, refreshVersionsObjectRequest;
 @synthesize isPublic, translatedModifiedBy, translatedPermissions;
 
 #pragma mark -
 #pragma mark Object Lifecycle
 
-- (id)initWithPithos:(ASIPithos *)aPithos 
-     pithosContainer:(ASIPithosContainer *)aPithosContainer 
-        pithosObject:(ASIPithosObject *)aPithosObject {
-    if ((self = [super init])) {
-        self.pithos = aPithos;
+- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager
+                   pithosContainer:(ASIPithosContainer *)aPithosContainer
+                      pithosObject:(ASIPithosObject *)aPithosObject {
+    if ((self = [super initWithPithosAccountManager:aPithosAccountManager])) {
+        isLeafItem = YES;
         self.pithosContainer = aPithosContainer;
         self.pithosObject = aPithosObject;
-        isLeafItem = YES;
     }
     return self;
 }
@@ -83,7 +82,7 @@
         if (displayname) {
             self.translatedModifiedBy = displayname;
         } else {
-            [pithosAccountManager updateUserCatalogForForDisplaynames:nil UUIDs:[NSArray arrayWithObject:pithosObject.modifiedBy]];
+            [pithosAccountManager updateUserCatalogForDisplaynames:nil UUIDs:[NSArray arrayWithObject:pithosObject.modifiedBy]];
             self.translatedModifiedBy = [pithosAccountManager displaynameForUUID:pithosObject.modifiedBy safe:YES];
         }
     } else {
         [UUIDs removeObject:@""];
         [UUIDs removeObject:@"*"];
         if (UUIDs.count) {
-            [pithosAccountManager updateUserCatalogForForDisplaynames:nil UUIDs:[UUIDs allObjects]];
+            [pithosAccountManager updateUserCatalogForDisplaynames:nil UUIDs:[UUIDs allObjects]];
         }
         
         NSMutableArray *newTranslatedPermissions = [NSMutableArray arrayWithCapacity:pithosObject.permissions.count];
 #pragma mark -
 #pragma mark Properties
 
-- (void)setPithos:(ASIPithos *)aPithos {
-    if (aPithos && ![aPithos isEqualTo:pithos]) {
-        pithos = aPithos;
-        url = nil;
-    }
-}
-
 - (NSString *)url {
-    if (url == nil)
-        url = [[NSString alloc] initWithFormat:@"object %@/%@/%@%@", 
-               (sharingAccount ? [pithos storageURLWithAuthUser:sharingAccount] : pithos.storageURL), 
-               pithosContainer.name, 
-               pithosObject.name, 
-               (shared ? @"?shared" : @"")];
-    return url;
+    return [NSString stringWithFormat:@"@object@%@/%@/%@%@",
+            (sharingAccount ? sharingAccount : pithosAccountManager.pithos.authUser),
+            pithosContainer.name,
+            pithosObject.name,
+            (shared ? @"?shared" : @"")];
 }
 
 - (NSArray *)children {
             if (responseStatusCode != 202)
                 [PithosUtilities unexpectedResponseStatusAlertWithRequest:applyMetadataObjectRequest];
             @synchronized(self) {
-                applyMetadataObjectRequest = nil;
+                self.applyMetadataObjectRequest = nil;
             }
             if (responseStatusCode == 202)
                 [self refreshInfo];
             [[pithosNodeInfoController window] makeFirstResponder:nil];
             self.pithosObject = [refreshMetadataObjectRequest object];
             @synchronized(self) {
-                refreshMetadataObjectRequest = nil;
+                self.refreshMetadataObjectRequest = nil;
             }
         } else if ([request isEqualTo:refreshVersionsObjectRequest]) {
             [[pithosNodeInfoController window] makeFirstResponder:nil];
             self.versions = [refreshVersionsObjectRequest versions];
             @synchronized(self) {
-                refreshVersionsObjectRequest = nil;
+                self.refreshVersionsObjectRequest = nil;
             }
         }
     }
     @autoreleasepool {
         NSUInteger retries = [[request.userInfo objectForKey:@"retries"] unsignedIntegerValue];
         if (retries > 0) {
-            ASIPithosObjectRequest *newRequest = (ASIPithosObjectRequest *)[PithosUtilities copyRequest:request];
+            ASIPithosObjectRequest *newRequest = (ASIPithosObjectRequest *)[PithosUtilities retryWithUpdatedURLRequest:request
+                                                                                               andPithosAccountManager:pithosAccountManager];
             [(NSMutableDictionary *)(newRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
             if ([request isEqualTo:applyMetadataObjectRequest]) {
                 @synchronized(self) {
-                    applyMetadataObjectRequest = newRequest;
+                    self.applyMetadataObjectRequest = newRequest;
                 }
             } else if ([request isEqualTo:refreshMetadataObjectRequest]) {
                 @synchronized(self) {
-                    refreshMetadataObjectRequest = newRequest;
+                    self.refreshMetadataObjectRequest = newRequest;
                 }
             } else if ([request isEqualTo:refreshVersionsObjectRequest]) {
                 @synchronized(self) {
-                    refreshVersionsObjectRequest = newRequest;
+                    self.refreshVersionsObjectRequest = newRequest;
                 }
             }
             [[PithosUtilities prepareRequest:newRequest priority:[[newRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
             if ([request isEqualTo:applyMetadataObjectRequest]) {
                 [PithosUtilities httpRequestErrorAlertWithRequest:applyMetadataObjectRequest];
                 @synchronized(self) {
-                    applyMetadataObjectRequest = nil;
+                    self.applyMetadataObjectRequest = nil;
                 }
             } else if ([request isEqualTo:refreshMetadataObjectRequest]) {
                 [PithosUtilities httpRequestErrorAlertWithRequest:refreshMetadataObjectRequest];
                 @synchronized(self) {
-                    refreshMetadataObjectRequest = nil;
+                    self.refreshMetadataObjectRequest = nil;
                 }
             } else if ([request isEqualTo:refreshVersionsObjectRequest]) {
                 [PithosUtilities httpRequestErrorAlertWithRequest:refreshVersionsObjectRequest];
                 @synchronized(self) {
-                    refreshVersionsObjectRequest = nil;
+                    self.refreshVersionsObjectRequest = nil;
                 }
             }
         }
         if (applyMetadataObjectRequest == nil) {
             [[pithosNodeInfoController window] makeFirstResponder:nil];
             if (sharingAccount) {
-                applyMetadataObjectRequest = [ASIPithosObjectRequest updateObjectMetadataRequestWithPithos:pithos
-                                                                                             containerName:pithosContainer.name
-                                                                                                objectName:pithosObject.name
-                                                                                           contentEncoding:nil
-                                                                                        contentDisposition:nil
-                                                                                                  manifest:nil
-                                                                                                   sharing:nil
-                                                                                                  isPublic:(isPublic ? ASIPithosObjectRequestPublicTrue : ASIPithosObjectRequestPublicFalse)
-                                                                                                  metadata:pithosObject.metadata
-                                                                                                    update:NO];
-                [applyMetadataObjectRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
+                self.applyMetadataObjectRequest = [ASIPithosObjectRequest updateObjectMetadataRequestWithPithos:pithosAccountManager.pithos
+                                                                                                  containerName:pithosContainer.name
+                                                                                                     objectName:pithosObject.name
+                                                                                                contentEncoding:nil
+                                                                                             contentDisposition:nil
+                                                                                                       manifest:nil
+                                                                                                        sharing:nil
+                                                                                                       isPublic:(isPublic ? ASIPithosObjectRequestPublicTrue : ASIPithosObjectRequestPublicFalse)
+                                                                                                       metadata:pithosObject.metadata
+                                                                                                         update:NO];
+                [applyMetadataObjectRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithosAccountManager.pithos];
             } else {
                 NSMutableArray *permissions = [NSMutableArray array];
                 if (translatedPermissions.count) {
                         [allUsers removeObject:@""];
                         [allUsers removeObject:@"*"];
                         if (allUsers.count) {
-                            ASIPithosRequest *userCatalogRequest = [pithosAccountManager updateUserCatalogForForDisplaynames:[allUsers allObjects]
+                            ASIPithosRequest *userCatalogRequest = [pithosAccountManager updateUserCatalogForDisplaynames:[allUsers allObjects]
                                                                                                                        UUIDs:nil];
                             if (userCatalogRequest.error || ((userCatalogRequest.responseStatusCode != 200) && (userCatalogRequest.responseStatusCode != 404))) {
                                 return;
                 }
                 pithosObject.permissions = permissions;
             
-                applyMetadataObjectRequest = [ASIPithosObjectRequest updateObjectMetadataRequestWithPithos:pithos 
-                                                                                              containerName:pithosContainer.name 
-                                                                                                 objectName:pithosObject.name 
-                                                                                            contentEncoding:pithosObject.contentEncoding 
-                                                                                         contentDisposition:pithosObject.contentDisposition 
-                                                                                                   manifest:pithosObject.manifest 
-                                                                                                    sharing:(pithosObject.sharing ? pithosObject.sharing : @"")
-                                                                                                   isPublic:(isPublic ? ASIPithosObjectRequestPublicTrue : ASIPithosObjectRequestPublicFalse) 
-                                                                                                   metadata:pithosObject.metadata
-                                                                                                     update:NO];
+                self.applyMetadataObjectRequest = [ASIPithosObjectRequest updateObjectMetadataRequestWithPithos:pithosAccountManager.pithos
+                                                                                                  containerName:pithosContainer.name
+                                                                                                     objectName:pithosObject.name
+                                                                                                contentEncoding:pithosObject.contentEncoding
+                                                                                             contentDisposition:pithosObject.contentDisposition
+                                                                                                       manifest:pithosObject.manifest
+                                                                                                        sharing:(pithosObject.sharing ? pithosObject.sharing : @"")
+                                                                                                       isPublic:(isPublic ? ASIPithosObjectRequestPublicTrue : ASIPithosObjectRequestPublicFalse)
+                                                                                                       metadata:pithosObject.metadata
+                                                                                                         update:NO];
             }
             applyMetadataObjectRequest.delegate = self;
             applyMetadataObjectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
 - (void)refreshInfo {
     @synchronized(self) {
         if (refreshMetadataObjectRequest == nil) {
-            refreshMetadataObjectRequest = [ASIPithosObjectRequest objectMetadataRequestWithPithos:pithos 
-                                                                                      containerName:pithosContainer.name 
-                                                                                         objectName:pithosObject.name];
+            self.refreshMetadataObjectRequest = [ASIPithosObjectRequest objectMetadataRequestWithPithos:pithosAccountManager.pithos
+                                                                                          containerName:pithosContainer.name
+                                                                                             objectName:pithosObject.name];
             if (sharingAccount)
-                [refreshMetadataObjectRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
+                [refreshMetadataObjectRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithosAccountManager.pithos];
             refreshMetadataObjectRequest.delegate = self;
             refreshMetadataObjectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
             refreshMetadataObjectRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
 - (void)refreshVersions {
     @synchronized(self) {
         if (refreshVersionsObjectRequest == nil) {
-            refreshVersionsObjectRequest = [ASIPithosObjectRequest objectVersionsRequestWithPithos:pithos 
-                                                                                      containerName:pithosContainer.name 
-                                                                                         objectName:pithosObject.name];
+            self.refreshVersionsObjectRequest = [ASIPithosObjectRequest objectVersionsRequestWithPithos:pithosAccountManager.pithos
+                                                                                          containerName:pithosContainer.name
+                                                                                             objectName:pithosObject.name];
             if (sharingAccount)
-                [refreshVersionsObjectRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
+                [refreshVersionsObjectRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithosAccountManager.pithos];
             refreshVersionsObjectRequest.delegate = self;
             refreshVersionsObjectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
             refreshVersionsObjectRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);