/** * @file JSONWorkflowFileParser.h * @brief json格式的工作流解析器 * * @author 黄军 * @date 2011-7-27 */ #ifndef PAI_FRAME_WORKFLOWENGINE_JSONWORKFLOWFILEPARSER_H #define PAI_FRAME_WORKFLOWENGINE_JSONWORKFLOWFILEPARSER_H #include #include #include #include #include "json/json.h" #include "ModuleInformation.h" #include "ModuleParameter.h" #include "ModuleParameterValue.h" // deprecated #include "ParameterItem.h" #include "ModuleConnection.h" #include "WorkflowFileParser.h" #include "Module.h" #include "ModuleMetaData.h" using namespace Json; using namespace pai::module; namespace pai { namespace workflow { /** * @brief Json格式工作流文件解析器类 * * 工作流解析器的基类@ref CWorkflowFileParser的子类, * 实现了基于Json格式工作流的:工作流文件解析,工作流文件对象的检查 * * */ class PAI_WORKFLOWENGINE_EXPORT CJSONWorkflowFileParser:public CWorkflowFileParser { public: /* * @brief 解析Json格式的工作流文件为@ref CWolkFlowFile对象 * * @param[in] strFilePath 工作流文件全路径 * @param[in/out] workFlowFile 工作流文件对象 * @pre 工作流文件必须存在,先初始化CWolkFlowFile对象 */ virtual bool Parse(const std::string& strFilePath,CWorkFlowFile* workFlowFile); /* * @brief 检查Json格式的工作流文件对象 * * 如果校验有错误,错误信息先保存在errorMsg里 * * @param[in] workFlowFile 校验工作流文件对象 * @param[in/out] errorMsg 校验错误信息 * @pre 要先初始化errorMsg * @return 工作流对象是否通过校验 */ virtual bool CheckWorkFlowFile(CWorkFlowFile* workFlowFile,std::string& errorMsg); /* * @brief 存储CWorkFlowFile对象到Json文件 * * 在序列化的是,需要通过CheckWorkFlowFile校验,保证工作流文件的完整性 * * @param[in] workFlowFile 工作流文件对象 * @param[in] strFilePath 工作流文件全路径 */ virtual bool Serialize(CWorkFlowFile* workFlowFile,const std::string& strFilePath); virtual std::string Serialize(CWorkFlowFile* workFlowFile); /* * @brief 解析module节点(jsoncpp类库)为@ref CModuleInfomation对象 * * @param[in] modInfoNode module节点 * @param[in/out] modInfo 模块信息对象 */ void ParseModInfo(const Json::Value& modInfoNode,CModuleInformation* modInfo); /* * 此接口由界面和workflowhelper使用,由于监控模块的特殊需求,需要另外一个参数标识是谁发起的操作 * 界面操作发起的需要把监控模块的connection去掉; * workflowheler操作发起的不需要; */ virtual bool ParseFromString(const std::string& jsonStr, CWorkFlowFile* workFlowFile, bool isWorkflow=false); public: /** * @brief 设置工作流导入时的项目工区路径 */ void SetImportPath(const std::string& importPath); private: /* * @brief 解析root节点(jsoncpp类库)为workFlowFile对象 * * @param[in] rootNode root节点 * @param[in/out] workFlowFile 工作流文件对象 */ void ParseWorkFlow(const Json::Value& rootNode,CWorkFlowFile* workFlowFile); /* * @brief 解析modules节点(jsoncpp类库)到workFlowFile对象 * * @param[in] modInfosNode modules节点 * @param[in/out] workFlowFile 工作流文件对象 */ void ParseModInfos(const Json::Value& modInfosNode,CWorkFlowFile* workFlowFile); /* * @brief 解析parameter节点(jsoncpp类库)为CModuleParameter对象 * * @param[in] paramNode parameter节点 * @param[in/out] param 模块参数对象 */ void ParseModParam(const Json::Value& paramNode,CModuleParameter* param); /* * @brief 解析parameter values节点(jsoncpp类库)到CModuleParameter * * @param[in] parmValuesNode parameter values节点 * @param[in/out] param 模块参数对象 */ void ParseModParamValues(const Json::Value& parmValuesNode,CModuleParameter* param); /* * @brief 解析parameter value节点(jsoncpp类库)为CModuleParameterValue * * @param[in] paramValueNode parameter values节点 * @param[in/out] paramValue 模块参数值对象 */ void ParseModParamValue(const Json::Value& paramValueNode,CModuleParameterValue* paramValue); /* * @brief 解析module connections节点(jsoncpp类库)到CModuleInformation * * @param[in] modConnectsNode module connections节点 * @param[in/out] workflow 工作流文件对象 */ void ParseModConnects(const Json::Value& modConnectsNode,CWorkFlowFile* workflow); /* * @brief 解析module connection节点(jsoncpp类库)为CModuleConnection * * @param[in] modConnectNode module connection节点 * @param[in/out] connect 模块连接对象 */ void ParseModConnect(const Json::Value& modConnectNode,CModuleConnection* connect); /* * @brief 临时解决方案,创建一个ParamItem (需要重构) * * @param[in] paramValueNode param value 节点 * @param[in/out] item new paramitem */ void TmpNewParamItem(const Json::Value& paramValueNode,CParameterItem& item); bool CheckModuleInfo(CModuleInformation* modInfo,std::string& errorMsg); bool CheckModuleParam(CModuleParameter* param,std::string& errorMsg); bool CheckModuleParamValue(CModuleParameterValue* paramValue,std::string& errorMsg); bool CheckModuleConnect(CModuleConnection* connect,std::string& errorMsg); //should be one of "int", "float", "double", "std::string". bool CheckParamValueType(const std::string& value); /* * @brief 检查Json工作流的String字段是否没有赋值 * * @param[in] str 解析的字符串字段值 */ bool IsNotValue(const std::string& str); /* * @brief 检查Json工作流的num字段是否没有赋值 * * 注意:在对象初始化的时候,给必填的数值字段赋值为-1,解析Json工作流格式后,在进行比较。 * * @param[in] num 解析的数值字段值 */ bool IsNotValue(int num); bool IsGPUModule(CModule* module); //TODO aiya std::string GetNodeDefaultStringValue(const Json::Value& node,const std::string& key,const std::string& defaultValue = JSON_STRING_FIELD_NULL); std::string GetNodeDefaultStringValue(const Json::Value& node,const std::string& key,const std::string& defaultValue = ""); int GetNodeDefaultIntValue(const Json::Value& node,const std::string& key); bool GetNodeDefaultBoolValue(const Json::Value& node,const std::string& key,const bool value = false); bool IsEmptyArray(const Json::Value& node); void SerializeModules(CWorkFlowFile* workFlowFile,Json::Value& modulesNode); void SerializeModule(CModuleInformation* moduleInfo,Json::Value& moduleNode); void SerializeConnections(CWorkFlowFile* workFlowFile,Json::Value& connectionsNode); void SerializeConnection(CModuleConnection* connect,Json::Value& connectNode); /* * */ void ProccessRealTimeModule(CWorkFlowFile* wokflowFile, bool isDeleteConn); public: CJSONWorkflowFileParser(); virtual ~CJSONWorkflowFileParser(); private: std::string m_importPath; //工作流导入时的项目工区路径 std::string exceptionModule; }; } } #endif