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) {
