summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth Anthony Giusti <kgiusti@apache.org>2010-03-19 19:49:30 +0000
committerKenneth Anthony Giusti <kgiusti@apache.org>2010-03-19 19:49:30 +0000
commit77431e5a5d165975bf3e39c6b9ae9e0ed3228464 (patch)
treeec648a74256e2327bb75bb552e7d655ba1b05476
parent3d4e75c60e892d2a0adf59b1f6d944eef58b343d (diff)
downloadqpid-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.h3
-rw-r--r--qpid/cpp/include/qpid/management/ManagementObject.h13
-rw-r--r--qpid/cpp/src/qpid/agent/ManagementAgentImpl.cpp26
-rw-r--r--qpid/cpp/src/qpid/agent/ManagementAgentImpl.h2
-rw-r--r--qpid/cpp/src/qpid/management/ManagementAgent.cpp46
-rw-r--r--qpid/cpp/src/qpid/management/ManagementAgent.h5
-rw-r--r--qpid/cpp/src/qpid/management/ManagementObject.cpp45
-rw-r--r--qpid/cpp/src/tests/ManagementTest.cpp20
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) {