Commit fa62036c541e0da4cccb1cca97a274fc09e4e197
1 parent
f2a56a99
Update getObjectParents
Story ID:2295472. Update KT CMIS implementation to 1.0 compliance Committed by: Paul Barrett
Showing
5 changed files
with
66 additions
and
29 deletions
lib/api/ktcmis/ktNavigationService.inc.php
| ... | ... | @@ -195,10 +195,18 @@ class KTNavigationService extends KTCMISBase { |
| 195 | 195 | */ |
| 196 | 196 | function getObjectParents($repositoryId, $objectId, $includeAllowableActions, $includeRelationships, $filter = '') |
| 197 | 197 | { |
| 198 | - $ancestryResult = $this->NavigationService->getObjectParents($repositoryId, $objectId, $includeAllowableActions, | |
| 199 | - $includeRelationships); | |
| 198 | + try { | |
| 199 | + $ancestry = $this->NavigationService->getObjectParents($repositoryId, $objectId, $includeAllowableActions, | |
| 200 | + $includeRelationships); | |
| 201 | + } | |
| 202 | + catch (Exception $e) { | |
| 203 | + return array( | |
| 204 | + "status_code" => 1, | |
| 205 | + "message" => $e->getMessage() | |
| 206 | + ); | |
| 207 | + } | |
| 200 | 208 | |
| 201 | - if (PEAR::isError($ancestryResult)) | |
| 209 | + if (PEAR::isError($ancestry)) | |
| 202 | 210 | { |
| 203 | 211 | return array( |
| 204 | 212 | "status_code" => 1, |
| ... | ... | @@ -206,8 +214,6 @@ class KTNavigationService extends KTCMISBase { |
| 206 | 214 | ); |
| 207 | 215 | } |
| 208 | 216 | |
| 209 | - $ancestry = CMISUtil::decodeObjectHierarchy($ancestryResult, 'children'); | |
| 210 | - | |
| 211 | 217 | return array( |
| 212 | 218 | "status_code" => 0, |
| 213 | 219 | "results" => $ancestry | ... | ... |
lib/api/ktcmis/services/CMISNavigationService.inc.php
| ... | ... | @@ -195,7 +195,7 @@ class CMISNavigationService { |
| 195 | 195 | if (PEAR::isError($ktapiFolder)) { |
| 196 | 196 | throw new RuntimeException($ktapiFolder->getMessage()); |
| 197 | 197 | } |
| 198 | - | |
| 198 | + | |
| 199 | 199 | $parentId = $ktapiFolder->get_parent_folder_id(); |
| 200 | 200 | $parent = new CMISFolderObject(CMISUtil::encodeObjectId($parentId, FOLDER), $this->ktapi); |
| 201 | 201 | |
| ... | ... | @@ -203,43 +203,70 @@ class CMISNavigationService { |
| 203 | 203 | } |
| 204 | 204 | |
| 205 | 205 | /** |
| 206 | - * Fetches the parent(s) of the specified object | |
| 206 | + * Gets the parent folder(s) for the specified non-folder, fileable object. | |
| 207 | 207 | * Multiple parents may exist if a repository supports multi-filing |
| 208 | 208 | * It is also possible that linked documents/folders may qualify as having multiple parents |
| 209 | 209 | * as they are essentially the same object |
| 210 | 210 | * |
| 211 | 211 | * @param string $repositoryId |
| 212 | 212 | * @param string $objectId |
| 213 | - * @param boolean $includeAllowableActions | |
| 214 | - * @param boolean $includeRelationships | |
| 215 | - * @param string $filter | |
| 216 | - * @return array $parents | |
| 213 | + * @param string $filter [optional] | |
| 214 | + * @param enum $includeRelationships [optional] | |
| 215 | + * @param string $renditionFilter [optional] | |
| 216 | + * @param boolean $includeAllowableActions [optional] | |
| 217 | + * @param boolean $includeRelativePathSegment [optional] | |
| 218 | + * @return array $parents - empty for unfiled objects or the root folder | |
| 219 | + * MUST include (unless not requested) for each object: | |
| 220 | + * array $properties | |
| 221 | + * array $relationships | |
| 222 | + * array $renditions | |
| 223 | + * $allowableActions | |
| 224 | + * string $relativePathSegment | |
| 217 | 225 | */ |
| 218 | - // TODO ConstraintViolationException: The Repository SHALL throw this exception if this method is invoked | |
| 219 | - // on an object who Object-Type Definition specifies that it is not fileable. | |
| 220 | - // FilterNotValidException: The Repository SHALL throw this exception if this property filter input parameter is not valid. | |
| 221 | - function getObjectParents($repositoryId, $objectId, $includeAllowableActions, $includeRelationships, $filter = '') | |
| 226 | + // TODO FilterNotValidException: The Repository SHALL throw this exception if this property filter input parameter is not valid. | |
| 227 | + function getObjectParents($repositoryId, $objectId, $filter = '', $includeRelationships = null, $renditionFilter = '', | |
| 228 | + $includeAllowableActions = false, $includeRelativePathSegment = false) | |
| 222 | 229 | { |
| 223 | 230 | $ancestry = array(); |
| 224 | 231 | |
| 225 | 232 | $objectId = CMISUtil::decodeObjectId($objectId, $typeId); |
| 233 | + | |
| 234 | + // if type is a folder, this function does not apply | |
| 235 | + if ($typeId == 'cmis:folder') { | |
| 236 | + throw new InvalidArgumentException('Cannot call this function for a folder object'); | |
| 237 | + } | |
| 238 | + | |
| 239 | + $objectTypeId = ucwords(str_replace('cmis:', '', $typeId)); | |
| 240 | + $object = 'CMIS' . $objectTypeId . 'Object'; | |
| 241 | + | |
| 242 | + if (!file_exists(CMIS_DIR . '/objecttypes/' . $object . '.inc.php')) { | |
| 243 | + throw new InvalidArgumentException('Type ' . $typeId . ' is not supported'); | |
| 244 | + } | |
| 245 | + | |
| 246 | + require_once(CMIS_DIR . '/objecttypes/' . $object . '.inc.php'); | |
| 247 | + $cmisObject = new $object; | |
| 248 | + | |
| 249 | + if (!$cmisObject->getAttribute('fileable')) { | |
| 250 | + throw new ConstraintViolationException('Unable to get parents of non-filable object'); | |
| 251 | + } | |
| 226 | 252 | |
| 227 | 253 | // TODO - what about other types? only implementing folders and documents at the moment so ignore for now |
| 254 | + // NOTE this will change if we implement multi-filing and/or unfiling | |
| 228 | 255 | switch($typeId) |
| 229 | 256 | { |
| 230 | 257 | case 'cmis:document': |
| 231 | 258 | $document = $this->ktapi->get_document_by_id($objectId); |
| 232 | - $parent = $document->ktapi_folder; | |
| 233 | - $ancestry[] = $parent; | |
| 234 | - break; | |
| 235 | - case 'cmis:folder': | |
| 236 | - $folder = $this->ktapi->get_folder_by_id($objectId); | |
| 237 | - $parent = $this->ktapi->get_folder_by_id($folder->get_parent_folder_id()); | |
| 238 | - $ancestry[] = $parent; | |
| 239 | - break; | |
| 259 | + if ($document->is_deleted()) { | |
| 260 | + throw new InvalidArgumentException('The requested object has been deleted'); | |
| 261 | + } | |
| 262 | + $ancestry[] = $document->ktapi_folder->get_folderid(); | |
| 263 | + break; | |
| 264 | + } | |
| 265 | + | |
| 266 | + foreach ($ancestry as $key => $parentId) { | |
| 267 | + $CMISObject = new CMISFolderObject($parentId, $this->ktapi, $repositoryURI); | |
| 268 | + $ancestry[$key] = CMISUtil::createObjectPropertiesEntry($CMISObject->getProperties()); | |
| 240 | 269 | } |
| 241 | - | |
| 242 | - $ancestry = CMISUtil::createParentObjectHierarchy($ancestry, $repository->getRepositoryURI, $this->ktapi); | |
| 243 | 270 | |
| 244 | 271 | return $ancestry; |
| 245 | 272 | } |
| ... | ... | @@ -266,8 +293,8 @@ class CMISNavigationService { |
| 266 | 293 | */ |
| 267 | 294 | // TODO exceptions: • FilterNotValidException: The Repository SHALL throw this exception if this property filter input parameter is not valid. |
| 268 | 295 | // TODO $filter and paging |
| 269 | - function getCheckedOutDocs($repositoryId, $folderId = null, $maxItems = 0, $skipCount = 0, $orderBy = '', | |
| 270 | - $filter = '', $includeRelationships = null, $includeAllowableActions = false, $renditionFilter = '') | |
| 296 | + function getCheckedOutDocs($repositoryId, $folderId = null, $maxItems = 0, $skipCount = 0, $orderBy = '', | |
| 297 | + $filter = '', $includeRelationships = null, $includeAllowableActions = false, $renditionFilter = '') | |
| 271 | 298 | { |
| 272 | 299 | $checkedout = array(); |
| 273 | 300 | ... | ... |
lib/api/ktcmis/services/CMISRepositoryService.inc.php
| ... | ... | @@ -101,9 +101,12 @@ class CMISRepositoryService { |
| 101 | 101 | * @param boolean $hasMoreItems TRUE if there are more items to return than were requested |
| 102 | 102 | * @return array $objectTypes |
| 103 | 103 | */ |
| 104 | - // NOTE this code may fit better within the Repository Class | |
| 105 | 104 | // TODO return for specific type when $typeId is specified |
| 106 | 105 | // TODO other optional parameters |
| 106 | + // This code is superseded by getTypeChildren and getTypeDescendants - when implementing those, check | |
| 107 | + // whether it is possible to entirely remove this function or if it is to remain and be shared by the | |
| 108 | + // other two functions (when no type is specified they will return base types [children] amd all types | |
| 109 | + // [descendants] respectively | |
| 107 | 110 | public function getTypes($repositoryId, $typeId = '', $returnPropertyDefinitions = false, |
| 108 | 111 | $maxItems = 0, $skipCount = 0, &$hasMoreItems = false) |
| 109 | 112 | { | ... | ... |
lib/api/ktcmis/util/CMISUtil.inc.php
| ... | ... | @@ -213,6 +213,7 @@ class CMISUtil { |
| 213 | 213 | * @return array $CMISArray |
| 214 | 214 | */ |
| 215 | 215 | // NOTE this will have to change if we implement multi-filing |
| 216 | + // NOTE this function probably serves no purpose, the parents are to be returned as a flat array | |
| 216 | 217 | static public function createParentObjectHierarchy($input, $repositoryURI, &$ktapi) |
| 217 | 218 | { |
| 218 | 219 | $CMISArray = array(); | ... | ... |
webservice/atompub/cmis/KT_cmis_atom_server.services.inc.php
| ... | ... | @@ -401,7 +401,7 @@ class KT_cmis_atom_service_document extends KT_cmis_atom_service { |
| 401 | 401 | // update accordingly when updating to newer specification |
| 402 | 402 | if ($this->params[1] == 'parent') |
| 403 | 403 | { |
| 404 | - $NavigationService = new NavigationService(KT_cmis_atom_service_helper::getKt()); | |
| 404 | + $NavigationService = new KTNavigationService(KT_cmis_atom_service_helper::getKt()); | |
| 405 | 405 | $response = $NavigationService->getObjectParents($repositoryId, $objectId, false, false); |
| 406 | 406 | |
| 407 | 407 | if ($response['status_code'] == 1) { | ... | ... |