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
|