You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by lg...@apache.org on 2014/04/24 08:51:56 UTC

svn commit: r1589611 [1/2] - in /chemistry/objectivecmis/branches/browser-binding: ObjectiveCMIS.xcodeproj/ ObjectiveCMIS/ ObjectiveCMIS/Bindings/ ObjectiveCMIS/Bindings/Browser/ ObjectiveCMIS/Client/ ObjectiveCMIS/Common/

Author: lgross
Date: Thu Apr 24 06:51:55 2014
New Revision: 1589611

URL: http://svn.apache.org/r1589611
Log:
CMIS-788: Browser Binding: Implement property conversion according to type definition

Added:
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService+Protected.h
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISNSDictionary+CMISUtil.h
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISNSDictionary+CMISUtil.m
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISTypeCache.h
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISTypeCache.m
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISTypeDefinitionCache.h
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISTypeDefinitionCache.m
Removed:
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/CMISNSDictionary+CMISUtil.h
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/CMISNSDictionary+CMISUtil.m
Modified:
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS.xcodeproj/project.pbxproj
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.m
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.h
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.m
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserNavigationService.m
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserObjectService.m
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserRepositoryService.m
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.h
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingSession.h
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingSession.m
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Client/CMISSession.m
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISConstants.h
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISConstants.m
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISPropertyData.m
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISSessionParameters.h
    chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Common/CMISSessionParameters.m

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS.xcodeproj/project.pbxproj
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS.xcodeproj/project.pbxproj?rev=1589611&r1=1589610&r2=1589611&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS.xcodeproj/project.pbxproj (original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS.xcodeproj/project.pbxproj Thu Apr 24 06:51:55 2014
@@ -215,10 +215,15 @@
 		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 */; };
-		C94AB15B19002CCD00ACC3D4 /* CMISNSDictionary+CMISUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = C94AB15919002CCD00ACC3D4 /* CMISNSDictionary+CMISUtil.h */; };
-		C94AB15C19002CCD00ACC3D4 /* CMISNSDictionary+CMISUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = C94AB15A19002CCD00ACC3D4 /* CMISNSDictionary+CMISUtil.m */; };
 		C94AB15F19003A5A00ACC3D4 /* CMISBrowserVersioningService.m in Sources */ = {isa = PBXBuildFile; fileRef = 58B9C8D518DE3379001D5C1B /* CMISBrowserVersioningService.m */; };
-		C94AB16019003A8200ACC3D4 /* CMISNSDictionary+CMISUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = C94AB15A19002CCD00ACC3D4 /* CMISNSDictionary+CMISUtil.m */; };
+		C94AB17119065C7500ACC3D4 /* CMISNSDictionary+CMISUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = C94AB16F19065C7500ACC3D4 /* CMISNSDictionary+CMISUtil.h */; };
+		C94AB17219065C7500ACC3D4 /* CMISNSDictionary+CMISUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = C94AB17019065C7500ACC3D4 /* CMISNSDictionary+CMISUtil.m */; };
+		C94AB17319065CAC00ACC3D4 /* CMISNSDictionary+CMISUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = C94AB17019065C7500ACC3D4 /* CMISNSDictionary+CMISUtil.m */; };
+		C94AB17619065D7500ACC3D4 /* CMISTypeCache.h in Headers */ = {isa = PBXBuildFile; fileRef = C94AB17419065D7500ACC3D4 /* CMISTypeCache.h */; };
+		C94AB17719065D7500ACC3D4 /* CMISTypeCache.m in Sources */ = {isa = PBXBuildFile; fileRef = C94AB17519065D7500ACC3D4 /* CMISTypeCache.m */; };
+		C94AB17A190662A600ACC3D4 /* CMISBrowserBaseService+Protected.h in Headers */ = {isa = PBXBuildFile; fileRef = C94AB178190662A600ACC3D4 /* CMISBrowserBaseService+Protected.h */; };
+		C94AB17E190667F100ACC3D4 /* CMISTypeDefinitionCache.h in Headers */ = {isa = PBXBuildFile; fileRef = C94AB17C190667F100ACC3D4 /* CMISTypeDefinitionCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		C94AB17F190667F100ACC3D4 /* CMISTypeDefinitionCache.m in Sources */ = {isa = PBXBuildFile; fileRef = C94AB17D190667F100ACC3D4 /* CMISTypeDefinitionCache.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 */; };
@@ -450,8 +455,13 @@
 		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>"; };
-		C94AB15919002CCD00ACC3D4 /* CMISNSDictionary+CMISUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CMISNSDictionary+CMISUtil.h"; sourceTree = "<group>"; };
-		C94AB15A19002CCD00ACC3D4 /* CMISNSDictionary+CMISUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CMISNSDictionary+CMISUtil.m"; sourceTree = "<group>"; };
+		C94AB16F19065C7500ACC3D4 /* CMISNSDictionary+CMISUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "CMISNSDictionary+CMISUtil.h"; path = "Bindings/Browser/CMISNSDictionary+CMISUtil.h"; sourceTree = "<group>"; };
+		C94AB17019065C7500ACC3D4 /* CMISNSDictionary+CMISUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "CMISNSDictionary+CMISUtil.m"; path = "Bindings/Browser/CMISNSDictionary+CMISUtil.m"; sourceTree = "<group>"; };
+		C94AB17419065D7500ACC3D4 /* CMISTypeCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CMISTypeCache.h; path = Bindings/Browser/CMISTypeCache.h; sourceTree = "<group>"; };
+		C94AB17519065D7500ACC3D4 /* CMISTypeCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CMISTypeCache.m; path = Bindings/Browser/CMISTypeCache.m; sourceTree = "<group>"; };
+		C94AB178190662A600ACC3D4 /* CMISBrowserBaseService+Protected.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "CMISBrowserBaseService+Protected.h"; path = "Bindings/Browser/CMISBrowserBaseService+Protected.h"; sourceTree = "<group>"; };
+		C94AB17C190667F100ACC3D4 /* CMISTypeDefinitionCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CMISTypeDefinitionCache.h; path = Bindings/CMISTypeDefinitionCache.h; sourceTree = "<group>"; };
+		C94AB17D190667F100ACC3D4 /* CMISTypeDefinitionCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CMISTypeDefinitionCache.m; path = Bindings/CMISTypeDefinitionCache.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>"; };
@@ -509,6 +519,7 @@
 			children = (
 				58B9C8CA18DE3379001D5C1B /* CMISBrowserBaseService.h */,
 				58B9C8CB18DE3379001D5C1B /* CMISBrowserBaseService.m */,
+				C94AB178190662A600ACC3D4 /* CMISBrowserBaseService+Protected.h */,
 				58B9C8CC18DE3379001D5C1B /* CMISBrowserBinding.h */,
 				58B9C8CD18DE3379001D5C1B /* CMISBrowserBinding.m */,
 				58B9C90018E588D7001D5C1B /* CMISBrowserConstants.h */,
@@ -525,8 +536,10 @@
 				58B9C8D518DE3379001D5C1B /* CMISBrowserVersioningService.m */,
 				58B9C8FC18E58028001D5C1B /* CMISBrowserUtil.h */,
 				58B9C8FD18E58028001D5C1B /* CMISBrowserUtil.m */,
-				C94AB15919002CCD00ACC3D4 /* CMISNSDictionary+CMISUtil.h */,
-				C94AB15A19002CCD00ACC3D4 /* CMISNSDictionary+CMISUtil.m */,
+				C94AB16F19065C7500ACC3D4 /* CMISNSDictionary+CMISUtil.h */,
+				C94AB17019065C7500ACC3D4 /* CMISNSDictionary+CMISUtil.m */,
+				C94AB17419065D7500ACC3D4 /* CMISTypeCache.h */,
+				C94AB17519065D7500ACC3D4 /* CMISTypeCache.m */,
 			);
 			name = Browser;
 			sourceTree = "<group>";
@@ -733,6 +746,8 @@
 				8276E157155E392A00344A29 /* CMISRepositoryService.h */,
 				FE417D6115761A34009056AA /* CMISTypeDefinition.h */,
 				FE417D6215761A34009056AA /* CMISTypeDefinition.m */,
+				C94AB17C190667F100ACC3D4 /* CMISTypeDefinitionCache.h */,
+				C94AB17D190667F100ACC3D4 /* CMISTypeDefinitionCache.m */,
 				BD70F11917F4649B00AE2B0C /* CMISDocumentTypeDefinition.h */,
 				BD70F11A17F4649B00AE2B0C /* CMISDocumentTypeDefinition.m */,
 				C97B947618FECA6400EDC1A6 /* CMISFolderTypeDefinition.h */,
@@ -876,7 +891,6 @@
 				8280731E1515405C00EF635C /* CMISServiceDocumentParser.h in Headers */,
 				828073201515405C00EF635C /* CMISAtomPubBinding.h in Headers */,
 				58B9C8FE18E58028001D5C1B /* CMISBrowserUtil.h in Headers */,
-				C94AB15B19002CCD00ACC3D4 /* CMISNSDictionary+CMISUtil.h in Headers */,
 				828073221515405C00EF635C /* CMISAtomPubObjectService.h in Headers */,
 				58B9C8E418DE344B001D5C1B /* CMISBrowserDiscoveryService.h in Headers */,
 				828073241515405C00EF635C /* CMISAtomPubRepositoryService.h in Headers */,
@@ -885,6 +899,7 @@
 				82C1C63215344B56009B7B3D /* CMISAtomPubBaseService.h in Headers */,
 				82C1C63615348EC4009B7B3D /* CMISAtomPubNavigationService.h in Headers */,
 				82C1C63A1535790B009B7B3D /* CMISAtomFeedParser.h in Headers */,
+				C94AB17A190662A600ACC3D4 /* CMISBrowserBaseService+Protected.h in Headers */,
 				82C1C63E15358733009B7B3D /* CMISAtomPubConstants.h in Headers */,
 				82AD4AEB1541642A0012DDB6 /* CMISBindingFactory.h in Headers */,
 				82AD4AEF15416A150012DDB6 /* CMISAclService.h in Headers */,
@@ -900,6 +915,7 @@
 				58B9C8D818DE3379001D5C1B /* CMISBrowserBinding.h in Headers */,
 				82C1C63F15358733009B7B45 /* CMISObjectByIdUriBuilder.h in Headers */,
 				82ABA0481554655A00935225 /* CMISBindingSession.h in Headers */,
+				C94AB17619065D7500ACC3D4 /* CMISTypeCache.h in Headers */,
 				82ABA04C1554819300935225 /* CMISAtomPubBaseService+Protected.h in Headers */,
 				82C1C63F15358733009B7B5C /* CMISAtomEntryWriter.h in Headers */,
 				258998E518D73E1A0091BA96 /* CMISPrincipalParser.h in Headers */,
@@ -943,6 +959,7 @@
 				FE417D6815761A34009056C0 /* CMISRenditionData.h in Headers */,
 				FE417D6815761A34009056C4 /* CMISRendition.h in Headers */,
 				755E7D061586E8C3002CACB0 /* CMISAtomPubExtensionDataParserBase.h in Headers */,
+				C94AB17E190667F100ACC3D4 /* CMISTypeDefinitionCache.h in Headers */,
 				4E39DF5C163A72B400F21DE6 /* CMISDateUtil.h in Headers */,
 				4E39DF60163A767B00F21DE6 /* CMISAtomParserUtil.h in Headers */,
 				258998D318D73D160091BA96 /* CMISAceParser.h in Headers */,
@@ -951,6 +968,7 @@
 				BD5C970E16282977002DDC6E /* CMISHttpDownloadRequest.h in Headers */,
 				58B9C8DE18DE3379001D5C1B /* CMISBrowserRepositoryService.h in Headers */,
 				58B9C8E018DE3379001D5C1B /* CMISBrowserVersioningService.h in Headers */,
+				C94AB17119065C7500ACC3D4 /* CMISNSDictionary+CMISUtil.h in Headers */,
 				C97B948418FECD9600EDC1A6 /* CMISItemTypeDefinition.h in Headers */,
 				BD5C9713162C11E3002DDC6E /* CMISHttpResponse.h in Headers */,
 				4E3E14B316AFFB190057CE22 /* CMISNetworkProvider.h in Headers */,
@@ -1097,6 +1115,7 @@
 				828072F21515403800EF635C /* CMISSession.m in Sources */,
 				828073011515404F00EF635C /* CMISConstants.m in Sources */,
 				258998D618D73D160091BA96 /* CMISAclParser.m in Sources */,
+				C94AB17719065D7500ACC3D4 /* CMISTypeCache.m in Sources */,
 				828073041515404F00EF635C /* CMISObjectData.m in Sources */,
 				828073061515404F00EF635C /* CMISProperties.m in Sources */,
 				828073081515404F00EF635C /* CMISPropertyData.m in Sources */,
@@ -1131,6 +1150,7 @@
 				75C5E2F81559172B0065550A /* CMISAllowableActionsParser.m in Sources */,
 				75C8D0871559B7EA00B63D2B /* CMISAllowableActions.m in Sources */,
 				8276E124155E34ED00344A29 /* CMISObjectId.m in Sources */,
+				C94AB17219065C7500ACC3D4 /* CMISNSDictionary+CMISUtil.m in Sources */,
 				C97B947918FECA6400EDC1A6 /* CMISFolderTypeDefinition.m in Sources */,
 				8276E130155E355D00344A29 /* CMISBase64Encoder.m in Sources */,
 				8276E132155E355D00344A29 /* CMISFileUtil.m in Sources */,
@@ -1150,6 +1170,7 @@
 				758B5A79156506840050D034 /* CMISRepositoryInfoParser.m in Sources */,
 				758B5A82156517F00050D034 /* CMISWorkspace.m in Sources */,
 				82C1C63F15358733009B7BA1 /* CMISTypeByIdUriBuilder.m in Sources */,
+				C94AB17F190667F100ACC3D4 /* CMISTypeDefinitionCache.m in Sources */,
 				82C1C63F15358733009B7BA5 /* CMISTypeDefinitionAtomEntryParser.m in Sources */,
 				82C1C63F15358733009B7BA9 /* CMISPropertyDefinitionParser.m in Sources */,
 				752067F6156AC06300231A5D /* CMISExtensionData.m in Sources */,
@@ -1175,7 +1196,6 @@
 				BD30D33E162D7DD7001FFF80 /* CMISRequest.m in Sources */,
 				4E39DF5D163A72B400F21DE6 /* CMISDateUtil.m in Sources */,
 				4E39DF61163A767B00F21DE6 /* CMISAtomParserUtil.m in Sources */,
-				C94AB15C19002CCD00ACC3D4 /* CMISNSDictionary+CMISUtil.m in Sources */,
 				4E10AC0016B916B500E2287E /* CMISDefaultNetworkProvider.m in Sources */,
 				4E3C32A916C4EF190099B21E /* CMISAtomPubVersioningService.m in Sources */,
 				82895A1B16D8A8C5007BC80A /* CMISLog.m in Sources */,
@@ -1192,11 +1212,11 @@
 				75E7789D155BA59D00191BAE /* ObjectiveCMISTests+Environment.m in Sources */,
 				4EA61BD91564F70C00C759E4 /* CMISStringInOutParameter.m in Sources */,
 				4EA61BDC1564F70C00C759E4 /* CMISURLUtil.m in Sources */,
+				C94AB17319065CAC00ACC3D4 /* CMISNSDictionary+CMISUtil.m in Sources */,
 				4EA61BE31564F73900C759E4 /* CMISObjectList.m in Sources */,
 				4EA61BE61564F73900C759E4 /* CMISQueryResult.m in Sources */,
 				4EA61BEB1564F75000C759E4 /* CMISErrors.m in Sources */,
 				FE417D6815761A34009056D2 /* CMISBaseTest.m in Sources */,
-				C94AB16019003A8200ACC3D4 /* CMISNSDictionary+CMISUtil.m in Sources */,
 				BD5C970016281A54002DDC6E /* CMISHttpRequest.m in Sources */,
 				BD5C970B1628293F002DDC6E /* CMISHttpUploadRequest.m in Sources */,
 				C94AB15F19003A5A00ACC3D4 /* CMISBrowserVersioningService.m in Sources */,

Added: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService+Protected.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService%2BProtected.h?rev=1589611&view=auto
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService+Protected.h (added)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService+Protected.h Thu Apr 24 06:51:55 2014
@@ -0,0 +1,28 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import "CMISBrowserBaseService.h"
+
+@interface CMISBrowserBaseService (Protected)
+
+- (CMISRequest*)retrieveTypeDefinitionInternal:(NSString *)typeId
+                                   cmisRequest:(CMISRequest *)cmisRequest
+                               completionBlock:(void (^)(CMISTypeDefinition *typeDefinition, NSError *error))completionBlock;
+
+@end

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.m?rev=1589611&r1=1589610&r2=1589611&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.m (original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.m Thu Apr 24 06:51:55 2014
@@ -21,6 +21,8 @@
 #import "CMISConstants.h"
 #import "CMISBrowserConstants.h"
 #import "CMISURLUtil.h"
+#import "CMISHttpResponse.h"
+#import "CMISBrowserUtil.h"
 
 @interface CMISBrowserBaseService ()
 @property (nonatomic, strong, readwrite) CMISBindingSession *bindingSession;
@@ -44,7 +46,7 @@
     NSString *rootUrl = [self.bindingSession objectForKey:kCMISBrowserBindingSessionKeyRootFolderUrl];
     
     NSString *objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterObjectId value:objectId urlString:rootUrl];
-    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSelector value:selector urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISBrowserJSONParameterSelector value:selector urlString:objectUrl];
     return objectUrl;
 }
 
@@ -53,15 +55,45 @@
     NSString *rootUrl = [self.bindingSession objectForKey:kCMISBrowserBindingSessionKeyRootFolderUrl];
     
     NSString *objectUrl = [CMISURLUtil urlStringByAppendingPath:path urlString:rootUrl];
-    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSelector value:selector urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISBrowserJSONParameterSelector value:selector urlString:objectUrl];
     return objectUrl;
 }
 
 -(NSString *)getRepositoryUrlWithSelector:(NSString *)selector
 {
     NSString *repoUrl = [self.bindingSession objectForKey:kCMISBrowserBindingSessionKeyRepositoryUrl];
-    repoUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSelector value:selector urlString:repoUrl];
+    repoUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISBrowserJSONParameterSelector value:selector urlString:repoUrl];
     return repoUrl;
 }
 
+- (CMISRequest*)retrieveTypeDefinitionInternal:(NSString *)typeId
+                                   cmisRequest:(CMISRequest *)cmisRequest
+                       completionBlock:(void (^)(CMISTypeDefinition *typeDefinition, NSError *error))completionBlock
+{
+    NSString *repoUrl = [self getRepositoryUrlWithSelector:kCMISBrowserJSONSelectorTypeDefinition];
+    repoUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterTypeId value:typeId urlString:repoUrl];
+    
+    [self.bindingSession.networkProvider invokeGET:[NSURL URLWithString:repoUrl]
+                                           session:self.bindingSession
+                                       cmisRequest:cmisRequest
+                                   completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
+                                       if (httpResponse) {
+                                           NSData *data = httpResponse.data;
+                                           if (data) {
+                                               NSError *parsingError = nil;
+                                               CMISTypeDefinition *typeDef = [CMISBrowserUtil typeDefinitionFromJSONData:data error:&parsingError];
+                                               if (parsingError) {
+                                                   completionBlock(nil, parsingError);
+                                               }
+                                               else {
+                                                   completionBlock(typeDef, nil);
+                                               }
+                                           }
+                                       } else {
+                                           completionBlock(nil, error);
+                                       }
+                                   }];
+    return cmisRequest;
+}
+
 @end

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.h?rev=1589611&r1=1589610&r2=1589611&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.h (original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.h Thu Apr 24 06:51:55 2014
@@ -146,6 +146,10 @@ extern NSString * const kCMISBrowserJSON
 extern NSString * const kCMISBrowserJSONRenditionWidth;
 extern NSString * const kCMISBrowserJSONRenditionDocumentId;
 
+// JSON specific parameters
+extern NSString * const kCMISBrowserJSONParameterSelector;
+extern NSString * const kCMISBrowserJSONParameterSuccinct;
+
 + (NSSet *)objectKeys;
 + (NSSet *)repositoryInfoKeys;
 + (NSSet *)typeKeys;

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.m?rev=1589611&r1=1589610&r2=1589611&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.m (original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.m Thu Apr 24 06:51:55 2014
@@ -154,6 +154,10 @@ NSString * const kCMISBrowserJSONRenditi
 NSString * const kCMISBrowserJSONRenditionWidth = @"width";
 NSString * const kCMISBrowserJSONRenditionDocumentId = @"renditionDocumentId";
 
+// JSON specific parameters
+NSString * const kCMISBrowserJSONParameterSelector = @"cmisselector";
+NSString * const kCMISBrowserJSONParameterSuccinct = @"succinct";
+
 +(NSSet *)objectKeys
 {
     if(!_objectKeys) {

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserNavigationService.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserNavigationService.m?rev=1589611&r1=1589610&r2=1589611&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserNavigationService.m (original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserNavigationService.m Thu Apr 24 06:51:55 2014
@@ -47,7 +47,7 @@
     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];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISBrowserJSONParameterSuccinct value:kCMISParameterValueTrue urlString:objectUrl];
     
     CMISRequest *cmisRequest = [[CMISRequest alloc] init];
     
@@ -58,14 +58,15 @@
                                        if (httpResponse) {
                                            NSData *data = httpResponse.data;
                                            if (data) {
-                                               NSError *parsingError = nil;
-                                               CMISObjectList *objectList = [CMISBrowserUtil objectListFromJSONData:data error:&parsingError];
-                                               if (parsingError)
-                                               {
-                                                   completionBlock(nil, parsingError);
-                                               } else {
-                                                   completionBlock(objectList, nil);
-                                               }
+                                               CMISTypeCache *typeCache = [[CMISTypeCache alloc] initWithRepositoryId:self.bindingSession.repositoryId bindingService:self];
+                                               [CMISBrowserUtil objectListFromJSONData:data typeCache:typeCache completionBlock:^(CMISObjectList *objectList, NSError *error) {
+                                                   if (error) {
+                                                       completionBlock(nil, error);
+                                                   } else {
+                                                       completionBlock(objectList, nil);
+                                                   }
+                                               }];
+                                               
                                            }
                                        } else {
                                            completionBlock(nil, error);

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserObjectService.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserObjectService.m?rev=1589611&r1=1589610&r2=1589611&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserObjectService.m (original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserObjectService.m Thu Apr 24 06:51:55 2014
@@ -46,7 +46,7 @@
     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];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISBrowserJSONParameterSuccinct value:kCMISParameterValueTrue urlString:objectUrl];
     
     CMISRequest *cmisRequest = [[CMISRequest alloc] init];
     
@@ -55,14 +55,15 @@
                                        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);
-                                           }
+                                           CMISTypeCache *typeCache = [[CMISTypeCache alloc] initWithRepositoryId:self.bindingSession.repositoryId bindingService:self];
+                                           [CMISBrowserUtil objectDataFromJSONData:httpResponse.data typeCache:typeCache completionBlock:^(CMISObjectData *objectData, NSError *error) {
+                                               if (error) {
+                                                   completionBlock(nil, error);
+                                               } else {
+                                                   completionBlock(objectData, nil);
+                                               }
+                                           }];
+                                           
                                        } else {
                                            completionBlock(nil, error);
                                        }
@@ -87,7 +88,7 @@
     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];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISBrowserJSONParameterSuccinct value:kCMISParameterValueTrue urlString:objectUrl];
     
     CMISRequest *cmisRequest = [[CMISRequest alloc] init];
     
@@ -96,14 +97,15 @@
                                        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);
-                                           }
+                                           CMISTypeCache *typeCache = [[CMISTypeCache alloc] initWithRepositoryId:self.bindingSession.repositoryId bindingService:self];
+                                           [CMISBrowserUtil objectDataFromJSONData:httpResponse.data typeCache:typeCache completionBlock:^(CMISObjectData *objectData, NSError *error) {
+                                               if (error) {
+                                                   completionBlock(nil, error);
+                                               } else {
+                                                   completionBlock(objectData, nil);
+                                               }
+                                           }];
+                                          
                                        } else {
                                            completionBlock(nil, error);
                                        }
@@ -182,7 +184,7 @@
     
     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];
+    contentUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISBrowserJSONParameterSelector value:kCMISBrowserJSONSelectorContent urlString:contentUrl];
 
     unsigned long long streamLength = 0; //TODO do we need this?
 

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserRepositoryService.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserRepositoryService.m?rev=1589611&r1=1589610&r2=1589611&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserRepositoryService.m (original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserRepositoryService.m Thu Apr 24 06:51:55 2014
@@ -29,6 +29,7 @@
 #import "CMISConstants.h"
 #import "CMISBrowserConstants.h"
 #import "CMISURLUtil.h"
+#import "CMISBrowserBaseService+Protected.h"
 
 @interface CMISBrowserRepositoryService ()
 @property (nonatomic, strong) NSDictionary *repositories;
@@ -92,33 +93,32 @@
 - (CMISRequest*)retrieveTypeDefinition:(NSString *)typeId
                        completionBlock:(void (^)(CMISTypeDefinition *typeDefinition, NSError *error))completionBlock
 {
-    NSString *repoUrl = [self getRepositoryUrlWithSelector:kCMISBrowserJSONSelectorTypeDefinition];
-    repoUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterTypeId value:typeId urlString:repoUrl];
+    NSString *repositoryId = self.bindingSession.repositoryId;
     
-    CMISRequest *cmisRequest = [[CMISRequest alloc] init];
+    // Check the cache first
+    CMISTypeDefinitionCache *typeDefinitionCache = self.bindingSession.typeDefinitionCache;
     
-    [self.bindingSession.networkProvider invokeGET:[NSURL URLWithString:repoUrl]
-                                           session:self.bindingSession
-                                       cmisRequest:cmisRequest
-                                   completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
-                                       if (httpResponse) {
-                                           NSData *data = httpResponse.data;
-                                           if (data) {
-                                               NSError *parsingError = nil;
-                                               CMISTypeDefinition *typeDef = [CMISBrowserUtil typeDefinitionFromJSONData:data error:&parsingError];
-                                               if (parsingError) {
-                                                   completionBlock(nil, parsingError);
-                                               }
-                                               else {
-                                                   completionBlock(typeDef, nil);
-                                               }
-                                           }
-                                       } else {
-                                           completionBlock(nil, error);
-                                       }
-                                   }];
-    
-    return cmisRequest;
+    CMISTypeDefinition *typeDefinition = [typeDefinitionCache typeDefinitionForTypeId:typeId repositoryId:repositoryId];
+    if(typeDefinition){
+        completionBlock(typeDefinition, nil);
+        
+        return nil; //TODO is it correct to return nil here?
+    } else {
+        CMISRequest *cmisRequest = [[CMISRequest alloc] init];
+        
+        [self retrieveTypeDefinitionInternal:typeId cmisRequest:cmisRequest completionBlock:^(CMISTypeDefinition *typeDefinition, NSError *error) {
+            if (error){
+                completionBlock(nil, error);
+            } else {
+                // Put it into the cache
+                [typeDefinitionCache addTypeDefinition:typeDefinition repositoryId:repositoryId];
+                
+                completionBlock(typeDefinition, nil);
+            }
+        }];
+        
+        return cmisRequest;
+    }
 }
 
 @end

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.h?rev=1589611&r1=1589610&r2=1589611&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.h (original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.h Thu Apr 24 06:51:55 2014
@@ -22,6 +22,7 @@
 #import "CMISObjectData.h"
 #import "CMISObjectList.h"
 #import "CMISBindingSession.h"
+#import "CMISTypeCache.h"
 
 @interface CMISBrowserUtil : NSObject
 
@@ -38,12 +39,12 @@
 /**
  Returns a CMISObjectData object parsed from the given JSON data.
  */
-+ (CMISObjectData *)objectDataFromJSONData:(NSData *)jsonData error:(NSError **)outError;
++ (void)objectDataFromJSONData:(NSData *)jsonData typeCache:(CMISTypeCache *)typeCache completionBlock:(void(^)(CMISObjectData *objectData, NSError *error))completionBlock;
 
 /**
  Returns a CMISObjectList object parsed from the given JSON data.
  */
-+ (CMISObjectList *)objectListFromJSONData:(NSData *)jsonData error:(NSError **)outError;
++ (void)objectListFromJSONData:(NSData *)jsonData typeCache:(CMISTypeCache *)typeCache completionBlock:(void(^)(CMISObjectList *objectList, NSError *error))completionBlock;
 
 /**
  Returns an array of CMISRenditionData objects, parsed from the given JSON data.

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m?rev=1589611&r1=1589610&r2=1589611&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m (original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m Thu Apr 24 06:51:55 2014
@@ -116,10 +116,10 @@
                 typeDef = [CMISRelationshipTypeDefinition new];
                 
                 id allowedSourceTypes = [jsonDictionary cmis_objectForKeyNotNull:kCMISBrowserJSONAllowedSourceTypes];
-                if([allowedSourceTypes isKindOfClass:NSArray.class]){
+                if ([allowedSourceTypes isKindOfClass:NSArray.class]){
                     NSMutableArray *types = [[NSMutableArray alloc] init];
                     for (id type in allowedSourceTypes) {
-                        if(type){
+                        if (type){
                             [types addObject:type];
                         }
                     }
@@ -127,10 +127,10 @@
                 }
                 
                 id allowedTargetTypes = [jsonDictionary cmis_objectForKeyNotNull:kCMISBrowserJSONAllowedTargetTypes];
-                if([allowedTargetTypes isKindOfClass:NSArray.class]){
+                if ([allowedTargetTypes isKindOfClass:NSArray.class]){
                     NSMutableArray *types = [[NSMutableArray alloc] init];
                     for (id type in allowedTargetTypes) {
-                        if(type){
+                        if (type){
                             [types addObject:type];
                         }
                     }
@@ -179,7 +179,7 @@
     return typeDef;
 }
 
-+ (CMISObjectData *)objectDataFromJSONData:(NSData *)jsonData error:(NSError **)outError
++ (void)objectDataFromJSONData:(NSData *)jsonData typeCache:(CMISTypeCache *)typeCache completionBlock:(void(^)(CMISObjectData *objectData, NSError *error))completionBlock
 {
     // TODO: error handling i.e. if jsonData is nil, also handle outError being nil
 
@@ -187,16 +187,17 @@
     NSError *serialisationError = nil;
     id jsonDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&serialisationError];
     
-    CMISObjectData *objectData = nil;
     if (!serialisationError) {
         // parse the json into a CMISObjectData object
-        objectData = [CMISBrowserUtil convertObject:jsonDictionary];
+        [CMISBrowserUtil convertObject:jsonDictionary typeCache:typeCache completionBlock:^(CMISObjectData *objectData, NSError *error) {
+            completionBlock(objectData, error);
+        }];
+    } else {
+        completionBlock(nil, [CMISErrors cmisError:serialisationError cmisErrorCode:kCMISErrorCodeRuntime]);
     }
-    
-    return objectData;
 }
 
-+ (CMISObjectList *)objectListFromJSONData:(NSData *)jsonData error:(NSError **)outError
++ (void)objectListFromJSONData:(NSData *)jsonData typeCache:(CMISTypeCache *)typeCache completionBlock:(void(^)(CMISObjectList *objectList, NSError *error))completionBlock
 {
     // TODO: error handling i.e. if jsonData is nil, also handle outError being nil
     
@@ -210,9 +211,8 @@
         objectList = [CMISObjectList new];
         
         // parse the objects
-        BOOL isArray = [jsonDictionary isKindOfClass:NSArray.class];
         NSArray *objectsArray;
-        if(isArray){
+        if ([jsonDictionary isKindOfClass:NSArray.class]){
             objectsArray = jsonDictionary;
             
             objectList.hasMoreItems = NO;
@@ -224,27 +224,20 @@
             objectList.hasMoreItems = [jsonDictionary cmis_boolForKey:kCMISBrowserJSONHasMoreItems];
             objectList.numItems = [jsonDictionary cmis_intForKey:kCMISBrowserJSONNumberItems];
         }
-        if (objectsArray) {
-            NSMutableArray *objects = [NSMutableArray arrayWithCapacity:objectsArray.count];
-            for (NSDictionary *dictionary in objectsArray) {
-                NSDictionary *objectDictionary;
-                if(isArray){
-                    objectDictionary = dictionary;
-                } else {
-                    objectDictionary = [dictionary cmis_objectForKeyNotNull:kCMISBrowserJSONObject];
-                }
-                CMISObjectData *objectData = [CMISBrowserUtil convertObject:objectDictionary];
-                if(objectData){
-                    [objects addObject:objectData];
-                }
+        
+        [CMISBrowserUtil convertObjects:objectsArray typeCache:typeCache completionBlock:^(NSArray *objects, NSError *error) {
+            if (error){
+                completionBlock(nil, error);
+            } else {
+                // pass objects to list
+                objectList.objects = objects;
+                
+                completionBlock(objectList, nil);
             }
-            
-            // pass objects to list
-            objectList.objects = objects;
-        }
+        }];
+    } else {
+        completionBlock(nil, [CMISErrors cmisError:serialisationError cmisErrorCode:kCMISErrorCodeRuntime]);
     }
-    
-    return objectList;
 }
 
 + (NSArray *)renditionsFromJSONData:(NSData *)jsonData error:(NSError **)outError
@@ -267,10 +260,10 @@
 #pragma mark -
 #pragma mark Private helper methods
 
-+ (CMISObjectData *)convertObject:(NSDictionary *)dictionary
++ (void)convertObject:(NSDictionary *)dictionary typeCache:(CMISTypeCache *)typeCache completionBlock:(void(^)(CMISObjectData *objectData, NSError *error))completionBlock
 {
-    if(!dictionary) {
-        return nil;
+    if (!dictionary) {
+        completionBlock(nil, nil);
     }
     
     CMISObjectData *objectData = [CMISObjectData new];
@@ -287,79 +280,336 @@
     
     // set the properties
     NSDictionary *propertiesExtension = [dictionary cmis_objectForKeyNotNull:kCMISBrowserJSONPropertiesExtension];
-    objectData.properties = [CMISBrowserUtil convertSuccinctProperties:propertiesJson propertiesExtension:propertiesExtension];
     
-    // relationships
-    NSArray *relationshipsJson = [dictionary cmis_objectForKeyNotNull:kCMISBrowserJSONRelationships];
-    objectData.relationships = [CMISBrowserUtil convertObjects:relationshipsJson];
-    
-    //renditions
-    NSArray *renditionsJson = [dictionary cmis_objectForKeyNotNull:kCMISBrowserJSONRenditions];
-    objectData.renditions = [self renditionsFromArray:renditionsJson];
+    [CMISBrowserUtil convertSuccinctProperties:propertiesJson propertiesExtension:propertiesExtension typeCache:typeCache completionBlock:^(CMISProperties *properties, NSError *error) {
+        if (error){
+            completionBlock(nil, error);
+        } else {
+            objectData.properties = properties;
+            
+            // relationships
+            NSArray *relationshipsJson = [dictionary cmis_objectForKeyNotNull:kCMISBrowserJSONRelationships];
+            [CMISBrowserUtil convertObjects:relationshipsJson typeCache:typeCache completionBlock:^(NSArray *objects, NSError *error) {
+                if (error){
+                    completionBlock(nil, error);
+                } else {
+                    objectData.relationships = objects;
+                    
+                    //renditions
+                    NSArray *renditionsJson = [dictionary cmis_objectForKeyNotNull:kCMISBrowserJSONRenditions];
+                    objectData.renditions = [self renditionsFromArray:renditionsJson];
+                    
+                    // handle extensions
+                    objectData.extensions = [CMISBrowserUtil convertExtensions:dictionary cmisKeys:[CMISBrowserConstants objectKeys]];
+                    
+                    completionBlock(objectData, nil);
+                }
+            }];
+        }
+
+    }];
+}
+
++ (void)convertObjects:(NSArray *)objectsArray position:(NSInteger)position convertedObjects:(NSMutableArray *)convertedObjects typeCache:(CMISTypeCache *)typeCache completionBlock:(void(^)(NSArray* objects, NSError *error))completionBlock
+{
+    NSDictionary *dictionary = [objectsArray objectAtIndex:position];
+    NSDictionary *objectDictionary = [dictionary cmis_objectForKeyNotNull:kCMISBrowserJSONObject];
+    if (!objectDictionary) {
+        objectDictionary = dictionary;
+    }
+
+    if(![objectDictionary isKindOfClass:NSDictionary.class]){
+        completionBlock(nil, [CMISErrors createCMISErrorWithCode:kCMISErrorCodeInvalidArgument detailedDescription:[NSString stringWithFormat:@"expected a dictionary but was %@", objectDictionary.class]]);
+    }
+    [CMISBrowserUtil convertObject:objectDictionary typeCache:typeCache completionBlock:^(CMISObjectData *objectData, NSError *error) {
+        if (position == 0) {
+            [convertedObjects addObject:objectData];
+            completionBlock(convertedObjects, error);
+        } else {
+            // TODO check if there is a better way on how to avoid a large call stack
+            // We need to do this workaround or else we would end up with a very large call stack
+            [CMISBrowserUtil performBlock:^{
+                [self convertObjects:objectsArray
+                            position:(position -1)
+                    convertedObjects:convertedObjects
+                           typeCache:typeCache
+                     completionBlock:^(NSArray *objects, NSError *error) {
+                         [convertedObjects addObject:objectData];
+                         completionBlock(objects, error);
+                     }];
+            }];
+        }
+    }];
+
+}
+
++ (void)convertObjects:(NSArray *)objectsArray typeCache:(CMISTypeCache *)typeCache completionBlock:(void(^)(NSArray* objects, NSError *error))completionBlock
+{
+    NSMutableArray *objects = [NSMutableArray arrayWithCapacity:objectsArray.count];
+    if (objectsArray.count > 0) {
+        [CMISBrowserUtil convertObjects:objectsArray
+                               position:(objectsArray.count - 1) // start recursion with last item
+                       convertedObjects:objects
+                                 typeCache:typeCache
+                           completionBlock:^(NSArray *objects, NSError *error) {
+                               completionBlock(objects, error);
+                           }];
+    } else {
+        completionBlock([NSArray array], nil);
+    }
+}
+
++ (void)convertSuccinctProperties:(NSDictionary *)propertiesJson propertiesExtension:(NSDictionary *)extJson typeCache:(CMISTypeCache *)typeCache completionBlock:(void(^)(CMISProperties *properties, NSError *error))completionBlock
+{
+    if (!propertiesJson) {
+        completionBlock(nil, nil);
+    }
     
-    // handle extensions
-    objectData.extensions = [CMISBrowserUtil convertExtensions:dictionary cmisKeys:[CMISBrowserConstants objectKeys]];
+    void (^continueConvertSuccinctPropertiesAndGetSecondaryObjectTypeDefinitions)(CMISTypeDefinition*) = ^(CMISTypeDefinition *typeDef) {
+        
+        void (^continueConvertSuccinctPropertiesSecondaryObjectTypeDefinitions)(NSArray*) = ^(NSArray *secTypeDefs) {
+            
+            [self convertProperties:propertiesJson typeCache:typeCache typeDefinition:typeDef secondaryTypeDefinitions:secTypeDefs completionBlock:^(CMISProperties *properties, NSError *error){
+                if (extJson){
+                    properties.extensions = [CMISBrowserUtil convertExtensions:extJson cmisKeys:[NSSet set]];
+                }
+                
+                completionBlock(properties, nil);
+            }];
+        };
+        
+        // Get secondary object type definitions
+        NSArray *secTypeIds = [propertiesJson cmis_objectForKeyNotNull:kCMISPropertySecondaryObjectTypeIds];
+        if (secTypeIds != nil && secTypeIds.count > 0) {
+            [CMISBrowserUtil retrieveTypeDefinitions:secTypeIds typeCache:typeCache completionBlock:^(NSArray *typeDefinitions, NSError *error) {
+                continueConvertSuccinctPropertiesSecondaryObjectTypeDefinitions(typeDefinitions);
+            }];
+        } else {
+            continueConvertSuccinctPropertiesSecondaryObjectTypeDefinitions(nil);
+        }
+    };
     
-    return objectData;
+    // Get type definition for given object type id
+    CMISTypeDefinition *typeDef = nil;
+    if ([[propertiesJson cmis_objectForKeyNotNull:kCMISPropertyObjectTypeId] isKindOfClass:NSString.class]){
+        [typeCache typeDefinition:[propertiesJson cmis_objectForKeyNotNull:kCMISPropertyObjectTypeId] completionBlock:^(CMISTypeDefinition *typeDef, NSError *error){
+            continueConvertSuccinctPropertiesAndGetSecondaryObjectTypeDefinitions(typeDef);
+        }];
+    } else {
+        continueConvertSuccinctPropertiesAndGetSecondaryObjectTypeDefinitions(typeDef);
+    }
 }
 
-+ (NSArray *)convertObjects:(NSArray *)json
-{
-    if (!json){
-        return nil;
++(void)convertProperty:(NSString *)propName propertiesJson:(NSDictionary *)propertiesJson typeCache:(CMISTypeCache *)typeCache typeDefinition:(CMISTypeDefinition *)typeDef secondaryTypeDefinitions:(NSArray *)secTypeDefs completionBlock:(void(^)(CMISPropertyData *propertyData, NSError *error))completionBlock {
+    CMISPropertyDefinition *propDef = nil;
+    if (typeDef){
+        propDef = typeDef.propertyDefinitions[propName];
     }
     
-    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];
+    if (propDef == nil && secTypeDefs != nil) {
+        for (CMISTypeDefinition *secTypeDef in secTypeDefs) {
+            propDef = secTypeDef.propertyDefinitions[propName];
+            if (propDef){
+                break;
+            }
         }
     }
     
-    return result;
+    void (^continueConvertSuccinctPropertiesTypeDefinitionDocument)(CMISPropertyDefinition*) = ^(CMISPropertyDefinition *propDef) {
+        
+        void (^continueConvertSuccinctPropertiesTypeDefinitionFolder)(CMISPropertyDefinition*) = ^(CMISPropertyDefinition *propDef) {
+            
+            id propValue = [propertiesJson cmis_objectForKeyNotNull:propName];
+            NSArray *values = nil;
+            if ([propValue isKindOfClass:NSArray.class]) {
+                values = propValue;
+            } else if (propValue) {
+                values = [NSArray arrayWithObject:propValue];
+            }
+            
+            CMISPropertyData *propertyData;
+            
+            if (propDef){
+                
+                switch (propDef.propertyType) {
+                    case CMISPropertyTypeString:
+                    case CMISPropertyTypeId:
+                    case CMISPropertyTypeBoolean:
+                    case CMISPropertyTypeInteger:
+                    case CMISPropertyTypeDecimal:
+                    case CMISPropertyTypeHtml:
+                    case CMISPropertyTypeUri:
+                        propertyData = [CMISPropertyData createPropertyForId:propName arrayValue:values type:propDef.propertyType];
+                        break;
+                    case CMISPropertyTypeDateTime: {
+                        NSArray *dateValues = [CMISBrowserUtil convertNumbersToDates:values];
+                        propertyData = [CMISPropertyData createPropertyForId:propName arrayValue:dateValues type:propDef.propertyType];
+                        break;
+                    }
+                    default: {
+                        NSError *error = [CMISErrors createCMISErrorWithCode:kCMISErrorCodeInvalidArgument
+                                                         detailedDescription:@"Unknown property type!"];
+                        completionBlock(nil, error);
+                        return;
+                    }
+                }
+                propertyData.identifier = propName;
+                propertyData.displayName = propDef.displayName;
+                propertyData.queryName = propDef.queryName;
+                propertyData.localName = propDef.localName;
+            } else {
+                // this else block should only be reached in rare circumstances
+                // it may return incorrect types
+                if (values == nil) {
+                    propertyData = [CMISPropertyData createPropertyForId:propName arrayValue:nil type:CMISPropertyTypeString];
+                } else {
+                    id firstValue = values[0];
+                    if ([firstValue isKindOfClass:NSNumber.class]) {
+                        propertyData = [CMISPropertyData createPropertyForId:propName arrayValue:values type:CMISPropertyTypeInteger];
+                    } else {
+                        propertyData = [CMISPropertyData createPropertyForId:propName arrayValue:values type:CMISPropertyTypeString];
+                    }
+                }
+                
+                propertyData.identifier = propName;
+                propertyData.displayName = propName;
+                propertyData.queryName = nil;
+                propertyData.localName = nil;
+            }
+            
+            completionBlock(propertyData, nil);
+        };
+        
+        if (!propDef) { //try to find property definition on folder
+            [typeCache typeDefinition:kCMISPropertyObjectTypeIdValueFolder completionBlock:^(CMISTypeDefinition *typeDefinition, NSError *error) {
+                CMISPropertyDefinition *propertyDefinition = typeDefinition.propertyDefinitions[propName];
+                continueConvertSuccinctPropertiesTypeDefinitionFolder(propertyDefinition);
+            }];
+        } else {
+            continueConvertSuccinctPropertiesTypeDefinitionFolder(propDef);
+        }
+        
+    };
+    
+    if (!propDef) { //try to find property definition on document
+        [typeCache typeDefinition:kCMISPropertyObjectTypeIdValueDocument completionBlock:^(CMISTypeDefinition *typeDefinition, NSError *error) {
+            CMISPropertyDefinition *propertyDefinition = typeDefinition.propertyDefinitions[propName];
+            continueConvertSuccinctPropertiesTypeDefinitionDocument(propertyDefinition);
+        }];
+    } else {
+        continueConvertSuccinctPropertiesTypeDefinitionDocument(propDef);
+    }
 }
 
-+ (CMISProperties *)convertSuccinctProperties:(NSDictionary *)propertiesJson propertiesExtension:(NSDictionary *)extJson
++ (NSArray *)convertNumbersToDates:(NSArray *)numbers
 {
-    if(!propertiesJson) {
+    if(!numbers) {
         return nil;
     }
     
-    // TODO convert properties according to typeDefinition
-    
+    NSMutableArray *dates = [[NSMutableArray alloc] initWithCapacity:numbers.count];
+    for (NSNumber *number in numbers) {
+        NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:[number doubleValue]];
+        [dates addObject:date];
+    }
+    return dates;
+}
+
++ (void)convertProperties:(NSArray*)propNames position:(NSInteger)position properties:(CMISProperties *)properties propertiesJson:(NSDictionary *)propertiesJson typeCache:(CMISTypeCache *)typeCache typeDefinition:(CMISTypeDefinition *)typeDef secondaryTypeDefinitions:(NSArray *)secTypeDefs completionBlock:(void (^)(CMISProperties *properties, NSError *error))completionBlock
+{
+    NSString *propName = [propNames objectAtIndex:position];
+    
+    [self convertProperty:propName
+           propertiesJson:propertiesJson
+                typeCache:typeCache
+           typeDefinition:typeDef
+ secondaryTypeDefinitions:secTypeDefs
+          completionBlock:^(CMISPropertyData *propertyData, NSError *error) {
+              
+              if (position == 0) {
+                  [properties addProperty:propertyData];
+                  completionBlock(properties, error);
+              } else {
+                  // TODO check if there is a better way on how to avoid a large call stack
+                  // We need to do this workaround or else we would end up with a very large call stack
+                  [CMISBrowserUtil performBlock:^{
+                      [self convertProperties:propNames
+                                     position:(position -1)
+                                   properties:properties
+                               propertiesJson:propertiesJson
+                                    typeCache:typeCache
+                               typeDefinition:typeDef
+                     secondaryTypeDefinitions:secTypeDefs
+                              completionBlock:^(CMISProperties *properties, NSError *error) {
+                                  [properties addProperty:propertyData];
+                                  completionBlock(properties, error);
+                                  
+                              }];
+                  }];
+              }
+          }];
+}
+
++ (void)convertProperties:(NSDictionary *)propertiesJson typeCache:(CMISTypeCache *)typeCache typeDefinition:(CMISTypeDefinition *)typeDef secondaryTypeDefinitions:(NSArray *)secTypeDefs completionBlock:(void(^)(CMISProperties *properties, NSError *error))completionBlock
+{
     // create properties
     CMISProperties *properties = [CMISProperties new];
+    
     NSArray *propNames = [propertiesJson allKeys];
-    for (NSString *propName in propNames) {
-        CMISPropertyData *propertyData;
-        id propValue = [propertiesJson cmis_objectForKeyNotNull:propName];
-        if ([propValue isKindOfClass:[NSArray class]]) {
-            propertyData = [CMISPropertyData createPropertyForId:propName arrayValue:propValue type:CMISPropertyTypeString];
-        }
-        else {
-            if(propValue){
-                propertyData = [CMISPropertyData createPropertyForId:propName stringValue:propValue];
-            } else {
-                //TODO create convenient method for nil values?
-                propertyData = [CMISPropertyData createPropertyForId:propName arrayValue:[NSArray array] type:CMISPropertyTypeString];
-            }
-        }
-        
-        [properties addProperty:propertyData];
+    if (propNames.count > 0) {
+        [CMISBrowserUtil convertProperties:propNames
+                                        position:(propNames.count - 1) // start recursion with last item
+                                properties:properties
+                            propertiesJson:propertiesJson
+                                 typeCache:typeCache
+                            typeDefinition:typeDef
+                  secondaryTypeDefinitions:secTypeDefs
+                           completionBlock:^(CMISProperties *properties, NSError *error) {
+                                     completionBlock(properties, error);
+                                 }];
+    } else {
+        completionBlock(properties, nil);
     }
-    
-    if(extJson){
-        properties.extensions = [CMISBrowserUtil convertExtensions:extJson cmisKeys:[NSSet set]];
+}
+
++ (void)retrieveTypeDefinitions:(NSArray *)objectTypeIds position:(NSInteger)position typeCache:(CMISTypeCache *)typeCache completionBlock:(void (^)(NSMutableArray *typeDefinitions, NSError *error))completionBlock
+{
+    [typeCache typeDefinition:[objectTypeIds objectAtIndex:position]
+              completionBlock:^(CMISTypeDefinition *typeDefinition, NSError *error) {
+                             if (error){
+                                 completionBlock(nil, error);
+                             } else {
+                                 if (position == 0) {
+                                     NSMutableArray *typeDefinitions = [[NSMutableArray alloc] initWithCapacity:objectTypeIds.count];
+                                     [typeDefinitions addObject:typeDefinition];
+                                     completionBlock(typeDefinitions, error);
+                                 } else {
+                                     [self retrieveTypeDefinitions:objectTypeIds position:(position - 1) typeCache:typeCache completionBlock:^(NSMutableArray *typeDefinitions, NSError *error) {
+                                         [typeDefinitions addObject:typeDefinition];
+                                         completionBlock(typeDefinitions, error);
+                                     }];
+                                 }
+                             }
+                         }];
+}
+
++ (void)retrieveTypeDefinitions:(NSArray *)objectTypeIds typeCache:(CMISTypeCache *)typeCache completionBlock:(void (^)(NSArray *typeDefinitions, NSError *error))completionBlock
+{
+    if (objectTypeIds.count > 0) {
+        [CMISBrowserUtil retrieveTypeDefinitions:objectTypeIds
+                                        position:(objectTypeIds.count - 1) // start recursion with last item
+                                       typeCache:typeCache
+                                 completionBlock:^(NSMutableArray *typeDefinitions, NSError *error) {
+                                     completionBlock(typeDefinitions, error);
+                                 }];
+    } else {
+        completionBlock([[NSArray alloc] init], nil);
     }
-    
-    return properties;
 }
 
 + (NSArray *)renditionsFromArray:(NSArray *)array
 {
-    if(!array) {
+    if (!array) {
         return nil;
     }
     NSMutableArray *renditions = [[NSMutableArray alloc] initWithCapacity:array.count];
@@ -385,7 +635,7 @@
 
 + (CMISPropertyDefinition *)convertPropertyDefinition:(NSDictionary *)propertyDictionary
 {
-    if(!propertyDictionary){
+    if (!propertyDictionary){
         return nil;
     }
     
@@ -523,4 +773,15 @@
     return extensions;
 }
 
+// TODO could be moved to category
++ (void)performBlock:(void (^)(void))block
+{
+    [CMISBrowserUtil performSelector:@selector(executeBlock:) onThread:[NSThread currentThread] withObject:block waitUntilDone:NO];
+}
+
++ (void)executeBlock:(void (^)(void))block {
+    block();
+}
+
+
 @end

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m?rev=1589611&r1=1589610&r2=1589611&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m (original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m Thu Apr 24 06:51:55 2014
@@ -45,7 +45,7 @@
     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];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISBrowserJSONParameterSuccinct value:kCMISParameterValueTrue urlString:objectUrl];
     
     CMISRequest *cmisRequest = [[CMISRequest alloc] init];
     
@@ -54,14 +54,16 @@
                                        cmisRequest:cmisRequest
                                    completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
                                        if (httpResponse.statusCode == 200 && httpResponse.data) {
+                                           CMISTypeCache *typeCache = [[CMISTypeCache alloc] initWithRepositoryId:self.bindingSession.repositoryId bindingService:self];
                                            NSError *parsingError = nil;
-                                           CMISObjectData *objectData = [CMISBrowserUtil objectDataFromJSONData:httpResponse.data error:&parsingError];
-                                           if (parsingError)
-                                           {
-                                               completionBlock(nil, parsingError);
-                                           } else {
-                                               completionBlock(objectData, nil);
-                                           }
+                                           [CMISBrowserUtil objectDataFromJSONData:httpResponse.data typeCache:typeCache completionBlock:^(CMISObjectData *objectData, NSError *error) {
+                                               if (error) {
+                                                   completionBlock(nil, parsingError);
+                                               } else {
+                                                   completionBlock(objectData, nil);
+                                               }
+                                           }];
+                                          
                                        } else {
                                            completionBlock(nil, error);
                                        }
@@ -78,7 +80,7 @@
     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];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISBrowserJSONParameterSuccinct value:@"true" urlString:objectUrl];
     
     CMISRequest *cmisRequest = [[CMISRequest alloc] init];
     
@@ -87,14 +89,14 @@
                                        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);
-                                           }
+                                           CMISTypeCache *typeCache = [[CMISTypeCache alloc] initWithRepositoryId:self.bindingSession.repositoryId bindingService:self];
+                                           [CMISBrowserUtil objectListFromJSONData:httpResponse.data typeCache:typeCache completionBlock:^(CMISObjectList *objectList, NSError *error) {
+                                               if (error) {
+                                                   completionBlock(nil, error);
+                                               } else {
+                                                   completionBlock(objectList.objects, nil);
+                                               }
+                                           }];
                                        } else {
                                            completionBlock(nil, error);
                                        }

Added: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISNSDictionary+CMISUtil.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISNSDictionary%2BCMISUtil.h?rev=1589611&view=auto
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISNSDictionary+CMISUtil.h (added)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISNSDictionary+CMISUtil.h Thu Apr 24 06:51:55 2014
@@ -0,0 +1,33 @@
+/*
+ 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>
+
+@interface NSDictionary (CMISUtil)
+
+///returns the object or nil if value is NSNull for given key
+- (id)cmis_objectForKeyNotNull:(id)aKey;
+
+///convenient method; returns BOOL value or NO if value is NSNull for given key
+- (BOOL)cmis_boolForKey:(id)aKey;
+
+///convenient method; returns int value or 0 if value is NSNull for given key
+- (int)cmis_intForKey:(id)aKey;
+
+@end

Added: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISNSDictionary+CMISUtil.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISNSDictionary%2BCMISUtil.m?rev=1589611&view=auto
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISNSDictionary+CMISUtil.m (added)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISNSDictionary+CMISUtil.m Thu Apr 24 06:51:55 2014
@@ -0,0 +1,40 @@
+/*
+ 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 "CMISNSDictionary+CMISUtil.h"
+
+@implementation NSDictionary (CMISUtil)
+
+- (id)cmis_objectForKeyNotNull:(id)aKey
+{
+    id value = self[aKey];
+    return value == [NSNull null] ? nil : value;
+}
+
+- (BOOL)cmis_boolForKey:(id)aKey
+{
+    return [[self cmis_objectForKeyNotNull:aKey] boolValue];
+}
+
+- (int)cmis_intForKey:(id)aKey
+{
+    return [[self cmis_objectForKeyNotNull:aKey] intValue];
+}
+
+@end

Added: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISTypeCache.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISTypeCache.h?rev=1589611&view=auto
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISTypeCache.h (added)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISTypeCache.h Thu Apr 24 06:51:55 2014
@@ -0,0 +1,31 @@
+/*
+ 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 "CMISTypeDefinition.h"
+#import "CMISBrowserBaseService.h"
+
+@interface CMISTypeCache : NSObject
+
+- (id)initWithRepositoryId:(NSString *)repositoryId bindingService:(CMISBrowserBaseService *)service;
+
+- (CMISRequest *)typeDefinition:(NSString *)typeId
+                       completionBlock:(void (^)(CMISTypeDefinition *typeDefinition, NSError *error))completionBlock;
+
+@end

Added: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISTypeCache.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISTypeCache.m?rev=1589611&view=auto
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISTypeCache.m (added)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/Browser/CMISTypeCache.m Thu Apr 24 06:51:55 2014
@@ -0,0 +1,73 @@
+/*
+ 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 "CMISTypeCache.h"
+#import "CMISTypeDefinition.h"
+#import "CMISBrowserBaseService+Protected.h"
+#import "CMISRequest.h"
+#import "CMISTypeDefinitionCache.h"
+#import "CMISBindingSession.h"
+
+@interface CMISTypeCache ()
+
+@property (nonatomic, weak) NSString * repositoryId;
+@property (nonatomic, weak) CMISBrowserBaseService * service;
+
+@end
+
+@implementation CMISTypeCache
+
+
+-(id)initWithRepositoryId:(NSString *)repositoryId bindingService:(CMISBrowserBaseService *)service
+{
+    self = [super init];
+    if (self) {
+        _repositoryId = repositoryId;
+        _service = service;
+    }
+    return self;
+}
+
+- (CMISRequest *)typeDefinition:(NSString *)typeId
+                       completionBlock:(void (^)(CMISTypeDefinition *typeDefinition, NSError *error))completionBlock
+{
+    CMISTypeDefinitionCache *cache = _service.bindingSession.typeDefinitionCache;
+    CMISRequest *request = nil;
+    CMISTypeDefinition *typeDefinition = [cache typeDefinitionForTypeId:typeId repositoryId:self.repositoryId];
+    if (!typeDefinition) { // Retrieve type definition from server
+        request = [[CMISRequest alloc] init];
+        [_service retrieveTypeDefinitionInternal:typeId cmisRequest:request completionBlock:^(CMISTypeDefinition *typeDefinition, NSError *error){
+            if (error) {
+                completionBlock(nil, error);
+            } else {
+                if (typeDefinition) { // Store type definition in cache
+                    [cache addTypeDefinition:typeDefinition repositoryId:self.repositoryId];
+                }
+                
+                completionBlock(typeDefinition, nil);
+            }
+        }];
+    } else { // Type definition from cache
+        completionBlock(typeDefinition, nil);
+    }
+    
+    return request;
+}
+
+@end

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingSession.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingSession.h?rev=1589611&r1=1589610&r2=1589611&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingSession.h (original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingSession.h Thu Apr 24 06:51:55 2014
@@ -21,6 +21,7 @@
 #import "CMISSessionParameters.h"
 #import "CMISAuthenticationProvider.h"
 #import "CMISNetworkProvider.h"
+#import "CMISTypeDefinitionCache.h"
 
 // session key constants
 extern NSString * const kCMISBindingSessionKeyUrl;
@@ -35,6 +36,7 @@ extern NSString * const kCMISBindingSess
 @property (nonatomic, strong, readonly) NSString *repositoryId;
 @property (nonatomic, strong, readonly) id<CMISAuthenticationProvider> authenticationProvider;
 @property (nonatomic, strong, readonly) id<CMISNetworkProvider> networkProvider;
+@property (nonatomic, strong, readonly) CMISTypeDefinitionCache *typeDefinitionCache;
 
 - (id)initWithSessionParameters:(CMISSessionParameters *)sessionParameters;
 

Modified: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingSession.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingSession.m?rev=1589611&r1=1589610&r2=1589611&view=diff
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingSession.m (original)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISBindingSession.m Thu Apr 24 06:51:55 2014
@@ -30,6 +30,7 @@ NSString * const kCMISBindingSessionKeyT
 @property (nonatomic, strong, readwrite) NSString *repositoryId;
 @property (nonatomic, strong, readwrite) id<CMISAuthenticationProvider> authenticationProvider;
 @property (nonatomic, strong, readwrite) id<CMISNetworkProvider> networkProvider;
+@property (nonatomic, strong, readwrite) CMISTypeDefinitionCache *typeDefinitionCache;
 @property (nonatomic, strong, readwrite) NSMutableDictionary *sessionData;
 @end
 
@@ -59,6 +60,13 @@ NSString * const kCMISBindingSessionKeyT
         for (id key in sessionParameters.allKeys) {
             [self.sessionData setObject:[sessionParameters objectForKey:key] forKey:key];
         }
+        
+        //set type definition cache after other data stored in the dictionary as the cache size is retrieved from the sessionData in the init method of the CMISTypeDefinitionCache
+        if(sessionParameters.typeDefinitionCache == nil) {
+            self.typeDefinitionCache = [[CMISTypeDefinitionCache alloc] initWithBindingSession:self];
+        } else {
+            self.typeDefinitionCache = sessionParameters.typeDefinitionCache;
+        }
     }
     
     return self;

Added: chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISTypeDefinitionCache.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISTypeDefinitionCache.h?rev=1589611&view=auto
==============================================================================
--- chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISTypeDefinitionCache.h (added)
+++ chemistry/objectivecmis/branches/browser-binding/ObjectiveCMIS/Bindings/CMISTypeDefinitionCache.h Thu Apr 24 06:51:55 2014
@@ -0,0 +1,52 @@
+/*
+ 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 "CMISTypeDefinition.h"
+
+@class CMISBindingSession;
+
+@interface CMISTypeDefinitionCache : NSObject
+
+- (id)initWithBindingSession:(CMISBindingSession *)bindingSession;
+
+/**
+ * Adds a type definition object to the cache.
+ */
+- (void)addTypeDefinition:(CMISTypeDefinition *)typeDefinition repositoryId:(NSString *)repositoryId;
+
+/**
+ * Retrieves a type definition object from the cache.
+ *
+ * @return the type definition object or nil if the object is
+ *         not in the cache
+ */
+- (CMISTypeDefinition *)typeDefinitionForTypeId:(NSString *)typeId repositoryId:(NSString *)repositoryId;
+
+/**
+ * Removes a type definition object from the cache.
+ */
+- (void)removeTypeDefinitionForTypeId:(NSString *)typeId repositoryId:(NSString *)repositoryId;
+
+/**
+ * Removes all cache entries.
+ */
+- (void)removeAll;
+
+@end