git-svn-id: https://192.168.0.254/svn/Proyectos.Incam_SGD/tags/3.7.0.2_original@1 eb19766c-00d9-a042-a3a0-45cb8ec72764
286 lines
12 KiB
PHP
286 lines
12 KiB
PHP
<?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;
|
||
}
|
||
|
||
}
|
||
|
||
?>
|