logplus/Workflow/WFEngine/WorkflowEngine/include/JSONWorkflowFileParser.h
2026-01-16 17:18:41 +08:00

210 lines
7.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @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