Final part of re-factoring, moved last set of atom specific constants out of binding session. Also fixed underlying issues to enable all test to pass on both atom and browser bindings (both bindings are now enabled for testing).

git-svn-id: https://svn.apache.org/repos/asf/chemistry/objectivecmis/branches/browser-binding@1591943 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubBaseService.m b/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubBaseService.m
index 48dff37..e6df482 100644
--- a/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubBaseService.m
+++ b/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubBaseService.m
@@ -96,13 +96,13 @@
                     
                     // Cache uri's and uri templates
                     CMISAtomPubObjectByIdUriBuilder *objectByIdUriBuilder = [[CMISAtomPubObjectByIdUriBuilder alloc] initWithTemplateUrl:workspace.objectByIdUriTemplate];
-                    [self.bindingSession setObject:objectByIdUriBuilder forKey:kCMISBindingSessionKeyObjectByIdUriBuilder];
+                    [self.bindingSession setObject:objectByIdUriBuilder forKey:kCMISAtomBindingSessionKeyObjectByIdUriBuilder];
                     
                     CMISAtomPubObjectByPathUriBuilder *objectByPathUriBuilder = [[CMISAtomPubObjectByPathUriBuilder alloc] initWithTemplateUrl:workspace.objectByPathUriTemplate];
-                    [self.bindingSession setObject:objectByPathUriBuilder forKey:kCMISBindingSessionKeyObjectByPathUriBuilder];
+                    [self.bindingSession setObject:objectByPathUriBuilder forKey:kCMISAtomBindingSessionKeyObjectByPathUriBuilder];
                     
                     CMISAtomPubTypeByIdUriBuilder *typeByIdUriBuilder = [[CMISAtomPubTypeByIdUriBuilder alloc] initWithTemplateUrl:workspace.typeByIdUriTemplate];
-                    [self.bindingSession setObject:typeByIdUriBuilder forKey:kCMISBindingSessionKeyTypeByIdUriBuilder];
+                    [self.bindingSession setObject:typeByIdUriBuilder forKey:kCMISAtomBindingSessionKeyTypeByIdUriBuilder];
                     
                     [self.bindingSession setObject:workspace.queryUriTemplate forKey:kCMISAtomBindingSessionKeyQueryUri];
                     
@@ -183,7 +183,7 @@
                    cmisRequest:(CMISRequest *)cmisRequest
                completionBlock:(void (^)(CMISObjectData *objectData, NSError *error))completionBlock
 {
-    [self retrieveFromCache:kCMISBindingSessionKeyObjectByIdUriBuilder
+    [self retrieveFromCache:kCMISAtomBindingSessionKeyObjectByIdUriBuilder
                 cmisRequest:cmisRequest
             completionBlock:^(id object, NSError *error) {
         CMISAtomPubObjectByIdUriBuilder *objectByIdUriBuilder = object;
@@ -233,7 +233,7 @@
                          cmisRequest:(CMISRequest *)cmisRequest
                      completionBlock:(void (^)(CMISObjectData *objectData, NSError *error))completionBlock
 {
-    [self retrieveFromCache:kCMISBindingSessionKeyObjectByPathUriBuilder
+    [self retrieveFromCache:kCMISAtomBindingSessionKeyObjectByPathUriBuilder
                 cmisRequest:cmisRequest
             completionBlock:^(id object, NSError *error) {
         CMISAtomPubObjectByPathUriBuilder *objectByPathUriBuilder = object;
diff --git a/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubConstants.h b/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubConstants.h
index 953e1cf..2237d1b 100644
--- a/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubConstants.h
+++ b/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubConstants.h
@@ -20,6 +20,10 @@
 #import <Foundation/Foundation.h>
 
 // Session keys
+extern NSString * const kCMISAtomBindingSessionKeyObjectByIdUriBuilder;
+extern NSString * const kCMISAtomBindingSessionKeyObjectByPathUriBuilder;
+extern NSString * const kCMISAtomBindingSessionKeyChildrenByIdUriBuilder;
+extern NSString * const kCMISAtomBindingSessionKeyTypeByIdUriBuilder;
 extern NSString * const kCMISAtomBindingSessionKeyQueryUri;
 extern NSString * const kCMISAtomBindingSessionKeyQueryCollection;
 extern NSString * const kCMISAtomBindingSessionKeyCheckedoutCollection;
diff --git a/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubConstants.m b/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubConstants.m
index e111dde..ac41fe5 100644
--- a/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubConstants.m
+++ b/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubConstants.m
@@ -20,6 +20,10 @@
 #import "CMISAtomPubConstants.h"
 
 // Session keys
+NSString * const kCMISAtomBindingSessionKeyObjectByIdUriBuilder = @"cmis_session_key_atom_objectbyid_uri_builder";
+NSString * const kCMISAtomBindingSessionKeyObjectByPathUriBuilder = @"cmis_session_key_atom_objectbypath_uri_builder";
+NSString * const kCMISAtomBindingSessionKeyChildrenByIdUriBuilder = @"cmis_session_key_atom_childrenbyid_uri_builder";
+NSString * const kCMISAtomBindingSessionKeyTypeByIdUriBuilder = @"cmis_session_key_atom_type_by_id_uri_builder";
 NSString * const kCMISAtomBindingSessionKeyQueryUri = @"cmis_session_key_atom_query_uri";
 NSString * const kCMISAtomBindingSessionKeyQueryCollection = @"cmis_session_key_atom_query_collection";
 NSString * const kCMISAtomBindingSessionKeyCheckedoutCollection = @"cmis_session_key_atom_checkedout_collection";
diff --git a/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubRepositoryService.m b/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubRepositoryService.m
index 05c8c21..3464a3b 100644
--- a/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubRepositoryService.m
+++ b/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubRepositoryService.m
@@ -19,6 +19,7 @@
 
 #import "CMISAtomPubRepositoryService.h"
 #import "CMISAtomPubBaseService+Protected.h"
+#import "CMISAtomPubConstants.h"
 #import "CMISAtomWorkspace.h"
 #import "CMISErrors.h"
 #import "CMISAtomPubTypeByIdUriBuilder.h"
@@ -85,7 +86,7 @@
         return nil;
     }
     CMISRequest *request = [[CMISRequest alloc] init];
-    [self retrieveFromCache:kCMISBindingSessionKeyTypeByIdUriBuilder
+    [self retrieveFromCache:kCMISAtomBindingSessionKeyTypeByIdUriBuilder
                 cmisRequest:request
             completionBlock:^(id object, NSError *error) {
         CMISAtomPubTypeByIdUriBuilder *typeByIdUriBuilder = object;
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBroswerFormDataWriter.m b/ObjectiveCMIS/Bindings/Browser/CMISBroswerFormDataWriter.m
index 87d78b5..b0e872f 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBroswerFormDataWriter.m
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBroswerFormDataWriter.m
@@ -23,6 +23,7 @@
 #import "CMISEnums.h"
 #import "CMISLog.h"
 #import "CMISMimeHelper.h"
+#import "CMISURLUtil.h"
 
 NSString * const kCMISFormDataContentTypeUrlEncoded = @"application/x-www-form-urlencoded;charset=utf-8";
 NSString * const kCMISFormDataContentTypeFormData = @"multipart/form-data; boundary=";
@@ -156,8 +157,8 @@
             } else {
                 [data appendData:amp];
             }
-            NSString *parameterValue = [self.parameters[parameterKey] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
-            NSString *parameter = [NSString stringWithFormat:@"%@=%@", parameterKey, parameterValue];
+            NSString *encodedParameterValue = [CMISURLUtil encodeUrlParameterValue:self.parameters[parameterKey]];
+            NSString *parameter = [NSString stringWithFormat:@"%@=%@", parameterKey, encodedParameterValue];
             [data appendData:[parameter dataUsingEncoding:NSUTF8StringEncoding]];
         }
 
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m b/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
index e5d21c0..4d49b24 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
@@ -37,6 +37,9 @@
 #import "CMISPrincipal.h"
 #import "CMISAllowableActions.h"
 
+NSString * const kCMISBrowserMinValueJSONProperty = @"\"minValue\":0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049,";
+NSString * const kCMISBrowserMaxValueJSONProperty = @"\"maxValue\":179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,";
+
 @interface NSObject (CMISUtil)
 
 + (void)performBlock:(void (^)(void))block;
@@ -124,6 +127,23 @@
     NSError *serialisationError = nil;
     id jsonDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&serialisationError];
     
+    // HACK: An Apple bug can cause deserialisation to fail if very small or very large numbers are used.
+    // This is usually caused when the web service providing the JSON has used a MIN or MAX value for the data type.
+    // If an error occurred attempt to remove the offending data and re-try the deserialisation.
+    if (serialisationError)
+    {
+        // convert to string
+        NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
+        
+        // remove the minValue and maxValue properties as they are effectively indicating any reasonable value is valid
+        jsonString = [jsonString stringByReplacingOccurrencesOfString:kCMISBrowserMinValueJSONProperty withString:@""];
+        jsonString = [jsonString stringByReplacingOccurrencesOfString:kCMISBrowserMaxValueJSONProperty withString:@""];
+        
+        // re-try and JSON parse
+        serialisationError = nil;
+        jsonDictionary = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&serialisationError];
+    }
+    
     CMISTypeDefinition *typeDef = nil;
     if (!serialisationError) {
         //TODO check for valid baseTypeId (cmis:document, cmis:folder, cmis:relationship, cmis:policy, [cmis:item, cmis:secondary])
diff --git a/ObjectiveCMIS/Bindings/CMISBindingSession.h b/ObjectiveCMIS/Bindings/CMISBindingSession.h
index f1bc85a..c9d51e7 100644
--- a/ObjectiveCMIS/Bindings/CMISBindingSession.h
+++ b/ObjectiveCMIS/Bindings/CMISBindingSession.h
@@ -25,10 +25,6 @@
 
 // session key constants
 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 2317ba3..1ed2d7c 100644
--- a/ObjectiveCMIS/Bindings/CMISBindingSession.m
+++ b/ObjectiveCMIS/Bindings/CMISBindingSession.m
@@ -20,10 +20,6 @@
 #import "CMISBindingSession.h"
 
 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 ()
 @property (nonatomic, strong, readwrite) NSString *username;
diff --git a/ObjectiveCMIS/Utils/CMISHttpUploadRequest.m b/ObjectiveCMIS/Utils/CMISHttpUploadRequest.m
index 9572243..d8ede35 100644
--- a/ObjectiveCMIS/Utils/CMISHttpUploadRequest.m
+++ b/ObjectiveCMIS/Utils/CMISHttpUploadRequest.m
@@ -126,7 +126,7 @@
     httpRequest.additionalHeaders = additionalHeaders;
     httpRequest.bytesExpected = bytesExpected;
     httpRequest.authenticationProvider = authenticationProvider;
-    httpRequest.combinedInputStream = NO;
+    httpRequest.useCombinedInputStream = NO;
     httpRequest.combinedInputStream = nil;
     httpRequest.encoderStream = nil;
     
@@ -174,7 +174,8 @@
            headers:(NSDictionary *)additionalHeaders
      bytesExpected:(unsigned long long)bytesExpected
 authenticationProvider:(id<CMISAuthenticationProvider>)authenticationProvider
-         startData:(NSData *)startData endData:(NSData *)endData
+         startData:(NSData *)startData
+           endData:(NSData *)endData
    completionBlock:(void (^)(CMISHttpResponse *, NSError *))completionBlock
      progressBlock:(void (^)(unsigned long long, unsigned long long))progressBlock
 {
diff --git a/ObjectiveCMIS/Utils/CMISURLUtil.h b/ObjectiveCMIS/Utils/CMISURLUtil.h
index 6551467..a2e05ad 100644
--- a/ObjectiveCMIS/Utils/CMISURLUtil.h
+++ b/ObjectiveCMIS/Utils/CMISURLUtil.h
@@ -21,16 +21,23 @@
 
 
 @interface CMISURLUtil : NSObject
+
 /// 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;
 
+/// utility method to encode a URL parameter value
++ (NSString *)encodeUrlParameterValue:(NSString *)value;
+
 @end
\ No newline at end of file
diff --git a/ObjectiveCMIS/Utils/CMISURLUtil.m b/ObjectiveCMIS/Utils/CMISURLUtil.m
index 7f1adc0..789c04e 100644
--- a/ObjectiveCMIS/Utils/CMISURLUtil.m
+++ b/ObjectiveCMIS/Utils/CMISURLUtil.m
@@ -127,4 +127,14 @@
     return [NSURL URLWithString:[CMISURLUtil urlStringByAppendingParameter:parameterName value:parameterValue urlString:[url absoluteString]]];
 }
 
++ (NSString *)encodeUrlParameterValue:(NSString *)value
+{
+    NSString *encodedValue = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,
+                                                                                       (CFStringRef)value,
+                                                                                       NULL,
+                                                                                       (CFStringRef)kCMISRFC7232Reserved,
+                                                                                       kCFStringEncodingUTF8));
+    return encodedValue;
+}
+
 @end
\ No newline at end of file
diff --git a/ObjectiveCMISTests/env-cfg.plist b/ObjectiveCMISTests/env-cfg.plist
index 1a9a7e1..0636aa6 100644
--- a/ObjectiveCMISTests/env-cfg.plist
+++ b/ObjectiveCMISTests/env-cfg.plist
@@ -48,7 +48,7 @@
 		</dict>
 		<dict>
 			<key>disabled</key>
-			<true/>
+			<false/>
 			<key>summary</key>
 			<string>Alfresco v4.2.0 Enterprise. OpenCMIS (PublicAPI) Browser 1.1</string>
 			<key>binding</key>