You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by lg...@apache.org on 2015/02/09 13:29:05 UTC

svn commit: r1658384 - in /chemistry/objectivecmis/trunk/ObjectiveCMIS: Bindings/ Bindings/Browser/ Client/ Common/ Utils/

Author: lgross
Date: Mon Feb  9 12:29:05 2015
New Revision: 1658384

URL: http://svn.apache.org/r1658384
Log:
- Implemented Negative Type Cache
- Fixed Progress Block Callback Issue for Uploads that get cancelled right before completion
- Added Interface to CMISQueryStatement Class that allows setting Array Parameters for WHERE IN Clauses
- Fixed Bug that could cause Completion Blocks get called multiple times if already completed or failed Request gets cancelled
- Support for setting Property values to nil

Modified:
    chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
    chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISQueryStatement.h
    chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISQueryStatement.m
    chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISSession.m
    chemistry/objectivecmis/trunk/ObjectiveCMIS/Common/CMISConstants.h
    chemistry/objectivecmis/trunk/ObjectiveCMIS/Common/CMISConstants.m
    chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISHttpRequest.m
    chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISHttpUploadRequest.m
    chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISObjectConverter.m

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m?rev=1658384&r1=1658383&r2=1658384&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m Mon Feb  9 12:29:05 2015
@@ -37,8 +37,11 @@
 #import "CMISPrincipal.h"
 #import "CMISAllowableActions.h"
 
-NSString * const kCMISBrowserMinValueJSONProperty = @"\"minValue\":0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049,";
-NSString * const kCMISBrowserMaxValueJSONProperty = @"\"maxValue\":179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,";
+NSString * const kCMISBrowserMinValueAlfrescoJSONProperty = @"\"minValue\":0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049,";
+NSString * const kCMISBrowserMinValueECMJSONProperty = @"\"minValue\":-179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,";
+
+NSString * const kCMISBrowserMaxValueAlfrescoJSONProperty = @"\"maxValue\":179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,";
+NSString * const kCMISBrowserMaxValueECMJSONProperty = @"\"maxValue\":179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,";
 
 @interface NSObject (CMISUtil)
 
@@ -136,8 +139,10 @@ NSString * const kCMISBrowserMaxValueJSO
         NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
         
         // remove the minValue and maxValue properties as they are effectively indicating any reasonable value is valid
-        jsonString = [jsonString stringByReplacingOccurrencesOfString:kCMISBrowserMinValueJSONProperty withString:@""];
-        jsonString = [jsonString stringByReplacingOccurrencesOfString:kCMISBrowserMaxValueJSONProperty withString:@""];
+        jsonString = [jsonString stringByReplacingOccurrencesOfString:kCMISBrowserMinValueAlfrescoJSONProperty withString:@""];
+        jsonString = [jsonString stringByReplacingOccurrencesOfString:kCMISBrowserMinValueECMJSONProperty withString:@""];
+        jsonString = [jsonString stringByReplacingOccurrencesOfString:kCMISBrowserMaxValueAlfrescoJSONProperty withString:@""];
+        jsonString = [jsonString stringByReplacingOccurrencesOfString:kCMISBrowserMaxValueECMJSONProperty withString:@""];
         
         // re-try and JSON parse
         serialisationError = nil;
@@ -402,11 +407,12 @@ NSString * const kCMISBrowserMaxValueJSO
         objectData.baseType = CMISBaseTypeFolder;
     }
     
-    objectData.acl = [CMISBrowserUtil convertAcl:[dictionary cmis_objectForKeyNotNull:kCMISBrowserJSONAcl]]; //TODO here we should pass isExactAcl:nil!
+    BOOL isExactAcl = [dictionary cmis_boolForKey:kCMISBrowserJSONIsExact];
+    objectData.acl = [CMISBrowserUtil convertAcl:[dictionary cmis_objectForKeyNotNull:kCMISBrowserJSONAcl] isExactAcl:isExactAcl];
     
     objectData.allowableActions = [CMISBrowserUtil convertAllowableActions:[dictionary cmis_objectForKeyNotNull:kCMISBrowserJSONAllowableActions]];
     
-    objectData.isExactAcl = [dictionary cmis_boolForKey:kCMISBrowserJSONIsExact];
+    objectData.isExactAcl = isExactAcl;
 
     // TODO set policyIds
     
@@ -830,7 +836,7 @@ NSString * const kCMISBrowserMaxValueJSO
     return result;
 }
 
-+ (CMISAcl *)convertAcl:(NSDictionary *)jsonDictionary
++ (CMISAcl *)convertAcl:(NSDictionary *)jsonDictionary isExactAcl:(BOOL)isExact
 {
     if (!jsonDictionary) {
         return nil;
@@ -876,7 +882,7 @@ NSString * const kCMISBrowserMaxValueJSO
     
     result.aces = [aces copy];
     
-    //TODO result.isExact = isExact; // there should be a "isExcat" parameter of this method
+    result.isExact = isExact;
     
     result.extensions = [CMISObjectConverter convertExtensions:jsonDictionary cmisKeys:[CMISBrowserConstants aclKeys]];
     

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISQueryStatement.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISQueryStatement.h?rev=1658384&r1=1658383&r2=1658384&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISQueryStatement.h (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISQueryStatement.h Mon Feb  9 12:29:05 2015
@@ -119,6 +119,18 @@
 - (void)setStringContainsAtIndex:(NSUInteger)parameterIndex string:(NSString*)string;
 
 /**
+ * Sets the designated parameter to the given list of strings.
+ * Strings will be concatenated by ','
+ * Use this method to proide a list of values for an IN (?) statement
+ *
+ * @param parameterIndex
+ *            the parameter index (one-based)
+ * @param stringArray
+ *            the values
+ */
+- (void)setStringArrayAtIndex:(NSUInteger)parameterIndex stringArray:(NSArray*)stringArray;
+
+/**
  * Sets the designated parameter to the given number.
  *
  * @param parameterIndex

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISQueryStatement.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISQueryStatement.m?rev=1658384&r1=1658383&r2=1658384&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISQueryStatement.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISQueryStatement.m Mon Feb  9 12:29:05 2015
@@ -76,6 +76,20 @@ static NSDateFormatter *cmisQueryStateme
     }
 }
 
+- (void)setStringArrayAtIndex:(NSUInteger)parameterIndex stringArray:(NSArray*)stringArray {
+    NSMutableString *paramStr = [NSMutableString string];
+    for (NSString *value in stringArray) {
+        if ([value isKindOfClass:NSString.class] && value.length > 0) {
+            [paramStr appendFormat:@"%@, ", [CMISQueryStatement escapeString:value withSurroundingQuotes:YES]];
+        }
+    }
+    if (paramStr.length > 2) {
+        self.parametersDictionary[@(parameterIndex)] = [paramStr substringToIndex:paramStr.length-2];
+    } else {
+        self.parametersDictionary[@(parameterIndex)] = [NSString string]; // Empty list
+    }
+}
+
 - (void)setUrlAtIndex:(NSUInteger)parameterIndex url:(NSURL*)url {
     if (url) {
         NSError *error;

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISSession.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISSession.m?rev=1658384&r1=1658383&r2=1658384&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISSession.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISSession.m Mon Feb  9 12:29:05 2015
@@ -351,15 +351,22 @@
 
 - (CMISRequest*)retrieveTypeDefinition:(NSString *)typeId completionBlock:(void (^)(CMISTypeDefinition *typeDefinition, NSError *error))completionBlock
 {
-    CMISTypeDefinition *typeDefinition = [self.typeCache objectForKey:typeId];
+    id typeDefinition = [self.typeCache objectForKey:typeId];
     if (typeDefinition) {
-        completionBlock(typeDefinition, nil);
+        if (typeDefinition == [NSNull null]) {
+            completionBlock(nil, [CMISErrors createCMISErrorWithCode:kCMISErrorCodeObjectNotFound detailedDescription:nil]);
+        } else {
+            completionBlock(typeDefinition, nil);
+        }
         return nil;
     }
     
     return [self.binding.repositoryService retrieveTypeDefinition:typeId completionBlock:^(CMISTypeDefinition *typeDefinition, NSError *error) {
         if (typeDefinition) {
             [self.typeCache setObject:typeDefinition forKey:typeId];
+        } else if ([error.domain isEqualToString:kCMISErrorDomainName] && error.code == kCMISErrorCodeObjectNotFound) {
+            // Negative type cache
+            [self.typeCache setObject:[NSNull null] forKey:typeId];
         }
         completionBlock(typeDefinition, error);
     }];

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Common/CMISConstants.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Common/CMISConstants.h?rev=1658384&r1=1658383&r2=1658384&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Common/CMISConstants.h (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Common/CMISConstants.h Mon Feb  9 12:29:05 2015
@@ -36,8 +36,11 @@ extern NSString * const kCMISPropertyCon
 extern NSString * const kCMISPropertyContentStreamFileName;
 extern NSString * const kCMISPropertyContentStreamLength;
 extern NSString * const kCMISPropertyContentStreamMediaType;
+extern NSString * const kCMISPropertyContentStreamHash;
 extern NSString * const kCMISPropertyObjectTypeId;
 extern NSString * const kCMISPropertyVersionSeriesId;
+extern NSString * const kCMISPropertyVersionSeriesCheckedOutBy;
+extern NSString * const kCMISPropertyVersionSeriesCheckedOutId;
 extern NSString * const kCMISPropertyVersionLabel;
 extern NSString * const kCMISPropertyIsLatestVersion;
 extern NSString * const kCMISPropertyIsMajorVersion;

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Common/CMISConstants.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Common/CMISConstants.m?rev=1658384&r1=1658383&r2=1658384&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Common/CMISConstants.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Common/CMISConstants.m Mon Feb  9 12:29:05 2015
@@ -45,8 +45,11 @@ NSString * const kCMISPropertyContentStr
 NSString * const kCMISPropertyContentStreamFileName = @"cmis:contentStreamFileName";
 NSString * const kCMISPropertyContentStreamLength = @"cmis:contentStreamLength";
 NSString * const kCMISPropertyContentStreamMediaType = @"cmis:contentStreamMimeType";
+NSString * const kCMISPropertyContentStreamHash = @"cmis:contentStreamHash";
 NSString * const kCMISPropertyObjectTypeId = @"cmis:objectTypeId";
 NSString * const kCMISPropertyVersionSeriesId = @"cmis:versionSeriesId";
+NSString * const kCMISPropertyVersionSeriesCheckedOutBy = @"cmis:versionSeriesCheckedOutBy";
+NSString * const kCMISPropertyVersionSeriesCheckedOutId= @"cmis:versionSeriesCheckedOutId";
 NSString * const kCMISPropertyVersionLabel = @"cmis:versionLabel";
 NSString * const kCMISPropertyIsLatestVersion = @"cmis:isLatestVersion";
 NSString * const kCMISPropertyIsMajorVersion = @"cmis:isMajorVersion";
@@ -57,7 +60,6 @@ NSString * const kCMISPropertyCheckinCom
 NSString * const kCMISPropertySecondaryObjectTypeIds = @"cmis:secondaryObjectTypeIds";
 NSString * const kCMISPropertyDescription = @"cmis:description";
 
-
 // Property values
 
 NSString * const kCMISPropertyObjectTypeIdValueDocument = @"cmis:document";

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISHttpRequest.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISHttpRequest.m?rev=1658384&r1=1658383&r2=1658384&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISHttpRequest.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISHttpRequest.m Mon Feb  9 12:29:05 2015
@@ -147,7 +147,10 @@ NSString * const kCMISExceptionVersionin
         if (self.completionBlock) {
             NSString *detailedDescription = [NSString stringWithFormat:@"Could not create network session for %@", urlRequest.URL];
             NSError *cmisError = [CMISErrors createCMISErrorWithCode:kCMISErrorCodeConnection detailedDescription:detailedDescription];
-            self.completionBlock(nil, cmisError);
+            void (^completionBlock)(CMISHttpResponse *httpResponse, NSError *error);
+            completionBlock = self.completionBlock;
+            self.completionBlock = nil; // Prevent multiple execution if method on this request gets called inside completion block
+            completionBlock(nil, cmisError);
         }
     }
     
@@ -173,8 +176,10 @@ NSString * const kCMISExceptionVersionin
         
         self.urlSession = nil;
         
-        NSError *cmisError = [CMISErrors createCMISErrorWithCode:kCMISErrorCodeCancelled detailedDescription:@"Request was cancelled"];
-        completionBlock(nil, cmisError);
+        if (completionBlock) {
+            NSError *cmisError = [CMISErrors createCMISErrorWithCode:kCMISErrorCodeCancelled detailedDescription:@"Request was cancelled"];
+            completionBlock(nil, cmisError);
+        }
     }
 }
 
@@ -210,7 +215,10 @@ NSString * const kCMISExceptionVersionin
         
         // call the completion block on the main thread
         dispatch_async(dispatch_get_main_queue(), ^{
-            self.completionBlock(httpResponse, cmisError);
+            void (^completionBlock)(CMISHttpResponse *httpResponse, NSError *error);
+            completionBlock = self.completionBlock;
+            self.completionBlock = nil; // Prevent multiple execution if method on this request gets called inside completion block
+            completionBlock(nil, cmisError);
         });
     }
     

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISHttpUploadRequest.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISHttpUploadRequest.m?rev=1658384&r1=1658383&r2=1658384&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISHttpUploadRequest.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISHttpUploadRequest.m Mon Feb  9 12:29:05 2015
@@ -87,6 +87,7 @@ const NSUInteger kRawBufferSize = 24576;
 @property (nonatomic, copy) void (^progressBlock)(unsigned long long bytesUploaded, unsigned long long bytesTotal);
 @property (nonatomic, assign) BOOL useCombinedInputStream;
 @property (nonatomic, assign) BOOL base64Encoding;
+@property (nonatomic, assign) BOOL transferCompleted;
 @property (nonatomic, strong) NSInputStream *combinedInputStream;
 @property (nonatomic, strong) NSOutputStream *encoderStream;
 @property (nonatomic, strong) NSData *streamStartData;
@@ -170,6 +171,7 @@ const NSUInteger kRawBufferSize = 24576;
                      completionBlock:completionBlock];
     if (self) {
         _progressBlock = progressBlock;
+        _transferCompleted = NO;
     }
     return self;
 }
@@ -205,6 +207,9 @@ const NSUInteger kRawBufferSize = 24576;
 
 - (void)cancel
 {
+    if (self.transferCompleted) {
+        return;
+    }
     self.progressBlock = nil;
     
     [super cancel];
@@ -258,8 +263,14 @@ const NSUInteger kRawBufferSize = 24576;
         }
         
         if (self.bytesExpected == 0) {
+            if (totalBytesSent >= totalBytesExpectedToSend) {
+                self.transferCompleted = YES;
+            }
             self.progressBlock((unsigned long long)totalBytesSent, (unsigned long long)totalBytesExpectedToSend);
         } else {
+            if (totalBytesSent >= self.bytesExpected) {
+                self.transferCompleted = YES;
+            }
             self.progressBlock((unsigned long long)totalBytesSent, self.bytesExpected);
         }
     }

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISObjectConverter.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISObjectConverter.m?rev=1658384&r1=1658383&r2=1658384&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISObjectConverter.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISObjectConverter.m Mon Feb  9 12:29:05 2015
@@ -140,178 +140,182 @@
             Class expectedType = nil;
             BOOL validType = YES;
             
-            switch (propertyDefinition.propertyType) {
-                case(CMISPropertyTypeString): {
-                    expectedType = [NSString class];
-                    if ([propertyValue isKindOfClass:expectedType]) {
-                        [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId stringValue:propertyValue]];
-                    } else if ([propertyValue isKindOfClass:[NSArray class]]) {
-                        for (id propertyValueItemValue in propertyValue) {
-                            if (![propertyValueItemValue isKindOfClass:expectedType]) {
-                                validType = NO;
-                                break;
-                            }
-                        }
-                        if (validType) {
-                            [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId arrayValue:propertyValue type:propertyDefinition.propertyType]];
-                        }
-                    } else {
-                        validType = NO;
-                    }
-                    break;
-                }
-                case(CMISPropertyTypeBoolean): {
-                    expectedType = [NSNumber class];
-                    if ([propertyValue isKindOfClass:expectedType]) {
-                        BOOL boolValue = ((NSNumber *) propertyValue).boolValue;
-                        [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId boolValue:boolValue]];
-                    } else if ([propertyValue isKindOfClass:[NSArray class]]) {
-                        for (id propertyValueItemValue in propertyValue) {
-                            if (![propertyValueItemValue isKindOfClass:expectedType]) {
-                                validType = NO;
-                                break;
-                            }
-                        }
-                        if (validType) {
-                            [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId arrayValue:propertyValue type:propertyDefinition.propertyType]];
-                        }
-                    } else {
-                        validType = NO;
-                    }
-                    break;
-                }
-                case(CMISPropertyTypeInteger): {
-                    expectedType = [NSNumber class];
-                    if ([propertyValue isKindOfClass:expectedType]) {
-                        NSInteger intValue = ((NSNumber *) propertyValue).integerValue;
-                        [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId integerValue:intValue]];
-                    } else if ([propertyValue isKindOfClass:[NSArray class]]) {
-                        for (id propertyValueItemValue in propertyValue) {
-                            if (![propertyValueItemValue isKindOfClass:expectedType]) {
-                                validType = NO;
-                                break;
-                            }
-                        }
-                        if (validType) {
-                            [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId arrayValue:propertyValue type:propertyDefinition.propertyType]];
-                        }
-                    } else {
-                        validType = NO;
-                    }
-                    break;
-                }
-                case(CMISPropertyTypeDecimal): {
-                    expectedType = [NSNumber class];
-                    if ([propertyValue isKindOfClass:expectedType]) {
-                        [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId decimalValue:propertyValue]];
-                    } else if ([propertyValue isKindOfClass:[NSArray class]]) {
-                        for (id propertyValueItemValue in propertyValue) {
-                            if (![propertyValueItemValue isKindOfClass:expectedType]) {
-                                validType = NO;
-                                break;
-                            }
-                        }
-                        if (validType) {
-                            [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId arrayValue:propertyValue type:propertyDefinition.propertyType]];
-                        }
-                    } else {
-                        validType = NO;
+            if (propertyValue == [NSNull null]) {
+                [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId arrayValue:nil type:propertyDefinition.propertyType]];
+            } else {
+                switch (propertyDefinition.propertyType) {
+                    case(CMISPropertyTypeString): {
+                        expectedType = [NSString class];
+                        if ([propertyValue isKindOfClass:expectedType]) {
+                            [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId stringValue:propertyValue]];
+                        } else if ([propertyValue isKindOfClass:[NSArray class]]) {
+                            for (id propertyValueItemValue in propertyValue) {
+                                if (![propertyValueItemValue isKindOfClass:expectedType]) {
+                                    validType = NO;
+                                    break;
+                                }
+                            }
+                            if (validType) {
+                                [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId arrayValue:propertyValue type:propertyDefinition.propertyType]];
+                            }
+                        } else {
+                            validType = NO;
+                        }
+                        break;
+                    }
+                    case(CMISPropertyTypeBoolean): {
+                        expectedType = [NSNumber class];
+                        if ([propertyValue isKindOfClass:expectedType]) {
+                            BOOL boolValue = ((NSNumber *) propertyValue).boolValue;
+                            [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId boolValue:boolValue]];
+                        } else if ([propertyValue isKindOfClass:[NSArray class]]) {
+                            for (id propertyValueItemValue in propertyValue) {
+                                if (![propertyValueItemValue isKindOfClass:expectedType]) {
+                                    validType = NO;
+                                    break;
+                                }
+                            }
+                            if (validType) {
+                                [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId arrayValue:propertyValue type:propertyDefinition.propertyType]];
+                            }
+                        } else {
+                            validType = NO;
+                        }
+                        break;
+                    }
+                    case(CMISPropertyTypeInteger): {
+                        expectedType = [NSNumber class];
+                        if ([propertyValue isKindOfClass:expectedType]) {
+                            NSInteger intValue = ((NSNumber *) propertyValue).integerValue;
+                            [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId integerValue:intValue]];
+                        } else if ([propertyValue isKindOfClass:[NSArray class]]) {
+                            for (id propertyValueItemValue in propertyValue) {
+                                if (![propertyValueItemValue isKindOfClass:expectedType]) {
+                                    validType = NO;
+                                    break;
+                                }
+                            }
+                            if (validType) {
+                                [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId arrayValue:propertyValue type:propertyDefinition.propertyType]];
+                            }
+                        } else {
+                            validType = NO;
+                        }
+                        break;
+                    }
+                    case(CMISPropertyTypeDecimal): {
+                        expectedType = [NSNumber class];
+                        if ([propertyValue isKindOfClass:expectedType]) {
+                            [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId decimalValue:propertyValue]];
+                        } else if ([propertyValue isKindOfClass:[NSArray class]]) {
+                            for (id propertyValueItemValue in propertyValue) {
+                                if (![propertyValueItemValue isKindOfClass:expectedType]) {
+                                    validType = NO;
+                                    break;
+                                }
+                            }
+                            if (validType) {
+                                [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId arrayValue:propertyValue type:propertyDefinition.propertyType]];
+                            }
+                        } else {
+                            validType = NO;
+                        }
+                        break;
+                    }
+                    case(CMISPropertyTypeId): {
+                        expectedType = [NSString class];
+                        if ([propertyValue isKindOfClass:expectedType]) {
+                            [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId idValue:propertyValue]];
+                        } else if ([propertyValue isKindOfClass:[NSArray class]]) {
+                            for (id propertyValueItemValue in propertyValue) {
+                                if (![propertyValueItemValue isKindOfClass:expectedType]) {
+                                    validType = NO;
+                                    break;
+                                }
+                            }
+                            if (validType) {
+                                [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId arrayValue:propertyValue type:propertyDefinition.propertyType]];
+                            }
+                        } else {
+                            validType = NO;
+                        }
+                        break;
+                    }
+                    case(CMISPropertyTypeDateTime): {
+                        if ([propertyValue isKindOfClass:[NSString class]]) {
+                            propertyValue = [CMISDateUtil dateFromString:propertyValue];
+                        }
+                        expectedType = [NSDate class];
+                        if ([propertyValue isKindOfClass:expectedType]) {
+                            [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId dateTimeValue:propertyValue]];
+                        } else if ([propertyValue isKindOfClass:[NSArray class]]) {
+                            for (__strong id propertyValueItemValue in propertyValue) {
+                                if ([propertyValueItemValue isKindOfClass:[NSString class]]) {
+                                    propertyValueItemValue = [CMISDateUtil dateFromString:propertyValueItemValue];
+                                }
+                                if (![propertyValueItemValue isKindOfClass:expectedType]) {
+                                    validType = NO;
+                                    break;
+                                }
+                            }
+                            if (validType) {
+                                [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId arrayValue:propertyValue type:propertyDefinition.propertyType]];
+                            }
+                        } else {
+                            validType = NO;
+                        }
+                        break;
+                    }
+                    case(CMISPropertyTypeUri): {
+                        if ([propertyValue isKindOfClass:[NSString class]]) {
+                            propertyValue = [NSURL URLWithString:propertyValue];
+                        }
+                        expectedType = [NSURL class];
+                        if ([propertyValue isKindOfClass:expectedType]) {
+                            [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId uriValue:propertyValue]];
+                        } else if ([propertyValue isKindOfClass:[NSArray class]]) {
+                            for (__strong id propertyValueItemValue in propertyValue) {
+                                if ([propertyValueItemValue isKindOfClass:[NSString class]]) {
+                                    propertyValueItemValue = [NSURL URLWithString:propertyValueItemValue];
+                                }
+                                if (![propertyValueItemValue isKindOfClass:expectedType]) {
+                                    validType = NO;
+                                    break;
+                                }
+                            }
+                            if (validType) {
+                                [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId arrayValue:propertyValue type:propertyDefinition.propertyType]];
+                            }
+                        } else {
+                            validType = NO;
+                        }
+                        break;
+                    }
+                    case(CMISPropertyTypeHtml): {
+                        expectedType = [NSString class];
+                        if ([propertyValue isKindOfClass:expectedType]) {
+                            [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId htmlValue:propertyValue]];
+                        } else if ([propertyValue isKindOfClass:[NSArray class]]) {
+                            for (id propertyValueItemValue in propertyValue) {
+                                if (![propertyValueItemValue isKindOfClass:expectedType]) {
+                                    validType = NO;
+                                    break;
+                                }
+                            }
+                            if (validType) {
+                                [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId arrayValue:propertyValue type:propertyDefinition.propertyType]];
+                            }
+                        } else {
+                            validType = NO;
+                        }
+                        break;
+                    }
+                    default: {
+                        NSError *error = [CMISErrors createCMISErrorWithCode:kCMISErrorCodeInvalidArgument
+                                                     detailedDescription:[NSString stringWithFormat:@"Unsupported: cannot convert property type %li", (long)propertyDefinition.propertyType]];
+                        completionBlock(nil, error);
+                        return;
                     }
-                    break;
-                }
-                case(CMISPropertyTypeId): {
-                    expectedType = [NSString class];
-                    if ([propertyValue isKindOfClass:expectedType]) {
-                        [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId idValue:propertyValue]];
-                    } else if ([propertyValue isKindOfClass:[NSArray class]]) {
-                        for (id propertyValueItemValue in propertyValue) {
-                            if (![propertyValueItemValue isKindOfClass:expectedType]) {
-                                validType = NO;
-                                break;
-                            }
-                        }
-                        if (validType) {
-                            [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId arrayValue:propertyValue type:propertyDefinition.propertyType]];
-                        }
-                    } else {
-                        validType = NO;
-                    }
-                    break;
-                }
-                case(CMISPropertyTypeDateTime): {
-                    if ([propertyValue isKindOfClass:[NSString class]]) {
-                        propertyValue = [CMISDateUtil dateFromString:propertyValue];
-                    }
-                    expectedType = [NSDate class];
-                    if ([propertyValue isKindOfClass:expectedType]) {
-                        [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId dateTimeValue:propertyValue]];
-                    } else if ([propertyValue isKindOfClass:[NSArray class]]) {
-                        for (__strong id propertyValueItemValue in propertyValue) {
-                            if ([propertyValueItemValue isKindOfClass:[NSString class]]) {
-                                propertyValueItemValue = [CMISDateUtil dateFromString:propertyValueItemValue];
-                            }
-                            if (![propertyValueItemValue isKindOfClass:expectedType]) {
-                                validType = NO;
-                                break;
-                            }
-                        }
-                        if (validType) {
-                            [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId arrayValue:propertyValue type:propertyDefinition.propertyType]];
-                        }
-                    } else {
-                        validType = NO;
-                    }
-                    break;
-                }
-                case(CMISPropertyTypeUri): {
-                    if ([propertyValue isKindOfClass:[NSString class]]) {
-                        propertyValue = [NSURL URLWithString:propertyValue];
-                    }
-                    expectedType = [NSURL class];
-                    if ([propertyValue isKindOfClass:expectedType]) {
-                        [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId uriValue:propertyValue]];
-                    } else if ([propertyValue isKindOfClass:[NSArray class]]) {
-                        for (__strong id propertyValueItemValue in propertyValue) {
-                            if ([propertyValueItemValue isKindOfClass:[NSString class]]) {
-                                propertyValueItemValue = [NSURL URLWithString:propertyValueItemValue];
-                            }
-                            if (![propertyValueItemValue isKindOfClass:expectedType]) {
-                                validType = NO;
-                                break;
-                            }
-                        }
-                        if (validType) {
-                            [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId arrayValue:propertyValue type:propertyDefinition.propertyType]];
-                        }
-                    } else {
-                        validType = NO;
-                    }
-                    break;
-                }
-                case(CMISPropertyTypeHtml): {
-                    expectedType = [NSString class];
-                    if ([propertyValue isKindOfClass:expectedType]) {
-                        [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId htmlValue:propertyValue]];
-                    } else if ([propertyValue isKindOfClass:[NSArray class]]) {
-                        for (id propertyValueItemValue in propertyValue) {
-                            if (![propertyValueItemValue isKindOfClass:expectedType]) {
-                                validType = NO;
-                                break;
-                            }
-                        }
-                        if (validType) {
-                            [convertedProperties addProperty:[CMISPropertyData createPropertyForId:propertyId arrayValue:propertyValue type:propertyDefinition.propertyType]];
-                        }
-                    } else {
-                        validType = NO;
-                    }
-                    break;
-                }
-                default: {
-                    NSError *error = [CMISErrors createCMISErrorWithCode:kCMISErrorCodeInvalidArgument
-                                                 detailedDescription:[NSString stringWithFormat:@"Unsupported: cannot convert property type %li", (long)propertyDefinition.propertyType]];
-                    completionBlock(nil, error);
-                    return;
                 }
             }