CMIS-786: Implement read support for browser binding
git-svn-id: https://svn.apache.org/repos/asf/chemistry/objectivecmis/branches/browser-binding@1588209 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ObjectiveCMIS.xcodeproj/project.pbxproj b/ObjectiveCMIS.xcodeproj/project.pbxproj
index 0a0bdea..b33c8a0 100644
--- a/ObjectiveCMIS.xcodeproj/project.pbxproj
+++ b/ObjectiveCMIS.xcodeproj/project.pbxproj
@@ -192,8 +192,6 @@
82C1C63F15358733009B7B78 /* CMISAtomPubDiscoveryService.h in Headers */ = {isa = PBXBuildFile; fileRef = 82C1C63F15358733009B7B77 /* CMISAtomPubDiscoveryService.h */; settings = {ATTRIBUTES = (Public, ); }; };
82C1C63F15358733009B7B7E /* CMISAtomCollection.m in Sources */ = {isa = PBXBuildFile; fileRef = 82C1C63F15358733009B7B7D /* CMISAtomCollection.m */; };
82C1C63F15358733009B7B80 /* CMISAtomCollection.h in Headers */ = {isa = PBXBuildFile; fileRef = 82C1C63F15358733009B7B7F /* CMISAtomCollection.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 82C1C63F15358733009B7B86 /* CMISObjectByPathUriBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 82C1C63F15358733009B7B85 /* CMISObjectByPathUriBuilder.m */; };
- 82C1C63F15358733009B7B88 /* CMISObjectByPathUriBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 82C1C63F15358733009B7B87 /* CMISObjectByPathUriBuilder.h */; settings = {ATTRIBUTES = (Public, ); }; };
82C1C63F15358733009B7B93 /* test_file_2.txt in Resources */ = {isa = PBXBuildFile; fileRef = 82C1C63F15358733009B7B92 /* test_file_2.txt */; };
82C1C63F15358733009B7BA1 /* CMISTypeByIdUriBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 82C1C63F15358733009B7BA0 /* CMISTypeByIdUriBuilder.m */; };
82C1C63F15358733009B7BA3 /* CMISTypeByIdUriBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 82C1C63F15358733009B7BA2 /* CMISTypeByIdUriBuilder.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -217,6 +215,16 @@
BD5C9715162C11E3002DDC6E /* CMISHttpResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = BD5C9712162C11E3002DDC6E /* CMISHttpResponse.m */; };
BD70F11B17F4649B00AE2B0C /* CMISDocumentTypeDefinition.h in Headers */ = {isa = PBXBuildFile; fileRef = BD70F11917F4649B00AE2B0C /* CMISDocumentTypeDefinition.h */; };
BD70F11C17F4649B00AE2B0C /* CMISDocumentTypeDefinition.m in Sources */ = {isa = PBXBuildFile; fileRef = BD70F11A17F4649B00AE2B0C /* CMISDocumentTypeDefinition.m */; };
+ C97B945818FE828300EDC1A6 /* CMISObjectByPathUriBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = C97B945618FE828300EDC1A6 /* CMISObjectByPathUriBuilder.h */; };
+ C97B945918FE828300EDC1A6 /* CMISObjectByPathUriBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = C97B945718FE828300EDC1A6 /* CMISObjectByPathUriBuilder.m */; };
+ C97B947818FECA6400EDC1A6 /* CMISFolderTypeDefinition.h in Headers */ = {isa = PBXBuildFile; fileRef = C97B947618FECA6400EDC1A6 /* CMISFolderTypeDefinition.h */; };
+ C97B947918FECA6400EDC1A6 /* CMISFolderTypeDefinition.m in Sources */ = {isa = PBXBuildFile; fileRef = C97B947718FECA6400EDC1A6 /* CMISFolderTypeDefinition.m */; };
+ C97B947C18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.h in Headers */ = {isa = PBXBuildFile; fileRef = C97B947A18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.h */; };
+ C97B947D18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.m in Sources */ = {isa = PBXBuildFile; fileRef = C97B947B18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.m */; };
+ C97B948018FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.h in Headers */ = {isa = PBXBuildFile; fileRef = C97B947E18FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.h */; };
+ C97B948118FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.m in Sources */ = {isa = PBXBuildFile; fileRef = C97B947F18FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.m */; };
+ C97B948418FECD9600EDC1A6 /* CMISItemTypeDefinition.h in Headers */ = {isa = PBXBuildFile; fileRef = C97B948218FECD9600EDC1A6 /* CMISItemTypeDefinition.h */; };
+ C97B948518FECD9600EDC1A6 /* CMISItemTypeDefinition.m in Sources */ = {isa = PBXBuildFile; fileRef = C97B948318FECD9600EDC1A6 /* CMISItemTypeDefinition.m */; };
FE21296415946B94005234FE /* CMISAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 82C1C62A153426E4009B7B3D /* CMISAuthenticationProvider.h */; settings = {ATTRIBUTES = (Public, ); }; };
FE417D5715761A0C009056AA /* CMISOperationContext.h in Headers */ = {isa = PBXBuildFile; fileRef = FE417D5315761A0C009056AA /* CMISOperationContext.h */; settings = {ATTRIBUTES = (Public, ); }; };
FE417D5815761A0C009056AA /* CMISOperationContext.m in Sources */ = {isa = PBXBuildFile; fileRef = FE417D5415761A0C009056AA /* CMISOperationContext.m */; };
@@ -419,8 +427,6 @@
82C1C63F15358733009B7B77 /* CMISAtomPubDiscoveryService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMISAtomPubDiscoveryService.h; sourceTree = "<group>"; };
82C1C63F15358733009B7B7D /* CMISAtomCollection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMISAtomCollection.m; sourceTree = "<group>"; };
82C1C63F15358733009B7B7F /* CMISAtomCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMISAtomCollection.h; sourceTree = "<group>"; };
- 82C1C63F15358733009B7B85 /* CMISObjectByPathUriBuilder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMISObjectByPathUriBuilder.m; sourceTree = "<group>"; };
- 82C1C63F15358733009B7B87 /* CMISObjectByPathUriBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMISObjectByPathUriBuilder.h; sourceTree = "<group>"; };
82C1C63F15358733009B7B92 /* test_file_2.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = test_file_2.txt; sourceTree = "<group>"; };
82C1C63F15358733009B7BA0 /* CMISTypeByIdUriBuilder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMISTypeByIdUriBuilder.m; sourceTree = "<group>"; };
82C1C63F15358733009B7BA2 /* CMISTypeByIdUriBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMISTypeByIdUriBuilder.h; sourceTree = "<group>"; };
@@ -440,6 +446,16 @@
BD5C9712162C11E3002DDC6E /* CMISHttpResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = CMISHttpResponse.m; path = Utils/CMISHttpResponse.m; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
BD70F11917F4649B00AE2B0C /* CMISDocumentTypeDefinition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CMISDocumentTypeDefinition.h; path = Bindings/CMISDocumentTypeDefinition.h; sourceTree = "<group>"; };
BD70F11A17F4649B00AE2B0C /* CMISDocumentTypeDefinition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CMISDocumentTypeDefinition.m; path = Bindings/CMISDocumentTypeDefinition.m; sourceTree = "<group>"; };
+ C97B945618FE828300EDC1A6 /* CMISObjectByPathUriBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMISObjectByPathUriBuilder.h; sourceTree = "<group>"; };
+ C97B945718FE828300EDC1A6 /* CMISObjectByPathUriBuilder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMISObjectByPathUriBuilder.m; sourceTree = "<group>"; };
+ C97B947618FECA6400EDC1A6 /* CMISFolderTypeDefinition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CMISFolderTypeDefinition.h; path = Bindings/CMISFolderTypeDefinition.h; sourceTree = "<group>"; };
+ C97B947718FECA6400EDC1A6 /* CMISFolderTypeDefinition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CMISFolderTypeDefinition.m; path = Bindings/CMISFolderTypeDefinition.m; sourceTree = "<group>"; };
+ C97B947A18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CMISRelationshipTypeDefinition.h; path = Bindings/CMISRelationshipTypeDefinition.h; sourceTree = "<group>"; };
+ C97B947B18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CMISRelationshipTypeDefinition.m; path = Bindings/CMISRelationshipTypeDefinition.m; sourceTree = "<group>"; };
+ C97B947E18FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CMISSecondaryTypeDefinition.h; path = Bindings/CMISSecondaryTypeDefinition.h; sourceTree = "<group>"; };
+ C97B947F18FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CMISSecondaryTypeDefinition.m; path = Bindings/CMISSecondaryTypeDefinition.m; sourceTree = "<group>"; };
+ C97B948218FECD9600EDC1A6 /* CMISItemTypeDefinition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CMISItemTypeDefinition.h; path = Bindings/CMISItemTypeDefinition.h; sourceTree = "<group>"; };
+ C97B948318FECD9600EDC1A6 /* CMISItemTypeDefinition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CMISItemTypeDefinition.m; path = Bindings/CMISItemTypeDefinition.m; sourceTree = "<group>"; };
FE417D5315761A0C009056AA /* CMISOperationContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CMISOperationContext.h; path = Client/CMISOperationContext.h; sourceTree = "<group>"; };
FE417D5415761A0C009056AA /* CMISOperationContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CMISOperationContext.m; path = Client/CMISOperationContext.m; sourceTree = "<group>"; };
FE417D5515761A0C009056AA /* CMISPagedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CMISPagedResult.h; path = Client/CMISPagedResult.h; sourceTree = "<group>"; };
@@ -711,6 +727,14 @@
FE417D6215761A34009056AA /* CMISTypeDefinition.m */,
BD70F11917F4649B00AE2B0C /* CMISDocumentTypeDefinition.h */,
BD70F11A17F4649B00AE2B0C /* CMISDocumentTypeDefinition.m */,
+ C97B947618FECA6400EDC1A6 /* CMISFolderTypeDefinition.h */,
+ C97B947718FECA6400EDC1A6 /* CMISFolderTypeDefinition.m */,
+ C97B947A18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.h */,
+ C97B948218FECD9600EDC1A6 /* CMISItemTypeDefinition.h */,
+ C97B948318FECD9600EDC1A6 /* CMISItemTypeDefinition.m */,
+ C97B947E18FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.h */,
+ C97B947F18FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.m */,
+ C97B947B18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.m */,
8276E158155E392A00344A29 /* CMISVersioningService.h */,
8280730D1515405C00EF635C /* AtomPub */,
58B9C8C918DE335C001D5C1B /* Browser */,
@@ -767,12 +791,12 @@
828073161515405C00EF635C /* CMISAtomPubObjectService.m */,
828073171515405C00EF635C /* CMISAtomPubRepositoryService.h */,
828073181515405C00EF635C /* CMISAtomPubRepositoryService.m */,
- 82C1C63F15358733009B7B42 /* CMISObjectByIdUriBuilder.m */,
- 82C1C63F15358733009B7B44 /* CMISObjectByIdUriBuilder.h */,
- 82C1C63F15358733009B7B87 /* CMISObjectByPathUriBuilder.h */,
- 82C1C63F15358733009B7B85 /* CMISObjectByPathUriBuilder.m */,
82C1C63F15358733009B7B73 /* CMISQueryAtomEntryWriter.h */,
82C1C63F15358733009B7B71 /* CMISQueryAtomEntryWriter.m */,
+ 82C1C63F15358733009B7B44 /* CMISObjectByIdUriBuilder.h */,
+ 82C1C63F15358733009B7B42 /* CMISObjectByIdUriBuilder.m */,
+ C97B945618FE828300EDC1A6 /* CMISObjectByPathUriBuilder.h */,
+ C97B945718FE828300EDC1A6 /* CMISObjectByPathUriBuilder.m */,
82C1C63F15358733009B7BA2 /* CMISTypeByIdUriBuilder.h */,
82C1C63F15358733009B7BA0 /* CMISTypeByIdUriBuilder.m */,
8280730E1515405C00EF635C /* AtomPubParser */,
@@ -855,6 +879,7 @@
82C1C63E15358733009B7B3D /* CMISAtomPubConstants.h in Headers */,
82AD4AEB1541642A0012DDB6 /* CMISBindingFactory.h in Headers */,
82AD4AEF15416A150012DDB6 /* CMISAclService.h in Headers */,
+ C97B948018FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.h in Headers */,
82AD4AF015416A1A0012DDB6 /* CMISObjectService.h in Headers */,
258998DB18D73D5A0091BA96 /* CMISAce.h in Headers */,
58B9C8DA18DE3379001D5C1B /* CMISBrowserNavigationService.h in Headers */,
@@ -879,11 +904,12 @@
8276E15A155E392A00344A29 /* CMISRepositoryService.h in Headers */,
8276E15B155E392A00344A29 /* CMISVersioningService.h in Headers */,
75803D411560BD5300C738C1 /* CMISAtomLink.h in Headers */,
+ C97B947818FECA6400EDC1A6 /* CMISFolderTypeDefinition.h in Headers */,
75803D4F1560CFCB00C738C1 /* CMISLinkRelations.h in Headers */,
82C1C63F15358733009B7B74 /* CMISQueryAtomEntryWriter.h in Headers */,
82C1C63F15358733009B7B78 /* CMISAtomPubDiscoveryService.h in Headers */,
+ C97B945818FE828300EDC1A6 /* CMISObjectByPathUriBuilder.h in Headers */,
82C1C63F15358733009B7B80 /* CMISAtomCollection.h in Headers */,
- 82C1C63F15358733009B7B88 /* CMISObjectByPathUriBuilder.h in Headers */,
4EA61BD71564F70C00C759E4 /* CMISStringInOutParameter.h in Headers */,
4EA61BDA1564F70C00C759E4 /* CMISURLUtil.h in Headers */,
4EA61BE11564F73900C759E4 /* CMISObjectList.h in Headers */,
@@ -916,6 +942,7 @@
BD5C970E16282977002DDC6E /* CMISHttpDownloadRequest.h in Headers */,
58B9C8DE18DE3379001D5C1B /* CMISBrowserRepositoryService.h in Headers */,
58B9C8E018DE3379001D5C1B /* CMISBrowserVersioningService.h in Headers */,
+ C97B948418FECD9600EDC1A6 /* CMISItemTypeDefinition.h in Headers */,
BD5C9713162C11E3002DDC6E /* CMISHttpResponse.h in Headers */,
4E3E14B316AFFB190057CE22 /* CMISNetworkProvider.h in Headers */,
4E10ABFF16B916B500E2287E /* CMISDefaultNetworkProvider.h in Headers */,
@@ -925,6 +952,7 @@
278B269C177BB10B0049C229 /* CMISStandardAuthenticationProvider.h in Headers */,
258998E118D73D900091BA96 /* CMISPrincipal.h in Headers */,
278B269F177BB3000049C229 /* CMISStandardUntrustedSSLAuthenticationProvider.h in Headers */,
+ C97B947C18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.h in Headers */,
BD70F11B17F4649B00AE2B0C /* CMISDocumentTypeDefinition.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -1068,8 +1096,10 @@
8280731D1515405C00EF635C /* CMISAtomEntryParser.m in Sources */,
8280731F1515405C00EF635C /* CMISServiceDocumentParser.m in Sources */,
258998E618D73E1A0091BA96 /* CMISPrincipalParser.m in Sources */,
+ C97B947D18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.m in Sources */,
58B9C8DB18DE3379001D5C1B /* CMISBrowserNavigationService.m in Sources */,
58B9C8D718DE3379001D5C1B /* CMISBrowserBaseService.m in Sources */,
+ C97B948118FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.m in Sources */,
828073211515405C00EF635C /* CMISAtomPubBinding.m in Sources */,
258998DE18D73D5A0091BA96 /* CMISAcl.m in Sources */,
828073231515405C00EF635C /* CMISAtomPubObjectService.m in Sources */,
@@ -1084,6 +1114,7 @@
82AD4AEC1541642A0012DDB6 /* CMISBindingFactory.m in Sources */,
58B9C8E118DE3379001D5C1B /* CMISBrowserVersioningService.m in Sources */,
58B9C90318E588D7001D5C1B /* CMISBrowserConstants.m in Sources */,
+ C97B945918FE828300EDC1A6 /* CMISObjectByPathUriBuilder.m in Sources */,
58B9C8FF18E58028001D5C1B /* CMISBrowserUtil.m in Sources */,
82C1C63F15358733009B7B43 /* CMISObjectByIdUriBuilder.m in Sources */,
82ABA0491554655A00935225 /* CMISBindingSession.m in Sources */,
@@ -1091,6 +1122,7 @@
75C5E2F81559172B0065550A /* CMISAllowableActionsParser.m in Sources */,
75C8D0871559B7EA00B63D2B /* CMISAllowableActions.m in Sources */,
8276E124155E34ED00344A29 /* CMISObjectId.m in Sources */,
+ C97B947918FECA6400EDC1A6 /* CMISFolderTypeDefinition.m in Sources */,
8276E130155E355D00344A29 /* CMISBase64Encoder.m in Sources */,
8276E132155E355D00344A29 /* CMISFileUtil.m in Sources */,
258998D418D73D160091BA96 /* CMISAceParser.m in Sources */,
@@ -1100,7 +1132,6 @@
82C1C63F15358733009B7B76 /* CMISAtomPubDiscoveryService.m in Sources */,
82C1C63F15358733009B7B7E /* CMISAtomCollection.m in Sources */,
58B9C8D918DE3379001D5C1B /* CMISBrowserBinding.m in Sources */,
- 82C1C63F15358733009B7B86 /* CMISObjectByPathUriBuilder.m in Sources */,
4EA61BD81564F70C00C759E4 /* CMISStringInOutParameter.m in Sources */,
258998E218D73D900091BA96 /* CMISPrincipal.m in Sources */,
4EA61BDB1564F70C00C759E4 /* CMISURLUtil.m in Sources */,
@@ -1125,6 +1156,7 @@
FE417D6815761A34009056C2 /* CMISRenditionData.m in Sources */,
FE417D6815761A34009056C6 /* CMISRendition.m in Sources */,
755E7D071586E8C3002CACB0 /* CMISAtomPubExtensionDataParserBase.m in Sources */,
+ C97B948518FECD9600EDC1A6 /* CMISItemTypeDefinition.m in Sources */,
258998DC18D73D5A0091BA96 /* CMISAce.m in Sources */,
58B9C8DD18DE3379001D5C1B /* CMISBrowserObjectService.m in Sources */,
BD5C96FF16281A54002DDC6E /* CMISHttpRequest.m in Sources */,
diff --git a/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubConstants.h b/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubConstants.h
index 26484f3..f5ce991 100644
--- a/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubConstants.h
+++ b/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubConstants.h
@@ -74,31 +74,6 @@
extern NSString * const kCMISLinkRelationNext;
extern NSString * const kCMISLinkRelationWorkingCopy;
-// URL parameters
-extern NSString * const kCMISParameterChangeToken;
-extern NSString * const kCMISParameterOverwriteFlag;
-extern NSString * const kCMISParameterIncludeAllowableActions;
-extern NSString * const kCMISParameterFilter;
-extern NSString * const kCMISParameterMaxItems;
-extern NSString * const kCMISParameterObjectId;
-extern NSString * const kCMISParameterOrderBy;
-extern NSString * const kCMISParameterIncludePathSegment;
-extern NSString * const kCMISParameterIncludeRelationships;
-extern NSString * const kCMISParameterRenditionFilter;
-extern NSString * const kCMISParameterSkipCount;
-extern NSString * const kCMISParameterStreamId;
-extern NSString * const kCMISParameterAllVersions;
-extern NSString * const kCMISParameterContinueOnFailure;
-extern NSString * const kCMISParameterUnfileObjects;
-extern NSString * const kCMISParameterRelativePathSegment;
-extern NSString * const kCMISParameterMajor;
-extern NSString * const kCMISParameterCheckin;
-extern NSString * const kCMISParameterCheckinComment;
-
-// Parameter Values
-extern NSString * const kCMISParameterValueTrue;
-extern NSString * const kCMISParameterValueFalse;
-
// Namespaces
extern NSString * const kCMISNamespaceCmis;
extern NSString * const kCMISNamespaceCmisRestAtom;
diff --git a/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubConstants.m b/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubConstants.m
index 4e4ce30..a4a3898 100644
--- a/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubConstants.m
+++ b/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubConstants.m
@@ -74,31 +74,6 @@
NSString * const kCMISLinkRelationNext = @"next";
NSString * const kCMISLinkRelationWorkingCopy = @"working-copy";
-// Parameters
-NSString * const kCMISParameterChangeToken = @"changeToken";
-NSString * const kCMISParameterOverwriteFlag = @"overwriteFlag";
-NSString * const kCMISParameterIncludeAllowableActions = @"includeAllowableActions";
-NSString * const kCMISParameterFilter = @"filter";
-NSString * const kCMISParameterMaxItems = @"maxItems";
-NSString * const kCMISParameterObjectId = @"objectId";
-NSString * const kCMISParameterOrderBy = @"orderBy";
-NSString * const kCMISParameterIncludePathSegment = @"includePathSegment";
-NSString * const kCMISParameterIncludeRelationships = @"includeRelationships";
-NSString * const kCMISParameterRenditionFilter = @"renditionFilter";
-NSString * const kCMISParameterSkipCount = @"skipCount";
-NSString * const kCMISParameterStreamId = @"streamId";
-NSString * const kCMISParameterAllVersions = @"allVersions";
-NSString * const kCMISParameterContinueOnFailure= @"continueOnFailure";
-NSString * const kCMISParameterUnfileObjects = @"unfileObjects";
-NSString * const kCMISParameterRelativePathSegment = @"includeRelativePathSegment";
-NSString * const kCMISParameterMajor = @"major";
-NSString * const kCMISParameterCheckin = @"checkin";
-NSString * const kCMISParameterCheckinComment = @"checkinComment";
-
-// Parameter Values
-NSString * const kCMISParameterValueTrue = @"true";
-NSString * const kCMISParameterValueFalse = @"false";
-
// Namespaces
NSString * const kCMISNamespaceCmis = @"http://docs.oasis-open.org/ns/cmis/core/200908/";
NSString * const kCMISNamespaceCmisRestAtom = @"http://docs.oasis-open.org/ns/cmis/restatom/200908/";
diff --git a/ObjectiveCMIS/Bindings/AtomPub/CMISObjectByIdUriBuilder.h b/ObjectiveCMIS/Bindings/AtomPub/CMISObjectByIdUriBuilder.h
index 2b1e6e6..efe1aac 100644
--- a/ObjectiveCMIS/Bindings/AtomPub/CMISObjectByIdUriBuilder.h
+++ b/ObjectiveCMIS/Bindings/AtomPub/CMISObjectByIdUriBuilder.h
@@ -21,15 +21,6 @@
#import <Foundation/Foundation.h>
#import "CMISEnums.h"
-
-typedef NS_ENUM(NSInteger, CMISReturnVersion)
-{
- NOT_PROVIDED,
- THIS,
- LATEST,
- LATEST_MAJOR
-};
-
@interface CMISObjectByIdUriBuilder : NSObject
@property (nonatomic, strong) NSString *objectId;
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.h b/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.h
index 1e409d3..4d92e07 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.h
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.h
@@ -27,4 +27,8 @@
- (id)initWithBindingSession:(CMISBindingSession *)session;
+-(NSString *)getObjectUrlObjectId:(NSString *)objectId selector:(NSString *)selector;
+-(NSString *)getObjectUrlByPath:(NSString *)path selector:(NSString *)selector;
+-(NSString *)getRepositoryUrlWithSelector:(NSString *)selector;
+
@end
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.m b/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.m
index c16ff68..f037fa3 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.m
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.m
@@ -18,6 +18,9 @@
*/
#import "CMISBrowserBaseService.h"
+#import "CMISConstants.h"
+#import "CMISBrowserConstants.h"
+#import "CMISURLUtil.h"
@interface CMISBrowserBaseService ()
@property (nonatomic, strong, readwrite) CMISBindingSession *bindingSession;
@@ -36,4 +39,29 @@
return self;
}
+-(NSString *)getObjectUrlObjectId:(NSString *)objectId selector:(NSString *)selector
+{
+ NSString *rootUrl = [self.bindingSession objectForKey:kCMISBrowserBindingSessionKeyRootFolderUrl];
+
+ NSString *objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterObjectId value:objectId urlString:rootUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSelector value:selector urlString:objectUrl];
+ return objectUrl;
+}
+
+-(NSString *)getObjectUrlByPath:(NSString *)path selector:(NSString *)selector
+{
+ NSString *rootUrl = [self.bindingSession objectForKey:kCMISBrowserBindingSessionKeyRootFolderUrl];
+
+ NSString *objectUrl = [CMISURLUtil urlStringByAppendingPath:path urlString:rootUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSelector value:selector urlString:objectUrl];
+ return objectUrl;
+}
+
+-(NSString *)getRepositoryUrlWithSelector:(NSString *)selector
+{
+ NSString *repoUrl = [self.bindingSession objectForKey:kCMISBrowserBindingSessionKeyRepositoryUrl];
+ repoUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSelector value:selector urlString:repoUrl];
+ return repoUrl;
+}
+
@end
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.h b/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.h
index cff7ffd..025baed 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.h
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.h
@@ -46,25 +46,55 @@
extern NSString * const kCMISBrowserJSONQueryName;
extern NSString * const kCMISBrowserJSONDescription;
extern NSString * const kCMISBrowserJSONBaseId;
+extern NSString * const kCMISBrowserJSONParentId;
extern NSString * const kCMISBrowserJSONCreateable;
extern NSString * const kCMISBrowserJSONFileable;
extern NSString * const kCMISBrowserJSONQueryable;
+extern NSString * const kCMISBrowserJSONVersionable; // document
+extern NSString * const kCMISBrowserJSONContentStreamAllowed; // document
+extern NSString * const kCMISBrowserJSONAllowedSourceTypes; // relationship
+extern NSString * const kCMISBrowserJSONAllowedTargetTypes; // relationship
extern NSString * const kCMISBrowserJSONFullTextIndexed;
extern NSString * const kCMISBrowserJSONIncludedInSuperTypeQuery;
extern NSString * const kCMISBrowserJSONControllablePolicy;
extern NSString * const kCMISBrowserJSONControllableAcl;
extern NSString * const kCMISBrowserJSONPropertyDefinitions;
+extern NSString * const kCMISBrowserJSONTypeMutability;
extern NSString * const kCMISBrowserJSONPropertyType;
extern NSString * const kCMISBrowserJSONCardinality;
extern NSString * const kCMISBrowserJSONUpdateability;
extern NSString * const kCMISBrowserJSONInherited;
extern NSString * const kCMISBrowserJSONRequired;
extern NSString * const kCMISBrowserJSONOrderable;
+extern NSString * const kCMISBrowserJSONOpenChoice;
+extern NSString * const kCMISBrowserJSONChoice;
+extern NSString * const kCMISBrowserJSONDefaultValue;
+extern NSString * const kCMISBrowserJSONProperties;
extern NSString * const kCMISBrowserJSONSuccinctProperties;
+extern NSString * const kCMISBrowserJSONPropertiesExtension;
+extern NSString * const kCMISBrowserJSONAllowableActions;
+extern NSString * const kCMISBrowserJSONRelationships;
+extern NSString * const kCMISBrowserJSONChangeEventInfo;
+extern NSString * const kCMISBrowserJSONAcl;
+extern NSString * const kCMISBrowserJSONExactAcl;
+extern NSString * const kCMISBrowserJSONPolicyIds;
+extern NSString * const kCMISBrowserJSONPolicyIdsIds;
+extern NSString * const kCMISBrowserJSONRenditions;
extern NSString * const kCMISBrowserJSONObjects;
extern NSString * const kCMISBrowserJSONObject;
extern NSString * const kCMISBrowserJSONHasMoreItems;
extern NSString * const kCMISBrowserJSONNumberItems;
+extern NSString * const kCMISBrowserJSONThinClientUri;
+extern NSString * const kCMISBrowserJSONChangesIncomplete;
+extern NSString * const kCMISBrowserJSONChangesOnType;
+extern NSString * const kCMISBrowserJSONLatestChangeLogToken;
+extern NSString * const kCMISBrowserJSONAclCapabilities;
+extern NSString * const kCMISBrowserJSONExtendedFeatures;
+extern NSString * const kCMISBrowserJSONMaxLength;
+extern NSString * const kCMISBrowserJSONMinValue;
+extern NSString * const kCMISBrowserJSONMaxValue;
+extern NSString * const kCMISBrowserJSONPrecision;
+extern NSString * const kCMISBrowserJSONResolution;
// JSON enum values
extern NSString * const kCMISBrowserJSONPropertyTypeValueString;
@@ -82,7 +112,44 @@
extern NSString * const kCMISBrowserJSONUpdateabilityValueOnCreate;
extern NSString * const kCMISBrowserJSONUpdateabilityValueWhenCheckedOut;
+//JSON selectors
+extern NSString * const kCMISBrowserJSONSSelectorLastResult;
+extern NSString * const kCMISBrowserJSONSelectorRepositoryInfo;
+extern NSString * const kCMISBrowserJSONSelectorTypeChildren;
+extern NSString * const kCMISBrowserJSONSelectorTypeDescendants;
+extern NSString * const kCMISBrowserJSONSelectorTypeDefinition;
+extern NSString * const kCMISBrowserJSONSelectorContent;
+extern NSString * const kCMISBrowserJSONSelectorObject;
+extern NSString * const kCMISBrowserJSONSelectorProperties;
+extern NSString * const kCMISBrowserJSONSelectorAllowableActions;
+extern NSString * const kCMISBrowserJSONSelectorRenditions;
+extern NSString * const kCMISBrowserJSONSelectorChildren;
+extern NSString * const kCMISBrowserJSONSelectorDescendants;
+extern NSString * const kCMISBrowserJSONSelectorParents;
+extern NSString * const kCMISBrowserJSONSelectorParent;
+extern NSString * const kCMISBrowserJSONSelectorFolderTree;
+extern NSString * const kCMISBrowserJSONSelectorQuery;
+extern NSString * const kCMISBrowserJSONSelectorVersions;
+extern NSString * const kCMISBrowserJSONSelectorRelationships;
+extern NSString * const kCMISBrowserJSONSelectorCheckedout;
+extern NSString * const kCMISBrowserJSONSelectorPolicies;
+extern NSString * const kCMISBrowserJSONSelectorAcl;
+extern NSString * const kCMISBrowserJSONSelectorContentChanges;
+//JSON rendition properties
+extern NSString * const kCMISBrowserJSONRenditionStreamId;
+extern NSString * const kCMISBrowserJSONRenditionMimeType;
+extern NSString * const kCMISBrowserJSONRenditionLength;
+extern NSString * const kCMISBrowserJSONRenditionKind;
+extern NSString * const kCMISBrowserJSONRenditionTitle;
+extern NSString * const kCMISBrowserJSONRenditionHeight;
+extern NSString * const kCMISBrowserJSONRenditionWidth;
+extern NSString * const kCMISBrowserJSONRenditionDocumentId;
++ (NSSet *)objectKeys;
++ (NSSet *)repositoryInfoKeys;
++ (NSSet *)typeKeys;
++ (NSSet *)propertyTypeKeys;
++ (NSSet *)renditionKeys;
@end
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.m b/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.m
index f752b6d..2a29811 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.m
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.m
@@ -19,6 +19,12 @@
#import "CMISBrowserConstants.h"
+static NSSet *_objectKeys;
+static NSSet *_repositoryInfoKeys;
+static NSSet *_typeKeys;
+static NSSet *_propertyTypeKeys;
+static NSSet *_renditionKeys;
+
@implementation CMISBrowserConstants
// Session keys
@@ -46,25 +52,55 @@
NSString * const kCMISBrowserJSONQueryName = @"queryName";
NSString * const kCMISBrowserJSONDescription = @"description";
NSString * const kCMISBrowserJSONBaseId = @"baseId";
+NSString * const kCMISBrowserJSONParentId = @"parentId";
NSString * const kCMISBrowserJSONCreateable = @"creatable";
NSString * const kCMISBrowserJSONFileable = @"fileable";
NSString * const kCMISBrowserJSONQueryable = @"queryable";
+NSString * const kCMISBrowserJSONVersionable = @"versionable"; // document
+NSString * const kCMISBrowserJSONContentStreamAllowed = @"contentStreamAllowed"; // document
+NSString * const kCMISBrowserJSONAllowedSourceTypes = @"allowedSourceTypes"; // relationship
+NSString * const kCMISBrowserJSONAllowedTargetTypes = @"allowedTargetTypes"; // relationship
NSString * const kCMISBrowserJSONFullTextIndexed = @"fulltextIndexed";
NSString * const kCMISBrowserJSONIncludedInSuperTypeQuery = @"includedInSupertypeQuery";
NSString * const kCMISBrowserJSONControllablePolicy = @"controllablePolicy";
NSString * const kCMISBrowserJSONControllableAcl = @"controllableACL";
NSString * const kCMISBrowserJSONPropertyDefinitions = @"propertyDefinitions";
+NSString * const kCMISBrowserJSONTypeMutability = @"typeMutability";
NSString * const kCMISBrowserJSONPropertyType = @"propertyType";
NSString * const kCMISBrowserJSONCardinality = @"cardinality";
NSString * const kCMISBrowserJSONUpdateability = @"updatability";
NSString * const kCMISBrowserJSONInherited = @"inherited";
NSString * const kCMISBrowserJSONRequired = @"required";
NSString * const kCMISBrowserJSONOrderable = @"orderable";
+NSString * const kCMISBrowserJSONOpenChoice = @"openChoice";
+NSString * const kCMISBrowserJSONChoice = @"choice";
+NSString * const kCMISBrowserJSONDefaultValue = @"defaultValue";
+NSString * const kCMISBrowserJSONProperties = @"properties";
NSString * const kCMISBrowserJSONSuccinctProperties = @"succinctProperties";
+NSString * const kCMISBrowserJSONPropertiesExtension = @"propertiesExtension";
+NSString * const kCMISBrowserJSONAllowableActions = @"allowableActions";
+NSString * const kCMISBrowserJSONRelationships = @"relationships";
+NSString * const kCMISBrowserJSONChangeEventInfo = @"changeEventInfo";
+NSString * const kCMISBrowserJSONAcl = @"acl";
+NSString * const kCMISBrowserJSONExactAcl = @"exactACL";
+NSString * const kCMISBrowserJSONPolicyIds = @"policyIds";
+NSString * const kCMISBrowserJSONPolicyIdsIds = @"ids";
+NSString * const kCMISBrowserJSONRenditions = @"renditions";
NSString * const kCMISBrowserJSONObjects = @"objects";
NSString * const kCMISBrowserJSONObject = @"object";
NSString * const kCMISBrowserJSONHasMoreItems = @"hasMoreItems";
NSString * const kCMISBrowserJSONNumberItems = @"numItems";
+NSString * const kCMISBrowserJSONThinClientUri = @"thinClientURI";
+NSString * const kCMISBrowserJSONChangesIncomplete = @"changesIncomplete";
+NSString * const kCMISBrowserJSONChangesOnType = @"changesOnType";
+NSString * const kCMISBrowserJSONLatestChangeLogToken = @"latestChangeLogToken";
+NSString * const kCMISBrowserJSONAclCapabilities = @"aclCapabilities";
+NSString * const kCMISBrowserJSONExtendedFeatures = @"extendedFeatures";
+NSString * const kCMISBrowserJSONMaxLength = @"maxLength";
+NSString * const kCMISBrowserJSONMinValue = @"minValue";
+NSString * const kCMISBrowserJSONMaxValue = @"maxValue";
+NSString * const kCMISBrowserJSONPrecision = @"precision";
+NSString * const kCMISBrowserJSONResolution = @"resolution";
// JSON enum values
NSString * const kCMISBrowserJSONPropertyTypeValueString = @"string";
@@ -84,4 +120,161 @@
NSString * const kCMISBrowserJSONUpdateabilityValueOnCreate = @"oncreate";
NSString * const kCMISBrowserJSONUpdateabilityValueWhenCheckedOut = @"whencheckedout";
+//JSON selectors
+NSString * const kCMISBrowserJSONSSelectorLastResult = @"lastResult";
+NSString * const kCMISBrowserJSONSelectorRepositoryInfo = @"repositoryInfo";
+NSString * const kCMISBrowserJSONSelectorTypeChildren = @"typeChildren";
+NSString * const kCMISBrowserJSONSelectorTypeDescendants = @"typeDescendants";
+NSString * const kCMISBrowserJSONSelectorTypeDefinition = @"typeDefinition";
+NSString * const kCMISBrowserJSONSelectorContent = @"content";
+NSString * const kCMISBrowserJSONSelectorObject = @"object";
+NSString * const kCMISBrowserJSONSelectorProperties = @"properties";
+NSString * const kCMISBrowserJSONSelectorAllowableActions = @"allowableActions";
+NSString * const kCMISBrowserJSONSelectorRenditions = @"renditions";
+NSString * const kCMISBrowserJSONSelectorChildren = @"children";
+NSString * const kCMISBrowserJSONSelectorDescendants = @"descendants";
+NSString * const kCMISBrowserJSONSelectorParents = @"parents";
+NSString * const kCMISBrowserJSONSelectorParent = @"parent";
+NSString * const kCMISBrowserJSONSelectorFolderTree = @"folder";
+NSString * const kCMISBrowserJSONSelectorQuery = @"query";
+NSString * const kCMISBrowserJSONSelectorVersions = @"versions";
+NSString * const kCMISBrowserJSONSelectorRelationships = @"relationships";
+NSString * const kCMISBrowserJSONSelectorCheckedout = @"checkedout";
+NSString * const kCMISBrowserJSONSelectorPolicies = @"policies";
+NSString * const kCMISBrowserJSONSelectorAcl = @"acl";
+NSString * const kCMISBrowserJSONSelectorContentChanges = @"contentChanges";
+
+//JSON rendition properties
+NSString * const kCMISBrowserJSONRenditionStreamId = @"streamId";
+NSString * const kCMISBrowserJSONRenditionMimeType = @"mimeType";
+NSString * const kCMISBrowserJSONRenditionLength = @"length";
+NSString * const kCMISBrowserJSONRenditionKind = @"kind";
+NSString * const kCMISBrowserJSONRenditionTitle = @"title";
+NSString * const kCMISBrowserJSONRenditionHeight = @"height";
+NSString * const kCMISBrowserJSONRenditionWidth = @"width";
+NSString * const kCMISBrowserJSONRenditionDocumentId = @"renditionDocumentId";
+
++(NSSet *)objectKeys
+{
+ if(!_objectKeys) {
+ _objectKeys = [NSSet setWithObjects:
+ kCMISBrowserJSONProperties,
+ kCMISBrowserJSONSuccinctProperties,
+ kCMISBrowserJSONAllowableActions,
+ kCMISBrowserJSONRelationships,
+ kCMISBrowserJSONChangeEventInfo,
+ kCMISBrowserJSONAcl,
+ kCMISBrowserJSONExactAcl,
+ kCMISBrowserJSONPolicyIds,
+ kCMISBrowserJSONRenditions,
+ nil];
+ }
+ return _objectKeys;
+}
+
++ (NSSet *)repositoryInfoKeys
+{
+ if(!_repositoryInfoKeys) {
+ _repositoryInfoKeys = [NSSet setWithObjects:
+ kCMISBrowserJSONRepositoryId,
+ kCMISBrowserJSONRepositoryName,
+ kCMISBrowserJSONRepositoryDescription,
+ kCMISBrowserJSONVendorName,
+ kCMISBrowserJSONProductName,
+ kCMISBrowserJSONProductVersion,
+ kCMISBrowserJSONRootFolderId,
+ kCMISBrowserJSONRepositoryUrl,
+ kCMISBrowserJSONRootFolderUrl,
+ kCMISBrowserJSONCapabilities,
+ kCMISBrowserJSONAclCapabilities,
+ kCMISBrowserJSONLatestChangeLogToken,
+ kCMISBrowserJSONCMISVersionSupported,
+ kCMISBrowserJSONThinClientUri,
+ kCMISBrowserJSONChangesIncomplete,
+ kCMISBrowserJSONChangesOnType,
+ kCMISBrowserJSONPrincipalIdAnonymous,
+ kCMISBrowserJSONPrincipalIdAnyone,
+ kCMISBrowserJSONExtendedFeatures,
+ nil];
+ }
+ return _repositoryInfoKeys;
+}
+
++ (NSSet *)typeKeys
+{
+ if(!_typeKeys) {
+ _typeKeys = [NSSet setWithObjects:
+ kCMISBrowserJSONId,
+ kCMISBrowserJSONLocalName,
+ kCMISBrowserJSONLocalNamespace,
+ kCMISBrowserJSONDisplayName,
+ kCMISBrowserJSONQueryName,
+ kCMISBrowserJSONDescription,
+ kCMISBrowserJSONBaseId,
+ kCMISBrowserJSONParentId,
+ kCMISBrowserJSONCreateable,
+ kCMISBrowserJSONFileable,
+ kCMISBrowserJSONQueryable,
+ kCMISBrowserJSONFullTextIndexed,
+ kCMISBrowserJSONIncludedInSuperTypeQuery,
+ kCMISBrowserJSONControllablePolicy,
+ kCMISBrowserJSONControllableAcl,
+ kCMISBrowserJSONPropertyDefinitions,
+ kCMISBrowserJSONVersionable,
+ kCMISBrowserJSONContentStreamAllowed,
+ kCMISBrowserJSONAllowedSourceTypes,
+ kCMISBrowserJSONAllowedTargetTypes,
+ kCMISBrowserJSONTypeMutability,
+ nil];
+ }
+ return _typeKeys;
+}
+
++ (NSSet *)propertyTypeKeys
+{
+ if(!_propertyTypeKeys) {
+ _propertyTypeKeys = [NSSet setWithObjects:
+ kCMISBrowserJSONId,
+ kCMISBrowserJSONLocalName,
+ kCMISBrowserJSONLocalNamespace,
+ kCMISBrowserJSONDisplayName,
+ kCMISBrowserJSONQueryName,
+ kCMISBrowserJSONDescription,
+ kCMISBrowserJSONPropertyType,
+ kCMISBrowserJSONCardinality,
+ kCMISBrowserJSONUpdateability,
+ kCMISBrowserJSONInherited,
+ kCMISBrowserJSONRequired,
+ kCMISBrowserJSONQueryable,
+ kCMISBrowserJSONOrderable,
+ kCMISBrowserJSONOpenChoice,
+ kCMISBrowserJSONDefaultValue,
+ kCMISBrowserJSONMaxLength,
+ kCMISBrowserJSONMinValue,
+ kCMISBrowserJSONMaxValue,
+ kCMISBrowserJSONPrecision,
+ kCMISBrowserJSONResolution,
+ kCMISBrowserJSONChoice,
+ nil];
+ }
+ return _propertyTypeKeys;
+}
+
++(NSSet *)renditionKeys
+{
+ if(!_renditionKeys) {
+ _renditionKeys = [NSSet setWithObjects:
+ kCMISBrowserJSONRenditionStreamId,
+ kCMISBrowserJSONRenditionMimeType,
+ kCMISBrowserJSONRenditionLength,
+ kCMISBrowserJSONRenditionKind,
+ kCMISBrowserJSONRenditionTitle,
+ kCMISBrowserJSONRenditionHeight,
+ kCMISBrowserJSONRenditionWidth,
+ kCMISBrowserJSONRenditionDocumentId,
+ nil];
+ }
+ return _renditionKeys;
+}
+
@end
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserNavigationService.m b/ObjectiveCMIS/Bindings/Browser/CMISBrowserNavigationService.m
index 2c52d44..00c9d12 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserNavigationService.m
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserNavigationService.m
@@ -23,6 +23,7 @@
#import "CMISConstants.h"
#import "CMISBrowserUtil.h"
#import "CMISBrowserConstants.h"
+#import "CMISURLUtil.h"
@implementation CMISBrowserNavigationService
@@ -37,14 +38,20 @@
maxItems:(NSNumber *)maxItems
completionBlock:(void (^)(CMISObjectList *objectList, NSError *error))completionBlock
{
- // TODO: Use a CMISChildrenByIdUriBuilder class??
- NSString *rootUrl = [self.bindingSession objectForKey:kCMISBrowserBindingSessionKeyRootFolderUrl];
- NSString *urlString = [NSString stringWithFormat:@"%@?objectId=%@&succinct=true&cmisselector=children", rootUrl, objectId];
- NSURL *childrenUrl = [NSURL URLWithString:urlString];
+ NSString *objectUrl = [self getObjectUrlObjectId:objectId selector:kCMISBrowserJSONSelectorChildren];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterFilter value:filter urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterOrderBy value:orderBy urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeAllowableActions boolValue:includeAllowableActions urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeRelationships value:[CMISEnums stringForIncludeRelationShip:relationships] urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterRenditionFilter value:renditionFilter urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludePathSegment boolValue:includePathSegment urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterMaxItems numberValue:maxItems urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSkipCount numberValue:skipCount urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSuccinct value:kCMISParameterValueTrue urlString:objectUrl];
CMISRequest *cmisRequest = [[CMISRequest alloc] init];
- [self.bindingSession.networkProvider invokeGET:childrenUrl
+ [self.bindingSession.networkProvider invokeGET:[NSURL URLWithString:objectUrl]
session:self.bindingSession
cmisRequest:cmisRequest
completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserObjectService.m b/ObjectiveCMIS/Bindings/Browser/CMISBrowserObjectService.m
index 7584764..c7fb39f 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserObjectService.m
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserObjectService.m
@@ -23,6 +23,10 @@
#import "CMISConstants.h"
#import "CMISBrowserUtil.h"
#import "CMISBrowserConstants.h"
+#import "CMISURLUtil.h"
+#import "CMISFileUtil.h"
+#import "CMISErrors.h"
+#import "CMISLog.h"
@implementation CMISBrowserObjectService
@@ -35,28 +39,29 @@
includeAllowableActions:(BOOL)includeAllowableActions
completionBlock:(void (^)(CMISObjectData *objectData, NSError *error))completionBlock
{
- // TODO: Use the CMISObjectByIdUriBuilder class (after it's moved out of AtomPub folder)
- NSString *rootUrl = [self.bindingSession objectForKey:kCMISBrowserBindingSessionKeyRootFolderUrl];
- NSString *urlString = [NSString stringWithFormat:@"%@?objectId=%@&succinct=true&cmisselector=object", rootUrl, objectId];
- NSURL *objectUrl = [NSURL URLWithString:urlString];
+ NSString *objectUrl = [self getObjectUrlObjectId:objectId selector:kCMISBrowserJSONSelectorObject];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterFilter value:filter urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeAllowableActions boolValue:includeAllowableActions urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeRelationships value:[CMISEnums stringForIncludeRelationShip:relationships] urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterRenditionFilter value:renditionFilter urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludePolicyIds boolValue:includePolicyIds urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeAcl boolValue:includeACL urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSuccinct value:kCMISParameterValueTrue urlString:objectUrl];
CMISRequest *cmisRequest = [[CMISRequest alloc] init];
- [self.bindingSession.networkProvider invokeGET:objectUrl
+ [self.bindingSession.networkProvider invokeGET:[NSURL URLWithString:objectUrl]
session:self.bindingSession
cmisRequest:cmisRequest
completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
- if (httpResponse) {
- NSData *data = httpResponse.data;
- if (data) {
- NSError *parsingError = nil;
- CMISObjectData *objectData = [CMISBrowserUtil objectDataFromJSONData:data error:&parsingError];
- if (parsingError)
- {
- completionBlock(nil, parsingError);
- } else {
- completionBlock(objectData, nil);
- }
+ if (httpResponse.statusCode == 200 && httpResponse.data) {
+ NSError *parsingError = nil;
+ CMISObjectData *objectData = [CMISBrowserUtil objectDataFromJSONData:httpResponse.data error:&parsingError];
+ if (parsingError)
+ {
+ completionBlock(nil, parsingError);
+ } else {
+ completionBlock(objectData, nil);
}
} else {
completionBlock(nil, error);
@@ -75,9 +80,36 @@
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;
+ NSString *objectUrl = [self getObjectUrlByPath:path selector:kCMISBrowserJSONSelectorObject];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterFilter value:filter urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeAllowableActions boolValue:includeAllowableActions urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeRelationships value:[CMISEnums stringForIncludeRelationShip:relationships] urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterRenditionFilter value:renditionFilter urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludePolicyIds boolValue:includePolicyIds urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeAcl boolValue:includeACL urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSuccinct value:kCMISParameterValueTrue urlString:objectUrl];
+
+ CMISRequest *cmisRequest = [[CMISRequest alloc] init];
+
+ [self.bindingSession.networkProvider invokeGET:[NSURL URLWithString:objectUrl]
+ session:self.bindingSession
+ cmisRequest:cmisRequest
+ completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
+ if (httpResponse.statusCode == 200 && httpResponse.data) {
+ NSError *parsingError = nil;
+ CMISObjectData *objectData = [CMISBrowserUtil objectDataFromJSONData:httpResponse.data error:&parsingError];
+ if (parsingError)
+ {
+ completionBlock(nil, parsingError);
+ } else {
+ completionBlock(objectData, nil);
+ }
+ } else {
+ completionBlock(nil, error);
+ }
+ }];
+
+ return cmisRequest;
}
- (CMISRequest*)downloadContentOfObject:(NSString *)objectId
@@ -86,9 +118,17 @@
completionBlock:(void (^)(NSError *error))completionBlock
progressBlock:(void (^)(unsigned long long bytesDownloaded, 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;
+ return [self downloadContentOfObject:objectId
+ streamId:streamId
+ toFile:filePath
+ offset:nil
+ length:nil
+ completionBlock:completionBlock
+ progressBlock:^(unsigned long long bytesDownloaded, unsigned long long bytesTotal) {
+ if (progressBlock) {
+ progressBlock(bytesDownloaded, bytesTotal);
+ }
+ }];
}
- (CMISRequest*)downloadContentOfObject:(NSString *)objectId
@@ -99,9 +139,14 @@
completionBlock:(void (^)(NSError *error))completionBlock
progressBlock:(void (^)(unsigned long long bytesDownloaded, 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;
+ NSOutputStream *outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];
+ return [self downloadContentOfObject:objectId
+ streamId:streamId
+ toOutputStream:outputStream
+ offset:offset
+ length:length
+ completionBlock:completionBlock
+ progressBlock:progressBlock];
}
- (CMISRequest*)downloadContentOfObject:(NSString *)objectId
@@ -110,9 +155,17 @@
completionBlock:(void (^)(NSError *error))completionBlock
progressBlock:(void (^)(unsigned long long bytesDownloaded, 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;
+ return [self downloadContentOfObject:objectId
+ streamId:streamId
+ toOutputStream:outputStream
+ offset:nil
+ length:nil
+ completionBlock:completionBlock
+ progressBlock:^(unsigned long long bytesDownloaded, unsigned long long bytesTotal) {
+ if (progressBlock) {
+ progressBlock(bytesDownloaded, bytesTotal);
+ }
+ }];
}
- (CMISRequest*)downloadContentOfObject:(NSString *)objectId
@@ -123,9 +176,32 @@
completionBlock:(void (^)(NSError *error))completionBlock
progressBlock:(void (^)(unsigned long long bytesDownloaded, 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;
+ CMISRequest *request = [[CMISRequest alloc] init];
+
+ NSString *rootUrl = [self.bindingSession objectForKey:kCMISBrowserBindingSessionKeyRootFolderUrl];
+
+ NSString *contentUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterStreamId value:streamId urlString:rootUrl];
+ contentUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterObjectId value:objectId urlString:contentUrl];
+ contentUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSelector value:kCMISBrowserJSONSelectorContent urlString:contentUrl];
+
+ unsigned long long streamLength = 0; //TODO do we need this?
+
+ [self.bindingSession.networkProvider invoke:[NSURL URLWithString:contentUrl]
+ httpMethod:HTTP_GET
+ session:self.bindingSession
+ outputStream:outputStream
+ bytesExpected:streamLength
+ offset:offset
+ length:length
+ cmisRequest:request
+ completionBlock:^(CMISHttpResponse *httpResponse, NSError *error)
+ {
+ if (completionBlock) {
+ completionBlock(error);
+ }
+ } progressBlock:progressBlock];
+
+ return request;
}
- (CMISRequest*)deleteContentOfObject:(CMISStringInOutParameter *)objectIdParam
@@ -172,9 +248,29 @@
completionBlock:(void (^)(NSString *objectId, 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;
+ NSInputStream *inputStream = [NSInputStream inputStreamWithFileAtPath:filePath];
+ if (inputStream == nil) {
+ CMISLogError(@"Could not find file %@", filePath);
+ if (completionBlock) {
+ completionBlock(nil, [CMISErrors createCMISErrorWithCode:kCMISErrorCodeInvalidArgument
+ detailedDescription:@"Invalid file"]);
+ }
+ return nil;
+ }
+
+ NSError *fileError = nil;
+ unsigned long long bytesExpected = [CMISFileUtil fileSizeForFileAtPath:filePath error:&fileError];
+ if (fileError) {
+ CMISLogError(@"Could not determine size of file %@: %@", filePath, [fileError description]);
+ }
+
+ return [self createDocumentFromInputStream:inputStream
+ mimeType:mimeType
+ properties:properties
+ inFolder:folderObjectId
+ bytesExpected:bytesExpected
+ completionBlock:completionBlock
+ progressBlock:progressBlock];
}
- (CMISRequest*)createDocumentFromInputStream:(NSInputStream *)inputStream
@@ -235,9 +331,32 @@
skipCount:(NSNumber *)skipCount
completionBlock:(void (^)(NSArray *renditions, 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;
+ NSString *objectUrl = [self getObjectUrlObjectId:objectId selector:kCMISBrowserJSONSelectorRenditions];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterRenditionFilter value:renditionFilter urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterMaxItems value:[maxItems stringValue] urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSkipCount value:[skipCount stringValue] urlString:objectUrl];
+
+ CMISRequest *cmisRequest = [[CMISRequest alloc] init];
+
+ [self.bindingSession.networkProvider invokeGET:[NSURL URLWithString:objectUrl]
+ session:self.bindingSession
+ cmisRequest:cmisRequest
+ completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
+ if (httpResponse.statusCode == 200 && httpResponse.data) {
+ NSError *parsingError = nil;
+ NSArray *renditions = [CMISBrowserUtil renditionsFromJSONData:httpResponse.data error:&parsingError];
+ if (parsingError)
+ {
+ completionBlock(nil, parsingError);
+ } else {
+ completionBlock(renditions, nil);
+ }
+ } else {
+ completionBlock(nil, error);
+ }
+ }];
+
+ return cmisRequest;
}
@end
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserRepositoryService.m b/ObjectiveCMIS/Bindings/Browser/CMISBrowserRepositoryService.m
index 04067fe..b6f20e9 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserRepositoryService.m
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserRepositoryService.m
@@ -26,7 +26,9 @@
#import "CMISTypeDefinition.h"
#import "CMISPropertyDefinition.h"
#import "CMISBrowserUtil.h"
+#import "CMISConstants.h"
#import "CMISBrowserConstants.h"
+#import "CMISURLUtil.h"
@interface CMISBrowserRepositoryService ()
@property (nonatomic, strong) NSDictionary *repositories;
@@ -90,15 +92,12 @@
- (CMISRequest*)retrieveTypeDefinition:(NSString *)typeId
completionBlock:(void (^)(CMISTypeDefinition *typeDefinition, NSError *error))completionBlock
{
- // TODO: Use the CMISTypeByIdUriBuilder class (after it's moved out of AtomPub folder)
- NSString *repoUrl = [self.bindingSession objectForKey:kCMISBrowserBindingSessionKeyRepositoryUrl];
- NSString *urlString = [NSString stringWithFormat:@"%@?cmisselector=typeDefinition&typeId=%@", repoUrl, typeId];
+ NSString *repoUrl = [self getRepositoryUrlWithSelector:kCMISBrowserJSONSelectorTypeDefinition];
+ repoUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterTypeId value:typeId urlString:repoUrl];
- NSURL *typeUrl = [NSURL URLWithString:urlString];
+ CMISRequest *cmisRequest = [[CMISRequest alloc] init];
- CMISRequest *cmisRequest = [CMISRequest new];
-
- [self.bindingSession.networkProvider invokeGET:typeUrl
+ [self.bindingSession.networkProvider invokeGET:[NSURL URLWithString:repoUrl]
session:self.bindingSession
cmisRequest:cmisRequest
completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.h b/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.h
index 8770b7a..b0070d5 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.h
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.h
@@ -45,4 +45,9 @@
*/
+ (CMISObjectList *)objectListFromJSONData:(NSData *)jsonData error:(NSError **)outError;
+/**
+ Returns an array of CMISRenditionData objects, parsed from the given JSON data.
+ */
++ (NSArray *)renditionsFromJSONData:(NSData *)jsonData error:(NSError **)outError;
+
@end
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m b/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
index b997216..df8f4bb 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
@@ -22,6 +22,13 @@
#import "CMISBrowserConstants.h"
#import "CMISRepositoryInfo.h"
#import "CMISPropertyDefinition.h"
+#import "CMISRenditionData.h"
+#import "CMISDocumentTypeDefinition.h"
+#import "CMISFolderTypeDefinition.h"
+#import "CMISRelationshipTypeDefinition.h"
+#import "CMISItemTypeDefinition.h"
+#import "CMISSecondaryTypeDefinition.h"
+#import "CMISErrors.h"
@implementation CMISBrowserUtil
@@ -44,18 +51,33 @@
repoInfo.identifier = repo[kCMISBrowserJSONRepositoryId];
repoInfo.name = repo[kCMISBrowserJSONRepositoryName];
repoInfo.desc = repo[kCMISBrowserJSONRepositoryDescription];
- repoInfo.rootFolderId = repo[kCMISBrowserJSONRootFolderId];
- repoInfo.cmisVersionSupported = repo[kCMISBrowserJSONCMISVersionSupported];
+ repoInfo.vendorName = repo[kCMISBrowserJSONVendorName];
repoInfo.productName = repo[kCMISBrowserJSONProductName];
repoInfo.productVersion = repo[kCMISBrowserJSONProductVersion];
- repoInfo.vendorName = repo[kCMISBrowserJSONVendorName];
+ repoInfo.rootFolderId = repo[kCMISBrowserJSONRootFolderId];
+ repoInfo.repositoryUrl = repo[kCMISBrowserJSONRepositoryUrl];
+ repoInfo.rootFolderUrl = repo[kCMISBrowserJSONRootFolderUrl];
+
+ repoInfo.repositoryCapabilities = repo[kCMISBrowserJSONCapabilities]; //TODO should be own type instead of dictionary
+ //TOOD aclCapabilities
+ repoInfo.latestChangeLogToken = repo[kCMISBrowserJSONLatestChangeLogToken];
+
+ repoInfo.cmisVersionSupported = repo[kCMISBrowserJSONCMISVersionSupported];
+ repoInfo.thinClientUri = repo[kCMISBrowserJSONThinClientUri];
+
+ //TODO repoInfo.changesIncomplete = repo[kCMISBrowserJSONChangesIncomplete];
+ //TODO changesOnType
+
repoInfo.principalIdAnonymous = repo[kCMISBrowserJSONPrincipalIdAnonymous];
repoInfo.principalIdAnyone = repo[kCMISBrowserJSONPrincipalIdAnyone];
+ //handle extensions
+ repoInfo.extensions = [CMISBrowserUtil convertExtensions:repo cmisKeys:[CMISBrowserConstants repositoryInfoKeys]];
+
// 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];
+ [bindingSession setObject:repoInfo.rootFolderUrl forKey:kCMISBrowserBindingSessionKeyRootFolderUrl];
+ [bindingSession setObject:repoInfo.repositoryUrl forKey:kCMISBrowserBindingSessionKeyRepositoryUrl];
}
[repositories setObject:repoInfo forKey:repoInfo.identifier];
@@ -75,89 +97,80 @@
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;
+ //TODO check for valid baseTypeId (cmis:document, cmis:folder, cmis:relationship, cmis:policy, [cmis:item, cmis:secondary])
+ CMISBaseType baseType = [CMISEnums enumForBaseId:jsonDictionary[kCMISBrowserJSONBaseId]];
+ switch (baseType) {
+ case CMISBaseTypeDocument:
+ typeDef = [CMISDocumentTypeDefinition new];
+ ((CMISDocumentTypeDefinition*)typeDef).contentStreamAllowed = [CMISEnums enumForContentStreamAllowed:jsonDictionary[kCMISBrowserJSONContentStreamAllowed]];
+ ((CMISDocumentTypeDefinition*)typeDef).versionable = [jsonDictionary[kCMISBrowserJSONVersionable] boolValue];
+ break;
+ case CMISBaseTypeFolder:
+ typeDef = [CMISFolderTypeDefinition new];
+ break;
+
+ case CMISBaseTypeRelationship: {
+ typeDef = [CMISRelationshipTypeDefinition new];
+
+ id allowedSourceTypes = jsonDictionary[kCMISBrowserJSONAllowedSourceTypes];
+ if([allowedSourceTypes isKindOfClass:NSArray.class]){
+ NSMutableArray *types = [[NSMutableArray alloc] init];
+ for (id type in allowedSourceTypes) {
+ if(type){
+ [types addObject:type];
+ }
+ }
+ ((CMISRelationshipTypeDefinition*)typeDef).allowedSourceTypes = types;
+ }
+
+ id allowedTargetTypes = jsonDictionary[kCMISBrowserJSONAllowedTargetTypes];
+ if([allowedTargetTypes isKindOfClass:NSArray.class]){
+ NSMutableArray *types = [[NSMutableArray alloc] init];
+ for (id type in allowedTargetTypes) {
+ if(type){
+ [types addObject:type];
+ }
+ }
+ ((CMISRelationshipTypeDefinition*)typeDef).allowedTargetTypes = types;
+ }
+ break;
+ }
+ case CMISBaseTypeItem:
+ typeDef = [CMISItemTypeDefinition new];
+ break;
+ case CMISBaseTypeSecondary:
+ typeDef = [CMISSecondaryTypeDefinition new];
+ break;
+ default:
+ if (outError != NULL) *outError = [CMISErrors createCMISErrorWithCode:kCMISErrorCodeInvalidArgument detailedDescription:[NSString stringWithFormat:@"Type '%@' does not match a base type!", jsonDictionary[kCMISBrowserJSONBaseId]]];
+ return nil;
}
-
- 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.baseTypeId = baseType;
+ typeDef.description = jsonDictionary[kCMISBrowserJSONDescription];
+ typeDef.displayName = jsonDictionary[kCMISBrowserJSONDisplayName];
+ typeDef.id = jsonDictionary[kCMISBrowserJSONId];
typeDef.controllablePolicy = [jsonDictionary[kCMISBrowserJSONControllablePolicy] boolValue];
typeDef.controllableAcl = [jsonDictionary[kCMISBrowserJSONControllableAcl] boolValue];
+ typeDef.creatable = [jsonDictionary[kCMISBrowserJSONCreateable] boolValue];
+ typeDef.fileable = [jsonDictionary[kCMISBrowserJSONFileable] boolValue];
+ typeDef.fullTextIndexed = [jsonDictionary[kCMISBrowserJSONFullTextIndexed] boolValue];
+ typeDef.includedInSupertypeQuery = [jsonDictionary[kCMISBrowserJSONIncludedInSuperTypeQuery] boolValue];
+ typeDef.queryable = [jsonDictionary[kCMISBrowserJSONQueryable] boolValue];
+ typeDef.localName = jsonDictionary[kCMISBrowserJSONLocalName];
+ typeDef.localNameSpace = jsonDictionary[kCMISBrowserJSONLocalNamespace];
+ typeDef.parentTypeId = jsonDictionary[kCMISBrowserJSONParentId];
+ typeDef.queryName = jsonDictionary[kCMISBrowserJSONQueryName];
+
+ //TODO type mutability
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];
+ for (NSDictionary *propertyDefDictionary in [propertyDefinitions allValues]) {
+ [typeDef addPropertyDefinition:[CMISBrowserUtil convertPropertyDefinition:propertyDefDictionary]];
}
+
+ // handle extensions
+ typeDef.extensions = [CMISBrowserUtil convertExtensions:jsonDictionary cmisKeys:[CMISBrowserConstants typeKeys]];
}
return typeDef;
@@ -174,7 +187,7 @@
CMISObjectData *objectData = nil;
if (!serialisationError) {
// parse the json into a CMISObjectData object
- objectData = [CMISBrowserUtil objectDataFromDictionary:jsonDictionary];
+ objectData = [CMISBrowserUtil convertObject:jsonDictionary];
}
return objectData;
@@ -194,34 +207,68 @@
objectList = [CMISObjectList new];
// parse the objects
- NSArray *objectsArray = jsonDictionary[@"objects"];
+ NSArray *objectsArray;
+ if([jsonDictionary isKindOfClass:NSArray.class]){ // is NSArray
+ objectsArray = jsonDictionary;
+
+ objectList.hasMoreItems = NO;
+ objectList.numItems = (int)objectsArray.count;
+ } else { // is NSDictionary
+ objectsArray = jsonDictionary[kCMISBrowserJSONObjects];
+
+ // retrieve the paging data
+ objectList.hasMoreItems = [jsonDictionary[kCMISBrowserJSONHasMoreItems] boolValue];
+ objectList.numItems = [jsonDictionary[kCMISBrowserJSONNumberItems] intValue];
+ }
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];
+ NSDictionary *objectDictionary = dictionary[kCMISBrowserJSONObject];
+ if(!objectDictionary) {
+ objectDictionary = dictionary;
+ }
+ CMISObjectData *objectData = [CMISBrowserUtil convertObject:objectDictionary];
+ if(objectData){
+ [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;
}
++ (NSArray *)renditionsFromJSONData:(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];
+
+ NSArray *renditions = nil;
+ if (!serialisationError) {
+ // parse the json into a CMISObjectData object
+ renditions = [CMISBrowserUtil renditionsFromArray:jsonDictionary];
+ }
+
+ return renditions;
+}
+
#pragma mark -
#pragma mark Private helper methods
-+ (CMISObjectData *)objectDataFromDictionary:(NSDictionary *)dictionary
++ (CMISObjectData *)convertObject:(NSDictionary *)dictionary
{
+ if(!dictionary) {
+ return nil;
+ }
+
CMISObjectData *objectData = [CMISObjectData new];
- NSDictionary *propertiesJson = dictionary[@"succinctProperties"];
+ NSDictionary *propertiesJson = dictionary[kCMISBrowserJSONSuccinctProperties];
objectData.identifier = propertiesJson[kCMISPropertyObjectId];
// determine the object type
@@ -232,6 +279,50 @@
objectData.baseType = CMISBaseTypeFolder;
}
+ // set the properties
+ NSDictionary *propertiesExtension = dictionary[kCMISBrowserJSONPropertiesExtension];
+ objectData.properties = [CMISBrowserUtil convertSuccinctProperties:propertiesJson propertiesExtension:propertiesExtension];
+
+ // relationships
+ NSArray *relationshipsJson = dictionary[kCMISBrowserJSONRelationships];
+ objectData.relationships = [CMISBrowserUtil convertObjects:relationshipsJson];
+
+ //renditions
+ NSArray *renditionsJson = dictionary[kCMISBrowserJSONRenditions];
+ objectData.renditions = [self renditionsFromArray:renditionsJson];
+
+ // handle extensions
+ objectData.extensions = [CMISBrowserUtil convertExtensions:dictionary cmisKeys:[CMISBrowserConstants objectKeys]];
+
+ return objectData;
+}
+
++ (NSArray *)convertObjects:(NSArray *)json
+{
+ if (!json){
+ return nil;
+ }
+
+ NSMutableArray *result = [[NSMutableArray alloc] init];
+ for (id obj in json) {
+ //TODO check if obj is NSDictionary or else abort with error
+ CMISObjectData *relationship = [CMISBrowserUtil convertObject:obj];
+ if(relationship){
+ [result addObject:relationship];
+ }
+ }
+
+ return result;
+}
+
++ (CMISProperties *)convertSuccinctProperties:(NSDictionary *)propertiesJson propertiesExtension:(NSDictionary *)extJson
+{
+ if(!propertiesJson) {
+ return nil;
+ }
+
+ // TODO convert properties according to typeDefinition
+
// create properties
CMISProperties *properties = [CMISProperties new];
NSArray *propNames = [propertiesJson allKeys];
@@ -248,10 +339,177 @@
[properties addProperty:propertyData];
}
- // set the properties
- objectData.properties = properties;
+ if(extJson){
+ properties.extensions = [CMISBrowserUtil convertExtensions:extJson cmisKeys:[NSSet set]];
+ }
- return objectData;
+ return properties;
+}
+
++ (NSArray *)renditionsFromArray:(NSArray *)array
+{
+ if(!array) {
+ return nil;
+ }
+ NSMutableArray *renditions = [[NSMutableArray alloc] initWithCapacity:array.count];
+ for(NSDictionary *renditionJson in array){
+ CMISRenditionData *renditionData = [CMISRenditionData new];
+ renditionData.height = [NSNumber numberWithLongLong:[renditionJson[kCMISBrowserJSONRenditionHeight] longLongValue]];
+ renditionData.kind = renditionJson[kCMISBrowserJSONRenditionKind];
+ renditionData.length = [NSNumber numberWithLongLong:[renditionJson[kCMISBrowserJSONRenditionLength] longLongValue]];
+ renditionData.mimeType = renditionJson[kCMISBrowserJSONRenditionMimeType];
+ renditionData.renditionDocumentId = renditionJson[kCMISBrowserJSONRenditionDocumentId];
+ renditionData.streamId = renditionJson[kCMISBrowserJSONRenditionStreamId];
+ renditionData.title = renditionJson[kCMISBrowserJSONRenditionTitle];
+ renditionData.width = [NSNumber numberWithLongLong:[renditionJson[kCMISBrowserJSONRenditionWidth] longLongValue]];
+
+ // handle extensions
+ renditionData.extensions = [CMISBrowserUtil convertExtensions:renditionJson cmisKeys:[CMISBrowserConstants renditionKeys]];
+
+ [renditions addObject:renditionData];
+ }
+
+ return renditions;
+}
+
++ (CMISPropertyDefinition *)convertPropertyDefinition:(NSDictionary *)propertyDictionary
+{
+ if(!propertyDictionary){
+ return nil;
+ }
+
+ // 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.queryName = propertyDictionary[kCMISBrowserJSONQueryName];
+ propDef.description = propertyDictionary[kCMISBrowserJSONDescription];
+ propDef.displayName = propertyDictionary[kCMISBrowserJSONDisplayName];
+ propDef.inherited = [propertyDictionary[kCMISBrowserJSONInherited] boolValue];
+ propDef.openChoice = [propertyDictionary[kCMISBrowserJSONOpenChoice] boolValue];
+ propDef.orderable = [propertyDictionary[kCMISBrowserJSONOrderable] boolValue];
+ propDef.queryable = [propertyDictionary[kCMISBrowserJSONQueryable] boolValue];
+ propDef.required = [propertyDictionary[kCMISBrowserJSONRequired] 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 default value
+
+ // handle extensions
+ propDef.extensions = [CMISBrowserUtil convertExtensions:propertyDictionary cmisKeys:[CMISBrowserConstants propertyTypeKeys]];
+
+ return propDef;
+}
+
++ (NSArray *)convertExtensions:(NSDictionary *)source cmisKeys:(NSSet *)cmisKeys
+{
+ if (!source) {
+ return nil;
+ }
+
+ NSMutableArray *extensions = nil; // array of CMISExtensionElement's
+
+ for (NSString *key in source.keyEnumerator) {
+ if ([cmisKeys containsObject:key]) {
+ continue;
+ }
+
+ if (!extensions) {
+ extensions = [[NSMutableArray alloc] init];
+ }
+
+ id value = source[key];
+ if ([value isKindOfClass:NSDictionary.class]) {
+ [extensions addObject:[[CMISExtensionElement alloc] initNodeWithName:key namespaceUri:nil attributes:nil children:[CMISBrowserUtil convertExtension:value]]];
+ } else if ([value isKindOfClass:NSArray.class]) {
+ [extensions addObjectsFromArray:[CMISBrowserUtil convertExtension: key fromArray:value]];
+ } else {
+ [extensions addObject:[[CMISExtensionElement alloc] initLeafWithName:key namespaceUri:nil attributes:nil value:value]];
+ }
+ }
+ return extensions;
+}
+
++ (NSArray *)convertExtension:(NSDictionary *)dictionary
+{
+ if (!dictionary) {
+ return nil;
+ }
+
+ NSMutableArray *extensions = [[NSMutableArray alloc] init]; // array of CMISExtensionElement's
+
+ for (NSString *key in dictionary.keyEnumerator) {
+ id value = dictionary[key];
+ if ([value isKindOfClass:NSDictionary.class]) {
+ [extensions addObject:[[CMISExtensionElement alloc] initNodeWithName:key namespaceUri:nil attributes:nil children:[CMISBrowserUtil convertExtension:value]]];
+ } else if ([value isKindOfClass:NSArray.class]) {
+ [extensions addObjectsFromArray:[CMISBrowserUtil convertExtension: key fromArray:value]];
+ } else {
+ [extensions addObject:[[CMISExtensionElement alloc] initLeafWithName:key namespaceUri:nil attributes:nil value:value]];
+ }
+ }
+
+ return extensions;
+}
+
++ (NSArray *)convertExtension:(NSString *)key fromArray:(NSArray *)array
+{
+ if (!array) {
+ return nil;
+ }
+
+ NSMutableArray *extensions = [[NSMutableArray alloc] init]; // array of CMISExtensionElement's
+
+ for (id element in array) {
+ if ([element isKindOfClass:NSDictionary.class]) {
+ [extensions addObject:[[CMISExtensionElement alloc] initNodeWithName:key namespaceUri:nil attributes:nil children:[CMISBrowserUtil convertExtension:element]]];
+ } else if ([element isKindOfClass:NSArray.class]) {
+ [extensions addObjectsFromArray:[CMISBrowserUtil convertExtension: key fromArray:element]];
+ } else {
+ [extensions addObject:[[CMISExtensionElement alloc] initLeafWithName:key namespaceUri:nil attributes:nil value:element]];
+ }
+ }
+
+ return extensions;
}
@end
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m b/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m
index 658d3cd..f04ddc5 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m
@@ -18,6 +18,12 @@
*/
#import "CMISBrowserVersioningService.h"
+#import "CMISRequest.h"
+#import "CMISBrowserConstants.h"
+#import "CMISHttpResponse.h"
+#import "CMISBrowserUtil.h"
+#import "CMISURLUtil.h"
+#import "CMISConstants.h"
@implementation CMISBrowserVersioningService
@@ -31,19 +37,70 @@
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;
+ NSString *objectUrl = [self getObjectUrlObjectId:objectId selector:kCMISBrowserJSONSelectorObject];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterFilter value:filter urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeAllowableActions boolValue:includeAllowableActions urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeRelationships value:[CMISEnums stringForIncludeRelationShip:relationships] urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterRenditionFilter value:renditionFilter urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludePolicyIds boolValue:includePolicyIds urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeAcl boolValue:includeACL urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterReturnVersion value:[CMISEnums stringForReturnVersion:major] urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSuccinct value:kCMISParameterValueTrue urlString:objectUrl];
+
+ CMISRequest *cmisRequest = [[CMISRequest alloc] init];
+
+ [self.bindingSession.networkProvider invokeGET:[NSURL URLWithString:objectUrl]
+ session:self.bindingSession
+ cmisRequest:cmisRequest
+ completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
+ if (httpResponse.statusCode == 200 && httpResponse.data) {
+ NSError *parsingError = nil;
+ CMISObjectData *objectData = [CMISBrowserUtil objectDataFromJSONData:httpResponse.data error:&parsingError];
+ if (parsingError)
+ {
+ completionBlock(nil, parsingError);
+ } else {
+ completionBlock(objectData, nil);
+ }
+ } else {
+ completionBlock(nil, error);
+ }
+ }];
+
+ return cmisRequest;
}
- (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;
+{
+ NSString *objectUrl = [self getObjectUrlObjectId:objectId selector:kCMISBrowserJSONSelectorVersions];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterFilter value:filter urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeAllowableActions value:(includeAllowableActions ? @"true" : @"false") urlString:objectUrl];
+ objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSuccinct value:@"true" urlString:objectUrl];
+
+ CMISRequest *cmisRequest = [[CMISRequest alloc] init];
+
+ [self.bindingSession.networkProvider invokeGET:[NSURL URLWithString:objectUrl]
+ session:self.bindingSession
+ cmisRequest:cmisRequest
+ completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
+ if (httpResponse.statusCode == 200 && httpResponse.data) {
+ NSError *parsingError = nil;
+ CMISObjectList *objectList = [CMISBrowserUtil objectListFromJSONData:httpResponse.data error:&parsingError];
+ if (!objectList.objects)
+ {
+ completionBlock(nil, parsingError);
+ } else {
+ completionBlock(objectList.objects, nil);
+ }
+ } else {
+ completionBlock(nil, error);
+ }
+ }];
+
+ return cmisRequest;
}
/**
diff --git a/ObjectiveCMIS/Bindings/CMISBindingSession.h b/ObjectiveCMIS/Bindings/CMISBindingSession.h
index 68c459f..7551aab 100644
--- a/ObjectiveCMIS/Bindings/CMISBindingSession.h
+++ b/ObjectiveCMIS/Bindings/CMISBindingSession.h
@@ -26,6 +26,7 @@
extern NSString * const kCMISBindingSessionKeyUrl;
extern NSString * const kCMISBindingSessionKeyObjectByIdUriBuilder;
extern NSString * const kCMISBindingSessionKeyObjectByPathUriBuilder;
+extern NSString * const kCMISBindingSessionKeyChildrenByIdUriBuilder;
extern NSString * const kCMISBindingSessionKeyTypeByIdUriBuilder;
@interface CMISBindingSession : NSObject
diff --git a/ObjectiveCMIS/Bindings/CMISBindingSession.m b/ObjectiveCMIS/Bindings/CMISBindingSession.m
index cff188e..87d9005 100644
--- a/ObjectiveCMIS/Bindings/CMISBindingSession.m
+++ b/ObjectiveCMIS/Bindings/CMISBindingSession.m
@@ -22,6 +22,7 @@
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 kCMISBindingSessionKeyChildrenByIdUriBuilder = @"cmis_session_key_childrenbyid_uri_builder";
NSString * const kCMISBindingSessionKeyTypeByIdUriBuilder = @"cmis_session_key_type_by_id_uri_builder";
@interface CMISBindingSession ()
diff --git a/ObjectiveCMIS/Bindings/CMISFolderTypeDefinition.h b/ObjectiveCMIS/Bindings/CMISFolderTypeDefinition.h
new file mode 100644
index 0000000..9d665fb
--- /dev/null
+++ b/ObjectiveCMIS/Bindings/CMISFolderTypeDefinition.h
@@ -0,0 +1,26 @@
+/*
+ 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 <Foundation/Foundation.h>
+#import "CMISEnums.h"
+#import "CMISTypeDefinition.h"
+
+@interface CMISFolderTypeDefinition : CMISTypeDefinition
+
+@end
diff --git a/ObjectiveCMIS/Bindings/CMISFolderTypeDefinition.m b/ObjectiveCMIS/Bindings/CMISFolderTypeDefinition.m
new file mode 100644
index 0000000..9aec7fb
--- /dev/null
+++ b/ObjectiveCMIS/Bindings/CMISFolderTypeDefinition.m
@@ -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 "CMISFolderTypeDefinition.h"
+
+@implementation CMISFolderTypeDefinition
+
+@end
diff --git a/ObjectiveCMIS/Bindings/CMISItemTypeDefinition.h b/ObjectiveCMIS/Bindings/CMISItemTypeDefinition.h
new file mode 100644
index 0000000..ff46af2
--- /dev/null
+++ b/ObjectiveCMIS/Bindings/CMISItemTypeDefinition.h
@@ -0,0 +1,26 @@
+/*
+ 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 <Foundation/Foundation.h>
+#import "CMISEnums.h"
+#import "CMISTypeDefinition.h"
+
+@interface CMISItemTypeDefinition : CMISTypeDefinition
+
+@end
diff --git a/ObjectiveCMIS/Bindings/CMISItemTypeDefinition.m b/ObjectiveCMIS/Bindings/CMISItemTypeDefinition.m
new file mode 100644
index 0000000..9b6ae5b
--- /dev/null
+++ b/ObjectiveCMIS/Bindings/CMISItemTypeDefinition.m
@@ -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 "CMISItemTypeDefinition.h"
+
+@implementation CMISItemTypeDefinition
+
+@end
diff --git a/ObjectiveCMIS/Bindings/CMISPropertyDefinition.h b/ObjectiveCMIS/Bindings/CMISPropertyDefinition.h
index 5164e80..99b8103 100644
--- a/ObjectiveCMIS/Bindings/CMISPropertyDefinition.h
+++ b/ObjectiveCMIS/Bindings/CMISPropertyDefinition.h
@@ -19,10 +19,11 @@
#import <Foundation/Foundation.h>
#import "CMISEnums.h"
+#import "CMISExtensionData.h"
// TODO: type specific properties, see cmis spec line 527
-@interface CMISPropertyDefinition : NSObject
+@interface CMISPropertyDefinition : CMISExtensionData
@property (nonatomic, strong) NSString *id;
diff --git a/ObjectiveCMIS/Bindings/CMISRelationshipTypeDefinition.h b/ObjectiveCMIS/Bindings/CMISRelationshipTypeDefinition.h
new file mode 100644
index 0000000..245bdb8
--- /dev/null
+++ b/ObjectiveCMIS/Bindings/CMISRelationshipTypeDefinition.h
@@ -0,0 +1,29 @@
+/*
+ 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 <Foundation/Foundation.h>
+#import "CMISEnums.h"
+#import "CMISTypeDefinition.h"
+
+@interface CMISRelationshipTypeDefinition : CMISTypeDefinition
+
+@property (nonatomic, strong) NSArray * allowedSourceTypes;
+@property (nonatomic, strong) NSArray * allowedTargetTypes;
+
+@end
diff --git a/ObjectiveCMIS/Bindings/CMISRelationshipTypeDefinition.m b/ObjectiveCMIS/Bindings/CMISRelationshipTypeDefinition.m
new file mode 100644
index 0000000..df39d7f
--- /dev/null
+++ b/ObjectiveCMIS/Bindings/CMISRelationshipTypeDefinition.m
@@ -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 "CMISRelationshipTypeDefinition.h"
+
+@implementation CMISRelationshipTypeDefinition
+
+@end
diff --git a/ObjectiveCMIS/Bindings/CMISRenditionData.h b/ObjectiveCMIS/Bindings/CMISRenditionData.h
index 4d5f7fc..868fc34 100644
--- a/ObjectiveCMIS/Bindings/CMISRenditionData.h
+++ b/ObjectiveCMIS/Bindings/CMISRenditionData.h
@@ -18,9 +18,9 @@
*/
#import <Foundation/Foundation.h>
+#import "CMISExtensionData.h"
-
-@interface CMISRenditionData : NSObject
+@interface CMISRenditionData : CMISExtensionData
/** Identifies the rendition stream. */
@property (nonatomic, strong) NSString *streamId;
diff --git a/ObjectiveCMIS/Bindings/CMISSecondaryTypeDefinition.h b/ObjectiveCMIS/Bindings/CMISSecondaryTypeDefinition.h
new file mode 100644
index 0000000..32174f3
--- /dev/null
+++ b/ObjectiveCMIS/Bindings/CMISSecondaryTypeDefinition.h
@@ -0,0 +1,26 @@
+/*
+ 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 <Foundation/Foundation.h>
+#import "CMISEnums.h"
+#import "CMISTypeDefinition.h"
+
+@interface CMISSecondaryTypeDefinition : CMISTypeDefinition
+
+@end
diff --git a/ObjectiveCMIS/Bindings/CMISSecondaryTypeDefinition.m b/ObjectiveCMIS/Bindings/CMISSecondaryTypeDefinition.m
new file mode 100644
index 0000000..424ad5c
--- /dev/null
+++ b/ObjectiveCMIS/Bindings/CMISSecondaryTypeDefinition.m
@@ -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 "CMISSecondaryTypeDefinition.h"
+
+@implementation CMISSecondaryTypeDefinition
+
+@end
diff --git a/ObjectiveCMIS/Bindings/CMISTypeDefinition.h b/ObjectiveCMIS/Bindings/CMISTypeDefinition.h
index 1a07969..c2446e4 100644
--- a/ObjectiveCMIS/Bindings/CMISTypeDefinition.h
+++ b/ObjectiveCMIS/Bindings/CMISTypeDefinition.h
@@ -19,11 +19,12 @@
#import <Foundation/Foundation.h>
#import "CMISEnums.h"
+#import "CMISExtensionData.h"
@class CMISPropertyDefinition;
-@interface CMISTypeDefinition : NSObject
+@interface CMISTypeDefinition : CMISExtensionData
// 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
@@ -35,6 +36,7 @@
@property (nonatomic, strong) NSString *queryName;
@property (nonatomic, strong) NSString *description;
@property (nonatomic, assign) CMISBaseType baseTypeId;
+@property (nonatomic, strong) NSString *parentTypeId;
@property (nonatomic, assign, getter = isCreatable) BOOL creatable;
@property (nonatomic, assign, getter = isFileable) BOOL fileable;
diff --git a/ObjectiveCMIS/Bindings/CMISTypeDefinition.m b/ObjectiveCMIS/Bindings/CMISTypeDefinition.m
index 8fe5c1a..ac31660 100644
--- a/ObjectiveCMIS/Bindings/CMISTypeDefinition.m
+++ b/ObjectiveCMIS/Bindings/CMISTypeDefinition.m
@@ -47,4 +47,13 @@
return [self.internalPropertyDefinitions objectForKey:propertyId];
}
+-(void)setParentTypeId:(NSString *)parentTypeId
+{
+ if (!parentTypeId || parentTypeId.length == 0) {
+ _parentTypeId = nil;
+ } else {
+ _parentTypeId = parentTypeId;
+ }
+}
+
@end
\ No newline at end of file
diff --git a/ObjectiveCMIS/Common/CMISConstants.h b/ObjectiveCMIS/Common/CMISConstants.h
index 57566d6..09eda93 100644
--- a/ObjectiveCMIS/Common/CMISConstants.h
+++ b/ObjectiveCMIS/Common/CMISConstants.h
@@ -45,7 +45,50 @@
// Property values
extern NSString * const kCMISPropertyObjectTypeIdValueDocument;
extern NSString * const kCMISPropertyObjectTypeIdValueFolder;
+extern NSString * const kCMISPropertyObjectTypeIdValueRelationship;
+extern NSString * const kCMISPropertyObjectTypeIdValuePolicy;
+extern NSString * const kCMISPropertyObjectTypeIdValueItem;
+extern NSString * const kCMISPropertyObjectTypeIdValueSecondary;
// Session cache keys
extern NSString * const kCMISSessionKeyWorkspaces;
+
+// URL parameters
+extern NSString * const kCMISParameterChangeToken;
+extern NSString * const kCMISParameterOverwriteFlag;
+extern NSString * const kCMISParameterIncludeAllowableActions;
+extern NSString * const kCMISParameterFilter;
+extern NSString * const kCMISParameterMaxItems;
+extern NSString * const kCMISParameterObjectId;
+extern NSString * const kCMISParameterOrderBy;
+extern NSString * const kCMISParameterIncludePathSegment;
+extern NSString * const kCMISParameterIncludeRelationships;
+extern NSString * const kCMISParameterIncludePolicyIds;
+extern NSString * const kCMISParameterIncludeAcl;
+extern NSString * const kCMISParameterRenditionFilter;
+extern NSString * const kCMISParameterSkipCount;
+extern NSString * const kCMISParameterStreamId;
+extern NSString * const kCMISParameterAllVersions;
+extern NSString * const kCMISParameterContinueOnFailure;
+extern NSString * const kCMISParameterUnfileObjects;
+extern NSString * const kCMISParameterRelativePathSegment;
+extern NSString * const kCMISParameterMajor;
+extern NSString * const kCMISParameterCheckin;
+extern NSString * const kCMISParameterCheckinComment;
+extern NSString * const kCMISParameterSelector;
+extern NSString * const kCMISParameterSuccinct;
+extern NSString * const kCMISParameterReturnVersion;
+extern NSString * const kCMISParameterTypeId;
+
+// Parameter Values
+extern NSString * const kCMISParameterValueTrue;
+extern NSString * const kCMISParameterValueFalse;
+extern NSString * const kCMISParameterValueReturnValueThis;
+extern NSString * const kCMISParameterValueReturnValueLatest;
+extern NSString * const kCMISParameterValueReturnValueLatestMajor;
+
+//ContentStreamAllowed enum values
+extern NSString * const kCMISContentStreamAllowedValueRequired;
+extern NSString * const kCMISContentStreamAllowedValueAllowed;
+extern NSString * const kCMISContentStreamAllowedValueNotAllowed;
\ No newline at end of file
diff --git a/ObjectiveCMIS/Common/CMISConstants.m b/ObjectiveCMIS/Common/CMISConstants.m
index 18c4d46..a5fa66f 100644
--- a/ObjectiveCMIS/Common/CMISConstants.m
+++ b/ObjectiveCMIS/Common/CMISConstants.m
@@ -49,8 +49,50 @@
NSString * const kCMISPropertyObjectTypeIdValueDocument = @"cmis:document";
NSString * const kCMISPropertyObjectTypeIdValueFolder = @"cmis:folder";
+NSString * const kCMISPropertyObjectTypeIdValueRelationship = @"cmis:relationship";
+NSString * const kCMISPropertyObjectTypeIdValuePolicy = @"cmis:policy";
+NSString * const kCMISPropertyObjectTypeIdValueItem = @"cmis:item";
+NSString * const kCMISPropertyObjectTypeIdValueSecondary = @"cmis:secondary";
// Session cache keys
NSString * const kCMISSessionKeyWorkspaces = @"cmis_session_key_workspaces";
+// Parameters
+NSString * const kCMISParameterChangeToken = @"changeToken";
+NSString * const kCMISParameterOverwriteFlag = @"overwriteFlag";
+NSString * const kCMISParameterIncludeAllowableActions = @"includeAllowableActions";
+NSString * const kCMISParameterFilter = @"filter";
+NSString * const kCMISParameterMaxItems = @"maxItems";
+NSString * const kCMISParameterObjectId = @"objectId";
+NSString * const kCMISParameterOrderBy = @"orderBy";
+NSString * const kCMISParameterIncludePathSegment = @"includePathSegment";
+NSString * const kCMISParameterIncludeRelationships = @"includeRelationships";
+NSString * const kCMISParameterIncludePolicyIds = @"includePolicyIds";
+NSString * const kCMISParameterIncludeAcl = @"includeACL";
+NSString * const kCMISParameterRenditionFilter = @"renditionFilter";
+NSString * const kCMISParameterSkipCount = @"skipCount";
+NSString * const kCMISParameterStreamId = @"streamId";
+NSString * const kCMISParameterAllVersions = @"allVersions";
+NSString * const kCMISParameterContinueOnFailure= @"continueOnFailure";
+NSString * const kCMISParameterUnfileObjects = @"unfileObjects";
+NSString * const kCMISParameterRelativePathSegment = @"includeRelativePathSegment";
+NSString * const kCMISParameterMajor = @"major";
+NSString * const kCMISParameterCheckin = @"checkin";
+NSString * const kCMISParameterCheckinComment = @"checkinComment";
+NSString * const kCMISParameterSelector = @"cmisselector";
+NSString * const kCMISParameterSuccinct = @"succinct";
+NSString * const kCMISParameterReturnVersion = @"returnVersion";
+NSString * const kCMISParameterTypeId = @"typeId";
+
+// Parameter Values
+NSString * const kCMISParameterValueTrue = @"true";
+NSString * const kCMISParameterValueFalse = @"false";
+NSString * const kCMISParameterValueReturnValueThis = @"this";
+NSString * const kCMISParameterValueReturnValueLatest = @"latest";
+NSString * const kCMISParameterValueReturnValueLatestMajor = @"latestmajor";
+
+//ContentStreamAllowed enum values
+NSString * const kCMISContentStreamAllowedValueRequired = @"required";
+NSString * const kCMISContentStreamAllowedValueAllowed = @"allowed";
+NSString * const kCMISContentStreamAllowedValueNotAllowed = @"notallowed";
diff --git a/ObjectiveCMIS/Common/CMISEnums.h b/ObjectiveCMIS/Common/CMISEnums.h
index 2a81cab..566021e 100644
--- a/ObjectiveCMIS/Common/CMISEnums.h
+++ b/ObjectiveCMIS/Common/CMISEnums.h
@@ -30,10 +30,13 @@
// Base type
typedef NS_ENUM(NSInteger, CMISBaseType)
{
+ CMISBaseTypeUnknown,
CMISBaseTypeDocument,
CMISBaseTypeFolder,
CMISBaseTypeRelationship,
- CMISBaseTypePolicy
+ CMISBaseTypePolicy,
+ CMISBaseTypeItem,
+ CMISBaseTypeSecondary
};
typedef NS_ENUM(NSInteger, CMISIncludeRelationship)
@@ -141,12 +144,25 @@
{
CMISContentStreamNotAllowed,
CMISContentStreamAllowed,
- CMISContentStreamRequired
+ CMISContentStreamRequired,
+ CMISContentStreamUnknown
+};
+
+// ReturnVersion
+typedef NS_ENUM(NSInteger, CMISReturnVersion)
+{
+ NOT_PROVIDED,
+ THIS,
+ LATEST,
+ LATEST_MAJOR
};
@interface CMISEnums : NSObject
+ (NSString *)stringForIncludeRelationShip:(CMISIncludeRelationship)includeRelationship;
+ (NSString *)stringForUnfileObject:(CMISUnfileObject)unfileObject;
++ (NSString *)stringForReturnVersion:(BOOL)major;
++ (CMISBaseType)enumForBaseId:(NSString *)baseId;
++ (CMISContentStreamAllowedType)enumForContentStreamAllowed:(NSString *)contentStreamAllowed;
@end
\ No newline at end of file
diff --git a/ObjectiveCMIS/Common/CMISEnums.m b/ObjectiveCMIS/Common/CMISEnums.m
index 305b19b..c41c509 100644
--- a/ObjectiveCMIS/Common/CMISEnums.m
+++ b/ObjectiveCMIS/Common/CMISEnums.m
@@ -19,6 +19,7 @@
#import "CMISEnums.h"
#import "CMISLog.h"
+#import "CMISConstants.h"
@implementation CMISEnums
@@ -65,4 +66,41 @@
return unfileObjectString;
}
++ (NSString *)stringForReturnVersion:(BOOL)major
+{
+ return major == NO ? kCMISParameterValueReturnValueLatest : kCMISParameterValueReturnValueLatestMajor;
+}
+
++ (CMISBaseType)enumForBaseId:(NSString *)baseId
+{
+ if([kCMISPropertyObjectTypeIdValueDocument isEqualToString:baseId]) {
+ return CMISBaseTypeDocument;
+ } else if([kCMISPropertyObjectTypeIdValueFolder isEqualToString:baseId]) {
+ return CMISBaseTypeFolder;
+ } else if([kCMISPropertyObjectTypeIdValueRelationship isEqualToString:baseId]) {
+ return CMISBaseTypeRelationship;
+ } else if([kCMISPropertyObjectTypeIdValuePolicy isEqualToString:baseId]) {
+ return CMISBaseTypePolicy;
+ } else if([kCMISPropertyObjectTypeIdValueItem isEqualToString:baseId]) {
+ return CMISBaseTypeItem;
+ } else if([kCMISPropertyObjectTypeIdValueSecondary isEqualToString:baseId]) {
+ return CMISBaseTypeSecondary;
+ } else {
+ return CMISBaseTypeUnknown;
+ }
+}
+
++ (CMISContentStreamAllowedType)enumForContentStreamAllowed:(NSString *)contentStreamAllowed
+{
+ if([kCMISContentStreamAllowedValueAllowed isEqualToString:contentStreamAllowed]) {
+ return CMISContentStreamAllowed;
+ } else if([kCMISContentStreamAllowedValueNotAllowed isEqualToString:contentStreamAllowed]) {
+ return CMISContentStreamNotAllowed;
+ } else if([kCMISContentStreamAllowedValueRequired isEqualToString:contentStreamAllowed]) {
+ return CMISContentStreamRequired;
+ } else {
+ return CMISContentStreamUnknown;
+ }
+}
+
@end
\ No newline at end of file
diff --git a/ObjectiveCMIS/Common/CMISObjectData.h b/ObjectiveCMIS/Common/CMISObjectData.h
index de589c9..f16161b 100644
--- a/ObjectiveCMIS/Common/CMISObjectData.h
+++ b/ObjectiveCMIS/Common/CMISObjectData.h
@@ -37,5 +37,6 @@
@property (nonatomic, strong) CMISAllowableActions *allowableActions;
@property (nonatomic, strong) CMISAcl *acl;
@property (nonatomic, strong) NSArray *renditions; // An array containing CMISRenditionData objects
+@property (nonatomic, strong) NSArray *relationships; // An array containing CMISObjectData objects; Relationships from and to this object.
@end
diff --git a/ObjectiveCMIS/Common/CMISRepositoryInfo.h b/ObjectiveCMIS/Common/CMISRepositoryInfo.h
index f94897a..02f9b05 100644
--- a/ObjectiveCMIS/Common/CMISRepositoryInfo.h
+++ b/ObjectiveCMIS/Common/CMISRepositoryInfo.h
@@ -26,11 +26,15 @@
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *desc;
@property (nonatomic, strong) NSString *rootFolderId;
+@property (nonatomic, strong) NSString *rootFolderUrl;
+@property (nonatomic, strong) NSString *repositoryUrl;
@property (nonatomic, strong) NSString *cmisVersionSupported;
@property (nonatomic, strong) NSString *productName;
@property (nonatomic, strong) NSString *productVersion;
@property (nonatomic, strong) NSString *vendorName;
+@property (nonatomic, strong) NSString *thinClientUri;
+@property (nonatomic, strong) NSString *latestChangeLogToken;
/**
* Returns principal ID for an anonymous user (any authenticated user). This
diff --git a/ObjectiveCMIS/Utils/CMISURLUtil.h b/ObjectiveCMIS/Utils/CMISURLUtil.h
index 78fe684..6551467 100644
--- a/ObjectiveCMIS/Utils/CMISURLUtil.h
+++ b/ObjectiveCMIS/Utils/CMISURLUtil.h
@@ -21,8 +21,15 @@
@interface CMISURLUtil : NSObject
-/// utility method to obtain a URL string
+/// utility method to obtain a URL string for given parameter and string value
+ (NSString *)urlStringByAppendingParameter:(NSString *)parameterName value:(NSString *)parameterValue urlString:(NSString *)urlString;
+/// convenient utility method to obtain a URL string for given parameter and boolean value
++ (NSString *)urlStringByAppendingParameter:(NSString *)parameterName boolValue:(BOOL)parameterValue urlString:(NSString *)urlString;
+/// convenient utility method to obtain a URL string for given parameter and boolean value
++ (NSString *)urlStringByAppendingParameter:(NSString *)parameterName numberValue:(NSNumber *)parameterValue urlString:(NSString *)urlString;
+/// utility method to obtain a URL string by appending the given path
++ (NSString *)urlStringByAppendingPath:(NSString *)path urlString:(NSString *)urlString;
+
/// utility method to obtain a URL string
+ (NSURL *)urlStringByAppendingParameter:(NSString *)parameterName value:(NSString *)parameterValue url:(NSURL *)url;
diff --git a/ObjectiveCMIS/Utils/CMISURLUtil.m b/ObjectiveCMIS/Utils/CMISURLUtil.m
index 68b0594..69eaf4d 100644
--- a/ObjectiveCMIS/Utils/CMISURLUtil.m
+++ b/ObjectiveCMIS/Utils/CMISURLUtil.m
@@ -18,10 +18,21 @@
*/
#import "CMISURLUtil.h"
+#import "CMISConstants.h"
@implementation CMISURLUtil
++ (NSString *)urlStringByAppendingParameter:(NSString *)parameterName boolValue:(BOOL)parameterValue urlString:(NSString *)urlString
+{
+ return [CMISURLUtil urlStringByAppendingParameter:parameterName value:parameterValue ? kCMISParameterValueTrue : kCMISParameterValueFalse urlString:urlString];
+}
+
++ (NSString *)urlStringByAppendingParameter:(NSString *)parameterName numberValue:(NSNumber *)parameterValue urlString:(NSString *)urlString
+{
+ return [CMISURLUtil urlStringByAppendingParameter:parameterName value:[parameterValue stringValue] urlString:urlString];
+}
+
+ (NSString *)urlStringByAppendingParameter:(NSString *)parameterName value:(NSString *)parameterValue urlString:(NSString *)urlString
{
if (parameterName == nil || parameterValue == nil) {
@@ -34,7 +45,9 @@
if ([result rangeOfString:@"?"].location == NSNotFound) {
[result appendString:@"?"];
} else {
- [result appendString:@"&"];
+ if([result rangeOfString:@"?"].location != result.length -1){ // Only add ampersand if there is already a parameter added
+ [result appendString:@"&"];
+ }
}
// Append param
@@ -45,6 +58,13 @@
return result;
}
++ (NSString *)urlStringByAppendingPath:(NSString *)path urlString:(NSString *)urlString
+{
+ NSURL *url = [[NSURL URLWithString:urlString] URLByAppendingPathComponent:path];
+
+ return [url absoluteString];
+}
+
+ (NSURL *)urlStringByAppendingParameter:(NSString *)parameterName value:(NSString *)parameterValue url:(NSURL *)url
{
return [NSURL URLWithString:[CMISURLUtil urlStringByAppendingParameter:parameterName value:parameterValue urlString:[url absoluteString]]];
diff --git a/ObjectiveCMISTests/ObjectiveCMISTests.m b/ObjectiveCMISTests/ObjectiveCMISTests.m
index 1cdbb00..2dfd098 100644
--- a/ObjectiveCMISTests/ObjectiveCMISTests.m
+++ b/ObjectiveCMISTests/ObjectiveCMISTests.m
@@ -42,6 +42,7 @@
#import "CMISErrors.h"
#import "CMISDateUtil.h"
#import "CMISLog.h"
+#import "CMISURLUtil.h"
@interface ObjectiveCMISTests ()
@@ -295,22 +296,22 @@
}
- // Bug on Alfresco server. Uncomment when fixed.
// Fetch third page, just to be sure
- // CMISPagedResult *thirdPageResult = [secondPageResult fetchNextPageAndReturnError:&error];
- // STAssertNil(error, @"Got error while retrieving children: %@", [error description]);
- // STAssertTrue(thirdPageResult.hasMoreItems, @"There should still be more children");
- // STAssertTrue(thirdPageResult.numItems > 6, @"The test repository should have more than 6 objects");
- // STAssertTrue(thirdPageResult.resultArray.count == 2, @"Expected 2 children in the page, but got %d", thirdPageResult.resultArray.count);
- //
- // // Verify if no double object ids were found
- // for (CMISObject *object in thirdPageResult.resultArray)
- // {
- // STAssertTrue(![objectIds containsObject:object.identifier], @"Object was already returned in a previous page. This is a serious impl bug!");
- // [objectIds addObject:object.identifier];
- // }
+ [secondPageResult fetchNextPageWithCompletionBlock:^(CMISPagedResult *thirdPageResult, NSError *error) {
+ XCTAssertNil(error, @"Got error while retrieving children: %@", [error description]);
+ XCTAssertTrue(thirdPageResult.hasMoreItems, @"There should still be more children");
+ XCTAssertTrue(thirdPageResult.numItems > 6, @"The test repository should have more than 6 objects");
+ XCTAssertTrue(thirdPageResult.resultArray.count == 2, @"Expected 2 children in the page, but got %lu", (unsigned long)thirdPageResult.resultArray.count);
- self.testCompleted = YES;
+ // Verify if no double object ids were found
+ for (CMISObject *object in thirdPageResult.resultArray)
+ {
+ XCTAssertTrue(![objectIds containsObject:object.identifier], @"Object was already returned in a previous page. This is a serious impl bug!");
+ [objectIds addObject:object.identifier];
+ }
+
+ self.testCompleted = YES;
+ }];
}];
}];
}];
@@ -338,7 +339,7 @@
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.isMajorVersion, @"Document should be major version");
+ XCTAssertFalse(document.isMajorVersion, @"Document should not be major version");
XCTAssertNotNil(document.contentStreamId, @"Document content stream id should not be nil");
XCTAssertNotNil(document.contentStreamFileName, @"Document content stream file name should not be nil");
@@ -1879,4 +1880,53 @@
}];
}
+-(void)testUrlUtilAppendParameter
+{
+ NSString *path;
+
+ path = [CMISURLUtil urlStringByAppendingParameter:@"param1" value:@"value1" urlString:@"scheme://host:12345/path?"];
+ XCTAssertEqualObjects(path, @"scheme://host:12345/path?param1=value1", @"expected url with with one parameter and it's value");
+
+ path = [CMISURLUtil urlStringByAppendingParameter:@"param1" value:@"value1" urlString:@"scheme://host:12345/path"];
+ XCTAssertEqualObjects(path, @"scheme://host:12345/path?param1=value1", @"expected url with with one parameter and it's value");
+
+ path = [CMISURLUtil urlStringByAppendingParameter:@"param2" value:@"value2" urlString:@"scheme://host:12345/path?param1=value1"];
+ XCTAssertEqualObjects(path, @"scheme://host:12345/path?param1=value1¶m2=value2", @"expected url with with two parameters plus value");
+
+ path = [CMISURLUtil urlStringByAppendingParameter:@"umlautParam" value:@"välüe1" urlString:@"scheme://host:12345/path"];
+ XCTAssertEqualObjects(path, @"scheme://host:12345/path?umlautParam=v%C3%A4l%C3%BCe1", @"expected url with with encoded value");
+
+ path = [CMISURLUtil urlStringByAppendingParameter:nil value:@"paramIsNil" urlString:@"scheme://host:12345/path"];
+ XCTAssertEqualObjects(path, @"scheme://host:12345/path", @"expected url not to be modified as parameter is nil");
+
+ path = [CMISURLUtil urlStringByAppendingParameter:@"valueIsNil" value:nil urlString:@"scheme://host:12345/path"];
+ XCTAssertEqualObjects(path, @"scheme://host:12345/path", @"expected url not to be modified as value is nil");
+
+ path = [CMISURLUtil urlStringByAppendingParameter:@"param1" value:@"value1" urlString:@"scheme://host/"];
+ XCTAssertEqualObjects(path, @"scheme://host/?param1=value1", @"expected url (no port) with with one parameter and it's value");
+
+ path = [CMISURLUtil urlStringByAppendingParameter:@"param1" value:@"value1" urlString:@"https://example.com:12345/path1/path2"];
+ XCTAssertEqualObjects(path, @"https://example.com:12345/path1/path2?param1=value1", @"expected url with with one parameter and it's value");
+}
+
+-(void)testUrlUtilAppendPath
+{
+ NSString *path;
+
+ path = [CMISURLUtil urlStringByAppendingPath:@"aPath" urlString:@"scheme://host:12345?"];
+ XCTAssertEqualObjects(path, @"scheme://host:12345/aPath?", @"expected url with path");
+
+ path = [CMISURLUtil urlStringByAppendingPath:@"subPath" urlString:@"scheme://host:12345/path?"];
+ XCTAssertEqualObjects(path, @"scheme://host:12345/path/subPath?", @"expected url with sub path component");
+
+ path = [CMISURLUtil urlStringByAppendingPath:@"subPath" urlString:@"scheme://host:12345/path"];
+ XCTAssertEqualObjects(path, @"scheme://host:12345/path/subPath", @"expected url with sub path component");
+
+ path = [CMISURLUtil urlStringByAppendingPath:@"subPath" urlString:@"scheme://host:12345/path/"];
+ XCTAssertEqualObjects(path, @"scheme://host:12345/path/subPath", @"expected url with sub path component");
+
+ path = [CMISURLUtil urlStringByAppendingPath:@"subPath" urlString:@"scheme://host:12345/path?parm1=value1"];
+ XCTAssertEqualObjects(path, @"scheme://host:12345/path/subPath?parm1=value1", @"expected url with sub path component, parmater and it's value");
+}
+
@end