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-2012 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.         $config jApp::config();
  74.  
  75.         //Check module availability
  76.         if(!isset($config->_modulesPathList[$this->module])){
  77.             throw new jExceptionSelector('jelix~errors.module.unknown'$this->module);
  78.         }
  79.  
  80.         //Build controller path
  81.         $this->_ctrlpath $config->_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.unknown',$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.unknown'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 jApp::tempPath('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 string $operationName Name of the operation (controller method)
  132.      * @return array list 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.         static $updated FALSE;
  146.  
  147.         if($updated){
  148.             return;
  149.         }
  150.  
  151.         $mustCompile jApp::config()->compilation['force'|| !file_exists($this->_cachePath);
  152.         if(jApp::config()->compilation['checkCacheFiletime'&& !$mustCompile){
  153.             iffilemtime($this->_ctrlpathfilemtime($this->_cachePath)){
  154.                 $mustCompile true;
  155.             }
  156.         }
  157.  
  158.         if($mustCompile){
  159.             jFile::write($this->_cachePath$this->_compile());
  160.         }
  161.         $updated TRUE;
  162.     }
  163.  
  164.     /**
  165.      * Generate the WSDL content
  166.      */
  167.     private function _compile(){
  168.  
  169.         $url jUrl::get($this->module.'~'.$this->controller.':index@soap',array(),jUrl::JURL);
  170.         $url->clearParam ();
  171.         $url->setParam('service',$this->module.'~'.$this->controller );
  172.  
  173.         $serverUri jUrl::getRootUrlRessourceValue('soap');
  174.         if ($serverUri === null{
  175.             $serverUri jUrl::getRootUrlRessourceValue('soap-'.$this->module);
  176.         }
  177.         if ($serverUri === null{
  178.             $serverUri jUrl::getRootUrlRessourceValue('soap-'.$this->module.'-'.$this->controller);
  179.         }
  180.         if ($serverUri === null{
  181.             $serverUri jApp::coord()->request->getServerURI();
  182.         }
  183.  
  184.         $serviceURL $serverUri $url->toString();
  185.         $serviceNameSpace $serverUri jApp::config()->urlengine['basePath'];
  186.  
  187.         $wsdl new WSDLStruct($serviceNameSpace$serviceURLSOAP_RPCSOAP_ENCODED);
  188.         $wsdl->setService(new IPReflectionClass($this->controllerClassName));
  189.  
  190.         try {
  191.             $gendoc $wsdl->generateDocument();
  192.         catch (WSDLException $exception{
  193.             throw new JException('jWSDL~errors.wsdl.generation'$exception->msg);
  194.         }
  195.  
  196.         return $gendoc;
  197.     }
  198.  
  199.     /**
  200.      * Load the class or service definition for doc purpose
  201.      * @param string $classname Name of the class for witch we want the doc, default doc is the service one (controller)
  202.      */
  203.     public function doc($className=""){
  204.  
  205.         if($className != ""){
  206.             if(!class_exists($className,false)){
  207.                 throw new jException('jelix~errors.ad.controller.class.unknown'array('WSDL generation'$className$this->_ctrlpath));
  208.             }
  209.             $classObject new IPReflectionClass($className);
  210.         }else{
  211.             $classObject new IPReflectionClass($this->controllerClassName);
  212.         }
  213.  
  214.         $documentation Array();
  215.         $documentation['menu'Array();
  216.  
  217.         if($classObject){
  218.             $classObject->properties $classObject->getProperties(falsefalsefalse);
  219.             $classObject->methods $classObject->getMethods(falsefalsefalse);
  220.             foreach((array)$classObject->methods as $method{
  221.                 $method->params $method->getParameters();
  222.             }
  223.  
  224.             $documentation['class'$classObject;
  225.             $documentation['service'$this->module.'~'.$this->controller;
  226.         }
  227.         return $documentation;
  228.     }
  229.  
  230.     /**
  231.      * Return an array of all the soap controllers class available in the application
  232.      * @return array Classname of controllers
  233.      */
  234.     public static function getSoapControllers(){
  235.  
  236.         $modules jApp::config()->_modulesPathList;
  237.         $controllers array();
  238.  
  239.         foreach($modules as $module){
  240.             if(is_dir($module.'controllers')){
  241.                 if ($handle opendir($module.'controllers')) {
  242.                     $moduleName basename($module);
  243.                     while (false !== ($file readdir($handle))) {
  244.                         if (substr($filestrlen($filestrlen('.soap.php')) == '.soap.php'{
  245.                             $controller array();
  246.                             $controller['class'substr($file0strlen($filestrlen('.soap.php'));
  247.                             $controller['module'$moduleName;
  248.                             $controller['service'$moduleName.'~'.$controller['class'];
  249.                             array_push($controllers$controller);
  250.                         }
  251.                     }
  252.                     closedir($handle);
  253.                 }
  254.             }
  255.         }
  256.         return $controllers;
  257.     }
  258. }

Documentation generated on Mon, 26 Oct 2015 21:56:52 +0100 by phpDocumentor 1.4.3