/** * Load plugin class with dependencies first * * @param AJXP_Plugin $plugin * @param array $pluginsPool */ private function recursiveLoadPlugin($plugin, $pluginsPool) { if ($plugin->loadingState != "") { return; } $dependencies = $plugin->getDependencies(); $plugin->loadingState = "lock"; foreach ($dependencies as $dependencyId) { if (isset($pluginsPool[$dependencyId])) { $this->recursiveLoadPlugin($pluginsPool[$dependencyId], $pluginsPool); } else { if (strpos($dependencyId, "+") !== false) { foreach (array_keys($pluginsPool) as $pId) { if (strpos($pId, str_replace("+", "", $dependencyId)) === 0) { $this->recursiveLoadPlugin($pluginsPool[$pId], $pluginsPool); } } } } } $plugType = $plugin->getType(); if (!isset($this->registry[$plugType])) { $this->registry[$plugType] = array(); } $options = $this->confStorage->loadPluginConfig($plugType, $plugin->getName()); if ($plugin->isEnabled() || isset($options["AJXP_PLUGIN_ENABLED"]) && $options["AJXP_PLUGIN_ENABLED"] === true) { $plugin = $this->instanciatePluginClass($plugin); } $plugin->loadConfigs($options); $this->registry[$plugType][$plugin->getName()] = $plugin; $plugin->loadingState = "loaded"; }
public function listActions($dir, $root = NULL, $hash = null, $returnNodes = false) { $allNodes = array(); $parts = explode("/", $dir); $pServ = AJXP_PluginsService::getInstance(); $activePlugins = $pServ->getActivePlugins(); $types = $pServ->getDetectedPlugins(); if (count($parts) == 1) { // list all types if (!$returnNodes) { AJXP_XMLWriter::sendFilesListComponentConfig('<columns switchGridMode="filelist" template_name="ajxp_conf.plugins_folder"> <column messageId="ajxp_conf.101" attributeName="ajxp_label" sortType="String"/> </columns>'); } ksort($types); foreach ($types as $t => $tPlugs) { $meta = array("icon" => "folder_development.png", "plugin_id" => $t); $nodeKey = "/{$root}/actions/" . $t; if (in_array($nodeKey, $this->currentBookmarks)) { $meta = array_merge($meta, array("ajxp_bookmarked" => "true", "overlay_icon" => "bookmark.png")); } $xml = AJXP_XMLWriter::renderNode($nodeKey, ucfirst($t), false, $meta, true, false); if ($returnNodes) { $allNodes[$nodeKey] = $xml; } else { print $xml; } } } else { if (count($parts) == 2) { // list plugs $type = $parts[1]; if (!$returnNodes) { AJXP_XMLWriter::sendFilesListComponentConfig('<columns switchDisplayMode="detail" template_name="ajxp_conf.plugins_folder"> <column messageId="ajxp_conf.101" attributeName="ajxp_label" sortType="String"/> <column messageId="ajxp_conf.103" attributeName="actions" sortType="String"/> </columns>'); } $pObject = new AJXP_Plugin("", ""); foreach ($types[$type] as $pId => $pObject) { $actions = $pObject->getManifestRawContent("//action/@name", "xml", true); $actLabel = array(); if ($actions->length) { foreach ($actions as $node) { $actLabel[] = $node->nodeValue; } } $meta = array("icon" => "preferences_plugin.png", "plugin_id" => $pObject->getId(), "actions" => implode(", ", $actLabel)); $nodeKey = "/{$root}/actions/{$type}/" . $pObject->getName(); if (in_array($nodeKey, $this->currentBookmarks)) { $meta = array_merge($meta, array("ajxp_bookmarked" => "true", "overlay_icon" => "bookmark.png")); } $xml = AJXP_XMLWriter::renderNode($nodeKey, $pObject->getManifestLabel(), false, $meta, true, false); if ($returnNodes) { $allNodes[$nodeKey] = $xml; } else { print $xml; } } } else { if (count($parts) == 3) { // list actions $type = $parts[1]; $name = $parts[2]; $mess = ConfService::getMessages(); if (!$returnNodes) { AJXP_XMLWriter::sendFilesListComponentConfig('<columns switchDisplayMode="full" template_name="ajxp_conf.plugins_folder"> <column messageId="ajxp_conf.101" attributeName="ajxp_label" sortType="String" defaultWidth="10%"/> <column messageId="ajxp_conf.103" attributeName="parameters" sortType="String" fixedWidth="30%"/> </columns>'); } $pObject = new AJXP_Plugin("", ""); $pObject = $types[$type][$name]; $actions = $pObject->getManifestRawContent("//action", "xml", true); $allNodesAcc = array(); if ($actions->length) { foreach ($actions as $node) { $xPath = new DOMXPath($node->ownerDocument); $callbacks = $xPath->query("processing/serverCallback", $node); if (!$callbacks->length) { continue; } $callback = $callbacks->item(0); $actName = $actLabel = $node->attributes->getNamedItem("name")->nodeValue; $text = $xPath->query("gui/@text", $node); if ($text->length) { $actLabel = $actName . " (" . $mess[$text->item(0)->nodeValue] . ")"; } $params = $xPath->query("processing/serverCallback/input_param", $node); $paramLabel = array(); if ($callback->getAttribute("developerComment") != "") { $paramLabel[] = "<span class='developerComment'>" . $callback->getAttribute("developerComment") . "</span>"; } $restPath = ""; if ($callback->getAttribute("restParams")) { $restPath = "/api/{$actName}/" . ltrim($callback->getAttribute("restParams"), "/"); } if ($restPath != null) { $paramLabel[] = "<span class='developerApiAccess'>" . "API Access : " . $restPath . "</span>"; } if ($params->length) { $paramLabel[] = "Expected Parameters :"; foreach ($params as $param) { $paramLabel[] = '. [' . $param->getAttribute("type") . '] <b>' . $param->getAttribute("name") . ($param->getAttribute("mandatory") == "true" ? '*' : '') . '</b> : ' . $param->getAttribute("description"); } } $parameters = ""; $meta = array("icon" => "preferences_plugin.png", "action_id" => $actName, "parameters" => '<div class="developerDoc">' . implode("<br/>", $paramLabel) . '</div>', "rest_params" => $restPath); $nodeKey = "/{$root}/actions/{$type}/" . $pObject->getName() . "/{$actName}"; if (in_array($nodeKey, $this->currentBookmarks)) { $meta = array_merge($meta, array("ajxp_bookmarked" => "true", "overlay_icon" => "bookmark.png")); } $allNodes[$nodeKey] = $allNodesAcc[$actName] = AJXP_XMLWriter::renderNode($nodeKey, $actLabel, true, $meta, true, false); } ksort($allNodesAcc); if (!$returnNodes) { print implode("", array_values($allNodesAcc)); } } } } } return $allNodes; }