Commit 1de29d078e9b3a84d2f836846a7e12c6b5547d93

Authored by Paul Barrett
1 parent e5942d35

Removed unwanted parent link in CMIS object properties response for the root folder

KTS-4447. CMIS folder properties for root folder should not include a link to the parent

Fixed

Committed by: Paul Barrett

Reviewed by: Jarrett Jordaan
lib/api/ktcmis/classes/CMISRepository.inc.php
@@ -61,7 +61,7 @@ class CMISRepository { @@ -61,7 +61,7 @@ class CMISRepository {
61 */ 61 */
62 private $objectTypes; 62 private $objectTypes;
63 63
64 - function CMISRepository($repositoryId, $config = null) 64 + function __construct($repositoryId, $config = null)
65 { 65 {
66 $this->repositoryId = $repositoryId; 66 $this->repositoryId = $repositoryId;
67 $this->RepositoryInfo = new CMISRepositoryInfo(); 67 $this->RepositoryInfo = new CMISRepositoryInfo();
@@ -94,6 +94,9 @@ class CMISRepository { @@ -94,6 +94,9 @@ class CMISRepository {
94 // set info 94 // set info
95 foreach($config->repositoryInfo[0] as $field => $value) 95 foreach($config->repositoryInfo[0] as $field => $value)
96 { 96 {
  97 +// if ($field == 'rootFolderId') {
  98 +// $value = CMISUtil::encodeObjectId(FOLDER, $value);
  99 +// }
97 $this->setRepositoryInfoField($field, (string)$value); 100 $this->setRepositoryInfoField($field, (string)$value);
98 } 101 }
99 102
lib/api/ktcmis/util/CMISUtil.inc.php
@@ -178,14 +178,14 @@ class CMISUtil { @@ -178,14 +178,14 @@ class CMISUtil {
178 // if sub-array 178 // if sub-array
179 if (count($object['items']) > 0) 179 if (count($object['items']) > 0)
180 { 180 {
181 - $CMISArray[$count]['items'] = CMISUtil::createChildObjectHierarchy($object['items'], $repositoryURI, $ktapi); 181 + $CMISArray[$count]['items'] = self::createChildObjectHierarchy($object['items'], $repositoryURI, $ktapi);
182 } 182 }
183 } 183 }
184 else 184 else
185 { 185 {
186 // NOTE why is this necessary? That's what you get for not commenting it at the time 186 // NOTE why is this necessary? That's what you get for not commenting it at the time
187 // TODO comment this properly 187 // TODO comment this properly
188 - $CMISArray[$count] = CMISUtil::createChildObjectHierarchy($object, $repositoryURI, $ktapi); 188 + $CMISArray[$count] = self::createChildObjectHierarchy($object, $repositoryURI, $ktapi);
189 } 189 }
190 } 190 }
191 } 191 }
@@ -222,7 +222,7 @@ class CMISUtil { @@ -222,7 +222,7 @@ class CMISUtil {
222 // if more parent elements 222 // if more parent elements
223 if (count($input) > 0) 223 if (count($input) > 0)
224 { 224 {
225 - $CMISElement['items'] = CMISUtil::createParentObjectHierarchy($input, $repositoryURI, $ktapi); 225 + $CMISElement['items'] = self::createParentObjectHierarchy($input, $repositoryURI, $ktapi);
226 } 226 }
227 227
228 $CMISArray[] = $CMISElement; 228 $CMISArray[] = $CMISElement;
@@ -252,7 +252,7 @@ class CMISUtil { @@ -252,7 +252,7 @@ class CMISUtil {
252 $object = $entry['object']; 252 $object = $entry['object'];
253 $properties = $object->getProperties(); 253 $properties = $object->getProperties();
254 254
255 - $hierarchy[$key] = CMISUtil::createObjectPropertiesEntry($properties); 255 + $hierarchy[$key] = self::createObjectPropertiesEntry($properties);
256 } 256 }
257 257
258 return $hierarchy; 258 return $hierarchy;
@@ -293,7 +293,7 @@ class CMISUtil { @@ -293,7 +293,7 @@ class CMISUtil {
293 'value' => $properties->getValue('Name')); 293 'value' => $properties->getValue('Name'));
294 294
295 $object['properties']['ParentId'] = array('type' => $properties->getFieldType('ParentId'), 295 $object['properties']['ParentId'] = array('type' => $properties->getFieldType('ParentId'),
296 - 'value' => CMISUtil::encodeObjectId('Folder', 296 + 'value' => self::encodeObjectId('Folder',
297 $properties->getValue('ParentId'))); 297 $properties->getValue('ParentId')));
298 298
299 $object['properties']['Uri'] = array('type' => $properties->getFieldType('Uri'), 299 $object['properties']['Uri'] = array('type' => $properties->getFieldType('Uri'),
@@ -350,7 +350,7 @@ class CMISUtil { @@ -350,7 +350,7 @@ class CMISUtil {
350 /* 350 /*
351 // if we have found a child/parent with one or more children/parents, recurse into the child/parent object 351 // if we have found a child/parent with one or more children/parents, recurse into the child/parent object
352 if (count($entry['items']) > 0) { 352 if (count($entry['items']) > 0) {
353 - $object[$linkText] = CMISUtil::decodeObjectHierarchy($entry['items'], $linkText); 353 + $object[$linkText] = self::decodeObjectHierarchy($entry['items'], $linkText);
354 } 354 }
355 // NOTE may need to set a null value here in case webservices don't like it unset 355 // NOTE may need to set a null value here in case webservices don't like it unset
356 // so we'll set it just in case... 356 // so we'll set it just in case...
@@ -602,7 +602,7 @@ class CMISUtil { @@ -602,7 +602,7 @@ class CMISUtil {
602 // TODO consider checking whether content is encoded (currently we expect encoded) 602 // TODO consider checking whether content is encoded (currently we expect encoded)
603 // TODO choose between this and the alternative decode function (see CMISUtil class) 603 // TODO choose between this and the alternative decode function (see CMISUtil class)
604 // this will require some basic benchmarking 604 // this will require some basic benchmarking
605 - $contentStream = CMISUtil::decodeChunkedContentStream($contentStream); 605 + $contentStream = self::decodeChunkedContentStream($contentStream);
606 606
607 // NOTE There is a function in CMISUtil to do this, written for the unit tests but since KTUploadManager exists 607 // NOTE There is a function in CMISUtil to do this, written for the unit tests but since KTUploadManager exists
608 // and has more functionality which could come in useful at some point I decided to go with that instead 608 // and has more functionality which could come in useful at some point I decided to go with that instead
@@ -613,6 +613,22 @@ class CMISUtil { @@ -613,6 +613,22 @@ class CMISUtil {
613 613
614 return $tempfilename; 614 return $tempfilename;
615 } 615 }
  616 +
  617 + static public function getIdFromName($name, &$ktapi)
  618 + {
  619 + $folder = $ktapi->get_folder_by_name($name);
  620 +
  621 + return self::encodeObjectId(FOLDER, $folder->get_folderid());
  622 + }
  623 +
  624 + static public function isRootFolder($repositoryId, $folderId, &$ktapi)
  625 + {
  626 + $repository = new CMISRepository($repositoryId);
  627 + $repositoryInfo = $repository->getRepositoryInfo();
  628 + $rootFolder = self::getIdFromName($repositoryInfo->getRootFolderId(), $ktapi);
  629 +
  630 + return $folderId == $rootFolder;
  631 + }
616 632
617 } 633 }
618 634
webservice/atompub/cmis/KT_cmis_atom_server.services.inc.php
@@ -54,11 +54,9 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service { @@ -54,11 +54,9 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service {
54 * This includes children and tree/descendant listings as well as individual folder retrieval 54 * This includes children and tree/descendant listings as well as individual folder retrieval
55 */ 55 */
56 public function GET_action() 56 public function GET_action()
57 - {  
58 - $RepositoryService = new RepositoryService();  
59 - $repositories = $RepositoryService->getRepositories();  
60 - $repositoryId = $repositories[0]['repositoryId'];  
61 - 57 + {
  58 + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService);
  59 +
62 // TODO implement full path/node separation as with Alfresco - i.e. path requests come in on path/ and node requests come in on node/ 60 // TODO implement full path/node separation as with Alfresco - i.e. path requests come in on path/ and node requests come in on node/
63 // path request e.g.: path/Root Folder/DroppedDocuments 61 // path request e.g.: path/Root Folder/DroppedDocuments
64 // node request e.g.: node/F1/children 62 // node request e.g.: node/F1/children
@@ -134,9 +132,7 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service { @@ -134,9 +132,7 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service {
134 */ 132 */
135 public function POST_action() 133 public function POST_action()
136 { 134 {
137 - $RepositoryService = new RepositoryService();  
138 - $repositories = $RepositoryService->getRepositories();  
139 - $repositoryId = $repositories[0]['repositoryId']; 135 + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService);
140 136
141 // set default action, objectId and typeId 137 // set default action, objectId and typeId
142 $action = 'create'; 138 $action = 'create';
@@ -246,12 +242,10 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service { @@ -246,12 +242,10 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service {
246 // we COULD call deleteObject but when we delete a folder we expect to be trying to delete 242 // we COULD call deleteObject but when we delete a folder we expect to be trying to delete
247 // the folder and all content. 243 // the folder and all content.
248 244
249 - $RepositoryService = new RepositoryService(); 245 + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService);
  246 +
250 $ObjectService = new ObjectService(KT_cmis_atom_service_helper::getKt()); 247 $ObjectService = new ObjectService(KT_cmis_atom_service_helper::getKt());
251 248
252 - $repositories = $RepositoryService->getRepositories();  
253 - $repositoryId = $repositories[0]['repositoryId'];  
254 -  
255 // attempt delete 249 // attempt delete
256 $response = $ObjectService->deleteTree($repositoryId, $this->params[0]); 250 $response = $ObjectService->deleteTree($repositoryId, $this->params[0]);
257 251
@@ -369,12 +363,10 @@ class KT_cmis_atom_service_document extends KT_cmis_atom_service { @@ -369,12 +363,10 @@ class KT_cmis_atom_service_document extends KT_cmis_atom_service {
369 */ 363 */
370 public function GET_action() 364 public function GET_action()
371 { 365 {
372 - $RepositoryService = new RepositoryService(); 366 + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService);
  367 +
373 $ObjectService = new ObjectService(KT_cmis_atom_service_helper::getKt()); 368 $ObjectService = new ObjectService(KT_cmis_atom_service_helper::getKt());
374 369
375 - $repositories = $RepositoryService->getRepositories();  
376 - $repositoryId = $repositories[0]['repositoryId'];  
377 -  
378 $objectId = $this->params[0]; 370 $objectId = $this->params[0];
379 371
380 // TODO this is "parents" in later versions of the specification 372 // TODO this is "parents" in later versions of the specification
@@ -422,12 +414,10 @@ class KT_cmis_atom_service_document extends KT_cmis_atom_service { @@ -422,12 +414,10 @@ class KT_cmis_atom_service_document extends KT_cmis_atom_service {
422 // NOTE due to the way KnowledgeTree works with documents this is always going to call deleteAllVersions. 414 // NOTE due to the way KnowledgeTree works with documents this is always going to call deleteAllVersions.
423 // we do not have support for deleting only specific versions (this may be added in the future.) 415 // we do not have support for deleting only specific versions (this may be added in the future.)
424 416
425 - $RepositoryService = new RepositoryService(); 417 + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService);
  418 +
426 $VersioningService = new VersioningService(KT_cmis_atom_service_helper::getKt()); 419 $VersioningService = new VersioningService(KT_cmis_atom_service_helper::getKt());
427 420
428 - $repositories = $RepositoryService->getRepositories();  
429 - $repositoryId = $repositories[0]['repositoryId'];  
430 -  
431 // attempt delete 421 // attempt delete
432 $response = $VersioningService->deleteAllVersions($repositoryId, $this->params[0]); 422 $response = $VersioningService->deleteAllVersions($repositoryId, $this->params[0]);
433 423
@@ -456,12 +446,10 @@ class KT_cmis_atom_service_pwc extends KT_cmis_atom_service { @@ -456,12 +446,10 @@ class KT_cmis_atom_service_pwc extends KT_cmis_atom_service {
456 */ 446 */
457 public function GET_action() 447 public function GET_action()
458 { 448 {
459 - $RepositoryService = new RepositoryService(); 449 + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService);
  450 +
460 $ObjectService = new ObjectService(KT_cmis_atom_service_helper::getKt()); 451 $ObjectService = new ObjectService(KT_cmis_atom_service_helper::getKt());
461 452
462 - $repositories = $RepositoryService->getRepositories();  
463 - $repositoryId = $repositories[0]['repositoryId'];  
464 -  
465 // determine whether we want the Private Working Copy entry feed or the actual physical Private Working Copy content. 453 // determine whether we want the Private Working Copy entry feed or the actual physical Private Working Copy content.
466 // this depends on $this->params[1] 454 // this depends on $this->params[1]
467 if (!empty($this->params[1])) 455 if (!empty($this->params[1]))
@@ -486,12 +474,11 @@ class KT_cmis_atom_service_pwc extends KT_cmis_atom_service { @@ -486,12 +474,11 @@ class KT_cmis_atom_service_pwc extends KT_cmis_atom_service {
486 public function DELETE_action() 474 public function DELETE_action()
487 { 475 {
488 // call the cancel checkout function 476 // call the cancel checkout function
489 - $RepositoryService = new RepositoryService(); 477 +
  478 + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService);
  479 +
490 $VersioningService = new VersioningService(KT_cmis_atom_service_helper::getKt()); 480 $VersioningService = new VersioningService(KT_cmis_atom_service_helper::getKt());
491 481
492 - $repositories = $RepositoryService->getRepositories();  
493 - $repositoryId = $repositories[0]['repositoryId'];  
494 -  
495 $response = $VersioningService->cancelCheckout($repositoryId, $this->params[0]); 482 $response = $VersioningService->cancelCheckout($repositoryId, $this->params[0]);
496 483
497 if (PEAR::isError($response)) 484 if (PEAR::isError($response))
@@ -508,13 +495,11 @@ class KT_cmis_atom_service_pwc extends KT_cmis_atom_service { @@ -508,13 +495,11 @@ class KT_cmis_atom_service_pwc extends KT_cmis_atom_service {
508 495
509 public function PUT_action() 496 public function PUT_action()
510 { 497 {
511 - $RepositoryService = new RepositoryService(); 498 + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService);
  499 +
512 $VersioningService = new VersioningService(KT_cmis_atom_service_helper::getKt()); 500 $VersioningService = new VersioningService(KT_cmis_atom_service_helper::getKt());
513 $ObjectService = new ObjectService(KT_cmis_atom_service_helper::getKt()); 501 $ObjectService = new ObjectService(KT_cmis_atom_service_helper::getKt());
514 502
515 - $repositories = $RepositoryService->getRepositories();  
516 - $repositoryId = $repositories[0]['repositoryId'];  
517 -  
518 // check for content stream 503 // check for content stream
519 // NOTE this is a hack! will not work with CMISSpaces at least, probably not with any client except RestTest and similar 504 // NOTE this is a hack! will not work with CMISSpaces at least, probably not with any client except RestTest and similar
520 // where we can manually modify the input 505 // where we can manually modify the input
@@ -573,12 +558,10 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service { @@ -573,12 +558,10 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service {
573 */ 558 */
574 public function GET_action() 559 public function GET_action()
575 { 560 {
576 - $RepositoryService = new RepositoryService(); 561 + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService);
  562 +
577 $NavigationService = new NavigationService(KT_cmis_atom_service_helper::getKt()); 563 $NavigationService = new NavigationService(KT_cmis_atom_service_helper::getKt());
578 564
579 - $repositories = $RepositoryService->getRepositories();  
580 - $repositoryId = $repositories[0]['repositoryId'];  
581 -  
582 $checkedout = $NavigationService->getCheckedOutDocs($repositoryId); 565 $checkedout = $NavigationService->getCheckedOutDocs($repositoryId);
583 566
584 //Create a new response feed 567 //Create a new response feed
@@ -631,13 +614,11 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service { @@ -631,13 +614,11 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service {
631 614
632 public function POST_action() 615 public function POST_action()
633 { 616 {
634 - $RepositoryService = new RepositoryService(); 617 + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService);
  618 +
635 $VersioningService = new VersioningService(KT_cmis_atom_service_helper::getKt()); 619 $VersioningService = new VersioningService(KT_cmis_atom_service_helper::getKt());
636 $ObjectService = new ObjectService(KT_cmis_atom_service_helper::getKt()); 620 $ObjectService = new ObjectService(KT_cmis_atom_service_helper::getKt());
637 621
638 - $repositories = $RepositoryService->getRepositories();  
639 - $repositoryId = $repositories[0]['repositoryId'];  
640 -  
641 $cmisObjectProperties = KT_cmis_atom_service_helper::getCmisProperties($this->parsedXMLContent['@children']); 622 $cmisObjectProperties = KT_cmis_atom_service_helper::getCmisProperties($this->parsedXMLContent['@children']);
642 623
643 // check for existing object id as property of submitted object data 624 // check for existing object id as property of submitted object data
@@ -676,8 +657,7 @@ class KT_cmis_atom_service_types extends KT_cmis_atom_service { @@ -676,8 +657,7 @@ class KT_cmis_atom_service_types extends KT_cmis_atom_service {
676 public function GET_action() 657 public function GET_action()
677 { 658 {
678 $RepositoryService = new RepositoryService(); 659 $RepositoryService = new RepositoryService();
679 - $repositories = $RepositoryService->getRepositories();  
680 - $repositoryId = $repositories[0]['repositoryId']; 660 + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService);
681 661
682 $types = $RepositoryService->getTypes($repositoryId); 662 $types = $RepositoryService->getTypes($repositoryId);
683 $type = ((empty($this->params[0])) ? 'all' : $this->params[0]); 663 $type = ((empty($this->params[0])) ? 'all' : $this->params[0]);
@@ -697,10 +677,7 @@ class KT_cmis_atom_service_type extends KT_cmis_atom_service { @@ -697,10 +677,7 @@ class KT_cmis_atom_service_type extends KT_cmis_atom_service {
697 public function GET_action() 677 public function GET_action()
698 { 678 {
699 $RepositoryService = new RepositoryService(); 679 $RepositoryService = new RepositoryService();
700 -  
701 - // fetch repository id  
702 - $repositories = $RepositoryService->getRepositories();  
703 - $repositoryId = $repositories[0]['repositoryId']; 680 + $repositoryId = KT_cmis_atom_service_helper::getRepositoryId($RepositoryService);
704 681
705 if (!isset($this->params[1])) { 682 if (!isset($this->params[1])) {
706 // For easier return in the wanted format, we call getTypes instead of getTypeDefinition. 683 // For easier return in the wanted format, we call getTypes instead of getTypeDefinition.
webservice/atompub/cmis/KT_cmis_atom_service_helper.inc.php
1 <?php 1 <?php
2 2
  3 +// initialise ktapi instance
  4 +KT_cmis_atom_service_helper::$ktapi = KT_cmis_atom_service_helper::getKt();
  5 +
3 class KT_cmis_atom_service_helper { 6 class KT_cmis_atom_service_helper {
4 7
5 - protected static $kt = null; 8 + public static $ktapi = null;
  9 + public static $repositoryId = null;
  10 +
  11 + /**
  12 + * Helper function to set internal repository id
  13 + *
  14 + * @param object $RepositoryService
  15 + */
  16 + static public function setRepositoryId(&$RepositoryService = null)
  17 + {
  18 + if (is_null($RepositoryService)) {
  19 + $RepositoryService = new RepositoryService();
  20 + }
  21 +
  22 + $repositories = $RepositoryService->getRepositories();
  23 +
  24 + // TODO handle multiple repositories
  25 + self::$repositoryId = $repositories[0]['repositoryId'];
  26 + }
  27 +
  28 + /**
  29 + * Helper function to fetch internal repository id
  30 + *
  31 + * Calls set function automatically, use $set = false to prevent this and return the current setting, if any
  32 + *
  33 + * NOTE the function will automatically call the setRepositoryId function if no previous repository id was set
  34 + *
  35 + * @param object $RepositoryService
  36 + * @param boolean $RepositoryService
  37 + * @return string
  38 + */
  39 + static public function getRepositoryId(&$RepositoryService = null, $set = true)
  40 + {
  41 + if (empty(self::$repositoryId) || $set) {
  42 + self::setRepositoryId($RepositoryService);
  43 + }
  44 +
  45 + return self::$repositoryId;
  46 + }
6 47
7 /** 48 /**
8 * Retrieves data about a specific folder OR document within a folder 49 * Retrieves data about a specific folder OR document within a folder
@@ -14,6 +55,8 @@ class KT_cmis_atom_service_helper { @@ -14,6 +55,8 @@ class KT_cmis_atom_service_helper {
14 */ 55 */
15 static public function getObjectFeed(&$service, $ObjectService, $repositoryId, $objectId, $method = 'GET') 56 static public function getObjectFeed(&$service, $ObjectService, $repositoryId, $objectId, $method = 'GET')
16 { 57 {
  58 + self::$repositoryId = $repositoryId;
  59 +
17 $serviceType = $service->getServiceType(); 60 $serviceType = $service->getServiceType();
18 $response = $ObjectService->getProperties($repositoryId, $objectId, false, false); 61 $response = $ObjectService->getProperties($repositoryId, $objectId, false, false);
19 62
@@ -58,7 +101,7 @@ class KT_cmis_atom_service_helper { @@ -58,7 +101,7 @@ class KT_cmis_atom_service_helper {
58 * @param string $parent The parent folder 101 * @param string $parent The parent folder
59 */ 102 */
60 static public function createObjectEntry(&$response, $cmisEntry, $parent, $pwc = false, $method = 'GET') 103 static public function createObjectEntry(&$response, $cmisEntry, $parent, $pwc = false, $method = 'GET')
61 - { 104 + {
62 $workspace = $response->getWorkspace(); 105 $workspace = $response->getWorkspace();
63 $type = strtolower($cmisEntry['properties']['ObjectTypeId']['value']); 106 $type = strtolower($cmisEntry['properties']['ObjectTypeId']['value']);
64 107
@@ -143,13 +186,19 @@ class KT_cmis_atom_service_helper { @@ -143,13 +186,19 @@ class KT_cmis_atom_service_helper {
143 . $cmisEntry['properties']['ObjectId']['value'] . '/rels')); 186 . $cmisEntry['properties']['ObjectId']['value'] . '/rels'));
144 $entry->appendChild($link); 187 $entry->appendChild($link);
145 188
146 - // TODO check parent link is correct, fix if needed  
147 - // TODO leave out if at root folder  
148 - $link = $response->newElement('link');  
149 - $link->appendChild($response->newAttr('rel', 'parents'));  
150 - $link->appendChild($response->newAttr('href', CMIS_APP_BASE_URI . $workspace . '/folder/'  
151 - . $cmisEntry['properties']['ObjectId']['value'] . '/parent'));  
152 - $entry->appendChild($link); 189 + // if there is no parent or parent is 0, do not add the parent link
  190 + // also if this is specifically the root folder, do not add the parent link
  191 +// if (!empty($cmisEntry['properties']['ParentId']['value']) && !CMISUtil::isRootFolder(self::$repositoryId, $cmisEntry['properties']['ObjectId']['value']))
  192 +
  193 + if (!CMISUtil::isRootFolder(self::$repositoryId, $cmisEntry['properties']['ObjectId']['value'], self::$ktapi))
  194 + {
  195 + // TODO check parent link is correct, fix if needed
  196 + $link = $response->newElement('link');
  197 + $link->appendChild($response->newAttr('rel', 'parents'));
  198 + $link->appendChild($response->newAttr('href', CMIS_APP_BASE_URI . $workspace . '/folder/'
  199 + . $cmisEntry['properties']['ObjectId']['value'] . '/parent'));
  200 + $entry->appendChild($link);
  201 + }
153 202
154 // Folder/Document specific links 203 // Folder/Document specific links
155 if (strtolower($cmisEntry['properties']['ObjectTypeId']['value']) == 'folder') 204 if (strtolower($cmisEntry['properties']['ObjectTypeId']['value']) == 'folder')
@@ -480,12 +529,12 @@ class KT_cmis_atom_service_helper { @@ -480,12 +529,12 @@ class KT_cmis_atom_service_helper {
480 */ 529 */
481 public static function getKt() 530 public static function getKt()
482 { 531 {
483 - if(!isset(self::$kt)) 532 + if(!isset(self::$ktapi))
484 { 533 {
485 - self::$kt = new KTAPI();  
486 - self::$kt->get_active_session(session_id()); 534 + self::$ktapi = new KTAPI();
  535 + self::$ktapi->get_active_session(session_id());
487 } 536 }
488 - return self::$kt; 537 + return self::$ktapi;
489 } 538 }
490 539
491 // TODO adjust for time zones? 540 // TODO adjust for time zones?