Commit a1fdda0f2c74fbf25e2674e1524632cdbc80a284
1 parent
2ce508a4
CMIS: Added initial API level support for checkout, cancel checkout, list checked out documents
Story ID: 1093055. In order to be able to checkout documents using a CMIS client, as a user, I would like KnowledgeTree's API to support CMIS checkout In Progress Committed by: Paul Barrett
Showing
11 changed files
with
738 additions
and
482 deletions
ktapi/KTAPIDocument.inc.php
| ... | ... | @@ -484,7 +484,7 @@ class KTAPI_Document extends KTAPI_FolderItem |
| 484 | 484 | { |
| 485 | 485 | return $user; |
| 486 | 486 | } |
| 487 | - | |
| 487 | + | |
| 488 | 488 | //if the document is checked-out by the current user, just return |
| 489 | 489 | //as no need to check-out again BUT we do need to download |
| 490 | 490 | //returning here will allow download, but skip check-out |
| ... | ... | @@ -2502,6 +2502,17 @@ class KTAPI_Document extends KTAPI_FolderItem |
| 2502 | 2502 | sendEmail($listEmails, $this->documentid, $this->get_title(), $comment, (boolean)$attachDocument, $emailErrors); |
| 2503 | 2503 | |
| 2504 | 2504 | } |
| 2505 | + | |
| 2506 | + /** | |
| 2507 | + * Get a list of Documents | |
| 2508 | + * | |
| 2509 | + * @param String Where clause (not required) | |
| 2510 | + * @return Array array of Documents objects, false otherwise. | |
| 2511 | + */ | |
| 2512 | + static public function getList($whereClause = null) | |
| 2513 | + { | |
| 2514 | + return Document::getList($whereClause); | |
| 2515 | + } | |
| 2505 | 2516 | } |
| 2506 | 2517 | |
| 2507 | 2518 | ?> | ... | ... |
ktapi/ktapi.inc.php
| ... | ... | @@ -3094,7 +3094,7 @@ class KTAPI |
| 3094 | 3094 | * @param string $reason |
| 3095 | 3095 | * @return kt_document_detail. |
| 3096 | 3096 | */ |
| 3097 | - public function checkout_document($document_id, $reason, $download=true, $sig_username = '', $sig_password = '') | |
| 3097 | + public function checkout_document($document_id, $reason, $download = true, $sig_username = '', $sig_password = '') | |
| 3098 | 3098 | { |
| 3099 | 3099 | $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, |
| 3100 | 3100 | 'ktcore.transactions.check_out'); |
| ... | ... | @@ -3109,7 +3109,8 @@ class KTAPI |
| 3109 | 3109 | } |
| 3110 | 3110 | |
| 3111 | 3111 | $result = $document->checkout($reason); |
| 3112 | - if (PEAR::isError($result)) | |
| 3112 | + | |
| 3113 | + if (PEAR::isError($result)) | |
| 3113 | 3114 | { |
| 3114 | 3115 | $response['status_code'] = 1; |
| 3115 | 3116 | $response['message'] = $result->getMessage(); |
| ... | ... | @@ -3232,7 +3233,7 @@ class KTAPI |
| 3232 | 3233 | |
| 3233 | 3234 | $result = $document->undo_checkout($reason); |
| 3234 | 3235 | if (PEAR::isError($result)) |
| 3235 | - { | |
| 3236 | + { | |
| 3236 | 3237 | $response['status_code'] = 1; |
| 3237 | 3238 | $response['message'] = $result->getMessage(); |
| 3238 | 3239 | return $response; |
| ... | ... | @@ -3246,6 +3247,29 @@ class KTAPI |
| 3246 | 3247 | $response['status_code'] = 0; |
| 3247 | 3248 | return $response; |
| 3248 | 3249 | } |
| 3250 | + | |
| 3251 | + /** | |
| 3252 | + * Fetches a list of checked out documents (optionally limited to the logged in user) | |
| 3253 | + * | |
| 3254 | + * @param boolean $userSpecific limit to current user | |
| 3255 | + * @return $checkedout An array of checked out documents | |
| 3256 | + */ | |
| 3257 | + public function get_checkedout_docs($userSpecific = true) | |
| 3258 | + { | |
| 3259 | + $checkedout = array(); | |
| 3260 | + | |
| 3261 | + $where = null; | |
| 3262 | + // limit to current user? | |
| 3263 | + if ($userSpecific) { | |
| 3264 | + $where = array('checked_out_user_id = ?', $this->get_user()->getId()); | |
| 3265 | + } | |
| 3266 | + else { | |
| 3267 | + $where = array('is_checked_out = ?', 1); | |
| 3268 | + } | |
| 3269 | + $checkedout = KTAPI_Document::getList($where); | |
| 3270 | + | |
| 3271 | + return $checkedout; | |
| 3272 | + } | |
| 3249 | 3273 | |
| 3250 | 3274 | /** |
| 3251 | 3275 | * Returns a reference to a file to be downloaded. | ... | ... |
lib/api/ktcmis/classes/CMISBaseObject.inc.php deleted
| 1 | -<?php | |
| 2 | -/** | |
| 3 | - * CMIS Repository Base Object API class for KnowledgeTree. | |
| 4 | - * | |
| 5 | - * KnowledgeTree Community Edition | |
| 6 | - * Document Management Made Simple | |
| 7 | - * Copyright (C) 2008,2009 KnowledgeTree Inc. | |
| 8 | - * Portions copyright The Jam Warehouse Software (Pty) Limited | |
| 9 | - * | |
| 10 | - * This program is free software; you can redistribute it and/or modify it under | |
| 11 | - * the terms of the GNU General Public License version 3 as published by the | |
| 12 | - * Free Software Foundation. | |
| 13 | - * | |
| 14 | - * This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | - * details. | |
| 18 | - * | |
| 19 | - * You should have received a copy of the GNU General Public License | |
| 20 | - * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | - * | |
| 22 | - * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | - * California 94120-7775, or email info@knowledgetree.com. | |
| 24 | - * | |
| 25 | - * The interactive user interfaces in modified source and object code versions | |
| 26 | - * of this program must display Appropriate Legal Notices, as required under | |
| 27 | - * Section 5 of the GNU General Public License version 3. | |
| 28 | - * | |
| 29 | - * In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | - * these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | - * KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | - * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | - * must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | - * copyright notice. | |
| 35 | - * | |
| 36 | - * @copyright 2008-2009, KnowledgeTree Inc. | |
| 37 | - * @license GNU General Public License version 3 | |
| 38 | - * @author KnowledgeTree Team | |
| 39 | - * @package KTCMIS | |
| 40 | - * @version Version 0.1 | |
| 41 | - */ | |
| 42 | - | |
| 43 | -//require_once(CMIS_DIR . '/classes/CMISObject.inc.php'); | |
| 44 | - | |
| 45 | -abstract class CMISBaseObject { | |
| 46 | - | |
| 47 | - protected $typeId; | |
| 48 | - protected $queryName; | |
| 49 | - protected $displayName; | |
| 50 | - protected $baseType; | |
| 51 | - protected $baseTypeQueryName; | |
| 52 | - protected $parentId; | |
| 53 | - protected $description; | |
| 54 | - protected $creatable; | |
| 55 | - protected $fileable; | |
| 56 | - protected $queryable; | |
| 57 | - protected $includedInSupertypeQuery; | |
| 58 | - protected $controllable; // NOTE deprecated? part of policy objects specification, policy objects are indicated as TODO remove | |
| 59 | - protected $contentStreamAllowed = 'notAllowed'; | |
| 60 | - | |
| 61 | - protected $properties; // list of property objects which define the additional properties for this object | |
| 62 | - | |
| 63 | - // TODO all we have here so far is getAttributes & getProperties | |
| 64 | - // add all the other methods as we go along | |
| 65 | - | |
| 66 | - public function __construct() | |
| 67 | - { | |
| 68 | -// $propertyDef = new PropertyDefinition(); | |
| 69 | -// $this->properties[] = $propertyDef; | |
| 70 | - } | |
| 71 | - | |
| 72 | - /** | |
| 73 | - * Returns a listing of all attributes in an array | |
| 74 | - * | |
| 75 | - * @return array $attributes | |
| 76 | - */ | |
| 77 | - public function getAttributes() | |
| 78 | - { | |
| 79 | - $attributes = array(); | |
| 80 | - | |
| 81 | - // TODO look at how chemistry does this and implement something similar | |
| 82 | - // for now this is fine as we are just trying to get things up and running :) | |
| 83 | - $attributes['typeId'] = $this->typeId; | |
| 84 | - $attributes['queryName'] = $this->queryName; | |
| 85 | - $attributes['displayName'] = $this->displayName; | |
| 86 | - $attributes['baseType'] = $this->baseType; | |
| 87 | - $attributes['baseTypeQueryName'] = $this->baseTypeQueryName; | |
| 88 | - $attributes['parentId'] = $this->parentId; | |
| 89 | - $attributes['description'] = $this->description; | |
| 90 | - $attributes['creatable'] = $this->creatable; | |
| 91 | - $attributes['fileable'] = $this->fileable; | |
| 92 | - $attributes['queryable'] = $this->queryable; | |
| 93 | - $attributes['includedInSupertypeQuery'] = $this->includedInSupertypeQuery; | |
| 94 | - $attributes['controllable'] = $this->includedInSupertypeQuery; | |
| 95 | - | |
| 96 | - return $attributes; | |
| 97 | - } | |
| 98 | - | |
| 99 | - public function getAttribute($field) | |
| 100 | - { | |
| 101 | - return $this->{$field}; | |
| 102 | - } | |
| 103 | - | |
| 104 | - /** | |
| 105 | - * Sets properties for this type | |
| 106 | - * Obeys the rules as specified in the property definitions (once implemented) | |
| 107 | - */ | |
| 108 | - public function setProperty($field, $value) | |
| 109 | - { | |
| 110 | - $this->properties->setValue($field, $value); | |
| 111 | - } | |
| 112 | - | |
| 113 | - /** | |
| 114 | - * Sets properties for this type - internal only function which allows | |
| 115 | - * setting of properties by object on initialisation or re-query | |
| 116 | - * | |
| 117 | - * This will bypass the property definition checks for updateability (once implemented) | |
| 118 | - */ | |
| 119 | - protected function _setPropertyInternal($field, $value) | |
| 120 | - { | |
| 121 | - $this->properties->setValue($field, $value); | |
| 122 | - } | |
| 123 | - | |
| 124 | - /** | |
| 125 | - * Fetches properties for this object type | |
| 126 | - */ | |
| 127 | - public function getProperties() | |
| 128 | - { | |
| 129 | - return $this->properties; | |
| 130 | - } | |
| 131 | - | |
| 132 | - public function getProperty($property) | |
| 133 | - { | |
| 134 | - return $this->properties->getValue($property); | |
| 135 | - } | |
| 136 | - | |
| 137 | - public function reload($documentId) | |
| 138 | - { | |
| 139 | - $this->_get($documentId); | |
| 140 | - } | |
| 141 | - | |
| 142 | - private function _get($documentId) | |
| 143 | - { | |
| 144 | - // override in child classes | |
| 145 | - } | |
| 146 | - | |
| 147 | -} | |
| 148 | - | |
| 149 | -?> |
lib/api/ktcmis/classes/CMISObject.inc.php
| 1 | 1 | <?php |
| 2 | - | |
| 3 | -// TODO Property Type Definitions (only done Attributes up to now) | |
| 4 | - | |
| 5 | -interface CMISObject { | |
| 6 | - | |
| 7 | - /* | |
| 8 | - * ----- Object Services ----- | |
| 9 | - */ | |
| 10 | - | |
| 11 | - /** | |
| 12 | - * Moves this filed object from one folder to another. | |
| 13 | - * <p> | |
| 14 | - * The target folder is that into which the object has to be moved. When the | |
| 15 | - * object is multi-filed, a source folder to be moved out of must be | |
| 16 | - * specified. | |
| 17 | - * | |
| 18 | - * @param targetFolder the target folder | |
| 19 | - * @param sourceFolder the source folder, or {@code null} | |
| 20 | - */ | |
| 21 | -// function move($targetFolder, $sourceFolder = null); | |
| 22 | - | |
| 23 | - /** | |
| 24 | - * Deletes this object. | |
| 25 | - * <p> | |
| 26 | - * When a filed object is deleted, it is removed from all folders it is | |
| 27 | - * filed in. | |
| 28 | - * <p> | |
| 29 | - * This deletes a specific version of a document object. To delete all | |
| 30 | - * versions, use {@link #deleteAllVersions}. | |
| 31 | - * <p> | |
| 32 | - * Deletion of a private working copy (checked out version) is the same as | |
| 33 | - * to cancel checkout. | |
| 34 | - */ | |
| 35 | -// function delete(); | |
| 36 | - | |
| 37 | - /** | |
| 38 | - * Unfiles this non-folder object. | |
| 39 | - * <p> | |
| 40 | - * This removes this object from all folders it is filed in, but never | |
| 41 | - * deletes the object, which means that if unfiling is not supported, an | |
| 42 | - * exception will be thrown. | |
| 43 | - * <p> | |
| 44 | - * If this object is a folder then an exception will be thrown. | |
| 45 | - * | |
| 46 | - * @see #delete | |
| 47 | - * @see Folder#remove | |
| 48 | - */ | |
| 49 | -// function unfile(); | |
| 50 | - | |
| 51 | - /* | |
| 52 | - * ----- Navigation Services ----- | |
| 53 | - */ | |
| 2 | +/** | |
| 3 | + * CMIS Repository Base Object API class for KnowledgeTree. | |
| 4 | + * | |
| 5 | + * KnowledgeTree Community Edition | |
| 6 | + * Document Management Made Simple | |
| 7 | + * Copyright (C) 2008,2009 KnowledgeTree Inc. | |
| 8 | + * Portions copyright The Jam Warehouse Software (Pty) Limited | |
| 9 | + * | |
| 10 | + * This program is free software; you can redistribute it and/or modify it under | |
| 11 | + * the terms of the GNU General Public License version 3 as published by the | |
| 12 | + * Free Software Foundation. | |
| 13 | + * | |
| 14 | + * This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | + * details. | |
| 18 | + * | |
| 19 | + * You should have received a copy of the GNU General Public License | |
| 20 | + * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | + * | |
| 22 | + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | + * California 94120-7775, or email info@knowledgetree.com. | |
| 24 | + * | |
| 25 | + * The interactive user interfaces in modified source and object code versions | |
| 26 | + * of this program must display Appropriate Legal Notices, as required under | |
| 27 | + * Section 5 of the GNU General Public License version 3. | |
| 28 | + * | |
| 29 | + * In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | + * these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | + * KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | + * must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | + * copyright notice. | |
| 35 | + * | |
| 36 | + * @copyright 2008-2009, KnowledgeTree Inc. | |
| 37 | + * @license GNU General Public License version 3 | |
| 38 | + * @author KnowledgeTree Team | |
| 39 | + * @package KTCMIS | |
| 40 | + * @version Version 0.1 | |
| 41 | + */ | |
| 42 | + | |
| 43 | +abstract class CMISObject { | |
| 44 | + | |
| 45 | + protected $typeId; | |
| 46 | + protected $queryName; | |
| 47 | + protected $displayName; | |
| 48 | + protected $baseType; | |
| 49 | + protected $baseTypeQueryName; | |
| 50 | + protected $parentId; | |
| 51 | + protected $description; | |
| 52 | + protected $creatable; | |
| 53 | + protected $fileable; | |
| 54 | + protected $queryable; | |
| 55 | + protected $includedInSupertypeQuery; | |
| 56 | + protected $controllable; // NOTE deprecated? part of policy objects specification, policy objects are indicated as TODO remove | |
| 57 | + protected $contentStreamAllowed = 'notAllowed'; | |
| 58 | + | |
| 59 | + protected $properties; // list of property objects which define the additional properties for this object | |
| 60 | + | |
| 61 | + // TODO all we have here so far is getAttributes & getProperties | |
| 62 | + // add all the other methods as we go along | |
| 63 | + | |
| 64 | + public function __construct() | |
| 65 | + { | |
| 66 | +// $propertyDef = new PropertyDefinition(); | |
| 67 | +// $this->properties[] = $propertyDef; | |
| 68 | + } | |
| 54 | 69 | |
| 55 | 70 | /** |
| 56 | - * Gets the parent folder, or the single folder in which the object is | |
| 57 | - * filed. | |
| 58 | - * <p> | |
| 59 | - * For a folder, returns the parent folder, or {@code null} if there is no | |
| 60 | - * parent (for the root folder). | |
| 61 | - * <p> | |
| 62 | - * For a non-folder, if the object is single-filed then the folder in which | |
| 63 | - * it is filed is returned, otherwise if the folder is unfiled then {@code | |
| 64 | - * null} is returned. An exception is raised if the object is multi-filed, | |
| 65 | - * so in doubt use {@link #getParents}. | |
| 71 | + * Returns a listing of all attributes in an array | |
| 66 | 72 | * |
| 67 | - * @return the parent folder, or {@code null}. | |
| 68 | - * | |
| 69 | - * @see #getParents | |
| 70 | - * @see Folder#getAncestors | |
| 71 | - */ | |
| 72 | -// function getParent(); | |
| 73 | - | |
| 74 | -// /** | |
| 75 | -// * Gets the direct parents of this object. | |
| 76 | -// * <p> | |
| 77 | -// * The object must be a non-folder, fileable object. | |
| 78 | -// * | |
| 79 | -// * @return the collection of parent folders | |
| 80 | -// * | |
| 81 | -// * @see #getParent | |
| 82 | -// * @see Folder#getAncestors | |
| 83 | -// */ | |
| 84 | -// function getParents(); | |
| 85 | -// | |
| 86 | -// /* | |
| 87 | -// * ----- Relationship Services ----- | |
| 88 | -// */ | |
| 89 | -// | |
| 90 | -// /** | |
| 91 | -// * Gets the relationships having as source or target this object. | |
| 92 | -// * <p> | |
| 93 | -// * Returns a list of relationships associated with this object, optionally | |
| 94 | -// * of a specified relationship type, and optionally in a specified | |
| 95 | -// * direction. | |
| 96 | -// * <p> | |
| 97 | -// * If typeId is {@code null}, returns relationships of any type. | |
| 98 | -// * <p> | |
| 99 | -// * Ordering is repository specific but consistent across requests. | |
| 100 | -// * | |
| 101 | -// * @param direction the direction of relationships to include | |
| 102 | -// * @param typeId the type ID, or {@code null} | |
| 103 | -// * @param includeSubRelationshipTypes {@code true} if relationships of any | |
| 104 | -// * sub-type of typeId are to be returned as well | |
| 105 | -// * @return the list of relationships | |
| 106 | -// */ | |
| 107 | -// function getRelationships($direction, $typeId, $includeSubRelationshipTypes); | |
| 108 | -// | |
| 109 | -// /* | |
| 110 | -// * ----- Policy Services ----- | |
| 111 | -// */ | |
| 112 | -// | |
| 113 | -// /** | |
| 114 | -// * Applies a policy to this object. | |
| 115 | -// * <p> | |
| 116 | -// * The object must be controllable. | |
| 117 | -// * | |
| 118 | -// * @param policy the policy | |
| 119 | -// */ | |
| 120 | -// function applyPolicy(Policy policy); | |
| 121 | -// | |
| 122 | -// /** | |
| 123 | -// * Removes a policy from this object. | |
| 124 | -// * <p> | |
| 125 | -// * Removes a previously applied policy from the object. The policy is not | |
| 126 | -// * deleted, and may still be applied to other objects. | |
| 127 | -// * <p> | |
| 128 | -// * The object must be controllable. | |
| 129 | -// * | |
| 130 | -// * @param policy the policy | |
| 131 | -// */ | |
| 132 | -// function removePolicy(Policy policy); | |
| 133 | -// | |
| 134 | -// /** | |
| 135 | -// * Gets the policies applied to this object. | |
| 136 | -// * <p> | |
| 137 | -// * Returns the list of policy objects currently applied to the object. Only | |
| 138 | -// * policies that are directly (explicitly) applied to the object are | |
| 139 | -// * returned. | |
| 140 | -// * <p> | |
| 141 | -// * The object must be controllable. | |
| 142 | -// */ | |
| 143 | -// function getPolicies(); | |
| 144 | -// | |
| 145 | - /* | |
| 146 | - * ----- data access ----- | |
| 73 | + * @return array $attributes | |
| 147 | 74 | */ |
| 75 | + public function getAttributes() | |
| 76 | + { | |
| 77 | + $attributes = array(); | |
| 78 | + | |
| 79 | + // TODO look at how chemistry does this and implement something similar | |
| 80 | + // for now this is fine as we are just trying to get things up and running :) | |
| 81 | + $attributes['typeId'] = $this->typeId; | |
| 82 | + $attributes['queryName'] = $this->queryName; | |
| 83 | + $attributes['displayName'] = $this->displayName; | |
| 84 | + $attributes['baseType'] = $this->baseType; | |
| 85 | + $attributes['baseTypeQueryName'] = $this->baseTypeQueryName; | |
| 86 | + $attributes['parentId'] = $this->parentId; | |
| 87 | + $attributes['description'] = $this->description; | |
| 88 | + $attributes['creatable'] = $this->creatable; | |
| 89 | + $attributes['fileable'] = $this->fileable; | |
| 90 | + $attributes['queryable'] = $this->queryable; | |
| 91 | + $attributes['includedInSupertypeQuery'] = $this->includedInSupertypeQuery; | |
| 92 | + $attributes['controllable'] = $this->includedInSupertypeQuery; | |
| 93 | + | |
| 94 | + return $attributes; | |
| 95 | + } | |
| 96 | + | |
| 97 | + public function getAttribute($field) | |
| 98 | + { | |
| 99 | + return $this->{$field}; | |
| 100 | + } | |
| 148 | 101 | |
| 149 | 102 | /** |
| 150 | - * The object's type definition. | |
| 103 | + * Sets properties for this type | |
| 104 | + * Obeys the rules as specified in the property definitions (once implemented) | |
| 151 | 105 | */ |
| 152 | -// function getType(); | |
| 106 | + public function setProperty($field, $value) | |
| 107 | + { | |
| 108 | + $this->properties->setValue($field, $value); | |
| 109 | + } | |
| 153 | 110 | |
| 154 | 111 | /** |
| 155 | - * Gets a property. | |
| 112 | + * Sets properties for this type - internal only function which allows | |
| 113 | + * setting of properties by object on initialisation or re-query | |
| 156 | 114 | * |
| 157 | - * @param name the property name | |
| 158 | - * @return the property | |
| 115 | + * This will bypass the property definition checks for updateability (once implemented) | |
| 159 | 116 | */ |
| 160 | -// function getProperty($name); | |
| 117 | + protected function _setPropertyInternal($field, $value) | |
| 118 | + { | |
| 119 | + $this->properties->setValue($field, $value); | |
| 120 | + } | |
| 161 | 121 | |
| 162 | 122 | /** |
| 163 | - * Gets all the properties. | |
| 164 | - * | |
| 165 | - * @return a map of the properties | |
| 166 | - */ | |
| 167 | -// function getProperties(); | |
| 168 | - | |
| 169 | - /** | |
| 170 | - * Gets a property value. | |
| 171 | - * | |
| 172 | - * @param name the property name | |
| 173 | - * @return the property value | |
| 123 | + * Fetches properties for this object type | |
| 174 | 124 | */ |
| 175 | -// function getValue($name); | |
| 176 | - | |
| 177 | -// /** | |
| 178 | -// * Sets a property value. | |
| 179 | -// * <p> | |
| 180 | -// * Setting a {@code null} value removes the property. | |
| 181 | -// * <p> | |
| 182 | -// * Whether the value is saved immediately or not is repository-specific, see | |
| 183 | -// * {@link #save()}. | |
| 184 | -// * | |
| 185 | -// * @param name the property name | |
| 186 | -// * @param value the property value, or {@code null} | |
| 187 | -// */ | |
| 188 | -// function setValue($name, $value); | |
| 189 | -// | |
| 190 | -// /** | |
| 191 | -// * Sets several property values. | |
| 192 | -// * <p> | |
| 193 | -// * Setting a {@code null} value removes a property. | |
| 194 | -// * <p> | |
| 195 | -// * Whether the values are saved immediately or not is repository-specific, | |
| 196 | -// * see {@link #save()}. | |
| 197 | -// * | |
| 198 | -// * @param values the property values | |
| 199 | -// */ | |
| 200 | -// function setValues($values); | |
| 201 | -// | |
| 202 | -// /** | |
| 203 | -// * Saves the modifications done to the object through {@link #setValue}, | |
| 204 | -// * {@link #setValues} and {@link Document#setContentStream}. | |
| 205 | -// * <p> | |
| 206 | -// * Note that a repository is not required to wait until a {@link #save} is | |
| 207 | -// * called to actually save the modifications, it may do so as soon as | |
| 208 | -// * {@link #setValue} is called. | |
| 209 | -// * <p> | |
| 210 | -// * Calling {#link #save} is needed for objects newly created through | |
| 211 | -// * {@link Connection#newDocument} and similar methods. | |
| 212 | -// */ | |
| 213 | -// function save(); | |
| 214 | -// | |
| 215 | -// /* | |
| 216 | -// * ----- convenience methods ----- | |
| 217 | -// */ | |
| 218 | -// | |
| 219 | -// function getString($name); | |
| 220 | -// | |
| 221 | -// function getStrings($name); | |
| 222 | -// | |
| 223 | -// function getDecimal($name); | |
| 224 | -// | |
| 225 | -// function getDecimals($name); | |
| 226 | -// | |
| 227 | -// function getInteger($name); | |
| 228 | -// | |
| 229 | -// function getIntegers($name); | |
| 230 | -// | |
| 231 | -// function getBoolean($name); | |
| 232 | -// | |
| 233 | -// function getBooleans($name); | |
| 234 | -// | |
| 235 | -// function getDateTime($name); | |
| 236 | -// | |
| 237 | -// function getDateTimes($name); | |
| 238 | -// | |
| 239 | -// function getURI($name); | |
| 240 | -// | |
| 241 | -// function getURIs($name); | |
| 242 | -// | |
| 243 | -// function getId($name); | |
| 244 | -// | |
| 245 | -// function getIds($name); | |
| 246 | -// | |
| 247 | -// function getXML($name); | |
| 248 | -// | |
| 249 | -// function getXMLs($name); | |
| 250 | -// | |
| 251 | -// function getHTML($name); | |
| 252 | -// | |
| 253 | -// function getHTMLs($name); | |
| 254 | -// | |
| 255 | -// /* | |
| 256 | -// * ----- convenience methods for specific properties ----- | |
| 257 | -// */ | |
| 258 | -// | |
| 259 | -// function getId(); | |
| 260 | -// | |
| 261 | -// function getURI(); | |
| 262 | -// | |
| 263 | -// function getTypeId(); | |
| 264 | -// | |
| 265 | -// function getCreatedBy(); | |
| 266 | -// | |
| 267 | -// function getCreationDate(); | |
| 268 | -// | |
| 269 | -// function getLastModifiedBy(); | |
| 270 | -// | |
| 271 | -// function getLastModificationDate(); | |
| 272 | -// | |
| 273 | -// function getChangeToken(); | |
| 274 | -// | |
| 275 | -// function getName(); | |
| 276 | -// | |
| 277 | -// function isImmutable(); | |
| 278 | -// | |
| 279 | -// function isLatestVersion(); | |
| 280 | -// | |
| 281 | -// function isMajorVersion(); | |
| 282 | -// | |
| 283 | -// function isLatestMajorVersion(); | |
| 284 | -// | |
| 285 | -// function getVersionLabel(); | |
| 286 | -// | |
| 287 | -// function getVersionSeriesId(); | |
| 288 | -// | |
| 289 | -// function isVersionSeriesCheckedOut(); | |
| 290 | -// | |
| 291 | -// function getVersionSeriesCheckedOutBy(); | |
| 292 | -// | |
| 293 | -// function getVersionSeriesCheckedOutId(); | |
| 294 | -// | |
| 295 | -// function getCheckinComment(); | |
| 296 | -// | |
| 297 | -// /* | |
| 298 | -// * ----- convenience methods for specific properties (setter) ----- | |
| 299 | -// */ | |
| 300 | -// | |
| 301 | -// function setName($name); | |
| 125 | + public function getProperties() | |
| 126 | + { | |
| 127 | + return $this->properties; | |
| 128 | + } | |
| 129 | + | |
| 130 | + public function getProperty($property) | |
| 131 | + { | |
| 132 | + return $this->properties->getValue($property); | |
| 133 | + } | |
| 134 | + | |
| 135 | + public function reload($documentId) | |
| 136 | + { | |
| 137 | + $this->_get($documentId); | |
| 138 | + } | |
| 139 | + | |
| 140 | + private function _get($documentId) | |
| 141 | + { | |
| 142 | + // override in child classes | |
| 143 | + } | |
| 302 | 144 | |
| 303 | 145 | } |
| 304 | 146 | ... | ... |
lib/api/ktcmis/classes/CMISObject_functions.inc.php
0 โ 100644
| 1 | +<?php | |
| 2 | + | |
| 3 | +// TODO Property Type Definitions (only done Attributes up to now) | |
| 4 | + | |
| 5 | +interface CMISObject { | |
| 6 | + | |
| 7 | + /* | |
| 8 | + * ----- Object Services ----- | |
| 9 | + */ | |
| 10 | + | |
| 11 | + /** | |
| 12 | + * Moves this filed object from one folder to another. | |
| 13 | + * <p> | |
| 14 | + * The target folder is that into which the object has to be moved. When the | |
| 15 | + * object is multi-filed, a source folder to be moved out of must be | |
| 16 | + * specified. | |
| 17 | + * | |
| 18 | + * @param targetFolder the target folder | |
| 19 | + * @param sourceFolder the source folder, or {@code null} | |
| 20 | + */ | |
| 21 | +// function move($targetFolder, $sourceFolder = null); | |
| 22 | + | |
| 23 | + /** | |
| 24 | + * Deletes this object. | |
| 25 | + * <p> | |
| 26 | + * When a filed object is deleted, it is removed from all folders it is | |
| 27 | + * filed in. | |
| 28 | + * <p> | |
| 29 | + * This deletes a specific version of a document object. To delete all | |
| 30 | + * versions, use {@link #deleteAllVersions}. | |
| 31 | + * <p> | |
| 32 | + * Deletion of a private working copy (checked out version) is the same as | |
| 33 | + * to cancel checkout. | |
| 34 | + */ | |
| 35 | +// function delete(); | |
| 36 | + | |
| 37 | + /** | |
| 38 | + * Unfiles this non-folder object. | |
| 39 | + * <p> | |
| 40 | + * This removes this object from all folders it is filed in, but never | |
| 41 | + * deletes the object, which means that if unfiling is not supported, an | |
| 42 | + * exception will be thrown. | |
| 43 | + * <p> | |
| 44 | + * If this object is a folder then an exception will be thrown. | |
| 45 | + * | |
| 46 | + * @see #delete | |
| 47 | + * @see Folder#remove | |
| 48 | + */ | |
| 49 | +// function unfile(); | |
| 50 | + | |
| 51 | + /* | |
| 52 | + * ----- Navigation Services ----- | |
| 53 | + */ | |
| 54 | + | |
| 55 | + /** | |
| 56 | + * Gets the parent folder, or the single folder in which the object is | |
| 57 | + * filed. | |
| 58 | + * <p> | |
| 59 | + * For a folder, returns the parent folder, or {@code null} if there is no | |
| 60 | + * parent (for the root folder). | |
| 61 | + * <p> | |
| 62 | + * For a non-folder, if the object is single-filed then the folder in which | |
| 63 | + * it is filed is returned, otherwise if the folder is unfiled then {@code | |
| 64 | + * null} is returned. An exception is raised if the object is multi-filed, | |
| 65 | + * so in doubt use {@link #getParents}. | |
| 66 | + * | |
| 67 | + * @return the parent folder, or {@code null}. | |
| 68 | + * | |
| 69 | + * @see #getParents | |
| 70 | + * @see Folder#getAncestors | |
| 71 | + */ | |
| 72 | +// function getParent(); | |
| 73 | + | |
| 74 | +// /** | |
| 75 | +// * Gets the direct parents of this object. | |
| 76 | +// * <p> | |
| 77 | +// * The object must be a non-folder, fileable object. | |
| 78 | +// * | |
| 79 | +// * @return the collection of parent folders | |
| 80 | +// * | |
| 81 | +// * @see #getParent | |
| 82 | +// * @see Folder#getAncestors | |
| 83 | +// */ | |
| 84 | +// function getParents(); | |
| 85 | +// | |
| 86 | +// /* | |
| 87 | +// * ----- Relationship Services ----- | |
| 88 | +// */ | |
| 89 | +// | |
| 90 | +// /** | |
| 91 | +// * Gets the relationships having as source or target this object. | |
| 92 | +// * <p> | |
| 93 | +// * Returns a list of relationships associated with this object, optionally | |
| 94 | +// * of a specified relationship type, and optionally in a specified | |
| 95 | +// * direction. | |
| 96 | +// * <p> | |
| 97 | +// * If typeId is {@code null}, returns relationships of any type. | |
| 98 | +// * <p> | |
| 99 | +// * Ordering is repository specific but consistent across requests. | |
| 100 | +// * | |
| 101 | +// * @param direction the direction of relationships to include | |
| 102 | +// * @param typeId the type ID, or {@code null} | |
| 103 | +// * @param includeSubRelationshipTypes {@code true} if relationships of any | |
| 104 | +// * sub-type of typeId are to be returned as well | |
| 105 | +// * @return the list of relationships | |
| 106 | +// */ | |
| 107 | +// function getRelationships($direction, $typeId, $includeSubRelationshipTypes); | |
| 108 | +// | |
| 109 | +// /* | |
| 110 | +// * ----- Policy Services ----- | |
| 111 | +// */ | |
| 112 | +// | |
| 113 | +// /** | |
| 114 | +// * Applies a policy to this object. | |
| 115 | +// * <p> | |
| 116 | +// * The object must be controllable. | |
| 117 | +// * | |
| 118 | +// * @param policy the policy | |
| 119 | +// */ | |
| 120 | +// function applyPolicy(Policy policy); | |
| 121 | +// | |
| 122 | +// /** | |
| 123 | +// * Removes a policy from this object. | |
| 124 | +// * <p> | |
| 125 | +// * Removes a previously applied policy from the object. The policy is not | |
| 126 | +// * deleted, and may still be applied to other objects. | |
| 127 | +// * <p> | |
| 128 | +// * The object must be controllable. | |
| 129 | +// * | |
| 130 | +// * @param policy the policy | |
| 131 | +// */ | |
| 132 | +// function removePolicy(Policy policy); | |
| 133 | +// | |
| 134 | +// /** | |
| 135 | +// * Gets the policies applied to this object. | |
| 136 | +// * <p> | |
| 137 | +// * Returns the list of policy objects currently applied to the object. Only | |
| 138 | +// * policies that are directly (explicitly) applied to the object are | |
| 139 | +// * returned. | |
| 140 | +// * <p> | |
| 141 | +// * The object must be controllable. | |
| 142 | +// */ | |
| 143 | +// function getPolicies(); | |
| 144 | +// | |
| 145 | + /* | |
| 146 | + * ----- data access ----- | |
| 147 | + */ | |
| 148 | + | |
| 149 | + /** | |
| 150 | + * The object's type definition. | |
| 151 | + */ | |
| 152 | +// function getType(); | |
| 153 | + | |
| 154 | + /** | |
| 155 | + * Gets a property. | |
| 156 | + * | |
| 157 | + * @param name the property name | |
| 158 | + * @return the property | |
| 159 | + */ | |
| 160 | +// function getProperty($name); | |
| 161 | + | |
| 162 | + /** | |
| 163 | + * Gets all the properties. | |
| 164 | + * | |
| 165 | + * @return a map of the properties | |
| 166 | + */ | |
| 167 | +// function getProperties(); | |
| 168 | + | |
| 169 | + /** | |
| 170 | + * Gets a property value. | |
| 171 | + * | |
| 172 | + * @param name the property name | |
| 173 | + * @return the property value | |
| 174 | + */ | |
| 175 | +// function getValue($name); | |
| 176 | + | |
| 177 | +// /** | |
| 178 | +// * Sets a property value. | |
| 179 | +// * <p> | |
| 180 | +// * Setting a {@code null} value removes the property. | |
| 181 | +// * <p> | |
| 182 | +// * Whether the value is saved immediately or not is repository-specific, see | |
| 183 | +// * {@link #save()}. | |
| 184 | +// * | |
| 185 | +// * @param name the property name | |
| 186 | +// * @param value the property value, or {@code null} | |
| 187 | +// */ | |
| 188 | +// function setValue($name, $value); | |
| 189 | +// | |
| 190 | +// /** | |
| 191 | +// * Sets several property values. | |
| 192 | +// * <p> | |
| 193 | +// * Setting a {@code null} value removes a property. | |
| 194 | +// * <p> | |
| 195 | +// * Whether the values are saved immediately or not is repository-specific, | |
| 196 | +// * see {@link #save()}. | |
| 197 | +// * | |
| 198 | +// * @param values the property values | |
| 199 | +// */ | |
| 200 | +// function setValues($values); | |
| 201 | +// | |
| 202 | +// /** | |
| 203 | +// * Saves the modifications done to the object through {@link #setValue}, | |
| 204 | +// * {@link #setValues} and {@link Document#setContentStream}. | |
| 205 | +// * <p> | |
| 206 | +// * Note that a repository is not required to wait until a {@link #save} is | |
| 207 | +// * called to actually save the modifications, it may do so as soon as | |
| 208 | +// * {@link #setValue} is called. | |
| 209 | +// * <p> | |
| 210 | +// * Calling {#link #save} is needed for objects newly created through | |
| 211 | +// * {@link Connection#newDocument} and similar methods. | |
| 212 | +// */ | |
| 213 | +// function save(); | |
| 214 | +// | |
| 215 | +// /* | |
| 216 | +// * ----- convenience methods ----- | |
| 217 | +// */ | |
| 218 | +// | |
| 219 | +// function getString($name); | |
| 220 | +// | |
| 221 | +// function getStrings($name); | |
| 222 | +// | |
| 223 | +// function getDecimal($name); | |
| 224 | +// | |
| 225 | +// function getDecimals($name); | |
| 226 | +// | |
| 227 | +// function getInteger($name); | |
| 228 | +// | |
| 229 | +// function getIntegers($name); | |
| 230 | +// | |
| 231 | +// function getBoolean($name); | |
| 232 | +// | |
| 233 | +// function getBooleans($name); | |
| 234 | +// | |
| 235 | +// function getDateTime($name); | |
| 236 | +// | |
| 237 | +// function getDateTimes($name); | |
| 238 | +// | |
| 239 | +// function getURI($name); | |
| 240 | +// | |
| 241 | +// function getURIs($name); | |
| 242 | +// | |
| 243 | +// function getId($name); | |
| 244 | +// | |
| 245 | +// function getIds($name); | |
| 246 | +// | |
| 247 | +// function getXML($name); | |
| 248 | +// | |
| 249 | +// function getXMLs($name); | |
| 250 | +// | |
| 251 | +// function getHTML($name); | |
| 252 | +// | |
| 253 | +// function getHTMLs($name); | |
| 254 | +// | |
| 255 | +// /* | |
| 256 | +// * ----- convenience methods for specific properties ----- | |
| 257 | +// */ | |
| 258 | +// | |
| 259 | +// function getId(); | |
| 260 | +// | |
| 261 | +// function getURI(); | |
| 262 | +// | |
| 263 | +// function getTypeId(); | |
| 264 | +// | |
| 265 | +// function getCreatedBy(); | |
| 266 | +// | |
| 267 | +// function getCreationDate(); | |
| 268 | +// | |
| 269 | +// function getLastModifiedBy(); | |
| 270 | +// | |
| 271 | +// function getLastModificationDate(); | |
| 272 | +// | |
| 273 | +// function getChangeToken(); | |
| 274 | +// | |
| 275 | +// function getName(); | |
| 276 | +// | |
| 277 | +// function isImmutable(); | |
| 278 | +// | |
| 279 | +// function isLatestVersion(); | |
| 280 | +// | |
| 281 | +// function isMajorVersion(); | |
| 282 | +// | |
| 283 | +// function isLatestMajorVersion(); | |
| 284 | +// | |
| 285 | +// function getVersionLabel(); | |
| 286 | +// | |
| 287 | +// function getVersionSeriesId(); | |
| 288 | +// | |
| 289 | +// function isVersionSeriesCheckedOut(); | |
| 290 | +// | |
| 291 | +// function getVersionSeriesCheckedOutBy(); | |
| 292 | +// | |
| 293 | +// function getVersionSeriesCheckedOutId(); | |
| 294 | +// | |
| 295 | +// function getCheckinComment(); | |
| 296 | +// | |
| 297 | +// /* | |
| 298 | +// * ----- convenience methods for specific properties (setter) ----- | |
| 299 | +// */ | |
| 300 | +// | |
| 301 | +// function setName($name); | |
| 302 | + | |
| 303 | +} | |
| 304 | + | |
| 305 | +?> | ... | ... |
lib/api/ktcmis/ktcmis.inc.php
| ... | ... | @@ -439,26 +439,36 @@ class KTNavigationService extends KTCMISBase { |
| 439 | 439 | * @param string $repositoryId |
| 440 | 440 | * @param string $folderId The folder for which checked out docs are requested |
| 441 | 441 | * @param string $filter |
| 442 | + * @param boolean $includeAllowableActions | |
| 443 | + * @param boolean $includeRelationships | |
| 442 | 444 | * @param int $maxItems |
| 443 | 445 | * @param int $skipCount |
| 444 | 446 | * @return array $checkedout The collection of checked out documents |
| 445 | 447 | */ |
| 446 | - function getCheckedoutDocs($repositoryId, $folderId = null, $filter = '', $maxItems = 0, $skipCount = 0) | |
| 448 | + function getCheckedOutDocs($repositoryId, $includeAllowableActions, $includeRelationships, $folderId = null, $filter = '', | |
| 449 | + $maxItems = 0, $skipCount = 0) | |
| 447 | 450 | { |
| 448 | - $checkedout = $this->NavigationService->getObjectParents($repositoryId, $objectId, $includeAllowableActions, | |
| 449 | - $includeRelationships); | |
| 451 | + $checkedout = $this->NavigationService->getCheckedOutDocs($repositoryId, $includeAllowableActions, $includeRelationships, | |
| 452 | + $folderId, $filter, $maxItems, $skipCount); | |
| 450 | 453 | |
| 451 | - if (PEAR::isError($ancestryResult)) | |
| 454 | + if (PEAR::isError($checkedout)) | |
| 452 | 455 | { |
| 453 | 456 | return array( |
| 454 | 457 | "status_code" => 1, |
| 455 | 458 | "message" => "Failed getting list of checked out documents" |
| 456 | 459 | ); |
| 457 | 460 | } |
| 461 | + | |
| 462 | + // convert to array format for external code | |
| 463 | + $co = array(); | |
| 464 | + foreach ($checkedout as $document) | |
| 465 | + { | |
| 466 | + $co[] = $document->getProperty('ObjectId'); | |
| 467 | + } | |
| 458 | 468 | |
| 459 | 469 | return array( |
| 460 | 470 | "status_code" => 0, |
| 461 | - "results" => $checkedout | |
| 471 | + "results" => $co | |
| 462 | 472 | ); |
| 463 | 473 | } |
| 464 | 474 | |
| ... | ... | @@ -792,6 +802,65 @@ class KTVersioningService extends KTCMISBase { |
| 792 | 802 | 'results' => $result |
| 793 | 803 | ); |
| 794 | 804 | } |
| 805 | + | |
| 806 | + /** | |
| 807 | + * Checks out a document and creates the PWC (Private Working Copy) which will represent the checked out document | |
| 808 | + * | |
| 809 | + * @param string $repositoryId | |
| 810 | + * @param string $documentId | |
| 811 | + * @param string $changeToken [optional] | |
| 812 | + * @return array results | |
| 813 | + */ | |
| 814 | + // TODO set up delivery of content stream? or is that up to the CMIS client? | |
| 815 | + public function checkOut($repositoryId, $documentId, $changeToken = '') | |
| 816 | + { | |
| 817 | + try { | |
| 818 | + $result = $this->VersioningService->checkOut($repositoryId, $documentId, $changeToken); | |
| 819 | + } | |
| 820 | + catch (Exception $e) | |
| 821 | + { | |
| 822 | + return array( | |
| 823 | + "status_code" => 1, | |
| 824 | + "message" => $e->getMessage() | |
| 825 | + ); | |
| 826 | + } | |
| 827 | + | |
| 828 | + return array( | |
| 829 | + 'status_code' => 0, | |
| 830 | + 'results' => (!empty($result) ? $result : 'Document Checked Out') | |
| 831 | + ); | |
| 832 | + } | |
| 833 | + | |
| 834 | + /** | |
| 835 | + * Reverses the effect of a checkout: I.E. deletes the PWC (Private Working Copy) and re-sets the status of the document to "not checked out" | |
| 836 | + * | |
| 837 | + * @param string $repositoryId | |
| 838 | + * @param string $documentId | |
| 839 | + * @param string $changeToken [optional] | |
| 840 | + */ | |
| 841 | + // TODO exceptions: | |
| 842 | + // โข ConstraintViolationException: The Repository SHALL throw this exception if ANY of the following conditions are met: | |
| 843 | + // o The Documentโs Object-Type definitionโs versionable attribute is FALSE. | |
| 844 | + // โข updateConflictException | |
| 845 | + // โข versioningException | |
| 846 | + public function cancelCheckOut($repositoryId, $documentId, $changeToken = '') | |
| 847 | + { | |
| 848 | + try { | |
| 849 | + $result = $this->VersioningService->cancelCheckOut($repositoryId, $documentId, $changeToken); | |
| 850 | + } | |
| 851 | + catch (Exception $e) | |
| 852 | + { | |
| 853 | + return array( | |
| 854 | + "status_code" => 1, | |
| 855 | + "message" => $e->getMessage() | |
| 856 | + ); | |
| 857 | + } | |
| 858 | + | |
| 859 | + return array( | |
| 860 | + 'status_code' => 0, | |
| 861 | + 'results' => (!empty($result) ? $result : 'Document Checkout Cancelled') | |
| 862 | + ); | |
| 863 | + } | |
| 795 | 864 | |
| 796 | 865 | } |
| 797 | 866 | ... | ... |
lib/api/ktcmis/objecttypes/CMISDocumentObject.inc.php
| ... | ... | @@ -40,13 +40,13 @@ |
| 40 | 40 | * @version Version 0.1 |
| 41 | 41 | */ |
| 42 | 42 | |
| 43 | -require_once(CMIS_DIR . '/classes/CMISBaseObject.inc.php'); | |
| 43 | +require_once(CMIS_DIR . '/classes/CMISObject.inc.php'); | |
| 44 | 44 | require_once(CMIS_DIR . '/classes/CMISDocumentPropertyCollection.inc.php'); |
| 45 | 45 | require_once(CMIS_DIR . '/util/CMISUtil.inc.php'); |
| 46 | 46 | |
| 47 | 47 | // TODO Property Type Definitions (only done Attributes up to now) |
| 48 | 48 | |
| 49 | -class CMISDocumentObject extends CMISBaseObject { | |
| 49 | +class CMISDocumentObject extends CMISObject { | |
| 50 | 50 | |
| 51 | 51 | protected $versionable; |
| 52 | 52 | private $ktapi; |
| ... | ... | @@ -93,19 +93,24 @@ class CMISDocumentObject extends CMISBaseObject { |
| 93 | 93 | |
| 94 | 94 | if (!is_null($documentId)) |
| 95 | 95 | { |
| 96 | - $this->_get($documentId); | |
| 96 | + try { | |
| 97 | + $this->get($documentId); | |
| 98 | + } | |
| 99 | + catch (exception $e) { | |
| 100 | + throw new ObjectNotFoundException($e->getMessage()); | |
| 101 | + } | |
| 97 | 102 | } |
| 103 | + | |
| 104 | + // TODO throw exception if unable to create? | |
| 98 | 105 | } |
| 99 | 106 | |
| 100 | - private function _get($documentId) | |
| 107 | + private function get($documentId) | |
| 101 | 108 | { |
| 102 | 109 | $object = $this->ktapi->get_document_by_id((int)$documentId); |
| 103 | 110 | |
| 104 | - // error? | |
| 105 | - if (PEAR::isError($object)) | |
| 106 | - { | |
| 107 | - // throw an exception? | |
| 108 | - return $object; | |
| 111 | + // document does not exist? | |
| 112 | + if (PEAR::isError($object)) { | |
| 113 | + throw new ObjectNotFoundException('The document you are trying to access does not exist or is inaccessible'); | |
| 109 | 114 | } |
| 110 | 115 | |
| 111 | 116 | $objectProperties = $object->get_detail(); | ... | ... |
lib/api/ktcmis/objecttypes/CMISFolderObject.inc.php
| ... | ... | @@ -40,11 +40,11 @@ |
| 40 | 40 | * @version Version 0.1 |
| 41 | 41 | */ |
| 42 | 42 | |
| 43 | -require_once(CMIS_DIR . '/classes/CMISBaseObject.inc.php'); | |
| 43 | +require_once(CMIS_DIR . '/classes/CMISObject.inc.php'); | |
| 44 | 44 | require_once(CMIS_DIR . '/classes/CMISFolderPropertyCollection.inc.php'); |
| 45 | 45 | require_once(CMIS_DIR . '/util/CMISUtil.inc.php'); |
| 46 | 46 | |
| 47 | -class CMISFolderObject extends CMISBaseObject { | |
| 47 | +class CMISFolderObject extends CMISObject { | |
| 48 | 48 | |
| 49 | 49 | private $ktapi; |
| 50 | 50 | private $uri; |
| ... | ... | @@ -72,11 +72,11 @@ class CMISFolderObject extends CMISBaseObject { |
| 72 | 72 | |
| 73 | 73 | if (!is_null($folderId)) |
| 74 | 74 | { |
| 75 | - $this->_get($folderId); | |
| 75 | + $this->get($folderId); | |
| 76 | 76 | } |
| 77 | 77 | } |
| 78 | 78 | |
| 79 | - private function _get($folderId) | |
| 79 | + private function get($folderId) | |
| 80 | 80 | { |
| 81 | 81 | $object = $this->ktapi->get_folder_by_id((int)$folderId); |
| 82 | 82 | ... | ... |
lib/api/ktcmis/services/CMISNavigationService.inc.php
| ... | ... | @@ -249,18 +249,29 @@ class CMISNavigationService { |
| 249 | 249 | * @param string $repositoryId |
| 250 | 250 | * @param string $folderId The folder for which checked out docs are requested |
| 251 | 251 | * @param string $filter |
| 252 | + * @param boolean $includeAllowableActions | |
| 253 | + * @param boolean $includeRelationships | |
| 252 | 254 | * @param int $maxItems |
| 253 | 255 | * @param int $skipCount |
| 254 | - * @return array $checkedout The collection of checked out documents | |
| 256 | + * @return array $checkedout The collection of checked out document objects | |
| 255 | 257 | */ |
| 256 | 258 | // NOTE NOT YET IMPLEMENTED (this function is just a place holder at the moment :)) |
| 257 | - function getCheckedoutDocs($repositoryId, $folderId = null, $filter = '', $maxItems = 0, $skipCount = 0) | |
| 259 | + // TODO exceptions: โข FilterNotValidException: The Repository SHALL throw this exception if this property filter input parameter is not valid. | |
| 260 | + // TODO filter by folder id | |
| 261 | + // TODO $filter and paging | |
| 262 | + function getCheckedOutDocs($repositoryId, $folderId = null, $filter = '', $includeAllowableActions, $includeRelationships, | |
| 263 | + $maxItems = 0, $skipCount = 0) | |
| 258 | 264 | { |
| 259 | 265 | $checkedout = array(); |
| 260 | 266 | |
| 261 | - | |
| 267 | + $results = $this->ktapi->get_checkedout_docs(false); | |
| 268 | + foreach($results as $document) | |
| 269 | + { | |
| 270 | + $CMISDocument = new CMISDocumentObject($document->getId(), $this->ktapi); | |
| 271 | + $checkedout[] = $CMISDocument; | |
| 272 | + } | |
| 262 | 273 | |
| 263 | - return $checkedout(); | |
| 274 | + return $checkedout; | |
| 264 | 275 | } |
| 265 | 276 | |
| 266 | 277 | } | ... | ... |
lib/api/ktcmis/services/CMISVersioningService.inc.php
| 1 | 1 | <?php |
| 2 | 2 | |
| 3 | 3 | require_once(KT_DIR . '/ktapi/ktapi.inc.php'); |
| 4 | -//require_once(CMIS_DIR . '/exceptions/ConstraintViolationException.inc.php'); | |
| 5 | -//require_once(CMIS_DIR . '/exceptions/ContentAlreadyExistsException.inc.php'); | |
| 6 | -//require_once(CMIS_DIR . '/exceptions/ObjectNotFoundException.inc.php'); | |
| 7 | -//require_once(CMIS_DIR . '/exceptions/StorageException.inc.php'); | |
| 8 | -//require_once(CMIS_DIR . '/exceptions/StreamNotSupportedException.inc.php'); | |
| 9 | -//require_once(CMIS_DIR . '/exceptions/UpdateConflictException.inc.php'); | |
| 10 | -//require_once(CMIS_DIR . '/exceptions/VersioningException.inc.php'); | |
| 11 | -//require_once(CMIS_DIR . '/services/CMISRepositoryService.inc.php'); | |
| 12 | -//require_once(CMIS_DIR . '/objecttypes/CMISDocumentObject.inc.php'); | |
| 13 | -//require_once(CMIS_DIR . '/objecttypes/CMISFolderObject.inc.php'); | |
| 14 | -//require_once(CMIS_DIR . '/classes/CMISRepository.inc.php'); | |
| 4 | +require_once(CMIS_DIR . '/exceptions/ConstraintViolationException.inc.php'); | |
| 5 | +require_once(CMIS_DIR . '/exceptions/StorageException.inc.php'); | |
| 6 | +require_once(CMIS_DIR . '/exceptions/UpdateConflictException.inc.php'); | |
| 7 | +require_once(CMIS_DIR . '/exceptions/VersioningException.inc.php'); | |
| 8 | +require_once(CMIS_DIR . '/services/CMISObjectService.inc.php'); | |
| 9 | +require_once(CMIS_DIR . '/objecttypes/CMISDocumentObject.inc.php'); | |
| 15 | 10 | //require_once(CMIS_DIR . '/util/CMISUtil.inc.php'); |
| 16 | 11 | |
| 17 | 12 | class CMISVersioningService { |
| ... | ... | @@ -29,7 +24,7 @@ class CMISVersioningService { |
| 29 | 24 | } |
| 30 | 25 | |
| 31 | 26 | /** |
| 32 | - * Deletes all Document Objects in the specified Version Series, including the Private Working Copy | |
| 27 | + * Deletes all Document Objects in the specified Version Series, including the Private Working Copy if it exists | |
| 33 | 28 | * |
| 34 | 29 | * @param string $repositoryId |
| 35 | 30 | * @param string $versionSeriesId |
| ... | ... | @@ -60,6 +55,8 @@ class CMISVersioningService { |
| 60 | 55 | // TODO add the electronic signature capability |
| 61 | 56 | $auth_sig = true; |
| 62 | 57 | $result = $this->ktapi->delete_document($objectId, $reason, $auth_sig, $sig_username, $sig_password); |
| 58 | + | |
| 59 | + // TODO delete any PWC which may exist (NOTE added 24 August 2009 - we did not have any PWC functionality when this function was originally created) | |
| 63 | 60 | |
| 64 | 61 | // if there was an error performing the delete, throw exception |
| 65 | 62 | if ($result['status_code'] == 1) { |
| ... | ... | @@ -68,7 +65,110 @@ class CMISVersioningService { |
| 68 | 65 | |
| 69 | 66 | return true; |
| 70 | 67 | } |
| 68 | + | |
| 69 | + /** | |
| 70 | + * Checks out a document and creates the PWC (Private Working Copy) which will represent the checked out document | |
| 71 | + * | |
| 72 | + * @param string $repositoryId | |
| 73 | + * @param string $documentId | |
| 74 | + * @param string $changeToken [optional] | |
| 75 | + * @return string $documentId The id of the PWC object | |
| 76 | + * @return boolean $contentCopied TRUE if contentStream is a copy of the document content stream, FALSE if contentStream not set | |
| 77 | + */ | |
| 78 | + // TODO exceptions: | |
| 79 | + // โข versioningException: The repository MAY throw this exception if the object is a non-current Document Version. | |
| 80 | + // NOTE since we need to return two values, we return one via argument by reference | |
| 81 | + // since $documentId already exists in the argument list, that was chosen as the "return by reference" value | |
| 82 | + // TODO set up delivery of content stream? or is that up to the CMIS client? | |
| 83 | + public function checkOut($repositoryId, &$documentId, $changeToken = '') | |
| 84 | + { | |
| 85 | + $contentCopied = false; | |
| 86 | + | |
| 87 | + $documentId = CMISUtil::decodeObjectId($documentId, $typeId); | |
| 71 | 88 | |
| 89 | + // NOTE We are not planning on persisting the PWC beyond the current session, it will be re-created on access of the checked out document | |
| 90 | + // TODO consider persisting in the database? How will this relate to JSR if we are switching to that? | |
| 91 | + // NOTE within the current system it is assumed if a new document metadata version is created that this is the latest version of the document | |
| 92 | + // TODO see if there is an easy way to modify this, else we may not have an easy way to persist PWC objects | |
| 93 | + | |
| 94 | + // throw updateConflictException if the operation is attempting to update an object that is no longer current (as determined by the repository). | |
| 95 | + try { | |
| 96 | + $pwc = new CMISDocumentObject($documentId, $this->ktapi); | |
| 97 | + } | |
| 98 | + catch (exception $e) { | |
| 99 | + throw new UpdateConflictException($e->getMessage()); | |
| 100 | + } | |
| 101 | + | |
| 102 | + // throw exception if the object is not versionable | |
| 103 | + if (!$pwc->getAttribute('versionable')) { | |
| 104 | + throw new ConstraintViolationException('This document is not versionable and may not be checked out'); | |
| 105 | + } | |
| 106 | + | |
| 107 | + // NOTE KTAPI as currently implemented does not give a direct response which indicates if the document is already checked out, | |
| 108 | + // as long as the same use is calling the checkout again, so should we add a check here specifically? | |
| 109 | + | |
| 110 | + // run checkout process - set $download = false (third function argument) as we want to return the document content via the contentStream | |
| 111 | + $response = $this->ktapi->checkout_document($documentId, 'CMIS Checkout Action', false, $sig_username, $sig_password); | |
| 112 | + // if there was an error, throw an exception | |
| 113 | + if ($response['status_code'] == 1) { | |
| 114 | + throw new StorageException($response['message']); | |
| 115 | + }; | |
| 116 | + | |
| 117 | + // if successful, set $contentCopied = true; unless contentStream is not set | |
| 118 | + if ($pwc->getProperty('ContentStreamFilename') != '') $contentCopied = true; | |
| 119 | + $documentId = CMISUtil::encodeObjectId('Document', $documentId); | |
| 120 | + | |
| 121 | + // mark document object as checked out | |
| 122 | + $pwc->setProperty('IsVersionSeriesCheckedOut', true); | |
| 123 | + $userName = ''; | |
| 124 | + $user = $this->ktapi->get_user(); | |
| 125 | + if (!PEAR::isError($user)) { | |
| 126 | + $userName = $user->getName(); | |
| 127 | + } | |
| 128 | + $pwc->setProperty('VersionSeriesCheckedOutBy', $userName); | |
| 129 | + $pwc->setProperty('VersionSeriesCheckedOutId', $documentId); | |
| 130 | + | |
| 131 | + return $contentCopied; | |
| 132 | + } | |
| 133 | + | |
| 134 | + /** | |
| 135 | + * Reverses the effect of a checkout: I.E. deletes the PWC (Private Working Copy) and re-sets the status of the document to "not checked out" | |
| 136 | + * | |
| 137 | + * @param string $repositoryId | |
| 138 | + * @param string $documentId | |
| 139 | + * @param string $changeToken [optional] | |
| 140 | + */ | |
| 141 | + // TODO exceptions: | |
| 142 | + // โข versioningException - The repository MAY throw this exception if the object is a non-current Document Version. | |
| 143 | + public function cancelCheckOut($repositoryId, $documentId, $changeToken = '') | |
| 144 | + { | |
| 145 | + $documentId = CMISUtil::decodeObjectId($documentId, $typeId); | |
| 146 | + | |
| 147 | + /* re-generate PWC object */ | |
| 148 | + // throw updateConflictException if the operation is attempting to update an object that is no longer current (as determined by the repository). | |
| 149 | + try { | |
| 150 | + $pwc = new CMISDocumentObject($documentId, $this->ktapi); | |
| 151 | + } | |
| 152 | + catch (exception $e) { | |
| 153 | + throw new UpdateConflictException($e->getMessage()); | |
| 154 | + } | |
| 155 | + | |
| 156 | + // throw exception if the object is not versionable | |
| 157 | + if (!$pwc->getAttribute('versionable')) { | |
| 158 | + throw new ConstraintViolationException('This document is not versionable and may not be checked out'); | |
| 159 | + } | |
| 160 | + | |
| 161 | + // TODO delete PWC - since we are not persisting the PWC this is not necessary at the moment | |
| 162 | + | |
| 163 | + // cancel checkout | |
| 164 | + $response = $this->ktapi->undo_document_checkout($documentId, 'CMIS Cancel Checkout Action', $sig_username, $sig_password); | |
| 165 | + | |
| 166 | + // if there was any error in cancelling the checkout | |
| 167 | + if ($response['status_code'] == 1) { | |
| 168 | + throw new RuntimeException('There was an error cancelling the checkout: ' . $response['message']); | |
| 169 | + } | |
| 170 | + } | |
| 171 | + | |
| 72 | 172 | } |
| 73 | 173 | |
| 74 | 174 | ?> | ... | ... |
tests/ktcmis/testCmisApi.php
| ... | ... | @@ -183,11 +183,10 @@ class CMISTestCase extends KTUnitTestCase { |
| 183 | 183 | function testNavigationService() |
| 184 | 184 | { |
| 185 | 185 | $NavigationService = new KTNavigationService($this->ktapi); |
| 186 | -// $NavigationService->startSession(KT_TEST_USER, KT_TEST_PASS); | |
| 187 | 186 | |
| 188 | 187 | // set up the folder/doc tree structure with which we will be testing |
| 189 | 188 | $this->createFolderDocStructure(); |
| 190 | - | |
| 189 | + | |
| 191 | 190 | $RepositoryService = new KTRepositoryService(); |
| 192 | 191 | $response = $RepositoryService->getRepositories(); |
| 193 | 192 | |
| ... | ... | @@ -469,7 +468,7 @@ class CMISTestCase extends KTUnitTestCase { |
| 469 | 468 | function testVersioningService() |
| 470 | 469 | { |
| 471 | 470 | $VersioningService = new KTVersioningService($this->ktapi); |
| 472 | -// $ObjectService->startSession(KT_TEST_USER, KT_TEST_PASS); | |
| 471 | + $NavigationService = new KTNavigationService($this->ktapi); | |
| 473 | 472 | |
| 474 | 473 | // set up the folder/doc tree structure with which we will be testing |
| 475 | 474 | $this->createFolderDocStructure(); |
| ... | ... | @@ -484,15 +483,51 @@ class CMISTestCase extends KTUnitTestCase { |
| 484 | 483 | $repository = $response['results'][0]; |
| 485 | 484 | $repositoryId = $repository['repositoryId']; |
| 486 | 485 | |
| 487 | - // TEST 1 | |
| 488 | 486 | // test deletion of document via deleteAllVersions |
| 489 | 487 | $versionSeriesId = 'D'.$this->docs[0]->get_documentid(); |
| 490 | - $result = $VersioningService->deleteAllVersions($repositoryId, $versionSeriesId); | |
| 488 | + $response = $VersioningService->deleteAllVersions($repositoryId, $versionSeriesId); | |
| 491 | 489 | |
| 492 | 490 | $this->assertEqual($response['status_code'], 0); |
| 493 | - $this->assertNotNull($response['results'][0]); | |
| 491 | + $this->assertNotNull($response['results']); | |
| 492 | + | |
| 493 | + // TODO test checkout of document | |
| 494 | + $documentId = CMISUtil::encodeObjectId('Document', '6'); | |
| 495 | + $response = $VersioningService->checkOut($repositoryId, $documentId); | |
| 496 | + $this->assertEqual($response['status_code'], 0); | |
| 497 | + $this->assertNotNull($response['results']); | |
| 498 | + | |
| 499 | + // try again, this time it should fail - not working at the moment as ktapi registers the same user for download | |
| 500 | + // even if already checked out, so no error is generated unless a different user attempts to do a checkout | |
| 501 | + /* | |
| 502 | + $response = $VersioningService->checkOut($repositoryId, $documentId); | |
| 503 | + $this->assertEqual($response['status_code'], 1); | |
| 504 | + $this->assertNotNull($response['message']); | |
| 505 | + */ | |
| 506 | + | |
| 507 | + // TODO test cancel checkout | |
| 508 | + $response = $VersioningService->cancelCheckOut($repositoryId, $documentId); | |
| 509 | + $this->assertEqual($response['status_code'], 0); | |
| 510 | + $this->assertNotNull($response['results']); | |
| 511 | + | |
| 512 | + // TODO test cancel checkout of document no longer checked out | |
| 513 | + $response = $VersioningService->cancelCheckOut($repositoryId, $documentId); | |
| 514 | + $this->assertEqual($response['status_code'], 1); | |
| 515 | + $this->assertNotNull($response['message']); | |
| 516 | + | |
| 517 | + // TODO test listing of checked out documents | |
| 518 | + // first check out the document again :) | |
| 519 | + $response = $VersioningService->checkOut($repositoryId, $documentId); | |
| 520 | + // now check that it appears in the listing | |
| 521 | + $response = $NavigationService->getCheckedOutDocs($repositoryId, false, false); | |
| 522 | + $this->assertEqual($response['status_code'], 0); | |
| 523 | + $this->assertNotNull($response['results']); | |
| 524 | + $this->assertTrue(in_array($documentId, $response['results'])); | |
| 525 | + // now let's cancel the checkout so that we can delete later during cleanup :) | |
| 526 | + $response = $VersioningService->cancelCheckOut($repositoryId, $documentId); | |
| 527 | + | |
| 528 | + // TODO test checkin | |
| 494 | 529 | |
| 495 | - // TODO add testing of failure conditions - e.g. checked out/immutable document | |
| 530 | + // TODO add testing of failure conditions - e.g. checked out/immutable document (for all appropriate functions) | |
| 496 | 531 | |
| 497 | 532 | // tear down the folder/doc tree structure with which we were testing |
| 498 | 533 | $this->cleanupFolderDocStructure(); |
| ... | ... | @@ -526,7 +561,8 @@ class CMISTestCase extends KTUnitTestCase { |
| 526 | 561 | function deleteDocument($document) |
| 527 | 562 | { |
| 528 | 563 | $document->delete('Testing API'); |
| 529 | - $document->expunge(); | |
| 564 | + // expunge appears to be causing problems at the moment | |
| 565 | + // $document->expunge(); | |
| 530 | 566 | } |
| 531 | 567 | |
| 532 | 568 | function createRandomFile($content = 'this is some text', $uploadDir = null) |
| ... | ... | @@ -610,8 +646,10 @@ class CMISTestCase extends KTUnitTestCase { |
| 610 | 646 | // clean up root level docs |
| 611 | 647 | foreach($this->docs as $doc) |
| 612 | 648 | { |
| 649 | + if (++$coujnt > 10) exit; | |
| 613 | 650 | $doc->delete('Testing'); |
| 614 | - $doc->expunge(); | |
| 651 | + // expunge appears to be breaking tests, times out | |
| 652 | + // $doc->expunge(); | |
| 615 | 653 | } |
| 616 | 654 | |
| 617 | 655 | // Clean up root level folders (sub-folders and contained docs should be removed automatically) | ... | ... |