Commit cdf9a41d220525faa6d8cf3bbfff2d5e50248430
1 parent
422a48b4
PT: 865156 - Amended Functionality on AtomPub Server Code - Implemented XML2Arra…
…y parser for service modules.
Showing
5 changed files
with
146 additions
and
17 deletions
webservice/atompub/index.php
| @@ -68,6 +68,7 @@ define('KT_ATOM_LIB_FOLDER','../classes/atompub/'); | @@ -68,6 +68,7 @@ define('KT_ATOM_LIB_FOLDER','../classes/atompub/'); | ||
| 68 | * Includes | 68 | * Includes |
| 69 | */ | 69 | */ |
| 70 | include_once('../../ktapi/ktapi.inc.php'); | 70 | include_once('../../ktapi/ktapi.inc.php'); |
| 71 | +include_once(KT_ATOM_LIB_FOLDER.'XMLns2array.inc.php'); | ||
| 71 | include_once(KT_ATOM_LIB_FOLDER.'KT_atom_server.inc.php'); | 72 | include_once(KT_ATOM_LIB_FOLDER.'KT_atom_server.inc.php'); |
| 72 | include_once('demodms/KT_atom_service_helper.inc.php'); //Containing helper bridge functions to KtAPI | 73 | include_once('demodms/KT_atom_service_helper.inc.php'); //Containing helper bridge functions to KtAPI |
| 73 | include_once(KT_ATOM_LIB_FOLDER.'KT_atom_baseDoc.inc.php'); //Containing the parent class allowing easy XML manipulation | 74 | include_once(KT_ATOM_LIB_FOLDER.'KT_atom_baseDoc.inc.php'); //Containing the parent class allowing easy XML manipulation |
| @@ -91,6 +92,8 @@ $APP=new KT_atom_server(); | @@ -91,6 +92,8 @@ $APP=new KT_atom_server(); | ||
| 91 | * ServiceClass :This is the class name of the class to be instantiated when this service is accessed | 92 | * ServiceClass :This is the class name of the class to be instantiated when this service is accessed |
| 92 | * Title :This is the title given to the service/collection in the servicedocument | 93 | * Title :This is the title given to the service/collection in the servicedocument |
| 93 | */ | 94 | */ |
| 95 | +$APP->addWorkspaceTag('dms','atom:title','Standard DMS'); | ||
| 96 | + | ||
| 94 | $APP->registerService('DMS','fulltree','KT_atom_service_fulltree','Full Document Tree'); | 97 | $APP->registerService('DMS','fulltree','KT_atom_service_fulltree','Full Document Tree'); |
| 95 | $APP->registerService('DMS','folder','KT_atom_service_folder','Folder Detail'); | 98 | $APP->registerService('DMS','folder','KT_atom_service_folder','Folder Detail'); |
| 96 | $APP->registerService('DMS','document','KT_atom_service_document','Document Detail'); | 99 | $APP->registerService('DMS','document','KT_atom_service_document','Document Detail'); |
| @@ -102,5 +105,6 @@ $APP->execute(); | @@ -102,5 +105,6 @@ $APP->execute(); | ||
| 102 | 105 | ||
| 103 | //Render the resulting feed response | 106 | //Render the resulting feed response |
| 104 | $APP->render(); | 107 | $APP->render(); |
| 108 | +//print_r($APP); | ||
| 105 | 109 | ||
| 106 | ?> | 110 | ?> |
| 107 | \ No newline at end of file | 111 | \ No newline at end of file |
webservice/classes/atompub/KT_atom_server.inc.php
| 1 | <?php | 1 | <?php |
| 2 | class KT_atom_server{ | 2 | class KT_atom_server{ |
| 3 | protected $services=array(); | 3 | protected $services=array(); |
| 4 | + protected $workspaceDetail=array(); | ||
| 4 | protected $errors=array(); | 5 | protected $errors=array(); |
| 5 | protected $output=''; | 6 | protected $output=''; |
| 6 | protected $queryArray=array(); | 7 | protected $queryArray=array(); |
| @@ -12,6 +13,10 @@ class KT_atom_server{ | @@ -12,6 +13,10 @@ class KT_atom_server{ | ||
| 12 | public function __construct(){ | 13 | public function __construct(){ |
| 13 | } | 14 | } |
| 14 | 15 | ||
| 16 | + /** | ||
| 17 | + * Run the server switchboard - find the correct service class to instantiate, execute & render that class with the passed parameteres | ||
| 18 | + * | ||
| 19 | + */ | ||
| 15 | public function execute(){ | 20 | public function execute(){ |
| 16 | $reqMethod=trim(strtoupper($_SERVER['REQUEST_METHOD'])); | 21 | $reqMethod=trim(strtoupper($_SERVER['REQUEST_METHOD'])); |
| 17 | $queryArray=split('/',trim($_SERVER['QUERY_STRING'],'/')); | 22 | $queryArray=split('/',trim($_SERVER['QUERY_STRING'],'/')); |
| @@ -43,10 +48,12 @@ class KT_atom_server{ | @@ -43,10 +48,12 @@ class KT_atom_server{ | ||
| 43 | $serviceObject->setStatus(KT_atom_service::STATUS_NOT_FOUND); | 48 | $serviceObject->setStatus(KT_atom_service::STATUS_NOT_FOUND); |
| 44 | $this->output=$serviceObject->render(); | 49 | $this->output=$serviceObject->render(); |
| 45 | } | 50 | } |
| 51 | + $this->serviceObject=$serviceObject; | ||
| 46 | } | 52 | } |
| 47 | 53 | ||
| 48 | - public function registerService($workspace=NULL,$serviceName=NULL,$serviceClass=NULL,$title=NULL){ | ||
| 49 | - $workspace=strtolower(trim($workspace)); | 54 | + |
| 55 | + public function registerService($workspaceCode=NULL,$serviceName=NULL,$serviceClass=NULL,$title=NULL){ | ||
| 56 | + $workspaceCode=strtolower(trim($workspaceCode)); | ||
| 50 | $serviceName=strtolower(trim($serviceName)); | 57 | $serviceName=strtolower(trim($serviceName)); |
| 51 | 58 | ||
| 52 | $serviceRecord=array( | 59 | $serviceRecord=array( |
| @@ -55,7 +62,12 @@ class KT_atom_server{ | @@ -55,7 +62,12 @@ class KT_atom_server{ | ||
| 55 | 'title' =>$title | 62 | 'title' =>$title |
| 56 | ); | 63 | ); |
| 57 | 64 | ||
| 58 | - $this->services[$workspace][$serviceName]=$serviceRecord; | 65 | + $this->services[$workspaceCode][$serviceName]=$serviceRecord; |
| 66 | + } | ||
| 67 | + | ||
| 68 | + public function addWorkspaceTag($workspaceCode=NULL,$TagName=NULL,$tagValue=NULL){ | ||
| 69 | + if(!isset($this->workspaceDetail[$workspaceCode]))$this->workspaceDetail[$workspaceCode]=array(); | ||
| 70 | + $this->workspaceDetail[$workspaceCode][$TagName]=$tagValue; | ||
| 59 | } | 71 | } |
| 60 | 72 | ||
| 61 | public function getRegisteredService($workspace,$serviceName=NULL){ | 73 | public function getRegisteredService($workspace,$serviceName=NULL){ |
| @@ -69,7 +81,18 @@ class KT_atom_server{ | @@ -69,7 +81,18 @@ class KT_atom_server{ | ||
| 69 | 81 | ||
| 70 | foreach($this->services as $workspace=>$collection){ | 82 | foreach($this->services as $workspace=>$collection){ |
| 71 | //Creating the Default Workspace for use with standard atomPub Clients | 83 | //Creating the Default Workspace for use with standard atomPub Clients |
| 72 | - $ws=$service->newWorkspace($workspace); | 84 | + $ws=$service->newWorkspace(); |
| 85 | + | ||
| 86 | + $hadDetail=false; | ||
| 87 | + if(isset($this->workspaceDetail[$workspace]))if(is_array($this->workspaceDetail[$workspace])){ | ||
| 88 | + foreach ($this->workspaceDetail[$workspace] as $wsTag=>$wsValue){ | ||
| 89 | + $ws->appendChild($service->newElement($wsTag,$wsValue)); | ||
| 90 | + $hadDetail=true; | ||
| 91 | + } | ||
| 92 | + } | ||
| 93 | + if(!$hadDetail){ | ||
| 94 | + $ws->appendChild($service->newElement('atom:title',$workspace)); | ||
| 95 | + } | ||
| 73 | 96 | ||
| 74 | foreach($collection as $serviceName=>$serviceInstance){ | 97 | foreach($collection as $serviceName=>$serviceInstance){ |
| 75 | $col=$service->newCollection(KT_APP_BASE_URI.$workspace.'/'.$serviceName.'/',$serviceInstance['title'],$ws); | 98 | $col=$service->newCollection(KT_APP_BASE_URI.$workspace.'/'.$serviceName.'/',$serviceInstance['title'],$ws); |
webservice/classes/atompub/KT_atom_service.inc.php
| @@ -60,7 +60,11 @@ class KT_atom_service{ | @@ -60,7 +60,11 @@ class KT_atom_service{ | ||
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | protected function xml2array($xml){ | 62 | protected function xml2array($xml){ |
| 63 | - $array=json_decode(json_encode(@simplexml_load_string($xml)),true); //TODO - XML2ARRAY Translation | 63 | + if(class_exists('')){ |
| 64 | + $array=XMLns2array::parse($xml); | ||
| 65 | + }else{ | ||
| 66 | + $array=json_decode(json_encode(@simplexml_load_string($xml)),true); | ||
| 67 | + } | ||
| 64 | return $array; | 68 | return $array; |
| 65 | } | 69 | } |
| 66 | 70 |
webservice/classes/atompub/KT_atom_serviceDoc.inc.php
| @@ -32,7 +32,7 @@ | @@ -32,7 +32,7 @@ | ||
| 32 | * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | 32 | * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices |
| 33 | * must display the words "Powered by KnowledgeTree" and retain the original | 33 | * must display the words "Powered by KnowledgeTree" and retain the original |
| 34 | * copyright notice. | 34 | * copyright notice. |
| 35 | - * Contributor( s): | 35 | + * Contributor( s): |
| 36 | * Mark Holtzhausen <mark@knowledgetree.com> | 36 | * Mark Holtzhausen <mark@knowledgetree.com> |
| 37 | * | 37 | * |
| 38 | */ | 38 | */ |
| @@ -45,17 +45,17 @@ include_once('KT_atom_baseDoc.inc.php'); | @@ -45,17 +45,17 @@ include_once('KT_atom_baseDoc.inc.php'); | ||
| 45 | 45 | ||
| 46 | 46 | ||
| 47 | class KT_atom_serviceDoc extends KT_atom_baseDoc { | 47 | class KT_atom_serviceDoc extends KT_atom_baseDoc { |
| 48 | - | 48 | + |
| 49 | protected $baseURI=NULL; | 49 | protected $baseURI=NULL; |
| 50 | protected $service=NULL; | 50 | protected $service=NULL; |
| 51 | 51 | ||
| 52 | - | 52 | + |
| 53 | public function __construct($baseURI=NULL){ | 53 | public function __construct($baseURI=NULL){ |
| 54 | parent::__construct(); | 54 | parent::__construct(); |
| 55 | $this->constructServiceDocumentHeaders(); | 55 | $this->constructServiceDocumentHeaders(); |
| 56 | $this->baseURI=$baseURI; | 56 | $this->baseURI=$baseURI; |
| 57 | } | 57 | } |
| 58 | - | 58 | + |
| 59 | protected function constructServiceDocumentHeaders(){ | 59 | protected function constructServiceDocumentHeaders(){ |
| 60 | $service=$this->newElement('service'); | 60 | $service=$this->newElement('service'); |
| 61 | $service->appendChild($this->newAttr('xmlns','http://www.w3.org/2007/app')); | 61 | $service->appendChild($this->newAttr('xmlns','http://www.w3.org/2007/app')); |
| @@ -63,14 +63,14 @@ class KT_atom_serviceDoc extends KT_atom_baseDoc { | @@ -63,14 +63,14 @@ class KT_atom_serviceDoc extends KT_atom_baseDoc { | ||
| 63 | $this->service=&$service; | 63 | $this->service=&$service; |
| 64 | $this->DOM->appendChild($this->service); | 64 | $this->DOM->appendChild($this->service); |
| 65 | } | 65 | } |
| 66 | - | 66 | + |
| 67 | public function &newWorkspace($title=NULL){ | 67 | public function &newWorkspace($title=NULL){ |
| 68 | $ws=$this->newElement('workspace'); | 68 | $ws=$this->newElement('workspace'); |
| 69 | - $ws->appendChild($this->newElement('atom:title',$title)); | 69 | + if($title)$ws->appendChild($this->newElement('atom:title',$title)); |
| 70 | $this->service->appendChild($ws); | 70 | $this->service->appendChild($ws); |
| 71 | - return $ws; | 71 | + return $ws; |
| 72 | } | 72 | } |
| 73 | - | 73 | + |
| 74 | public function &newCollection($url=NULL,$title=NULL,&$ws=NULL){ | 74 | public function &newCollection($url=NULL,$title=NULL,&$ws=NULL){ |
| 75 | $collection=$this->newElement('collection'); | 75 | $collection=$this->newElement('collection'); |
| 76 | $collection->appendChild($this->newAttr('href',$url)); | 76 | $collection->appendChild($this->newAttr('href',$url)); |
| @@ -78,7 +78,7 @@ class KT_atom_serviceDoc extends KT_atom_baseDoc { | @@ -78,7 +78,7 @@ class KT_atom_serviceDoc extends KT_atom_baseDoc { | ||
| 78 | if(isset($ws))$ws->appendChild($collection); | 78 | if(isset($ws))$ws->appendChild($collection); |
| 79 | return $collection; | 79 | return $collection; |
| 80 | } | 80 | } |
| 81 | - | 81 | + |
| 82 | public function &newAccept($docType=NULL,&$collection=NULL){ | 82 | public function &newAccept($docType=NULL,&$collection=NULL){ |
| 83 | if($docType){ | 83 | if($docType){ |
| 84 | $accept=$this->newElement('accept',$docType); | 84 | $accept=$this->newElement('accept',$docType); |
| @@ -88,12 +88,12 @@ class KT_atom_serviceDoc extends KT_atom_baseDoc { | @@ -88,12 +88,12 @@ class KT_atom_serviceDoc extends KT_atom_baseDoc { | ||
| 88 | if($collection)$collection->appendChild($accept); | 88 | if($collection)$collection->appendChild($accept); |
| 89 | return $accept; | 89 | return $accept; |
| 90 | } | 90 | } |
| 91 | - | ||
| 92 | - | 91 | + |
| 92 | + | ||
| 93 | public function getAPPdoc(){ | 93 | public function getAPPdoc(){ |
| 94 | return $this->formatXmlString(trim($this->DOM->saveXML())); | 94 | return $this->formatXmlString(trim($this->DOM->saveXML())); |
| 95 | } | 95 | } |
| 96 | - | 96 | + |
| 97 | } | 97 | } |
| 98 | 98 | ||
| 99 | 99 |
webservice/classes/atompub/XMLns2array.inc.php
0 → 100644
| 1 | +<?php | ||
| 2 | + | ||
| 3 | +class XMLns2array{ | ||
| 4 | + | ||
| 5 | + private static $namespaces=null; | ||
| 6 | + | ||
| 7 | + /** | ||
| 8 | + * Parse an XML document into an array. Supports namespaces. Uses SimpleXML | ||
| 9 | + * | ||
| 10 | + * @param String/SimpleXMLElement $xml | ||
| 11 | + * @return Array | ||
| 12 | + */ | ||
| 13 | + public static function parse($xml){ | ||
| 14 | + $xml=(get_class($xml)=='SimpleXMLElement')?$xml:@simplexml_load_string($xml); | ||
| 15 | + if(get_class($xml)!='SimpleXMLElement') die('The string passed is not a valid XML string or an SimpleXMLElement'); | ||
| 16 | + self::$namespaces=$xml->getNamespaces(true); | ||
| 17 | + return self::parsetag($xml); | ||
| 18 | + } | ||
| 19 | + | ||
| 20 | + /** | ||
| 21 | + * Parse a single tag recursively calling self to parse children. | ||
| 22 | + * | ||
| 23 | + * @param SimpleXMLElement $xml The SimpleXMLElement to convert to an array | ||
| 24 | + * @return Array | ||
| 25 | + */ | ||
| 26 | + private static function parsetag($xml){ | ||
| 27 | + $array=array(); | ||
| 28 | + $array['@attributes']=self::getAttributes($xml); | ||
| 29 | + $array['@children']=array(); | ||
| 30 | + if(self::hasChildren($xml)){ | ||
| 31 | + $children=self::getChildren($xml); | ||
| 32 | + $tmpChildren=array(); | ||
| 33 | + foreach($children as $fullChildName=>$childCollection){ | ||
| 34 | + $childName=split(':',$fullChildName); | ||
| 35 | + $fullChildName=trim($fullChildName,' :'); | ||
| 36 | + foreach($childCollection as $child){ | ||
| 37 | + $childParsed=self::parsetag($child); | ||
| 38 | + if(!isset($tmpChildren[$fullChildName]))$tmpChildren[$fullChildName]=array(); | ||
| 39 | + $tmpChildren[$fullChildName][]=$childParsed; | ||
| 40 | + } | ||
| 41 | + $array['@children']=array_merge($array['@children'],$tmpChildren); | ||
| 42 | + } | ||
| 43 | + }else{ | ||
| 44 | + $array['@value']=(string)$xml; | ||
| 45 | + } | ||
| 46 | + return $array; | ||
| 47 | + } | ||
| 48 | + | ||
| 49 | + /** | ||
| 50 | + * Tests whether a node has children | ||
| 51 | + * | ||
| 52 | + * @param SimpleXMLElement $xml The node to test | ||
| 53 | + * @return Array | ||
| 54 | + */ | ||
| 55 | + private static function hasChildren($xml){ | ||
| 56 | + return count(self::getChildren($xml))>0; | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | + /** | ||
| 60 | + * Gets the attributes of a node | ||
| 61 | + * | ||
| 62 | + * @param SimpleXMLElement $xml The node to process | ||
| 63 | + * @return Array | ||
| 64 | + */ | ||
| 65 | + private static function getAttributes($xml){ | ||
| 66 | + $attr=array(); | ||
| 67 | + foreach(self::$namespaces as $namespace=>$uri){ | ||
| 68 | + $nsAttrs=(array)$xml->attributes($uri); | ||
| 69 | + $nsAttrs=isset($nsAttrs['@attributes'])?$nsAttrs['@attributes']:array(); | ||
| 70 | + foreach($nsAttrs as $nsAttr=>$nsAttrVal){ | ||
| 71 | + $attr[$namespace.':'.$nsAttr]=$nsAttrVal; | ||
| 72 | + } | ||
| 73 | + } | ||
| 74 | + return $attr; | ||
| 75 | + } | ||
| 76 | + | ||
| 77 | + /** | ||
| 78 | + * Returns the children of a node | ||
| 79 | + * | ||
| 80 | + * @param SimpleXMLElement $xml The node to process | ||
| 81 | + * @return unknown | ||
| 82 | + */ | ||
| 83 | + private static function getChildren($xml){ | ||
| 84 | + $children=array(); | ||
| 85 | + foreach(self::$namespaces as $namespace=>$uri){ | ||
| 86 | + $nsChildren=$xml->children($uri); | ||
| 87 | + foreach($nsChildren as $nsChild){ | ||
| 88 | + $childRealName=$namespace.':'.$nsChild->getName(); | ||
| 89 | + if(!isset($children[$childRealName]))$children[$childRealName]=array(); | ||
| 90 | + if(!is_array($children[$childRealName]))$children[$childRealName]=array(); | ||
| 91 | + $children[$childRealName][]=$nsChild; | ||
| 92 | + } | ||
| 93 | + } | ||
| 94 | + return $children; | ||
| 95 | + } | ||
| 96 | + | ||
| 97 | +} | ||
| 98 | +?> | ||
| 0 | \ No newline at end of file | 99 | \ No newline at end of file |