X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=include%2FPlugins.php;h=dc55ac7f603a740536378564c6d0bccf6b62fd6b;hb=8edec79dfecfe7ff0c9edea934487eced50d88e2;hp=120e22c9376628f8ad23ed6be44cbd26952f1ed8;hpb=7aff44b2a3193e43aedfd7bf7fc3801bcffcf3e0;p=diogenes.git diff --git a/include/Plugins.php b/include/Plugins.php index 120e22c..dc55ac7 100644 --- a/include/Plugins.php +++ b/include/Plugins.php @@ -20,23 +20,21 @@ // dependency on PEAR require_once 'System.php'; -require_once 'Tree/Node.php'; -require_once 'Plugin/Skel.php'; - /** This class describes Diogenes' plugins. */ class Diogenes_Plugins { + /** Array of currently loaded plugins */ + var $loaded = array(); + /** Directory that holds the plugins cache files */ var $cachedir; - + /** Directory that holds the plugins */ var $plugdir; - - /** Plugins that will be sent to trace */ - var $log = array(); - + + /** Constructs a new holder for Diogenes plugins. * * @param $dbh @@ -47,7 +45,7 @@ class Diogenes_Plugins { $this->dbh =& $dbh; $this->plugdir = $plugdir; - $this->cachedir = $cachedir; + $this->cachedir = $cachedir; } @@ -60,77 +58,89 @@ class Diogenes_Plugins $cachefile = $this->cachedir . "/" . ($barrel ? $barrel : "__diogenes__") . ".plugins"; return $cachefile; } - - + + /** Return the cache entry for specified plugin * * @param $cache * @param $barrel * @param $page * @param $plugin - */ + */ function cacheGet($cache, $barrel, $page, $plugin) { - $p_node = $this->cacheGetPageNode($cache, $barrel, $page); - return $p_node->data[$plugin]; + foreach ($cache as $plugentry) + { + if (($plugentry['plugin'] == $plugin) && ($plugentry['page'] == $page)) + { + return $plugentry; + } + } + return; } - - /** Return the cache entry for specified plugin + + /** Return the cache entry for a plugin at a specified position * * @param $cache * @param $barrel * @param $page - * @param $plugin - */ - function cacheGetPageNode($cache, $barrel, $page) + * @param $pos + */ + function cacheGetAtPos($cache, $barrel, $page, $pos) { - if ($page) { - $p_node = $cache->getChild($page); - } else { - $p_node = $cache; - } - return $p_node; - } - + foreach ($cache as $plugentry) + { + if (($plugentry['pos'] == $pos) && ($plugentry['page'] == $page)) + { + return $plugentry; + } + } + } + /** List the plugins that are active in a given context * * @param $cache * @param $barrel - * @param $page + * @param $page */ - function cacheGetActive($cache, $barrel, $page) + function cachedActive($cache, $barrel, $page) { - $p_node = $this->cacheGetPageNode($cache, $barrel, $page); $plugins = array(); - foreach ($p_node->data as $plugname => $plugentry) + foreach ($cache as $plug) { - //echo "cacheGetActive : examining $plugname (status {$plugentry['status']})
\n"; - if ($plugentry['status'] & PLUG_ACTIVE) + if ($plug['page'] == $page) { - //echo "cacheGetActive : adding $plugname
\n"; - $plugins[$plugname] = $plugentry; + array_push($plugins, $plug); } } - return $plugins; + return $plugins; } - + /** Returns an array of cache entries representing the available plugins * in a given context * * @param $cache * @param $barrel * @param $page - */ - function cacheGetVisible($cache, $barrel, $page) - { - $p_node = $this->cacheGetPageNode($cache, $barrel, $page); - return $p_node->data; + */ + function cachedAvailable($cache, $barrel, $page) + { + $available = array(); + foreach ($cache as $plugentry) + { + $plugfile = $this->plugdir."/".$plugentry['plugin'].".php"; + if (file_exists($plugfile) and ($plugentry['page'] == 0) and (!$page or $plugentry['active'])) + { + array_push($available, $plugentry['plugin']); + } + } + return $available; } - - + + /** Remove database references to plugins that are not available. */ function clean_database(&$page) @@ -150,165 +160,109 @@ class Diogenes_Plugins */ } - - /** Build view for current level. - */ - function compileNode($node, &$outparent, $index) - { - $outvals = array(); - foreach ($outparent->data as $plugin => $parentval) - { - //echo "Processing plugin '$plugin' for <{$node->name}>
\n"; - $outval = ''; - if (($parentval['status'] & PLUG_ACTIVE) || !($parentval['status'] & PLUG_LOCK)) - { - //echo "* plugin '$plugin' not locked off parent level
\n"; - $outval = $parentval; - if ((is_array($node->data[$plugin])) && ($node->data[$plugin]['status'] & PLUG_SET)) - { - //echo "** plugin set at current level
\n"; - $outval['params'] = $node->data[$plugin]['params']; - if (!($parentval['status'] & PLUG_LOCK)) { - //echo "*** plugin status set to DB-specified value
\n"; - $outval['status'] = $node->data[$plugin]['status']; - } else { - $outval['status'] = $parentval['status']; - } - } else { - //echo "** plugin unset at current level
\n"; - } - } - - // add the plugin to output - if (is_array($outval)) - { - $outvals[$plugin] = $outval; - } - } - $outnode = new Diogenes_Tree_Node($outvals, $node->name); - //echo "
"; - - // recurse into children - foreach ($node->children as $cindex => $child) - { - $this->compileNode($child, $outnode, $cindex); - } - - // add the produced node - $outparent->setChild($index, $outnode); - } - - + /** Compile plugin cache. * + * @param $cachefile * @param $barrel */ - function compileCache($barrel, &$caller) + function compileCache($cachefile, $barrel) { - $caller->info("Recompiling " .($barrel ? "plugin cache for barrel '$barrel'" : "global plugin cache")); - - // get the list of all plugins present on the system - $allplugins = array(); - $plugfiles = System::find($this->plugdir.' -type f -name *.php'); - foreach ($plugfiles as $file) { - $name = basename($file); - $name = substr($name, 0, -4); - array_push($allplugins, $name); - } - - $defcache = array(); - // fill initial values - foreach ($allplugins as $plugin) - { - $plug_h = $this->load($plugin); - $defcache[$plugin] = $plug_h->toArray(); - } - - // get DB values - $dbcache = array(); - - $sql_limit = $barrel ? " where barrel='{$barrel}' or barrel=''" : ""; - $sql = "select barrel, page, plugin, status, params from diogenes_plugin" . $sql_limit; - $res = $this->dbh->query($sql); - while($row = mysql_fetch_row($res)) - { - $c_barrel = array_shift($row); - $c_page = array_shift($row); - $plugin = array_shift($row); - $plugentry = array( - 'status' => $row[0], - 'params' => ($row[1] ? var_decode_bin($row[1]) : array()) - ); - $plug_h = $this->load($plugin, $plugentry); - //echo "Got params from DB for '$plugin', barrel '$c_barrel', page '$c_page' : ".$row[2]."
"; - $dbcache[$c_barrel][$c_page][$plugin] = $plug_h->toArray(); + if (!$fp = fopen($cachefile, "w")) { + trigger_error("failed to open '$cachefile' for writing", E_USER_ERROR); } - mysql_free_result($res); - - // build the input tree - $globals_node = new Diogenes_Tree_Node($dbcache[''][0], 'globals defaults'); - $sql_limit = $barrel ? " where alias='{$barrel}'" : " where alias!=''"; - $res = $this->dbh->query("select alias from diogenes_site" . $sql_limit); - while(list($c_barrel) = mysql_fetch_row($res)) - { - $barrel_node = new Diogenes_Tree_Node($dbcache[$c_barrel][0], "barrel '$c_barrel' defaults"); - $res2 = $this->dbh->query("select PID from {$c_barrel}_page"); - while(list($page) = mysql_fetch_row($res2)) - { - $page_node = new Diogenes_Tree_Node($dbcache[$c_barrel][$page], "barrel '$c_barrel' page $page"); - $barrel_node->setChild($page, $page_node); - } - mysql_free_result($res2); - $globals_node->setChild($c_barrel, $barrel_node); - } - mysql_free_result($res); - // compile the cache - $top_out_node = new Diogenes_Tree_Node($defcache, 'plugin defaults'); - $this->compileNode($globals_node, $top_out_node, 'globals'); - $globals_out_node = $top_out_node->getChild('globals'); - //echo "
" . $top_out_node->dump() . "

"; - - // produce dump(s) - if ($barrel) { - $dump_node = $globals_out_node->getChild($barrel); - $dump_node->writeFile($this->cachefile($barrel)); - $dump_node->writeFile($this->cachefile($barrel).".txt", NODE_DUMP_TEXT); + // get the list of available plugins + $available = array(); + if (!$barrel) { + + $plugfiles = System::find($this->plugdir.' -type f -name *.php'); + foreach ($plugfiles as $file) { + $name = basename($file); + $name = substr($name, 0, -4); + array_push($available, $name); + } + } else { - $globals_out_node->writeFile($this->cachefile($barrel), NODE_DUMP_NOCHILDREN); - $globals_out_node->writeFile($this->cachefile($barrel).".txt", NODE_DUMP_NOCHILDREN | NODE_DUMP_TEXT); - foreach ($globals_out_node->children as $c_barrel => $dump_node) + + $sql = "select plugin from diogenes_plugin where page=0 AND barrel=''"; + $res = $this->dbh->query($sql); + while (list($plugin) = mysql_fetch_row($res)) { - $dump_node->writeFile($this->cachefile($c_barrel)); - $dump_node->writeFile($this->cachefile($c_barrel).".txt", NODE_DUMP_TEXT); + array_push($available, $plugin); } - } - } - + mysql_free_result($res); + } + +/* + echo "compile : available
";
+   print_r($available);
+   echo "
"; +*/ + // get active plugins + $sql = "select page, pos, plugin, params from diogenes_plugin where barrel='{$barrel}' order by page, pos"; + $res = $this->dbh->query($sql); + $active = array(); + while ($row = mysql_fetch_row($res)) + { + $plugin = $row[2]; + if (in_array($plugin, $available)) { + array_unshift($row, 1); + fputs($fp, join("\t", $row) . "\n"); + if (!$row[1]) { + array_push($active, $plugin); + //echo "compileCache : adding active plugin $plugin
"; + } + } + } + mysql_free_result($res); + + // add inactive plugins + foreach ($available as $plugin) + { + if (!in_array($plugin, $active)) + { + //echo "compileCache : adding inactive plugin $plugin
"; + $row = array(0, 0, 0, $plugin, ''); + fputs($fp, join("\t", $row) . "\n"); + } + } + + fclose($fp); + + //$this->log("rcs_commit","{$this->alias}:$dir/$file:$message"); + } + + /** Load the specified plugin * * @param $plugentry */ - function load($plugin, $plugentry = '') + function load($plugentry) { + $plugin = $plugentry['plugin']; $plugfile = $this->plugdir."/$plugin.php"; if (!file_exists($plugfile)) { trigger_error("could not find plugin file '$plugfile'", E_USER_WARNING); return; } + include_once($plugfile); + if (!class_exists($plugin)) { trigger_error("could not find class '$plugin'", E_USER_WARNING); return; } - + // load and register plugin - $plug_h = new $plugin(); - if (is_array($plugentry)) - $plug_h->fromArray($plugentry); - - return $plug_h; + $plug = new $plugin(); + $plug->pos = $plugentry['pos']; + $plug->active = $plugentry['active']; + $plug->setParams($plugentry['params']); + $this->loaded[$plugin] =& $plug; + + return $plug; } @@ -322,33 +276,62 @@ class Diogenes_Plugins if (!file_exists($cachefile)) { return array(); } - - return Diogenes_Tree_Node::readFile($cachefile); + + if (!$fp = fopen($cachefile, "r")) { + trigger_error("failed to open '$cachefile' for reading", E_USER_WARNING); + return; + } + + $plugins = array(); + while ($line = fgets($fp)) + { + // drop end of line + $line = substr($line, 0, -1); + $bits = explode("\t", $line); + $plug = array( + 'active' => $bits[0], + 'page' => $bits[1], + 'pos' => $bits[2], + 'plugin' => $bits[3], + 'params' => $bits[4], + ); + array_push($plugins, $plug); + } + + fclose($fp); + + return $plugins; } - + /** Prepare plugins trace for output - */ + */ function trace_format() { - $out = ''."\n"; - $odd = 0; - foreach ($this->log as $key => $val) - { - $trclass = $odd ? ' class="odd"' : ''; - $out .= "\n"; - $out .= "\n"; - $out .= "\n"; - $out .= "\n"; - if (!empty($val['params'])) { - $out .= "\n"; + $out = ""; + foreach ($this->loaded as $key => $val) + { + $out .= '
{$val['name']} v{$val['version']}
status{$val['status']}
type{$val['type']}
description{$val['description']}
parameters".var_encode_html($val['params'])."
'; + $out .= ''; + if (isset($val->pos)) { + $out .= ''; } - $odd = ($odd+1) % 2; + $out .= ''; + $out .= ''; + if (empty($val->params)) { + $out .= ''; + foreach ($val->params as $skey => $sval) + { + $out .= ""; + } + } + $out .= "
'.$key.' v'.$val->version.'
position'.$val->pos.'
type'.$val->type.'
description'.$val->description.'
parameters
$skey$sval

"; } - $out .= "\n"; return $out; } - + + + } ?>