Go to the documentation of this file.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 #include "qpid/CommonImportExport.h"
00025
00026 #include "qpid/management/Mutex.h"
00027 #include "qpid/types/Variant.h"
00028
00029 #include <map>
00030 #include <vector>
00031
00032 namespace qpid {
00033 namespace management {
00034
00035 class Manageable;
00036 class ObjectId;
00037 class ManagementObject;
00038
00039
00040 class AgentAttachment {
00041 friend class ObjectId;
00042 private:
00043 uint64_t first;
00044 public:
00045 AgentAttachment() : first(0) {}
00046 QPID_COMMON_EXTERN void setBanks(uint32_t broker, uint32_t bank);
00047 uint64_t getFirst() const { return first; }
00048 };
00049
00050
00051 class ObjectId {
00052 protected:
00053 const AgentAttachment* agent;
00054 uint64_t first;
00055 uint64_t second;
00056 uint64_t agentEpoch;
00057 std::string v2Key;
00058 std::string agentName;
00059 void fromString(const std::string&);
00060 public:
00061 QPID_COMMON_EXTERN ObjectId() : agent(0), first(0), second(0), agentEpoch(0) {}
00062 QPID_COMMON_EXTERN ObjectId(const types::Variant& map) :
00063 agent(0), first(0), second(0), agentEpoch(0) { mapDecode(map.asMap()); }
00064 QPID_COMMON_EXTERN ObjectId(uint8_t flags, uint16_t seq, uint32_t broker);
00065 QPID_COMMON_EXTERN ObjectId(AgentAttachment* _agent, uint8_t flags, uint16_t seq);
00066 QPID_COMMON_EXTERN ObjectId(std::istream&);
00067 QPID_COMMON_EXTERN ObjectId(const std::string&);
00068
00069 QPID_COMMON_EXTERN ObjectId(uint8_t flags, uint16_t seq, uint32_t broker, uint64_t object);
00070 QPID_COMMON_EXTERN bool operator==(const ObjectId &other) const;
00071 QPID_COMMON_EXTERN bool operator<(const ObjectId &other) const;
00072 QPID_COMMON_EXTERN void mapEncode(types::Variant::Map& map) const;
00073 QPID_COMMON_EXTERN void mapDecode(const types::Variant::Map& map);
00074 QPID_COMMON_EXTERN operator types::Variant::Map() const;
00075 QPID_COMMON_EXTERN uint32_t encodedSize() const { return 16; };
00076 QPID_COMMON_EXTERN void encode(std::string& buffer) const;
00077 QPID_COMMON_EXTERN void decode(const std::string& buffer);
00078 QPID_COMMON_EXTERN bool equalV1(const ObjectId &other) const;
00079 QPID_COMMON_EXTERN void setV2Key(const std::string& _key) { v2Key = _key; }
00080 QPID_COMMON_EXTERN void setV2Key(const ManagementObject& object);
00081 QPID_COMMON_EXTERN void disambiguate();
00082 QPID_COMMON_EXTERN void setAgentName(const std::string& _name) { agentName = _name; }
00083 QPID_COMMON_EXTERN const std::string& getAgentName() const { return agentName; }
00084 QPID_COMMON_EXTERN const std::string& getV2Key() const { return v2Key; }
00085 friend QPID_COMMON_EXTERN std::ostream& operator<<(std::ostream&, const ObjectId&);
00086 };
00087
00088 class ManagementItem {
00089 public:
00090 static const uint8_t TYPE_U8 = 1;
00091 static const uint8_t TYPE_U16 = 2;
00092 static const uint8_t TYPE_U32 = 3;
00093 static const uint8_t TYPE_U64 = 4;
00094 static const uint8_t TYPE_SSTR = 6;
00095 static const uint8_t TYPE_LSTR = 7;
00096 static const uint8_t TYPE_ABSTIME = 8;
00097 static const uint8_t TYPE_DELTATIME = 9;
00098 static const uint8_t TYPE_REF = 10;
00099 static const uint8_t TYPE_BOOL = 11;
00100 static const uint8_t TYPE_FLOAT = 12;
00101 static const uint8_t TYPE_DOUBLE = 13;
00102 static const uint8_t TYPE_UUID = 14;
00103 static const uint8_t TYPE_FTABLE = 15;
00104 static const uint8_t TYPE_S8 = 16;
00105 static const uint8_t TYPE_S16 = 17;
00106 static const uint8_t TYPE_S32 = 18;
00107 static const uint8_t TYPE_S64 = 19;
00108 static const uint8_t TYPE_LIST = 21;
00109
00110 static const uint8_t ACCESS_RC = 1;
00111 static const uint8_t ACCESS_RW = 2;
00112 static const uint8_t ACCESS_RO = 3;
00113
00114 static const uint8_t DIR_I = 1;
00115 static const uint8_t DIR_O = 2;
00116 static const uint8_t DIR_IO = 3;
00117
00118 static const uint8_t FLAG_CONFIG = 0x01;
00119 static const uint8_t FLAG_INDEX = 0x02;
00120 static const uint8_t FLAG_END = 0x80;
00121
00122 const static uint8_t CLASS_KIND_TABLE = 1;
00123 const static uint8_t CLASS_KIND_EVENT = 2;
00124
00125
00126
00127 public:
00128 virtual ~ManagementItem() {}
00129 };
00130
00131 class ManagementObject : public ManagementItem
00132 {
00133 protected:
00134
00135 uint64_t createTime;
00136 uint64_t destroyTime;
00137 uint64_t updateTime;
00138 ObjectId objectId;
00139 mutable bool configChanged;
00140 mutable bool instChanged;
00141 bool deleted;
00142 Manageable* coreObject;
00143 mutable Mutex accessLock;
00144 uint32_t flags;
00145
00146 static int nextThreadIndex;
00147 bool forcePublish;
00148
00149 QPID_COMMON_EXTERN int getThreadIndex();
00150 QPID_COMMON_EXTERN void writeTimestamps(std::string& buf) const;
00151 QPID_COMMON_EXTERN void readTimestamps(const std::string& buf);
00152 QPID_COMMON_EXTERN uint32_t writeTimestampsSize() const;
00153
00154 public:
00155 QPID_COMMON_EXTERN static const uint8_t MD5_LEN = 16;
00156 QPID_COMMON_EXTERN static int maxThreads;
00157
00158 typedef void (*writeSchemaCall_t) (std::string&);
00159
00160 QPID_COMMON_EXTERN ManagementObject(Manageable* _core);
00161 virtual ~ManagementObject() {}
00162
00163 virtual writeSchemaCall_t getWriteSchemaCall() = 0;
00164 virtual std::string getKey() const = 0;
00165
00166
00167
00168 virtual void mapEncodeValues(types::Variant::Map& map,
00169 bool includeProperties,
00170 bool includeStatistics) = 0;
00171 virtual void mapDecodeValues(const types::Variant::Map& map) = 0;
00172 virtual void doMethod(std::string& methodName,
00173 const types::Variant::Map& inMap,
00174 types::Variant::Map& outMap) = 0;
00175 QPID_COMMON_EXTERN void writeTimestamps(types::Variant::Map& map) const;
00176 QPID_COMMON_EXTERN void readTimestamps(const types::Variant::Map& buf);
00177
00182 virtual uint32_t writePropertiesSize() const { return 0; }
00183 virtual void readProperties(const std::string&) {}
00184 virtual void writeProperties(std::string&) const {}
00185 virtual void writeStatistics(std::string&, bool = false) {}
00186 virtual void doMethod(std::string&, const std::string&, std::string&) {}
00187
00188 QPID_COMMON_EXTERN virtual void setReference(ObjectId objectId);
00189
00190 virtual std::string& getClassName() const = 0;
00191 virtual std::string& getPackageName() const = 0;
00192 virtual uint8_t* getMd5Sum() const = 0;
00193
00194 void setObjectId(ObjectId oid) { objectId = oid; }
00195 ObjectId getObjectId() { return objectId; }
00196 inline bool getConfigChanged() { return configChanged; }
00197 virtual bool getInstChanged() { return instChanged; }
00198 virtual bool hasInst() { return true; }
00199 inline void setForcePublish(bool f) { forcePublish = f; }
00200 inline bool getForcePublish() { return forcePublish; }
00201 QPID_COMMON_EXTERN void setUpdateTime();
00202 QPID_COMMON_EXTERN void resourceDestroy();
00203 inline bool isDeleted() { return deleted; }
00204 inline void setFlags(uint32_t f) { flags = f; }
00205 inline uint32_t getFlags() { return flags; }
00206 bool isSameClass(ManagementObject& other) {
00207 for (int idx = 0; idx < MD5_LEN; idx++)
00208 if (other.getMd5Sum()[idx] != getMd5Sum()[idx])
00209 return false;
00210 return other.getClassName() == getClassName() &&
00211 other.getPackageName() == getPackageName();
00212 }
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224 };
00225
00226 typedef std::map<ObjectId, ManagementObject*> ManagementObjectMap;
00227 typedef std::vector<ManagementObject*> ManagementObjectVector;
00228
00229 }}
00230
00231
00232
00233 #endif