Source for file jWSDL.class.php

Documentation is available at jWSDL.class.php

  1. <?php
  2. /**
  3. @package     jelix
  4. @subpackage  utils
  5. @author      Sylvain de Vathaire
  6. @contributor Laurent Jouanneau
  7. @copyright   2008 Sylvain de Vathaire, 2009 Laurent Jouanneau
  8. @link        http://www.jelix.org
  9. @licence     GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
  10. */
  11.  
  12.  
  13. require_once(LIB_PATH.'wshelper/WSDLStruct.class.php');
  14. require_once(LIB_PATH.'wshelper/WSDLException.class.php');
  15. require_once(LIB_PATH.'wshelper/WSException.class.php');
  16. require_once(LIB_PATH.'wshelper/IPXMLSchema.class.php');
  17. require_once(LIB_PATH.'wshelper/IPPhpDoc.class.php');
  18. require_once(LIB_PATH.'wshelper/IPReflectionClass.class.php');
  19. require_once(LIB_PATH.'wshelper/IPReflectionCommentParser.class.php');
  20. require_once(LIB_PATH.'wshelper/IPReflectionMethod.class.php');
  21. require_once(LIB_PATH.'wshelper/IPReflectionProperty.class.php');
  22.  
  23.  
  24.  
  25. /**
  26.  * object to generate WSDL files and web services documentation
  27.  * we have 1 WSDL file for each soap web service, each service is implemented by 1 Jelix controller
  28.  * @package    jelix
  29.  * @subpackage utils
  30.  */
  31. class jWSDL {
  32.  
  33.     /**
  34.     * module name
  35.     */
  36.     public $module;
  37.  
  38.     /**
  39.     * controller name
  40.     */
  41.     public $controller;
  42.  
  43.     /**
  44.     * controller class name
  45.     */
  46.     private $controllerClassName;
  47.  
  48.     /**
  49.     * WSDL file path (cached file)
  50.     */
  51.     public $WSDLfilePath;
  52.  
  53.  
  54.     private $_ctrlpath;
  55.  
  56.     private $_dirname 'WSDL';
  57.     private $_cacheSuffix '.wsdl';
  58.  
  59.  
  60.     public function __construct($module$controller){
  61.  
  62.         $this->module = $module;
  63.         $this->controller = $controller;
  64.  
  65.         $this->_createPath();
  66.         $this->_createCachePath();
  67.      }
  68.  
  69.     /**
  70.      * create the path for the cache file
  71.      */
  72.     private function _createPath(){
  73.         global $gJConfig;
  74.  
  75.         //Check module availability
  76.         if(!isset($gJConfig->_modulesPathList[$this->module])){
  77.             throw new jExceptionSelector('jelix~errors.module.unknow'$this->module);
  78.         }
  79.  
  80.         //Build controller path
  81.         $this->_ctrlpath $gJConfig->_modulesPathList[$this->module].'controllers/'.$this->controller.'.soap.php';
  82.  
  83.         //Check controller availability
  84.         if(!file_exists($this->_ctrlpath)){
  85.             throw new jException('jelix~errors.action.unknow',$this->controller);
  86.         }
  87.  
  88.         //Check controller declaration
  89.         require_once($this->_ctrlpath);
  90.         $this->controllerClassName $this->controller.'Ctrl';
  91.         if(!class_exists($this->controllerClassName,false)){
  92.             throw new jException('jelix~errors.ad.controller.class.unknow'array('jWSDL'$this->controllerClassName$this->_ctrlpath));
  93.         }
  94.  
  95.         //Check eAccelerator configuration in order to Reflexion API work
  96.         if (extension_loaded('eAccelerator')) {
  97.             $reflect new ReflectionClass('jWSDL');
  98.             if($reflect->getDocComment(== NULL{
  99.                 throw new jException('jWSDL~errors.eaccelerator.configuration');
  100.             }
  101.             unset($reflect);
  102.         }
  103.  
  104.     }
  105.  
  106.     /**
  107.      * Build the WSDL cache file path
  108.      */
  109.     private function _createCachePath(){
  110.         $this->_cachePath JELIX_APP_TEMP_PATH.'compiled/'.$this->_dirname.'/'.$this->module.'~'.$this->controller.$this->_cacheSuffix;
  111.     }
  112.  
  113.     /**
  114.      * Return the WSDL cache file path (WSDL is updated if necessary)
  115.      */
  116.     public function getWSDLFilePath(){
  117.         $this->_updateWSDL();
  118.         return $this->_cachePath;
  119.     }
  120.  
  121.     /**
  122.      * Return the WSDL file content (WSDL is updated if necessary)
  123.      */
  124.     public function getWSDLFile(){
  125.         $this->_updateWSDL();
  126.         return file_get_contents($this->_cachePath);
  127.     }
  128.  
  129.     /**
  130.      * Return array of params object for the operation $operationName
  131.      * @param $operationName string Name of the operation (controller method)
  132.      * @return array of params object (empty if no params)
  133.      */
  134.     public function getOperationParams($operationName){
  135.  
  136.        $IPReflectionMethod new IPReflectionMethod($this->controllerClassName$operationName);
  137.        return $IPReflectionMethod->parameters;
  138.     }
  139.  
  140.     /**
  141.      * Update the WSDL cache file
  142.      */
  143.     private function _updateWSDL(){
  144.  
  145.         global $gJConfig;
  146.         static $updated FALSE;
  147.  
  148.         if($updated){
  149.             return;
  150.         }
  151.  
  152.         $mustCompile $gJConfig->compilation['force'|| !file_exists($this->_cachePath);
  153.         if($gJConfig->compilation['checkCacheFiletime'&& !$mustCompile){
  154.             iffilemtime($this->_ctrlpathfilemtime($this->_cachePath)){
  155.                 $mustCompile true;
  156.             }
  157.         }
  158.  
  159.         if($mustCompile){
  160.             jFile::write($this->_cachePath$this->_compile());
  161.         }
  162.         $updated TRUE;
  163.     }
  164.  
  165.     /**
  166.      * Generate the WSDL content
  167.      */
  168.     private function _compile(){
  169.  
  170.         global $gJConfig;
  171.         
  172.         $url jUrl::get($this->module.'~'.$this->controller.':index@soap',array(),jUrl::JURL);
  173.         $url->clearParam ();
  174.         $url->setParam('service',$this->module.'~'.$this->controller );
  175.  
  176.         $serviceURL "http://".$_SERVER['HTTP_HOST'].$url->toString();
  177.         $serviceNameSpace "http://".$_SERVER['HTTP_HOST'].$gJConfig->urlengine['basePath'];
  178.  
  179.         $wsdl new WSDLStruct($serviceNameSpace$serviceURLSOAP_RPCSOAP_ENCODED);
  180.         $wsdl->setService(new IPReflectionClass($this->controllerClassName));
  181.  
  182.         try {
  183.             $gendoc $wsdl->generateDocument();
  184.         catch (WSDLException $exception{
  185.             throw new JException('jWSDL~errors.wsdl.generation'$exception->msg);
  186.         }
  187.  
  188.         return $gendoc;
  189.     }
  190.  
  191.     /**
  192.      * Load the class or service definition for doc purpose
  193.      * @param string $classname Name of the class for witch we want the doc, default doc is the service one (controller)
  194.      */
  195.     public function doc($className=""){
  196.  
  197.         if($className != ""){
  198.             if(!class_exists($className,false)){
  199.                 throw new jException('jelix~errors.ad.controller.class.unknow'array('WSDL generation'$className$this->_ctrlpath));
  200.             }
  201.             $classObject new IPReflectionClass($className);
  202.         }else{
  203.             $classObject new IPReflectionClass($this->controllerClassName);
  204.         }
  205.  
  206.         $documentation Array();
  207.         $documentation['menu'Array();
  208.  
  209.         if($classObject){
  210.             $classObject->properties $classObject->getProperties(falsefalsefalse);
  211.             $classObject->methods $classObject->getMethods(falsefalsefalse);
  212.             foreach((array)$classObject->methods as $method{
  213.                 $method->params $method->getParameters();
  214.             }
  215.  
  216.             $documentation['class'$classObject;
  217.             $documentation['service'$this->module.'~'.$this->controller;
  218.         }
  219.         return $documentation;
  220.     }
  221.  
  222.     /**
  223.      * Return an array of all the soap controllers class available in the application
  224.      * @return array Classname of controllers
  225.      */
  226.     public static function getSoapControllers(){
  227.  
  228.         global $gJConfig;
  229.  
  230.         $modules $gJConfig->_modulesPathList;
  231.         $controllers array();
  232.  
  233.         foreach($modules as $module){
  234.             if(is_dir($module.'controllers')){
  235.                 if ($handle opendir($module.'controllers')) {
  236.                     $moduleName basename($module);
  237.                     while (false !== ($file readdir($handle))) {
  238.                         if (substr($filestrlen($filestrlen('.soap.php')) == '.soap.php'{
  239.                             $controller array();
  240.                             $controller['class'substr($file0strlen($filestrlen('.soap.php'));
  241.                             $controller['module'$moduleName;
  242.                             $controller['service'$moduleName.'~'.$controller['class'];
  243.                             array_push($controllers$controller);
  244.                         }
  245.                     }
  246.                     closedir($handle);
  247.                 }
  248.             }
  249.         }
  250.         return $controllers;
  251.     }
  252. }

Documentation generated on Thu, 22 Mar 2012 22:17:35 +0100 by phpDocumentor 1.4.3