Author: gavincornwell
Date: Fri Aug 1 15:37:49 2014
New Revision: 1615144
URL: http://svn.apache.org/r1615144
Log:
Fixes for the following issues:
CMIS-826: Choice data for a property definition is not being parsed
CMIS-827: The baseTypeId property is set to "unknown" when retrieving an aspect
definition from Alfresco
CMIS-828: parentId is not parsed when requesting type definitions
CMIS-829: CMISTypeDefinition localNamespace property is incorrect
Modified:
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubPropertyDefinitionParser.m
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISTypeDefinitionAtomEntryParser.h
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISTypeDefinitionAtomEntryParser.m
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubConstants.h
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubConstants.m
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISPropertyDefinition.h
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISPropertyDefinition.m
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISTypeDefinition.h
chemistry/objectivecmis/trunk/ObjectiveCMISTests/ObjectiveCMISTests.m
Modified:
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubPropertyDefinitionParser.m
URL:
http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubPropertyDefinitionParser.m?rev=1615144&r1=1615143&r2=1615144&view=diff
==============================================================================
---
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubPropertyDefinitionParser.m
(original)
+++
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubPropertyDefinitionParser.m
Fri Aug 1 15:37:49 2014
@@ -24,8 +24,10 @@
@interface CMISAtomPubPropertyDefinitionParser ()
-@property(nonatomic, strong, readwrite) CMISPropertyDefinition
*propertyDefinition;
-@property(nonatomic, strong, readwrite) NSString *currentString;
+@property (nonatomic, strong, readwrite) CMISPropertyDefinition
*propertyDefinition;
+@property (nonatomic, strong, readwrite) NSString *currentString;
+@property (nonatomic, strong, readwrite) NSMutableArray *currentChoices;
+@property (nonatomic, strong, readwrite) CMISPropertyChoice *currentChoice;
// Properties if used as child delegate parser
@property(nonatomic, weak) id <NSXMLParserDelegate,
CMISAtomPubPropertyDefinitionDelegate> parentDelegate;
@@ -95,6 +97,19 @@
}
}
+- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
attributes:(NSDictionary *)attributeDict
+{
+ if ([elementName isEqualToString:kCMISCoreChoice] || [elementName
isEqualToString:kCMISCoreChoiceString]) {
+ if (self.currentChoices == nil)
+ {
+ self.currentChoices = [NSMutableArray array];
+ }
+
+ self.currentChoice = [CMISPropertyChoice new];
+ self.currentChoice.displayName =
attributeDict[kCMISAtomEntryDisplayName];
+ }
+}
+
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementName isEqualToString:kCMISCorePropertyStringDefinition]
@@ -103,6 +118,10 @@
|| [elementName isEqualToString:kCMISCorePropertyIntegerDefinition]
|| [elementName isEqualToString:kCMISCorePropertyDateTimeDefinition]
|| [elementName isEqualToString:kCMISCorePropertyDecimalDefinition]) {
+
+ // store any choice objects
+ self.propertyDefinition.choices = self.currentChoices;
+
if (self.parentDelegate) {
if ([self.parentDelegate
respondsToSelector:@selector(propertyDefinitionParser:didFinishParsingPropertyDefinition:)])
{
[self.parentDelegate
performSelector:@selector(propertyDefinitionParser:didFinishParsingPropertyDefinition:)
withObject:self withObject:self.propertyDefinition];
@@ -155,8 +174,11 @@
self.propertyDefinition.orderable = [self
parseBooleanValue:self.currentString];
} else if ([elementName isEqualToString:kCMISCoreOpenChoice]) {
self.propertyDefinition.openChoice = [self
parseBooleanValue:self.currentString];
+ } else if ([elementName isEqualToString:kCMISAtomEntryValue]) {
+ self.currentChoice.value = self.currentString;
+ [self.currentChoices addObject:self.currentChoice];
}
-
+
self.currentString = nil;
}
Modified:
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISTypeDefinitionAtomEntryParser.h
URL:
http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISTypeDefinitionAtomEntryParser.h?rev=1615144&r1=1615143&r2=1615144&view=diff
==============================================================================
---
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISTypeDefinitionAtomEntryParser.h
(original)
+++
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISTypeDefinitionAtomEntryParser.h
Fri Aug 1 15:37:49 2014
@@ -19,11 +19,12 @@
#import <Foundation/Foundation.h>
#import "CMISAtomPubPropertyDefinitionParser.h"
+#import "CMISAtomPubExtensionDataParserBase.h"
@class CMISTypeDefinition;
// TODO: should we merge this parser with the generic AtomEntry parser?
-@interface CMISTypeDefinitionAtomEntryParser : NSObject <NSXMLParserDelegate,
CMISAtomPubPropertyDefinitionDelegate>
+@interface CMISTypeDefinitionAtomEntryParser :
CMISAtomPubExtensionDataParserBase <NSXMLParserDelegate,
CMISAtomPubPropertyDefinitionDelegate>
/**
* Available after a successful parse.
Modified:
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISTypeDefinitionAtomEntryParser.m
URL:
http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISTypeDefinitionAtomEntryParser.m?rev=1615144&r1=1615143&r2=1615144&view=diff
==============================================================================
---
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISTypeDefinitionAtomEntryParser.m
(original)
+++
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISTypeDefinitionAtomEntryParser.m
Fri Aug 1 15:37:49 2014
@@ -30,8 +30,6 @@
@property(nonatomic, strong, readwrite) NSData *atomData;
@property(nonatomic, strong, readwrite) NSString *currentString;
-@property (nonatomic, strong) id<NSXMLParserDelegate> childParserDelegate;
-
@end
@@ -70,27 +68,42 @@
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
attributes:(NSDictionary *)attributeDict
{
- if ([elementName isEqualToString:kCMISRestAtomType]) {
- __block BOOL documentType = NO;
- [attributeDict enumerateKeysAndObjectsUsingBlock:^(id key, id obj,
BOOL *stop) {
- if ([key hasSuffix:@"type"] && [obj
hasSuffix:@"cmisTypeDocumentDefinitionType"]) {
- documentType = YES;
+ if ([namespaceURI isEqualToString:kCMISNamespaceCmisRestAtom]) {
+ if ([elementName isEqualToString:kCMISRestAtomType]) {
+ __block BOOL documentType = NO;
+ [attributeDict enumerateKeysAndObjectsUsingBlock:^(id key, id obj,
BOOL *stop) {
+ if ([key hasSuffix:@"type"] && [obj
hasSuffix:@"cmisTypeDocumentDefinitionType"]) {
+ documentType = YES;
+ }
+ }];
+
+ if (documentType) {
+ self.typeDefinition = [[CMISDocumentTypeDefinition alloc]
init];
+ } else {
+ self.typeDefinition = [[CMISTypeDefinition alloc] init];
}
- }];
-
- if (documentType) {
- self.typeDefinition = [[CMISDocumentTypeDefinition alloc] init];
- } else {
- self.typeDefinition = [[CMISTypeDefinition alloc] init];
- }
- self.isParsingTypeDefinition = YES;
- } else if ([elementName isEqualToString:kCMISCorePropertyStringDefinition]
- || [elementName isEqualToString:kCMISCorePropertyIdDefinition]
- || [elementName
isEqualToString:kCMISCorePropertyBooleanDefinition]
- || [elementName
isEqualToString:kCMISCorePropertyIntegerDefinition]
- || [elementName
isEqualToString:kCMISCorePropertyDateTimeDefinition]
- || [elementName
isEqualToString:kCMISCorePropertyDecimalDefinition]) {
- self.childParserDelegate = [CMISAtomPubPropertyDefinitionParser
parserForPropertyDefinition:elementName withParentDelegate:self parser:parser];
+ self.isParsingTypeDefinition = YES;
+
+ [self pushNewCurrentExtensionData:self.typeDefinition];
+ }
+ } else if ([namespaceURI isEqualToString:kCMISNamespaceCmis]) {
+ if ([elementName isEqualToString:kCMISCorePropertyStringDefinition] ||
+ [elementName isEqualToString:kCMISCorePropertyIdDefinition] ||
+ [elementName isEqualToString:kCMISCorePropertyBooleanDefinition] ||
+ [elementName isEqualToString:kCMISCorePropertyIntegerDefinition] ||
+ [elementName isEqualToString:kCMISCorePropertyDateTimeDefinition]
||
+ [elementName isEqualToString:kCMISCorePropertyDecimalDefinition]) {
+ self.childParserDelegate = [CMISAtomPubPropertyDefinitionParser
parserForPropertyDefinition:elementName withParentDelegate:self parser:parser];
+ }
+ } else if ([namespaceURI isEqualToString:kCMISNamespaceApp] ||
+ [namespaceURI isEqualToString:kCMISNamespaceAtom]) {
+ // do nothing with these namespaces
+ } else {
+ // parse extension data
+ if (self.currentExtensionData != nil) {
+ self.childParserDelegate = [CMISAtomPubExtensionElementParser
extensionElementParserWithElementName:elementName namespaceUri:namespaceURI
+
attributes:attributeDict parentDelegate:self
parser:parser];
+ }
}
}
@@ -119,7 +132,7 @@
}
} else if ([elementName isEqualToString:kCMISCoreLocalNamespace]) {
if (self.isParsingTypeDefinition) {
- self.typeDefinition.localNameSpace = self.currentString;
+ self.typeDefinition.localNamespace = self.currentString;
}
} else if ([elementName isEqualToString:kCMISCoreDisplayName]) {
if (self.isParsingTypeDefinition) {
@@ -139,8 +152,20 @@
self.typeDefinition.baseTypeId = CMISBaseTypeDocument;
} else if ([self.currentString
isEqualToString:kCMISPropertyObjectTypeIdValueFolder]) {
self.typeDefinition.baseTypeId = CMISBaseTypeFolder;
+ } else if ([self.currentString
isEqualToString:kCMISPropertyObjectTypeIdValuePolicy]) {
+ self.typeDefinition.baseTypeId = CMISBaseTypePolicy;
+ } else if ([self.currentString
isEqualToString:kCMISPropertyObjectTypeIdValueItem]) {
+ self.typeDefinition.baseTypeId = CMISBaseTypeItem;
+ } else if ([self.currentString
isEqualToString:kCMISPropertyObjectTypeIdValueSecondary]) {
+ self.typeDefinition.baseTypeId = CMISBaseTypeSecondary;
+ } else if ([self.currentString
isEqualToString:kCMISPropertyObjectTypeIdValueRelationship]) {
+ self.typeDefinition.baseTypeId = CMISBaseTypeRelationship;
}
}
+ } else if ([elementName isEqualToString:kCMISCoreParentId]) {
+ if (self.isParsingTypeDefinition) {
+ self.typeDefinition.parentTypeId = self.currentString;
+ }
} else if ([elementName isEqualToString:kCMISCoreCreatable]) {
if (self.isParsingTypeDefinition) {
self.typeDefinition.creatable =
[self.currentString.lowercaseString isEqualToString:kCMISAtomEntryValueTrue];
@@ -183,6 +208,9 @@
((CMISDocumentTypeDefinition*)self.typeDefinition).contentStreamAllowed =
CMISContentStreamRequired;
}
}
+ } else if ([elementName isEqualToString:kCMISAtomEntry]) {
+ // set the extensionData
+ [self saveCurrentExtensionsAndPushPreviousExtensionData];
}
self.currentString = nil;
Modified:
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubConstants.h
URL:
http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubConstants.h?rev=1615144&r1=1615143&r2=1615144&view=diff
==============================================================================
---
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubConstants.h
(original)
+++
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubConstants.h
Fri Aug 1 15:37:49 2014
@@ -136,6 +136,7 @@ extern NSString * const kCMISCoreDisplay
extern NSString * const kCMISCoreQueryName;
extern NSString * const kCMISCoreDescription;
extern NSString * const kCMISCoreBaseId;
+extern NSString * const kCMISCoreParentId;
extern NSString * const kCMISCoreCreatable;
extern NSString * const kCMISCoreFileable;
extern NSString * const kCMISCoreQueryable;
@@ -149,6 +150,8 @@ extern NSString * const kCMISCoreInherit
extern NSString * const kCMISCoreRequired;
extern NSString * const kCMISCoreOrderable;
extern NSString * const kCMISCoreOpenChoice;
+extern NSString * const kCMISCoreChoice;
+extern NSString * const kCMISCoreChoiceString;
extern NSString * const kCMISCoreVersionable;
extern NSString * const kCMISCoreContentStreamAllowed;
extern NSString * const kCMISCoreAllowed;
Modified:
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubConstants.m
URL:
http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubConstants.m?rev=1615144&r1=1615143&r2=1615144&view=diff
==============================================================================
---
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubConstants.m
(original)
+++
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/AtomPub/CMISAtomPubConstants.m
Fri Aug 1 15:37:49 2014
@@ -136,6 +136,7 @@ NSString * const kCMISCoreDisplayName =
NSString * const kCMISCoreQueryName = @"queryName";
NSString * const kCMISCoreDescription = @"description";
NSString * const kCMISCoreBaseId = @"baseId";
+NSString * const kCMISCoreParentId = @"parentId";
NSString * const kCMISCoreCreatable = @"creatable";
NSString * const kCMISCoreFileable = @"fileable";
NSString * const kCMISCoreQueryable = @"queryable";
@@ -147,8 +148,10 @@ NSString * const kCMISCoreCardinality =
NSString * const kCMISCoreUpdatability = @"updatability";
NSString * const kCMISCoreInherited = @"inherited";
NSString * const kCMISCoreRequired = @"required";
-NSString * const kCMISCoreOrderable = @"queryable";
+NSString * const kCMISCoreOrderable = @"orderable";
NSString * const kCMISCoreOpenChoice = @"openChoice";
+NSString * const kCMISCoreChoice = @"choice";
+NSString * const kCMISCoreChoiceString = @"choiceString";
NSString * const kCMISCoreVersionable = @"versionable";
NSString * const kCMISCoreContentStreamAllowed = @"contentStreamAllowed";
NSString * const kCMISCoreAllowed = @"allowed";
Modified:
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
URL:
http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m?rev=1615144&r1=1615143&r2=1615144&view=diff
==============================================================================
---
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
(original)
+++
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
Fri Aug 1 15:37:49 2014
@@ -209,7 +209,7 @@ NSString * const kCMISBrowserMaxValueJSO
typeDef.includedInSupertypeQuery = [jsonDictionary
cmis_boolForKey:kCMISBrowserJSONIncludedInSuperTypeQuery];
typeDef.queryable = [jsonDictionary
cmis_boolForKey:kCMISBrowserJSONQueryable];
typeDef.localName = [jsonDictionary
cmis_objectForKeyNotNull:kCMISBrowserJSONLocalName];
- typeDef.localNameSpace = [jsonDictionary
cmis_objectForKeyNotNull:kCMISBrowserJSONLocalNamespace];
+ typeDef.localNamespace = [jsonDictionary
cmis_objectForKeyNotNull:kCMISBrowserJSONLocalNamespace];
typeDef.parentTypeId = [jsonDictionary
cmis_objectForKeyNotNull:kCMISBrowserJSONParentId];
typeDef.queryName = [jsonDictionary
cmis_objectForKeyNotNull:kCMISBrowserJSONQueryName];
@@ -1005,6 +1005,20 @@ NSString * const kCMISBrowserMaxValueJSO
// TODO default value
+ // parse choices, if present
+ NSArray *choicesJSON = propertyDictionary[kCMISBrowserJSONChoice];
+ if (choicesJSON != nil) {
+ NSMutableArray *choices = [NSMutableArray array];
+ for (NSDictionary *choiceDictionary in choicesJSON) {
+ CMISPropertyChoice *choice = [CMISPropertyChoice new];
+ choice.displayName = [choiceDictionary
cmis_objectForKeyNotNull:kCMISBrowserJSONDisplayName];
+ choice.value = [choiceDictionary
cmis_objectForKeyNotNull:kCMISBrowserJSONValue];
+ [choices addObject:choice];
+ }
+
+ propDef.choices = choices;
+ }
+
// handle extensions
propDef.extensions = [CMISObjectConverter
convertExtensions:propertyDictionary cmisKeys:[CMISBrowserConstants
propertyTypeKeys]];
Modified:
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISPropertyDefinition.h
URL:
http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISPropertyDefinition.h?rev=1615144&r1=1615143&r2=1615144&view=diff
==============================================================================
---
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISPropertyDefinition.h
(original)
+++
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISPropertyDefinition.h
Fri Aug 1 15:37:49 2014
@@ -21,6 +21,11 @@
#import "CMISEnums.h"
#import "CMISExtensionData.h"
+@interface CMISPropertyChoice : NSObject
+@property (nonatomic, strong) NSString *displayName;
+@property (nonatomic, strong) id value;
+@end
+
// TODO: type specific properties, see cmis spec line 527
@interface CMISPropertyDefinition : CMISExtensionData
@@ -43,6 +48,8 @@
@property (nonatomic, assign, getter = isOpenChoice) BOOL openChoice;
@property (nonatomic, strong) NSArray *defaultValues;
+
+// Returns an array of CMISPropertyChoice objects
@property (nonatomic, strong) NSArray *choices;
@end
\ No newline at end of file
Modified:
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISPropertyDefinition.m
URL:
http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISPropertyDefinition.m?rev=1615144&r1=1615143&r2=1615144&view=diff
==============================================================================
---
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISPropertyDefinition.m
(original)
+++
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISPropertyDefinition.m
Fri Aug 1 15:37:49 2014
@@ -19,6 +19,10 @@
#import "CMISPropertyDefinition.h"
+@implementation CMISPropertyChoice
+
+@end
+
@implementation CMISPropertyDefinition
Modified:
chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISTypeDefinition.h
URL:
http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISTypeDefinition.h?rev=1615144&r1=1615143&r2=1615144&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISTypeDefinition.h
(original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Bindings/CMISTypeDefinition.h
Fri Aug 1 15:37:49 2014
@@ -28,7 +28,7 @@
@property (nonatomic, strong) NSString *identifier;
@property (nonatomic, strong) NSString *localName;
-@property (nonatomic, strong) NSString *localNameSpace;
+@property (nonatomic, strong) NSString *localNamespace;
@property (nonatomic, strong) NSString *displayName;
@property (nonatomic, strong) NSString *queryName;
@property (nonatomic, strong) NSString *summary;
Modified: chemistry/objectivecmis/trunk/ObjectiveCMISTests/ObjectiveCMISTests.m
URL:
http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMISTests/ObjectiveCMISTests.m?rev=1615144&r1=1615143&r2=1615144&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMISTests/ObjectiveCMISTests.m
(original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMISTests/ObjectiveCMISTests.m Fri
Aug 1 15:37:49 2014
@@ -1404,12 +1404,13 @@
// Check type definition properties
XCTAssertNotNil(typeDefinition, @"Type definition should not be
nil");
XCTAssertTrue(typeDefinition.baseTypeId == CMISBaseTypeDocument,
@"Unexpected base type id");
- XCTAssertNotNil(typeDefinition.description, @"Type description
should not be nil");
+ XCTAssertNil(typeDefinition.parentTypeId, @"Expected parent type
id to be nil");
+ XCTAssertNotNil(typeDefinition.summary, @"Type summary should not
be nil");
XCTAssertNotNil(typeDefinition.displayName, @"Type displayName
should not be nil");
XCTAssertNotNil(typeDefinition.identifier, @"Type id should not
be nil");
XCTAssertTrue([typeDefinition.identifier
isEqualToString:@"cmis:document"], @"Wrong id for type");
XCTAssertNotNil(typeDefinition.localName, @"Type local name
should not be nil");
- XCTAssertNotNil(typeDefinition.localNameSpace, @"Type local
namespace should not be nil");
+ XCTAssertNotNil(typeDefinition.localNamespace, @"Type local
namespace should not be nil");
XCTAssertNotNil(typeDefinition.queryName, @"Type query name
should not be nil");
// Check property definitions
@@ -1417,7 +1418,7 @@
for (id key in typeDefinition.propertyDefinitions)
{
CMISPropertyDefinition *propertyDefinition =
[typeDefinition.propertyDefinitions objectForKey:key];
- XCTAssertNotNil(propertyDefinition.description, @"Property
definition description should not be nil");
+ XCTAssertNotNil(propertyDefinition.summary, @"Property
definition summary should not be nil");
XCTAssertNotNil(propertyDefinition.displayName, @"Property
definition display name should not be nil");
XCTAssertNotNil(propertyDefinition.identifier, @"Property
definition id should not be nil");
XCTAssertNotNil(propertyDefinition.localName, @"Property
definition local name should not be nil");
@@ -1430,6 +1431,198 @@
}];
}
+- (void)testRetrieveSubTypeDefinition
+{
+ [self runTest:^ {
+
+ // NOTE: This test will request a custom type from an Alfresco
repository, if this type is not installed an error will
+ // be returned, however, in this case, the test will still pass
+
+ [self.session.binding.repositoryService
retrieveTypeDefinition:@"D:fdk:everything" completionBlock:^(CMISTypeDefinition
*typeDefinition, NSError *error) {
+ if (typeDefinition == nil)
+ {
+ // check the error code was ObjectNotFound
+ XCTAssertTrue(error.code == kCMISErrorCodeObjectNotFound,
@"Expected error code of 257 but it was %lu", (unsigned long)error.code);
+ self.testCompleted = YES;
+ }
+ else
+ {
+ // Check type definition properties
+ XCTAssertNotNil(typeDefinition, @"Type definition should not
be nil");
+ XCTAssertTrue([typeDefinition.identifier
isEqualToString:@"D:fdk:everything"],
+ @"Expected identifer to be 'D:fdk:everything'
but it was %@", typeDefinition.identifier);
+ XCTAssertTrue([typeDefinition.localName
isEqualToString:@"everything"],
+ @"Expected localName to be 'everything' but it
was %@", typeDefinition.localName);
+ XCTAssertTrue([typeDefinition.localNamespace
isEqualToString:@"http://www.alfresco.org/model/fdk/1.0"],
+ @"Expected localNameSpace to be
'http://www.alfresco.org/model/fdk/1.0' but it was %@",
typeDefinition.localNamespace);
+ XCTAssertTrue([typeDefinition.queryName
isEqualToString:@"fdk:everything"],
+ @"Expected queryName to be 'fdk:everything' but
it was %@", typeDefinition.queryName);
+
+ // the following properties have different values on 4.0
servers
+ if ([self.session.repositoryInfo.productVersion
hasPrefix:@"4.0."])
+ {
+ XCTAssertTrue([typeDefinition.displayName
isEqualToString:@"D:fdk:everything"],
+ @"Expected displayName to be
'D:fdk:everything' but it was %@", typeDefinition.displayName);
+ XCTAssertTrue([typeDefinition.summary
isEqualToString:@"D:fdk:everything"],
+ @"Expected summary to be 'D:fdk:everything'
but it was %@", typeDefinition.summary);
+ }
+ else
+ {
+ XCTAssertTrue([typeDefinition.displayName
isEqualToString:@"Everything"],
+ @"Expected displayName to be 'Everything'
but it was %@", typeDefinition.displayName);
+ XCTAssertTrue([typeDefinition.summary
isEqualToString:@"Everything"],
+ @"Expected summary to be 'Everything' but it
was %@", typeDefinition.summary);
+ }
+
+ XCTAssertTrue(typeDefinition.baseTypeId ==
CMISBaseTypeDocument, @"Unexpected base type id");
+ XCTAssertTrue([typeDefinition.parentTypeId
isEqualToString:@"cmis:document"],
+ @"Expected parentTypeId to be 'cmis:document'
but it was %@", typeDefinition.parentTypeId);
+ XCTAssertTrue(typeDefinition.creatable, @"Expected creatable
property to be true");
+ XCTAssertTrue(typeDefinition.fileable, @"Expected fileable
property to be true");
+ XCTAssertTrue(typeDefinition.queryable, @"Expected queryable
property to be true");
+ XCTAssertTrue(typeDefinition.fullTextIndexed, @"Expected
fullTextIndexed property to be true");
+ XCTAssertTrue(typeDefinition.includedInSupertypeQuery,
@"Expected includedInSupertypeQuery property to be true");
+ XCTAssertFalse(typeDefinition.controllablePolicy, @"Expected
controllablePolicy property to be false");
+ XCTAssertTrue(typeDefinition.controllableAcl, @"Expected
controllableAcl property to be true");
+
+ // retrieve cmis:name property and check it
+ CMISPropertyDefinition *namePropertyDefiniton =
[typeDefinition propertyDefinitionForId:@"cmis:name"];
+ XCTAssertNotNil(namePropertyDefiniton, @"Expected to find a
property definition for cmis:name");
+ XCTAssertTrue([namePropertyDefiniton.identifier
isEqualToString:@"cmis:name"],
+ @"Expected identifier to be 'cmis:name' but it
was %@", namePropertyDefiniton.identifier);
+ XCTAssertTrue([namePropertyDefiniton.localName
isEqualToString:@"name"],
+ @"Expected localName to be 'name' but it was
%@", namePropertyDefiniton.localName);
+ XCTAssertTrue([namePropertyDefiniton.localNamespace
isEqualToString:@"http://www.alfresco.org/model/cmis/1.0/cs01"],
+ @"Expected localNameSpace to be
'http://www.alfresco.org/model/cmis/1.0/cs01' but it was %@",
namePropertyDefiniton.localNamespace);
+ XCTAssertTrue([namePropertyDefiniton.displayName
isEqualToString:@"Name"],
+ @"Expected displayName to be 'Name' but it was
%@", namePropertyDefiniton.displayName);
+ XCTAssertTrue([namePropertyDefiniton.queryName
isEqualToString:@"cmis:name"],
+ @"Expected queryName to be 'cmis:name' but it
was %@", namePropertyDefiniton.queryName);
+ XCTAssertTrue([namePropertyDefiniton.summary
isEqualToString:@"Name"],
+ @"Expected summary to be 'Name' but it was %@",
namePropertyDefiniton.summary);
+ XCTAssertTrue(namePropertyDefiniton.propertyType ==
CMISPropertyTypeString, @"Expected int property to be of type string");
+ XCTAssertTrue(namePropertyDefiniton.cardinality ==
CMISCardinalitySingle, @"Unexpected cardinality");
+ XCTAssertTrue(namePropertyDefiniton.updatability ==
CMISUpdatabilityReadWrite, @"Unexpected updatability");
+ XCTAssertTrue(namePropertyDefiniton.inherited, @"Expected
inherited property to be true");
+ XCTAssertTrue(namePropertyDefiniton.queryable, @"Expected
queryable property to be true");
+ XCTAssertTrue(namePropertyDefiniton.orderable, @"Expected
orderable property to be true");
+ if ([self.session.repositoryInfo.productVersion
hasPrefix:@"4.0."])
+ {
+ // due to a bug on 4.0 servers the required property was
set to false
+ XCTAssertFalse(namePropertyDefiniton.required, @"Expected
required property to be false");
+ }
+ else
+ {
+ XCTAssertTrue(namePropertyDefiniton.required, @"Expected
required property to be true");
+ }
+
+ // retrieve other property types
+ CMISPropertyDefinition *intPropertyDefiniton = [typeDefinition
propertyDefinitionForId:@"fdk:int"];
+ XCTAssertTrue(intPropertyDefiniton.propertyType ==
CMISPropertyTypeInteger, @"Expected int property to be of type integer");
+ CMISPropertyDefinition *doublePropertyDefiniton =
[typeDefinition propertyDefinitionForId:@"fdk:double"];
+ XCTAssertTrue(doublePropertyDefiniton.propertyType ==
CMISPropertyTypeDecimal, @"Expected double property to be of type decimal");
+ CMISPropertyDefinition *boolPropertyDefiniton =
[typeDefinition propertyDefinitionForId:@"fdk:boolean"];
+ XCTAssertTrue(boolPropertyDefiniton.propertyType ==
CMISPropertyTypeBoolean, @"Expected boolean property to be of type boolean");
+ CMISPropertyDefinition *dateTimePropertyDefiniton =
[typeDefinition propertyDefinitionForId:@"fdk:dateTime"];
+ XCTAssertTrue(dateTimePropertyDefiniton.propertyType ==
CMISPropertyTypeDateTime, @"Expected dateTime property to be of type dateTime");
+ CMISPropertyDefinition *noderefPropertyDefiniton =
[typeDefinition propertyDefinitionForId:@"fdk:noderef"];
+ XCTAssertTrue(noderefPropertyDefiniton.propertyType ==
CMISPropertyTypeId, @"Expected noderef property to be of type id");
+
+ // retrieve choices
+ CMISPropertyDefinition *constraintPropertyDefiniton =
[typeDefinition propertyDefinitionForId:@"fdk:listConstraint"];
+ XCTAssertTrue(constraintPropertyDefiniton.propertyType ==
CMISPropertyTypeString, @"Expected listConstraint property to be of type
string");
+ XCTAssertTrue([constraintPropertyDefiniton.localNamespace
isEqualToString:@"http://www.alfresco.org/model/fdk/1.0"],
+ @"Expected localNameSpace to be
'http://www.alfresco.org/model/fdk/1.0' but it was %@",
constraintPropertyDefiniton.localNamespace);
+ XCTAssertFalse(constraintPropertyDefiniton.openChoice,
@"Expected openChoice property to be false");
+ NSArray *choices = constraintPropertyDefiniton.choices;
+ XCTAssertNotNil(choices, @"Expected choices property for
listConstraint property to be populated");
+ XCTAssertTrue(choices.count == 3, @"Expected there to be 3
choices but there were %lu", (unsigned long)choices.count);
+
+ // only perform the following tests on endpoints using OpenCMIS
+ if (self.session.sessionParameters.atomPubUrl == nil ||
+ [self.session.sessionParameters.atomPubUrl.absoluteString
rangeOfString:@"/alfresco/service/api/cmis"
options:NSCaseInsensitiveSearch].location == NSNotFound) {
+ CMISPropertyChoice *choice1 = choices[0];
+ XCTAssertTrue([choice1.displayName
isEqualToString:@"Phone"], @"Expected choice 1 displayName to be 'Phone' but
was %@", choice1.displayName);
+ XCTAssertTrue([choice1.value isEqualToString:@"Phone"],
@"Expected choice 1 value to be 'Phone' but was %@", choice1.value);
+ CMISPropertyChoice *choice2 = choices[1];
+ XCTAssertTrue([choice2.displayName isEqualToString:@"Audio
Visual"], @"Expected choice 2 displayName to be 'Audio Visual' but was %@",
choice1.displayName);
+ XCTAssertTrue([choice2.value isEqualToString:@"Audio
Visual"], @"Expected choice 2 value to be 'Audio Visual' but was %@",
choice1.value);
+ CMISPropertyChoice *choice3 = choices[2];
+ XCTAssertTrue([choice3.displayName
isEqualToString:@"Computer"], @"Expected choice 3 displayName to be 'Computer'
but was %@", choice1.displayName);
+ XCTAssertTrue([choice3.value isEqualToString:@"Computer"],
@"Expected choice 3 value to be 'Computer' but was %@", choice1.value);
+
+ // make sure the extensions data is also populated
+ NSArray *extensions = typeDefinition.extensions;
+ XCTAssertNotNil(extensions, @"Expected extensions data to
be populated");
+ XCTAssertTrue(extensions.count == 1, @"Expected 1
extension element but there were: %lu", (unsigned long)extensions.count);
+ CMISExtensionElement *extensionElement = extensions[0];
+ XCTAssertTrue(extensionElement.children.count > 0,
@"Expected extension element to have at least one child");
+ }
+
+ self.testCompleted = YES;
+ }
+ }];
+ }];
+}
+
+- (void)testRetrieveAspectDefinition
+{
+ [self runTest:^ {
+
+ // NOTE: This test will request an aspect from an Alfresco repository,
if the server is not an Alfresco server an error will
+ // be returned, however, in this case, the test will still pass
+
+ [self.session.binding.repositoryService
retrieveTypeDefinition:@"P:exif:exif" completionBlock:^(CMISTypeDefinition
*aspectDefinition, NSError *error) {
+ if (aspectDefinition == nil)
+ {
+ // check the error code was ObjectNotFound
+ XCTAssertTrue(error.code == kCMISErrorCodeObjectNotFound,
@"Expected error code of 257 but it was %lu", (unsigned long)error.code);
+ self.testCompleted = YES;
+ }
+ else
+ {
+ // Check type definition properties
+ XCTAssertNotNil(aspectDefinition, @"Aspect definition should
not be nil");
+ XCTAssertTrue([aspectDefinition.identifier
isEqualToString:@"P:exif:exif"],
+ @"Expected identifer to be 'P:exif:exif' but it
was %@", aspectDefinition.identifier);
+ XCTAssertTrue([aspectDefinition.localName
isEqualToString:@"exif"],
+ @"Expected localName to be 'exif' but it was
%@", aspectDefinition.localName);
+ XCTAssertTrue([aspectDefinition.localNamespace
isEqualToString:@"http://www.alfresco.org/model/exif/1.0"],
+ @"Expected localNameSpace to be
'http://www.alfresco.org/model/exif/1.0' but it was %@",
aspectDefinition.localNamespace);
+ XCTAssertTrue([aspectDefinition.displayName
isEqualToString:@"EXIF"],
+ @"Expected displayName to be 'EXIF' but it was
%@", aspectDefinition.displayName);
+ XCTAssertTrue([aspectDefinition.queryName
isEqualToString:@"exif:exif"],
+ @"Expected queryName to be 'exif:exif' but it
was %@", aspectDefinition.queryName);
+ XCTAssertTrue([aspectDefinition.summary
isEqualToString:@"Subset of the standard EXIF metadata"],
+ @"Expected summary to be 'Subset of the standard
EXIF metadata' but it was %@", aspectDefinition.summary);
+
+ if ([self.session.repositoryInfo.cmisVersionSupported
isEqualToString:@"1.0"])
+ {
+ XCTAssertTrue(aspectDefinition.baseTypeId ==
CMISBaseTypePolicy, @"Unexpected base type id");
+ XCTAssertNotNil(aspectDefinition.parentTypeId, @"Expected
parent type id to be populated");
+ }
+ else
+ {
+ // from the 1.1 binding onwards aspects are represented as
secondary types
+ XCTAssertTrue(aspectDefinition.baseTypeId ==
CMISBaseTypeSecondary, @"Unexpected base type id");
+ XCTAssertTrue([aspectDefinition.parentTypeId
isEqualToString:@"cmis:secondary"],
+ @"Expected parentTypeId to be
'cmis:secondary' but it was %@", aspectDefinition.parentTypeId);
+ }
+
+ XCTAssertFalse(aspectDefinition.creatable, @"Expected
creatable property to be false");
+ XCTAssertFalse(aspectDefinition.fileable, @"Expected fileable
property to be false");
+ XCTAssertTrue(aspectDefinition.queryable, @"Expected queryable
property to be true");
+ XCTAssertTrue(aspectDefinition.fullTextIndexed, @"Expected
fullTextIndexed property to be true");
+ XCTAssertTrue(aspectDefinition.includedInSupertypeQuery,
@"Expected includedInSupertypeQuery property to be true");
+ XCTAssertFalse(aspectDefinition.controllablePolicy, @"Expected
controllablePolicy property to be false");
+ XCTAssertFalse(aspectDefinition.controllableAcl, @"Expected
controllableAcl property to be false");
+
+ self.testCompleted = YES;
+ }
+ }];
+ }];
+}
+
- (void)testUpdateDocumentPropertiesThroughObjectService
{
[self runTest:^ {