chemistry-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From psut...@apache.org
Subject svn commit: r1795295 [3/5] - in /chemistry/objectivecmis/trunk: ObjectiveCMIS.xcodeproj/ ObjectiveCMIS/ ObjectiveCMIS/Bindings/ ObjectiveCMIS/Bindings/AtomPub/ ObjectiveCMIS/Bindings/Browser/ ObjectiveCMIS/Client/ ObjectiveCMIS/Common/ ObjectiveCMIS/Ut...
Date Tue, 16 May 2017 10:33:33 GMT
Added: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubAclService.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubAclService.h?rev=1795295&view=auto
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubAclService.h (added)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubAclService.h Tue May 16 10:33:32 2017
@@ -0,0 +1,24 @@
+/*
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+ 
+  http://www.apache.org/licenses/LICENSE-2.0
+ 
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+ */
+
+#import "CMISAtomPubBaseService.h"
+
+@interface CMISAtomPubAclService : CMISAtomPubBaseService <CMISAclService>
+
+@end

Added: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubAclService.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubAclService.m?rev=1795295&view=auto
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubAclService.m (added)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubAclService.m Tue May 16 10:33:32 2017
@@ -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 "CMISAtomPubAclService.h"
+#import "CMISErrors.h"
+
+@implementation CMISAtomPubAclService
+
+-(CMISRequest *)retrieveAcl:(id)objectId
+       onlyBasicPermissions:(BOOL)onlyBasicPermissions
+            completionBlock:(void (^)(CMISAcl *, NSError *))completionBlock
+{
+    // TODO implement
+    completionBlock(nil, [CMISErrors createCMISErrorWithCode:kCMISErrorCodeRuntime detailedDescription:@"not implemented!"]);
+    return nil;
+}
+
+-(CMISRequest *)applyAcl:(id)objectId addAces:(CMISAcl *)addAces
+              removeAces:(CMISAcl *)removeAces
+          aclPropagation:(CMISAclPropagation)aclPropagation
+         completionBlock:(void (^)(CMISAcl *, NSError *))completionBlock
+{
+    // TODO implement
+    completionBlock(nil, [CMISErrors createCMISErrorWithCode:kCMISErrorCodeRuntime detailedDescription:@"not implemented!"]);
+    return nil;
+}
+
+-(CMISRequest *)setAcl:(id)objectId aces:(CMISAcl *)aces
+       completionBlock:(void (^)(CMISAcl *, NSError *))completionBlock
+{
+    // TODO implement
+    completionBlock(nil, [CMISErrors createCMISErrorWithCode:kCMISErrorCodeRuntime detailedDescription:@"not implemented!"]);
+    return nil;
+}
+
+@end

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubBinding.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubBinding.m?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubBinding.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubBinding.m Tue May 16 10:33:32 2017
@@ -24,6 +24,7 @@
 #import "CMISAtomPubNavigationService.h"
 #import "CMISAtomPubVersioningService.h"
 #import "CMISAtomPubDiscoveryService.h"
+#import "CMISAtomPubAclService.h"
 
 @interface CMISAtomPubBinding ()
 
@@ -48,6 +49,7 @@
     if (self) {
         self.session = [[CMISBindingSession alloc] initWithSessionParameters:sessionParameters];
         
+        self.aclService = [[CMISAtomPubAclService alloc] initWithBindingSession:self.session];
         self.repositoryService = [[CMISAtomPubRepositoryService alloc] initWithBindingSession:self.session];
         self.objectService = [[CMISAtomPubObjectService alloc] initWithBindingSession:self.session];
         self.navigationService = [[CMISAtomPubNavigationService alloc] initWithBindingSession:self.session];

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubDiscoveryService.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubDiscoveryService.m?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubDiscoveryService.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubDiscoveryService.m Tue May 16 10:33:32 2017
@@ -19,9 +19,9 @@
 
 #import "CMISAtomPubDiscoveryService.h"
 #import "CMISQueryAtomEntryWriter.h"
-#import "CMISHttpResponse.h"
 #import "CMISAtomPubConstants.h"
 #import "CMISAtomFeedParser.h"
+#import "CMISHttpResponse.h"
 #import "CMISObjectList.h"
 #import "CMISErrors.h"
 #import "CMISLog.h"
@@ -92,4 +92,17 @@ includeAllowableActions:(BOOL)includeAll
     return request;
 }
 
-@end
\ No newline at end of file
+- (CMISRequest*)retrieveContentChanges:(CMISStringInOutParameter *)changeLogTokenParam
+                     includeProperties:(BOOL)includeProperties
+                                filter:(NSString *)filter
+                      includePolicyIds:(BOOL)includePolicyIds
+                            includeAcl:(BOOL)includeAcl
+                              maxItems:(NSNumber *)maxItems
+                       completionBlock:(void (^)(CMISObjectList *objectList, NSError *error))completionBlock
+{
+    // TODO implement
+    completionBlock(nil, [CMISErrors createCMISErrorWithCode:kCMISErrorCodeRuntime detailedDescription:@"not implemented!"]);
+    return nil;
+}
+
+@end

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubObjectByIdUriBuilder.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubObjectByIdUriBuilder.m?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubObjectByIdUriBuilder.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubObjectByIdUriBuilder.m Tue May 16 10:33:32 2017
@@ -73,7 +73,7 @@
         urlString = [NSString stringWithFormat:@"%@&returnVersion=%@", urlString, returnVersionParam];
     }
 
-    return [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
+    return [NSURL URLWithString:[urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]];
 }
 
-@end
\ No newline at end of file
+@end

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubObjectByPathUriBuilder.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubObjectByPathUriBuilder.m?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubObjectByPathUriBuilder.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubObjectByPathUriBuilder.m Tue May 16 10:33:32 2017
@@ -56,8 +56,8 @@
     }
     urlString = [urlString stringByReplacingOccurrencesOfString:@"{includeRelationships}" withString:includeRelationShipParam];
 
-    return [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
+    return [NSURL URLWithString:[urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]];
 }
 
 
-@end
\ No newline at end of file
+@end

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBroswerFormDataWriter.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBroswerFormDataWriter.h?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBroswerFormDataWriter.h (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBroswerFormDataWriter.h Tue May 16 10:33:32 2017
@@ -18,7 +18,9 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "CMISProperties.h"
+
+@class CMISProperties;
+@class CMISAcl;
 
 @interface CMISBroswerFormDataWriter : NSObject
 
@@ -30,6 +32,10 @@
 
 - (void)addParameter:(NSString *)name boolValue:(BOOL)value;
 
+- (void)addAcesParameters:(CMISAcl *)acl;
+
+- (void)addRemoveAcesParameters:(CMISAcl *)acl;
+
 /// if the fileName is not set the value of the property with id kCMISPropertyName will be used for the form data content name
 - (void)addPropertiesParameters:(CMISProperties *)properties;
 

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBroswerFormDataWriter.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBroswerFormDataWriter.m?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBroswerFormDataWriter.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBroswerFormDataWriter.m Tue May 16 10:33:32 2017
@@ -24,6 +24,9 @@
 #import "CMISLog.h"
 #import "CMISMimeHelper.h"
 #import "CMISURLUtil.h"
+#import "CMISAcl.h"
+#import "CMISAce.h"
+#import "CMISProperties.h"
 
 NSString * const kCMISFormDataContentTypeUrlEncoded = @"application/x-www-form-urlencoded;charset=utf-8";
 NSString * const kCMISFormDataContentTypeFormData = @"multipart/form-data; boundary=";
@@ -74,6 +77,41 @@ NSString * const kCMISFormDataContentTyp
     [self addParameter:name value:(value? kCMISParameterValueTrue : kCMISParameterValueFalse)];
 }
 
+- (void)addAcesParameters:(CMISAcl *)acl
+{
+    [self addAcesParameters:acl principalControl:kCMISBrowserJSONControlAddAcePrincipal permissionControl:kCMISBrowserJSONControlAddAcePermission];
+}
+
+- (void)addRemoveAcesParameters:(CMISAcl *)acl
+{
+    [self addAcesParameters:acl principalControl:kCMISBrowserJSONControlRemoveAcePrincipal permissionControl:kCMISBrowserJSONControlRemoveAcePermission];
+}
+
+- (void)addAcesParameters:(CMISAcl *)acl principalControl:(NSString *)principalControl permissionControl:(NSString *)permissionControl
+{
+    if (!acl || !acl.aces) {
+        return;
+    }
+    
+    int idx = 0;
+    for (CMISAce *ace in acl.aces) {
+        if (ace.principalId && ace.permissions.count > 0) {
+            NSString *idxStr = [NSString stringWithFormat:@"[%d]", idx];
+            [self addParameter:[NSString stringWithFormat:@"%@%@", principalControl, idxStr] value:ace.principalId];
+            
+            int permIdx = 0;
+            for (NSString *perm in ace.permissions) {
+                if (perm) {
+                    NSString *permIdxStr = [NSString stringWithFormat:@"[%d]", permIdx];
+                    [self addParameter:[NSString stringWithFormat:@"%@%@%@", permissionControl, idxStr, permIdxStr] value:perm];
+                    permIdx++;
+                }
+            }
+            idx++;
+        }
+    }
+}
+
 - (void)addSuccinctFlag:(BOOL)succinct
 {
     if (succinct) {

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

Added: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserAclService.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserAclService.m?rev=1795295&view=auto
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserAclService.m (added)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserAclService.m Tue May 16 10:33:32 2017
@@ -0,0 +1,153 @@
+/*
+  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 "CMISBrowserAclService.h"
+#import "CMISConstants.h"
+#import "CMISBrowserConstants.h"
+#import "CMISURLUtil.h"
+#import "CMISRequest.h"
+#import "CMISHttpResponse.h"
+#import "CMISBrowserUtil.h"
+#import "CMISEnums.h"
+#import "CMISBroswerFormDataWriter.h"
+#import "CMISAce.h"
+#import "CMISErrors.h"
+
+@implementation CMISBrowserAclService
+
+-(CMISRequest *)retrieveAcl:(NSString *)objectId
+       onlyBasicPermissions:(BOOL)onlyBasicPermissions
+            completionBlock:(void (^)(CMISAcl *, NSError *))completionBlock
+{
+    // build URL
+    NSString *objectUrl = [self retrieveObjectUrlForObjectWithId:objectId selector:kCMISBrowserJSONSelectorAcl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterOnlyBasicPermissions boolValue:onlyBasicPermissions urlString:objectUrl];
+    
+    // read and parse
+    CMISRequest *cmisRequest = [[CMISRequest alloc] init];
+    [self.bindingSession.networkProvider invokeGET:[NSURL URLWithString:objectUrl]
+                                           session:self.bindingSession
+                                       cmisRequest:cmisRequest
+                                   completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
+                                       if (httpResponse.statusCode == 200 && httpResponse.data) {
+                                           [CMISBrowserUtil aclFromJSONData:httpResponse.data completionBlock:^(CMISAcl *acl, NSError *error) {
+                                               if (error) {
+                                                   completionBlock(nil, error);
+                                               } else {
+                                                   completionBlock(acl, nil);
+                                               }
+                                           }];
+                                       } else {
+                                           completionBlock(nil, error);
+                                       }
+                                   }];
+    
+    return cmisRequest;
+}
+
+- (CMISRequest*)applyAcl:objectId
+                 addAces:(CMISAcl *)addAces
+              removeAces:(CMISAcl *)removeAces
+          aclPropagation:(CMISAclPropagation)aclPropagation
+         completionBlock:(void (^)(CMISAcl *acl, NSError *error))completionBlock
+{
+    CMISRequest *cmisRequest = [[CMISRequest alloc] init];
+    
+    [self internalApplyAcl:objectId
+                   addAces:addAces
+                removeAces:removeAces
+            aclPropagation:aclPropagation
+               cmisRequest:cmisRequest
+           completionBlock:completionBlock];
+    
+    return cmisRequest;
+}
+
+- (CMISRequest*)internalApplyAcl:objectId
+                         addAces:(CMISAcl *)addAces
+                      removeAces:(CMISAcl *)removeAces
+                  aclPropagation:(CMISAclPropagation)aclPropagation
+                     cmisRequest:(CMISRequest *)cmisRequest
+                 completionBlock:(void (^)(CMISAcl *acl, NSError *error))completionBlock
+{
+    if (!cmisRequest.isCancelled) {
+        // build URL
+        NSString *objectUrl = [self retrieveObjectUrlForObjectWithId:objectId selector:kCMISBrowserJSONSelectorAcl];
+        
+        // prepare form data
+        CMISBroswerFormDataWriter *formData = [[CMISBroswerFormDataWriter alloc] initWithAction:kCMISBrowserJSONActionApplyAcl];
+        [formData addAcesParameters:addAces];
+        [formData addRemoveAcesParameters:removeAces];
+        [formData addParameter:kCMISParameterAclPropagation value:[CMISEnums stringForAclPropagation:aclPropagation]];
+        
+        // send
+        [self.bindingSession.networkProvider invokePOST:[NSURL URLWithString:objectUrl]
+                                                session:self.bindingSession
+                                                   body:formData.body
+                                                headers:formData.headers
+                                            cmisRequest:cmisRequest
+                                        completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
+                                            if ((httpResponse.statusCode == 200 || httpResponse.statusCode == 201) && httpResponse.data) {
+                                                [CMISBrowserUtil aclFromJSONData:httpResponse.data completionBlock:^(CMISAcl *acl, NSError *error) {
+                                                    if (error) {
+                                                        completionBlock(nil, error);
+                                                    } else {
+                                                        completionBlock(acl, nil);
+                                                    }
+                                                }];
+                                            } else {
+                                                completionBlock(nil, error);
+                                            }
+                                        }];
+
+    } else {
+        if (completionBlock) {
+            completionBlock(nil, [CMISErrors createCMISErrorWithCode:kCMISErrorCodeCancelled
+                                                 detailedDescription:@"Request was cancelled"]);
+        }
+    }
+    return cmisRequest;
+}
+
+- (CMISRequest*)setAcl:objectId
+                  aces:(CMISAcl *)aces
+       completionBlock:(void (^)(CMISAcl *acl, NSError *error))completionBlock
+{
+    __block CMISRequest *cmisRequest = [self retrieveAcl:objectId onlyBasicPermissions:NO completionBlock:^(CMISAcl *currentAcl, NSError *error) {
+        if (error) {
+            if (completionBlock) {
+                completionBlock(nil, error);
+            }
+        } else {
+            NSMutableSet *removeAcesSet = [NSMutableSet new];
+            for (CMISAce *ace in currentAcl.aces) {
+                if (ace.isDirect) {
+                    [removeAcesSet addObject:ace];
+                }
+            }
+            
+            CMISAcl *removeAces = [[CMISAcl alloc] init];
+            [removeAces setAces:removeAcesSet];
+            [self internalApplyAcl:objectId addAces:aces removeAces:removeAces aclPropagation:CMISAclPropagationObjectOnly cmisRequest:cmisRequest completionBlock:completionBlock];
+        }
+    }];
+    return cmisRequest;
+}
+
+@end

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserBinding.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserBinding.m?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserBinding.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserBinding.m Tue May 16 10:33:32 2017
@@ -24,6 +24,7 @@
 #import "CMISBrowserNavigationService.h"
 #import "CMISBrowserVersioningService.h"
 #import "CMISBrowserDiscoveryService.h"
+#import "CMISBrowserAclService.h"
 
 @interface CMISBrowserBinding ()
 
@@ -53,6 +54,7 @@
         self.navigationService = [[CMISBrowserNavigationService alloc] initWithBindingSession:self.session];
         self.versioningService = [[CMISBrowserVersioningService alloc] initWithBindingSession:self.session];
         self.discoveryService = [[CMISBrowserDiscoveryService alloc] initWithBindingSession:self.session];
+        self.aclService = [[CMISBrowserAclService alloc] initWithBindingSession:self.session];
     }
     return self;
 }

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.h?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.h (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.h Tue May 16 10:33:32 2017
@@ -89,6 +89,7 @@ extern NSString * const kCMISBrowserJSON
 extern NSString * const kCMISBrowserJSONObject;
 extern NSString * const kCMISBrowserJSONHasMoreItems;
 extern NSString * const kCMISBrowserJSONNumberItems;
+extern NSString * const kCMISBrowserJSONChangeLogToken;
 extern NSString * const kCMISBrowserJSONThinClientUri;
 extern NSString * const kCMISBrowserJSONChangesIncomplete;
 extern NSString * const kCMISBrowserJSONChangesOnType;
@@ -105,6 +106,8 @@ extern NSString * const kCMISBrowserJSON
 extern NSString * const kCMISBrowserJSONAcePrincipalId;
 extern NSString * const kCMISBrowserJSONAcePermissions;
 extern NSString * const kCMISBrowserJSONAceIsDirect;
+extern NSString * const kCMISBrowserJSONChangeEventType;
+extern NSString * const kCMISBrowserJSONChangeEventTime;
 
 // JSON enum values
 extern NSString * const kCMISBrowserJSONPropertyTypeValueString;
@@ -164,6 +167,10 @@ extern NSString * const kCMISBrowserJSON
 extern NSString * const kCMISBrowserJSONControlCmisAction;
 extern NSString * const kCMISBrowserJSONControlPropertyId;
 extern NSString * const kCMISBrowserJSONControlPropertyValue;
+extern NSString * const kCMISBrowserJSONControlAddAcePrincipal;
+extern NSString * const kCMISBrowserJSONControlAddAcePermission;
+extern NSString * const kCMISBrowserJSONControlRemoveAcePrincipal;
+extern NSString * const kCMISBrowserJSONControlRemoveAcePermission;
 
 // Browser binding actions
 extern NSString * const kCMISBrowserJSONActionCreateType;
@@ -204,5 +211,7 @@ extern NSString * const kCMISBrowserJSON
 + (NSSet *)aclKeys;
 + (NSSet *)aceKeys;
 + (NSSet *)principalKeys;
++ (NSSet *)policyIdsKeys;
++ (NSSet *)changeEventKeys;
 
 @end

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.m?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.m Tue May 16 10:33:32 2017
@@ -30,6 +30,8 @@ static NSSet *_queryResultListKeys;
 static NSSet *_aclKeys;
 static NSSet *_aceKeys;
 static NSSet *_principalKeys;
+static NSSet *_policyIdKeys;
+static NSSet *_changeEventKeys;
 
 @implementation CMISBrowserConstants
 
@@ -118,6 +120,8 @@ NSString * const kCMISBrowserJSONAcePrin
 NSString * const kCMISBrowserJSONAcePrincipalId = @"principalId";
 NSString * const kCMISBrowserJSONAcePermissions = @"permissions";
 NSString * const kCMISBrowserJSONAceIsDirect = @"isDirect";
+NSString * const kCMISBrowserJSONChangeEventType = @"changeType";
+NSString * const kCMISBrowserJSONChangeEventTime = @"changeTime";
 
 
 // JSON enum values
@@ -180,6 +184,10 @@ NSString * const kCMISBrowserJSONParamet
 NSString * const kCMISBrowserJSONControlCmisAction = @"cmisaction";
 NSString * const kCMISBrowserJSONControlPropertyId = @"propertyId";
 NSString * const kCMISBrowserJSONControlPropertyValue = @"propertyValue";
+NSString * const kCMISBrowserJSONControlAddAcePrincipal = @"addACEPrincipal";
+NSString * const kCMISBrowserJSONControlAddAcePermission = @"addACEPermission";
+NSString * const kCMISBrowserJSONControlRemoveAcePrincipal = @"removeACEPrincipal";
+NSString * const kCMISBrowserJSONControlRemoveAcePermission = @"removeACEPermission";
 
 
 // Browser binding actions
@@ -408,4 +416,25 @@ NSString * const kCMISBrowserJSONActionA
     return _principalKeys;
 }
 
++ (NSSet *)policyIdsKeys
+{
+    if(!_policyIdKeys) {
+        _policyIdKeys = [NSSet setWithObjects:
+                          kCMISBrowserJSONPolicyIdsIds,
+                          nil];
+    }
+    return _policyIdKeys;
+}
+
++ (NSSet *)changeEventKeys
+{
+    if(!_changeEventKeys) {
+        _changeEventKeys = [NSSet setWithObjects:
+                         kCMISBrowserJSONChangeEventType,
+                         kCMISBrowserJSONChangeEventTime,
+                         nil];
+    }
+    return _changeEventKeys;
+}
+
 @end

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserDiscoveryService.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserDiscoveryService.m?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserDiscoveryService.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserDiscoveryService.m Tue May 16 10:33:32 2017
@@ -26,6 +26,8 @@
 #import "CMISBrowserConstants.h"
 #import "CMISConstants.h"
 #import "CMISEnums.h"
+#import "CMISURLUtil.h"
+#import "CMISStringInOutParameter.h"
 
 @implementation CMISBrowserDiscoveryService
 
@@ -71,6 +73,54 @@ includeAllowableActions:(BOOL)includeAll
                                        } else {
                                            completionBlock(nil, error);
                                        }
+                                   }];
+    return cmisRequest;
+}
+
+- (CMISRequest *)retrieveContentChanges:(CMISStringInOutParameter *)changeLogTokenParam
+                     includeProperties:(BOOL)includeProperties
+                                filter:(NSString *)filter
+                      includePolicyIds:(BOOL)includePolicyIds
+                            includeAcl:(BOOL)includeAcl
+                              maxItems:(NSNumber *)maxItems
+                       completionBlock:(void (^)(CMISObjectList *, NSError *))completionBlock
+{
+    // build url
+    NSString *url = [self retrieveRepositoryUrlWithSelector:kCMISBrowserJSONSelectorContentChanges];
+    url = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterChangeLogToken value:changeLogTokenParam.inParameter urlString:url];
+    url = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeProperties boolValue:includeProperties urlString:url];
+    url = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterFilter value:filter urlString:url];
+    url = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludePolicyIds boolValue:includePolicyIds urlString:url];
+    url = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeAcl boolValue:includeAcl urlString:url];
+    url = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterMaxItems numberValue:maxItems urlString:url];
+    url = [CMISURLUtil urlStringByAppendingParameter:kCMISBrowserJSONParameterSuccinct value:kCMISParameterValueTrue urlString:url];
+    
+    // read and parse
+    CMISRequest *cmisRequest = [[CMISRequest alloc] init];
+    [self.bindingSession.networkProvider invokeGET:[NSURL URLWithString:url]
+                                           session:self.bindingSession
+                                       cmisRequest:cmisRequest
+                                   completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
+                                       if (httpResponse.statusCode == 200 && httpResponse.data) {
+                                           NSError *parsingError = nil;
+                                           NSString *token = [CMISBrowserUtil objectListChangeLogTokenFromJSONData:httpResponse.data error:&parsingError];
+                                           if (parsingError) {
+                                               completionBlock(nil, parsingError);
+                                           } else {
+                                               changeLogTokenParam.outParameter = token;
+                                               
+                                               CMISBrowserTypeCache *typeCache = [[CMISBrowserTypeCache alloc] initWithRepositoryId:self.bindingSession.repositoryId bindingService:self];
+                                               [CMISBrowserUtil objectListFromJSONData:httpResponse.data typeCache:typeCache isQueryResult:NO completionBlock:^(CMISObjectList *objectList, NSError *objectListParseError) {
+                                                   if (objectListParseError) {
+                                                       completionBlock(nil, objectListParseError);
+                                                   } else {
+                                                       completionBlock(objectList, nil);
+                                                   }
+                                               }];
+                                           }
+                                       } else {
+                                           completionBlock(nil, error);
+                                       }
                                    }];
     return cmisRequest;
 }

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserNavigationService.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserNavigationService.m?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserNavigationService.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserNavigationService.m Tue May 16 10:33:32 2017
@@ -24,6 +24,7 @@
 #import "CMISBrowserUtil.h"
 #import "CMISBrowserConstants.h"
 #import "CMISURLUtil.h"
+#import "CMISBrowserTypeCache.h"
 
 @implementation CMISBrowserNavigationService
 

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserObjectService.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserObjectService.m?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserObjectService.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserObjectService.m Tue May 16 10:33:32 2017
@@ -29,6 +29,7 @@
 #import "CMISLog.h"
 #import "CMISBroswerFormDataWriter.h"
 #import "CMISStringInOutParameter.h"
+#import "CMISBrowserTypeCache.h"
 
 @implementation CMISBrowserObjectService
 
@@ -336,35 +337,47 @@
     
     CMISRequest *cmisRequest = [[CMISRequest alloc] init];
     
+    void (^responseHandlingBlock) (CMISHttpResponse*, NSError*) = ^(CMISHttpResponse *httpResponse, NSError *error) {
+        if ((httpResponse.statusCode == 200 || httpResponse.statusCode == 201) && httpResponse.data) {
+            CMISBrowserTypeCache *typeCache = [[CMISBrowserTypeCache alloc] initWithRepositoryId:self.bindingSession.repositoryId bindingService:self];
+            [CMISBrowserUtil objectDataFromJSONData:httpResponse.data typeCache:typeCache completionBlock:^(CMISObjectData *objectData, NSError *error) {
+                if (error) {
+                    completionBlock(error);
+                } else {
+                    objectId.outParameter = objectData.identifier;
+                    changeToken.outParameter = objectData.properties.propertiesDictionary[kCMISPropertyChangeToken];
+                    
+                    completionBlock(nil);
+                }
+            }];
+        } else {
+            completionBlock(error);
+        }
+    };
+    
     // send
-    [self.bindingSession.networkProvider invoke:[NSURL URLWithString:objectUrl]
-                                     httpMethod:HTTP_POST
-                                        session:self.bindingSession
-                                    inputStream:inputStream
-                                        headers:formData.headers
-                                  bytesExpected:bytesExpected
-                                    cmisRequest:cmisRequest
-                                      startData:formData.startData
-                                        endData:formData.endData
-                              useBase64Encoding:NO
-                                completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
-                                    if ((httpResponse.statusCode == 200 || httpResponse.statusCode == 201) && httpResponse.data) {
-                                        CMISBrowserTypeCache *typeCache = [[CMISBrowserTypeCache alloc] initWithRepositoryId:self.bindingSession.repositoryId bindingService:self];
-                                        [CMISBrowserUtil objectDataFromJSONData:httpResponse.data typeCache:typeCache completionBlock:^(CMISObjectData *objectData, NSError *error) {
-                                            if (error) {
-                                                completionBlock(error);
-                                            } else {
-                                                objectId.outParameter = objectData.identifier;
-                                                changeToken.outParameter = objectData.properties.propertiesDictionary[kCMISPropertyChangeToken];
-                                                
-                                                completionBlock(nil);
-                                            }
-                                        }];
-                                    } else {
-                                        completionBlock(error);
-                                    }
-                                }
-                                  progressBlock:progressBlock];
+    if (inputStream) {
+        [self.bindingSession.networkProvider invoke:[NSURL URLWithString:objectUrl]
+                                         httpMethod:HTTP_POST
+                                            session:self.bindingSession
+                                        inputStream:inputStream
+                                            headers:formData.headers
+                                      bytesExpected:bytesExpected
+                                        cmisRequest:cmisRequest
+                                          startData:formData.startData
+                                            endData:formData.endData
+                                  useBase64Encoding:NO
+                                    completionBlock:responseHandlingBlock
+                                      progressBlock:progressBlock];
+    } else {
+        [self.bindingSession.networkProvider invokePOST:[NSURL URLWithString:objectUrl]
+                                                session:self.bindingSession
+                                                   body:formData.body
+                                                headers:formData.headers
+                                            cmisRequest:cmisRequest
+                                        completionBlock:responseHandlingBlock];
+    }
+    
     return cmisRequest;
 }
 

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.h?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.h (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.h Tue May 16 10:33:32 2017
@@ -18,11 +18,13 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "CMISTypeDefinition.h"
-#import "CMISObjectData.h"
-#import "CMISObjectList.h"
-#import "CMISBindingSession.h"
-#import "CMISBrowserTypeCache.h"
+
+@class CMISObjectData;
+@class CMISBindingSession;
+@class CMISAcl;
+@class CMISObjectList;
+@class CMISBrowserTypeCache;
+@class CMISTypeDefinition;
 
 @interface CMISBrowserUtil : NSObject
 
@@ -61,4 +63,11 @@
  */
 + (void)objectParents:(NSData *)jsonData typeCache:(CMISBrowserTypeCache *)typeCache completionBlock:(void(^)(NSArray *objectParents, NSError *error))completionBlock;
 
+/**
+ Returns a CMISAcl object parsed from the given JSON data.
+ */
++ (void)aclFromJSONData:(NSData *)jsonData completionBlock:(void(^)(CMISAcl *objectList, NSError *error))completionBlock;
+
++ (NSString *)objectListChangeLogTokenFromJSONData:(NSData *)jsonData error:(NSError **)outError;
+
 @end

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m Tue May 16 10:33:32 2017
@@ -36,6 +36,10 @@
 #import "CMISAce.h"
 #import "CMISPrincipal.h"
 #import "CMISAllowableActions.h"
+#import "CMISBrowserTypeCache.h"
+#import "CMISObjectList.h"
+#import "CMISPolicyIdList.h"
+#import "CMISChangeEventInfo.h"
 
 NSString * const kCMISBrowserMinValueAlfrescoJSONProperty = @"\"minValue\":0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049,";
 NSString * const kCMISBrowserMinValueECMJSONProperty = @"\"minValue\":-179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,";
@@ -368,6 +372,44 @@ NSString * const kCMISBrowserMaxValueECM
     }
 }
 
++(void)aclFromJSONData:(NSData *)jsonData completionBlock:(void (^)(CMISAcl *, NSError *))completionBlock
+{
+    // TODO: error handling i.e. if jsonData is nil, also handle outError being nil
+    
+    // parse the JSON response
+    NSError *serialisationError = nil;
+    id jsonDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&serialisationError];
+    
+    if (!serialisationError) {
+        BOOL isExactAcl = [jsonDictionary cmis_boolForKey:kCMISBrowserJSONIsExact];
+        CMISAcl *acl = [self convertAcl:jsonDictionary isExactAcl:isExactAcl];
+        completionBlock(acl, nil);
+    } else {
+        completionBlock(nil, [CMISErrors cmisError:serialisationError cmisErrorCode:kCMISErrorCodeRuntime]);
+        return;
+    }
+}
+
++ (NSString *)objectListChangeLogTokenFromJSONData:(NSData *)jsonData error:(NSError *__autoreleasing *)outError
+{
+    // TODO: error handling i.e. if jsonData is nil, also handle outError being nil
+    
+    // parse the JSON response
+    NSError *serialisationError = nil;
+    id jsonDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&serialisationError];
+    
+    NSString *token = nil;
+    if (!serialisationError) {
+        // parse the json into a CMISObjectData object
+        token = [jsonDictionary cmis_objectForKeyNotNull:kCMISBrowserJSONChangeLogToken];
+    } else {
+        if (outError != NULL) *outError = [CMISErrors cmisError:serialisationError cmisErrorCode:kCMISErrorCodeRuntime];
+        return nil;
+    }
+    
+    return token;
+}
+
 #pragma mark -
 #pragma mark Private helper methods
 
@@ -405,6 +447,8 @@ NSString * const kCMISBrowserMaxValueECM
         objectData.baseType = CMISBaseTypeDocument;
     } else if ([baseType isEqualToString:kCMISPropertyObjectTypeIdValueFolder]) {
         objectData.baseType = CMISBaseTypeFolder;
+    } else if ([baseType isEqualToString:kCMISPropertyObjectTypeIdValueItem]) {
+        objectData.baseType = CMISBaseTypeItem;
     }
     
     BOOL isExactAcl = [dictionary cmis_boolForKey:kCMISBrowserJSONIsExact];
@@ -412,9 +456,20 @@ NSString * const kCMISBrowserMaxValueECM
     
     objectData.allowableActions = [CMISBrowserUtil convertAllowableActions:[dictionary cmis_objectForKeyNotNull:kCMISBrowserJSONAllowableActions]];
     
+    NSDictionary *jsonChangeEventInfo = [dictionary cmis_objectForKeyNotNull:kCMISBrowserJSONChangeEventInfo];
+    if (jsonChangeEventInfo) {
+        CMISChangeEventInfo *changeEventInfo = [CMISChangeEventInfo new];
+        
+        changeEventInfo.changeTime = [CMISBrowserUtil convertNumberToDate:[jsonChangeEventInfo cmis_objectForKeyNotNull:kCMISBrowserJSONChangeEventTime]];
+        changeEventInfo.changeType = [CMISEnums enumForChangeType:[jsonChangeEventInfo cmis_objectForKeyNotNull:kCMISBrowserJSONChangeEventType]];
+        
+        changeEventInfo.extensions = [CMISObjectConverter convertExtensions:dictionary cmisKeys:[CMISBrowserConstants changeEventKeys]];
+        
+        objectData.changeEventInfo = changeEventInfo;
+    }
+    
     objectData.isExactAcl = isExactAcl;
-
-    // TODO set policyIds
+    objectData.policyIds = [CMISBrowserUtil convertPolicyIds:[dictionary cmis_objectForKeyNotNull:kCMISBrowserJSONPolicyIds]];
     
     NSDictionary *propertiesExtension = [dictionary cmis_objectForKeyNotNull:kCMISBrowserJSONPropertiesExtension];
     
@@ -652,6 +707,16 @@ NSString * const kCMISBrowserMaxValueECM
             id propValue = [propertiesJson cmis_objectForKeyNotNull:propName];
             NSArray *values = nil;
             if ([propValue isKindOfClass:NSArray.class]) {
+                // validate array, it must not contain null elements
+                for (id value in propValue) {
+                    if (value == [NSNull null]) {
+                        NSError *error = [CMISErrors createCMISErrorWithCode:kCMISErrorCodeInvalidArgument
+                                                         detailedDescription:[NSString stringWithFormat:@"Array of property %@ contains null elements!", propName]];
+                        completionBlock(nil, error);
+                        return;
+                    }
+                }
+                
                 values = propValue;
             } else if (propValue) {
                 values = [NSArray arrayWithObject:propValue];
@@ -678,7 +743,7 @@ NSString * const kCMISBrowserMaxValueECM
                     }
                     default: {
                         NSError *error = [CMISErrors createCMISErrorWithCode:kCMISErrorCodeInvalidArgument
-                                                         detailedDescription:@"Unknown property type!"];
+                                                         detailedDescription:[NSString stringWithFormat:@"Unknown property type of property %@!", propName]];
                         completionBlock(nil, error);
                         return;
                     }
@@ -753,6 +818,14 @@ NSString * const kCMISBrowserMaxValueECM
     return dates;
 }
 
++ (NSDate *)convertNumberToDate:(NSNumber *)miliseconds
+{
+    if (!miliseconds) {
+        return nil;
+    }
+    return [NSDate dateWithTimeIntervalSince1970:[miliseconds unsignedLongLongValue] / 1000.0]; // miliseconds to seconds
+}
+
 + (void)convertProperties:(NSArray*)propNames position:(NSInteger)position properties:(CMISProperties *)properties propertiesJson:(NSDictionary *)propertiesJson typeCache:(CMISBrowserTypeCache *)typeCache typeDefinition:(CMISTypeDefinition *)typeDef secondaryTypeDefinitions:(NSArray *)secTypeDefs completionBlock:(void (^)(CMISProperties *properties, NSError *error))completionBlock
 {
     NSString *propName = [propNames objectAtIndex:position];
@@ -888,6 +961,32 @@ NSString * const kCMISBrowserMaxValueECM
     
     return result;
 }
+
++ (CMISPolicyIdList *)convertPolicyIds:(NSDictionary *)jsonDictionary
+{
+    if (!jsonDictionary) {
+        return nil;
+    }
+    
+    CMISPolicyIdList *result = [CMISPolicyIdList new];
+    NSMutableArray *policyIds = [NSMutableArray new];
+    
+    NSArray *ids = [jsonDictionary cmis_objectForKeyNotNull:kCMISBrowserJSONPolicyIdsIds];
+    
+    if (ids && [ids isKindOfClass:NSArray.class]) {
+        for (id obj in ids) {
+            if ([obj isKindOfClass:NSString.class]) {
+                [policyIds addObject:obj];
+            }
+        }
+    }
+    
+    result.extensions = [CMISObjectConverter convertExtensions:jsonDictionary cmisKeys:[CMISBrowserConstants policyIdsKeys]];
+    
+    result.policyIds = [policyIds copy];
+    
+    return result;
+}
 
 + (CMISAllowableActions *)convertAllowableActions:(NSDictionary *)jsonDictionary
 {

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m Tue May 16 10:33:32 2017
@@ -28,6 +28,8 @@
 #import "CMISBroswerFormDataWriter.h"
 #import "CMISFileUtil.h"
 #import "CMISLog.h"
+#import "CMISBrowserTypeCache.h"
+#import "CMISObjectList.h"
 
 @implementation CMISBrowserVersioningService
 

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISAclService.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISAclService.h?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISAclService.h (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISAclService.h Tue May 16 10:33:32 2017
@@ -18,7 +18,38 @@
  */
  
 #import <Foundation/Foundation.h>
+#import "CMISEnums.h"
+
+@class CMISExtensionData;
+@class CMISAcl;
+@class CMISRequest;
 
 @protocol CMISAclService <NSObject>
 
+/**
+ * Retrieves the acl of an object with the given object identifier.
+ * completionBlock returns acl for an object or nil if unsuccessful
+ */
+- (CMISRequest*)retrieveAcl:objectId
+       onlyBasicPermissions:(BOOL)onlyBasicPermissions
+            completionBlock:(void (^)(CMISAcl *acl, NSError *error))completionBlock;
+
+/**
+ * Removes and adds the specified acl to an object with the given object identifier.
+ * completionBlock returns acl for an object or nil if unsuccessful
+ */
+- (CMISRequest*)applyAcl:objectId
+                 addAces:(CMISAcl *)addAces
+              removeAces:(CMISAcl *)removeAces
+          aclPropagation:(CMISAclPropagation)aclPropagation
+         completionBlock:(void (^)(CMISAcl *acl, NSError *error))completionBlock;
+
+/**
+ * Sets the specified acl to an object with the given object identifier.
+ * completionBlock returns acl for an object or nil if unsuccessful
+ */
+- (CMISRequest*)setAcl:objectId
+                  aces:(CMISAcl *)aces
+       completionBlock:(void (^)(CMISAcl *acl, NSError *error))completionBlock;
+
 @end

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISBindingSession.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISBindingSession.m?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISBindingSession.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISBindingSession.m Tue May 16 10:33:32 2017
@@ -57,7 +57,12 @@ NSString * const kCMISBindingSessionKeyU
             [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
+        // set session to authentication provider after other data stored in the dictionary as the authentication provider might access the sessionData within the setSession method
+        if ([self.authenticationProvider respondsToSelector:@selector(setSession:)]) {
+            [self.authenticationProvider setSession:self];
+        }
+        
+        // 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 {

Added: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEvent.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEvent.h?rev=1795295&view=auto
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEvent.h (added)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEvent.h Tue May 16 10:33:32 2017
@@ -0,0 +1,49 @@
+/*
+  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 "CMISChangeEventInfo.h"
+
+@class CMISAcl;
+
+/**
+ * Change event in the change log.
+ */
+@interface CMISChangeEvent : CMISChangeEventInfo
+
+/**
+ * object ID, not nil.
+ */
+@property (nonatomic, strong) NSString *objectId;
+
+/**
+ * Dictionary of NSString : NSArray objects.
+ */
+@property (nonatomic, strong)NSDictionary *properties;
+
+/**
+ * NSArray of NSString, representing the policy IDs.
+ */
+@property (nonatomic, strong) NSArray *policyIds;
+
+@property (nonatomic, strong) CMISAcl *acl;
+
+
+
+@end

Added: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEvent.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEvent.m?rev=1795295&view=auto
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEvent.m (added)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEvent.m Tue May 16 10:33:32 2017
@@ -0,0 +1,24 @@
+/*
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+ 
+  http://www.apache.org/licenses/LICENSE-2.0
+ 
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+ */
+
+#import "CMISChangeEvent.h"
+
+@implementation CMISChangeEvent
+
+@end

Added: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEventInfo.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEventInfo.h?rev=1795295&view=auto
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEventInfo.h (added)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEventInfo.h Tue May 16 10:33:32 2017
@@ -0,0 +1,38 @@
+/*
+  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 "CMISExtensionData.h"
+#import "CMISEnums.h"
+
+/**
+ * Class to hold the basic change event.
+ */
+@interface CMISChangeEventInfo : CMISExtensionData
+
+/**
+ * Change event type, not nil
+ */
+@property (nonatomic, assign) CMISChangeType changeType;
+
+/**
+ * Timestamp when the change took place, not nil
+ */
+@property (nonatomic, strong) NSDate *changeTime;
+
+@end

Added: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEventInfo.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEventInfo.m?rev=1795295&view=auto
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEventInfo.m (added)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEventInfo.m Tue May 16 10:33:32 2017
@@ -0,0 +1,24 @@
+/*
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+ 
+  http://www.apache.org/licenses/LICENSE-2.0
+ 
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+ */
+
+#import "CMISChangeEventInfo.h"
+
+@implementation CMISChangeEventInfo
+
+@end

Added: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEvents.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEvents.h?rev=1795295&view=auto
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEvents.h (added)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEvents.h Tue May 16 10:33:32 2017
@@ -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>
+
+/**
+ * Class to hold the change event list.
+ */
+@interface CMISChangeEvents : NSObject
+
+/**
+ * Change log token if available.
+ */
+@property (nonatomic, strong) NSString *latestChangeLogToken;
+
+/**
+ * Array of CMISChangeEvent objects.
+ */
+@property (nonatomic, strong) NSArray *changeEvents;
+
+/**
+ * TRUE if there are more change events after those contained in the response.
+ * FALSE otherwise. If TRUE, a request with a larger maxItems is expected
+ * to return additional results.
+ */
+@property BOOL hasMoreItems;
+
+/**
+ * If the repository knows the total number of change event items in a result set, the repository SHOULD include the number here.
+ * If the repository does not know the number of items in a result set, this parameter SHOULD not be set.
+ * The value in the parameter MAY NOT be accurate the next time the client retrieves the result set
+ * or the next page in the result set.
+ */
+@property int numItems;
+
+@end

Added: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEvents.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEvents.m?rev=1795295&view=auto
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEvents.m (added)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISChangeEvents.m Tue May 16 10:33:32 2017
@@ -0,0 +1,24 @@
+/*
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+ 
+  http://www.apache.org/licenses/LICENSE-2.0
+ 
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+ */
+
+#import "CMISChangeEvents.h"
+
+@implementation CMISChangeEvents
+
+@end

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISDiscoveryService.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISDiscoveryService.h?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISDiscoveryService.h (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISDiscoveryService.h Tue May 16 10:33:32 2017
@@ -22,14 +22,15 @@
 
 @class CMISObjectList;
 @class CMISRequest;
+@class CMISStringInOutParameter;
 
 @protocol CMISDiscoveryService <NSObject>
 
 /**
 * (optional) Integer maxItems: This is the maximum number of items to return in a response.
 *                              The repository MUST NOT exceed this maximum. Default is repository-specific.
-(optional) Integer skipCount: This is the number of potential results that the repository MUST skip/page over
-                              before returning any results. Defaults to 0.
+* (optional) Integer skipCount: This is the number of potential results that the repository MUST skip/page over
+*                               before returning any results. Defaults to 0.
 */
 /** launches a query on the server with the parameters specified
  * completionBlock returns the found object list or nil if unsuccessful
@@ -42,4 +43,19 @@
                                                     skipCount:(NSNumber *)skipCount
                                               completionBlock:(void (^)(CMISObjectList *objectList, NSError *error))completionBlock;
 
+/**
+ * (optional) Integer maxItems: This is the maximum number of items to return in a response.
+ *                              The repository MUST NOT exceed this maximum. Default is repository-specific.
+ */
+/** Returns the content changes.
+ * completionBlock returns the found object list or nil if unsuccessful
+ */
+- (CMISRequest*)retrieveContentChanges:(CMISStringInOutParameter *)changeLogTokenParam
+                     includeProperties:(BOOL)includeProperties
+                                filter:(NSString *)filter
+                      includePolicyIds:(BOOL)includePolicyIds
+                            includeAcl:(BOOL)includeAcl
+                              maxItems:(NSNumber *)maxItems
+                       completionBlock:(void (^)(CMISObjectList *objectList, NSError *error))completionBlock;
+
 @end

Added: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISPolicyIdList.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISPolicyIdList.h?rev=1795295&view=auto
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISPolicyIdList.h (added)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISPolicyIdList.h Tue May 16 10:33:32 2017
@@ -0,0 +1,32 @@
+/*
+  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 "CMISExtensionData.h"
+
+/**
+ * Class to hold the policy IDs
+ */
+@interface CMISPolicyIdList : CMISExtensionData
+
+/**
+ * policy IDs, not nil.
+ */
+@property (nonatomic, strong) NSArray *policyIds;
+
+@end

Added: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISPolicyIdList.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISPolicyIdList.m?rev=1795295&view=auto
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISPolicyIdList.m (added)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISPolicyIdList.m Tue May 16 10:33:32 2017
@@ -0,0 +1,24 @@
+/*
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+ 
+  http://www.apache.org/licenses/LICENSE-2.0
+ 
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+ */
+
+#import "CMISPolicyIdList.h"
+
+@implementation CMISPolicyIdList
+
+@end

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISQueryStatement.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISQueryStatement.m?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISQueryStatement.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISQueryStatement.m Tue May 16 10:33:32 2017
@@ -214,11 +214,15 @@ static NSDateFormatter *cmisQueryStateme
     if (!cmisQueryStatementTimeStampFormatter) {
         cmisQueryStatementTimeStampFormatter = [[NSDateFormatter alloc] init];
         cmisQueryStatementTimeStampFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
-        cmisQueryStatementTimeStampFormatter.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
+        cmisQueryStatementTimeStampFormatter.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
         cmisQueryStatementTimeStampFormatter.timeZone = [NSTimeZone timeZoneWithName:@"GMT"];
     }
 
     return [cmisQueryStatementTimeStampFormatter stringFromDate:date];
 }
 
+-(NSString *)description {
+    return self.queryString;
+}
+
 @end

Added: chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISItem.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISItem.h?rev=1795295&view=auto
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISItem.h (added)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISItem.h Tue May 16 10:33:32 2017
@@ -0,0 +1,25 @@
+/*
+  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 "CMISFileableObject.h"
+
+@interface CMISItem : CMISFileableObject
+
+@end

Added: chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISItem.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISItem.m?rev=1795295&view=auto
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISItem.m (added)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISItem.m Tue May 16 10:33:32 2017
@@ -0,0 +1,24 @@
+/*
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+ */
+
+#import "CMISItem.h"
+
+@implementation CMISItem
+
+@end

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISObject.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISObject.h?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISObject.h (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISObject.h Tue May 16 10:33:32 2017
@@ -68,5 +68,28 @@
  */
 - (NSArray *)extensionsForExtensionLevel:(CMISExtensionLevel)extensionLevel;
 
+/**
+ * Retrieves the acl of an object with the given object identifier.
+ * completionBlock returns acl for an object or nil if unsuccessful
+ */
+- (CMISRequest*)retrieveAclOnlyBasicPermissions:(BOOL)onlyBasicPermissions
+                                completionBlock:(void (^)(CMISAcl *acl, NSError *error))completionBlock;
+
+/**
+ * Removes and adds the specified acl to an object with the given object identifier.
+ * completionBlock returns acl for an object or nil if unsuccessful
+ */
+- (CMISRequest*)applyAclAddAces:(CMISAcl *)addAces
+                     removeAces:(CMISAcl *)removeAces
+                 aclPropagation:(CMISAclPropagation)aclPropagation
+                completionBlock:(void (^)(CMISAcl *acl, NSError *error))completionBlock;
+
+/**
+ * Sets the specified acl to an object with the given object identifier.
+ * completionBlock returns acl for an object or nil if unsuccessful
+ */
+- (CMISRequest*)setAcl:(CMISAcl *)aces
+       completionBlock:(void (^)(CMISAcl *acl, NSError *error))completionBlock;
+
 @end
 

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISObject.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISObject.m?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISObject.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISObject.m Tue May 16 10:33:32 2017
@@ -26,6 +26,8 @@
 #import "CMISRenditionData.h"
 #import "CMISRendition.h"
 #import "CMISLog.h"
+#import "CMISPolicyIdList.h"
+#import "CMISChangeEventInfo.h"
 
 
 @interface CMISObject ()
@@ -74,12 +76,15 @@
         self.allowableActions = objectData.allowableActions;
         self.acl = objectData.acl;
 
+        // TODO handle policies (lazy loading)
+        
         // Extract Extensions and store in the extensionsDict
         self.extensionsDict = [[NSMutableDictionary alloc] init];
-        [self.extensionsDict setObject:[self nonNilArray:objectData.extensions] forKey:[NSNumber numberWithInteger:CMISExtensionLevelObject]];
-        [self.extensionsDict setObject:[self nonNilArray:self.properties.extensions] forKey:[NSNumber numberWithInteger:CMISExtensionLevelProperties]];
-        [self.extensionsDict setObject:[self nonNilArray:self.allowableActions.extensions] forKey:[NSNumber numberWithInteger:CMISExtensionLevelAllowableActions]];
-        [self.extensionsDict setObject:[self nonNilArray:self.acl.extensions] forKey:[NSNumber numberWithInteger:CMISExtensionLevelAcl]];
+        [self.extensionsDict setObject:[self nonNilArray:objectData.extensions] forKey:@(CMISExtensionLevelObject)];
+        [self.extensionsDict setObject:[self nonNilArray:self.properties.extensions] forKey:@(CMISExtensionLevelProperties)];
+        [self.extensionsDict setObject:[self nonNilArray:self.allowableActions.extensions] forKey:@(CMISExtensionLevelAllowableActions)];
+        [self.extensionsDict setObject:[self nonNilArray:self.acl.extensions] forKey:@(CMISExtensionLevelAcl)];
+        [self.extensionsDict setObject:[self nonNilArray:objectData.policyIds.extensions] forKey:@(CMISExtensionLevelPolicies)];
 
         // Renditions must be converted here, because they need access to the session
         if (objectData.renditions != nil) {
@@ -162,4 +167,49 @@
     return [self.extensionsDict objectForKey:[NSNumber numberWithInteger:extensionLevel]];
 }
 
+-(CMISRequest *)retrieveAclOnlyBasicPermissions:(BOOL)onlyBasicPermissions completionBlock:(void (^)(CMISAcl *, NSError *))completionBlock
+{
+    return [self.session retrieveAclFromCMISObject:self.identifier onlyBasicPermissions:onlyBasicPermissions completionBlock:^(CMISAcl *acl, NSError *error) {
+        if (error) {
+            if (completionBlock) {
+                completionBlock(nil, [CMISErrors cmisError:error cmisErrorCode:kCMISErrorCodeRuntime]);
+            }
+        } else {
+            if (completionBlock) {
+                completionBlock(acl, nil);
+            }
+        }
+    }];
+}
+
+-(CMISRequest *)applyAclAddAces:(CMISAcl *)addAces removeAces:(CMISAcl *)removeAces aclPropagation:(CMISAclPropagation)aclPropagation completionBlock:(void (^)(CMISAcl *, NSError *))completionBlock
+{
+    return [self.session applyAclToCMISObject:self.identifier addAces:addAces removeAces:removeAces aclPropagation:aclPropagation completionBlock:^(CMISAcl *acl, NSError *error) {
+        if (error) {
+            if (completionBlock) {
+                completionBlock(nil, [CMISErrors cmisError:error cmisErrorCode:kCMISErrorCodeRuntime]);
+            }
+        } else {
+            if (completionBlock) {
+                completionBlock(acl, nil);
+            }
+        }
+    }];
+}
+
+-(CMISRequest *)setAcl:(CMISAcl *)aces completionBlock:(void (^)(CMISAcl *, NSError *))completionBlock
+{
+    return [self.session setAclOnCMISObject:self.identifier aces:aces completionBlock:^(CMISAcl *acl, NSError *error) {
+        if (error) {
+            if (completionBlock) {
+                completionBlock(nil, [CMISErrors cmisError:error cmisErrorCode:kCMISErrorCodeRuntime]);
+            }
+        } else {
+            if (completionBlock) {
+                completionBlock(acl, nil);
+            }
+        }
+    }];
+}
+
 @end

Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISSession.h
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISSession.h?rev=1795295&r1=1795294&r2=1795295&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISSession.h (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Client/CMISSession.h Tue May 16 10:33:32 2017
@@ -28,6 +28,7 @@
 @class CMISPagedResult;
 @class CMISTypeDefinition;
 @class CMISObjectConverter;
+@class CMISChangeEvents;
 
 @interface CMISSession : NSObject
 
@@ -276,4 +277,51 @@
                         bytesExpected:(unsigned long long)bytesExpected
                       completionBlock:(void (^)(NSString *objectId, NSError *error))completionBlock
                         progressBlock:(void (^)(unsigned long long bytesUploaded, unsigned long long bytesTotal))progressBlock;
+
+/**
+ * Retrieves the acl of an object with the given object identifier.
+ * completionBlock returns acl for an object or nil if unsuccessful
+ */
+- (CMISRequest*)retrieveAclFromCMISObject:objectId
+                     onlyBasicPermissions:(BOOL)onlyBasicPermissions
+                          completionBlock:(void (^)(CMISAcl *acl, NSError *error))completionBlock;
+
+/**
+ * Removes and adds the specified acl to an object with the given object identifier.
+ * completionBlock returns acl for an object or nil if unsuccessful
+ */
+- (CMISRequest*)applyAclToCMISObject:objectId
+                             addAces:(CMISAcl *)addAces
+                          removeAces:(CMISAcl *)removeAces
+                      aclPropagation:(CMISAclPropagation)aclPropagation
+                     completionBlock:(void (^)(CMISAcl *acl, NSError *error))completionBlock;
+
+/**
+ * Sets the specified acl to an object with the given object identifier.
+ * completionBlock returns acl for an object or nil if unsuccessful
+ */
+- (CMISRequest*)setAclOnCMISObject:objectId
+                              aces:(CMISAcl *)aces
+                   completionBlock:(void (^)(CMISAcl *acl, NSError *error))completionBlock;
+
+/**
+ * Retrieves the content changes.
+ * completionBlock returns change events or nil if unsuccessful
+ */
+- (CMISRequest*)retrieveContentChangesWithChangeLogToken:(NSString *)changeLogToken
+                                       includeProperties:(BOOL)includeProperties
+                                                maxItems:(NSNumber *)maxItems
+                                        operationContext:(CMISOperationContext *)operationContext
+                                         completionBlock:(void (^)(CMISChangeEvents *changeEvents, NSError *error))completionBlock;
+
+/**
+ * Returns a paged result set, containing CMISChangeEvent instances.
+ * completionBlock returns the content changes, starting from the given change log token to 
+ * the latest entry in the change log as a paged results object or nil if unsuccessful.
+ */
+- (CMISRequest*)retrieveContentChangesWithChangeLogToken:(NSString *)changeLogToken
+                                       includeProperties:(BOOL)includeProperties
+                                        operationContext:(CMISOperationContext *)operationContext
+                                         completionBlock:(void (^)(CMISPagedResult *result, NSError *error))completionBlock;
+
 @end



Mime
View raw message