diff --git a/include/core/utils/loader_utils.h b/include/core/utils/loader_utils.h index bb01d15ec925ff9e405a8666cce59ce93405904c..79da78a96e66a119514f42949c6c5e1308f27a4c 100644 --- a/include/core/utils/loader_utils.h +++ b/include/core/utils/loader_utils.h @@ -22,6 +22,7 @@ #include "core/utils/loader.h" #include "yaml-cpp/yaml.h" +#include "core/common/wolf.h" namespace wolf { @@ -30,4 +31,9 @@ void searchAndLoadPlugins(const YAML::Node& _node, LoaderPtr _l std::set<std::string> searchPlugins(const YAML::Node& _node, std::list<YAML::Node>& _visited_nodes); void appendPluginsInstalledSchemaFolders(const YAML::Node& _node, std::vector<std::string>& _local_folders); +void loadLibrary(LoaderPtr _loader, const std::string& lib_name, const std::string& root); +void searchAndLoadLibraries(const YAML::Node& _node, LoaderPtr _loader, const std::string& lib_field, const std::string& root); +std::set<std::string> searchFieldsRecursive(const YAML::Node& _node, std::list<YAML::Node>& _visited_nodes, const std::string& field); +// void appendPluginsInstalledSchemaFolders(const YAML::Node& _node, std::vector<std::string>& _local_folders); + } /* namespace wolf */ diff --git a/src/utils/loader_utils.cpp b/src/utils/loader_utils.cpp index 0e60bd93157114724311524f407d4325a96575ea..06de6634b5dcb2794f4f3f65f170ed702c0d106b 100644 --- a/src/utils/loader_utils.cpp +++ b/src/utils/loader_utils.cpp @@ -20,11 +20,87 @@ #include "core/utils/loader_utils.h" #include "core/utils/folder_registry.h" -#include "core/common/wolf.h" namespace wolf { void loadPlugin(LoaderPtr _loader, const std::string& plugin_name) +{ + loadLibrary(_loader, "libwolf" + plugin_name, _WOLF_LIB_DIR); + // #if __APPLE__ + // std::string lib_extension = ".dylib"; + // #else + // std::string lib_extension = ".so"; + // #endif + + // std::string plugins_path = _WOLF_LIB_DIR; + // std::string plugin = plugins_path + "/libwolf" + plugin_name + lib_extension; + // WOLF_DEBUG("Loading plugin " + plugin_name + " in " + plugins_path); + // _loader->load(plugin); +} + +void searchAndLoadPlugins(const YAML::Node& _node, LoaderPtr _loader) +{ + searchAndLoadLibraries(_node, _loader, "plugin", _WOLF_LIB_DIR); + // std::list<YAML::Node> visited_nodes; + // auto plugins = searchPlugins(_node, visited_nodes); + // for (auto plugin : plugins) + // if (not FolderRegistry::isFolderRegistered(plugin)) loadPlugin(_loader, plugin); +} + +std::set<std::string> searchPlugins(const YAML::Node& _node, std::list<YAML::Node>& _visited_nodes) +{ + return searchFieldsRecursive(_node, _visited_nodes, "plugin"); + // std::set<std::string> plugins; + + // if (std::find(_visited_nodes.begin(), _visited_nodes.end(), _node) != _visited_nodes.end()) return {}; + + // _visited_nodes.push_back(_node); + + // if (_node.IsMap()) + // { + // for (const auto& pair : _node) + // { + // // is plugin? + // if (pair.first.as<std::string>() == "plugin") + // plugins.insert(pair.second.as<std::string>()); + + // else + // { + // auto rec_plugins = searchPlugins(pair.second, _visited_nodes); + // plugins.insert(rec_plugins.begin(), rec_plugins.end()); + // } + // } + // } + // else if (_node.IsSequence()) + // { + // for (const auto& child : _node) + // { + // auto rec_plugins = searchPlugins(child, _visited_nodes); + // plugins.insert(rec_plugins.begin(), rec_plugins.end()); + // } + // } + // else if (_node.IsScalar()) + // { + // return {}; + // } + + // return plugins; +} + +void appendPluginsInstalledSchemaFolders(const YAML::Node& _node, std::vector<std::string>& _local_folders) +{ + auto temp_loader = std::make_shared<Loader>(); + + std::list<YAML::Node> visited_nodes; + auto plugins = searchPlugins(_node, visited_nodes); + + for (auto plugin : plugins) + if (not FolderRegistry::isFolderRegistered(plugin)) loadPlugin(temp_loader, plugin); + + FolderRegistry::appendRegisteredFolders(_local_folders); +} + +void loadLibrary(LoaderPtr _loader, const std::string& lib_name, const std::string& root) { #if __APPLE__ std::string lib_extension = ".dylib"; @@ -32,23 +108,28 @@ void loadPlugin(LoaderPtr _loader, const std::string& plugin_name) std::string lib_extension = ".so"; #endif - std::string plugins_path = _WOLF_LIB_DIR; - std::string plugin = plugins_path + "/libwolf" + plugin_name + lib_extension; - WOLF_DEBUG("Loading plugin " + plugin_name + " in " + plugins_path); - _loader->load(plugin); + std::string lib = root + "/" + lib_name + lib_extension; + WOLF_DEBUG("Loading library " + lib_name + " in " + root); + _loader->load(lib); } -void searchAndLoadPlugins(const YAML::Node& _node, LoaderPtr _loader) +void searchAndLoadLibraries(const YAML::Node& _node, + LoaderPtr _loader, + const std::string& lib_field, + const std::string& root) + { std::list<YAML::Node> visited_nodes; - auto plugins = searchPlugins(_node, visited_nodes); - for (auto plugin : plugins) - if (not FolderRegistry::isFolderRegistered(plugin)) loadPlugin(_loader, plugin); + auto libs = searchFieldsRecursive(_node, visited_nodes, lib_field); + for (auto lib_name : libs) + if (not FolderRegistry::isFolderRegistered(lib_name)) loadLibrary(_loader, lib_name, root); } -std::set<std::string> searchPlugins(const YAML::Node& _node, std::list<YAML::Node>& _visited_nodes) +std::set<std::string> searchFieldsRecursive(const YAML::Node& _node, + std::list<YAML::Node>& _visited_nodes, + const std::string& lib_field) { - std::set<std::string> plugins; + std::set<std::string> libs; if (std::find(_visited_nodes.begin(), _visited_nodes.end(), _node) != _visited_nodes.end()) return {}; @@ -59,13 +140,13 @@ std::set<std::string> searchPlugins(const YAML::Node& _node, std::list<YAML::Nod for (const auto& pair : _node) { // is plugin? - if (pair.first.as<std::string>() == "plugin") - plugins.insert(pair.second.as<std::string>()); + if (pair.first.as<std::string>() == lib_field) + libs.insert(pair.second.as<std::string>()); else { - auto rec_plugins = searchPlugins(pair.second, _visited_nodes); - plugins.insert(rec_plugins.begin(), rec_plugins.end()); + auto rec_libs = searchFieldsRecursive(pair.second, _visited_nodes, lib_field); + libs.insert(rec_libs.begin(), rec_libs.end()); } } } @@ -73,8 +154,8 @@ std::set<std::string> searchPlugins(const YAML::Node& _node, std::list<YAML::Nod { for (const auto& child : _node) { - auto rec_plugins = searchPlugins(child, _visited_nodes); - plugins.insert(rec_plugins.begin(), rec_plugins.end()); + auto rec_libs = searchFieldsRecursive(child, _visited_nodes, lib_field); + libs.insert(rec_libs.begin(), rec_libs.end()); } } else if (_node.IsScalar()) @@ -82,20 +163,7 @@ std::set<std::string> searchPlugins(const YAML::Node& _node, std::list<YAML::Nod return {}; } - return plugins; -} - -void appendPluginsInstalledSchemaFolders(const YAML::Node& _node, std::vector<std::string>& _local_folders) -{ - auto temp_loader = std::make_shared<Loader>(); - - std::list<YAML::Node> visited_nodes; - auto plugins = searchPlugins(_node, visited_nodes); - - for (auto plugin : plugins) - if (not FolderRegistry::isFolderRegistered(plugin)) loadPlugin(temp_loader, plugin); - - FolderRegistry::appendRegisteredFolders(_local_folders); + return libs; } } // namespace wolf