logplus/Workflow/WFEngine/WorkflowEngine/src/parser/ModuleInformation.cpp
2026-01-16 17:18:41 +08:00

310 lines
9.0 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 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;
}
}
}