summaryrefslogtreecommitdiff
path: root/qpid/cpp/managementgen/qmfgen/schema.py
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/cpp/managementgen/qmfgen/schema.py')
-rwxr-xr-xqpid/cpp/managementgen/qmfgen/schema.py244
1 files changed, 242 insertions, 2 deletions
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):