logplus/Workflow/WFEngine/WorkflowEngine/src/parser/ModuleInformation.cpp

310 lines
9.0 KiB
C++
Raw Normal View History

2026-01-16 17:18:41 +08:00
/**
* @file ModuleInfomation.cpp
*
* @author
* @date 2011-7-27
*/
#include "ModuleManager.h"
#include "ModuleInformation.h"
// #include "Utils.h"
// #include "Log.h"
#include <string>
#include <iostream>
#include <vector>
#include <map>
#include <cstdlib>
#include <fstream>
// #include "Utils.h"
namespace pai {
namespace workflow {
CModuleInformation::CModuleInformation():m_oModule(NULL), m_iStepId(0), m_iId(0), m_strNamespace(), m_strName(),\
m_strVersion(), m_bQC(false), m_bBreakpoint(false), m_strComments(),\
m_bEnabled(true), m_ModParam(NULL), inModules(), outModules(), m_bBlankModule(false)
{
}
CModuleInformation::CModuleInformation(const std::string& moduleClass):m_oModule(NULL), m_iStepId(0), m_iId(0), m_strNamespace(), m_strName(),\
m_strVersion(), m_bQC(false), m_bBreakpoint(false), m_strComments(),\
m_bEnabled(true), m_ModParam(NULL), inModules(), outModules(), m_bBlankModule(false)
{
if (moduleClass.empty())
{
m_bBlankModule = true;
m_ModParam = NULL;
m_oModule = NULL;
}
else
{
m_bBlankModule = false;
m_oModule = GetModuleManager()->CreateModuleByClassName(moduleClass);
if (!m_oModule)
{
// exception
//pai::log::Error(pai::utils::CUtils::GetFormatStr("Failed to create moduel for %s", moduleClass.c_str()));
// throw pai::error::runtime_error("Failed to create module for " + moduleClass + ",please check this module library!");
}
m_strVersion = GetModuleMetaData()->GetVersion();
}
}
CModuleInformation::CModuleInformation(const CModuleInformation & modInfo):m_oModule(NULL), m_iStepId(modInfo.GetStepID()), m_iId(modInfo.GetId()), m_strNamespace(modInfo.GetNamespace()), m_strName(modInfo.GetName()),\
m_strVersion(modInfo.m_strVersion), m_bQC(modInfo.GetQC()), m_bBreakpoint(modInfo.GetBreakpoint()), m_strComments(modInfo.GetComments()),\
m_bEnabled(modInfo.GetEnabled()), m_ModParam(NULL), inModules(), outModules(), m_bBlankModule(modInfo.IsBlankModule())
{
Clone(modInfo);
}
void CModuleInformation::Clone(const workflow::CModuleInformation& modInfo)
{
if(this == &modInfo){
return;
}
m_iStepId = modInfo.GetStepID();
m_iId = modInfo.GetId();
m_strNamespace = modInfo.GetNamespace();
m_strName == modInfo.GetName();
m_bBlankModule = modInfo.IsBlankModule();
m_strVersion = modInfo.GetVersion();
if (!m_bBlankModule)
{
if(m_ModParam != NULL){
delete m_ModParam;
}
m_ModParam = NULL; //是否以后要删除
if(m_oModule != NULL){
delete m_oModule;
}
m_oModule = GetModuleManager()->CreateModuleByClassName(modInfo.GetClassName());
if(m_oModule)
{
m_oModule->GetModuleParameter()->Clone(*(modInfo.GetModule()->GetModuleParameter()));
*(m_oModule->GetMetaData()) = *(modInfo.GetModule()->GetMetaData());
}
}
else
{
if(m_ModParam != NULL){
delete m_ModParam;
}
if(m_oModule != NULL){
delete m_oModule;
}
m_ModParam = NULL;
m_oModule = NULL;
}
m_bQC = modInfo.GetQC();
m_bBreakpoint = modInfo.GetBreakpoint();
m_strComments = modInfo.GetComments();
m_bEnabled = modInfo.GetEnabled();
}
std::string CModuleInformation::GetComments2() const
{
return m_strComments;
}
CModuleInformation::~CModuleInformation()
{
if (m_ModParam != NULL)
{
delete m_ModParam;
m_ModParam = NULL;
}
if (m_oModule)
{
delete m_oModule;
m_oModule = NULL;
}
// // START 为检查工作流崩溃问题,暂时记录相关类析构时的堆栈信息,以便崩溃后跟踪。
// std::string logPath;
// std::ostringstream log;
// log << "workflow_coredump_debug_log_pid" << getpid() << ".log";
// std::string logName = log.str();
// char *pEnv = (char*)pai::utils::CUtils::GetPaiHome().c_str();//getenv("PAI_HOME");
// if(pEnv == NULL)
// {
// logPath = std::string("/home/") + logName;
// }
// else
// {
// logPath = std::string(pEnv) + "/log/" + logName;
// }
/*
std::ofstream fcout(logPath.c_str(), std::ofstream::app);
if(fcout)
{
fcout << "#####start_CModuleInformation#####" << std::endl;
std::vector<std::string> stack_trace = GetStackTrace();
for (size_t i = 0; i < stack_trace.size(); ++i)
{
fcout << stack_trace[i] << std::endl;
}
fcout << "#####end_CModuleInformation#####" << std::endl;
fcout.close();
}
*/
// END
}
const CModuleMetaData* CModuleInformation::GetModuleMetaData() const
{
if (m_oModule)
{
return m_oModule->GetMetaData();
}
else
{
return NULL;
}
}
std::string CModuleInformation::GetName() const
{
if (m_oModule)
{
return m_oModule->GetMetaData()->GetID();
}
// pai::log::Error(pai::utils::CUtils::GetFormatStr("module is NULL"));
return "";
}
bool CModuleInformation::IsBlankModule() const
{
return m_bBlankModule;
}
void CModuleInformation::SetBlankModule(bool bBlankModule)
{
m_bBlankModule = bBlankModule;
}
CModuleParameter* CModuleInformation::GetModuleParameter() const
{
if (m_oModule)
{
return m_oModule->GetModuleParameter();
}
// pai::log::Error(pai::utils::CUtils::GetFormatStr("%s : module is NULL", __func__));
return NULL;
}
void CModuleInformation::Print()
{
CModuleInformation* modInfo = this;
CModule* module = modInfo->GetModule();
std::cout << "\t\t\tid=" << modInfo->GetStepID() << std::endl;
// std::cout << "\t\t\tsortId=" << module->GetModuleContext().module_sort_id << std::endl;
// std::cout << "\t\t\tindegree=" << module->GetModuleContext().module_indegree << std::endl;
// std::cout << "\t\t\toutdegree=" << module->GetModuleContext().module_outdegree << std::endl;
std::cout << "\t\t\tnamespace=" << modInfo->GetNamespace() << std::endl;
std::cout << "\t\t\tname=" << module->GetClassName() << std::endl;
std::cout << "\t\t\tqc=" << modInfo->GetQC() << std::endl;
std::cout << "\t\t\tbreakpoint=" << modInfo->GetBreakpoint() << std::endl;
std::cout << "\t\t\tcomments=" << modInfo->GetComments() << std::endl;
std::cout << "\t\t\tenabled=" << modInfo->GetEnabled() << std::endl;
std::cout << "\t\t\tparametervalues:" << std::endl;
std::cout << "\t\t\t{" << std::endl;
int i = 0;
std::vector < CParameterItem > paramItems = module->GetModuleParameter()->GetParameterItems();
for (std::vector<CParameterItem>::iterator it = paramItems.begin(); it != paramItems.end(); ++it)
{
std::cout << "\t\t\t\tParameterValue[" << i << "]" << std::endl;
std::cout << "\t\t\t\t{" << std::endl;
CParameterItem item = *it;
std::cout << "\t\t\t\t\tname=" << item.GetName().toStdString() << std::endl;
std::cout << "\t\t\t\t\ttype=" << ParamItemTypeToString(item.GetType()) << std::endl;
std::cout << "\t\t\t\t\tvalue=" << item.ValueToString() << std::endl;
std::cout << "\t\t\t\t\tdefault=" << item.GetDefault() << std::endl;
std::cout << "\t\t\t\t\tmax=" << item.GetMax() << std::endl;
std::cout << "\t\t\t\t\tmin=" << item.GetMin() << std::endl;
std::cout << "\t\t\t\t}" << std::endl;
i++;
}
std::cout << "\t\t\t}" << std::endl;
}
std::string CModuleInformation::ParamItemTypeToString(ParameterType type)
{
std::string strIntType = "int";
std::string strFloatType = "float";
std::string strDoubleType = "double";
std::string strStringType = "string";
std::string strType = "";
switch (type)
{
case pai::module::ParmType_INT:
strType = strIntType;
break;
case pai::module::ParmType_FLOAT:
strType = strFloatType;
break;
case pai::module::ParmType_DOUBLE:
strType = strDoubleType;
break;
case pai::module::ParmType_STRING:
strType = strStringType;
break;
default:
strType = strStringType;
}
return strType;
}
unsigned long CModuleInformation::GetMemorySize()
{
unsigned long total = 0;
total = sizeof(*this);
if(!inModules.empty())
{
std::vector<CModuleInformation*>::iterator it = inModules.begin();
while(it !=inModules.end())
{
total += (*it)->GetMemorySize();
++it;
}
}
if(!outModules.empty())
{
std::vector<CModuleInformation*>::iterator it = outModules.begin();
while(it !=outModules.end())
{
total += (*it)->GetMemorySize();
++it;
}
}
if(m_oModule)
{
total += m_oModule->GetMemorySize();
}
return total;
}
bool operator ==(CModuleInformation &info, CModuleInformation &info2)
{
std::string moduleId = info.GetModuleID();
std::string moduleId2 = info2.GetModuleID();
if (moduleId != moduleId2)
{
// pai::log::Error( "两模块的ModuleId不等分别为" + moduleId + ";" + moduleId2 );
return false;
}
CModuleParameter*parm = info.GetModuleParameter();
CModuleParameter* parm2 = info2.GetModuleParameter();
if (!((*parm) == (*parm2)))
{
return false;
}
return true;
}
}
}