diff options
author | Kenneth Anthony Giusti <kgiusti@apache.org> | 2010-03-19 19:49:30 +0000 |
---|---|---|
committer | Kenneth Anthony Giusti <kgiusti@apache.org> | 2010-03-19 19:49:30 +0000 |
commit | 77431e5a5d165975bf3e39c6b9ae9e0ed3228464 (patch) | |
tree | ec648a74256e2327bb75bb552e7d655ba1b05476 | |
parent | 3d4e75c60e892d2a0adf59b1f6d944eef58b343d (diff) | |
download | qpid-python-77431e5a5d165975bf3e39c6b9ae9e0ed3228464.tar.gz |
modify addObject() API
git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/qmf-devel0.7a@925397 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | qpid/cpp/include/qpid/agent/ManagementAgent.h | 3 | ||||
-rw-r--r-- | qpid/cpp/include/qpid/management/ManagementObject.h | 13 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/agent/ManagementAgentImpl.cpp | 26 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/agent/ManagementAgentImpl.h | 2 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/management/ManagementAgent.cpp | 46 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/management/ManagementAgent.h | 5 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/management/ManagementObject.cpp | 45 | ||||
-rw-r--r-- | qpid/cpp/src/tests/ManagementTest.cpp | 20 |
8 files changed, 94 insertions, 66 deletions
diff --git a/qpid/cpp/include/qpid/agent/ManagementAgent.h b/qpid/cpp/include/qpid/agent/ManagementAgent.h index f0bf443bf5..affaa9e97c 100644 --- a/qpid/cpp/include/qpid/agent/ManagementAgent.h +++ b/qpid/cpp/include/qpid/agent/ManagementAgent.h @@ -145,6 +145,9 @@ class ManagementAgent // in an orderly way. // virtual ObjectId addObject(ManagementObject* objectPtr, uint64_t persistId = 0) = 0; + virtual ObjectId addObject(ManagementObject* objectPtr, + const std::string& key, + bool persistent = true) = 0; // // diff --git a/qpid/cpp/include/qpid/management/ManagementObject.h b/qpid/cpp/include/qpid/management/ManagementObject.h index 35dafc1156..d8805e182e 100644 --- a/qpid/cpp/include/qpid/management/ManagementObject.h +++ b/qpid/cpp/include/qpid/management/ManagementObject.h @@ -24,7 +24,6 @@ #include "qpid/sys/Time.h" #include "qpid/sys/Mutex.h" -//#include <qpid/framing/Buffer.h> #include "qpid/CommonImportExport.h" #include "qpid/messaging/MapContent.h" #include "qpid/messaging/MapView.h" @@ -54,28 +53,22 @@ class ObjectId { protected: const AgentAttachment* agent; uint64_t first; - uint64_t second; std::string v2Key; void fromString(const std::string&); public: - QPID_COMMON_EXTERN ObjectId() : agent(0), first(0), second(0) {} - //QPID_COMMON_EXTERN ObjectId(framing::Buffer& buf) : agent(0) { decode(buf); } + QPID_COMMON_EXTERN ObjectId() : agent(0), first(0) {} QPID_COMMON_EXTERN ObjectId(const messaging::Variant& map) : agent(0) { mapDecode(map.asMap()); } - QPID_COMMON_EXTERN ObjectId(uint8_t flags, uint16_t seq, uint32_t broker, uint32_t bank, uint64_t object); - QPID_COMMON_EXTERN ObjectId(AgentAttachment* _agent, uint8_t flags, uint16_t seq, uint64_t object); + QPID_COMMON_EXTERN ObjectId(uint8_t flags, uint16_t seq, uint32_t broker); + QPID_COMMON_EXTERN ObjectId(AgentAttachment* _agent, uint8_t flags, uint16_t seq); QPID_COMMON_EXTERN ObjectId(std::istream&); QPID_COMMON_EXTERN ObjectId(const std::string&); QPID_COMMON_EXTERN bool operator==(const ObjectId &other) const; QPID_COMMON_EXTERN bool operator<(const ObjectId &other) const; - //QPID_COMMON_EXTERN uint32_t encodedSize() const; - //QPID_COMMON_EXTERN void encode(framing::Buffer& buffer) const; - //QPID_COMMON_EXTERN void decode(framing::Buffer& buffer); QPID_COMMON_EXTERN void mapEncode(messaging::VariantMap& map) const; QPID_COMMON_EXTERN void mapDecode(const messaging::VariantMap& map); QPID_COMMON_EXTERN operator messaging::VariantMap() const; QPID_COMMON_EXTERN void setV2Key(const std::string& _key) { v2Key = _key; } QPID_COMMON_EXTERN void setV2Key(const ManagementObject& object); - QPID_COMMON_EXTERN bool equalV1(const ObjectId &other) const; QPID_COMMON_EXTERN const std::string& getV2Key() const { return v2Key; } friend QPID_COMMON_EXTERN std::ostream& operator<<(std::ostream&, const ObjectId&); }; diff --git a/qpid/cpp/src/qpid/agent/ManagementAgentImpl.cpp b/qpid/cpp/src/qpid/agent/ManagementAgentImpl.cpp index b21e7105a3..3d05e02bcc 100644 --- a/qpid/cpp/src/qpid/agent/ManagementAgentImpl.cpp +++ b/qpid/cpp/src/qpid/agent/ManagementAgentImpl.cpp @@ -196,21 +196,39 @@ void ManagementAgentImpl::registerEvent(const string& packageName, addClassLocal(ManagementItem::CLASS_KIND_EVENT, pIter, eventName, md5Sum, schemaCall); } +// old-style add object: 64bit id - deprecated ObjectId ManagementAgentImpl::addObject(ManagementObject* object, uint64_t persistId) { + std::string key; + if (persistId) { + key = boost::lexical_cast<std::string>(persistId); + } + return addObject(object, key, persistId != 0); +} + + +// new style add object - use this approach! +ObjectId ManagementAgentImpl::addObject(ManagementObject* object, + const std::string& key, + bool persistent) +{ Mutex::ScopedLock lock(addLock); - uint16_t sequence = persistId ? 0 : bootSequence; - uint64_t objectNum = persistId ? persistId : nextObjectId++; - ObjectId objectId(&attachment, 0, sequence, objectNum); + uint16_t sequence = persistent ? 0 : bootSequence; + + ObjectId objectId(&attachment, 0, sequence); + if (key.empty()) + objectId.setV2Key(*object); // let object generate the key + else + objectId.setV2Key(key); - // TODO: fix object-id handling object->setObjectId(objectId); newManagementObjects[objectId] = object; return objectId; } + void ManagementAgentImpl::raiseEvent(const ManagementEvent& event, severity_t severity) { Mutex::ScopedLock lock(agentLock); diff --git a/qpid/cpp/src/qpid/agent/ManagementAgentImpl.h b/qpid/cpp/src/qpid/agent/ManagementAgentImpl.h index 0c2d06a6c8..4f838d2317 100644 --- a/qpid/cpp/src/qpid/agent/ManagementAgentImpl.h +++ b/qpid/cpp/src/qpid/agent/ManagementAgentImpl.h @@ -78,6 +78,8 @@ class ManagementAgentImpl : public ManagementAgent, public client::MessageListen uint8_t* md5Sum, management::ManagementObject::writeSchemaCall_t schemaCall); ObjectId addObject(management::ManagementObject* objectPtr, uint64_t persistId = 0); + ObjectId addObject(management::ManagementObject* objectPtr, const std::string& key, + bool persistent); void raiseEvent(const management::ManagementEvent& event, severity_t severity = SEV_DEFAULT); uint32_t pollCallbacks(uint32_t callLimit = 0); int getSignalFd(); diff --git a/qpid/cpp/src/qpid/management/ManagementAgent.cpp b/qpid/cpp/src/qpid/management/ManagementAgent.cpp index 873e509c36..0adafc7dd5 100644 --- a/qpid/cpp/src/qpid/management/ManagementAgent.cpp +++ b/qpid/cpp/src/qpid/management/ManagementAgent.cpp @@ -210,25 +210,33 @@ void ManagementAgent::registerEvent (const string& packageName, addClassLH(ManagementItem::CLASS_KIND_EVENT, pIter, eventName, md5Sum, schemaCall); } + +// Deprecated: +ObjectId ManagementAgent::addObject(ManagementObject* object, uint64_t persistId, bool publishNow) +{ + // always force object to generate key string + return addObject(object, std::string(), persistId != 0, publishNow); +} + + + ObjectId ManagementAgent::addObject(ManagementObject* object, - uint64_t persistId, - bool publishNow) + const std::string& key, + bool persistent, + bool publishNow) { Mutex::ScopedLock lock (addLock); uint16_t sequence; - uint64_t objectNum; - if (persistId == 0) { - sequence = bootSequence; - objectNum = nextObjectId++; + sequence = persistent ? 0 : bootSequence; + + ObjectId objId(0 /*flags*/, sequence, brokerBank); + if (key.empty()) { + objId.setV2Key(*object); // let object generate the key } else { - sequence = 0; - objectNum = persistId; + objId.setV2Key(key); } - ObjectId objId(0 /*flags*/ , sequence, brokerBank, 0, objectNum); - objId.setV2Key(*object); - object->setObjectId(objId); ManagementObjectMap::iterator destIter = newManagementObjects.find(objId); if (destIter != newManagementObjects.end()) { @@ -815,7 +823,7 @@ void ManagementAgent::handleMethodRequestLH (Buffer& inBuffer, string replyToKey } } - ManagementObjectMap::iterator iter = numericFind(objId); + ManagementObjectMap::iterator iter = managementObjects.find(objId); if (iter == managementObjects.end() || iter->second->isDeleted()) { outBuffer.putLong (Manageable::STATUS_UNKNOWN_OBJECT); outBuffer.putMediumString(Manageable::StatusText (Manageable::STATUS_UNKNOWN_OBJECT)); @@ -1300,7 +1308,7 @@ void ManagementAgent::handleGetQueryLH (Buffer& inBuffer, string replyToKey, uin return; ObjectId selector(value->get<string>()); - ManagementObjectMap::iterator iter = numericFind(selector); + ManagementObjectMap::iterator iter = managementObjects.find(selector); if (iter != managementObjects.end()) { ManagementObject* object = iter->second; ::qpid::messaging::Message m; @@ -1782,18 +1790,6 @@ size_t ManagementAgent::validateEventSchema(Buffer& inBuffer) return end - start; } -ManagementObjectMap::iterator ManagementAgent::numericFind(const ObjectId& oid) -{ - ManagementObjectMap::iterator iter = managementObjects.begin(); - for (; iter != managementObjects.end(); iter++) { - if (oid.equalV1(iter->first)) - break; - } - - return iter; -} - - void ManagementAgent::setAllocator(std::auto_ptr<IdAllocator> a) { Mutex::ScopedLock lock (addLock); diff --git a/qpid/cpp/src/qpid/management/ManagementAgent.h b/qpid/cpp/src/qpid/management/ManagementAgent.h index e74d8b419a..47f78e48bd 100644 --- a/qpid/cpp/src/qpid/management/ManagementAgent.h +++ b/qpid/cpp/src/qpid/management/ManagementAgent.h @@ -90,6 +90,10 @@ public: QPID_BROKER_EXTERN ObjectId addObject (ManagementObject* object, uint64_t persistId = 0, bool publishNow = false); + QPID_BROKER_EXTERN ObjectId addObject (ManagementObject* object, + const std::string& key, + bool persistent = true, + bool publishNow = false); QPID_BROKER_EXTERN void raiseEvent(const ManagementEvent& event, severity_t severity = SEV_DEFAULT); QPID_BROKER_EXTERN void clientAdded (const std::string& routingKey); @@ -315,7 +319,6 @@ private: size_t validateSchema(framing::Buffer&, uint8_t kind); size_t validateTableSchema(framing::Buffer&); size_t validateEventSchema(framing::Buffer&); - ManagementObjectMap::iterator numericFind(const ObjectId& oid); void debugSnapshot(const char*); }; diff --git a/qpid/cpp/src/qpid/management/ManagementObject.cpp b/qpid/cpp/src/qpid/management/ManagementObject.cpp index 0434c59194..00cd604802 100644 --- a/qpid/cpp/src/qpid/management/ManagementObject.cpp +++ b/qpid/cpp/src/qpid/management/ManagementObject.cpp @@ -36,6 +36,8 @@ void AgentAttachment::setBanks(uint32_t broker, uint32_t bank) ((uint64_t) (bank & 0x0fffffff)); } +#if 0 +// Deprecated ObjectId::ObjectId(uint8_t flags, uint16_t seq, uint32_t broker, uint32_t bank, uint64_t object) : agent(0) { @@ -46,16 +48,26 @@ ObjectId::ObjectId(uint8_t flags, uint16_t seq, uint32_t broker, uint32_t bank, ((uint64_t) (bank & 0x0fffffff)); second = object; } +#endif + +ObjectId::ObjectId(uint8_t flags, uint16_t seq, uint32_t broker) + : agent(0) +{ + first = + ((uint64_t) (flags & 0x0f)) << 60 | + ((uint64_t) (seq & 0x0fff)) << 48 | + ((uint64_t) (broker & 0x000fffff)) << 28; +} -ObjectId::ObjectId(AgentAttachment* _agent, uint8_t flags, uint16_t seq, uint64_t object) +ObjectId::ObjectId(AgentAttachment* _agent, uint8_t flags, uint16_t seq) : agent(_agent) { first = ((uint64_t) (flags & 0x0f)) << 60 | ((uint64_t) (seq & 0x0fff)) << 48; - second = object; } + ObjectId::ObjectId(std::istream& in) : agent(0) { std::string text; @@ -70,40 +82,43 @@ ObjectId::ObjectId(const std::string& text) : agent(0) void ObjectId::fromString(const std::string& text) { -#define FIELDS 5 +#define NUMERIC_FIELDS 4 #if defined (_WIN32) && !defined (atoll) # define atoll(X) _atoi64(X) #endif std::string copy(text.c_str()); char* cText; - char* field[FIELDS]; + char* field[NUMERIC_FIELDS]; bool atFieldStart = true; int idx = 0; + char *cursor; cText = const_cast<char*>(copy.c_str()); - for (char* cursor = cText; *cursor; cursor++) { + for (cursor = cText; *cursor; cursor++) { if (atFieldStart) { - if (idx >= FIELDS) - throw Exception("Invalid ObjectId format"); field[idx++] = cursor; atFieldStart = false; } else { if (*cursor == '-') { *cursor = '\0'; atFieldStart = true; + if (idx == NUMERIC_FIELDS) { + cursor++; + break; + } } } } - if (idx != FIELDS) + if (idx != NUMERIC_FIELDS || !atFieldStart || !(*cursor)) throw Exception("Invalid ObjectId format"); first = (atoll(field[0]) << 60) + (atoll(field[1]) << 48) + (atoll(field[2]) << 28) + atoll(field[3]); - second = atoll(field[4]); + v2Key = std::string(cursor); } @@ -117,11 +132,13 @@ bool ObjectId::operator<(const ObjectId &other) const return v2Key < other.v2Key; } +#if 0 bool ObjectId::equalV1(const ObjectId &other) const { uint64_t otherFirst = agent == 0 ? other.first : other.first & 0xffff000000000000LL; return first == otherFirst && second == other.second; } +#endif // void ObjectId::encode(framing::Buffer& buffer) const // { @@ -151,8 +168,7 @@ void ObjectId::mapEncode(messaging::VariantMap& map) const map["_first"] = first; else map["_first"] = (first | agent->first); - map["_second"] = second; - map["_object_id"] = v2Key; + map["_object_name"] = v2Key; } void ObjectId::mapDecode(const messaging::VariantMap& map) @@ -162,10 +178,7 @@ void ObjectId::mapDecode(const messaging::VariantMap& map) if ((i = map.find("_first")) != map.end()) first = i->second.asUint64(); - if ((i = map.find("_second")) != map.end()) - second = i->second.asUint64(); - - if ((i = map.find("_object_id")) != map.end()) + if ((i = map.find("_object_name")) != map.end()) v2Key = i->second.asString(); } @@ -192,7 +205,7 @@ std::ostream& operator<<(std::ostream& out, const ObjectId& i) "-" << ((virtFirst & 0x0FFF000000000000LL) >> 48) << "-" << ((virtFirst & 0x0000FFFFF0000000LL) >> 28) << "-" << (virtFirst & 0x000000000FFFFFFFLL) << - "-" << i.second; + "-" << i.v2Key; return out; } diff --git a/qpid/cpp/src/tests/ManagementTest.cpp b/qpid/cpp/src/tests/ManagementTest.cpp index d05b4676ba..3d079eff75 100644 --- a/qpid/cpp/src/tests/ManagementTest.cpp +++ b/qpid/cpp/src/tests/ManagementTest.cpp @@ -56,32 +56,32 @@ QPID_AUTO_TEST_CASE(testObjectIdSerializeString) { } QPID_AUTO_TEST_CASE(testObjectIdEncode) { - char buffer[100]; - Buffer msgBuf(buffer, 100); - msgBuf.putLongLong(0x1002000030000004LL); - msgBuf.putLongLong(0x0000000000000005LL); - msgBuf.reset(); + qpid::messaging::Variant::Map oidMap; - ObjectId oid(msgBuf); + ObjectId oid(1, 2, 3); + oid.setV2Key("testkey"); std::stringstream out1; out1 << oid; - BOOST_CHECK_EQUAL(out1.str(), "1-2-3-4-5"); + BOOST_CHECK_EQUAL(out1.str(), "1-2-3-0-testkey"); } QPID_AUTO_TEST_CASE(testObjectIdAttach) { AgentAttachment agent; - ObjectId oid(&agent, 10, 20, 50); + ObjectId oid(&agent, 10, 20); + oid.setV2Key("GabbaGabbaHey"); std::stringstream out1; out1 << oid; - BOOST_CHECK_EQUAL(out1.str(), "10-20-0-0-50"); + + BOOST_CHECK_EQUAL(out1.str(), "10-20-0-0-GabbaGabbaHey"); agent.setBanks(30, 40); std::stringstream out2; out2 << oid; - BOOST_CHECK_EQUAL(out2.str(), "10-20-30-40-50"); + + BOOST_CHECK_EQUAL(out2.str(), "10-20-30-40-GabbaGabbaHey"); } QPID_AUTO_TEST_CASE(testConsoleObjectId) { |