Commit fa3eed7c2edc89ac75ff3f38daea92dfb05a2fb3

Authored by Paul Barrett
1 parent 315d6be7

Fixed Drupal browsing and breadcrumb trail to work with single folder id browse structure

Committed by: Paul Barrett
lib/api/ktcmis/ktcmis.inc.php
... ... @@ -64,24 +64,12 @@ class KTCMISBase {
64 64  
65 65 // we want all child classes to share the ktapi and session instances, no matter where they are set from,
66 66 // so we declare them as static
67   - /**
68   - * KnowledgeTree API instance
69   - *
70   - * @var object
71   - */
72 67 static protected $ktapi;
73   - /**
74   - * KnowledgeTree API Session Identifier
75   - *
76   - * @var object
77   - */
78 68 static protected $session;
79 69  
80 70 // TODO try to pick up existing session if possible, i.e. if the $session value is not empty
81 71 public function startSession($username, $password)
82 72 {
83   - self::$session = null;
84   -
85 73 if (is_null(self::$session))
86 74 {
87 75 self::$ktapi = new KTAPI();
... ... @@ -90,11 +78,18 @@ class KTCMISBase {
90 78 else
91 79 {
92 80 // add session restart code here
  81 + self::$session =& self::$ktapi->get_active_session(self::$session->get_sessionid());
93 82 }
94   -//var_dump(self::$ktapi);
  83 +
  84 + //var_dump(self::$ktapi);
95 85 return self::$session;
96 86 }
97 87  
  88 + public function getInterface()
  89 + {
  90 + return self::$ktapi;
  91 + }
  92 +
98 93 // TODO what about destroying sessions? only on logout (which is not offered by the CMIS clients tested so far)
99 94 }
100 95  
... ... @@ -255,9 +250,10 @@ class KTNavigationService extends KTCMISBase {
255 250 {
256 251 parent::startSession($username, $password);
257 252 $this->setInterface();
  253 + return self::$session;
258 254 }
259 255  
260   - function setInterface()
  256 + public function setInterface()
261 257 {
262 258 $this->NavigationService->setInterface(self::$ktapi);
263 259 }
... ... @@ -441,16 +437,16 @@ class KTObjectService extends KTCMISBase {
441 437 // instantiate underlying CMIS service
442 438 $this->ObjectService = new CMISObjectService();
443 439 }
444   -
  440 +
445 441 public function startSession($username, $password)
446 442 {
447 443 parent::startSession($username, $password);
448 444 $this->setInterface();
  445 + return self::$session;
449 446 }
450 447  
451   - function setInterface()
  448 + public function setInterface()
452 449 {
453   -// var_dump(self::$ktapi);
454 450 $this->ObjectService->setInterface(self::$ktapi);
455 451 }
456 452  
... ...
webservice/atompub/cmis/KT_cmis_atom_server.services.inc.php
... ... @@ -24,23 +24,31 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service
24 24 $repositoryId = $repositories[0]['repositoryId'];
25 25 //var_dump($RepositoryService->ktapi);
26 26 // $folderId = $this->getFolderData();
  27 +
27 28 if (urldecode($this->params[0]) == 'Root Folder')
28 29 {
29 30 $folderId = CMISUtil::encodeObjectId('Folder', 1);
30 31 $folderName = urldecode($this->params[0]);
31 32 }
  33 + // this is a bit of a hack, but then it's to accomodate a bit of a hack to work with the knowledgetree/drupal cmis modules...
  34 + else if ($this->params[0] == 'path')
  35 + {
  36 + $ktapi =& $RepositoryService->getInterface();
  37 + $folderId = KT_cmis_atom_service_helper::getFolderId($this->params, $ktapi);
  38 +// echo "DA FOLDER ID IS $folderId<BR>";
  39 + }
32 40 else
33 41 {
34 42 $folderId = $this->params[0];
35   - // get folder name from id, using the ObjectService methods
36   - $ObjectService = new ObjectService();
37   -// var_dump($ObjectService->ktapi);
38   - $ObjectService->setInterface();
39   - $cmisProps = $ObjectService->getProperties($repositoryId, $folderId, false, false);
40   -// var_dump($cmisObject);
41   -// $props = $cmisObject->getProperties();
42   -// var_dump($props);
43   - $folderName = $cmisProps['properties']['Name']['value'];
  43 +// // get folder name from id, using the ObjectService methods
  44 +// $ObjectService = new ObjectService();
  45 +//// var_dump($ObjectService->ktapi);
  46 +// $ObjectService->setInterface();
  47 +// $cmisProps = $ObjectService->getProperties($repositoryId, $folderId, false, false);
  48 +//// var_dump($cmisObject);
  49 +//// $props = $cmisObject->getProperties();
  50 +//// var_dump($props);
  51 +// $folderName = $cmisProps['properties']['Name']['value'];
44 52 }
45 53  
46 54 $username = $password = 'admin';
... ... @@ -53,6 +61,7 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service
53 61 }
54 62 else
55 63 {
  64 +// echo "UHUHUHUHUH: $folderId<BR>\n";
56 65 $ObjectService = new ObjectService();
57 66 $ObjectService->startSession($username, $password);
58 67  
... ...
webservice/atompub/cmis/KT_cmis_atom_service_helper.inc.php
... ... @@ -23,43 +23,45 @@ class KT_cmis_atom_service_helper {
23 23  
24 24 $id = $cmisEntry['properties']['ObjectId']['value'];
25 25 $entry = $feed->newEntry();
26   - $feed->newField('id', $id, $entry);
  26 + $feed->newField('id', 'urn:uuid:' . $id, $entry);
27 27  
28 28 // links
  29 + // TODO check parent link is correct, fix if needed
29 30 $link = $feed->newElement('link');
30 31 $link->appendChild($feed->newAttr('rel','cmis-parent'));
31   - $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . 'folder/' . $path));
  32 + $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/folder/' . $path));
32 33 $entry->appendChild($link);
33 34  
34 35 if (strtolower($cmisEntry['properties']['ObjectTypeId']['value']) == 'folder')
35 36 {
  37 + // TODO check parent link is correct, fix if needed
36 38 $link = $feed->newElement('link');
37 39 $link->appendChild($feed->newAttr('rel','cmis-folderparent'));
38   - $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . 'folder/' . $path));
  40 + $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/folder/' . $path));
39 41 $entry->appendChild($link);
40 42 $link = $feed->newElement('link');
41 43 $link->appendChild($feed->newAttr('rel','cmis-children'));
42   - $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI
  44 + $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/'
43 45 . strtolower($cmisEntry['properties']['ObjectTypeId']['value'])
44   - . '/' . $path . '/' . urlencode($cmisEntry['properties']['Name']['value'])
  46 + . '/' . $path . '/' . rawurlencode($cmisEntry['properties']['Name']['value'])
45 47 . '/children'));
46 48 $entry->appendChild($link);
47 49 $link = $feed->newElement('link');
48 50 $link->appendChild($feed->newAttr('rel','cmis-descendants'));
49   - $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI
  51 + $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/'
50 52 . strtolower($cmisEntry['properties']['ObjectTypeId']['value'])
51   - . '/' . $path . '/' . urlencode($cmisEntry['properties']['Name']['value'])
  53 + . '/' . $path . '/' . rawurlencode($cmisEntry['properties']['Name']['value'])
52 54 . '/descendants'));
53 55 $entry->appendChild($link);
54 56 }
55 57  
56 58 $link = $feed->newElement('link');
57 59 $link->appendChild($feed->newAttr('rel','cmis-type'));
58   - $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . 'type/' . strtolower($cmisEntry['properties']['ObjectTypeId']['value'])));
  60 + $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/type/' . strtolower($cmisEntry['properties']['ObjectTypeId']['value'])));
59 61 $entry->appendChild($link);
60 62 $link = $feed->newElement('link');
61 63 $link->appendChild($feed->newAttr('rel','cmis-repository'));
62   - $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . 'servicedocument'));
  64 + $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/servicedocument'));
63 65 $entry->appendChild($link);
64 66 // end links
65 67  
... ... @@ -118,23 +120,23 @@ class KT_cmis_atom_service_helper {
118 120 // links
119 121 $link = $feed->newElement('link');
120 122 $link->appendChild($feed->newAttr('rel','self'));
121   - $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . 'type/' . strtolower($type['typeId'])));
  123 + $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/type/' . strtolower($type['typeId'])));
122 124 $entry->appendChild($link);
123 125 $link = $feed->newElement('link');
124 126 $link->appendChild($feed->newAttr('rel','cmis-type'));
125   - $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . 'type/' . strtolower($type['typeId'])));
  127 + $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/type/' . strtolower($type['typeId'])));
126 128 $entry->appendChild($link);
127 129 $link = $feed->newElement('link');
128 130 $link->appendChild($feed->newAttr('rel','cmis-children'));
129   - $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . 'type/' . strtolower($type['typeId']) . '/children'));
  131 + $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/type/' . strtolower($type['typeId']) . '/children'));
130 132 $entry->appendChild($link);
131 133 $link = $feed->newElement('link');
132 134 $link->appendChild($feed->newAttr('rel','cmis-descendants'));
133   - $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . 'type/' . strtolower($type['typeId']) . '/descendants'));
  135 + $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/type/' . strtolower($type['typeId']) . '/descendants'));
134 136 $entry->appendChild($link);
135 137 $link = $feed->newElement('link');
136 138 $link->appendChild($feed->newAttr('rel','cmis-repository'));
137   - $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . 'servicedocument'));
  139 + $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/servicedocument'));
138 140 $entry->appendChild($link);
139 141  
140 142 $entry->appendChild($feed->newElement('summary', $type['typeId'] . ' Type'));
... ... @@ -153,6 +155,47 @@ class KT_cmis_atom_service_helper {
153 155 return $feed;
154 156 }
155 157  
  158 + /**
  159 + * Fetches the CMIS objectId based on the path
  160 + *
  161 + * @param array $path
  162 + * @param object $ktapi KTAPI instance
  163 + */
  164 + // TODO make this much more efficient than this messy method
  165 + static public function getFolderId($path, &$ktapi)
  166 + {
  167 +// static public function getFolderData($query, &$folderName, &$tree)
  168 +// $ktapi = new KTAPI();
  169 +// $ktapi->start_session('admin', 'admin');
  170 +
  171 + // lose first item
  172 + array_shift($path);
  173 +
  174 + $numQ = count($path);
  175 +// echo $numQ."<BR>";
  176 + $numFolders = $numQ;
  177 + $folderId = 1;
  178 +// echo $numFolders."<BR>";
  179 +
  180 + $start = 0;
  181 + while($start < $numFolders)
  182 + {
  183 + $name = $path[$numQ-$numFolders+$start];
  184 + // hack to fix drupal url encoding issue
  185 + $name = str_replace('%2520', '%20', $name);
  186 +
  187 +// echo $name."<BR>";
  188 +
  189 + $folderName = urldecode($name);
  190 +// echo $folderName."<BR>";
  191 + $folder = $ktapi->get_folder_by_name($folderName, $folderId);
  192 + $folderId = $folder->get_folderid();
  193 + ++$start;
  194 + }
  195 +
  196 + return CMISUtil::encodeObjectId('Folder', $folderId);
  197 + }
  198 +
156 199 }
157 200  
158 201 ?>
... ...
webservice/atompub/cmis/index.php
... ... @@ -45,6 +45,7 @@ define(&#39;KT_APP_BASE_URI&#39;, &quot;http://&quot;.$_SERVER[&#39;HTTP_HOST&#39;].dirname($_SERVER[&#39;PHP_
45 45 define('KT_APP_SYSTEM_URI', "http://".$_SERVER['HTTP_HOST']);
46 46 define('KT_ATOM_LIB_FOLDER', '../../classes/atompub/');
47 47  
  48 +// should make the "dms" part dynamic but right now this is needed fast
48 49 define('CMIS_APP_BASE_URI', trim(KT_APP_BASE_URI, '/'));
49 50 define('CMIS_APP_SYSTEM_URI', KT_APP_SYSTEM_URI);
50 51 define('CMIS_ATOM_LIB_FOLDER', trim(KT_ATOM_LIB_FOLDER, '/') . '/cmis/');
... ... @@ -74,7 +75,7 @@ $APP = new KT_cmis_atom_server();
74 75 $APP->initServiceDocument();
75 76 // FIXME HACK! this should not happen every time, ONLY on a service doc request
76 77 // User defined title tag
77   -$APP->addWorkspaceTag('dms','atom:title','KnowledgeTree DMS');
  78 +$APP->addWorkspaceTag('dms','atom:title',$APP->repositoryInfo['repositoryName']);
78 79  
79 80 /**
80 81 * Register Services
... ... @@ -92,9 +93,9 @@ $APP-&gt;addWorkspaceTag(&#39;dms&#39;,&#39;atom:title&#39;,&#39;KnowledgeTree DMS&#39;);
92 93 // TODO consider a registerServices function which will, dependant on what is requested, register the appropriate services, keep the logic out of the index file
93 94 // FIXME HACK! this should not happen every time, ONLY on a service doc request, except for request specific collection links
94 95 $APP->registerService('dms', 'folder', 'KT_cmis_atom_service_folder', 'Root Folder Children Collection',
95   - array($APP->repositoryInfo['rootFolderId'], 'children'), 'root-children');
  96 + array(rawurlencode($APP->repositoryInfo['rootFolderId']), 'children'), 'root-children');
96 97 $APP->registerService('dms', 'folder', 'KT_cmis_atom_service_folder', 'Root Folder Children Collection',
97   - array($APP->repositoryInfo['rootFolderId'], 'descendants'), 'root-descendants');
  98 + array(rawurlencode($APP->repositoryInfo['rootFolderId']), 'descendants'), 'root-descendants');
98 99 $APP->registerService('dms', 'checkedout', 'KT_cmis_atom_service_checkedout', 'Checked Out Document Collection', null, 'checkedout');
99 100 $APP->registerService('dms', 'types', 'KT_cmis_atom_service_types', 'Object Type Collection', null, 'types-children');
100 101 $APP->registerService('dms', 'types', 'KT_cmis_atom_service_types', 'Object Type Collection', null, 'types-descendants');
... ...
webservice/classes/atompub/KT_atom_responseFeed.inc.php
... ... @@ -4,11 +4,10 @@ class KT_atom_responseFeed extends KT_atom_baseDoc {
4 4 protected $baseURI=NULL;
5 5 protected $feed=NULL;
6 6  
7   -
8   - public function __construct($baseURI=NULL,$title=NULL,$link=NULL,$updated=NULL,$author=NULL,$id=NULL){
  7 + public function __construct($baseURI=NULL,$title=NULL,$link=NULL,$updated=NULL,$author=NULL,$id=NULL, $workspace = null){
9 8 parent::__construct();
  9 + $this->baseURI = $baseURI;
10 10 $this->constructHeader();
11   - $this->baseURI=$baseURI;
12 11 }
13 12  
14 13 protected function constructHeader(){
... ...
webservice/classes/atompub/KT_atom_server.inc.php
... ... @@ -21,10 +21,11 @@ class KT_atom_server{
21 21 *
22 22 */
23 23 public function execute(){
  24 +// $_SERVER['QUERY_STRING'] = urldecode($_SERVER['QUERY_STRING']);
24 25 $reqMethod=trim(strtoupper($_SERVER['REQUEST_METHOD']));
25 26 $queryArray=split('/',trim($_SERVER['QUERY_STRING'],'/'));
26 27 $rawRequest=@file_get_contents('php://input');
27   -
  28 +//echo "\n\n".rawurldecode($_SERVER['QUERY_STRING'])."<BR><BR>\n\n";
28 29 $workspace=strtolower(trim($queryArray[0]));
29 30 $serviceName=strtolower(trim($queryArray[1]));
30 31 $requestParams=array_slice($queryArray,2);
... ...
webservice/classes/atompub/cmis/KT_cmis_atom_responseFeed.inc.php
... ... @@ -5,13 +5,17 @@ include_once(KT_ATOM_LIB_FOLDER.&#39;KT_atom_responseFeed.inc.php&#39;);
5 5 class KT_cmis_atom_responseFeed extends KT_atom_responseFeed {
6 6  
7 7 // override and extend as needed
  8 +
  9 + public $workspace = null;
8 10  
9 11 public function __construct($baseURI = NULL, $title = NULL, $link = NULL, $updated = NULL, $author = NULL, $id = NULL)
10 12 {
  13 + $queryArray = split('/', trim($_SERVER['QUERY_STRING'], '/'));
  14 + $this->workspace = strtolower(trim($queryArray[0]));
11 15 $this->id = $id;
12 16 $this->title = $title;
13 17  
14   - parent::__construct();
  18 + parent::__construct($baseURI, $title, $link, $updated, $author, $id);
15 19 }
16 20  
17 21 protected function constructHeader()
... ...
webservice/classes/atompub/cmis/KT_cmis_atom_server.inc.php
... ... @@ -34,13 +34,19 @@ class KT_cmis_atom_server extends KT_atom_server {
34 34 $ws = $service->newWorkspace();
35 35  
36 36 $hadDetail=false;
37   - if(isset($this->workspaceDetail[$workspace]))if(is_array($this->workspaceDetail[$workspace])){
38   - foreach ($this->workspaceDetail[$workspace] as $wsTag=>$wsValue){
39   - $ws->appendChild($service->newElement($wsTag,$wsValue));
40   - $hadDetail=true;
41   - }
42   - }
43   - if(!$hadDetail){
  37 + if(isset($this->workspaceDetail[$workspace]))
  38 + {
  39 + if(is_array($this->workspaceDetail[$workspace]))
  40 + {
  41 + foreach ($this->workspaceDetail[$workspace] as $wsTag=>$wsValue)
  42 + {
  43 + $ws->appendChild($service->newElement($wsTag,$wsValue));
  44 + $hadDetail=true;
  45 + }
  46 + }
  47 + }
  48 +
  49 + if(!$hadDetail) {
44 50 $ws->appendChild($service->newElement('atom:title',$workspace));
45 51 }
46 52  
... ... @@ -52,7 +58,7 @@ class KT_cmis_atom_server extends KT_atom_server {
52 58 {
53 59 if ($key == 'rootFolderId')
54 60 {
55   - $repoData = CMIS_APP_BASE_URI . 'folder/' . $repoData;
  61 + $repoData = CMIS_APP_BASE_URI . $workspace . '/folder/' . rawurlencode($repoData);
56 62 }
57 63  
58 64 if (!is_array($repoData))
... ...