/** * @file ModuleManager.h * @brief 文件主要定义了与模块的创建和加载相关的类和接口 * @author dev * @date 2011-8-29 */ #ifndef PAI_FRAME_MODULEAPI_MODULEMANAGER_H #define PAI_FRAME_MODULEAPI_MODULEMANAGER_H #include "ModuleMetaData.h" #include #include #include #include "Turtle.h" namespace Json { class Value; } namespace pai { namespace module { class CModuleParameter; class CCompositeParameterItem; class CModule; /** * @class CModuleManager * @brief 定义了与模块的创建和加载相关的接口 */ class PAI_MODULE_EXPORT CModuleManager { public: /** * @brief 构造函数 */ CModuleManager(); /** * @brief 虚析构函数 */ virtual ~CModuleManager(); /** * @brief 根据指定的模块类名创建该模块类的实例 * @param[in] strModuleClassName 模块类名 * @return 模块CModule指针 */ CModule* CreateModuleByClassName(const std::string& strModuleClassName); /** * @brief 获取所有的模块,此接口目前由GUI调用 * @param[out] vecModules 包含所有的模块的容器 */ void ListAllModules(std::vector& vecModules) const; /** * @brief 查找指定模块ID的模块句柄 * @param[in] id 待查找模块ID * @return 具有指定模块ID模块句柄,如果没找到,返回值为NULL */ CModule* FindModule(const std::string& id) const; /** * @deprecated 与@see #FindModule(const std::string&)功能相同,考虑去除 * @brief 查找指定模块ID的模块元数据 * @param[in] id 待查找模块IDCModuleMetaData * @return 具有指定模块ID模块元数据,如果没找到,返回值为NULL */ CModuleMetaData* FindModuleMetaData(const std::string& id) const; /** * @brief 获取指定类型的所有模块信息 * @param[in] strCategory 模块类型 * @param[out] vecModules 返回所有属于strCategory对应参数所指定类型的模块 */ void GetModulesByCategory(const std::string& strCategory, std::vector& vecModules); /** * @brief 获取模块树中的所有类型名字 * @param[out] vecCategoryNames 所有类型名字的集合 */ void GetCategoryNames(std::vector& vecCategoryNames); /** * @brief 获取模块动态库的存放路径 * @return 模块动态库的存放路径 */ std::string GetLibDeployPath() const; /** * @brief 加载所有的模块 */ void LoadAllModules(); /** * @brief 重新加载所有的模块 */ void ReLoadAllModules(); //some special module should be added in WellLog //only use by WellLog void AddModule(std::string modulefileFullPathName,CModule* aModule,void* modulehandle); private: /** * @brief 将所有的模块信息从PAI_HOME/module目录下读取.json文件获取元数据信息到内存 * @param[in] moduleDir 模块json文件所在目录 * */ void Initialize(std::string moduleDir); /** * @brief parse module metadata json data * @param[in] metaDataFilePath: module json file path * @param[out] root: the parsed json data * @return return ture if the file is parsed success, if not return false */ bool ParseMetaData(const std::string metaDataFilePath,Json::Value& root); /** * @brief load module by the module class name * @param[in] moduleClassName: the name of the module to be loaded * @return return true if load the module success ,if not return false */ bool LoadModuleByClassName(const std::string moduleClassName); /** * @brief load module and add the module json value to the module * @param[in] root:the parsed module json data * @return return true if load the module success ,if not return false */ // bool LoadModule(const Json::Value& root); /** * @brief 解析指定Json节点的模块参数信息 * @param[in] paramJsonNode 参数项对应Json节点 * @param[in] pParentItem 父参数项 */ void _ParseParameterInfo(const Json::Value& paramJsonNode, CCompositeParameterItem* pParentItem); /** * @brief 仅创建实例,不组装参数和元数据 * @param[in] strModuleClassName:the name of the module to be created * @return return the module that was created */ CModule* CreateModuleByClassNameInternal(const std::string& strModuleClassName); private: std::map m_moduleContainer;//模块的容器 std::map m_modulePaths; std::vector m_moduleHandles; bool m_isLoadAllModules; //是否已加载所有模块 }; /** * @brief 返回全局唯一的模块管理器句柄 */ extern PAI_MODULE_EXPORT CModuleManager* GetModuleManager(); } } #endif