This repository has been archived on 2024-11-28. You can view files and clone it, but cannot push or open issues or pull requests.
Incam_SGD/lib/api/ktcmis/services/CMISNavigationService.inc.php

286 lines
12 KiB
PHP
Raw Normal View History

<?php
/**
* CMIS Repository Navigation API class for KnowledgeTree.
*
* KnowledgeTree Community Edition
* Document Management Made Simple
* Copyright (C) 2008,2009 KnowledgeTree Inc.
*
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 3 as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco,
* California 94120-7775, or email info@knowledgetree.com.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "Powered by
* KnowledgeTree" logo and retain the original copyright notice. If the display of the
* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
* must display the words "Powered by KnowledgeTree" and retain the original
* copyright notice.
*
* @copyright 2008-2009, KnowledgeTree Inc.
* @license GNU General Public License version 3
* @author KnowledgeTree Team
* @package KTCMIS
* @version Version 0.1
*/
require_once(KT_DIR . '/ktapi/ktapi.inc.php');
require_once(CMIS_DIR . '/util/CMISUtil.inc.php');
class CMISNavigationService {
protected $ktapi;
/**
* Sets the interface to be used to interact with the repository
*
* @param object $ktapi The KnowledgeTree API interface
*/
function setInterface(&$ktapi)
{
$this->ktapi = $ktapi;
}
/**
* Get descendents of the specified folder, up to the depth indicated
*
* @param string $repositoryId
* @param string $folderId
* @param boolean $includeAllowableActions
* @param boolean $includeRelationships
* @param string $typeId
* @param int $depth
* @param string $filter
* @return array $descendants
*/
// NOTE This method does NOT support paging as defined in the paging section
// NOTE If the Repository supports the optional “VersionSpecificFiling<6E><67>? capability,
// then the repository SHALL return the document versions filed in the specified folder or its descendant folders.
// Otherwise, the latest version of the documents SHALL be returned.
// TODO FilterNotValidException: The Repository SHALL throw this exception if this property filter input parameter is not valid
function getDescendants($repositoryId, $folderId, $includeAllowableActions, $includeRelationships,
$depth = 1, $typeId = 'Any', $filter = '')
{
// TODO optional parameters
$descendants = array();
$repository = new CMISRepository($repositoryId);
// if this is not a folder, cannot get descendants
$folderId = CMISUtil::decodeObjectId($folderId, $type);
if ($type != 'Folder')
{
return $descendants;
}
$folder = $this->ktapi->get_folder_by_id($folderId);
$descendants = $folder->get_listing($depth);
// parse ktapi descendants result into a list of CMIS objects
$descendants = CMISUtil::createChildObjectHierarchy($descendants, $repository->getRepositoryURI, $this->ktapi);
return $descendants;
}
/**
* Get direct children of the specified folder
*
* @param string $repositoryId
* @param string $folderId
* @param boolean $includeAllowableActions
* @param boolean $includeRelationships
* @param string $typeId
* @param string $filter
* @param int $maxItems
* @param int $skipCount
* @return array $descendants
*/
// NOTE If the Repository supports the optional “VersionSpecificFiling<6E><67>? capability,
// then the repository SHALL return the document versions filed in the specified folder or its descendant folders.
// Otherwise, the latest version of the documents SHALL be returned.
// TODO FilterNotValidException: The Repository SHALL throw this exception if this property filter input parameter is not valid
function getChildren($repositoryId, $folderId, $includeAllowableActions, $includeRelationships,
$typeId = 'Any', $filter = '', $maxItems = 0, $skipCount = 0)
{
// TODO paging
// TODO optional parameters
$children = array();
$repository = new CMISRepository($repositoryId);
// if this is not a folder, cannot get children
$folderId = CMISUtil::decodeObjectId($folderId, $type);
// NOTE this will quite possibly break the webservices
if ($type != 'Folder') {
return $children;
}
$folder = $this->ktapi->get_folder_by_id($folderId);
$children = $folder->get_listing();
$children = CMISUtil::createChildObjectHierarchy($children, $repository->getRepositoryURI, $this->ktapi);
return $children;
}
/**
* Fetches the folder parent and optional ancestors
*
* @param string $repositoryId
* @param string $folderId
* @param boolean $includeAllowableActions
* @param boolean $includeRelationships
* @param boolean $returnToRoot If TRUE, then the repository SHALL return all folder objects
* that are ancestors of the specified folder.
* If FALSE, the repository SHALL return only the parent folder of the specified folder.
* @param string $filter
* @return array $ancestry
*/
// TODO FilterNotValidException: The Repository SHALL throw this exception if this property filter input parameter is not valid
// TODO If this service method is invoked on the root folder of the Repository, then the Repository SHALL return an empty result set.
// NOTE SHOULD always include the “ObjectId<49><64>? and “ParentId<49><64>? properties for all objects returned
function getFolderParent($repositoryId, $folderId, $includeAllowableActions, $includeRelationships, $returnToRoot, $filter = '')
{
// NOTE the root folder obviously has no parent, throw an ObjectNotFoundException here if this is the root folder
if (CMISUtil::isRootFolder($repositoryId, $folderId, $this->ktapi)) {
throw new ObjectNotFoundException('Root folder has no parent');
}
$ancestry = array();
$repository = new CMISRepository($repositoryId);
// if this is not a folder, cannot get folder parent :)
$folderId = CMISUtil::decodeObjectId($folderId, $type);
// NOTE this will quite possibly break the webservices
if ($type != 'Folder')
{
return $ancestry;
}
$ktapiFolder = $this->ktapi->get_folder_by_id($folderId);
if ($returnToRoot)
{
$folder = $ktapiFolder->get_folder();
$parents = $folder->generateFolderIDs($folderId);
// remove the id of the requesting folder and convert to array
$ancestry = explode(',', str_replace(','.$folderId, '', $parents));
// reverse to get bottom up listing? don't think so with the current implementation
// specifying that objectTypes may have children but do not have parents listed.
// $ancestry = array_reverse($ancestry);
}
else
{
$parent = $ktapiFolder->get_parent_folder_id();
$ancestry[] = $parent;
}
// need some info about the parent(s) in order to correctly create the hierarchy
$tmpArray = array();
foreach ($ancestry as $key => $ancestor)
{
$tmpArray[$key] = $this->ktapi->get_folder_by_id($ancestor);
}
$ancestry = $tmpArray;
unset($tmpArray);
$ancestry = CMISUtil::createParentObjectHierarchy($ancestry, $repository->getRepositoryURI, $this->ktapi);
return $ancestry;
}
/**
* Fetches the parent(s) of the specified object
* Multiple parents may exist if a repository supports multi-filing
* It is also possible that linked documents/folders may qualify as having multiple parents
* as they are essentially the same object
*
* @param string $repositoryId
* @param string $objectId
* @param boolean $includeAllowableActions
* @param boolean $includeRelationships
* @param string $filter
* @return array $parents
*/
// TODO ConstraintViolationException: The Repository SHALL throw this exception if this method is invoked
// on an object who Object-Type Definition specifies that it is not fileable.
// FilterNotValidException: The Repository SHALL throw this exception if this property filter input parameter is not valid.
function getObjectParents($repositoryId, $objectId, $includeAllowableActions, $includeRelationships, $filter = '')
{
$ancestry = array();
$objectId = CMISUtil::decodeObjectId($objectId, $typeId);
// TODO - what about other types? only implementing folders and documents at the moment so ignore for now
switch($typeId)
{
case 'Document':
$document = $this->ktapi->get_document_by_id($objectId);
$parent = $document->ktapi_folder;
$ancestry[] = $parent;
break;
case 'Folder':
$folder = $this->ktapi->get_folder_by_id($objectId);
$parent = $this->ktapi->get_folder_by_id($folder->get_parent_folder_id());
$ancestry[] = $parent;
break;
}
$ancestry = CMISUtil::createParentObjectHierarchy($ancestry, $repository->getRepositoryURI, $this->ktapi);
return $ancestry;
}
/**
* Returns a list of checked out documents from the selected repository
*
* @param string $repositoryId
* @param string $folderId The folder for which checked out docs are requested
* @param string $filter
* @param boolean $includeAllowableActions
* @param boolean $includeRelationships
* @param int $maxItems
* @param int $skipCount
* @return array $checkedout The collection of checked out document objects
*/
// NOTE NOT YET IMPLEMENTED (this function is just a place holder at the moment :))
// TODO exceptions: • FilterNotValidException: The Repository SHALL throw this exception if this property filter input parameter is not valid.
// TODO filter by folder id
// TODO $filter and paging
function getCheckedOutDocs($repositoryId, $folderId = null, $filter = '', $includeAllowableActions, $includeRelationships,
$maxItems = 0, $skipCount = 0)
{
$checkedout = array();
$results = $this->ktapi->get_checkedout_docs(false);
foreach($results as $document)
{
$CMISDocument = new CMISDocumentObject($document->getId(), $this->ktapi);
// set version label property - possibly belongs in document class
$CMISDocument->setProperty('VersionLabel', $CMISDocument->getProperty('VersionSeriesCheckedOutId'));
$checkedout[] = $CMISDocument->getProperties();
}
return $checkedout;
}
}
?>