Commit 4360806ab9f8c599ffaee2e41c2f979e48039dda
Merge branch 'edge' of git@github.com:ktgit/knowledgetree into edge
Showing
14 changed files
with
562 additions
and
492 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/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 | ?> |
lib/api/ktcmis/util/CMISUtil.inc.php
| @@ -40,6 +40,10 @@ | @@ -40,6 +40,10 @@ | ||
| 40 | * @version Version 0.1 | 40 | * @version Version 0.1 |
| 41 | */ | 41 | */ |
| 42 | 42 | ||
| 43 | +define('UNKNOWN', -1); | ||
| 44 | +define('DOCUMENT', 1); | ||
| 45 | +define('FOLDER', 2); | ||
| 46 | + | ||
| 43 | require_once(CMIS_DIR . '/objecttypes/CMISDocumentObject.inc.php'); | 47 | require_once(CMIS_DIR . '/objecttypes/CMISDocumentObject.inc.php'); |
| 44 | require_once(CMIS_DIR . '/objecttypes/CMISFolderObject.inc.php'); | 48 | require_once(CMIS_DIR . '/objecttypes/CMISFolderObject.inc.php'); |
| 45 | 49 | ||
| @@ -61,10 +65,12 @@ class CMISUtil { | @@ -61,10 +65,12 @@ class CMISUtil { | ||
| 61 | { | 65 | { |
| 62 | case 'D': | 66 | case 'D': |
| 63 | case 'Document': | 67 | case 'Document': |
| 68 | + case DOCUMENT: | ||
| 64 | $encoded = 'D' . $objectId; | 69 | $encoded = 'D' . $objectId; |
| 65 | break; | 70 | break; |
| 66 | case 'F': | 71 | case 'F': |
| 67 | case 'Folder': | 72 | case 'Folder': |
| 73 | + case FOLDER: | ||
| 68 | $encoded = 'F' . $objectId; | 74 | $encoded = 'F' . $objectId; |
| 69 | break; | 75 | break; |
| 70 | default: | 76 | default: |
tests/ktcmis/testCmisApi.php
| @@ -63,7 +63,7 @@ class CMISTestCase extends KTUnitTestCase { | @@ -63,7 +63,7 @@ class CMISTestCase extends KTUnitTestCase { | ||
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | // Repository service functions | 65 | // Repository service functions |
| 66 | - function testRepositoryService() | 66 | + function tedstRepositoryService() |
| 67 | { | 67 | { |
| 68 | $RepositoryService = new KTRepositoryService(); | 68 | $RepositoryService = new KTRepositoryService(); |
| 69 | 69 | ||
| @@ -180,14 +180,13 @@ class CMISTestCase extends KTUnitTestCase { | @@ -180,14 +180,13 @@ class CMISTestCase extends KTUnitTestCase { | ||
| 180 | } | 180 | } |
| 181 | 181 | ||
| 182 | // Navigation service functions | 182 | // Navigation service functions |
| 183 | - function testNavigationService() | 183 | + function tedstNavigationService() |
| 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 | ||
| @@ -303,7 +302,7 @@ class CMISTestCase extends KTUnitTestCase { | @@ -303,7 +302,7 @@ class CMISTestCase extends KTUnitTestCase { | ||
| 303 | 302 | ||
| 304 | // Object Services | 303 | // Object Services |
| 305 | 304 | ||
| 306 | - function testObjectService() | 305 | + function tedstObjectService() |
| 307 | { | 306 | { |
| 308 | $ObjectService = new KTObjectService($this->ktapi); | 307 | $ObjectService = new KTObjectService($this->ktapi); |
| 309 | // $ObjectService->startSession(KT_TEST_USER, KT_TEST_PASS); | 308 | // $ObjectService->startSession(KT_TEST_USER, KT_TEST_PASS); |
| @@ -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(); |
| @@ -479,20 +478,61 @@ class CMISTestCase extends KTUnitTestCase { | @@ -479,20 +478,61 @@ class CMISTestCase extends KTUnitTestCase { | ||
| 479 | 478 | ||
| 480 | $this->assertEqual($response['status_code'], 0); | 479 | $this->assertEqual($response['status_code'], 0); |
| 481 | $this->assertNotNull($response['results'][0]); | 480 | $this->assertNotNull($response['results'][0]); |
| 482 | - | 481 | +// |
| 483 | // we only expect one repository | 482 | // we only expect one repository |
| 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', $this->docs[1]->get_documentid()); | ||
| 495 | + $response = $VersioningService->checkOut($repositoryId, $documentId); | ||
| 496 | + $this->assertEqual($response['status_code'], 0); | ||
| 497 | + $this->assertNotNull($response['results']); | ||
| 498 | + | ||
| 499 | +//// // use this id for cancel checkout and checkin, not the original document id | ||
| 500 | +//// $pwcId = $response['results']; | ||
| 501 | + $pwcId = CMISUtil::encodeObjectId(DOCUMENT, $this->docs[1]->get_documentid()); | ||
| 502 | + | ||
| 503 | + // try again, this time it should fail - not working at the moment as ktapi registers the same user for download | ||
| 504 | + // even if already checked out, so no error is generated unless a different user attempts to do a checkout | ||
| 505 | + /* | ||
| 506 | + $response = $VersioningService->checkOut($repositoryId, $documentId); | ||
| 507 | + $this->assertEqual($response['status_code'], 1); | ||
| 508 | + $this->assertNotNull($response['message']); | ||
| 509 | + */ | ||
| 510 | + | ||
| 511 | + // test cancel checkout | ||
| 512 | +// echo "WITH: $pwcId<BR>"; | ||
| 513 | + $response = $VersioningService->cancelCheckOut($repositoryId, $pwcId); | ||
| 514 | + $this->assertEqual($response['status_code'], 0); | ||
| 515 | + $this->assertNotNull($response['results']); | ||
| 516 | + | ||
| 517 | + // test cancel checkout of document no longer checked out | ||
| 518 | + $response = $VersioningService->cancelCheckOut($repositoryId, $pwcId); | ||
| 519 | + $this->assertEqual($response['status_code'], 1); | ||
| 520 | + $this->assertNotNull($response['message']); | ||
| 521 | + | ||
| 522 | + // test listing of checked out documents | ||
| 523 | + // first check out the document again :) | ||
| 524 | + $response = $VersioningService->checkOut($repositoryId, $documentId); | ||
| 525 | + // now check that it appears in the listing | ||
| 526 | + $response = $NavigationService->getCheckedOutDocs($repositoryId, false, false); | ||
| 527 | + $this->assertEqual($response['status_code'], 0); | ||
| 528 | + $this->assertNotNull($response['results']); | ||
| 529 | + $this->assertTrue(in_array($documentId, $response['results'])); | ||
| 530 | + // now let's cancel the checkout so that we can delete later during cleanup :) | ||
| 531 | + $response = $VersioningService->cancelCheckOut($repositoryId, $pwcId); | ||
| 532 | + | ||
| 533 | + // TODO test checkin | ||
| 494 | 534 | ||
| 495 | - // TODO add testing of failure conditions - e.g. checked out/immutable document | 535 | + // TODO add testing of failure conditions - e.g. checked out/immutable document (for all appropriate functions) |
| 496 | 536 | ||
| 497 | // tear down the folder/doc tree structure with which we were testing | 537 | // tear down the folder/doc tree structure with which we were testing |
| 498 | $this->cleanupFolderDocStructure(); | 538 | $this->cleanupFolderDocStructure(); |
| @@ -526,7 +566,8 @@ class CMISTestCase extends KTUnitTestCase { | @@ -526,7 +566,8 @@ class CMISTestCase extends KTUnitTestCase { | ||
| 526 | function deleteDocument($document) | 566 | function deleteDocument($document) |
| 527 | { | 567 | { |
| 528 | $document->delete('Testing API'); | 568 | $document->delete('Testing API'); |
| 529 | - $document->expunge(); | 569 | + // expunge appears to be causing problems at the moment |
| 570 | + // $document->expunge(); | ||
| 530 | } | 571 | } |
| 531 | 572 | ||
| 532 | function createRandomFile($content = 'this is some text', $uploadDir = null) | 573 | function createRandomFile($content = 'this is some text', $uploadDir = null) |
| @@ -610,8 +651,10 @@ class CMISTestCase extends KTUnitTestCase { | @@ -610,8 +651,10 @@ class CMISTestCase extends KTUnitTestCase { | ||
| 610 | // clean up root level docs | 651 | // clean up root level docs |
| 611 | foreach($this->docs as $doc) | 652 | foreach($this->docs as $doc) |
| 612 | { | 653 | { |
| 654 | + if (++$coujnt > 10) exit; | ||
| 613 | $doc->delete('Testing'); | 655 | $doc->delete('Testing'); |
| 614 | - $doc->expunge(); | 656 | + // expunge appears to be breaking tests, times out |
| 657 | + // $doc->expunge(); | ||
| 615 | } | 658 | } |
| 616 | 659 | ||
| 617 | // Clean up root level folders (sub-folders and contained docs should be removed automatically) | 660 | // Clean up root level folders (sub-folders and contained docs should be removed automatically) |
webservice/atompub/cmis/KT_cmis_atom_server.services.inc.php
| @@ -136,9 +136,7 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service { | @@ -136,9 +136,7 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service { | ||
| 136 | $objectId = $this->params[2]; | 136 | $objectId = $this->params[2]; |
| 137 | } | 137 | } |
| 138 | 138 | ||
| 139 | - $cmisObjectProperties = KT_cmis_atom_service_helper::getCmisProperties($this->parsedXMLContent['@children']['cmis:object'] | ||
| 140 | - [0]['@children']['cmis:properties'] | ||
| 141 | - [0]['@children']); | 139 | + $cmisObjectProperties = KT_cmis_atom_service_helper::getCmisProperties($this->parsedXMLContent['@children']['cmis:object']); |
| 142 | 140 | ||
| 143 | // check for existing object id as property of submitted object data | 141 | // check for existing object id as property of submitted object data |
| 144 | if (!empty($cmisObjectProperties['ObjectId'])) | 142 | if (!empty($cmisObjectProperties['ObjectId'])) |
| @@ -487,6 +485,85 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service { | @@ -487,6 +485,85 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service { | ||
| 487 | //Expose the responseFeed | 485 | //Expose the responseFeed |
| 488 | $this->responseFeed = $feed; | 486 | $this->responseFeed = $feed; |
| 489 | } | 487 | } |
| 488 | + | ||
| 489 | + public function POST_action() | ||
| 490 | + { | ||
| 491 | + $RepositoryService = new RepositoryService(); | ||
| 492 | + $VersioningService = new VersioningService(KT_cmis_atom_service_helper::getKt()); | ||
| 493 | + $ObjectService = new ObjectService(KT_cmis_atom_service_helper::getKt()); | ||
| 494 | + | ||
| 495 | + $repositories = $RepositoryService->getRepositories(); | ||
| 496 | + $repositoryId = $repositories[0]['repositoryId']; | ||
| 497 | + | ||
| 498 | + $cmisObjectProperties = KT_cmis_atom_service_helper::getCmisProperties($this->parsedXMLContent['@children']['cmis:object']); | ||
| 499 | + | ||
| 500 | + // check for existing object id as property of submitted object data | ||
| 501 | + if (empty($cmisObjectProperties['ObjectId'])) | ||
| 502 | + { | ||
| 503 | + $feed = KT_cmis_atom_service_helper::getErrorFeed($this, self::STATUS_SERVER_ERROR, 'No object was specified for checkout'); | ||
| 504 | + //Expose the responseFeed | ||
| 505 | + $this->responseFeed = $feed; | ||
| 506 | + return null; | ||
| 507 | + } | ||
| 508 | + | ||
| 509 | + $response = $VersioningService->checkOut($repositoryId, $cmisObjectProperties['ObjectId']); | ||
| 510 | + | ||
| 511 | + if (PEAR::isError($response)) | ||
| 512 | + { | ||
| 513 | + $feed = KT_cmis_atom_service_helper::getErrorFeed($this, self::STATUS_SERVER_ERROR, 'No object was specified for checkout'); | ||
| 514 | + //Expose the responseFeed | ||
| 515 | + $this->responseFeed = $feed; | ||
| 516 | + return null; | ||
| 517 | + } | ||
| 518 | + | ||
| 519 | + $this->setStatus(self::STATUS_CREATED); | ||
| 520 | + $feed = KT_cmis_atom_service_helper::getObjectFeed($this, $ObjectService, $repositoryId, $cmisObjectProperties['ObjectId'], 'POST'); | ||
| 521 | +// $feed = KT_cmis_atom_service_helper::getObjectFeed($this, $ObjectService, $repositoryId, $newObjectId, 'POST'); | ||
| 522 | + | ||
| 523 | + //Expose the responseFeed | ||
| 524 | + $this->responseFeed = $feed; | ||
| 525 | + | ||
| 526 | +// $checkedout = $NavigationService->getCheckedoutDocs($repositoryId); | ||
| 527 | +// | ||
| 528 | +// //Create a new response feed | ||
| 529 | +// $feed = new KT_cmis_atom_responseFeed_GET(CMIS_APP_BASE_URI); | ||
| 530 | +// | ||
| 531 | +// $feed->newField('title', 'Checked out Documents', $feed); | ||
| 532 | +// | ||
| 533 | +// // TODO dynamic? | ||
| 534 | +// $feedElement = $feed->newField('author'); | ||
| 535 | +// $element = $feed->newField('name', 'admin', $feedElement); | ||
| 536 | +// $feed->appendChild($feedElement); | ||
| 537 | +// | ||
| 538 | +// $feed->appendChild($feed->newElement('id', 'urn:uuid:checkedout')); | ||
| 539 | +// | ||
| 540 | +// // TODO get actual most recent update time, only use current if no other available | ||
| 541 | +// $feed->appendChild($feed->newElement('updated', KT_cmis_atom_service_helper::formatDatestamp())); | ||
| 542 | +// | ||
| 543 | +// foreach($checkedout as $document) | ||
| 544 | +// { | ||
| 545 | +// $entry = $feed->newEntry(); | ||
| 546 | +// $objectElement = $feed->newElement('cmis:object'); | ||
| 547 | +// $propertiesElement = $feed->newElement('cmis:properties'); | ||
| 548 | +// | ||
| 549 | +// foreach($cmisEntry['properties'] as $propertyName => $property) | ||
| 550 | +// { | ||
| 551 | +// $propElement = $feed->newElement('cmis:' . $property['type']); | ||
| 552 | +// $propElement->appendChild($feed->newAttr('cmis:name', $propertyName)); | ||
| 553 | +// $feed->newField('cmis:value', CMISUtil::boolToString($property['value']), $propElement); | ||
| 554 | +// $propertiesElement->appendChild($propElement); | ||
| 555 | +// } | ||
| 556 | +// | ||
| 557 | +// $objectElement->appendChild($propertiesElement); | ||
| 558 | +// $entry->appendChild($objectElement); | ||
| 559 | +// } | ||
| 560 | +// | ||
| 561 | +// $entry = null; | ||
| 562 | +// $feed->newField('cmis:hasMoreItems', 'false', $entry, true); | ||
| 563 | +// | ||
| 564 | +// //Expose the responseFeed | ||
| 565 | +// $this->responseFeed = $feed; | ||
| 566 | + } | ||
| 490 | 567 | ||
| 491 | } | 568 | } |
| 492 | 569 |
webservice/atompub/cmis/KT_cmis_atom_service_helper.inc.php
| @@ -28,6 +28,7 @@ class KT_cmis_atom_service_helper { | @@ -28,6 +28,7 @@ class KT_cmis_atom_service_helper { | ||
| 28 | $response->newField('title', $cmisEntry['properties']['ObjectTypeId']['value'], $response); | 28 | $response->newField('title', $cmisEntry['properties']['ObjectTypeId']['value'], $response); |
| 29 | $response->newField('id', 'urn:uuid:' . $cmisEntry['properties']['ObjectId']['value'], $response); | 29 | $response->newField('id', 'urn:uuid:' . $cmisEntry['properties']['ObjectId']['value'], $response); |
| 30 | } | 30 | } |
| 31 | + // POST responses only send back an entry, not a feed | ||
| 31 | else if ($method == 'POST') { | 32 | else if ($method == 'POST') { |
| 32 | $response = new KT_cmis_atom_response_POST(CMIS_APP_BASE_URI); | 33 | $response = new KT_cmis_atom_response_POST(CMIS_APP_BASE_URI); |
| 33 | } | 34 | } |
| @@ -414,11 +415,20 @@ class KT_cmis_atom_service_helper { | @@ -414,11 +415,20 @@ class KT_cmis_atom_service_helper { | ||
| 414 | { | 415 | { |
| 415 | $properties = array(); | 416 | $properties = array(); |
| 416 | 417 | ||
| 417 | - foreach($xmlArray as $cmisPropertyDefinition) | 418 | + foreach($xmlArray as $xmlElement) |
| 418 | { | 419 | { |
| 419 | - foreach($cmisPropertyDefinition as $propertyType => $propertyDefinition) | 420 | + foreach($xmlElement['@children'] as $key => $childElement) |
| 420 | { | 421 | { |
| 421 | - $properties[$propertyDefinition['@attributes']['cmis:name']] = $propertyDefinition['@children']['cmis:value'][0]['@value']; | 422 | + if ($key == 'cmis:properties') |
| 423 | + { | ||
| 424 | + foreach($childElement[0]['@children'] as $cmisPropertyDefinition) | ||
| 425 | + { | ||
| 426 | + foreach($cmisPropertyDefinition as $propertyType => $propertyDefinition) | ||
| 427 | + { | ||
| 428 | + $properties[$propertyDefinition['@attributes']['cmis:name']] = $propertyDefinition['@children']['cmis:value'][0]['@value']; | ||
| 429 | + } | ||
| 430 | + } | ||
| 431 | + } | ||
| 422 | } | 432 | } |
| 423 | } | 433 | } |
| 424 | 434 |
webservice/classes/atompub/cmis/VersioningService.inc.php
| @@ -27,6 +27,27 @@ class VersioningService extends KTVersioningService { | @@ -27,6 +27,27 @@ class VersioningService extends KTVersioningService { | ||
| 27 | return new PEAR_Error($result['message']); | 27 | return new PEAR_Error($result['message']); |
| 28 | } | 28 | } |
| 29 | } | 29 | } |
| 30 | + | ||
| 31 | + /** | ||
| 32 | + * Checks out a document and creates the PWC (Private Working Copy) which will represent the checked out document | ||
| 33 | + * | ||
| 34 | + * @param string $repositoryId | ||
| 35 | + * @param string $documentId | ||
| 36 | + * @param string $changeToken [optional] | ||
| 37 | + * @return array results | ||
| 38 | + */ | ||
| 39 | + // TODO set up delivery of content stream? or is that up to the CMIS client? | ||
| 40 | + public function checkOut($repositoryId, $documentId, $changeToken = '') | ||
| 41 | + { | ||
| 42 | + $result = parent::checkOut($repositoryId, $documentId, $changeToken); | ||
| 43 | + | ||
| 44 | + if ($result['status_code'] == 0) { | ||
| 45 | + return $result['results']; | ||
| 46 | + } | ||
| 47 | + else { | ||
| 48 | + return new PEAR_Error($result['message']); | ||
| 49 | + } | ||
| 50 | + } | ||
| 30 | 51 | ||
| 31 | } | 52 | } |
| 32 | 53 |