diff --git a/webservice/atompub/cmis/KT_cmis_atom_server.services.inc.php b/webservice/atompub/cmis/KT_cmis_atom_server.services.inc.php index 8b396e5..28b2e14 100644 --- a/webservice/atompub/cmis/KT_cmis_atom_server.services.inc.php +++ b/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 { $objectId = $this->params[2]; } - $cmisObjectProperties = KT_cmis_atom_service_helper::getCmisProperties($this->parsedXMLContent['@children']['cmis:object'] - [0]['@children']['cmis:properties'] - [0]['@children']); + $cmisObjectProperties = KT_cmis_atom_service_helper::getCmisProperties($this->parsedXMLContent['@children']['cmis:object']); // check for existing object id as property of submitted object data if (!empty($cmisObjectProperties['ObjectId'])) @@ -487,6 +485,85 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service { //Expose the responseFeed $this->responseFeed = $feed; } + + public function POST_action() + { + $RepositoryService = new RepositoryService(); + $VersioningService = new VersioningService(KT_cmis_atom_service_helper::getKt()); + $ObjectService = new ObjectService(KT_cmis_atom_service_helper::getKt()); + + $repositories = $RepositoryService->getRepositories(); + $repositoryId = $repositories[0]['repositoryId']; + + $cmisObjectProperties = KT_cmis_atom_service_helper::getCmisProperties($this->parsedXMLContent['@children']['cmis:object']); + + // check for existing object id as property of submitted object data + if (empty($cmisObjectProperties['ObjectId'])) + { + $feed = KT_cmis_atom_service_helper::getErrorFeed($this, self::STATUS_SERVER_ERROR, 'No object was specified for checkout'); + //Expose the responseFeed + $this->responseFeed = $feed; + return null; + } + + $response = $VersioningService->checkOut($repositoryId, $cmisObjectProperties['ObjectId']); + + if (PEAR::isError($response)) + { + $feed = KT_cmis_atom_service_helper::getErrorFeed($this, self::STATUS_SERVER_ERROR, 'No object was specified for checkout'); + //Expose the responseFeed + $this->responseFeed = $feed; + return null; + } + + $this->setStatus(self::STATUS_CREATED); + $feed = KT_cmis_atom_service_helper::getObjectFeed($this, $ObjectService, $repositoryId, $cmisObjectProperties['ObjectId'], 'POST'); +// $feed = KT_cmis_atom_service_helper::getObjectFeed($this, $ObjectService, $repositoryId, $newObjectId, 'POST'); + + //Expose the responseFeed + $this->responseFeed = $feed; + +// $checkedout = $NavigationService->getCheckedoutDocs($repositoryId); +// +// //Create a new response feed +// $feed = new KT_cmis_atom_responseFeed_GET(CMIS_APP_BASE_URI); +// +// $feed->newField('title', 'Checked out Documents', $feed); +// +// // TODO dynamic? +// $feedElement = $feed->newField('author'); +// $element = $feed->newField('name', 'admin', $feedElement); +// $feed->appendChild($feedElement); +// +// $feed->appendChild($feed->newElement('id', 'urn:uuid:checkedout')); +// +// // TODO get actual most recent update time, only use current if no other available +// $feed->appendChild($feed->newElement('updated', KT_cmis_atom_service_helper::formatDatestamp())); +// +// foreach($checkedout as $document) +// { +// $entry = $feed->newEntry(); +// $objectElement = $feed->newElement('cmis:object'); +// $propertiesElement = $feed->newElement('cmis:properties'); +// +// foreach($cmisEntry['properties'] as $propertyName => $property) +// { +// $propElement = $feed->newElement('cmis:' . $property['type']); +// $propElement->appendChild($feed->newAttr('cmis:name', $propertyName)); +// $feed->newField('cmis:value', CMISUtil::boolToString($property['value']), $propElement); +// $propertiesElement->appendChild($propElement); +// } +// +// $objectElement->appendChild($propertiesElement); +// $entry->appendChild($objectElement); +// } +// +// $entry = null; +// $feed->newField('cmis:hasMoreItems', 'false', $entry, true); +// +// //Expose the responseFeed +// $this->responseFeed = $feed; + } } diff --git a/webservice/atompub/cmis/KT_cmis_atom_service_helper.inc.php b/webservice/atompub/cmis/KT_cmis_atom_service_helper.inc.php index 38e931e..9d1b88a 100644 --- a/webservice/atompub/cmis/KT_cmis_atom_service_helper.inc.php +++ b/webservice/atompub/cmis/KT_cmis_atom_service_helper.inc.php @@ -28,6 +28,7 @@ class KT_cmis_atom_service_helper { $response->newField('title', $cmisEntry['properties']['ObjectTypeId']['value'], $response); $response->newField('id', 'urn:uuid:' . $cmisEntry['properties']['ObjectId']['value'], $response); } + // POST responses only send back an entry, not a feed else if ($method == 'POST') { $response = new KT_cmis_atom_response_POST(CMIS_APP_BASE_URI); } @@ -414,11 +415,20 @@ class KT_cmis_atom_service_helper { { $properties = array(); - foreach($xmlArray as $cmisPropertyDefinition) + foreach($xmlArray as $xmlElement) { - foreach($cmisPropertyDefinition as $propertyType => $propertyDefinition) + foreach($xmlElement['@children'] as $key => $childElement) { - $properties[$propertyDefinition['@attributes']['cmis:name']] = $propertyDefinition['@children']['cmis:value'][0]['@value']; + if ($key == 'cmis:properties') + { + foreach($childElement[0]['@children'] as $cmisPropertyDefinition) + { + foreach($cmisPropertyDefinition as $propertyType => $propertyDefinition) + { + $properties[$propertyDefinition['@attributes']['cmis:name']] = $propertyDefinition['@children']['cmis:value'][0]['@value']; + } + } + } } } diff --git a/webservice/classes/atompub/cmis/VersioningService.inc.php b/webservice/classes/atompub/cmis/VersioningService.inc.php index 6a2c3aa..04951c7 100644 --- a/webservice/classes/atompub/cmis/VersioningService.inc.php +++ b/webservice/classes/atompub/cmis/VersioningService.inc.php @@ -27,6 +27,27 @@ class VersioningService extends KTVersioningService { return new PEAR_Error($result['message']); } } + + /** + * Checks out a document and creates the PWC (Private Working Copy) which will represent the checked out document + * + * @param string $repositoryId + * @param string $documentId + * @param string $changeToken [optional] + * @return array results + */ + // TODO set up delivery of content stream? or is that up to the CMIS client? + public function checkOut($repositoryId, $documentId, $changeToken = '') + { + $result = parent::checkOut($repositoryId, $documentId, $changeToken); + + if ($result['status_code'] == 0) { + return $result['results']; + } + else { + return new PEAR_Error($result['message']); + } + } }