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,7 +484,7 @@ class KTAPI_Document extends KTAPI_FolderItem | ||
| 484 | { | 484 | { |
| 485 | return $user; | 485 | return $user; |
| 486 | } | 486 | } |
| 487 | - | 487 | + |
| 488 | //if the document is checked-out by the current user, just return | 488 | //if the document is checked-out by the current user, just return |
| 489 | //as no need to check-out again BUT we do need to download | 489 | //as no need to check-out again BUT we do need to download |
| 490 | //returning here will allow download, but skip check-out | 490 | //returning here will allow download, but skip check-out |
| @@ -2502,6 +2502,17 @@ class KTAPI_Document extends KTAPI_FolderItem | @@ -2502,6 +2502,17 @@ class KTAPI_Document extends KTAPI_FolderItem | ||
| 2502 | sendEmail($listEmails, $this->documentid, $this->get_title(), $comment, (boolean)$attachDocument, $emailErrors); | 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,7 +3094,7 @@ class KTAPI | ||
| 3094 | * @param string $reason | 3094 | * @param string $reason |
| 3095 | * @return kt_document_detail. | 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 | $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, | 3099 | $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, |
| 3100 | 'ktcore.transactions.check_out'); | 3100 | 'ktcore.transactions.check_out'); |
| @@ -3109,7 +3109,8 @@ class KTAPI | @@ -3109,7 +3109,8 @@ class KTAPI | ||
| 3109 | } | 3109 | } |
| 3110 | 3110 | ||
| 3111 | $result = $document->checkout($reason); | 3111 | $result = $document->checkout($reason); |
| 3112 | - if (PEAR::isError($result)) | 3112 | + |
| 3113 | + if (PEAR::isError($result)) | ||
| 3113 | { | 3114 | { |
| 3114 | $response['status_code'] = 1; | 3115 | $response['status_code'] = 1; |
| 3115 | $response['message'] = $result->getMessage(); | 3116 | $response['message'] = $result->getMessage(); |
| @@ -3232,7 +3233,7 @@ class KTAPI | @@ -3232,7 +3233,7 @@ class KTAPI | ||
| 3232 | 3233 | ||
| 3233 | $result = $document->undo_checkout($reason); | 3234 | $result = $document->undo_checkout($reason); |
| 3234 | if (PEAR::isError($result)) | 3235 | if (PEAR::isError($result)) |
| 3235 | - { | 3236 | + { |
| 3236 | $response['status_code'] = 1; | 3237 | $response['status_code'] = 1; |
| 3237 | $response['message'] = $result->getMessage(); | 3238 | $response['message'] = $result->getMessage(); |
| 3238 | return $response; | 3239 | return $response; |
| @@ -3246,6 +3247,29 @@ class KTAPI | @@ -3246,6 +3247,29 @@ class KTAPI | ||
| 3246 | $response['status_code'] = 0; | 3247 | $response['status_code'] = 0; |
| 3247 | return $response; | 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 | * Returns a reference to a file to be downloaded. | 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 | <?php | 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,26 +439,36 @@ class KTNavigationService extends KTCMISBase { | ||
| 439 | * @param string $repositoryId | 439 | * @param string $repositoryId |
| 440 | * @param string $folderId The folder for which checked out docs are requested | 440 | * @param string $folderId The folder for which checked out docs are requested |
| 441 | * @param string $filter | 441 | * @param string $filter |
| 442 | + * @param boolean $includeAllowableActions | ||
| 443 | + * @param boolean $includeRelationships | ||
| 442 | * @param int $maxItems | 444 | * @param int $maxItems |
| 443 | * @param int $skipCount | 445 | * @param int $skipCount |
| 444 | * @return array $checkedout The collection of checked out documents | 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 | return array( | 456 | return array( |
| 454 | "status_code" => 1, | 457 | "status_code" => 1, |
| 455 | "message" => "Failed getting list of checked out documents" | 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 | return array( | 469 | return array( |
| 460 | "status_code" => 0, | 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,6 +802,65 @@ class KTVersioningService extends KTCMISBase { | ||
| 792 | 'results' => $result | 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,13 +40,13 @@ | ||
| 40 | * @version Version 0.1 | 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 | require_once(CMIS_DIR . '/classes/CMISDocumentPropertyCollection.inc.php'); | 44 | require_once(CMIS_DIR . '/classes/CMISDocumentPropertyCollection.inc.php'); |
| 45 | require_once(CMIS_DIR . '/util/CMISUtil.inc.php'); | 45 | require_once(CMIS_DIR . '/util/CMISUtil.inc.php'); |
| 46 | 46 | ||
| 47 | // TODO Property Type Definitions (only done Attributes up to now) | 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 | protected $versionable; | 51 | protected $versionable; |
| 52 | private $ktapi; | 52 | private $ktapi; |
| @@ -93,19 +93,24 @@ class CMISDocumentObject extends CMISBaseObject { | @@ -93,19 +93,24 @@ class CMISDocumentObject extends CMISBaseObject { | ||
| 93 | 93 | ||
| 94 | if (!is_null($documentId)) | 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 | $object = $this->ktapi->get_document_by_id((int)$documentId); | 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 | $objectProperties = $object->get_detail(); | 116 | $objectProperties = $object->get_detail(); |
lib/api/ktcmis/objecttypes/CMISFolderObject.inc.php
| @@ -40,11 +40,11 @@ | @@ -40,11 +40,11 @@ | ||
| 40 | * @version Version 0.1 | 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 | require_once(CMIS_DIR . '/classes/CMISFolderPropertyCollection.inc.php'); | 44 | require_once(CMIS_DIR . '/classes/CMISFolderPropertyCollection.inc.php'); |
| 45 | require_once(CMIS_DIR . '/util/CMISUtil.inc.php'); | 45 | require_once(CMIS_DIR . '/util/CMISUtil.inc.php'); |
| 46 | 46 | ||
| 47 | -class CMISFolderObject extends CMISBaseObject { | 47 | +class CMISFolderObject extends CMISObject { |
| 48 | 48 | ||
| 49 | private $ktapi; | 49 | private $ktapi; |
| 50 | private $uri; | 50 | private $uri; |
| @@ -72,11 +72,11 @@ class CMISFolderObject extends CMISBaseObject { | @@ -72,11 +72,11 @@ class CMISFolderObject extends CMISBaseObject { | ||
| 72 | 72 | ||
| 73 | if (!is_null($folderId)) | 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 | $object = $this->ktapi->get_folder_by_id((int)$folderId); | 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,18 +249,29 @@ class CMISNavigationService { | ||
| 249 | * @param string $repositoryId | 249 | * @param string $repositoryId |
| 250 | * @param string $folderId The folder for which checked out docs are requested | 250 | * @param string $folderId The folder for which checked out docs are requested |
| 251 | * @param string $filter | 251 | * @param string $filter |
| 252 | + * @param boolean $includeAllowableActions | ||
| 253 | + * @param boolean $includeRelationships | ||
| 252 | * @param int $maxItems | 254 | * @param int $maxItems |
| 253 | * @param int $skipCount | 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 | // NOTE NOT YET IMPLEMENTED (this function is just a place holder at the moment :)) | 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 | $checkedout = array(); | 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 | <?php | 1 | <?php |
| 2 | 2 | ||
| 3 | require_once(KT_DIR . '/ktapi/ktapi.inc.php'); | 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 | //require_once(CMIS_DIR . '/util/CMISUtil.inc.php'); | 10 | //require_once(CMIS_DIR . '/util/CMISUtil.inc.php'); |
| 16 | 11 | ||
| 17 | class CMISVersioningService { | 12 | class CMISVersioningService { |
| @@ -29,7 +24,7 @@ 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 | * @param string $repositoryId | 29 | * @param string $repositoryId |
| 35 | * @param string $versionSeriesId | 30 | * @param string $versionSeriesId |
| @@ -60,6 +55,8 @@ class CMISVersioningService { | @@ -60,6 +55,8 @@ class CMISVersioningService { | ||
| 60 | // TODO add the electronic signature capability | 55 | // TODO add the electronic signature capability |
| 61 | $auth_sig = true; | 56 | $auth_sig = true; |
| 62 | $result = $this->ktapi->delete_document($objectId, $reason, $auth_sig, $sig_username, $sig_password); | 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 | // if there was an error performing the delete, throw exception | 61 | // if there was an error performing the delete, throw exception |
| 65 | if ($result['status_code'] == 1) { | 62 | if ($result['status_code'] == 1) { |
| @@ -68,7 +65,110 @@ class CMISVersioningService { | @@ -68,7 +65,110 @@ class CMISVersioningService { | ||
| 68 | 65 | ||
| 69 | return true; | 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,11 +183,10 @@ class CMISTestCase extends KTUnitTestCase { | ||
| 183 | function testNavigationService() | 183 | function testNavigationService() |
| 184 | { | 184 | { |
| 185 | $NavigationService = new KTNavigationService($this->ktapi); | 185 | $NavigationService = new KTNavigationService($this->ktapi); |
| 186 | -// $NavigationService->startSession(KT_TEST_USER, KT_TEST_PASS); | ||
| 187 | 186 | ||
| 188 | // set up the folder/doc tree structure with which we will be testing | 187 | // set up the folder/doc tree structure with which we will be testing |
| 189 | $this->createFolderDocStructure(); | 188 | $this->createFolderDocStructure(); |
| 190 | - | 189 | + |
| 191 | $RepositoryService = new KTRepositoryService(); | 190 | $RepositoryService = new KTRepositoryService(); |
| 192 | $response = $RepositoryService->getRepositories(); | 191 | $response = $RepositoryService->getRepositories(); |
| 193 | 192 | ||
| @@ -469,7 +468,7 @@ class CMISTestCase extends KTUnitTestCase { | @@ -469,7 +468,7 @@ class CMISTestCase extends KTUnitTestCase { | ||
| 469 | function testVersioningService() | 468 | function testVersioningService() |
| 470 | { | 469 | { |
| 471 | $VersioningService = new KTVersioningService($this->ktapi); | 470 | $VersioningService = new KTVersioningService($this->ktapi); |
| 472 | -// $ObjectService->startSession(KT_TEST_USER, KT_TEST_PASS); | 471 | + $NavigationService = new KTNavigationService($this->ktapi); |
| 473 | 472 | ||
| 474 | // set up the folder/doc tree structure with which we will be testing | 473 | // set up the folder/doc tree structure with which we will be testing |
| 475 | $this->createFolderDocStructure(); | 474 | $this->createFolderDocStructure(); |
| @@ -484,15 +483,51 @@ class CMISTestCase extends KTUnitTestCase { | @@ -484,15 +483,51 @@ class CMISTestCase extends KTUnitTestCase { | ||
| 484 | $repository = $response['results'][0]; | 483 | $repository = $response['results'][0]; |
| 485 | $repositoryId = $repository['repositoryId']; | 484 | $repositoryId = $repository['repositoryId']; |
| 486 | 485 | ||
| 487 | - // TEST 1 | ||
| 488 | // test deletion of document via deleteAllVersions | 486 | // test deletion of document via deleteAllVersions |
| 489 | $versionSeriesId = 'D'.$this->docs[0]->get_documentid(); | 487 | $versionSeriesId = 'D'.$this->docs[0]->get_documentid(); |
| 490 | - $result = $VersioningService->deleteAllVersions($repositoryId, $versionSeriesId); | 488 | + $response = $VersioningService->deleteAllVersions($repositoryId, $versionSeriesId); |
| 491 | 489 | ||
| 492 | $this->assertEqual($response['status_code'], 0); | 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 | // tear down the folder/doc tree structure with which we were testing | 532 | // tear down the folder/doc tree structure with which we were testing |
| 498 | $this->cleanupFolderDocStructure(); | 533 | $this->cleanupFolderDocStructure(); |
| @@ -526,7 +561,8 @@ class CMISTestCase extends KTUnitTestCase { | @@ -526,7 +561,8 @@ class CMISTestCase extends KTUnitTestCase { | ||
| 526 | function deleteDocument($document) | 561 | function deleteDocument($document) |
| 527 | { | 562 | { |
| 528 | $document->delete('Testing API'); | 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 | function createRandomFile($content = 'this is some text', $uploadDir = null) | 568 | function createRandomFile($content = 'this is some text', $uploadDir = null) |
| @@ -610,8 +646,10 @@ class CMISTestCase extends KTUnitTestCase { | @@ -610,8 +646,10 @@ class CMISTestCase extends KTUnitTestCase { | ||
| 610 | // clean up root level docs | 646 | // clean up root level docs |
| 611 | foreach($this->docs as $doc) | 647 | foreach($this->docs as $doc) |
| 612 | { | 648 | { |
| 649 | + if (++$coujnt > 10) exit; | ||
| 613 | $doc->delete('Testing'); | 650 | $doc->delete('Testing'); |
| 614 | - $doc->expunge(); | 651 | + // expunge appears to be breaking tests, times out |
| 652 | + // $doc->expunge(); | ||
| 615 | } | 653 | } |
| 616 | 654 | ||
| 617 | // Clean up root level folders (sub-folders and contained docs should be removed automatically) | 655 | // Clean up root level folders (sub-folders and contained docs should be removed automatically) |