00001 #ifndef _ManagementObject_
00002 #define _ManagementObject_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "qpid/sys/Time.h"
00026 #include "qpid/sys/Mutex.h"
00027 #include <qpid/framing/Buffer.h>
00028 #include "qpid/CommonImportExport.h"
00029 #include <map>
00030
00031 namespace qpid {
00032 namespace management {
00033
00034 class Manageable;
00035 class ObjectId;
00036
00037
00038 class AgentAttachment {
00039 friend class ObjectId;
00040 private:
00041 uint64_t first;
00042 public:
00043 AgentAttachment() : first(0) {}
00044 QPID_COMMON_EXTERN void setBanks(uint32_t broker, uint32_t bank);
00045 uint64_t getFirst() const { return first; }
00046 };
00047
00048
00049 class ObjectId {
00050 protected:
00051 const AgentAttachment* agent;
00052 uint64_t first;
00053 uint64_t second;
00054 void fromString(const std::string&);
00055 public:
00056 QPID_COMMON_EXTERN ObjectId() : agent(0), first(0), second(0) {}
00057 QPID_COMMON_EXTERN ObjectId(framing::Buffer& buf) : agent(0) { decode(buf); }
00058 QPID_COMMON_EXTERN ObjectId(uint8_t flags, uint16_t seq, uint32_t broker, uint32_t bank, uint64_t object);
00059 QPID_COMMON_EXTERN ObjectId(AgentAttachment* _agent, uint8_t flags, uint16_t seq, uint64_t object);
00060 QPID_COMMON_EXTERN ObjectId(std::istream&);
00061 QPID_COMMON_EXTERN ObjectId(const std::string&);
00062 QPID_COMMON_EXTERN bool operator==(const ObjectId &other) const;
00063 QPID_COMMON_EXTERN bool operator<(const ObjectId &other) const;
00064 QPID_COMMON_EXTERN void encode(framing::Buffer& buffer);
00065 QPID_COMMON_EXTERN void decode(framing::Buffer& buffer);
00066 friend QPID_COMMON_EXTERN std::ostream& operator<<(std::ostream&, const ObjectId&);
00067 };
00068
00069 class ManagementItem {
00070 public:
00071 static const uint8_t TYPE_U8 = 1;
00072 static const uint8_t TYPE_U16 = 2;
00073 static const uint8_t TYPE_U32 = 3;
00074 static const uint8_t TYPE_U64 = 4;
00075 static const uint8_t TYPE_SSTR = 6;
00076 static const uint8_t TYPE_LSTR = 7;
00077 static const uint8_t TYPE_ABSTIME = 8;
00078 static const uint8_t TYPE_DELTATIME = 9;
00079 static const uint8_t TYPE_REF = 10;
00080 static const uint8_t TYPE_BOOL = 11;
00081 static const uint8_t TYPE_FLOAT = 12;
00082 static const uint8_t TYPE_DOUBLE = 13;
00083 static const uint8_t TYPE_UUID = 14;
00084 static const uint8_t TYPE_FTABLE = 15;
00085 static const uint8_t TYPE_S8 = 16;
00086 static const uint8_t TYPE_S16 = 17;
00087 static const uint8_t TYPE_S32 = 18;
00088 static const uint8_t TYPE_S64 = 19;
00089
00090 static const uint8_t ACCESS_RC = 1;
00091 static const uint8_t ACCESS_RW = 2;
00092 static const uint8_t ACCESS_RO = 3;
00093
00094 static const uint8_t DIR_I = 1;
00095 static const uint8_t DIR_O = 2;
00096 static const uint8_t DIR_IO = 3;
00097
00098 static const uint8_t FLAG_CONFIG = 0x01;
00099 static const uint8_t FLAG_INDEX = 0x02;
00100 static const uint8_t FLAG_END = 0x80;
00101
00102 const static uint8_t CLASS_KIND_TABLE = 1;
00103 const static uint8_t CLASS_KIND_EVENT = 2;
00104
00105
00106
00107 public:
00108 virtual ~ManagementItem() {}
00109 };
00110
00111 class ManagementObject : public ManagementItem
00112 {
00113 protected:
00114
00115 uint64_t createTime;
00116 uint64_t destroyTime;
00117 uint64_t updateTime;
00118 ObjectId objectId;
00119 bool configChanged;
00120 bool instChanged;
00121 bool deleted;
00122 Manageable* coreObject;
00123 sys::Mutex accessLock;
00124 uint32_t flags;
00125
00126 static int nextThreadIndex;
00127 bool forcePublish;
00128
00129 QPID_COMMON_EXTERN int getThreadIndex();
00130 QPID_COMMON_EXTERN void writeTimestamps(qpid::framing::Buffer& buf);
00131
00132 public:
00133 QPID_COMMON_EXTERN static int maxThreads;
00134 typedef void (*writeSchemaCall_t) (qpid::framing::Buffer&);
00135
00136 ManagementObject(Manageable* _core) :
00137 createTime(uint64_t(qpid::sys::Duration(qpid::sys::now()))),
00138 destroyTime(0), updateTime(createTime), configChanged(true),
00139 instChanged(true), deleted(false),
00140 coreObject(_core), forcePublish(false) {}
00141 virtual ~ManagementObject() {}
00142
00143 virtual writeSchemaCall_t getWriteSchemaCall() = 0;
00144 virtual void writeProperties(qpid::framing::Buffer& buf) = 0;
00145 virtual void writeStatistics(qpid::framing::Buffer& buf,
00146 bool skipHeaders = false) = 0;
00147 virtual void doMethod(std::string& methodName,
00148 qpid::framing::Buffer& inBuf,
00149 qpid::framing::Buffer& outBuf) = 0;
00150 QPID_COMMON_EXTERN virtual void setReference(ObjectId objectId);
00151
00152 virtual std::string& getClassName() const = 0;
00153 virtual std::string& getPackageName() const = 0;
00154 virtual uint8_t* getMd5Sum() const = 0;
00155
00156 void setObjectId(ObjectId oid) { objectId = oid; }
00157 ObjectId getObjectId() { return objectId; }
00158 inline bool getConfigChanged() { return configChanged; }
00159 virtual bool getInstChanged() { return instChanged; }
00160 virtual bool hasInst() { return true; }
00161 inline void setForcePublish(bool f) { forcePublish = f; }
00162 inline bool getForcePublish() { return forcePublish; }
00163 inline void setUpdateTime() { updateTime = (uint64_t(sys::Duration(sys::now()))); }
00164
00165 inline void resourceDestroy() {
00166 destroyTime = uint64_t (qpid::sys::Duration(qpid::sys::now()));
00167 deleted = true;
00168 }
00169 inline bool isDeleted() { return deleted; }
00170 inline void setFlags(uint32_t f) { flags = f; }
00171 inline uint32_t getFlags() { return flags; }
00172 bool isSameClass(ManagementObject& other) {
00173 for (int idx = 0; idx < 16; idx++)
00174 if (other.getMd5Sum()[idx] != getMd5Sum()[idx])
00175 return false;
00176 return other.getClassName() == getClassName() &&
00177 other.getPackageName() == getPackageName();
00178 }
00179 };
00180
00181 typedef std::map<ObjectId, ManagementObject*> ManagementObjectMap;
00182
00183 }}
00184
00185
00186
00187 #endif