From 1de29d078e9b3a84d2f836846a7e12c6b5547d93 Mon Sep 17 00:00:00 2001 From: Paul Barrett Date: Fri, 23 Oct 2009 15:40:58 +0200 Subject: [PATCH] Removed unwanted parent link in CMIS object properties response for the root folder --- lib/api/ktcmis/classes/CMISRepository.inc.php | 5 ++++- lib/api/ktcmis/util/CMISUtil.inc.php | 30 +++++++++++++++++++++++------- webservice/atompub/cmis/KT_cmis_atom_server.services.inc.php | 69 +++++++++++++++++++++++---------------------------------------------- webservice/atompub/cmis/KT_cmis_atom_service_helper.inc.php | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------- 4 files changed, 112 insertions(+), 67 deletions(-) diff --git a/lib/api/ktcmis/classes/CMISRepository.inc.php b/lib/api/ktcmis/classes/CMISRepository.inc.php index a4b34fa..ea66a06 100644 --- a/lib/api/ktcmis/classes/CMISRepository.inc.php +++ b/lib/api/ktcmis/classes/CMISRepository.inc.php @@ -61,7 +61,7 @@ class CMISRepository { */ private $objectTypes; - function CMISRepository($repositoryId, $config = null) + function __construct($repositoryId, $config = null) { $this->repositoryId = $repositoryId; $this->RepositoryInfo = new CMISRepositoryInfo(); @@ -94,6 +94,9 @@ class CMISRepository { // set info foreach($config->repositoryInfo[0] as $field => $value) { +// if ($field == 'rootFolderId') { +// $value = CMISUtil::encodeObjectId(FOLDER, $value); +// } $this->setRepositoryInfoField($field, (string)$value); } diff --git a/lib/api/ktcmis/util/CMISUtil.inc.php b/lib/api/ktcmis/util/CMISUtil.inc.php index c116ded..f04c79d 100644 --- a/lib/api/ktcmis/util/CMISUtil.inc.php +++ b/lib/api/ktcmis/util/CMISUtil.inc.php @@ -178,14 +178,14 @@ class CMISUtil { // if sub-array if (count($object['items']) > 0) { - $CMISArray[$count]['items'] = CMISUtil::createChildObjectHierarchy($object['items'], $repositoryURI, $ktapi); + $CMISArray[$count]['items'] = self::createChildObjectHierarchy($object['items'], $repositoryURI, $ktapi); } } else { // NOTE why is this necessary? That's what you get for not commenting it at the time // TODO comment this properly - $CMISArray[$count] = CMISUtil::createChildObjectHierarchy($object, $repositoryURI, $ktapi); + $CMISArray[$count] = self::createChildObjectHierarchy($object, $repositoryURI, $ktapi); } } } @@ -222,7 +222,7 @@ class CMISUtil { // if more parent elements if (count($input) > 0) { - $CMISElement['items'] = CMISUtil::createParentObjectHierarchy($input, $repositoryURI, $ktapi); + $CMISElement['items'] = self::createParentObjectHierarchy($input, $repositoryURI, $ktapi); } $CMISArray[] = $CMISElement; @@ -252,7 +252,7 @@ class CMISUtil { $object = $entry['object']; $properties = $object->getProperties(); - $hierarchy[$key] = CMISUtil::createObjectPropertiesEntry($properties); + $hierarchy[$key] = self::createObjectPropertiesEntry($properties); } return $hierarchy; @@ -293,7 +293,7 @@ class CMISUtil { 'value' => $properties->getValue('Name')); $object['properties']['ParentId'] = array('type' => $properties->getFieldType('ParentId'), - 'value' => CMISUtil::encodeObjectId('Folder', + 'value' => self::encodeObjectId('Folder', $properties->getValue('ParentId'))); $object['properties']['Uri'] = array('type' => $properties->getFieldType('Uri'), @@ -350,7 +350,7 @@ class CMISUtil { /* // if we have found a child/parent with one or more children/parents, recurse into the child/parent object if (count($entry['items']) > 0) { - $object[$linkText] = CMISUtil::decodeObjectHierarchy($entry['items'], $linkText); + $object[$linkText] = self::decodeObjectHierarchy($entry['items'], $linkText); } // NOTE may need to set a null value here in case webservices don't like it unset // so we'll set it just in case... @@ -602,7 +602,7 @@ class CMISUtil { // TODO consider checking whether content is encoded (currently we expect encoded) // TODO choose between this and the alternative decode function (see CMISUtil class) // this will require some basic benchmarking - $contentStream = CMISUtil::decodeChunkedContentStream($contentStream); + $contentStream = self::decodeChunkedContentStream($contentStream); // NOTE There is a function in CMISUtil to do this, written for the unit tests but since KTUploadManager exists // and has more functionality which could come in useful at some point I decided to go with that instead @@ -613,6 +613,22 @@ class CMISUtil { return $tempfilename; } + + static public function getIdFromName($name, &$ktapi) + { + $folder = $ktapi->get_folder_by_name($name); + + return self::encodeObjectId(FOLDER, $folder->get_folderid()); + } + + static public function isRootFolder($repositoryId, $folderId, &$ktapi) + { + $repository = new CMISRepository($repositoryId); + $repositoryInfo = $repository->getRepositoryInfo(); + $rootFolder = self::getIdFromName($repositoryInfo->getRootFolderId(), $ktapi); + + return $folderId == $rootFolder; + } } diff --git a/webservice/atompub/cmis/KT_cmis_atom_server.services.inc.php b/webservice/atompub/cmis/KT_cmis_atom_server.services.inc.php index 156ae4b..40f7571 100644 --- a/webservice/atompub/cmis/KT_cmis_atom_server.services.inc.php +++ b/webservice/atompub/cmis/KT_cmis_atom_server.services.inc.php @@ -54,11 +54,9 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service { * This includes children and tree/descendant listings as well as individual folder retrieval */ public function GET_action() - { - $RepositoryService = new RepositoryService(); - $repositories = $RepositoryService->getRepositories(); - $repositoryId = $repositories[0]['repositoryId']; - + { + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService); + // TODO implement full path/node separation as with Alfresco - i.e. path requests come in on path/ and node requests come in on node/ // path request e.g.: path/Root Folder/DroppedDocuments // node request e.g.: node/F1/children @@ -134,9 +132,7 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service { */ public function POST_action() { - $RepositoryService = new RepositoryService(); - $repositories = $RepositoryService->getRepositories(); - $repositoryId = $repositories[0]['repositoryId']; + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService); // set default action, objectId and typeId $action = 'create'; @@ -246,12 +242,10 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service { // we COULD call deleteObject but when we delete a folder we expect to be trying to delete // the folder and all content. - $RepositoryService = new RepositoryService(); + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService); + $ObjectService = new ObjectService(KT_cmis_atom_service_helper::getKt()); - $repositories = $RepositoryService->getRepositories(); - $repositoryId = $repositories[0]['repositoryId']; - // attempt delete $response = $ObjectService->deleteTree($repositoryId, $this->params[0]); @@ -369,12 +363,10 @@ class KT_cmis_atom_service_document extends KT_cmis_atom_service { */ public function GET_action() { - $RepositoryService = new RepositoryService(); + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService); + $ObjectService = new ObjectService(KT_cmis_atom_service_helper::getKt()); - $repositories = $RepositoryService->getRepositories(); - $repositoryId = $repositories[0]['repositoryId']; - $objectId = $this->params[0]; // TODO this is "parents" in later versions of the specification @@ -422,12 +414,10 @@ class KT_cmis_atom_service_document extends KT_cmis_atom_service { // NOTE due to the way KnowledgeTree works with documents this is always going to call deleteAllVersions. // we do not have support for deleting only specific versions (this may be added in the future.) - $RepositoryService = new RepositoryService(); + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService); + $VersioningService = new VersioningService(KT_cmis_atom_service_helper::getKt()); - $repositories = $RepositoryService->getRepositories(); - $repositoryId = $repositories[0]['repositoryId']; - // attempt delete $response = $VersioningService->deleteAllVersions($repositoryId, $this->params[0]); @@ -456,12 +446,10 @@ class KT_cmis_atom_service_pwc extends KT_cmis_atom_service { */ public function GET_action() { - $RepositoryService = new RepositoryService(); + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService); + $ObjectService = new ObjectService(KT_cmis_atom_service_helper::getKt()); - $repositories = $RepositoryService->getRepositories(); - $repositoryId = $repositories[0]['repositoryId']; - // determine whether we want the Private Working Copy entry feed or the actual physical Private Working Copy content. // this depends on $this->params[1] if (!empty($this->params[1])) @@ -486,12 +474,11 @@ class KT_cmis_atom_service_pwc extends KT_cmis_atom_service { public function DELETE_action() { // call the cancel checkout function - $RepositoryService = new RepositoryService(); + + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService); + $VersioningService = new VersioningService(KT_cmis_atom_service_helper::getKt()); - $repositories = $RepositoryService->getRepositories(); - $repositoryId = $repositories[0]['repositoryId']; - $response = $VersioningService->cancelCheckout($repositoryId, $this->params[0]); if (PEAR::isError($response)) @@ -508,13 +495,11 @@ class KT_cmis_atom_service_pwc extends KT_cmis_atom_service { public function PUT_action() { - $RepositoryService = new RepositoryService(); + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService); + $VersioningService = new VersioningService(KT_cmis_atom_service_helper::getKt()); $ObjectService = new ObjectService(KT_cmis_atom_service_helper::getKt()); - $repositories = $RepositoryService->getRepositories(); - $repositoryId = $repositories[0]['repositoryId']; - // check for content stream // NOTE this is a hack! will not work with CMISSpaces at least, probably not with any client except RestTest and similar // where we can manually modify the input @@ -573,12 +558,10 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service { */ public function GET_action() { - $RepositoryService = new RepositoryService(); + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService); + $NavigationService = new NavigationService(KT_cmis_atom_service_helper::getKt()); - $repositories = $RepositoryService->getRepositories(); - $repositoryId = $repositories[0]['repositoryId']; - $checkedout = $NavigationService->getCheckedOutDocs($repositoryId); //Create a new response feed @@ -631,13 +614,11 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service { public function POST_action() { - $RepositoryService = new RepositoryService(); + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService); + $VersioningService = new VersioningService(KT_cmis_atom_service_helper::getKt()); $ObjectService = new ObjectService(KT_cmis_atom_service_helper::getKt()); - $repositories = $RepositoryService->getRepositories(); - $repositoryId = $repositories[0]['repositoryId']; - $cmisObjectProperties = KT_cmis_atom_service_helper::getCmisProperties($this->parsedXMLContent['@children']); // check for existing object id as property of submitted object data @@ -676,8 +657,7 @@ class KT_cmis_atom_service_types extends KT_cmis_atom_service { public function GET_action() { $RepositoryService = new RepositoryService(); - $repositories = $RepositoryService->getRepositories(); - $repositoryId = $repositories[0]['repositoryId']; + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService); $types = $RepositoryService->getTypes($repositoryId); $type = ((empty($this->params[0])) ? 'all' : $this->params[0]); @@ -697,10 +677,7 @@ class KT_cmis_atom_service_type extends KT_cmis_atom_service { public function GET_action() { $RepositoryService = new RepositoryService(); - - // fetch repository id - $repositories = $RepositoryService->getRepositories(); - $repositoryId = $repositories[0]['repositoryId']; + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService); if (!isset($this->params[1])) { // For easier return in the wanted format, we call getTypes instead of getTypeDefinition. diff --git a/webservice/atompub/cmis/KT_cmis_atom_service_helper.inc.php b/webservice/atompub/cmis/KT_cmis_atom_service_helper.inc.php index cf964c6..8303282 100644 --- a/webservice/atompub/cmis/KT_cmis_atom_service_helper.inc.php +++ b/webservice/atompub/cmis/KT_cmis_atom_service_helper.inc.php @@ -1,8 +1,49 @@ getRepositories(); + + // TODO handle multiple repositories + self::$repositoryId = $repositories[0]['repositoryId']; + } + + /** + * Helper function to fetch internal repository id + * + * Calls set function automatically, use $set = false to prevent this and return the current setting, if any + * + * NOTE the function will automatically call the setRepositoryId function if no previous repository id was set + * + * @param object $RepositoryService + * @param boolean $RepositoryService + * @return string + */ + static public function getRepositoryId(&$RepositoryService = null, $set = true) + { + if (empty(self::$repositoryId) || $set) { + self::setRepositoryId($RepositoryService); + } + + return self::$repositoryId; + } /** * Retrieves data about a specific folder OR document within a folder @@ -14,6 +55,8 @@ class KT_cmis_atom_service_helper { */ static public function getObjectFeed(&$service, $ObjectService, $repositoryId, $objectId, $method = 'GET') { + self::$repositoryId = $repositoryId; + $serviceType = $service->getServiceType(); $response = $ObjectService->getProperties($repositoryId, $objectId, false, false); @@ -58,7 +101,7 @@ class KT_cmis_atom_service_helper { * @param string $parent The parent folder */ static public function createObjectEntry(&$response, $cmisEntry, $parent, $pwc = false, $method = 'GET') - { + { $workspace = $response->getWorkspace(); $type = strtolower($cmisEntry['properties']['ObjectTypeId']['value']); @@ -143,13 +186,19 @@ class KT_cmis_atom_service_helper { . $cmisEntry['properties']['ObjectId']['value'] . '/rels')); $entry->appendChild($link); - // TODO check parent link is correct, fix if needed - // TODO leave out if at root folder - $link = $response->newElement('link'); - $link->appendChild($response->newAttr('rel', 'parents')); - $link->appendChild($response->newAttr('href', CMIS_APP_BASE_URI . $workspace . '/folder/' - . $cmisEntry['properties']['ObjectId']['value'] . '/parent')); - $entry->appendChild($link); + // if there is no parent or parent is 0, do not add the parent link + // also if this is specifically the root folder, do not add the parent link +// if (!empty($cmisEntry['properties']['ParentId']['value']) && !CMISUtil::isRootFolder(self::$repositoryId, $cmisEntry['properties']['ObjectId']['value'])) + + if (!CMISUtil::isRootFolder(self::$repositoryId, $cmisEntry['properties']['ObjectId']['value'], self::$ktapi)) + { + // TODO check parent link is correct, fix if needed + $link = $response->newElement('link'); + $link->appendChild($response->newAttr('rel', 'parents')); + $link->appendChild($response->newAttr('href', CMIS_APP_BASE_URI . $workspace . '/folder/' + . $cmisEntry['properties']['ObjectId']['value'] . '/parent')); + $entry->appendChild($link); + } // Folder/Document specific links if (strtolower($cmisEntry['properties']['ObjectTypeId']['value']) == 'folder') @@ -480,12 +529,12 @@ class KT_cmis_atom_service_helper { */ public static function getKt() { - if(!isset(self::$kt)) + if(!isset(self::$ktapi)) { - self::$kt = new KTAPI(); - self::$kt->get_active_session(session_id()); + self::$ktapi = new KTAPI(); + self::$ktapi->get_active_session(session_id()); } - return self::$kt; + return self::$ktapi; } // TODO adjust for time zones? -- libgit2 0.21.4