diff options
author | Kenneth Anthony Giusti <kgiusti@apache.org> | 2010-03-15 15:55:17 +0000 |
---|---|---|
committer | Kenneth Anthony Giusti <kgiusti@apache.org> | 2010-03-15 15:55:17 +0000 |
commit | f540a63aae900898bfb08399e43b13cde6dfec91 (patch) | |
tree | c830729486803025e5752ed542b82ee4c76903e9 | |
parent | da36f4e7d2afa1f1005f10fe6dea9e79c0233b5b (diff) | |
download | qpid-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.h | 14 | ||||
-rw-r--r-- | qpid/cpp/include/qpid/management/ManagementEvent.h | 3 | ||||
-rw-r--r-- | qpid/cpp/include/qpid/management/ManagementObject.h | 43 | ||||
-rw-r--r-- | qpid/cpp/managementgen/qmfgen/management-types.xml | 12 | ||||
-rwxr-xr-x | qpid/cpp/managementgen/qmfgen/schema.py | 244 | ||||
-rw-r--r-- | qpid/cpp/managementgen/qmfgen/templates/Class.cpp | 75 | ||||
-rw-r--r-- | qpid/cpp/managementgen/qmfgen/templates/Class.h | 15 | ||||
-rw-r--r-- | qpid/cpp/managementgen/qmfgen/templates/Event.cpp | 6 | ||||
-rw-r--r-- | qpid/cpp/managementgen/qmfgen/templates/Event.h | 3 | ||||
-rw-r--r-- | qpid/cpp/src/Makefile.am | 8 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/management/ManagementAgent.cpp | 8 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/management/ManagementObject.cpp | 91 | ||||
-rw-r--r-- | qpid/cpp/src/tests/Makefile.am | 6 |
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 |