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))