Commit 53ab10ed1c6ecdb1ce1dfeb86c3ae414773ff18e
Merge branch 'edge' of git@github.com:ktgit/knowledgetree into edge
Showing
9 changed files
with
153 additions
and
16 deletions
lib/api/ktcmis/classes/CMISDocumentPropertyCollection.inc.php
| ... | ... | @@ -73,7 +73,8 @@ class CMISDocumentPropertyCollection extends CMISPropertyCollection { |
| 73 | 73 | 'ContentStreamUri' => 'propertyUri', |
| 74 | 74 | 'IsVersionSeriesCheckedOut' => 'propertyBoolean', |
| 75 | 75 | 'VersionSeriesCheckedOutBy' => 'propertyString', |
| 76 | - 'VersionSeriesCheckedOutId' => 'propertyId')); | |
| 76 | + 'VersionSeriesCheckedOutId' => 'propertyId', | |
| 77 | + 'VersionLabel' => 'propertyString')); | |
| 77 | 78 | } |
| 78 | 79 | |
| 79 | 80 | } | ... | ... |
lib/api/ktcmis/classes/CMISPropertyCollection.inc.php
| ... | ... | @@ -62,7 +62,7 @@ abstract class CMISPropertyCollection { |
| 62 | 62 | self::$propertyTypes = array('ObjectId' => 'propertyId', |
| 63 | 63 | 'Author' => 'propertyString', |
| 64 | 64 | 'BaseType' => 'propertyString', |
| 65 | - 'ObjectTypeId' => 'propertyString', | |
| 65 | + 'ObjectTypeId' => 'propertyId', | |
| 66 | 66 | 'CreatedBy' => 'propertyString', |
| 67 | 67 | 'CreationDate' => 'propertyDateTime', |
| 68 | 68 | 'LastModifiedBy' => 'propertyString', | ... | ... |
lib/api/ktcmis/ktcmis.inc.php
| ... | ... | @@ -861,6 +861,37 @@ class KTVersioningService extends KTCMISBase { |
| 861 | 861 | 'results' => (!empty($result) ? $result : 'Document Checkout Cancelled') |
| 862 | 862 | ); |
| 863 | 863 | } |
| 864 | + | |
| 865 | + /** | |
| 866 | + * Checks in a checked out document | |
| 867 | + * | |
| 868 | + * @param string $repositoryId | |
| 869 | + * @param string $documentId | |
| 870 | + * @param boolean $major | |
| 871 | + * @param string $changeToken [optional] | |
| 872 | + * @param array $properties [optional] | |
| 873 | + * @param contentStream $contentStream [optional] | |
| 874 | + * @param string $checkinComment [optional] | |
| 875 | + * @return string $documentId | |
| 876 | + */ | |
| 877 | + public function checkIn($repositoryId, $documentId, $major, $changeToken = '', $properties = array(), $contentStream = null, $checkinComment = '') | |
| 878 | + { | |
| 879 | + try { | |
| 880 | + $result = $this->VersioningService->checkIn($repositoryId, $documentId, $major, $changeToken, $properties, $contentStream, $checkinComment); | |
| 881 | + } | |
| 882 | + catch (Exception $e) | |
| 883 | + { | |
| 884 | + return array( | |
| 885 | + "status_code" => 1, | |
| 886 | + "message" => $e->getMessage() | |
| 887 | + ); | |
| 888 | + } | |
| 889 | + | |
| 890 | + return array( | |
| 891 | + 'status_code' => 0, | |
| 892 | + 'results' => (!empty($result) ? $result : 'Document Checked In Successfully') | |
| 893 | + ); | |
| 894 | + } | |
| 864 | 895 | |
| 865 | 896 | } |
| 866 | 897 | ... | ... |
lib/api/ktcmis/services/CMISNavigationService.inc.php
| ... | ... | @@ -268,6 +268,8 @@ class CMISNavigationService { |
| 268 | 268 | foreach($results as $document) |
| 269 | 269 | { |
| 270 | 270 | $CMISDocument = new CMISDocumentObject($document->getId(), $this->ktapi); |
| 271 | + // set version label property - possibly belongs in document class | |
| 272 | + $CMISDocument->setProperty('VersionLabel', $CMISDocument->getProperty('VersionSeriesCheckedOutId')); | |
| 271 | 273 | $checkedout[] = $CMISDocument->getProperties(); |
| 272 | 274 | } |
| 273 | 275 | ... | ... |
lib/api/ktcmis/services/CMISVersioningService.inc.php
| ... | ... | @@ -169,6 +169,46 @@ class CMISVersioningService { |
| 169 | 169 | } |
| 170 | 170 | } |
| 171 | 171 | |
| 172 | + /** | |
| 173 | + * Checks in a checked out document | |
| 174 | + * | |
| 175 | + * @param string $repositoryId | |
| 176 | + * @param string $documentId | |
| 177 | + * @param boolean $major | |
| 178 | + * @param string $changeToken [optional] | |
| 179 | + * @param array $properties [optional] | |
| 180 | + * @param contentStream $contentStream [optional] | |
| 181 | + * @param string $checkinComment [optional] | |
| 182 | + * @return string $documentId | |
| 183 | + */ | |
| 184 | + // TODO Exceptions: | |
| 185 | + // • ConstraintViolationException - SHALL throw if o The Document’s Object-Type definition’s versionable attribute is FALSE. | |
| 186 | + // • storageException - MAY throw | |
| 187 | + // • streamNotSupportedException - The Repository SHALL throw this exception if the Object-Type definition specified by the typeId | |
| 188 | + // parameter’s “contentStreamAllowed” attribute is set to “not allowed” and a contentStream input | |
| 189 | + // parameter is provided. | |
| 190 | + // • updateConflictException - MAY throw | |
| 191 | + // • versioningException - The repository MAY throw this exception if the object is a non-current Document Version | |
| 192 | + public function checkIn($repositoryId, $documentId, $major, $changeToken = '', $properties = array(), $contentStream = null, $checkinComment = '') | |
| 193 | + { | |
| 194 | + $documentId = CMISUtil::decodeObjectId($documentId, $typeId); | |
| 195 | + | |
| 196 | + // throw updateConflictException if the operation is attempting to update an object that is no longer current (as determined by the repository). | |
| 197 | + try { | |
| 198 | + $pwc = new CMISDocumentObject($documentId, $this->ktapi); | |
| 199 | + } | |
| 200 | + catch (exception $e) { | |
| 201 | + throw new UpdateConflictException($e->getMessage()); | |
| 202 | + } | |
| 203 | + | |
| 204 | + // throw exception if the object is not versionable | |
| 205 | + if (!$pwc->getAttribute('versionable')) { | |
| 206 | + throw new ConstraintViolationException('This document is not versionable and may not be checked in'); | |
| 207 | + } | |
| 208 | + | |
| 209 | + return $documentId; | |
| 210 | + } | |
| 211 | + | |
| 172 | 212 | } |
| 173 | 213 | |
| 174 | 214 | ?> | ... | ... |
webservice/atompub/cmis/KT_cmis_atom_server.services.inc.php
| ... | ... | @@ -446,7 +446,7 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service { |
| 446 | 446 | $repositoryId = $repositories[0]['repositoryId']; |
| 447 | 447 | |
| 448 | 448 | $checkedout = $NavigationService->getCheckedOutDocs($repositoryId); |
| 449 | - | |
| 449 | +//print_r($checkedout);exit; | |
| 450 | 450 | //Create a new response feed |
| 451 | 451 | $feed = new KT_cmis_atom_responseFeed_GET(CMIS_APP_BASE_URI); |
| 452 | 452 | $workspace = $feed->getWorkspace(); |
| ... | ... | @@ -483,7 +483,7 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service { |
| 483 | 483 | |
| 484 | 484 | foreach($checkedout as $cmisEntry) |
| 485 | 485 | { |
| 486 | - KT_cmis_atom_service_helper::createObjectEntry($feed, $cmisEntry, $folderName); | |
| 486 | + KT_cmis_atom_service_helper::createObjectEntry($feed, $cmisEntry, $folderName, true); | |
| 487 | 487 | |
| 488 | 488 | // // after each entry, add app:edited tag |
| 489 | 489 | // $feed->newField('app:edited', KT_cmis_atom_service_helper::formatDatestamp(), $feed); |
| ... | ... | @@ -506,7 +506,7 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service { |
| 506 | 506 | |
| 507 | 507 | $repositories = $RepositoryService->getRepositories(); |
| 508 | 508 | $repositoryId = $repositories[0]['repositoryId']; |
| 509 | - | |
| 509 | + | |
| 510 | 510 | $cmisObjectProperties = KT_cmis_atom_service_helper::getCmisProperties($this->parsedXMLContent['@children']); |
| 511 | 511 | |
| 512 | 512 | // check for existing object id as property of submitted object data |
| ... | ... | @@ -646,6 +646,8 @@ class KT_cmis_atom_service_document extends KT_cmis_atom_service { |
| 646 | 646 | } |
| 647 | 647 | |
| 648 | 648 | class KT_cmis_atom_service_pwc extends KT_cmis_atom_service { |
| 649 | + | |
| 650 | + protected $serviceType = 'PWC'; | |
| 649 | 651 | |
| 650 | 652 | /** |
| 651 | 653 | * Deals with GET actions for Private Working Copies. |
| ... | ... | @@ -703,6 +705,29 @@ class KT_cmis_atom_service_pwc extends KT_cmis_atom_service { |
| 703 | 705 | $this->responseFeed = null; |
| 704 | 706 | } |
| 705 | 707 | |
| 708 | + public function PUT_action() | |
| 709 | + { | |
| 710 | + // call the checkin function | |
| 711 | + $RepositoryService = new RepositoryService(); | |
| 712 | + $VersioningService = new VersioningService(KT_cmis_atom_service_helper::getKt()); | |
| 713 | + | |
| 714 | + $repositories = $RepositoryService->getRepositories(); | |
| 715 | + $repositoryId = $repositories[0]['repositoryId']; | |
| 716 | + | |
| 717 | + $response = $VersioningService->checkIn($repositoryId, $this->params[0]); | |
| 718 | + | |
| 719 | + if (PEAR::isError($response)) | |
| 720 | + { | |
| 721 | + $feed = KT_cmis_atom_service_helper::getErrorFeed($this, self::STATUS_SERVER_ERROR, $response->getMessage()); | |
| 722 | + //Expose the responseFeed | |
| 723 | + $this->responseFeed = $feed; | |
| 724 | + return null; | |
| 725 | + } | |
| 726 | + | |
| 727 | + $this->setStatus(self::STATUS_NO_CONTENT); | |
| 728 | + $this->responseFeed = null; | |
| 729 | + } | |
| 730 | + | |
| 706 | 731 | } |
| 707 | 732 | |
| 708 | 733 | ?> |
| 709 | 734 | \ No newline at end of file | ... | ... |
webservice/atompub/cmis/KT_cmis_atom_service_helper.inc.php
| ... | ... | @@ -14,6 +14,7 @@ class KT_cmis_atom_service_helper { |
| 14 | 14 | */ |
| 15 | 15 | static public function getObjectFeed(&$service, $ObjectService, $repositoryId, $objectId, $method = 'GET') |
| 16 | 16 | { |
| 17 | + $serviceType = $service->getServiceType(); | |
| 17 | 18 | $response = $ObjectService->getProperties($repositoryId, $objectId, false, false); |
| 18 | 19 | |
| 19 | 20 | if (PEAR::isError($response)) { |
| ... | ... | @@ -22,18 +23,24 @@ class KT_cmis_atom_service_helper { |
| 22 | 23 | |
| 23 | 24 | $cmisEntry = $response; |
| 24 | 25 | $response = null; |
| 25 | - | |
| 26 | - if ($method == 'GET') { | |
| 26 | + | |
| 27 | + // POST/PWC responses only send back an entry, not a feed | |
| 28 | + if (($serviceType == 'PWC') || ($method == 'POST')) { | |
| 29 | + if ($method == 'POST') { | |
| 30 | + $response = new KT_cmis_atom_response_POST(CMIS_APP_BASE_URI); | |
| 31 | + } | |
| 32 | + else { | |
| 33 | + $response = new KT_cmis_atom_response_GET(CMIS_APP_BASE_URI); | |
| 34 | + } | |
| 35 | + } | |
| 36 | + else if ($method == 'GET') { | |
| 27 | 37 | $response = new KT_cmis_atom_responseFeed_GET(CMIS_APP_BASE_URI); |
| 28 | 38 | $response->newField('title', $cmisEntry['properties']['ObjectTypeId']['value'], $response); |
| 29 | 39 | $response->newField('id', 'urn:uuid:' . $cmisEntry['properties']['ObjectId']['value'], $response); |
| 30 | 40 | } |
| 31 | - // POST responses only send back an entry, not a feed | |
| 32 | - else if ($method == 'POST') { | |
| 33 | - $response = new KT_cmis_atom_response_POST(CMIS_APP_BASE_URI); | |
| 34 | - } | |
| 35 | 41 | |
| 36 | - KT_cmis_atom_service_helper::createObjectEntry($response, $cmisEntry, $cmisEntry['properties']['ParentId']['value'], $method); | |
| 42 | + if ($serviceType == 'PWC') $pwc = true; else $pwc = false; | |
| 43 | + KT_cmis_atom_service_helper::createObjectEntry($response, $cmisEntry, $cmisEntry['properties']['ParentId']['value'], $pwc, $method); | |
| 37 | 44 | |
| 38 | 45 | // Don't think this should be here...only one item so why would we need to say there are no more? |
| 39 | 46 | /*if ($method == 'GET') { |
| ... | ... | @@ -50,7 +57,7 @@ class KT_cmis_atom_service_helper { |
| 50 | 57 | * @param array $cmisEntry The entry data |
| 51 | 58 | * @param string $parent The parent folder |
| 52 | 59 | */ |
| 53 | - static public function createObjectEntry(&$response, $cmisEntry, $parent, $method = 'GET') | |
| 60 | + static public function createObjectEntry(&$response, $cmisEntry, $parent, $pwc = false, $method = 'GET') | |
| 54 | 61 | { |
| 55 | 62 | $workspace = $response->getWorkspace(); |
| 56 | 63 | $type = strtolower($cmisEntry['properties']['ObjectTypeId']['value']); |
| ... | ... | @@ -58,7 +65,8 @@ class KT_cmis_atom_service_helper { |
| 58 | 65 | // create entry |
| 59 | 66 | $entry = $response->newEntry(); |
| 60 | 67 | |
| 61 | - if ($method == 'POST') | |
| 68 | + // FIXME this maybe belongs in the response feed class only how? | |
| 69 | + if (($method == 'POST') || $pwc) | |
| 62 | 70 | { |
| 63 | 71 | // append attributes |
| 64 | 72 | $entry->appendChild($response->newAttr('xmlns', 'http://www.w3.org/2005/Atom')); |
| ... | ... | @@ -89,7 +97,7 @@ class KT_cmis_atom_service_helper { |
| 89 | 97 | // links |
| 90 | 98 | $link = $response->newElement('link'); |
| 91 | 99 | $link->appendChild($response->newAttr('rel', 'self')); |
| 92 | - $link->appendChild($response->newAttr('href', CMIS_APP_BASE_URI . $workspace . '/' . $type . '/' . $cmisEntry['properties']['ObjectId']['value'])); | |
| 100 | + $link->appendChild($response->newAttr('href', CMIS_APP_BASE_URI . $workspace . '/' . (!$pwc ? $type : 'pwc') . '/' . $cmisEntry['properties']['ObjectId']['value'])); | |
| 93 | 101 | $entry->appendChild($link); |
| 94 | 102 | |
| 95 | 103 | $link = $response->newElement('link'); | ... | ... |
webservice/classes/atompub/cmis/KT_cmis_atom_service.inc.php
| ... | ... | @@ -6,8 +6,9 @@ class KT_cmis_atom_service extends KT_atom_service { |
| 6 | 6 | |
| 7 | 7 | // override and extend as needed |
| 8 | 8 | |
| 9 | + protected $serviceType = null; | |
| 9 | 10 | protected $contentDownload = false; |
| 10 | - | |
| 11 | + | |
| 11 | 12 | public public function isContentDownload() |
| 12 | 13 | { |
| 13 | 14 | return $this->contentDownload; |
| ... | ... | @@ -23,6 +24,11 @@ class KT_cmis_atom_service extends KT_atom_service { |
| 23 | 24 | return $this->output; |
| 24 | 25 | } |
| 25 | 26 | |
| 27 | + public function getServiceType() | |
| 28 | + { | |
| 29 | + return $this->serviceType; | |
| 30 | + } | |
| 31 | + | |
| 26 | 32 | protected function setHeader($header = null, $value = null) |
| 27 | 33 | { |
| 28 | 34 | if ($header) header($header . ': ' . $value); | ... | ... |
webservice/classes/atompub/cmis/VersioningService.inc.php
| ... | ... | @@ -72,6 +72,30 @@ class VersioningService extends KTVersioningService { |
| 72 | 72 | return new PEAR_Error($result['message']); |
| 73 | 73 | } |
| 74 | 74 | } |
| 75 | + | |
| 76 | + /** | |
| 77 | + * Checks in a checked out document | |
| 78 | + * | |
| 79 | + * @param string $repositoryId | |
| 80 | + * @param string $documentId | |
| 81 | + * @param boolean $major | |
| 82 | + * @param string $changeToken [optional] | |
| 83 | + * @param array $properties [optional] | |
| 84 | + * @param contentStream $contentStream [optional] | |
| 85 | + * @param string $checkinComment [optional] | |
| 86 | + * @return string $documentId | |
| 87 | + */ | |
| 88 | + public function checkIn($repositoryId, $documentId, $major, $changeToken = '', $properties = array(), $contentStream = null, $checkinComment = '') | |
| 89 | + { | |
| 90 | + $result = parent::checkIn($repositoryId, $documentId, $major, $changeToken, $properties, $contentStream, $checkinComment); | |
| 91 | + | |
| 92 | + if ($result['status_code'] == 0) { | |
| 93 | + return $result['results']; | |
| 94 | + } | |
| 95 | + else { | |
| 96 | + return new PEAR_Error($result['message']); | |
| 97 | + } | |
| 98 | + } | |
| 75 | 99 | |
| 76 | 100 | } |
| 77 | 101 | ... | ... |