tangra logo
   
[ class tree: tangra_lib ] [ index: tangra_lib ] [ all elements ]
 

Source for file module_ctrl_xml_importer.class.php

Documentation is available at module_ctrl_xml_importer.class.php

  1. <?php
  2.  
  3. // $Id$
  4.  
  5. /**
  6.  * Contains class Module_CTRL_XML_Importer
  7.  *
  8.  * @package  tangra_lib
  9.  * @subpackage  modules_manager
  10.  */
  11.  
  12. /**
  13.  *
  14.  */
  15. require_once(TANGRA_MAIN_DIR.'modules_manager/tangra_module_dbc.class.php');
  16. /**
  17.  *
  18.  */
  19. require_once(TANGRA_MAIN_DIR.'modules_manager/tangra_module_release_dbc.class.php');
  20. /**
  21.  *
  22.  */
  23. require_once(TANGRA_MAIN_DIR.'modules_manager/tangra_module_release_param_dbc.class.php');
  24. /**
  25.  *
  26.  */
  27. require_once(TANGRA_MAIN_DIR.'modules_manager/tangra_module_release_relation_dbc.class.php');
  28. /**
  29.  *
  30.  */
  31. require_once(TANGRA_MAIN_DIR.'modules_manager/tangra_module_category_dbc.class.php');
  32. /**
  33.  *
  34.  */
  35. require_once(TANGRA_MAIN_DIR.'modules_manager/tangra_module_release_category_dbc.class.php');
  36. /**
  37.  *
  38.  */
  39. require_once(TANGRA_MAIN_DIR.'modules_manager/tangra_module_license_dbc.class.php');
  40.  
  41.  
  42. /**
  43.  * Module_CTRL_XML_Importer is used to import module.ctrl.xml files
  44.  *
  45.  * @package  tangra_lib
  46.  * @subpackage  modules_manager
  47.  */
  48.     /**
  49.      * Location type "local"
  50.      *
  51.      */
  52.     const LOCATION_TYPE_LOCAL = 0;
  53.     /**
  54.      * Location type "online repository"
  55.      *
  56.      */
  57.     const LOCATION_TYPE_ONLINE = 1;
  58.  
  59.     /**
  60.      * Imports module information parsed from $xml_str which have to contain valid XML
  61.      *
  62.      * @param DB_Connection $dbc 
  63.      * @param string $xml_str 
  64.      * @return array 
  65.      */
  66.     public static function import(DB_Connection $dbc$xml_str{
  67.         $ret array('status' => 'error''module_release_hid' => '''module_release_id' => 0);
  68.  
  69.         $xml @simplexml_load_string($xml_str);
  70.         if ($xml !== false{
  71.             $hid trim($xml->name);
  72.             if ($hid{
  73.                 $module new Tangra_Module_DBC();
  74.                 $hid addslashes($hid);
  75.  
  76.                 if (!$module->load_by_hid($dbc$hid)) {
  77.                     $module Module_CTRL_XML_Importer::create_module($dbc$xml);
  78.                     $module_release Module_CTRL_XML_Importer::create_module_release($dbc$xml$module->get_id());
  79.                     $ret['status''imported';
  80.                     $ret['module_hid'$module->get_hid();
  81.                     $ret['module_release_id'$module_release->get_id();
  82.                     $ret['module_release_hid'$module->get_hid().'-'.$module_release->get_version();
  83.                 else {
  84.                     $last_available_release Tangra_Module_Release_DBC::load_highest_online_release($dbc$module->get_id());
  85.                     $current_release_version trim($xml->version);
  86.  
  87.                     if ($last_available_release{
  88.                         $module_release new Tangra_Module_Release_DBC();
  89.  
  90.                         if ($module_release->load_by_module_and_version($dbc$module->get_id()$current_release_version)) {
  91.                             Module_CTRL_XML_Importer::update_module_release($dbc$xml$module_release);
  92.                             $ret['status''updated';
  93.                         else {
  94.                             $module_release Module_CTRL_XML_Importer::create_module_release($dbc$xml$module->get_id());
  95.                             $ret['status''imported';
  96.                         }
  97.                         $ret['module_release_hid'$module->get_hid().'-'.$module_release->get_version();
  98.                         $ret['module_release_id'$module_release->get_id();
  99.                     else {
  100.                         // no releases are found so we are importing
  101.                         if (Module_CTRL_XML_Importer::update_module($dbc$xml$module)) {
  102.                             $module_release Module_CTRL_XML_Importer::create_module_release($dbc$xml$module->get_id());
  103.                             $ret['module_release_id'$module_release->get_id();
  104.                             $ret['status''updated';
  105.                             $ret['module_hid'$module->get_hid();
  106.                             $ret['module_release_hid'$module->get_hid().'-'.$module_release->get_version();
  107.                         else {
  108.                             $ret['status''error';
  109.                         }
  110.                     }
  111.  
  112.                 }
  113.             }
  114.         }
  115.  
  116.         return $ret;
  117.     }
  118.  
  119.  
  120.     /**
  121.      * Captures basic module details as hid, description, maintainer, url and license
  122.      *
  123.      * @param DB_Connection $dbc 
  124.      * @param SimpleXMLElement $xml SimpleXMLElement instance usualy returned by simplexml_load_string
  125.      * @return array 
  126.      */
  127.     public static function capture_module_details(DB_Connection $dbc$xml{
  128.         $ret array('module' => array()'rez' => false'errors' => array());
  129.  
  130.         $hid trim($xml->name);
  131.         if ($hid{
  132.             $description trim($xml->description);
  133.             if ($description{
  134.                 $maintainer trim($xml->maintainer);
  135.                 if ($maintainer{
  136.                     $url trim($xml->url);
  137.  
  138.                     $license_hid trim($xml->licensehid);
  139.  
  140.                     $license new Tangra_Module_License_DBC();
  141.                     if ($license->load_by_hid($dbc$license_hid)) {
  142.                         $ret['rez'true;
  143.                         $ret['module']['hid'$hid;
  144.                         $ret['module']['description'$description;
  145.                         $ret['module']['maintainer'$maintainer;
  146.                         $ret['module']['url'$url;
  147.                         $ret['module']['license'$license->get_id();
  148.                     else {
  149.                         $ret['errors']['Cannot find license with HID = '.$license_hid;
  150.                     }
  151.                 else {
  152.                     $ret['errors']['Cannot find maintainer';
  153.                 }
  154.             else {
  155.                 $ret['errors']['Cannot find description';
  156.             }
  157.         else {
  158.             $ret['errors']['Cannot find module by HID';
  159.         }
  160.  
  161.  
  162.         return $ret;
  163.     }
  164.  
  165.  
  166.     /**
  167.      * Populates Tangra_Module_DBC object and saves it in DB
  168.      *
  169.      * @param DB_Connection $dbc 
  170.      * @param SimpleXMLElement $xml 
  171.      * @return Tangra_Module_DBC On success returns Tangra_Module_DBC, on failure false
  172.      * @internal
  173.      */
  174.     private static function create_module(DB_Connection $dbc$xml{
  175.         $ret false;
  176.  
  177.         $mod_details Module_CTRL_XML_Importer::capture_module_details($dbc$xml);
  178.         if ($mod_details['rez']{
  179.             $module new Tangra_Module_DBC();
  180.             $module->set_hid($mod_details['module']['hid']);
  181.             $module->set_description($mod_details['module']['description']);
  182.             $module->set_maintainer($mod_details['module']['maintainer']);
  183.             $module->set_url($mod_details['module']['url']);
  184.             $module->set_license($mod_details['module']['license']);
  185.  
  186.             $module->save($dbc);
  187.             $ret $module;
  188.         }
  189.  
  190.         return $ret;
  191.     }
  192.  
  193.  
  194.     /**
  195.      * Extracts module release details from SimpleXMLElement object
  196.      *
  197.      * @param SimpleXMLElement $xml 
  198.      * @return array 
  199.      */
  200.     public static function capture_module_release_details($xml{
  201.         $ret array('mod_release' => array(),
  202.                         'params' => array(),
  203.                         'relations' => array(),
  204.                         'category_hids' => array(),
  205.                         'rez' => false,
  206.                         'errors' => array());
  207.  
  208.         $hid trim($xml->name);
  209.         if ($hid{
  210.             $version trim($xml->version);
  211.             if ($version{
  212.                 $description trim($xml->description);
  213.                 if ($description{
  214.                     $maintainer trim($xml->maintainer);
  215.                     if ($maintainer{
  216.                         $url trim($xml->url);
  217.  
  218.                         $requiresphpversion trim($xml->requiresphpversion);
  219.  
  220.                         if ($requiresphpversion{
  221.                             $requirestangralib trim($xml->requirestangralib);
  222.                             if ($requirestangralib{
  223.                                 $params Module_CTRL_XML_Importer::captute_params($xml);
  224.                                 $relations Module_CTRL_XML_Importer::capture_relations($xml);
  225.  
  226.                                 $ret['rez'true;
  227.                                 $ret['mod_release']['hid'$hid;
  228.                                 $ret['mod_release']['version'$version;
  229.                                 $ret['mod_release']['description'$description;
  230.                                 $ret['mod_release']['maintainer'$maintainer;
  231.                                 $ret['mod_release']['url'$url;
  232.                                 $ret['mod_release']['requiresphpversion'$requiresphpversion;
  233.                                 $ret['mod_release']['requirestangralib'$requirestangralib;
  234.                                 $ret['params'$params;
  235.                                 $ret['relations'$relations;
  236.                                 foreach($xml->categoryhid as $chid{
  237.                                     $ret['category_hids'][trim($chid);
  238.                                 }
  239.                             else {
  240.                                 $ret['errors']['Cannot find requirestangralib';
  241.                             }
  242.                         else {
  243.                             $ret['errors']['Cannot find requiresphpversion';
  244.                         }
  245.                     else {
  246.                         $ret['errors']['Cannot find maintainer';
  247.                     }
  248.                 else {
  249.                     $ret['errors']['Cannot find description';
  250.                 }
  251.             else {
  252.                 $ret['errors']['Cannot find version';
  253.             }
  254.         else {
  255.             $ret['errors']['Cannot find hid';
  256.         }
  257.  
  258.         return $ret;
  259.     }
  260.  
  261.  
  262.     /**
  263.      * Extracts parameters from SimpleXMLElement object
  264.      *
  265.      * @param SimpleXMLElement $xml 
  266.      * @return array 
  267.      */
  268.     public static function captute_params($xml{
  269.         $ret array('req' => array()'hard' => array()'soft' => array());
  270.  
  271.         $params_req array();
  272.         if ($xml->param_required{
  273.             foreach($xml->param_required as $param{
  274.                 $ret['req'][trim($param);
  275.             }
  276.         }
  277.  
  278.         $params_hard array();
  279.         if ($xml->param_optional_hard{
  280.             foreach($xml->param_optional_hard as $param{
  281.                 $ret['hard'][trim($param);
  282.             }
  283.         }
  284.  
  285.         $params_soft array();
  286.         if ($xml->param_optional_soft{
  287.             foreach($xml->param_optional_soft as $param{
  288.                 $ret['soft'][trim($param);
  289.             }
  290.         }
  291.  
  292.         return $ret;
  293.     }
  294.  
  295.  
  296.     /**
  297.      * Extracts relations from SimpleXMLElement object
  298.      *
  299.      * @param SimpleXMLElement $xml 
  300.      * @return array 
  301.      */
  302.     public static function capture_relations($xml{
  303.         $ret array('depends' => array(),
  304.                         'recommends' => array(),
  305.                         'suggests' => array(),
  306.                         'enhances' => array(),
  307.                         'predepends' => array(),
  308.                         'conflicts' => array(),
  309.                         'provides' => array());
  310.  
  311.         if ($xml->depends{
  312.             foreach($xml->depends as $dep{
  313.                 $ret['depends'][trim($dep->module)trim($dep->versionrequirement);
  314.             }
  315.         }
  316.  
  317.         if ($xml->provides{
  318.             foreach($xml->provides as $prov{
  319.                 // TODO - this bellow is nonsense. Tag for "provides" must be "version", not "versionrequirement" (if any at all)
  320.                 // The problem is that too many modules contain "provides" tag and shall be chanded and released
  321.                 // May be here we need compatability fix which can parse both "version" and "versionrequirement"?
  322.                 $ret['provides'][trim($prov->module)trim($prov->versionrequirement);
  323.             }
  324.         }
  325.  
  326.         if ($xml->conflicts{
  327.             foreach($xml->conflicts as $confl{
  328.                 $ret['conflicts'][trim($confl->module)trim($confl->versionrequirement);
  329.             }
  330.         }
  331.  
  332.         if ($xml->recommends{
  333.             foreach($xml->recommends as $rec{
  334.                 $ret['recommends'][trim($rec->module)trim($rec->versionrequirement);
  335.             }
  336.         }
  337.  
  338.         if ($xml->suggests{
  339.             foreach($xml->suggests as $sug{
  340.                 $ret['suggests'][trim($sug->module)trim($sug->versionrequirement);
  341.             }
  342.         }
  343.  
  344.         if ($xml->enhances{
  345.             foreach($xml->enhances as $enh{
  346.                 $ret['enhances'][trim($enh->module)trim($enh->versionrequirement);
  347.             }
  348.         }
  349.  
  350.         if ($xml->predepends{
  351.             foreach($xml->predepends as $pred{
  352.                 $ret['predepends'][trim($pred->module)trim($pred->versionrequirement);
  353.             }
  354.         }
  355.  
  356.         return $ret;
  357.     }
  358.  
  359.  
  360.     /**
  361.      * Creates instance of Tangra_Module_Release_DBC, populates it and saves in DB
  362.      *
  363.      * @param DB_Connection $dbc 
  364.      * @param SimpleXMLElement $xml 
  365.      * @param integer $module_id 
  366.      * @return Tangra_Module_Release_DBC on success returns Tangra_Module_Release_DBC object, on failure - false
  367.      * @internal
  368.      */
  369.     private static function create_module_release(DB_Connection $dbc$xml$module_id{
  370.         $ret false;
  371.  
  372.         $mod_release_details Module_CTRL_XML_Importer::capture_module_release_details($xml);
  373.  
  374.         if ($mod_release_details['rez']{
  375.             $mod_release new Tangra_Module_Release_DBC();
  376.             $mod_release->set_module($module_id);
  377.             $mod_release->set_version($mod_release_details['mod_release']['version']);
  378.             $mod_release->set_description($mod_release_details['mod_release']['description']);
  379.             $mod_release->set_maintainer($mod_release_details['mod_release']['maintainer']);
  380.             $mod_release->set_url($mod_release_details['mod_release']['url']);
  381.             $mod_release->set_requires_tangra_lib_version($mod_release_details['mod_release']['requiresphpversion']);
  382.             $mod_release->set_requires_php_version($mod_release_details['mod_release']['requirestangralib']);
  383.             $mod_release->set_online(true);
  384.             $mod_release->save($dbc);
  385.  
  386.             Module_CTRL_XML_Importer::create_release_params_and_relations($dbc$mod_release_details$mod_release->get_id());
  387.             Module_CTRL_XML_Importer::create_links_to_categories($dbc$mod_release_details$mod_release->get_id());
  388.  
  389.             $ret $mod_release;
  390.             return $ret;
  391.          }
  392.  
  393.         return $ret;
  394.     }
  395.  
  396.  
  397.     /**
  398.      * Creates release parameters and relations (Tangra_Module_Release_Param_DBC and Tangra_Module_Release_Relation_DBC)
  399.      *
  400.      * @param DB_Connection $dbc 
  401.      * @param array $mod_release_details Array returned by Module_CTRL_XML_Importer::capture_module_release_details()
  402.      * @param integer $mod_release_id ID of module release
  403.      * @internal
  404.      */
  405.     private static function create_release_params_and_relations(DB_Connection $dbc$mod_release_details$mod_release_id{
  406.         foreach($mod_release_details['params']['req'as $param_name{
  407.             $param new Tangra_Module_Release_Param_DBC();
  408.             $param->set_name($param_name);
  409.             $param->set_module_release($mod_release_id);
  410.             $param->set_type(Tangra_Module_Release_Param::TYPE_REQUIRED);
  411.             $param->save($dbc);
  412.         }
  413.  
  414.         foreach($mod_release_details['params']['hard'as $param_name{
  415.             $param new Tangra_Module_Release_Param_DBC();
  416.             $param->set_name($param_name);
  417.             $param->set_module_release($mod_release_id);
  418.             $param->set_type(Tangra_Module_Release_Param::TYPE_HARD_OPTIONAL);
  419.             $param->save($dbc);
  420.         }
  421.  
  422.         foreach($mod_release_details['params']['soft'as $param_name{
  423.             $param new Tangra_Module_Release_Param_DBC();
  424.             $param->set_name($param_name);
  425.             $param->set_module_release($mod_release_id);
  426.             $param->set_type(Tangra_Module_Release_Param::TYPE_SOFT_OPTIONAL);
  427.             $param->save($dbc);
  428.         }
  429.  
  430.         foreach($mod_release_details['relations']['depends'as $module_hid => $version_req{
  431.             $rel new Tangra_Module_Release_Relation_DBC();
  432.             $rel->set_module_release($mod_release_id);
  433.             $rel->set_relation_to($module_hid);
  434.             $rel->set_version_requirement($version_req);
  435.             $rel->set_type(Tangra_Module_Release_Relation_DBC::TYPE_DEPENDS);
  436.             $rel->save($dbc);
  437.         }
  438.  
  439.         foreach($mod_release_details['relations']['provides'as $module_hid => $version_req{
  440.             $rel new Tangra_Module_Release_Relation_DBC();
  441.             $rel->set_module_release($mod_release_id);
  442.             $rel->set_relation_to($module_hid);
  443.             $rel->set_version_requirement($version_req);
  444.             $rel->set_type(Tangra_Module_Release_Relation_DBC::TYPE_PROVIDES);
  445.             $rel->save($dbc);
  446.         }
  447.  
  448.         foreach($mod_release_details['relations']['conflicts'as $module_hid => $version_req{
  449.             $rel new Tangra_Module_Release_Relation_DBC();
  450.             $rel->set_module_release($mod_release_id);
  451.             $rel->set_relation_to($module_hid);
  452.             $rel->set_version_requirement($version_req);
  453.             $rel->set_type(Tangra_Module_Release_Relation_DBC::TYPE_CONFLICTS);
  454.             $rel->save($dbc);
  455.         }
  456.  
  457.         foreach($mod_release_details['relations']['recommends'as $module_hid => $version_req{
  458.             $rel new Tangra_Module_Release_Relation_DBC();
  459.             $rel->set_module_release($mod_release_id);
  460.             $rel->set_relation_to($module_hid);
  461.             $rel->set_version_requirement($version_req);
  462.             $rel->set_type(Tangra_Module_Release_Relation_DBC::TYPE_RECOMMENDS);
  463.             $rel->save($dbc);
  464.         }
  465.  
  466.         foreach($mod_release_details['relations']['suggests'as $module_hid => $version_req{
  467.             $rel new Tangra_Module_Release_Relation_DBC();
  468.             $rel->set_module_release($mod_release_id);
  469.             $rel->set_relation_to($module_hid);
  470.             $rel->set_version_requirement($version_req);
  471.             $rel->set_type(Tangra_Module_Release_Relation_DBC::TYPE_SUGGESTS);
  472.             $rel->save($dbc);
  473.         }
  474.  
  475.         foreach($mod_release_details['relations']['enhances'as $module_hid => $version_req{
  476.             $rel new Tangra_Module_Release_Relation_DBC();
  477.             $rel->set_module_release($mod_release_id);
  478.             $rel->set_relation_to($module_hid);
  479.             $rel->set_version_requirement($version_req);
  480.             $rel->set_type(TANGRA_MODULE_RELEASE_RELATION_DBC::TYPE_ENHANCES);
  481.             $rel->save($dbc);
  482.         }
  483.  
  484.         foreach($mod_release_details['relations']['predepends'as $module_hid => $version_req{
  485.             $rel new Tangra_Module_Release_Relation_DBC();
  486.             $rel->set_module_release($mod_release_id);
  487.             $rel->set_relation_to($module_hid);
  488.             $rel->set_version_requirement($version_req);
  489.             $rel->set_type(Tangra_Module_Release_Relation_DBC::TYPE_PREDEPENDS);
  490.             $rel->save($dbc);
  491.         }
  492.     }
  493.  
  494.  
  495.     /**
  496.      * Creates links (Tangra_Module_Release_Category_DBC) to module categories
  497.      *
  498.      * @param DB_Connection $dbc 
  499.      * @param array $mod_release_details Array returned by Module_CTRL_XML_Importer::capture_module_release_details()
  500.      * @param integer $mod_release_id ID of module release
  501.      * @internal
  502.      */
  503.     private static function create_links_to_categories(DB_Connection $dbc$mod_release_details$mod_release_id{
  504.         foreach($mod_release_details['category_hids'as $chid{
  505.             $category new Tangra_Module_Category_DBC();
  506.             if ($category->load_by_hid($dbc$chid)) {
  507.                 $cat_link new Tangra_Module_Release_Category_DBC();
  508.                 $cat_link->set_category($category->get_id());
  509.                 $cat_link->set_module_release($mod_release_id);
  510.                 $cat_link->save($dbc);
  511.             }
  512.         }
  513.     }
  514.  
  515.  
  516.     /**
  517.      * Updates Module_CTRL_XML_Importer object and saves it in DB
  518.      *
  519.      * @param DB_Connection $dbc 
  520.      * @param SimpleXMLElement $xml 
  521.      * @param Tangra_Module_DBC $module 
  522.      * @return Tangra_Module_DBC On success returns Tangra_Module_DBC object, on failure - false
  523.      * @internal
  524.      */
  525.     private static function update_module(DB_Connection $dbc$xmlTangra_Module_DBC $module{
  526.         $ret false;
  527.  
  528.         $mod_details Module_CTRL_XML_Importer::capture_module_details($dbc$xml);
  529.         if ($mod_details['rez']{
  530.             $module->set_description($mod_details['module']['description']);
  531.             $module->set_maintainer($mod_details['module']['maintainer']);
  532.             $module->set_url($mod_details['module']['url']);
  533.             $module->set_license($mod_details['module']['license']);
  534.             $module->save($dbc);
  535.  
  536.             $ret $module;
  537.         }
  538.  
  539.         return $ret;
  540.     }
  541.  
  542.  
  543.     /**
  544.      * Updates Tangra_Module_Release_DBC object and saves it in DB
  545.      *
  546.      * @param DB_Connection $dbc 
  547.      * @param SimpleXMLElement $xml 
  548.      * @param Tangra_Module_Release_DBC $mod_release 
  549.      * @return boolean On success returns true, on failure - false
  550.      * @internal
  551.      */
  552.     private static function update_module_release(DB_Connection $dbc$xmlTangra_Module_Release_DBC $mod_release{
  553.         $ret false;
  554.  
  555.         $mod_release_details Module_CTRL_XML_Importer::capture_module_release_details($xml);
  556.         if ($mod_release_details{
  557.             $mod_release->set_version($mod_release_details['mod_release']['version']);
  558.             $mod_release->set_description($mod_release_details['mod_release']['description']);
  559.             $mod_release->set_maintainer($mod_release_details['mod_release']['maintainer']);
  560.             $mod_release->set_url($mod_release_details['mod_release']['url']);
  561.             $mod_release->set_requires_tangra_lib_version($mod_release_details['mod_release']['requiresphpversion']);
  562.             $mod_release->set_requires_php_version($mod_release_details['mod_release']['requirestangralib']);
  563.             $mod_release->set_online(true);
  564.             $mod_release->save($dbc);
  565.  
  566.             Tangra_Module_Release_Param_DBC::delete_for_release($dbc$mod_release->get_id());
  567.             Tangra_Module_Release_Relation_DBC::delete_for_release($dbc$mod_release->get_id());
  568.             Module_CTRL_XML_Importer::create_release_params_and_relations($dbc$mod_release_details$mod_release->get_id());
  569.             Tangra_Module_Release_Category_DBC::delete_for_release($dbc$mod_release->get_id());
  570.             Module_CTRL_XML_Importer::create_links_to_categories($dbc$mod_release_details$mod_release->get_id());
  571.  
  572.             $ret true;
  573.         }
  574.  
  575.         return $ret;
  576.     }
  577.  
  578. }