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/22 23:10:42 UTC

svn commit: r926373 - in /qpid/branches/qmf-devel0.7a/qpid/cpp: include/qpid/management/ManagementObject.h src/qpid/management/ManagementObject.cpp src/tests/ManagementTest.cpp

Author: kgiusti
Date: Mon Mar 22 22:10:42 2010
New Revision: 926373

URL: http://svn.apache.org/viewvc?rev=926373&view=rev
Log:
Added agent name and epoch to the ObjectId

Modified:
    qpid/branches/qmf-devel0.7a/qpid/cpp/include/qpid/management/ManagementObject.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/management/ManagementObject.h
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/cpp/include/qpid/management/ManagementObject.h?rev=926373&r1=926372&r2=926373&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 Mon Mar 22 22:10:42 2010
@@ -53,7 +53,9 @@ class ObjectId {
 protected:
     const AgentAttachment* agent;
     uint64_t first;
+    uint64_t agentEpoch;
     std::string v2Key;
+    std::string agentName;
     void fromString(const std::string&);
 public:
     QPID_COMMON_EXTERN ObjectId() : agent(0), first(0) {}
@@ -69,6 +71,8 @@ public:
     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 void setAgentName(const std::string& _name) { agentName = _name; }
+    QPID_COMMON_EXTERN const std::string& getAgentName() const { return agentName; }
     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/management/ManagementObject.cpp
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/cpp/src/qpid/management/ManagementObject.cpp?rev=926373&r1=926372&r2=926373&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 Mon Mar 22 22:10:42 2010
@@ -51,7 +51,7 @@ ObjectId::ObjectId(uint8_t flags, uint16
 #endif
 
 ObjectId::ObjectId(uint8_t flags, uint16_t seq, uint32_t broker)
-    : agent(0)
+    : agent(0), agentEpoch(seq)
 {
     first =
         ((uint64_t) (flags  &       0x0f)) << 60 |
@@ -60,8 +60,9 @@ ObjectId::ObjectId(uint8_t flags, uint16
 }
 
 ObjectId::ObjectId(AgentAttachment* _agent, uint8_t flags, uint16_t seq)
-    : agent(_agent)
+    : agent(_agent), agentEpoch(seq)
 {
+
     first =
         ((uint64_t) (flags &   0x0f)) << 60 |
         ((uint64_t) (seq   & 0x0fff)) << 48;
@@ -82,43 +83,41 @@ ObjectId::ObjectId(const std::string& te
 
 void ObjectId::fromString(const std::string& text)
 {
-#define NUMERIC_FIELDS 4
+#define FIELDS 5
 #if defined (_WIN32) && !defined (atoll)
 #  define atoll(X) _atoi64(X)
 #endif
 
     std::string copy(text.c_str());
     char* cText;
-    char* field[NUMERIC_FIELDS];
+    char* field[FIELDS];
     bool  atFieldStart = true;
     int   idx = 0;
-    char  *cursor;
 
     cText = const_cast<char*>(copy.c_str());
-    for (cursor = cText; *cursor; cursor++) {
+    for (char* 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 != NUMERIC_FIELDS || !atFieldStart || !(*cursor))
+    if (idx != FIELDS)
         throw Exception("Invalid ObjectId format");
 
     first = (atoll(field[0]) << 60) +
         (atoll(field[1]) << 48) +
-        (atoll(field[2]) << 28) +
-        atoll(field[3]);
-    v2Key = std::string(cursor);
+        (atoll(field[2]) << 28);
+
+    agentName = std::string(field[3]);
+    v2Key = std::string(field[4]);
 }
 
 
@@ -168,18 +167,31 @@ void ObjectId::mapEncode(messaging::Vari
         map["_first"] = first;
     else
         map["_first"] = (first | agent->first);
+
     map["_object_name"] = v2Key;
+    if (!agentName.empty())
+        map["_agent_name"] = agentName;
+    if (agentEpoch)
+        map["_agent_epoch"] = agentEpoch;
 }
 
 void ObjectId::mapDecode(const messaging::VariantMap& map)
 {
     messaging::MapView::const_iterator i;
 
+    if ((i = map.find("_object_name")) != map.end())
+        v2Key = i->second.asString();
+    else
+        throw Exception("Required _object_name field missing.");
+
     if ((i = map.find("_first")) != map.end())
         first  = i->second.asUint64();
 
-    if ((i = map.find("_object_name")) != map.end())
-        v2Key = i->second.asString();
+    if ((i = map.find("_agent_name")) != map.end())
+        agentName = i->second.asString();
+
+    if ((i = map.find("_agent_epoch")) != map.end())
+        agentEpoch = i->second.asUint64();
 }
 
 
@@ -204,7 +216,7 @@ std::ostream& operator<<(std::ostream& o
     out << ((virtFirst & 0xF000000000000000LL) >> 60) <<
         "-" << ((virtFirst & 0x0FFF000000000000LL) >> 48) <<
         "-" << ((virtFirst & 0x0000FFFFF0000000LL) >> 28) <<
-        "-" <<  (virtFirst & 0x000000000FFFFFFFLL) <<
+        "-" << i.agentName <<
         "-" << 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=926373&r1=926372&r2=926373&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 Mon Mar 22 22:10:42 2010
@@ -60,28 +60,30 @@ QPID_AUTO_TEST_CASE(testObjectIdEncode) 
 
     ObjectId oid(1, 2, 3);
     oid.setV2Key("testkey");
+    oid.setAgentName("myAgent");
 
     std::stringstream out1;
     out1 << oid;
 
-    BOOST_CHECK_EQUAL(out1.str(), "1-2-3-0-testkey");
+    BOOST_CHECK_EQUAL(out1.str(), "1-2-3-myAgent-testkey");
 }
 
 QPID_AUTO_TEST_CASE(testObjectIdAttach) {
     AgentAttachment   agent;
     ObjectId          oid(&agent, 10, 20);
     oid.setV2Key("GabbaGabbaHey");
+    oid.setAgentName("MrSmith");
 
     std::stringstream out1;
     out1 << oid;
 
-    BOOST_CHECK_EQUAL(out1.str(), "10-20-0-0-GabbaGabbaHey");
+    BOOST_CHECK_EQUAL(out1.str(), "10-20-0-MrSmith-GabbaGabbaHey");
 
     agent.setBanks(30, 40);
     std::stringstream out2;
     out2 << oid;
 
-    BOOST_CHECK_EQUAL(out2.str(), "10-20-30-40-GabbaGabbaHey");
+    BOOST_CHECK_EQUAL(out2.str(), "10-20-30-MrSmith-GabbaGabbaHey");
 }
 
 QPID_AUTO_TEST_CASE(testConsoleObjectId) {



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