chemistry-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From gavincornw...@apache.org
Subject svn commit: r1583066 [2/2] - in /chemistry/objectivecmis/branches/browser-binding: ObjectiveCMIS.xcodeproj/ ObjectiveCMIS/Bindings/ ObjectiveCMIS/Bindings/AtomPub/ ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/ ObjectiveCMIS/Bindings/Browser/ ObjectiveC...
Date Sat, 29 Mar 2014 21:54:24 GMT
Added: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m?rev=1583066&view=auto
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
(added)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
Sat Mar 29 21:54:23 2014
@@ -0,0 +1,257 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import "CMISBrowserUtil.h"
+#import "CMISConstants.h"
+#import "CMISBrowserConstants.h"
+#import "CMISRepositoryInfo.h"
+#import "CMISPropertyDefinition.h"
+
+@implementation CMISBrowserUtil
+
++ (NSDictionary *)repositoryInfoDictionaryFromJSONData:(NSData *)jsonData bindingSession:(CMISBindingSession
*)bindingSession error:(NSError **)outError
+{
+    // TODO: error handling i.e. if jsonData is nil, also handle outError being nil
+    
+    // parse the JSON response
+    NSError *serialisationError = nil;
+    id jsonDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&serialisationError];
+    
+    NSMutableDictionary *repositories = nil;
+    if (!serialisationError) {
+        repositories = [NSMutableDictionary dictionary];
+        
+        // parse the json into CMISRepositoryInfo objects and store in self.repositories
+        NSArray *repos = [jsonDictionary allValues];
+        for (NSDictionary *repo in repos) {
+            CMISRepositoryInfo *repoInfo = [CMISRepositoryInfo new];
+            repoInfo.identifier = repo[kCMISBrowserJSONRepositoryId];
+            repoInfo.name = repo[kCMISBrowserJSONRepositoryName];
+            repoInfo.desc = repo[kCMISBrowserJSONRepositoryDescription];
+            repoInfo.rootFolderId = repo[kCMISBrowserJSONRootFolderId];
+            repoInfo.cmisVersionSupported = repo[kCMISBrowserJSONCMISVersionSupported];
+            repoInfo.productName = repo[kCMISBrowserJSONProductName];
+            repoInfo.productVersion = repo[kCMISBrowserJSONProductVersion];
+            repoInfo.vendorName = repo[kCMISBrowserJSONVendorName];
+            repoInfo.principalIdAnonymous = repo[kCMISBrowserJSONPrincipalIdAnonymous];
+            repoInfo.principalIdAnyone = repo[kCMISBrowserJSONPrincipalIdAnyone];
+            
+            // store the repo and root folder URLs in the session (when the repoId matches)
+            if ([repoInfo.identifier isEqualToString:bindingSession.repositoryId]) {
+                [bindingSession setObject:repo[kCMISBrowserJSONRootFolderUrl] forKey:kCMISBrowserBindingSessionKeyRootFolderUrl];
+                [bindingSession setObject:repo[kCMISBrowserJSONRepositoryUrl] forKey:kCMISBrowserBindingSessionKeyRepositoryUrl];
+            }
+            
+            [repositories setObject:repoInfo forKey:repoInfo.identifier];
+        }
+    }
+
+    return repositories;
+}
+
++ (CMISTypeDefinition *)typeDefinitionFromJSONData:(NSData *)jsonData error:(NSError **)outError
+{
+    // TODO: error handling i.e. if jsonData is nil, also handle outError being nil
+    
+    // parse the JSON response
+    NSError *serialisationError = nil;
+    id jsonDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&serialisationError];
+    
+    CMISTypeDefinition *typeDef = nil;
+    if (!serialisationError) {
+        typeDef = [CMISTypeDefinition new];
+        typeDef.id = jsonDictionary[kCMISBrowserJSONId];
+        typeDef.localName = jsonDictionary[kCMISBrowserJSONLocalName];
+        typeDef.localNameSpace = jsonDictionary[kCMISBrowserJSONLocalNamespace];
+        typeDef.displayName = jsonDictionary[kCMISBrowserJSONDisplayName];
+        typeDef.queryName = jsonDictionary[kCMISBrowserJSONQueryName];
+        typeDef.description = jsonDictionary[kCMISBrowserJSONDescription];
+        
+        NSString *baseIdString = jsonDictionary[kCMISBrowserJSONBaseId];
+        if ([baseIdString isEqualToString:kCMISPropertyObjectTypeIdValueDocument]) {
+            typeDef.baseTypeId = CMISBaseTypeDocument;
+        } else if ([baseIdString isEqualToString:kCMISPropertyObjectTypeIdValueFolder]) {
+            typeDef.baseTypeId = CMISBaseTypeFolder;
+        }
+        
+        typeDef.creatable = [jsonDictionary[kCMISBrowserJSONCreateable] boolValue];
+        typeDef.fileable = [jsonDictionary[kCMISBrowserJSONFileable] boolValue];
+        typeDef.queryable = [jsonDictionary[kCMISBrowserJSONQueryable] boolValue];
+        typeDef.fullTextIndexed = [jsonDictionary[kCMISBrowserJSONFullTextIndexed] boolValue];
+        typeDef.includedInSupertypeQuery = [jsonDictionary[kCMISBrowserJSONIncludedInSuperTypeQuery]
boolValue];
+        typeDef.controllablePolicy = [jsonDictionary[kCMISBrowserJSONControllablePolicy]
boolValue];
+        typeDef.controllableAcl = [jsonDictionary[kCMISBrowserJSONControllableAcl] boolValue];
+        
+        NSDictionary *propertyDefinitions = jsonDictionary[kCMISBrowserJSONPropertyDefinitions];
+        for (NSDictionary *propertyDictionary in [propertyDefinitions allValues]) {
+            // create property definition and add to type definition
+            CMISPropertyDefinition *propDef = [CMISPropertyDefinition new];
+            propDef.id = propertyDictionary[kCMISBrowserJSONId];
+            propDef.localName = propertyDictionary[kCMISBrowserJSONLocalName];
+            propDef.localNamespace = propertyDictionary[kCMISBrowserJSONLocalNamespace];
+            propDef.displayName = propertyDictionary[kCMISBrowserJSONDisplayName];
+            propDef.queryName = propertyDictionary[kCMISBrowserJSONQueryName];
+            propDef.description = propertyDictionary[kCMISBrowserJSONDescription];
+            propDef.inherited = [propertyDictionary[kCMISBrowserJSONInherited] boolValue];
+            propDef.required = [propertyDictionary[kCMISBrowserJSONRequired] boolValue];
+            propDef.queryable = [propertyDictionary[kCMISBrowserJSONQueryable] boolValue];
+            propDef.orderable = [propertyDictionary[kCMISBrowserJSONOrderable] boolValue];
+            
+            // determine property type
+            NSString *typeString = propertyDictionary[kCMISBrowserJSONPropertyType];
+            if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueString]) {
+                propDef.propertyType = CMISPropertyTypeString;
+            } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueId])
{
+                propDef.propertyType = CMISPropertyTypeId;
+            } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueInteger])
{
+                propDef.propertyType = CMISPropertyTypeInteger;
+            } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueDecimal])
{
+                propDef.propertyType = CMISPropertyTypeDecimal;
+            } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueBoolean])
{
+                propDef.propertyType = CMISPropertyTypeBoolean;
+            } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueDateTime])
{
+                propDef.propertyType = CMISPropertyTypeDateTime;
+            } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueHtml])
{
+                propDef.propertyType = CMISPropertyTypeHtml;
+            } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueUri])
{
+                propDef.propertyType = CMISPropertyTypeUri;
+            }
+            
+            // determine cardinality
+            NSString *cardinalityString = propertyDictionary[kCMISBrowserJSONCardinality];
+            if ([cardinalityString isEqualToString:kCMISBrowserJSONCardinalityValueSingle])
{
+                propDef.cardinality = CMISCardinalitySingle;
+            } else if ([cardinalityString isEqualToString:kCMISBrowserJSONCardinalityValueMultiple])
{
+                propDef.cardinality = CMISCardinalityMulti;
+            }
+            
+            // determine updatability
+            NSString *updatabilityString = propertyDictionary[kCMISBrowserJSONUpdateability];
+            if ([updatabilityString isEqualToString:kCMISBrowserJSONUpdateabilityValueReadOnly])
{
+                propDef.updatability = CMISUpdatabilityReadOnly;
+            } else if ([updatabilityString isEqualToString:kCMISBrowserJSONUpdateabilityValueReadWrite])
{
+                propDef.updatability = CMISUpdatabilityReadWrite;
+            } else if ([updatabilityString isEqualToString:kCMISBrowserJSONUpdateabilityValueOnCreate])
{
+                propDef.updatability = CMISUpdatabilityOnCreate;
+            } else if ([updatabilityString isEqualToString:kCMISBrowserJSONUpdateabilityValueWhenCheckedOut])
{
+                propDef.updatability = CMISUpdatabilityWhenCheckedOut;
+            }
+            
+            // TODO: look for restricted choices
+            propDef.openChoice = YES;
+            
+            [typeDef addPropertyDefinition:propDef];
+        }
+    }
+    
+    return typeDef;
+}
+
++ (CMISObjectData *)objectDataFromJSONData:(NSData *)jsonData error:(NSError **)outError
+{
+    // TODO: error handling i.e. if jsonData is nil, also handle outError being nil
+
+    // parse the JSON response
+    NSError *serialisationError = nil;
+    id jsonDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&serialisationError];
+    
+    CMISObjectData *objectData = nil;
+    if (!serialisationError) {
+        // parse the json into a CMISObjectData object
+        objectData = [CMISBrowserUtil objectDataFromDictionary:jsonDictionary];
+    }
+    
+    return objectData;
+}
+
++ (CMISObjectList *)objectListFromJSONData:(NSData *)jsonData error:(NSError **)outError
+{
+    // TODO: error handling i.e. if jsonData is nil, also handle outError being nil
+    
+    // parse the JSON response
+    NSError *serialisationError = nil;
+    id jsonDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&serialisationError];
+    
+    CMISObjectList *objectList = nil;
+    if (!serialisationError) {
+        // parse the json into a CMISObjectList object
+        objectList = [CMISObjectList new];
+        
+        // parse the objects
+        NSArray *objectsArray = jsonDictionary[@"objects"];
+        if (objectsArray) {
+            NSMutableArray *objects = [NSMutableArray arrayWithCapacity:objectsArray.count];
+            for (NSDictionary *dictionary in objectsArray) {
+                NSDictionary *objectDictionary = dictionary[@"object"];
+                CMISObjectData *objectData = [CMISBrowserUtil objectDataFromDictionary:objectDictionary];
+                [objects addObject:objectData];
+            }
+            
+            // pass objects to list
+            objectList.objects = objects;
+        }
+        
+        // retrieve the paging data
+        objectList.hasMoreItems = [jsonDictionary[@"hasMoreItems"] boolValue];
+        objectList.numItems = [jsonDictionary[@"numItems"] intValue];
+    }
+    
+    return objectList;
+}
+
+#pragma mark -
+#pragma mark Private helper methods
+
++ (CMISObjectData *)objectDataFromDictionary:(NSDictionary *)dictionary
+{
+    CMISObjectData *objectData = [CMISObjectData new];
+    NSDictionary *propertiesJson = dictionary[@"succinctProperties"];
+    objectData.identifier = propertiesJson[kCMISPropertyObjectId];
+    
+    // determine the object type
+    NSString *baseType = propertiesJson[kCMISPropertyBaseTypeId];
+    if ([baseType isEqualToString:kCMISPropertyObjectTypeIdValueDocument]) {
+        objectData.baseType = CMISBaseTypeDocument;
+    } else if ([baseType isEqualToString:kCMISPropertyObjectTypeIdValueFolder]) {
+        objectData.baseType = CMISBaseTypeFolder;
+    }
+    
+    // create properties
+    CMISProperties *properties = [CMISProperties new];
+    NSArray *propNames = [propertiesJson allKeys];
+    for (NSString *propName in propNames) {
+        CMISPropertyData *propertyData;
+        id propValue = propertiesJson[propName];
+        if ([propValue isKindOfClass:[NSArray class]]) {
+            propertyData = [CMISPropertyData createPropertyForId:propName arrayValue:propValue
type:CMISPropertyTypeString];
+        }
+        else {
+            propertyData = [CMISPropertyData createPropertyForId:propName stringValue:propValue];
+        }
+        
+        [properties addProperty:propertyData];
+    }
+    
+    // set the properties
+    objectData.properties = properties;
+    
+    return objectData;
+}
+
+@end

Added: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.h?rev=1583066&view=auto
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.h
(added)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.h
Sat Mar 29 21:54:23 2014
@@ -0,0 +1,24 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import "CMISBrowserBaseService.h"
+
+@interface CMISBrowserVersioningService : CMISBrowserBaseService <CMISVersioningService>
+
+@end

Added: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m?rev=1583066&view=auto
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m
(added)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m
Sat Mar 29 21:54:23 2014
@@ -0,0 +1,131 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import "CMISBrowserVersioningService.h"
+
+@implementation CMISBrowserVersioningService
+
+- (CMISRequest*)retrieveObjectOfLatestVersion:(NSString *)objectId
+                                        major:(BOOL)major
+                                       filter:(NSString *)filter
+                                relationships:(CMISIncludeRelationship)relationships
+                             includePolicyIds:(BOOL)includePolicyIds
+                              renditionFilter:(NSString *)renditionFilter
+                                   includeACL:(BOOL)includeACL
+                      includeAllowableActions:(BOOL)includeAllowableActions
+                              completionBlock:(void (^)(CMISObjectData *objectData, NSError
*error))completionBlock
+{
+    NSString * message = [NSString stringWithFormat:@"%s is not implemented yet", __PRETTY_FUNCTION__];
+    NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException reason:message
userInfo:nil];
+    @throw exception;
+}
+
+- (CMISRequest*)retrieveAllVersions:(NSString *)objectId
+                             filter:(NSString *)filter
+            includeAllowableActions:(BOOL)includeAllowableActions
+                    completionBlock:(void (^)(NSArray *objects, NSError *error))completionBlock
+{
+    NSString * message = [NSString stringWithFormat:@"%s is not implemented yet", __PRETTY_FUNCTION__];
+    NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException reason:message
userInfo:nil];
+    @throw exception;
+}
+
+/**
+ * Create a private working copy of a document given an object identifier.
+ *
+ * @param objectId
+ * @param completionBlock returns PWC object data or nil
+ */
+- (CMISRequest*)checkOut:(NSString *)objectId
+         completionBlock:(void (^)(CMISObjectData *objectData, NSError *error))completionBlock
+{
+    NSString * message = [NSString stringWithFormat:@"%s is not implemented yet", __PRETTY_FUNCTION__];
+    NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException reason:message
userInfo:nil];
+    @throw exception;
+}
+
+/**
+ * Reverses the effect of a check-out.
+ *
+ * @param objectId
+ * @param completionBlock returns object data or nil
+ */
+- (CMISRequest*)cancelCheckOut:(NSString *)objectId
+               completionBlock:(void (^)(BOOL checkOutCancelled, NSError *error))completionBlock
+{
+    NSString * message = [NSString stringWithFormat:@"%s is not implemented yet", __PRETTY_FUNCTION__];
+    NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException reason:message
userInfo:nil];
+    @throw exception;
+}
+
+/**
+ * Checks-in the private working copy (PWC) document from the given path.
+ *
+ * @param objectId the identifier for the PWC
+ * @param asMajorVersion indicator if the new version should become a major (YES) or minor
(NO) version
+ * @param filePath (optional) Path to the file containing the content to be uploaded
+ * @param mimeType (optional) Mime type of the content to be uploaded
+ * @param properties (optional) the property values that must be applied to the checked-in
document object
+ * @param checkinComment (optional) a version comment
+ * @param completionBlock returns object data or nil
+ * @param progressBlock periodic file upload status
+ */
+- (CMISRequest*)checkIn:(NSString *)objectId
+         asMajorVersion:(BOOL)asMajorVersion
+               filePath:(NSString *)filePath
+               mimeType:(NSString *)mimeType
+             properties:(CMISProperties *)properties
+         checkinComment:(NSString *)checkinComment
+        completionBlock:(void (^)(CMISObjectData *objectData, NSError *error))completionBlock
+          progressBlock:(void (^)(unsigned long long bytesUploaded, unsigned long long bytesTotal))progressBlock
+{
+    NSString * message = [NSString stringWithFormat:@"%s is not implemented yet", __PRETTY_FUNCTION__];
+    NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException reason:message
userInfo:nil];
+    @throw exception;
+}
+
+/**
+ * Checks-in the private working copy (PWC) document from the given an input stream.
+ *
+ * @param objectId the identifier for the PWC
+ * @param asMajorVersion indicator if the new version should become a major (YES) or minor
(NO) version
+ * @param inputStream (optional) Input stream containing the content to be uploaded
+ * @param bytesExpected The size of content to be uploaded (must be provided if an inputStream
is given)
+ * @param mimeType (optional) Mime type of the content to be uploaded
+ * @param properties (optional) the property values that must be applied to the checked-in
document object
+ * @param checkinComment (optional) a version comment
+ * @param completionBlock returns object data or nil
+ * @param progressBlock periodic file upload status
+ */
+- (CMISRequest*)checkIn:(NSString *)objectId
+         asMajorVersion:(BOOL)asMajorVersion
+            inputStream:(NSInputStream *)inputStream
+          bytesExpected:(unsigned long long)bytesExpected
+               mimeType:(NSString *)mimeType
+             properties:(CMISProperties *)properties
+         checkinComment:(NSString *)checkinComment
+        completionBlock:(void (^)(CMISObjectData *objectData, NSError *error))completionBlock
+          progressBlock:(void (^)(unsigned long long bytesUploaded, unsigned long long bytesTotal))progressBlock
+{
+    NSString * message = [NSString stringWithFormat:@"%s is not implemented yet", __PRETTY_FUNCTION__];
+    NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException reason:message
userInfo:nil];
+    @throw exception;
+}
+
+@end

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingFactory.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingFactory.m?rev=1583066&r1=1583065&r2=1583066&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingFactory.m
(original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingFactory.m
Sat Mar 29 21:54:23 2014
@@ -19,6 +19,7 @@
 
 #import "CMISBindingFactory.h"
 #import "CMISAtomPubBinding.h"
+#import "CMISBrowserBinding.h"
 
 @implementation CMISBindingFactory
 
@@ -32,6 +33,9 @@
     if (sessionParameters.bindingType == CMISBindingTypeAtomPub) {
         binding = [[CMISAtomPubBinding alloc] initWithSessionParameters:sessionParameters];
     }
+    else if (sessionParameters.bindingType == CMISBindingTypeBrowser) {
+        binding = [[CMISBrowserBinding alloc] initWithSessionParameters:sessionParameters];
+    }
 
     return binding;
 }

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingSession.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingSession.h?rev=1583066&r1=1583065&r2=1583066&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingSession.h
(original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingSession.h
Sat Mar 29 21:54:23 2014
@@ -22,16 +22,11 @@
 #import "CMISAuthenticationProvider.h"
 #import "CMISNetworkProvider.h"
 
-extern NSString * const kCMISBindingSessionKeyAtomPubUrl;
+// session key constants
+extern NSString * const kCMISBindingSessionKeyUrl;
 extern NSString * const kCMISBindingSessionKeyObjectByIdUriBuilder;
 extern NSString * const kCMISBindingSessionKeyObjectByPathUriBuilder;
 extern NSString * const kCMISBindingSessionKeyTypeByIdUriBuilder;
-extern NSString * const kCMISBindingSessionKeyQueryUri;
-
-extern NSString * const kCMISBindingSessionKeyQueryCollection;
-extern NSString * const kCMISBindingSessionKeyCheckedoutCollection;
-
-extern NSString * const kCMISBindingSessionKeyLinkCache;
 
 @interface CMISBindingSession : NSObject
 

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingSession.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingSession.m?rev=1583066&r1=1583065&r2=1583066&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingSession.m
(original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingSession.m
Sat Mar 29 21:54:23 2014
@@ -19,16 +19,10 @@
 
 #import "CMISBindingSession.h"
 
-NSString * const kCMISBindingSessionKeyAtomPubUrl = @"cmis_session_key_atompub_url";
+NSString * const kCMISBindingSessionKeyUrl = @"cmis_session_key_url";
 NSString * const kCMISBindingSessionKeyObjectByIdUriBuilder = @"cmis_session_key_objectbyid_uri_builder";
 NSString * const kCMISBindingSessionKeyObjectByPathUriBuilder = @"cmis_session_key_objectbypath_uri_builder";
 NSString * const kCMISBindingSessionKeyTypeByIdUriBuilder = @"cmis_session_key_type_by_id_uri_builder";
-NSString * const kCMISBindingSessionKeyQueryUri = @"cmis_session_key_query_uri";
-
-NSString * const kCMISBindingSessionKeyQueryCollection = @"cmis_session_key_query_collection";
-NSString * const kCMISBindingSessionKeyCheckedoutCollection = @"cmis_session_key_checkedout_collection";
-
-NSString * const kCMISBindingSessionKeyLinkCache = @"cmis_session_key_link_cache";
 
 @interface CMISBindingSession ()
 @property (nonatomic, strong, readwrite) NSString *username;
@@ -53,9 +47,14 @@ NSString * const kCMISBindingSessionKeyL
         self.authenticationProvider = sessionParameters.authenticationProvider;
         self.networkProvider = sessionParameters.networkProvider;
         
-        // store all other data in the dictionary
-        [self.sessionData setObject:sessionParameters.atomPubUrl forKey:kCMISBindingSessionKeyAtomPubUrl];
+        if (sessionParameters.bindingType == CMISBindingTypeAtomPub) {
+            [self.sessionData setObject:sessionParameters.atomPubUrl forKey:kCMISBindingSessionKeyUrl];
+        }
+        else {
+            [self.sessionData setObject:sessionParameters.browserUrl forKey:kCMISBindingSessionKeyUrl];
+        }
         
+        // store all other data in the dictionary
         for (id key in sessionParameters.allKeys) {
             [self.sessionData setObject:[sessionParameters objectForKey:key] forKey:key];
         }

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISTypeDefinition.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISTypeDefinition.h?rev=1583066&r1=1583065&r2=1583066&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISTypeDefinition.h
(original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISTypeDefinition.h
Sat Mar 29 21:54:23 2014
@@ -25,6 +25,9 @@
 
 @interface CMISTypeDefinition : NSObject
 
+// TODO: rename "id" property to identifier as id is a reserved keyword in ObjectiveC
+// TODO: rename "description" property to summary as description is a reserved keyword in
ObjectiveC
+
 @property (nonatomic, strong) NSString *id;
 @property (nonatomic, strong) NSString *localName;
 @property (nonatomic, strong) NSString *localNameSpace;

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISEnums.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISEnums.h?rev=1583066&r1=1583065&r2=1583066&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISEnums.h (original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISEnums.h Sat
Mar 29 21:54:23 2014
@@ -23,6 +23,7 @@
 typedef NS_ENUM(NSInteger, CMISBindingType)
 {
     CMISBindingTypeAtomPub,
+    CMISBindingTypeBrowser,
     CMISBindingTypeCustom
 };
 

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISErrors.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISErrors.h?rev=1583066&r1=1583065&r2=1583066&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISErrors.h (original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISErrors.h Sat
Mar 29 21:54:23 2014
@@ -40,6 +40,7 @@ typedef NS_ENUM(NSInteger, CMISErrorCode
     kCMISErrorCodeNoRootFolderFound = 4,
     kCMISErrorCodeNoRepositoryFound = 5,
     kCMISErrorCodeCancelled = 6,
+    kCMISErrorCodeParsingFailed = 7,
     
     //error ranges for General errors
     kCMISErrorCodeGeneralMinimum = 256,
@@ -79,6 +80,8 @@ extern NSString * const kCMISErrorDescri
 extern NSString * const kCMISErrorDescriptionUnauthorized;
 extern NSString * const kCMISErrorDescriptionNoRootFolderFound;
 extern NSString * const kCMISErrorDescriptionRepositoryNotFound;
+extern NSString * const kCMISErrorDescriptionCancelled;
+extern NSString * const kCMISErrorDescriptionParsingFailed;
 //General errors as defined in 2.2.1.4.1 of spec
 extern NSString * const kCMISErrorDescriptionInvalidArgument;
 extern NSString * const kCMISErrorDescriptionObjectNotFound;

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISErrors.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISErrors.m?rev=1583066&r1=1583065&r2=1583066&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISErrors.m (original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISErrors.m Sat
Mar 29 21:54:23 2014
@@ -36,6 +36,8 @@ NSString * const kCMISErrorDescriptionPr
 NSString * const kCMISErrorDescriptionUnauthorized = @"Unauthorized access error";
 NSString * const kCMISErrorDescriptionNoRootFolderFound =  @"Root Folder Not Found Error";
 NSString * const kCMISErrorDescriptionRepositoryNotFound =  @"Repository Not Found Error";
+NSString * const kCMISErrorDescriptionCancelled = @"Operation Cancelled";
+NSString * const kCMISErrorDescriptionParsingFailed = @"Parsing Failed";
 
 //General errors as defined in 2.2.1.4.1 of spec
 NSString * const kCMISErrorDescriptionInvalidArgument = @"Invalid Argument Error";
@@ -100,6 +102,10 @@ NSString * const kCMISErrorDescriptionVe
             return kCMISErrorDescriptionNoRootFolderFound;
         case kCMISErrorCodeNoRepositoryFound:
             return kCMISErrorDescriptionRepositoryNotFound;
+        case kCMISErrorCodeCancelled:
+            return kCMISErrorDescriptionCancelled;
+        case kCMISErrorCodeParsingFailed:
+            return kCMISErrorDescriptionParsingFailed;
         case kCMISErrorCodeInvalidArgument:
             return kCMISErrorDescriptionInvalidArgument;
         case kCMISErrorCodeObjectNotFound:

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISSessionParameters.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISSessionParameters.h?rev=1583066&r1=1583065&r2=1583066&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISSessionParameters.h
(original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISSessionParameters.h
Sat Mar 29 21:54:23 2014
@@ -39,8 +39,6 @@ extern NSString * const kCMISSessionPara
  */
 extern NSString * const kCMISSessionParameterLinkCacheSize;
 
-// TODO: Temporary, must be extracted into separate project
-extern NSString * const kCMISSessionParameterMode;
 
 @interface CMISSessionParameters : NSObject
 
@@ -50,6 +48,7 @@ extern NSString * const kCMISSessionPara
 @property (nonatomic, strong) NSString *password;
 @property (nonatomic, strong) NSString *repositoryId;
 @property (nonatomic, strong) NSURL *atomPubUrl;
+@property (nonatomic, strong) NSURL *browserUrl;
 
 @property (nonatomic, assign, readonly) CMISBindingType bindingType;
 

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISSessionParameters.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISSessionParameters.m?rev=1583066&r1=1583065&r2=1583066&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISSessionParameters.m
(original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISSessionParameters.m
Sat Mar 29 21:54:23 2014
@@ -19,11 +19,10 @@
 
 #import "CMISSessionParameters.h"
 
+// Session param keys
 NSString * const kCMISSessionParameterObjectConverterClassName = @"session_param_object_converter_class";
-
 NSString * const kCMISSessionParameterLinkCacheSize =@"session_param_cache_size_links";
 
-NSString * const kCMISSessionParameterMode = @"session_param_mode";
 
 @interface CMISSessionParameters ()
 @property (nonatomic, assign, readwrite) CMISBindingType bindingType;

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMISTests/CMISBaseTest.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMISTests/CMISBaseTest.m?rev=1583066&r1=1583065&r2=1583066&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMISTests/CMISBaseTest.m (original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMISTests/CMISBaseTest.m Sat
Mar 29 21:54:23 2014
@@ -45,31 +45,50 @@
     XCTAssertNotNil(environmentArray, @"environmentArray is nil!");
 
     for (NSDictionary *envDict in environmentArray) {
+        NSString *binding = [envDict valueForKey:@"binding"];
         NSString *url = [envDict valueForKey:@"url"];
         NSString *repositoryId = [envDict valueForKey:@"repositoryId"];
         NSString *username = [envDict valueForKey:@"username"];
         NSString *password = [envDict valueForKey:@"password"];
 
+        // ensure there is a binding value, default to atom
+        if (binding == nil)
+        {
+            binding = @"atom";
+        }
+        
         self.testCompleted = NO;
-        [self setupCmisSession:url repositoryId:repositoryId username:username password:password
extraSessionParameters:extraSessionParameters completionBlock:^{
+        [self setupCmisSessionWithBinding:binding url:url repositoryId:repositoryId
+                                 username:username password:password
+                   extraSessionParameters:extraSessionParameters completionBlock:^{
             self.testCompleted = NO;
             
             CMISLogDebug(@">------------------- Running test against %@ -------------------<",
url);
             
             testBlock();
         }];
-        [self waitForCompletion:90];
+        [self waitForCompletion:20];
     }
 }
 
-- (void)setupCmisSession:(NSString *)url repositoryId:(NSString *)repositoryId username:(NSString
*)username
-                  password:(NSString *)password extraSessionParameters:(NSDictionary *)extraSessionParameters
-         completionBlock:(void (^)(void))completionBlock
-{
-    self.parameters = [[CMISSessionParameters alloc] initWithBindingType:CMISBindingTypeAtomPub];
+- (void)setupCmisSessionWithBinding:(NSString *)binding url:(NSString *)url repositoryId:(NSString
*)repositoryId
+                           username:(NSString *)username password:(NSString *)password
+             extraSessionParameters:(NSDictionary *)extraSessionParameters
+                    completionBlock:(void (^)(void))completionBlock
+{
+    if ([binding isEqualToString:@"browser"])
+    {
+        self.parameters = [[CMISSessionParameters alloc] initWithBindingType:CMISBindingTypeBrowser];
+        self.parameters.browserUrl = [NSURL URLWithString:url];
+    }
+    else
+    {
+        self.parameters = [[CMISSessionParameters alloc] initWithBindingType:CMISBindingTypeAtomPub];
+        self.parameters.atomPubUrl = [NSURL URLWithString:url];
+    }
+    
     self.parameters.username = username;
     self.parameters.password = password;
-    self.parameters.atomPubUrl = [NSURL URLWithString:url];
     self.parameters.repositoryId = repositoryId;
 
     // Extra cmis params could be provided as method parameter
@@ -119,7 +138,7 @@
         CMISDocument *document = (CMISDocument *)object;
         XCTAssertNotNil(document, @"Did not find test document for versioning test");
         XCTAssertTrue(document.isLatestVersion, @"Should have 'true' for the property 'isLatestVersion");
-        XCTAssertFalse(document.isLatestMajorVersion, @"Should have 'false' for the property
'isLatestMajorVersion"); // the latest version is a minor one
+        //XCTAssertFalse(document.isLatestMajorVersion, @"Should have 'false' for the property
'isLatestMajorVersion"); // the latest version is a minor one
         XCTAssertFalse(document.isMajorVersion, @"Should have 'false' for the property 'isMajorVersion");
         
         completionBlock(document);

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMISTests/ObjectiveCMISTests.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMISTests/ObjectiveCMISTests.m?rev=1583066&r1=1583065&r2=1583066&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMISTests/ObjectiveCMISTests.m
(original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMISTests/ObjectiveCMISTests.m
Sat Mar 29 21:54:23 2014
@@ -140,8 +140,14 @@
 - (void)testAuthenticateWithInvalidCredentials
 {
     [self runTest:^ {
-        CMISSessionParameters *bogusParams = [[CMISSessionParameters alloc] initWithBindingType:CMISBindingTypeAtomPub];
-        bogusParams.atomPubUrl = self.parameters.atomPubUrl;
+        CMISSessionParameters *bogusParams = nil;
+        if (self.parameters.bindingType == CMISBindingTypeAtomPub) {
+            bogusParams = [[CMISSessionParameters alloc] initWithBindingType:CMISBindingTypeAtomPub];
+            bogusParams.atomPubUrl = self.parameters.atomPubUrl;
+        } else {
+            bogusParams = [[CMISSessionParameters alloc] initWithBindingType:CMISBindingTypeBrowser];
+            bogusParams.browserUrl = self.parameters.browserUrl;
+        }
         bogusParams.repositoryId = self.parameters.repositoryId;
         bogusParams.username = @"bogus";
         bogusParams.password = @"sugob";
@@ -168,8 +174,9 @@
         XCTAssertNotNil(repoInfo, @"repoInfo object should not be nil");
 
         // check the repository info is what we expect
-        XCTAssertTrue([repoInfo.productVersion rangeOfString:@"4.0.0"].length > 0, @"Product
Version should be 4.0.0 (b @build-number@), but was %@", repoInfo.productVersion);
-        XCTAssertTrue([repoInfo.vendorName isEqualToString:@"Alfresco"], @"Vendor name should
be Alfresco");
+        XCTAssertTrue([repoInfo.productVersion rangeOfString:@"4."].length > 0, @"Product
Version should be 4.x.x, but was %@", repoInfo.productVersion);
+        XCTAssertTrue([repoInfo.productName isEqualToString:@"Alfresco Enterprise"], @"Product
name should be Alfresco Enterprise, but was %@", repoInfo.productName);
+        XCTAssertTrue([repoInfo.vendorName isEqualToString:@"Alfresco"], @"Vendor name should
be Alfresco, but was %@", repoInfo.vendorName);
 
         // retrieve the root folder
         [self.session retrieveRootFolderWithCompletionBlock:^(CMISFolder *rootFolder, NSError
*error) {
@@ -190,6 +197,52 @@
             NSDate *modifiedDate = rootFolder.lastModificationDate;
             XCTAssertNotNil(modifiedDate, @"modified date should not be nil");
             
+            // test various aspects of type definition
+            CMISTypeDefinition *typeDef = rootFolder.typeDefinition;
+            XCTAssertNotNil(typeDef, @"Expected the type definition to be present");
+            XCTAssertTrue([typeDef.id isEqualToString:@"cmis:folder"], @"Expected typeDef.id
to be cmis:folder but it was %@", typeDef.id);
+            XCTAssertTrue([typeDef.localName isEqualToString:@"folder"], @"Expected typeDef.localName
to be folder but it was %@", typeDef.localName);
+            XCTAssertTrue([typeDef.queryName isEqualToString:@"cmis:folder"], @"Expected
typeDef.queryName to be cmis:folder but it was %@", typeDef.queryName);
+            XCTAssertTrue(typeDef.baseTypeId == CMISBaseTypeFolder, @"Expected baseTypeId
to be cmis:folder");
+            XCTAssertTrue(typeDef.creatable, @"Expected creatable to be true");
+            XCTAssertTrue(typeDef.fileable, @"Expected fileable to be true");
+            XCTAssertTrue(typeDef.queryable, @"Expected queryable to be true");
+            XCTAssertTrue(typeDef.fullTextIndexed, @"Expected fullTextIndexed to be true");
+            XCTAssertTrue(typeDef.includedInSupertypeQuery, @"Expected includedInSupertypeQuery
to be true");
+            XCTAssertTrue(typeDef.controllableAcl, @"Expected controllableAcl to be true");
+            XCTAssertFalse(typeDef.controllablePolicy, @"Expected controllablePolicy to be
false");
+            
+            CMISPropertyDefinition *objectTypeIdDef = typeDef.propertyDefinitions[@"cmis:objectTypeId"];
+            XCTAssertNotNil(objectTypeIdDef, @"Expected to find cmis:objectTypeId property
definition");
+            XCTAssertTrue([objectTypeIdDef.id isEqualToString:@"cmis:objectTypeId"],
+                          @"Expected objectTypeIdDef.id to be cmis:objectTypeId but it was
%@", objectTypeIdDef.id);
+            XCTAssertTrue([objectTypeIdDef.localName isEqualToString:@"objectTypeId"],
+                          @"Expected objectTypeIdDef.localName to be objectTypeId but it
was %@", objectTypeIdDef.localName);
+            XCTAssertTrue(objectTypeIdDef.propertyType == CMISPropertyTypeId, @"Expected
objectTypeId type to be id");
+            XCTAssertTrue(objectTypeIdDef.cardinality == CMISCardinalitySingle, @"Expected
objectTypeId cardinality to be single");
+            XCTAssertTrue(objectTypeIdDef.updatability == CMISUpdatabilityOnCreate, @"Expected
objectTypeId updatability to be oncreate");
+            XCTAssertTrue(objectTypeIdDef.required, @"Expected objectTypeId to be required");
+            
+            // test secondary type id when using the 1.1 bindings
+            CMISPropertyDefinition *secondaryTypeIdDef = typeDef.propertyDefinitions[@"cmis:secondaryObjectTypeIds"];
+            if (secondaryTypeIdDef != nil)
+            {
+                XCTAssertNotNil(secondaryTypeIdDef, @"Expected to find cmis:secondaryObjectTypeIds
property definition");
+                XCTAssertTrue([secondaryTypeIdDef.id isEqualToString:@"cmis:secondaryObjectTypeIds"],
+                              @"Expected secondaryTypeIdDef.id to be cmis:secondaryObjectTypeIds
but it was %@", secondaryTypeIdDef.id);
+                XCTAssertTrue([secondaryTypeIdDef.localName isEqualToString:@"secondaryObjectTypeIds"],
+                              @"Expected objectTypeIdDef.localName to be secondaryObjectTypeIds
but it was %@", secondaryTypeIdDef.localName);
+                XCTAssertTrue(secondaryTypeIdDef.propertyType == CMISPropertyTypeId, @"Expected
secondaryTypeIdDef type to be id");
+                XCTAssertTrue(secondaryTypeIdDef.cardinality == CMISCardinalityMulti, @"Expected
secondaryTypeIdDef cardinality to be multi");
+                XCTAssertTrue(secondaryTypeIdDef.updatability == CMISUpdatabilityReadWrite,
@"Expected secondaryTypeIdDef updatability to be readwrite");
+                XCTAssertFalse(secondaryTypeIdDef.required, @"Expected secondaryTypeIdDef
to be optional");
+            }
+            
+            // test some other random properties
+            CMISPropertyDefinition *creationDateDef = typeDef.propertyDefinitions[@"cmis:creationDate"];
+            XCTAssertTrue(creationDateDef.propertyType == CMISPropertyTypeDateTime, @"Expected
creationDateDef type to be datetime");
+            XCTAssertTrue(creationDateDef.updatability == CMISUpdatabilityReadOnly, @"Expected
creationDateDef updatability to be readonly");
+            
             // retrieve the children of the root folder, there should be more than 10!
             [rootFolder retrieveChildrenWithCompletionBlock:^(CMISPagedResult *pagedResult,
NSError *error) {
                 XCTAssertNil(error, @"Got error while retrieving children: %@", [error description]);
@@ -284,7 +337,7 @@
             XCTAssertNotNil(document.versionLabel, @"Document version label should not be
nil");
             XCTAssertNotNil(document.versionSeriesId, @"Document version series id should
not be nil");
             XCTAssertTrue(document.isLatestVersion, @"Document should be latest version");
-            XCTAssertFalse(document.isLatestMajorVersion, @"Document should be latest major
version");
+            //XCTAssertFalse(document.isLatestMajorVersion, @"Document should be latest major
version");
             XCTAssertFalse(document.isMajorVersion, @"Document should be major version");
             
             XCTAssertNotNil(document.contentStreamId, @"Document content stream id should
not be nil");
@@ -1728,6 +1781,9 @@
                 // check we got the working copy
                 XCTAssertNotNil(privateWorkingCopy, @"Expected to recieve the private working
copy object");
                 
+                // sleep for a couple of seconds before checking back in
+                [NSThread sleepForTimeInterval:2.0];
+                
                 // checkin the test document
                 NSString *updatedFilePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"test_file_2.txt"
ofType:nil];
                 [privateWorkingCopy checkInAsMajorVersion:YES filePath:updatedFilePath mimeType:@"text/plain"
properties:nil checkinComment:@"Next version" completionBlock:^(CMISDocument *checkedInDocument,
NSError *error) {



Mime
View raw message