You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kg...@apache.org on 2010/03/19 20:49:31 UTC

svn commit: r925397 - in /qpid/branches/qmf-devel0.7a/qpid/cpp: include/qpid/agent/ include/qpid/management/ src/qpid/agent/ src/qpid/management/ src/tests/

Author: kgiusti
Date: Fri Mar 19 19:49:30 2010
New Revision: 925397

URL: http://svn.apache.org/viewvc?rev=925397&view=rev
Log:
modify addObject() API

Modified:
    qpid/branches/qmf-devel0.7a/qpid/cpp/include/qpid/agent/ManagementAgent.h
    qpid/branches/qmf-devel0.7a/qpid/cpp/include/qpid/management/ManagementObject.h
    qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/agent/ManagementAgentImpl.cpp
    qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/agent/ManagementAgentImpl.h
    qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/management/ManagementAgent.cpp
    qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/management/ManagementAgent.h
    qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/management/ManagementObject.cpp
    qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/ManagementTest.cpp

Modified: qpid/branches/qmf-devel0.7a/qpid/cpp/include/qpid/agent/ManagementAgent.h
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/cpp/include/qpid/agent/ManagementAgent.h?rev=925397&r1=925396&r2=925397&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/cpp/include/qpid/agent/ManagementAgent.h (original)
+++ qpid/branches/qmf-devel0.7a/qpid/cpp/include/qpid/agent/ManagementAgent.h Fri Mar 19 19:49:30 2010
@@ -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;
 
     //
     //

Modified: qpid/branches/qmf-devel0.7a/qpid/cpp/include/qpid/management/ManagementObject.h
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/cpp/include/qpid/management/ManagementObject.h?rev=925397&r1=925396&r2=925397&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/cpp/include/qpid/management/ManagementObject.h (original)
+++ qpid/branches/qmf-devel0.7a/qpid/cpp/include/qpid/management/ManagementObject.h Fri Mar 19 19:49:30 2010
@@ -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&);
 };

Modified: qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/agent/ManagementAgentImpl.cpp
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/agent/ManagementAgentImpl.cpp?rev=925397&r1=925396&r2=925397&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/agent/ManagementAgentImpl.cpp (original)
+++ qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/agent/ManagementAgentImpl.cpp Fri Mar 19 19:49:30 2010
@@ -196,21 +196,39 @@ void ManagementAgentImpl::registerEvent(
     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);

Modified: qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/agent/ManagementAgentImpl.h
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/agent/ManagementAgentImpl.h?rev=925397&r1=925396&r2=925397&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/agent/ManagementAgentImpl.h (original)
+++ qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/agent/ManagementAgentImpl.h Fri Mar 19 19:49:30 2010
@@ -78,6 +78,8 @@ class ManagementAgentImpl : public Manag
                        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();

Modified: qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/management/ManagementAgent.cpp
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/management/ManagementAgent.cpp?rev=925397&r1=925396&r2=925397&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/management/ManagementAgent.cpp (original)
+++ qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/management/ManagementAgent.cpp Fri Mar 19 19:49:30 2010
@@ -210,25 +210,33 @@ void ManagementAgent::registerEvent (con
     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::handleMethodReques
         }
     }
 
-    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 (
             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::validateEventSch
     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);

Modified: qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/management/ManagementAgent.h
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/management/ManagementAgent.h?rev=925397&r1=925396&r2=925397&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/management/ManagementAgent.h (original)
+++ qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/management/ManagementAgent.h Fri Mar 19 19:49:30 2010
@@ -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*);
 };
 

Modified: qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/management/ManagementObject.cpp
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/management/ManagementObject.cpp?rev=925397&r1=925396&r2=925397&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/management/ManagementObject.cpp (original)
+++ qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/management/ManagementObject.cpp Fri Mar 19 19:49:30 2010
@@ -36,6 +36,8 @@ void AgentAttachment::setBanks(uint32_t 
         ((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
         ((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& te
 
 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 
     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::Vari
         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
     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& o
         "-" << ((virtFirst & 0x0FFF000000000000LL) >> 48) <<
         "-" << ((virtFirst & 0x0000FFFFF0000000LL) >> 28) <<
         "-" <<  (virtFirst & 0x000000000FFFFFFFLL) <<
-        "-" << i.second;
+        "-" << i.v2Key;
     return out;
 }
 

Modified: qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/ManagementTest.cpp
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/ManagementTest.cpp?rev=925397&r1=925396&r2=925397&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/ManagementTest.cpp (original)
+++ qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/ManagementTest.cpp Fri Mar 19 19:49:30 2010
@@ -56,32 +56,32 @@ QPID_AUTO_TEST_CASE(testObjectIdSerializ
 }
 
 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) {



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org