logplus/Workflow/WFEngine/ObjectModel/ObjectModelBase/include/PaiObject.h

804 lines
26 KiB
C
Raw Normal View History

2026-01-16 17:18:41 +08:00
/**
* @file PaiObject.h
* @brief Pai数据基类定义
* @date 2011-6-20
*/
#ifndef PAI_FRAME_IOBJECTMODEL_PAIOBJECT_H
#define PAI_FRAME_IOBJECTMODEL_PAIOBJECT_H
#include <QUuid>
#include <QList>
#include <QDataStream>
#include <QVariant>
// #include "ObjectModelService.h"
// #include "PaiObjectEventAgent.h"
#include "Property.h"
#include "PaiTypes.h"
#include "Turtle.h"
/**
* @brief
* @param[in] className
* @param[in] uid id
*/
#define DECLARE_PAI_OBJECT(className, uid) \
static pai::objectmodel::PaiObject* CreateInstance() \
{ \
return new className(); \
} \
static const char* GetTypeIDString() \
{ \
return uid; \
} \
virtual QUuid GetTypeID() const \
{ \
return QUuid(uid); \
}
/**
* @brief
* @param[in] className
*/
#define IMPLEMENT_PAI_OBJECT(className) \
namespace pai \
{ \
namespace objectmodel \
{ \
class regist##className \
{ \
public:regist##className() \
{ \
GetObjectModelService()->Register(QUuid(className::GetTypeIDString()), className::CreateInstance); \
} \
}; \
} \
} \
pai::objectmodel::regist##className g_##className##_creator;
class QMutex;
namespace pai
{
namespace objectmodel
{
/**
* @class PaiObject
* @brief The base class for all object model
* @note
* Object的:
* GetObject
* GetObjects
* GetObjectByName
* GetObjectByType
* Child或Children的:
* GetChild
* GetChildren
* GetChildrenCount
* GetChildByType
* RemoveChild
*/
class PAI_OBJECTMODEL_EXPORT PaiObject : public QObject
{
// friend class pai::objectmodel::IProjectManager;
public:
DECLARE_PAI_OBJECT(PaiObject,"{00000000-0000-0000-0000-000000000000}")
/**
* @enum OverrideFlag
* @brief
*/
enum OverrideFlag
{
Override, ///< 覆盖
NoOverride ///< 不覆盖
};
/**
* @enum Flag
* @brief
*/
enum Flag
{
VisibibleOnTree = 0x0001, ///< 该对象是否上树
Modified = 0x0002, ///< 用户是否在当前会话修改过该对象
// for the active status
ACTIVE = 0x0004, ///< 活跃的(项目,工区...)
INACTIVE = 0x0008, ///< 不活跃的(项目,工区...)
ALL = 0x000C, ///< 所有的(项目,工区...)
Loaded = 0x0010, ///< 该对象信息是否与数据库同步
DataLoaded = 0x0020, ///< 该对象数据是否已加载
ChildrenLoaded = 0x0040, ///< 是否已经加载子代该标志只能在SynDB函数中设置
IgnoreSyncDB = 0x0080, ///< 同步时是否忽略该对象(不是指的该对象是否允许刷新)
Syncabled = 0x0100, ///< 该节点是否可同步(该对象是否允许刷新)
Closed = 0x0200, ///< 该对象是否处于关闭状态
Deleting = 0x0400, ///< 该对象是否正在删除过程中
Deletable = 0x0800, ///< 该对象是否可以被删除(指从数据树删除)
DataModified = 0x1002, ///< 用户是否在当前会话修改过该对象的数据
Renameable = 0x2000, ///< 此对象是否可以重命名
ShadowNode = 0x4000 ///< 是否为影子节点即删除时不用去判断其是否lock
};
/**
* @enum ExistFlag
* @brief
*/
enum ExistFlag
{
EXIST_DBN_HDFSY = -3, ///< 数据库不存在HDFS存在
EXIST_DBY_HDFSN = -2, ///< 数据库存在HDFS不存在
EXIST_DB_ERROR = -1, ///< 数据库出错
EXIST_DBN_HDFSN = 0, ///< 数据库和HDFS都不存在
EXIST_DBY_HDFSY = 1 ///< 数据库和HDFS都存在
};
/**
* @enum SortKeyFlag
* @brief
*/
enum SortKeyFlag
{
Sort_Key_Null = 0, ///< 没有排序关键字
Sort_By_Name, ///< 名称,标题等
Sort_By_CreateTime ///< 创建时间
};
/**
* @enum MountTree
* @brief
*/
enum MountTree
{
MountOnTree = 0, ///< 数据挂载上树
MountNoTree ///< 数据不上树
};
/**
* @brief
* @param[in] pParent
*/
PaiObject(PaiObject* pParent = NULL);
/**
* @brief
*/
virtual ~PaiObject();
/**
* @brief
*/
virtual void Delete();
/**
* @brief ID
* @param[in] id ID信息
*/
void SetID(const QUuid & id);
/**
* @brief ID
* @return ID
*/
QUuid GetID() const;
/**
* @brief DBID, SetID
* @param[in] id DBID
*/
void SetDBID(const long long id);
/**
* @brief DBID
* @return DBID
*/
long long GetDBID() const;
/**
* @brief owner IDID IDID0
* @param[in] id ID
*/
void SetOwnerID(long long id);
/**
* @brief owner ID
* @return owner ID
*/
long long GetOwnerID() const;
/**
* @brief
* @param[in] name
*/
virtual void SetName(const QString & name);
/**
* @brief
* @return
*
*/
virtual QString GetName() const;
/**
* @brief "/project/survey/name"
* @return
*/
virtual QString GetPhysicalFile() const;
/**
* @brief
* @param[in] type
*/
void SetType(const pai::ios::DATA_TYPE & type);
/**
* @brief
* @return
*/
pai::ios::DATA_TYPE GetType() const;
/**
* @brief
* @return
*/
QString GetTypeName() const;
/**
* @brief /
* @return
*/
QString GetVisibleFile() const;
/**
* @brief /
* @return
* TODO 使
*/
QString GetFullPathName() const{return GetVisibleFile();};
/**
* @brief Icon名称
* @param[in] iconName Icon名称
*/
void SetIconName(const QString & iconName);
/**
* @brief Icon名称
* @return Icon名称
*/
QString GetIconName() const;
/**
* @brief "_big"
* project.pngproject_big.png
* @return
*/
QString GetBigIconName() const;
/**
* @brief
* @return
*/
PaiObject* GetParent() const;
void SetParent(PaiObject*PParent);
/**
* @brief ,
* @return NULL
*/
template< typename T > T* GetForebear() const
{
PaiObject* pParent = GetParent();
while(pParent)
{
T* pT = dynamic_cast< T* > (pParent);
if(pT)
{
return pT;
}
pParent = pParent->GetParent();
}
return NULL;
}
/**
* @brief ID,
* @param[in] typeID ID
* @return NULL
*/
PaiObject* GetForebear(const QUuid & typeID) const;
/**
* @brief
* @param[in] pChild
* @param[in] mountTree
* @return
*/
virtual bool AddChild(PaiObject* pChild, MountTree mountTree = MountOnTree);
/**
* @brief iIndex之前插入一个孩子,iIndex
* @param[in] index
* @param[in] pChild
* @return
*/
virtual bool InsertChild(int index, PaiObject *pChild);
/**
* @brief
* @param[in] pChild
* @param[in] deleteChild
* @return
*/
virtual bool RemoveChild(PaiObject *pChild, bool deleteChild = false);
/**
* @brief
* @param[in,out] children
*/
void GetChildren(QList< PaiObject* > & children) const;
/**
* @brief
* @return
*/
int GetChildrenCount();
/**
* @brief
* @return
*/
bool HasChildren();
/**
* @brief ID为dbid的孩子
* @param[in] dbid ID
* @return NULL
*/
PaiObject* GetChild(const long long dbid) const;
/**
* @brief id查找对应的对象
* @param[in] id ID
* @return
*/
PaiObject* GetObject(const QUuid & id) const;
/**
* @brief ID查询对象
* @param[in] dbid ID
* @return
*/
PaiObject* GetObject(const long long dbid) const;
/**
* @brief
* @param[in] name
* @return
*/
PaiObject* GetObjectByName(const QString & name,int depth) const;
/**
* @brief
* @param[in] name
* @return
*/
PaiObject* GetObjectByName(const QString & name) const;
/**
* @brief
* @param[in] name
* @param[in] objectType
* @return
*/
PaiObject* GetObjectByName(const QString & name, const QUuid & objectType) const;
/**
* @brief .
* @param[in] typeID
* @param[in] depth 100001 2 ...
* @return
*/
PaiObject* GetObjectByType(const QUuid & typeID, int depth = 10000) const;
/**
* @brief .()
* @param[in] typeID
* @return
*/
PaiObject* GetChildByType(const QUuid & typeID) const;
/**
* @brief .
* @param[in,out] children
* @param[in] typeID
* @param[in] depth 100001 2 ...
*/
void GetObjectByType(QList< pai::objectmodel::PaiObject* > & children,
const QUuid & typeID,
int depth = 10000) const;
/**
* @brief DBID为dbid的对象列表
* @param[in] dbid DBID
* @return
*/
QList< PaiObject* > GetObjects(const long long dbid) const;
/**
* @brief
* @return
*/
QList< PaiObject* > GetObjects() const;
/**
* @brief
* @param[in,out] children
* @param[in] equalCondition
*/
template< typename T >
void GetObjects(QList< pai::objectmodel::PaiObject* > & children,
const pai::EqualCondition< pai::objectmodel::PaiObject, T > & equalCondition)
{
foreach(PaiObject* pChild, m_children)
{
if(equalCondition(pChild))
{
children.append(pChild);
}
pChild->GetObjects(children, equalCondition);
}
};
/**
* @brief
* @param [in] flag
* @return
*/
bool HasFlag(Flag flag) const;
/**
* @brief
* @param[in] type
* @note int传入的值是JIOService里EOperation中的枚举类型
* paiObject.Jioservice中的枚举类型
*
* @return
*/
virtual bool HasPermissionFlag(int type) const;
/**
* @brief
* @return child,
*/
bool HasModified() const;
/**
* @brief
* @return
*/
bool HasDataModified() const;
/**
* @brief
* @param[in] ignore
*/
void SetIgnoreSyncDB(bool ignore);
/**
* @brief Shadow节点
* @param[in] shadow
*/
void SetShadowNode(bool shadow);
/**
* @brief Refresh菜单
* @param[in] enable
*/
void SetSyncabled(bool enable);
/**
* @brief
* @return
*/
virtual QString GetProperties();
/**
* @brief UpdateToDB
* @param[in,out] pErrorMessage pErrorMessage
* @return
*/
virtual bool Save(QString *pErrorMessage = NULL);
/**
* @brief
* @param[in,out] pErrorMessage pErrorMessage
* @return
*/
virtual bool Update(QString *pErrorMessage = NULL);
/**
* @brief UpdateToDB
* @param[in,out] pErrorMessage pErrorMessage
* @return
*/
virtual bool SaveToDB(QString *pErrorMessage = NULL);
/**
* @brief
* @param[in,out] pErrorMessage pErrorMessage
* @return
*/
virtual bool UpdateToDB(QString *pErrorMessage = NULL);
/**
* @brief
* @param[in] status (PaiObject::ACTIVE / PaiObject::INACTIVE)
* @param[in,out] pErrorMessage pErrorMessage
* @return
*/
virtual bool EnableToDB(const int & status, QString *pErrorMessage = NULL);
/**
* @brief Load函数
* @return
*/
bool Reload();
/**
* @brief
* @param[in] mode
* @return
*/
bool SyncDB(pai::SyncModes mode);
/**
* @brief
* @param[in] recursion
* @return
*/
bool SyncChildren(bool recursion);
/**
* @brief
* @return
*/
QString GetBackupProperties() const;
/**
* @brief
* @param[in] childNamePrefix
* @return
*/
QString GetNextChildName(const QString & childNamePrefix);
/**
* @brief EventAgent信号
* @param[in] yes EventAgent信号
*/
void SetEventEnabled(bool yes);
/**
* @brief EventAgent信号
* @return EventAgent信号
*/
bool IsEventEnabled();
/**
* @brief
* @return
*/
virtual bool IsBigDataObject() const;
/**
* @brief
* @param[in,out] pErrorMessage pErrorMessage
* @return
*/
bool CloseObject(QString *pErrorMessage = NULL);
/**
* @brief
* @return
*/
bool OpenObject();
/**
* @brief
* @param[in] expand
*/
void SetExpand(bool expand);
/**
* @brief
* @return
*/
long long GetTimeStamp() const;
/**
* @brief
* @param[in] pSrc
* @param[in] pDest
* @param[in] key
* @return *pSrc - *pDest
*/
static int SortDataCompare(PaiObject *pSrc, PaiObject *pDest, const SortKeyFlag key);
/**********************************************************
* *
* *
* *
**********************************************************/
/**
* @brief
* @param[in] newName
* @param[in] override
*/
virtual void Rename(const QString & newName, OverrideFlag override = NoOverride);
/**
* @brief HDFS...
* @param[in,out] pErrorMessage pErrorMessage
* @return
*/
virtual bool Erase(QString *pErrorMessage = NULL);
/**
* @brief DBID为dbid的数据
* @param[in] dbid DBID
* @return
*/
virtual bool Load(const long long dbid);
/**
* @brief
* @param[in] srcObject
* @note 使
*/
virtual void Clone(const PaiObject & srcObject);
/**
* @brief
* @param[in,out] message false时
* @return
*/
virtual bool TryDelete(QString & message);
/**
* @brief
* @return
*/
virtual int GetMemorySize();
/**
* @brief
* @param[in,out] children
* @return
*/
virtual bool GetSyncChildren(QList< PaiObject* > & children);
/**
* @brief owner idowner下属于该类型所有的节点
* @param[in] ownerID 宿ID
* @param[in] ownerType 宿
* @return owner下属于该类型所有的节点
*/
virtual QList<PaiObject*> GetBrothers(long long ownerID, const QUuid & ownerType);
protected:
/**
* @brief
* @param[in] flag
* @param[in] enable
*/
void SetFlagEnable(Flag flag, bool enable);
/**
* @brief
* @param[in] modified
* @param[in] recursive
*/
void SetModified(bool modified, bool recursive);
/**
* @brief
*/
void ReleaseChildren();
/**
* @brief
* @param[in,out] objects
*/
void GetObjects(QList< PaiObject* > & objects) const;
/**
* @brief
* @param[in] key
* @return
*/
virtual QVariant GetSortData(const SortKeyFlag key) const;
/**
* @brief
* @return
*/
virtual long long GetCreateTime() const;
/**
* @brief Load Loading
* @param[in] mountTree
* @return
*/
bool AddLazyLoadChild(MountTree mountTree = MountOnTree);
/**
* @brief Lazy Loading孩子节点
* @return
*/
bool RemoveLazyLoadChild();
/**
* @brief
* @param[in] children
*/
void SyncChildren(QList< PaiObject* > & children);
/**
* @brief
* @param[in] typeName
*/
void SetTypeName(const QString & typeName);
/**
* @brief (latestObject)
* @param[in] latestObject
* @note name"time stamp"
*/
void SyncRefreshMsg(const PaiObject & latestObject);
/**
* @brief
* @param[in] timeStamp
*/
void SetTimeStamp(const long long timeStamp);
/**
* @brief
*
* @param[in] tag1
* @param[in] tag2
* @return Ascii码值的差值0
*/
static int SpecialCompare(const QString & tag1, const QString & tag2);
public:
// static pai::objectmodel::PaiObjectEventAgent m_EventAgent; ///< 全局事件类
protected:
int m_flags; ///< 当前对象标识
QList< PaiObject* > m_children; ///< 记录孩子对象列表
QString m_properties; ///< 备份的属性信息
private:
PaiObject *m_pParent; ///< 对象的父节点
long long m_OwnerID; ///< 即所有者的ID在工区以下节点值为所属工区ID如果是工区则为所属项目ID如果是项目则为0, 无效:-1
QUuid m_id; ///< 对象ID
long long m_dbid; ///< 对象dbid
QString m_name; ///< 对象的名字
QString m_IconName; ///< 小图标
QString m_TypeName; ///< 用来表示类型名
long long m_TimeStamp; ///< 时间戳,用来记录对象的更新情况
bool m_EventEnabled; ///< 是否打开该对象与集中信号管理的连接
volatile bool m_SyncLockFlag; ///< 当由两个或多个线程在同时调用Sync函数的时候降低添加相同孩子的几率
pai::ios::DATA_TYPE m_type; ///< 数据类型
QMutex *m_pChildMutex; ///< 当添加或删除孩子时加锁
};
}
}
#endif ///< PAI_FRAME_IOBJECTMODEL_PAIOBJECT_H