210 lines
7.1 KiB
C++
210 lines
7.1 KiB
C++
/**
|
||
* @file JSONWorkflowFileParser.h
|
||
* @brief json格式的工作流解析器
|
||
*
|
||
* @author 黄军
|
||
* @date 2011-7-27
|
||
*/
|
||
|
||
#ifndef PAI_FRAME_WORKFLOWENGINE_JSONWORKFLOWFILEPARSER_H
|
||
#define PAI_FRAME_WORKFLOWENGINE_JSONWORKFLOWFILEPARSER_H
|
||
|
||
#include <string>
|
||
#include <iostream>
|
||
#include <fstream>
|
||
|
||
#include <assert.h>
|
||
|
||
#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
|