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