diff --git a/lib/api/ktcmis/ktcmis.inc.php b/lib/api/ktcmis/ktcmis.inc.php
index c1f3dd7..2a40345 100644
--- a/lib/api/ktcmis/ktcmis.inc.php
+++ b/lib/api/ktcmis/ktcmis.inc.php
@@ -64,24 +64,12 @@ class KTCMISBase {
// we want all child classes to share the ktapi and session instances, no matter where they are set from,
// so we declare them as static
- /**
- * KnowledgeTree API instance
- *
- * @var object
- */
static protected $ktapi;
- /**
- * KnowledgeTree API Session Identifier
- *
- * @var object
- */
static protected $session;
// TODO try to pick up existing session if possible, i.e. if the $session value is not empty
public function startSession($username, $password)
{
- self::$session = null;
-
if (is_null(self::$session))
{
self::$ktapi = new KTAPI();
@@ -90,11 +78,18 @@ class KTCMISBase {
else
{
// add session restart code here
+ self::$session =& self::$ktapi->get_active_session(self::$session->get_sessionid());
}
-//var_dump(self::$ktapi);
+
+ //var_dump(self::$ktapi);
return self::$session;
}
+ public function getInterface()
+ {
+ return self::$ktapi;
+ }
+
// TODO what about destroying sessions? only on logout (which is not offered by the CMIS clients tested so far)
}
@@ -255,9 +250,10 @@ class KTNavigationService extends KTCMISBase {
{
parent::startSession($username, $password);
$this->setInterface();
+ return self::$session;
}
- function setInterface()
+ public function setInterface()
{
$this->NavigationService->setInterface(self::$ktapi);
}
@@ -441,16 +437,16 @@ class KTObjectService extends KTCMISBase {
// instantiate underlying CMIS service
$this->ObjectService = new CMISObjectService();
}
-
+
public function startSession($username, $password)
{
parent::startSession($username, $password);
$this->setInterface();
+ return self::$session;
}
- function setInterface()
+ public function setInterface()
{
-// var_dump(self::$ktapi);
$this->ObjectService->setInterface(self::$ktapi);
}
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 0990328..f50e48b 100644
--- a/webservice/atompub/cmis/KT_cmis_atom_server.services.inc.php
+++ b/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
$repositoryId = $repositories[0]['repositoryId'];
//var_dump($RepositoryService->ktapi);
// $folderId = $this->getFolderData();
+
if (urldecode($this->params[0]) == 'Root Folder')
{
$folderId = CMISUtil::encodeObjectId('Folder', 1);
$folderName = urldecode($this->params[0]);
}
+ // 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...
+ else if ($this->params[0] == 'path')
+ {
+ $ktapi =& $RepositoryService->getInterface();
+ $folderId = KT_cmis_atom_service_helper::getFolderId($this->params, $ktapi);
+// echo "DA FOLDER ID IS $folderId
";
+ }
else
{
$folderId = $this->params[0];
- // get folder name from id, using the ObjectService methods
- $ObjectService = new ObjectService();
-// var_dump($ObjectService->ktapi);
- $ObjectService->setInterface();
- $cmisProps = $ObjectService->getProperties($repositoryId, $folderId, false, false);
-// var_dump($cmisObject);
-// $props = $cmisObject->getProperties();
-// var_dump($props);
- $folderName = $cmisProps['properties']['Name']['value'];
+// // get folder name from id, using the ObjectService methods
+// $ObjectService = new ObjectService();
+//// var_dump($ObjectService->ktapi);
+// $ObjectService->setInterface();
+// $cmisProps = $ObjectService->getProperties($repositoryId, $folderId, false, false);
+//// var_dump($cmisObject);
+//// $props = $cmisObject->getProperties();
+//// var_dump($props);
+// $folderName = $cmisProps['properties']['Name']['value'];
}
$username = $password = 'admin';
@@ -53,6 +61,7 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service
}
else
{
+// echo "UHUHUHUHUH: $folderId
\n";
$ObjectService = new ObjectService();
$ObjectService->startSession($username, $password);
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 69ad93a..10b9fd0 100644
--- a/webservice/atompub/cmis/KT_cmis_atom_service_helper.inc.php
+++ b/webservice/atompub/cmis/KT_cmis_atom_service_helper.inc.php
@@ -23,43 +23,45 @@ class KT_cmis_atom_service_helper {
$id = $cmisEntry['properties']['ObjectId']['value'];
$entry = $feed->newEntry();
- $feed->newField('id', $id, $entry);
+ $feed->newField('id', 'urn:uuid:' . $id, $entry);
// links
+ // TODO check parent link is correct, fix if needed
$link = $feed->newElement('link');
$link->appendChild($feed->newAttr('rel','cmis-parent'));
- $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . 'folder/' . $path));
+ $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/folder/' . $path));
$entry->appendChild($link);
if (strtolower($cmisEntry['properties']['ObjectTypeId']['value']) == 'folder')
{
+ // TODO check parent link is correct, fix if needed
$link = $feed->newElement('link');
$link->appendChild($feed->newAttr('rel','cmis-folderparent'));
- $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . 'folder/' . $path));
+ $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/folder/' . $path));
$entry->appendChild($link);
$link = $feed->newElement('link');
$link->appendChild($feed->newAttr('rel','cmis-children'));
- $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI
+ $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/'
. strtolower($cmisEntry['properties']['ObjectTypeId']['value'])
- . '/' . $path . '/' . urlencode($cmisEntry['properties']['Name']['value'])
+ . '/' . $path . '/' . rawurlencode($cmisEntry['properties']['Name']['value'])
. '/children'));
$entry->appendChild($link);
$link = $feed->newElement('link');
$link->appendChild($feed->newAttr('rel','cmis-descendants'));
- $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI
+ $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/'
. strtolower($cmisEntry['properties']['ObjectTypeId']['value'])
- . '/' . $path . '/' . urlencode($cmisEntry['properties']['Name']['value'])
+ . '/' . $path . '/' . rawurlencode($cmisEntry['properties']['Name']['value'])
. '/descendants'));
$entry->appendChild($link);
}
$link = $feed->newElement('link');
$link->appendChild($feed->newAttr('rel','cmis-type'));
- $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . 'type/' . strtolower($cmisEntry['properties']['ObjectTypeId']['value'])));
+ $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/type/' . strtolower($cmisEntry['properties']['ObjectTypeId']['value'])));
$entry->appendChild($link);
$link = $feed->newElement('link');
$link->appendChild($feed->newAttr('rel','cmis-repository'));
- $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . 'servicedocument'));
+ $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/servicedocument'));
$entry->appendChild($link);
// end links
@@ -118,23 +120,23 @@ class KT_cmis_atom_service_helper {
// links
$link = $feed->newElement('link');
$link->appendChild($feed->newAttr('rel','self'));
- $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . 'type/' . strtolower($type['typeId'])));
+ $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/type/' . strtolower($type['typeId'])));
$entry->appendChild($link);
$link = $feed->newElement('link');
$link->appendChild($feed->newAttr('rel','cmis-type'));
- $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . 'type/' . strtolower($type['typeId'])));
+ $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/type/' . strtolower($type['typeId'])));
$entry->appendChild($link);
$link = $feed->newElement('link');
$link->appendChild($feed->newAttr('rel','cmis-children'));
- $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . 'type/' . strtolower($type['typeId']) . '/children'));
+ $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/type/' . strtolower($type['typeId']) . '/children'));
$entry->appendChild($link);
$link = $feed->newElement('link');
$link->appendChild($feed->newAttr('rel','cmis-descendants'));
- $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . 'type/' . strtolower($type['typeId']) . '/descendants'));
+ $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/type/' . strtolower($type['typeId']) . '/descendants'));
$entry->appendChild($link);
$link = $feed->newElement('link');
$link->appendChild($feed->newAttr('rel','cmis-repository'));
- $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . 'servicedocument'));
+ $link->appendChild($feed->newAttr('href', CMIS_APP_BASE_URI . $feed->workspace . '/servicedocument'));
$entry->appendChild($link);
$entry->appendChild($feed->newElement('summary', $type['typeId'] . ' Type'));
@@ -153,6 +155,47 @@ class KT_cmis_atom_service_helper {
return $feed;
}
+ /**
+ * Fetches the CMIS objectId based on the path
+ *
+ * @param array $path
+ * @param object $ktapi KTAPI instance
+ */
+ // TODO make this much more efficient than this messy method
+ static public function getFolderId($path, &$ktapi)
+ {
+// static public function getFolderData($query, &$folderName, &$tree)
+// $ktapi = new KTAPI();
+// $ktapi->start_session('admin', 'admin');
+
+ // lose first item
+ array_shift($path);
+
+ $numQ = count($path);
+// echo $numQ."
";
+ $numFolders = $numQ;
+ $folderId = 1;
+// echo $numFolders."
";
+
+ $start = 0;
+ while($start < $numFolders)
+ {
+ $name = $path[$numQ-$numFolders+$start];
+ // hack to fix drupal url encoding issue
+ $name = str_replace('%2520', '%20', $name);
+
+// echo $name."
";
+
+ $folderName = urldecode($name);
+// echo $folderName."
";
+ $folder = $ktapi->get_folder_by_name($folderName, $folderId);
+ $folderId = $folder->get_folderid();
+ ++$start;
+ }
+
+ return CMISUtil::encodeObjectId('Folder', $folderId);
+ }
+
}
?>
diff --git a/webservice/atompub/cmis/index.php b/webservice/atompub/cmis/index.php
index 9c9b74f..2cc1c61 100644
--- a/webservice/atompub/cmis/index.php
+++ b/webservice/atompub/cmis/index.php
@@ -45,6 +45,7 @@ define('KT_APP_BASE_URI', "http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_
define('KT_APP_SYSTEM_URI', "http://".$_SERVER['HTTP_HOST']);
define('KT_ATOM_LIB_FOLDER', '../../classes/atompub/');
+// should make the "dms" part dynamic but right now this is needed fast
define('CMIS_APP_BASE_URI', trim(KT_APP_BASE_URI, '/'));
define('CMIS_APP_SYSTEM_URI', KT_APP_SYSTEM_URI);
define('CMIS_ATOM_LIB_FOLDER', trim(KT_ATOM_LIB_FOLDER, '/') . '/cmis/');
@@ -74,7 +75,7 @@ $APP = new KT_cmis_atom_server();
$APP->initServiceDocument();
// FIXME HACK! this should not happen every time, ONLY on a service doc request
// User defined title tag
-$APP->addWorkspaceTag('dms','atom:title','KnowledgeTree DMS');
+$APP->addWorkspaceTag('dms','atom:title',$APP->repositoryInfo['repositoryName']);
/**
* Register Services
@@ -92,9 +93,9 @@ $APP->addWorkspaceTag('dms','atom:title','KnowledgeTree DMS');
// TODO consider a registerServices function which will, dependant on what is requested, register the appropriate services, keep the logic out of the index file
// FIXME HACK! this should not happen every time, ONLY on a service doc request, except for request specific collection links
$APP->registerService('dms', 'folder', 'KT_cmis_atom_service_folder', 'Root Folder Children Collection',
- array($APP->repositoryInfo['rootFolderId'], 'children'), 'root-children');
+ array(rawurlencode($APP->repositoryInfo['rootFolderId']), 'children'), 'root-children');
$APP->registerService('dms', 'folder', 'KT_cmis_atom_service_folder', 'Root Folder Children Collection',
- array($APP->repositoryInfo['rootFolderId'], 'descendants'), 'root-descendants');
+ array(rawurlencode($APP->repositoryInfo['rootFolderId']), 'descendants'), 'root-descendants');
$APP->registerService('dms', 'checkedout', 'KT_cmis_atom_service_checkedout', 'Checked Out Document Collection', null, 'checkedout');
$APP->registerService('dms', 'types', 'KT_cmis_atom_service_types', 'Object Type Collection', null, 'types-children');
$APP->registerService('dms', 'types', 'KT_cmis_atom_service_types', 'Object Type Collection', null, 'types-descendants');
diff --git a/webservice/classes/atompub/KT_atom_responseFeed.inc.php b/webservice/classes/atompub/KT_atom_responseFeed.inc.php
index d78ac00..98ccb0d 100644
--- a/webservice/classes/atompub/KT_atom_responseFeed.inc.php
+++ b/webservice/classes/atompub/KT_atom_responseFeed.inc.php
@@ -4,11 +4,10 @@ class KT_atom_responseFeed extends KT_atom_baseDoc {
protected $baseURI=NULL;
protected $feed=NULL;
-
- public function __construct($baseURI=NULL,$title=NULL,$link=NULL,$updated=NULL,$author=NULL,$id=NULL){
+ public function __construct($baseURI=NULL,$title=NULL,$link=NULL,$updated=NULL,$author=NULL,$id=NULL, $workspace = null){
parent::__construct();
+ $this->baseURI = $baseURI;
$this->constructHeader();
- $this->baseURI=$baseURI;
}
protected function constructHeader(){
diff --git a/webservice/classes/atompub/KT_atom_server.inc.php b/webservice/classes/atompub/KT_atom_server.inc.php
index 37c32e4..f3c3941 100644
--- a/webservice/classes/atompub/KT_atom_server.inc.php
+++ b/webservice/classes/atompub/KT_atom_server.inc.php
@@ -21,10 +21,11 @@ class KT_atom_server{
*
*/
public function execute(){
+// $_SERVER['QUERY_STRING'] = urldecode($_SERVER['QUERY_STRING']);
$reqMethod=trim(strtoupper($_SERVER['REQUEST_METHOD']));
$queryArray=split('/',trim($_SERVER['QUERY_STRING'],'/'));
$rawRequest=@file_get_contents('php://input');
-
+//echo "\n\n".rawurldecode($_SERVER['QUERY_STRING'])."
\n\n";
$workspace=strtolower(trim($queryArray[0]));
$serviceName=strtolower(trim($queryArray[1]));
$requestParams=array_slice($queryArray,2);
diff --git a/webservice/classes/atompub/cmis/KT_cmis_atom_responseFeed.inc.php b/webservice/classes/atompub/cmis/KT_cmis_atom_responseFeed.inc.php
index 5bb86a4..1aa8902 100644
--- a/webservice/classes/atompub/cmis/KT_cmis_atom_responseFeed.inc.php
+++ b/webservice/classes/atompub/cmis/KT_cmis_atom_responseFeed.inc.php
@@ -5,13 +5,17 @@ include_once(KT_ATOM_LIB_FOLDER.'KT_atom_responseFeed.inc.php');
class KT_cmis_atom_responseFeed extends KT_atom_responseFeed {
// override and extend as needed
+
+ public $workspace = null;
public function __construct($baseURI = NULL, $title = NULL, $link = NULL, $updated = NULL, $author = NULL, $id = NULL)
{
+ $queryArray = split('/', trim($_SERVER['QUERY_STRING'], '/'));
+ $this->workspace = strtolower(trim($queryArray[0]));
$this->id = $id;
$this->title = $title;
- parent::__construct();
+ parent::__construct($baseURI, $title, $link, $updated, $author, $id);
}
protected function constructHeader()
diff --git a/webservice/classes/atompub/cmis/KT_cmis_atom_server.inc.php b/webservice/classes/atompub/cmis/KT_cmis_atom_server.inc.php
index bc1d511..4b1f460 100644
--- a/webservice/classes/atompub/cmis/KT_cmis_atom_server.inc.php
+++ b/webservice/classes/atompub/cmis/KT_cmis_atom_server.inc.php
@@ -34,13 +34,19 @@ class KT_cmis_atom_server extends KT_atom_server {
$ws = $service->newWorkspace();
$hadDetail=false;
- if(isset($this->workspaceDetail[$workspace]))if(is_array($this->workspaceDetail[$workspace])){
- foreach ($this->workspaceDetail[$workspace] as $wsTag=>$wsValue){
- $ws->appendChild($service->newElement($wsTag,$wsValue));
- $hadDetail=true;
- }
- }
- if(!$hadDetail){
+ if(isset($this->workspaceDetail[$workspace]))
+ {
+ if(is_array($this->workspaceDetail[$workspace]))
+ {
+ foreach ($this->workspaceDetail[$workspace] as $wsTag=>$wsValue)
+ {
+ $ws->appendChild($service->newElement($wsTag,$wsValue));
+ $hadDetail=true;
+ }
+ }
+ }
+
+ if(!$hadDetail) {
$ws->appendChild($service->newElement('atom:title',$workspace));
}
@@ -52,7 +58,7 @@ class KT_cmis_atom_server extends KT_atom_server {
{
if ($key == 'rootFolderId')
{
- $repoData = CMIS_APP_BASE_URI . 'folder/' . $repoData;
+ $repoData = CMIS_APP_BASE_URI . $workspace . '/folder/' . rawurlencode($repoData);
}
if (!is_array($repoData))