summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth Anthony Giusti <kgiusti@apache.org>2010-03-15 15:55:17 +0000
committerKenneth Anthony Giusti <kgiusti@apache.org>2010-03-15 15:55:17 +0000
commitf540a63aae900898bfb08399e43b13cde6dfec91 (patch)
treec830729486803025e5752ed542b82ee4c76903e9
parentda36f4e7d2afa1f1005f10fe6dea9e79c0233b5b (diff)
downloadqpid-python-f540a63aae900898bfb08399e43b13cde6dfec91.tar.gz
Added map encode/decode support for qmf code generation
git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/qmf-devel0.7a@923310 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--qpid/cpp/include/qpid/agent/ManagementAgent.h14
-rw-r--r--qpid/cpp/include/qpid/management/ManagementEvent.h3
-rw-r--r--qpid/cpp/include/qpid/management/ManagementObject.h43
-rw-r--r--qpid/cpp/managementgen/qmfgen/management-types.xml12
-rwxr-xr-xqpid/cpp/managementgen/qmfgen/schema.py244
-rw-r--r--qpid/cpp/managementgen/qmfgen/templates/Class.cpp75
-rw-r--r--qpid/cpp/managementgen/qmfgen/templates/Class.h15
-rw-r--r--qpid/cpp/managementgen/qmfgen/templates/Event.cpp6
-rw-r--r--qpid/cpp/managementgen/qmfgen/templates/Event.h3
-rw-r--r--qpid/cpp/src/Makefile.am8
-rw-r--r--qpid/cpp/src/qpid/management/ManagementAgent.cpp8
-rw-r--r--qpid/cpp/src/qpid/management/ManagementObject.cpp91
-rw-r--r--qpid/cpp/src/tests/Makefile.am6
13 files changed, 497 insertions, 31 deletions
diff --git a/qpid/cpp/include/qpid/agent/ManagementAgent.h b/qpid/cpp/include/qpid/agent/ManagementAgent.h
index 41b6423624..d14fc9a24a 100644
--- a/qpid/cpp/include/qpid/agent/ManagementAgent.h
+++ b/qpid/cpp/include/qpid/agent/ManagementAgent.h
@@ -52,6 +52,20 @@ class ManagementAgent
static ManagementAgent* agent;
};
+ class Name {
+ public:
+ QMF_AGENT_EXTERN Name(std::string vendor,
+ std::string product,
+ std::string name);
+ QMF_AGENT_EXTERN Name();
+ QMF_AGENT_EXTERN operator std::string() const;
+
+ private:
+ std::string vendor;
+ std::string product;
+ std::string name;
+ };
+
typedef enum {
SEV_EMERG = 0,
SEV_ALERT = 1,
diff --git a/qpid/cpp/include/qpid/management/ManagementEvent.h b/qpid/cpp/include/qpid/management/ManagementEvent.h
index 01b9ae49ec..9327a2b710 100644
--- a/qpid/cpp/include/qpid/management/ManagementEvent.h
+++ b/qpid/cpp/include/qpid/management/ManagementEvent.h
@@ -34,14 +34,17 @@ class ManagementAgent;
class ManagementEvent : public ManagementItem {
public:
typedef void (*writeSchemaCall_t)(qpid::framing::Buffer&);
+ //typedef void (*mapEncodeSchemaCall_t)(qpid::messaging::MapContent&);
virtual ~ManagementEvent() {}
virtual writeSchemaCall_t getWriteSchemaCall(void) = 0;
+ //virtual mapEncodeSchemaCall_t getMapEncodeSchemaCall(void) = 0;
virtual std::string& getEventName() const = 0;
virtual std::string& getPackageName() const = 0;
virtual uint8_t* getMd5Sum() const = 0;
virtual uint8_t getSeverity() const = 0;
virtual void encode(qpid::framing::Buffer&) const = 0;
+ virtual void mapEncode(qpid::messaging::MapContent&) const = 0;
};
}}
diff --git a/qpid/cpp/include/qpid/management/ManagementObject.h b/qpid/cpp/include/qpid/management/ManagementObject.h
index b1c70f64d6..9e4c227e1c 100644
--- a/qpid/cpp/include/qpid/management/ManagementObject.h
+++ b/qpid/cpp/include/qpid/management/ManagementObject.h
@@ -26,6 +26,8 @@
#include "qpid/sys/Mutex.h"
#include <qpid/framing/Buffer.h>
#include "qpid/CommonImportExport.h"
+#include "qpid/messaging/MapContent.h"
+#include "qpid/messaging/MapView.h"
#include <map>
#include <vector>
@@ -58,15 +60,19 @@ protected:
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(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(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 { return 16; };
+ QPID_COMMON_EXTERN uint32_t encodedBufSize() const { return 16; };
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;
@@ -125,7 +131,7 @@ protected:
uint64_t updateTime;
ObjectId objectId;
mutable bool configChanged;
- bool instChanged;
+ mutable bool instChanged;
bool deleted;
Manageable* coreObject;
mutable sys::Mutex accessLock;
@@ -136,12 +142,17 @@ protected:
QPID_COMMON_EXTERN int getThreadIndex();
QPID_COMMON_EXTERN void writeTimestamps(qpid::framing::Buffer& buf) const;
+ QPID_COMMON_EXTERN void writeTimestamps(messaging::VariantMap& map) const;
QPID_COMMON_EXTERN void readTimestamps(qpid::framing::Buffer& buf);
- QPID_COMMON_EXTERN uint32_t writeTimestampsSize() const;
+ QPID_COMMON_EXTERN void readTimestamps(const messaging::VariantMap& buf);
+ QPID_COMMON_EXTERN uint32_t writeTimestampsBufSize() const;
+
+ static const uint8_t MD5_LEN = 16;
public:
QPID_COMMON_EXTERN static int maxThreads;
typedef void (*writeSchemaCall_t) (qpid::framing::Buffer&);
+ //typedef void (*mapEncodeSchemaCall_t) (messaging::MapContent&);
ManagementObject(Manageable* _core) :
createTime(uint64_t(qpid::sys::Duration(qpid::sys::now()))),
@@ -151,8 +162,9 @@ protected:
virtual ~ManagementObject() {}
virtual writeSchemaCall_t getWriteSchemaCall() = 0;
+ //virtual mapEncodeSchemaCall_t getMapEncodeSchemaCall() = 0;
virtual void readProperties(qpid::framing::Buffer& buf) = 0;
- virtual uint32_t writePropertiesSize() const = 0;
+ virtual uint32_t writePropertiesBufSize() const = 0;
virtual void writeProperties(qpid::framing::Buffer& buf) const = 0;
virtual void writeStatistics(qpid::framing::Buffer& buf,
bool skipHeaders = false) = 0;
@@ -160,6 +172,18 @@ protected:
qpid::framing::Buffer& inBuf,
qpid::framing::Buffer& outBuf) = 0;
virtual std::string getKey() const = 0;
+
+ // Encode & Decode the property and statistics values
+ // for this object.
+ virtual void mapEncodeValues(messaging::VariantMap& map,
+ bool includeProperties,
+ bool includeStatistics) = 0;
+ virtual void mapDecodeValues(const messaging::VariantMap& map) = 0;
+ // @TODO KAG: fix this
+ virtual void KAGdoMethod(std::string& methodName,
+ const messaging::VariantMap& inMap,
+ messaging::VariantMap& outMap) = 0;
+
QPID_COMMON_EXTERN virtual void setReference(ObjectId objectId);
virtual std::string& getClassName() const = 0;
@@ -183,7 +207,7 @@ protected:
inline void setFlags(uint32_t f) { flags = f; }
inline uint32_t getFlags() { return flags; }
bool isSameClass(ManagementObject& other) {
- for (int idx = 0; idx < 16; idx++)
+ for (int idx = 0; idx < MD5_LEN; idx++)
if (other.getMd5Sum()[idx] != getMd5Sum()[idx])
return false;
return other.getClassName() == getClassName() &&
@@ -192,7 +216,14 @@ protected:
QPID_COMMON_EXTERN void encode(qpid::framing::Buffer& buf) const { writeProperties(buf); }
QPID_COMMON_EXTERN void decode(qpid::framing::Buffer& buf) { readProperties(buf); }
- QPID_COMMON_EXTERN uint32_t encodedSize() const { return writePropertiesSize(); }
+ QPID_COMMON_EXTERN uint32_t encodedBufSize() const { return writePropertiesBufSize(); }
+
+ // Encode/Decode the entire object as a map
+ QPID_COMMON_EXTERN void mapEncode(messaging::VariantMap& map,
+ bool includeProperties=true,
+ bool includeStatistics=true);
+
+ QPID_COMMON_EXTERN void mapDecode(const messaging::VariantMap& map);
};
typedef std::map<ObjectId, ManagementObject*> ManagementObjectMap;
diff --git a/qpid/cpp/managementgen/qmfgen/management-types.xml b/qpid/cpp/managementgen/qmfgen/management-types.xml
index 6dbabc90ff..e5994ff5b4 100644
--- a/qpid/cpp/managementgen/qmfgen/management-types.xml
+++ b/qpid/cpp/managementgen/qmfgen/management-types.xml
@@ -19,6 +19,10 @@
under the License.
-->
+<!-- "unmap": cast to convert from Variant to native type constructor,
+ "map": cast to convert from native type to Variant constructor parameter
+-->
+
<type name="objId" base="REF" cpp="::qpid::management::ObjectId" encode="#.encode(@)" decode="#.decode(@)" stream="#.getV2Key()" size="16" accessor="direct" init="::qpid::management::ObjectId()" byRef="y"/>
<type name="uint8" base="U8" cpp="uint8_t" encode="@.putOctet(#)" decode="# = @.getOctet()" stream="#" size="1" accessor="direct" init="0"/>
<type name="uint16" base="U16" cpp="uint16_t" encode="@.putShort(#)" decode="# = @.getShort()" stream="#" size="2" accessor="direct" init="0"/>
@@ -29,14 +33,14 @@
<type name="int32" base="S32" cpp="int32_t" encode="@.putInt32(#)" decode="# = @.getInt32()" stream="#" size="4" accessor="direct" init="0"/>
<type name="int64" base="S64" cpp="int64_t" encode="@.putInt64(#)" decode="# = @.getInt64()" stream="#" size="8" accessor="direct" init="0"/>
<type name="bool" base="BOOL" cpp="uint8_t" encode="@.putOctet(#?1:0)" decode="# = @.getOctet()==1" stream="#" size="1" accessor="direct" init="0"/>
-<type name="sstr" base="SSTR" cpp="std::string" encode="@.putShortString(#)" decode="@.getShortString(#)" stream="#" size="(1 + #.length())" accessor="direct" init='""' byRef="y"/>
-<type name="lstr" base="LSTR" cpp="std::string" encode="@.putMediumString(#)" decode="@.getMediumString(#)" stream="#" size="(2 + #.length())" accessor="direct" init='""' byRef="y"/>
+<type name="sstr" base="SSTR" cpp="std::string" encode="@.putShortString(#)" decode="@.getShortString(#)" stream="#" size="(1 + #.length())" accessor="direct" init='""' byRef="y" unmap="(#).getString()"/>
+<type name="lstr" base="LSTR" cpp="std::string" encode="@.putMediumString(#)" decode="@.getMediumString(#)" stream="#" size="(2 + #.length())" accessor="direct" init='""' byRef="y" unmap="(#).getString()"/>
<type name="absTime" base="ABSTIME" cpp="int64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" stream="#" size="8" accessor="direct" init="0"/>
<type name="deltaTime" base="DELTATIME" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" stream="#" size="8" accessor="direct" init="0"/>
<type name="float" base="FLOAT" cpp="float" encode="@.putFloat(#)" decode="# = @.getFloat()" stream="#" size="4" accessor="direct" init="0."/>
<type name="double" base="DOUBLE" cpp="double" encode="@.putDouble(#)" decode="# = @.getDouble()" stream="#" size="8" accessor="direct" init="0."/>
-<type name="uuid" base="UUID" cpp="::qpid::framing::Uuid" encode="#.encode(@)" decode="#.decode(@)" stream="#" size="16" accessor="direct" init="::qpid::framing::Uuid()" byRef="y"/>
-<type name="map" base="FTABLE" cpp="::qpid::framing::FieldTable" encode="#.encode(@)" decode="#.decode(@)" stream="#" size="#.encodedSize()" accessor="direct" init="::qpid::framing::FieldTable()" byRef="y"/>
+<type name="uuid" base="UUID" cpp="::qpid::framing::Uuid" encode="#.encode(@)" decode="#.decode(@)" stream="#" size="16" accessor="direct" init="::qpid::framing::Uuid()" byRef="y" unmap="(#).asUuid().data()" map="::qpid::messaging::Uuid((#).data())" />
+<type name="map" base="FTABLE" cpp="::qpid::framing::FieldTable" encode="#.encode(@)" decode="#.decode(@)" stream="#" size="#.encodedSize()" accessor="direct" init="::qpid::framing::FieldTable()" byRef="y" unmap="::qpid::framing::FieldTable(); assert(false); /*TBD*/" map='(assert(false),"TBD: unsupported type")' />
<type name="hilo8" base="U8" cpp="uint8_t" encode="@.putOctet(#)" decode="# = @.getOctet()" style="wm" stream="#" size="1" accessor="counter" init="0"/>
<type name="hilo16" base="U16" cpp="uint16_t" encode="@.putShort(#)" decode="# = @.getShort()" style="wm" stream="#" size="2" accessor="counter" init="0"/>
diff --git a/qpid/cpp/managementgen/qmfgen/schema.py b/qpid/cpp/managementgen/qmfgen/schema.py
index b3d0f751d2..2f6bde78bc 100755
--- a/qpid/cpp/managementgen/qmfgen/schema.py
+++ b/qpid/cpp/managementgen/qmfgen/schema.py
@@ -19,12 +19,18 @@
from xml.dom.minidom import parse, parseString, Node
from cStringIO import StringIO
-import md5
+#import md5
+try:
+ import hashlib
+ _md5Obj = hashlib.md5
+except ImportError:
+ import md5
+ _md5Obj = md5.new
class Hash:
""" Manage the hash of an XML sub-tree """
def __init__(self, node):
- self.md5Sum = md5.new()
+ self.md5Sum = _md5Obj()
self._compute(node)
def addSubHash(self, hash):
@@ -64,6 +70,8 @@ class SchemaType:
self.init = "0"
self.perThread = False
self.byRef = False
+ self.unmap = "#"
+ self.map = "#"
attrs = node.attributes
for idx in range (attrs.length):
@@ -109,6 +117,12 @@ class SchemaType:
raise ValueError ("Expected 'y' in byRef attribute")
self.byRef = True
+ elif key == 'unmap':
+ self.unmap = val
+
+ elif key == 'map':
+ self.map = val
+
else:
raise ValueError ("Unknown attribute in type '%s'" % key)
@@ -211,6 +225,17 @@ class SchemaType:
def genRead (self, stream, varName, indent=" "):
stream.write(indent + self.decode.replace("@", "buf").replace("#", varName) + ";\n")
+ def genUnmap (self, stream, varName, indent=" ", key=None, mapName="_map",
+ _optional=False):
+ if key is None:
+ key = varName
+ stream.write(indent + "if ((_i = " + mapName + ".find(\"" + key + "\")) != " + mapName + ".end()) {\n")
+ stream.write(indent + " " + varName + " = " +
+ self.unmap.replace("#", "_i->second") + ";\n")
+ if _optional:
+ stream.write(indent + " _found = true;\n")
+ stream.write(indent + "}\n")
+
def genWrite (self, stream, varName, indent=" "):
if self.style != "mma":
stream.write (indent + self.encode.replace ("@", "buf").replace ("#", varName) + ";\n")
@@ -230,6 +255,31 @@ class SchemaType:
.replace ("#", varName + "Count ? " + varName + "Total / " +
varName + "Count : 0") + ";\n")
+ def genMap (self, stream, varName, indent=" ", key=None, mapName="_map"):
+ if key is None:
+ key = varName
+ if self.style != "mma":
+ var_cast = self.map.replace("#", varName)
+ stream.write(indent + mapName + "[\"" + key + "\"] = Variant(" + var_cast + ");\n")
+ if self.style == "wm":
+ var_cast_hi = self.map.replace("#", varName + "High")
+ var_cast_lo = self.map.replace("#", varName + "Low")
+ stream.write(indent + mapName + "[\"" + key + "High\"] = " +
+ "Variant(" + var_cast_hi + ");\n")
+ stream.write(indent + mapName + "[\"" + key + "Low\"] = " +
+ "Variant(" + var_cast_lo + ");\n")
+ if self.style == "mma":
+ var_cast = self.map.replace("#", varName + "Count")
+ stream.write(indent + mapName + "[\"" + key + "Count\"] = " + "Variant(" + var_cast + ");\n")
+ var_cast = self.map.replace("#", varName + "Min")
+ stream.write(indent + mapName + "[\"" + key + "Min\"] = " +
+ "(" + varName + "Count ? Variant(" + var_cast + ") : Variant(0));\n")
+ var_cast = self.map.replace("#", varName + "Max")
+ stream.write(indent + mapName + "[\"" + key + "Max\"] = " + "Variant(" + var_cast + ");\n")
+
+ var_cast = self.map.replace("#", "(" + varName + "Total / " + varName + "Count)")
+ stream.write(indent + mapName + "[\"" + key + "Avg\"] = " +
+ "(" + varName + "Count ? Variant(" + var_cast + ") : Variant(0));\n")
def getReadCode (self, varName, bufName):
result = self.decode.replace ("@", bufName).replace ("#", varName)
@@ -392,6 +442,29 @@ class SchemaProperty:
stream.write (" ft.setString (DESC, \"" + self.desc + "\");\n")
stream.write (" buf.put (ft);\n\n")
+
+ def genMapSchema(self, stream):
+ stream.write (" {\n")
+ stream.write (" ::qpid::messaging::VariantMap _value;\n")
+ stream.write (" _value[TYPE] = TYPE_" + self.type.type.base +";\n")
+ stream.write (" _value[ACCESS] = ACCESS_" + self.access + ";\n")
+ stream.write (" _value[IS_INDEX] = " + str (self.isIndex) + ";\n")
+ stream.write (" _value[IS_OPTIONAL] = " + str (self.isOptional) + ";\n")
+ if self.unit != None:
+ stream.write (" _value[UNIT] = \"" + self.unit + "\";\n")
+ if self.min != None:
+ stream.write (" _value[MIN] = " + self.min + ";\n")
+ if self.max != None:
+ stream.write (" _value[MAX] = " + self.max + ";\n")
+ if self.maxLen != None:
+ stream.write (" _value[MAXLEN] = " + self.maxLen + ";\n")
+ if self.desc != None:
+ stream.write (" _value[DESC] = \"" + self.desc + "\";\n")
+ stream.write (" _props[\"" + self.name + "\"] = _value;\n")
+ stream.write (" }\n\n")
+
+
+
def genSize (self, stream):
indent = " "
if self.isOptional:
@@ -419,6 +492,43 @@ class SchemaProperty:
if self.isOptional:
stream.write(" }\n")
+ def genUnmap (self, stream):
+ indent = " "
+ if self.isOptional:
+ stream.write(" _found = false;\n")
+ self.type.type.genUnmap (stream, self.name, indent, _optional=self.isOptional)
+ if self.isOptional:
+ stream.write(" if (_found) {\n")
+ stream.write(" presenceMask[presenceByte_%s] |= presenceMask_%s;\n" %
+ (self.name, self.name))
+ stream.write(" }\n")
+
+ def genMap (self, stream):
+ indent = " "
+ if self.isOptional:
+ stream.write(" if (presenceMask[presenceByte_%s] & presenceMask_%s) {\n" % (self.name, self.name))
+ indent = " "
+ self.type.type.genMap (stream, self.name, indent)
+ if self.isOptional:
+ stream.write(" }\n")
+
+
+ def __repr__(self):
+ m = {}
+ m["name"] = self.name
+ m["type"] = self.type
+ m["ref"] = self.ref
+ m["access"] = self.access
+ m["isIndex"] = self.isIndex
+ m["isParentRef"] = self.isParentRef
+ m["isGeneralRef"] = self.isGeneralRef
+ m["isOptional"] = self.isOptional
+ m["unit"] = self.unit
+ m["min"] = self.min
+ m["max"] = self.max
+ m["maxLen"] = self.maxLen
+ m["desc"] = self.desc
+ return str(m)
#=====================================================================================
#
@@ -492,6 +602,17 @@ class SchemaStatistic:
stream.write (" ft.setString (DESC, \"" + desc + "\");\n")
stream.write (" buf.put (ft);\n\n")
+ def genMapSchemaText(self, stream, name, desc):
+ stream.write (" {\n")
+ stream.write (" ::qpid::messaging::VariantMap _value;\n")
+ stream.write (" _value[TYPE] = TYPE_" + self.type.type.base +";\n")
+ if self.unit != None:
+ stream.write (" _value[UNIT] = \"" + self.unit + "\";\n")
+ if desc != None:
+ stream.write (" _value[DESC] = \"" + desc + "\";\n")
+ stream.write (" _stats[\"" + self.name + "\"] = _value;\n")
+ stream.write (" }\n\n")
+
def genSchema (self, stream):
if self.type.type.style != "mma":
self.genSchemaText (stream, self.name, self.desc)
@@ -533,6 +654,12 @@ class SchemaStatistic:
else:
self.type.type.genWrite (stream, self.name)
+ def genMap (self, stream):
+ if self.type.type.perThread:
+ self.type.type.genMap(stream, "totals." + self.name)
+ else:
+ self.type.type.genMap(stream, self.name)
+
def genInitialize (self, stream, prefix="", indent=" "):
val = self.type.type.init
if self.type.type.style != "mma":
@@ -648,6 +775,30 @@ class SchemaArg:
stream.write (" ft.setString (DESC, \"" + self.desc + "\");\n")
stream.write (" buf.put (ft);\n\n")
+ def genMapSchema (self, stream, event=False):
+ stream.write (" {\n")
+ stream.write (" ::qpid::messaging::VariantMap _avalue;\n")
+ stream.write (" _avalue[TYPE] = TYPE_" + self.type.type.base +";\n")
+ if (not event):
+ stream.write (" _avalue[DIR] = \"" + self.dir + "\";\n")
+ if self.unit != None:
+ stream.write (" _avalue[UNIT] = \"" + self.unit + "\";\n")
+ if not event:
+ if self.min != None:
+ stream.write (" _avalue[MIN] = " + self.min + ";\n")
+ if self.max != None:
+ stream.write (" _avalue[MAX] = " + self.max + ";\n")
+ if self.maxLen != None:
+ stream.write (" _avalue[MAXLEN] = " + self.maxLen + ";\n")
+ if self.default != None:
+ stream.write (" _avalue[DEFAULT] = \"" + self.default + "\";\n")
+ if self.desc != None:
+ stream.write (" _avalue[DESC] = \"" + self.desc + "\";\n")
+ stream.write (" _args[\"" + self.name + "\"] = _avalue;\n")
+ stream.write (" }\n")
+
+
+
def genFormalParam (self, stream, variables):
stream.write ("%s _%s" % (self.type.type.asArg, self.name))
@@ -727,6 +878,21 @@ class SchemaMethod:
for arg in self.args:
arg.genSchema (stream)
+ def genMapSchema (self, stream, variables):
+ stream.write (" {\n")
+ stream.write (" ::qpid::messaging::VariantMap _value;\n")
+ stream.write (" ::qpid::messaging::VariantMap _args;\n")
+ stream.write (" _value[ARGCOUNT] = " + str(len(self.args)) + ";\n")
+ if self.desc != None:
+ stream.write (" _value[DESC] = \"" + self.desc + "\";\n")
+
+ for arg in self.args:
+ arg.genSchema (stream)
+
+ stream.write (" _value[ARGS] = _args;\n")
+ stream.write (" _methods[\"" + self.name + "\"] = _value;\n")
+ stream.write (" }\n\n")
+
#=====================================================================================
#
#=====================================================================================
@@ -849,6 +1015,12 @@ class SchemaEvent:
for arg in self.args:
stream.write(" " + arg.type.type.encode.replace("@", "buf").replace("#", arg.name) + ";\n")
+ def genArgMap(self, stream, variables):
+ for arg in self.args:
+ arg.type.type.genMap(stream, arg.name, " ", mapName="map")
+ #stream.write(" " + arg.type.type.encode.replace("@", "buf").replace("#", arg.name) + ";\n")
+
+
def genArgSchema(self, stream, variables):
for arg in self.args:
arg.genSchema(stream, True)
@@ -1030,6 +1202,30 @@ class SchemaClass:
else:
stream.write ("string& methodName, Buffer& inBuf, Buffer& outBuf")
+
+ def genDoMapMethodArgs (self, stream, variables):
+ methodCount = 0
+ inArgCount = 0
+ for method in self.methods:
+ methodCount = methodCount + 1
+ for arg in method.args:
+ if arg.getDir () == "I" or arg.getDir () == "IO":
+ inArgCount = inArgCount + 1
+
+ if methodCount == 0:
+ stream.write ("string&," +
+ " const ::qpid::messaging::VariantMap&," +
+ " ::qpid::messaging::VariantMap& outMap")
+ else:
+ if inArgCount == 0:
+ stream.write ("string& methodName," +
+ " const ::qpid::messaging::VariantMap&," +
+ " ::qpid::messaging::VariantMap& outMap")
+ else:
+ stream.write ("string& methodName," +
+ " const ::qpid::messaging::VariantMap& inMap," +
+ " ::qpid::messaging::VariantMap& outMap")
+
def genHiLoStatResets (self, stream, variables):
for inst in self.statistics:
if not inst.type.type.perThread:
@@ -1133,6 +1329,39 @@ class SchemaClass:
arg.name, "outBuf") + ";\n")
stream.write (" return;\n }\n")
+
+
+ def genMapMethodHandlers (self, stream, variables):
+ for method in self.methods:
+ stream.write ("\n if (methodName == \"" + method.getName () + "\") {\n")
+ if method.getArgCount () == 0:
+ stream.write (" ::qpid::management::ArgsNone ioArgs;\n")
+ else:
+ stream.write (" Args" + method.getFullName () + " ioArgs;\n")
+ stream.write (" ::qpid::messaging::VariantMap::const_iterator _i;\n")
+
+ # decode each input argument from the input map
+ for arg in method.args:
+ if arg.getDir () == "I" or arg.getDir () == "IO":
+ arg.type.type.genUnmap(stream,
+ "ioArgs." + arg.dir.lower () + "_" + arg.name,
+ " ",
+ arg.name,
+ "inMap")
+
+ stream.write (" status = coreObject->ManagementMethod (METHOD_" +\
+ method.getName().upper() + ", ioArgs, text);\n")
+ stream.write (" outMap[\"_status_code\"] = (status);\n")
+ stream.write (" outMap[\"_status_text\"] = ::qpid::management::Manageable::StatusText(status, text);\n")
+ for arg in method.args:
+ if arg.getDir () == "O" or arg.getDir () == "IO":
+ arg.type.type.genMap(stream,
+ "ioArgs." + arg.dir.lower () + "_" + arg.name,
+ " ",
+ arg.name,
+ "outMap")
+ stream.write (" return;\n }\n")
+
def genOpenNamespaces (self, stream, variables):
for item in self.packageName.split("."):
stream.write ("namespace %s {\n" % item)
@@ -1240,6 +1469,17 @@ class SchemaClass:
for stat in self.statistics:
stat.genWrite (stream)
+ def genMapEncodeProperties(self, stream, variables):
+ for prop in self.properties:
+ prop.genMap (stream)
+
+ def genMapEncodeStatistics (self, stream, variables):
+ for stat in self.statistics:
+ stat.genMap (stream)
+
+ def genMapDecodeProperties (self, stream, variables):
+ for prop in self.properties:
+ prop.genUnmap (stream)
class SchemaEventArgs:
def __init__(self, package, node, typespec, fragments, options):
diff --git a/qpid/cpp/managementgen/qmfgen/templates/Class.cpp b/qpid/cpp/managementgen/qmfgen/templates/Class.cpp
index e6362758ba..15f493bfb3 100644
--- a/qpid/cpp/managementgen/qmfgen/templates/Class.cpp
+++ b/qpid/cpp/managementgen/qmfgen/templates/Class.cpp
@@ -30,6 +30,7 @@
using namespace qmf::/*MGEN:Class.Namespace*/;
using namespace qpid::framing;
+using namespace qpid::messaging;
using qpid::management::ManagementAgent;
using qpid::management::Manageable;
using qpid::management::ManagementObject;
@@ -38,7 +39,7 @@ using std::string;
string /*MGEN:Class.NameCap*/::packageName = string ("/*MGEN:Class.NamePackageLower*/");
string /*MGEN:Class.NameCap*/::className = string ("/*MGEN:Class.NameLower*/");
-uint8_t /*MGEN:Class.NameCap*/::md5Sum[16] =
+uint8_t /*MGEN:Class.NameCap*/::md5Sum[MD5_LEN] =
{/*MGEN:Class.SchemaMD5*/};
/*MGEN:Class.NameCap*/::/*MGEN:Class.NameCap*/ (ManagementAgent*, Manageable* _core/*MGEN:Class.ParentArg*//*MGEN:Class.ConstructorArgs*/) :
@@ -105,14 +106,16 @@ void /*MGEN:Class.NameCap*/::writeSchema (Buffer& buf)
// Properties
/*MGEN:Class.PropertySchema*/
+
// Statistics
/*MGEN:Class.StatisticSchema*/
+
// Methods
/*MGEN:Class.MethodSchema*/
}
/*MGEN:IF(Class.ExistPerThreadStats)*/
-void /*MGEN:Class.NameCap*/::aggregatePerThreadStats(struct PerThreadStats* totals)
+void /*MGEN:Class.NameCap*/::aggregatePerThreadStats(struct PerThreadStats* totals) const
{
/*MGEN:Class.InitializeTotalPerThreadStats*/
for (int idx = 0; idx < maxThreads; idx++) {
@@ -124,9 +127,9 @@ void /*MGEN:Class.NameCap*/::aggregatePerThreadStats(struct PerThreadStats* tota
}
/*MGEN:ENDIF*/
-uint32_t /*MGEN:Class.NameCap*/::writePropertiesSize() const
+uint32_t /*MGEN:Class.NameCap*/::writePropertiesBufSize() const
{
- uint32_t size = writeTimestampsSize();
+ uint32_t size = writeTimestampsBufSize();
/*MGEN:IF(Class.ExistOptionals)*/
size += /*MGEN:Class.PresenceMaskBytes*/;
/*MGEN:ENDIF*/
@@ -209,3 +212,67 @@ std::string /*MGEN:Class.NameCap*/::getKey() const
return key.str();
}
+
+
+void /*MGEN:Class.NameCap*/::mapEncodeValues (::qpid::messaging::VariantMap& _map,
+ bool includeProperties,
+ bool includeStatistics)
+{
+ using namespace ::qpid::messaging;
+ ::qpid::sys::Mutex::ScopedLock mutex(accessLock);
+
+ if (includeProperties) {
+ configChanged = false;
+/*MGEN:Class.MapEncodeProperties*/
+ }
+
+ if (includeStatistics) {
+ instChanged = false;
+/*MGEN:IF(Class.ExistPerThreadAssign)*/
+ for (int idx = 0; idx < maxThreads; idx++) {
+ struct PerThreadStats* threadStats = perThreadStatsArray[idx];
+ if (threadStats != 0) {
+/*MGEN:Class.PerThreadAssign*/
+ }
+ }
+/*MGEN:ENDIF*/
+/*MGEN:IF(Class.ExistPerThreadStats)*/
+ struct PerThreadStats totals;
+ aggregatePerThreadStats(&totals);
+/*MGEN:ENDIF*/
+/*MGEN:Class.Assign*/
+
+/*MGEN:Class.MapEncodeStatistics*/
+
+ // Maintenance of hi-lo statistics
+/*MGEN:Class.HiLoStatResets*/
+/*MGEN:IF(Class.ExistPerThreadResets)*/
+ for (int idx = 0; idx < maxThreads; idx++) {
+ struct PerThreadStats* threadStats = perThreadStatsArray[idx];
+ if (threadStats != 0) {
+/*MGEN:Class.PerThreadHiLoStatResets*/
+ }
+ }
+/*MGEN:ENDIF*/
+ }
+}
+
+void /*MGEN:Class.NameCap*/::mapDecodeValues (const ::qpid::messaging::VariantMap& _map)
+{
+ ::qpid::messaging::VariantMap::const_iterator _i;
+ ::qpid::sys::Mutex::ScopedLock mutex(accessLock);
+/*MGEN:IF(Class.ExistOptionals)*/
+ bool _found;
+/*MGEN:ENDIF*/
+/*MGEN:Class.MapDecodeProperties*/
+}
+
+void /*MGEN:Class.NameCap*/::KAGdoMethod (/*MGEN:Class.DoMapMethodArgs*/)
+{
+ Manageable::status_t status = Manageable::STATUS_UNKNOWN_METHOD;
+ std::string text;
+
+/*MGEN:Class.MapMethodHandlers*/
+ outMap["_status_code"] = status;
+ outMap["_status_text"] = Manageable::StatusText(status, text);
+}
diff --git a/qpid/cpp/managementgen/qmfgen/templates/Class.h b/qpid/cpp/managementgen/qmfgen/templates/Class.h
index 8efacd650f..61dc395013 100644
--- a/qpid/cpp/managementgen/qmfgen/templates/Class.h
+++ b/qpid/cpp/managementgen/qmfgen/templates/Class.h
@@ -26,6 +26,8 @@
#include "qpid/management/ManagementObject.h"
#include "qpid/framing/FieldTable.h"
#include "qpid/framing/Uuid.h"
+#include "qpid/messaging/MapContent.h"
+#include "qpid/messaging/MapView.h"
namespace qpid {
namespace management {
@@ -42,7 +44,7 @@ class /*MGEN:Class.NameCap*/ : public ::qpid::management::ManagementObject
static std::string packageName;
static std::string className;
- static uint8_t md5Sum[16];
+ static uint8_t md5Sum[MD5_LEN];
/*MGEN:IF(Class.ExistOptionals)*/
uint8_t presenceMask[/*MGEN:Class.PresenceMaskBytes*/];
/*MGEN:Class.PresenceMaskConstants*/
@@ -71,17 +73,24 @@ class /*MGEN:Class.NameCap*/ : public ::qpid::management::ManagementObject
return threadStats;
}
- void aggregatePerThreadStats(struct PerThreadStats*);
+ void aggregatePerThreadStats(struct PerThreadStats*) const;
/*MGEN:ENDIF*/
public:
static void writeSchema(::qpid::framing::Buffer& buf);
- uint32_t writePropertiesSize() const;
+ uint32_t writePropertiesBufSize() const;
void readProperties(::qpid::framing::Buffer& buf);
void writeProperties(::qpid::framing::Buffer& buf) const;
void writeStatistics(::qpid::framing::Buffer& buf, bool skipHeaders = false);
void doMethod(std::string& methodName,
::qpid::framing::Buffer& inBuf,
::qpid::framing::Buffer& outBuf);
+ void mapEncodeValues(::qpid::messaging::VariantMap& map,
+ bool includeProperties=true,
+ bool includeStatistics=true);
+ void mapDecodeValues(const ::qpid::messaging::VariantMap& map);
+ void KAGdoMethod(std::string& methodName,
+ const ::qpid::messaging::VariantMap& inMap,
+ ::qpid::messaging::VariantMap& outMap);
std::string getKey() const;
writeSchemaCall_t getWriteSchemaCall() { return writeSchema; }
/*MGEN:IF(Class.NoStatistics)*/
diff --git a/qpid/cpp/managementgen/qmfgen/templates/Event.cpp b/qpid/cpp/managementgen/qmfgen/templates/Event.cpp
index a4fc28990d..0db0421f75 100644
--- a/qpid/cpp/managementgen/qmfgen/templates/Event.cpp
+++ b/qpid/cpp/managementgen/qmfgen/templates/Event.cpp
@@ -76,3 +76,9 @@ void Event/*MGEN:Event.NameCap*/::encode(::qpid::framing::Buffer& buf) const
{
/*MGEN:Event.ArgEncodes*/
}
+
+void Event/*MGEN:Event.NameCap*/::mapEncode(::qpid::messaging::MapContent& map) const
+{
+ using namespace ::qpid::messaging;
+/*MGEN:Event.ArgMap*/
+}
diff --git a/qpid/cpp/managementgen/qmfgen/templates/Event.h b/qpid/cpp/managementgen/qmfgen/templates/Event.h
index b5c2a211d1..20d51a9f82 100644
--- a/qpid/cpp/managementgen/qmfgen/templates/Event.h
+++ b/qpid/cpp/managementgen/qmfgen/templates/Event.h
@@ -26,6 +26,8 @@
#include "qpid/management/ManagementEvent.h"
#include "qpid/framing/FieldTable.h"
#include "qpid/framing/Uuid.h"
+#include "qpid/messaging/MapContent.h"
+#include "qpid/messaging/MapView.h"
namespace qmf {
/*MGEN:Event.OpenNamespaces*/
@@ -52,6 +54,7 @@ class Event/*MGEN:Event.NameCap*/ : public ::qpid::management::ManagementEvent
uint8_t* getMd5Sum() const { return md5Sum; }
uint8_t getSeverity() const { return /*MGEN:Event.Severity*/; }
void encode(::qpid::framing::Buffer& buffer) const;
+ void mapEncode(::qpid::messaging::MapContent& map) const;
};
}/*MGEN:Event.CloseNamespaces*/
diff --git a/qpid/cpp/src/Makefile.am b/qpid/cpp/src/Makefile.am
index ba1ffabf5f..3a3f23056a 100644
--- a/qpid/cpp/src/Makefile.am
+++ b/qpid/cpp/src/Makefile.am
@@ -129,7 +129,9 @@ libqpidclient_la_CXXFLAGS = $(AM_CXXFLAGS) -DQPIDC_MODULE_DIR=\"$(cmoduledir)\"
qpidd_LDADD = \
libqpidbroker.la \
- libqpidcommon.la
+ libqpidcommon.la \
+ libqpidclient.la
+
posix_qpidd_src = posix/QpiddBroker.cpp
@@ -255,12 +257,12 @@ cmodule_LTLIBRARIES += \
noinst_PROGRAMS = RdmaServer RdmaClient
RdmaServer_SOURCES = qpid/sys/rdma/RdmaServer.cpp
RdmaServer_LDADD = \
- librdmawrap.la libqpidcommon.la
+ librdmawrap.la libqpidcommon.la libqpidclient.la
RdmaClient_SOURCES = qpid/sys/rdma/RdmaClient.cpp
RdmaClient_CXXFLAGS = \
$(AM_CXXFLAGS) -Wno-missing-field-initializers
RdmaClient_LDADD = \
- librdmawrap.la libqpidcommon.la
+ librdmawrap.la libqpidcommon.la libqpidclient.la
endif
diff --git a/qpid/cpp/src/qpid/management/ManagementAgent.cpp b/qpid/cpp/src/qpid/management/ManagementAgent.cpp
index 6263651a98..9595807e7d 100644
--- a/qpid/cpp/src/qpid/management/ManagementAgent.cpp
+++ b/qpid/cpp/src/qpid/management/ManagementAgent.cpp
@@ -1473,8 +1473,8 @@ void ManagementAgent::RemoteAgent::decode(qpid::framing::Buffer& inBuf) {
uint32_t ManagementAgent::RemoteAgent::encodedSize() const {
return sizeof(uint32_t) + sizeof(uint32_t) // 2 x Long
+ routingKey.size() + sizeof(uint8_t) // ShortString
- + connectionRef.encodedSize()
- + mgmtObject->writePropertiesSize();
+ + connectionRef.encodedBufSize()
+ + mgmtObject->writePropertiesBufSize();
}
void ManagementAgent::exportAgents(std::string& out) {
@@ -1485,7 +1485,7 @@ void ManagementAgent::exportAgents(std::string& out) {
{
ObjectId id = i->first;
RemoteAgent* agent = i->second;
- size_t encodedSize = id.encodedSize() + agent->encodedSize();
+ size_t encodedSize = id.encodedBufSize() + agent->encodedSize();
size_t end = out.size();
out.resize(end + encodedSize);
framing::Buffer outBuf(&out[end], encodedSize);
@@ -1497,7 +1497,7 @@ void ManagementAgent::exportAgents(std::string& out) {
void ManagementAgent::importAgents(qpid::framing::Buffer& inBuf) {
while (inBuf.available()) {
ObjectId id;
- inBuf.checkAvailable(id.encodedSize());
+ inBuf.checkAvailable(id.encodedBufSize());
id.decode(inBuf);
std::auto_ptr<RemoteAgent> agent(new RemoteAgent(*this));
agent->decode(inBuf);
diff --git a/qpid/cpp/src/qpid/management/ManagementObject.cpp b/qpid/cpp/src/qpid/management/ManagementObject.cpp
index 4b87800174..a72767ea93 100644
--- a/qpid/cpp/src/qpid/management/ManagementObject.cpp
+++ b/qpid/cpp/src/qpid/management/ManagementObject.cpp
@@ -145,6 +145,39 @@ void ObjectId::setV2Key(const ManagementObject& object)
v2Key = oname.str();
}
+void ObjectId::mapEncode(messaging::VariantMap& map) const
+{
+ if (agent == 0)
+ map["_first"] = first;
+ else
+ map["_first"] = (first | agent->first);
+ map["_second"] = second;
+ map["_object_id"] = v2Key;
+}
+
+void ObjectId::mapDecode(const messaging::VariantMap& map)
+{
+ messaging::MapView::const_iterator i;
+
+ 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())
+ v2Key = i->second.asString();
+}
+
+
+ObjectId::operator messaging::VariantMap() const
+{
+ messaging::VariantMap m;
+ mapEncode(m);
+ return m;
+}
+
+
namespace qpid {
namespace management {
@@ -194,7 +227,7 @@ void ManagementObject::readTimestamps (framing::Buffer& buf)
unusedObjectId.decode(buf);
}
-uint32_t ManagementObject::writeTimestampsSize() const
+uint32_t ManagementObject::writeTimestampsBufSize() const
{
return 1 + getPackageName().length() + // str8
1 + getClassName().length() + // str8
@@ -202,9 +235,40 @@ uint32_t ManagementObject::writeTimestampsSize() const
8 + // uint64
8 + // uint64
8 + // uint64
- objectId.encodedSize(); // objectId
+ objectId.encodedBufSize(); // objectId
}
+
+void ManagementObject::writeTimestamps (messaging::VariantMap& map) const
+{
+ messaging::VariantMap oid, sid;
+
+ sid["_package_name"] = getPackageName();
+ sid["_class_name"] = getClassName();
+ sid["_hash_str"] = std::string((const char *)getMd5Sum(), MD5_LEN);
+ map["_schema_id"] = sid;
+
+ objectId.mapEncode(oid);
+ map["_object_id"] = oid;
+
+ map["_update_ts"] = updateTime;
+ map["_create_ts"] = createTime;
+ map["_delete_ts"] = destroyTime;
+}
+
+void ManagementObject::readTimestamps (const ::qpid::messaging::VariantMap& map)
+{
+ messaging::MapView::const_iterator i;
+
+ if ((i = map.find("_update_ts")) != map.end())
+ updateTime = i->second.asUint64();
+ if ((i = map.find("_create_ts")) != map.end())
+ createTime = i->second.asUint64();
+ if ((i = map.find("_delete_ts")) != map.end())
+ destroyTime = i->second.asUint64();
+}
+
+
void ManagementObject::setReference(ObjectId) {}
int ManagementObject::getThreadIndex() {
@@ -217,3 +281,26 @@ int ManagementObject::getThreadIndex() {
}
return thisIndex;
}
+
+
+void ManagementObject::mapEncode(::qpid::messaging::VariantMap& map,
+ bool includeProperties,
+ bool includeStatistics)
+{
+ messaging::VariantMap values;
+
+ writeTimestamps(map);
+
+ mapEncodeValues(values, includeProperties, includeStatistics);
+ map["_values"] = values;
+}
+
+void ManagementObject::mapDecode(const ::qpid::messaging::VariantMap& map)
+{
+ ::qpid::messaging::MapView::const_iterator i;
+
+ readTimestamps(map);
+
+ if ((i = map.find("_values")) != map.end())
+ mapDecodeValues(i->second.asMap());
+}
diff --git a/qpid/cpp/src/tests/Makefile.am b/qpid/cpp/src/tests/Makefile.am
index 64853345ba..1dc6c9a0e2 100644
--- a/qpid/cpp/src/tests/Makefile.am
+++ b/qpid/cpp/src/tests/Makefile.am
@@ -269,15 +269,15 @@ txjob_LDADD=$(lib_client)
check_PROGRAMS+=PollerTest
PollerTest_SOURCES=PollerTest.cpp
-PollerTest_LDADD=$(lib_common) $(SOCKLIBS)
+PollerTest_LDADD=$(lib_common) $(lib_client) $(SOCKLIBS)
check_PROGRAMS+=DispatcherTest
DispatcherTest_SOURCES=DispatcherTest.cpp
-DispatcherTest_LDADD=$(lib_common) $(SOCKLIBS)
+DispatcherTest_LDADD=$(lib_common) $(lib_client) $(SOCKLIBS)
check_PROGRAMS+=datagen
datagen_SOURCES=datagen.cpp
-datagen_LDADD=$(lib_common)
+datagen_LDADD=$(lib_common) $(lib_client)
check_PROGRAMS+=qrsh_server
qrsh_server_SOURCES=qrsh_server.cpp