summaryrefslogtreecommitdiff
path: root/qpid/cpp/managementgen/schema.py
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2008-09-05 14:11:23 +0000
committerTed Ross <tross@apache.org>2008-09-05 14:11:23 +0000
commit67cb9d3c75bada36fae0086a04b6b1e9fc92459f (patch)
treecb2a0abae60bcaea0d1a3eac785ef8f6331fd238 /qpid/cpp/managementgen/schema.py
parentab50ded1719791a6958442d3a7f9542488860911 (diff)
downloadqpid-python-67cb9d3c75bada36fae0086a04b6b1e9fc92459f.tar.gz
QPID-1274 - Improved packaging for management agent and code generation tool
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@692450 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/managementgen/schema.py')
-rwxr-xr-xqpid/cpp/managementgen/schema.py1208
1 files changed, 0 insertions, 1208 deletions
diff --git a/qpid/cpp/managementgen/schema.py b/qpid/cpp/managementgen/schema.py
deleted file mode 100755
index e666bdbb39..0000000000
--- a/qpid/cpp/managementgen/schema.py
+++ /dev/null
@@ -1,1208 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http:#www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-from xml.dom.minidom import parse, parseString, Node
-from cStringIO import StringIO
-import md5
-
-#=====================================================================================
-#
-#=====================================================================================
-class SchemaType:
- def __init__ (self, node):
- self.name = None
- self.base = None
- self.cpp = None
- self.encode = None
- self.decode = None
- self.style = "normal"
- self.accessor = None
- self.init = "0"
- self.perThread = False
-
- attrs = node.attributes
- for idx in range (attrs.length):
- key = attrs.item(idx).nodeName
- val = attrs.item(idx).nodeValue
- if key == 'name':
- self.name = val
-
- elif key == 'base':
- self.base = val
-
- elif key == 'cpp':
- self.cpp = val
-
- elif key == 'encode':
- self.encode = val
-
- elif key == 'decode':
- self.decode = val
-
- elif key == 'style':
- self.style = val
-
- elif key == 'accessor':
- self.accessor = val
-
- elif key == 'init':
- self.init = val
-
- elif key == 'perThread':
- if val != 'y':
- raise ValueError ("Expected 'y' in perThread attribute")
- self.perThread = True
-
- else:
- raise ValueError ("Unknown attribute in type '%s'" % key)
-
- if self.name == None or self.base == None or self.cpp == None or \
- self.encode == None or self.decode == None:
- raise ValueError ("Missing required attribute(s) in type")
-
- def getName (self):
- return self.name
-
- def genAccessor (self, stream, varName, changeFlag = None, optional = False):
- if self.perThread:
- prefix = "getThreadStats()->"
- if self.style == "wm":
- raise ValueError ("'wm' style types can't be per-thread")
- else:
- prefix = ""
- if self.accessor == "direct":
- stream.write (" inline void set_" + varName + " (" + self.cpp + " val) {\n");
- if not self.perThread:
- stream.write (" sys::Mutex::ScopedLock mutex(accessLock);\n")
- if self.style != "mma":
- stream.write (" " + prefix + varName + " = val;\n")
- if optional:
- stream.write (" presenceMask[presenceByte_%s] |= presenceMask_%s;\n" % (varName, varName))
- if self.style == "wm":
- stream.write (" if (" + varName + "Low > val)\n")
- stream.write (" " + varName + "Low = val;\n")
- stream.write (" if (" + varName + "High < val)\n")
- stream.write (" " + varName + "High = val;\n")
- if self.style == "mma":
- stream.write (" " + prefix + varName + "Count++;\n")
- stream.write (" " + prefix + varName + "Total += val;\n")
- stream.write (" if (" + prefix + varName + "Min > val)\n")
- stream.write (" " + prefix + varName + "Min = val;\n")
- stream.write (" if (" + prefix + varName + "Max < val)\n")
- stream.write (" " + prefix + varName + "Max = val;\n")
- if changeFlag != None:
- stream.write (" " + changeFlag + " = true;\n")
- stream.write (" }\n")
- if self.style != "mma":
- stream.write (" inline " + self.cpp + "& get_" + varName + "() {\n");
- if not self.perThread:
- stream.write (" sys::Mutex::ScopedLock mutex(accessLock);\n")
- stream.write (" return " + prefix + varName + ";\n")
- stream.write (" }\n")
- if optional:
- stream.write (" inline void clr_" + varName + "() {\n")
- stream.write (" presenceMask[presenceByte_%s] &= ~presenceMask_%s;\n" % (varName, varName))
- if changeFlag != None:
- stream.write (" " + changeFlag + " = true;\n")
- stream.write (" }\n")
- stream.write (" inline bool isSet_" + varName + "() {\n")
- stream.write (" return (presenceMask[presenceByte_%s] & presenceMask_%s) != 0;\n" % (varName, varName))
- stream.write (" }\n")
- elif self.accessor == "counter":
- stream.write (" inline void inc_" + varName + " (" + self.cpp + " by = 1) {\n");
- if not self.perThread:
- stream.write (" sys::Mutex::ScopedLock mutex(accessLock);\n")
- stream.write (" " + prefix + varName + " += by;\n")
- if self.style == "wm":
- stream.write (" if (" + varName + "High < " + varName + ")\n")
- stream.write (" " + varName + "High = " + varName + ";\n")
- if changeFlag != None:
- stream.write (" " + changeFlag + " = true;\n")
- stream.write (" }\n");
- stream.write (" inline void dec_" + varName + " (" + self.cpp + " by = 1) {\n");
- if not self.perThread:
- stream.write (" sys::Mutex::ScopedLock mutex(accessLock);\n")
- stream.write (" " + prefix + varName + " -= by;\n")
- if self.style == "wm":
- stream.write (" if (" + varName + "Low > " + varName + ")\n")
- stream.write (" " + varName + "Low = " + varName + ";\n")
- if changeFlag != None:
- stream.write (" " + changeFlag + " = true;\n")
- stream.write (" }\n");
-
- def genHiLoStatResets (self, stream, varName):
- if self.style == "wm":
- stream.write (" " + varName + "High = " + varName + ";\n")
- stream.write (" " + varName + "Low = " + varName + ";\n")
- if self.style == "mma":
- stream.write (" " + varName + "Count = 0;\n")
- stream.write (" " + varName + "Total = 0;\n")
- stream.write (" " + varName + "Min = std::numeric_limits<" + self.type.type.cpp + ">::max();\n")
- stream.write (" " + varName + "Max = std::numeric_limits<" + self.type.type.cpp + ">::min();\n")
-
- def genPerThreadHiLoStatResets (self, stream, varName, cpptype):
- if self.style == "mma":
- stream.write (" threadStats->" + varName + "Count = 0;\n")
- stream.write (" threadStats->" + varName + "Total = 0;\n")
- stream.write (" threadStats->" + varName + "Min = std::numeric_limits<" + cpptype + ">::max();\n")
- stream.write (" threadStats->" + varName + "Max = std::numeric_limits<" + cpptype + ">::min();\n")
-
- def genWrite (self, stream, varName, indent=" "):
- if self.style != "mma":
- stream.write (indent + self.encode.replace ("@", "buf").replace ("#", varName) + ";\n")
- if self.style == "wm":
- stream.write (indent + self.encode.replace ("@", "buf") \
- .replace ("#", varName + "High") + ";\n")
- stream.write (indent + self.encode.replace ("@", "buf") \
- .replace ("#", varName + "Low") + ";\n")
- if self.style == "mma":
- stream.write (indent + self.encode.replace ("@", "buf") \
- .replace ("#", varName + "Count") + ";\n")
- stream.write (indent + self.encode.replace ("@", "buf") \
- .replace ("#", varName + "Count ? " + varName + "Min : 0") + ";\n")
- stream.write (indent + self.encode.replace ("@", "buf") \
- .replace ("#", varName + "Max") + ";\n")
- stream.write (indent + self.encode.replace ("@", "buf") \
- .replace ("#", varName + "Count ? " + varName + "Total / " +
- varName + "Count : 0") + ";\n")
-
-
- def getReadCode (self, varName, bufName):
- result = self.decode.replace ("@", bufName).replace ("#", varName)
- return result
-
- def getWriteCode (self, varName, bufName):
- result = self.encode.replace ("@", bufName).replace ("#", varName)
- return result
-
-#=====================================================================================
-#
-#=====================================================================================
-class TypeSpec:
- def __init__ (self, file):
- self.types = {}
- dom = parse (file)
- document = dom.documentElement
- if document.tagName != 'schema-types':
- raise ValueError ("Expected 'schema-types' in type file")
-
- for child in document.childNodes:
- if child.nodeType == Node.ELEMENT_NODE:
- if child.nodeName == 'type':
- stype = SchemaType (child)
- self.types[stype.getName ()] = stype
- else:
- raise ValueError ("Unknown type tag '%s'" % child.nodeName)
-
- def getType (self, name):
- return self.types[name]
-
-
-#=====================================================================================
-#
-#=====================================================================================
-class Type:
- def __init__ (self, name, typespec):
- self.type = typespec.getType (name)
-
-#=====================================================================================
-#
-#=====================================================================================
-class SchemaProperty:
- def __init__ (self, node, typespec):
- self.name = None
- self.type = None
- self.ref = None
- self.access = "RO"
- self.isIndex = 0
- self.isParentRef = 0
- self.isGeneralRef = 0
- self.isOptional = 0
- self.unit = None
- self.min = None
- self.max = None
- self.maxLen = None
- self.desc = None
-
- attrs = node.attributes
- for idx in range (attrs.length):
- key = attrs.item(idx).nodeName
- val = attrs.item(idx).nodeValue
- if key == 'name':
- self.name = makeValidCppSymbol(val)
-
- elif key == 'type':
- self.type = Type (val, typespec)
- if self.type.type.accessor != 'direct':
- raise ValueError ("Class properties must have a type with a direct accessor")
-
- elif key == 'references':
- self.ref = val
-
- elif key == 'access':
- self.access = val
-
- elif key == 'index':
- if val != 'y':
- raise ValueError ("Expected 'y' in index attribute")
- self.isIndex = 1
-
- elif key == 'parentRef':
- if val != 'y':
- raise ValueError ("Expected 'y' in parentRef attribute")
- self.isParentRef = 1
-
- elif key == 'isGeneralReference':
- if val != 'y':
- raise ValueError ("Expected 'y' in isGeneralReference attribute")
- self.isGeneralRef = 1
-
- elif key == 'optional':
- if val != 'y':
- raise ValueError ("Expected 'y' in optional attribute")
- self.isOptional = 1
-
- elif key == 'unit':
- self.unit = val
-
- elif key == 'min':
- self.min = val
-
- elif key == 'max':
- self.max = val
-
- elif key == 'maxlen':
- self.maxLen = val
-
- elif key == 'desc':
- self.desc = val
-
- else:
- raise ValueError ("Unknown attribute in property '%s'" % key)
-
- if self.access == "RC" and self.isOptional == 1:
- raise ValueError ("Properties with ReadCreate access must not be optional (%s)" % self.name)
-
- if self.name == None:
- raise ValueError ("Missing 'name' attribute in property")
- if self.type == None:
- raise ValueError ("Missing 'type' attribute in property")
-
- def getName (self):
- return self.name
-
- def isConstructorArg (self):
- if self.access == "RC" and self.isParentRef == 0:
- return 1
- return 0
-
- def genDeclaration (self, stream, prefix=" "):
- stream.write (prefix + self.type.type.cpp + " " + self.name + ";\n")
-
- def genFormalParam (self, stream, variables):
- stream.write (self.type.type.cpp + " _" + self.name)
-
- def genAccessor (self, stream):
- self.type.type.genAccessor (stream, self.name, "configChanged", self.isOptional == 1)
-
- def genSchema (self, stream):
- stream.write (" ft = FieldTable ();\n")
- stream.write (" ft.setString (NAME, \"" + self.name + "\");\n")
- stream.write (" ft.setInt (TYPE, TYPE_" + self.type.type.base +");\n")
- stream.write (" ft.setInt (ACCESS, ACCESS_" + self.access + ");\n")
- stream.write (" ft.setInt (INDEX, " + str (self.isIndex) + ");\n")
- stream.write (" ft.setInt (OPTIONAL, " + str (self.isOptional) + ");\n")
- if self.unit != None:
- stream.write (" ft.setString (UNIT, \"" + self.unit + "\");\n")
- if self.min != None:
- stream.write (" ft.setInt (MIN, " + self.min + ");\n")
- if self.max != None:
- stream.write (" ft.setInt (MAX, " + self.max + ");\n")
- if self.maxLen != None:
- stream.write (" ft.setInt (MAXLEN, " + self.maxLen + ");\n")
- if self.desc != None:
- stream.write (" ft.setString (DESC, \"" + self.desc + "\");\n")
- stream.write (" buf.put (ft);\n\n")
-
- def genWrite (self, stream):
- indent = " "
- if self.isOptional:
- stream.write(" if (presenceMask[presenceByte_%s] & presenceMask_%s) {\n" % (self.name, self.name))
- indent = " "
- self.type.type.genWrite (stream, self.name, indent)
- if self.isOptional:
- stream.write(" }\n")
-
-
-#=====================================================================================
-#
-#=====================================================================================
-class SchemaStatistic:
- def __init__ (self, node, typespec):
- self.name = None
- self.type = None
- self.unit = None
- self.desc = None
- self.assign = None
-
- attrs = node.attributes
- for idx in range (attrs.length):
- key = attrs.item(idx).nodeName
- val = attrs.item(idx).nodeValue
- if key == 'name':
- self.name = makeValidCppSymbol(val)
-
- elif key == 'type':
- self.type = Type (val, typespec)
-
- elif key == 'unit':
- self.unit = val
-
- elif key == 'desc':
- self.desc = val
-
- elif key == 'assign':
- self.assign = val
-
- else:
- raise ValueError ("Unknown attribute in statistic '%s'" % key)
-
- if self.name == None:
- raise ValueError ("Missing 'name' attribute in statistic")
- if self.type == None:
- raise ValueError ("Missing 'type' attribute in statistic")
-
- def getName (self):
- return self.name
-
- def genDeclaration (self, stream, prefix=" "):
- if self.type.type.style != "mma":
- stream.write (prefix + self.type.type.cpp + " " + self.name + ";\n")
- if self.type.type.style == 'wm':
- stream.write (prefix + self.type.type.cpp + " " + self.name + "High;\n")
- stream.write (prefix + self.type.type.cpp + " " + self.name + "Low;\n")
- if self.type.type.style == "mma":
- stream.write (prefix + self.type.type.cpp + " " + self.name + "Count;\n")
- stream.write (prefix + "uint64_t " + self.name + "Total;\n")
- stream.write (prefix + self.type.type.cpp + " " + self.name + "Min;\n")
- stream.write (prefix + self.type.type.cpp + " " + self.name + "Max;\n")
-
- def genAccessor (self, stream):
- self.type.type.genAccessor (stream, self.name, "instChanged")
-
- def genHiLoStatResets (self, stream):
- self.type.type.genHiLoStatResets (stream, self.name)
-
- def genPerThreadHiLoStatResets (self, stream):
- self.type.type.genPerThreadHiLoStatResets (stream, self.name, self.type.type.cpp)
-
- def genSchemaText (self, stream, name, desc):
- stream.write (" ft = FieldTable ();\n")
- stream.write (" ft.setString (NAME, \"" + name + "\");\n")
- stream.write (" ft.setInt (TYPE, TYPE_" + self.type.type.base +");\n")
- if self.unit != None:
- stream.write (" ft.setString (UNIT, \"" + self.unit + "\");\n")
- if desc != None:
- stream.write (" ft.setString (DESC, \"" + desc + "\");\n")
- stream.write (" buf.put (ft);\n\n")
-
- def genSchema (self, stream):
- if self.type.type.style != "mma":
- self.genSchemaText (stream, self.name, self.desc)
- if self.type.type.style == "wm":
- descHigh = self.desc
- descLow = self.desc
- if self.desc != None:
- descHigh = descHigh + " (High)"
- descLow = descLow + " (Low)"
- self.genSchemaText (stream, self.name + "High", descHigh)
- self.genSchemaText (stream, self.name + "Low", descLow)
- if self.type.type.style == "mma":
- descCount = self.desc
- descMin = self.desc
- descMax = self.desc
- descAverage = self.desc
- if self.desc != None:
- descCount = descCount + " (Samples)"
- descMin = descMin + " (Min)"
- descMax = descMax + " (Max)"
- descAverage = descAverage + " (Average)"
- self.genSchemaText (stream, self.name + "Samples", descCount)
- self.genSchemaText (stream, self.name + "Min", descMin)
- self.genSchemaText (stream, self.name + "Max", descMax)
- self.genSchemaText (stream, self.name + "Average", descAverage)
-
- def genAssign (self, stream):
- if self.assign != None:
- if self.type.type.perThread:
- prefix = " threadStats->"
- else:
- prefix = ""
- stream.write (" " + prefix + self.name + " = (" + self.type.type.cpp +
- ") (" + self.assign + ");\n")
-
- def genWrite (self, stream):
- if self.type.type.perThread:
- self.type.type.genWrite (stream, "totals." + self.name)
- else:
- self.type.type.genWrite (stream, self.name)
-
- def genInitialize (self, stream, prefix="", indent=" "):
- val = self.type.type.init
- if self.type.type.style != "mma":
- stream.write (indent + prefix + self.name + " = " + val + ";\n")
- if self.type.type.style == "wm":
- stream.write (indent + prefix + self.name + "High = " + val + ";\n")
- stream.write (indent + prefix + self.name + "Low = " + val + ";\n")
- if self.type.type.style == "mma":
- stream.write (indent + prefix + self.name + "Count = 0;\n")
- stream.write (indent + prefix + self.name + "Min = std::numeric_limits<" + self.type.type.cpp + ">::max();\n")
- stream.write (indent + prefix + self.name + "Max = std::numeric_limits<" + self.type.type.cpp + ">::min();\n")
- stream.write (indent + prefix + self.name + "Total = 0;\n")
-
- def genInitializeTotalPerThreadStats (self, stream):
- if self.type.type.style == "mma":
- stream.write (" totals->" + self.name + "Count = 0;\n")
- stream.write (" totals->" + self.name + "Min = std::numeric_limits<" + self.type.type.cpp + ">::max();\n")
- stream.write (" totals->" + self.name + "Max = std::numeric_limits<" + self.type.type.cpp + ">::min();\n")
- stream.write (" totals->" + self.name + "Total = 0;\n")
- else:
- stream.write (" totals->" + self.name + " = 0;\n")
-
- def genAggregatePerThreadStats (self, stream):
- if self.type.type.style == "mma":
- stream.write (" totals->%sCount += threadStats->%sCount;\n" % (self.name, self.name))
- stream.write (" if (totals->%sMin > threadStats->%sMin)\n" % (self.name, self.name))
- stream.write (" totals->%sMin = threadStats->%sMin;\n" % (self.name, self.name))
- stream.write (" if (totals->%sMax < threadStats->%sMax)\n" % (self.name, self.name))
- stream.write (" totals->%sMax = threadStats->%sMax;\n" % (self.name, self.name))
- stream.write (" totals->%sTotal += threadStats->%sTotal;\n" % (self.name, self.name))
- else:
- stream.write (" totals->%s += threadStats->%s;\n" % (self.name, self.name))
-
-#=====================================================================================
-#
-#=====================================================================================
-class SchemaArg:
- def __init__ (self, node, typespec):
- self.name = None
- self.type = None
- self.unit = None
- self.dir = "I"
- self.min = None
- self.max = None
- self.maxLen = None
- self.desc = None
- self.default = None
-
- attrs = node.attributes
- for idx in range (attrs.length):
- key = attrs.item(idx).nodeName
- val = attrs.item(idx).nodeValue
- if key == 'name':
- self.name = makeValidCppSymbol(val)
-
- elif key == 'type':
- self.type = Type (val, typespec)
-
- elif key == 'unit':
- self.unit = val
-
- elif key == 'dir':
- self.dir = val.upper ()
-
- elif key == 'min':
- self.min = val
-
- elif key == 'max':
- self.max = val
-
- elif key == 'maxlen':
- self.maxLen = val
-
- elif key == 'desc':
- self.desc = val
-
- elif key == 'default':
- self.default = val
-
- else:
- raise ValueError ("Unknown attribute in arg '%s'" % key)
-
- if self.name == None:
- raise ValueError ("Missing 'name' attribute in arg")
- if self.type == None:
- raise ValueError ("Missing 'type' attribute in arg")
-
- def getName (self):
- return self.name
-
- def getDir (self):
- return self.dir
-
- def genSchema (self, stream, event=False):
- stream.write (" ft = FieldTable ();\n")
- stream.write (" ft.setString (NAME, \"" + self.name + "\");\n")
- stream.write (" ft.setInt (TYPE, TYPE_" + self.type.type.base +");\n")
- if (not event):
- stream.write (" ft.setString (DIR, \"" + self.dir + "\");\n")
- if self.unit != None:
- stream.write (" ft.setString (UNIT, \"" + self.unit + "\");\n")
- if not event:
- if self.min != None:
- stream.write (" ft.setInt (MIN, " + self.min + ");\n")
- if self.max != None:
- stream.write (" ft.setInt (MAX, " + self.max + ");\n")
- if self.maxLen != None:
- stream.write (" ft.setInt (MAXLEN, " + self.maxLen + ");\n")
- if self.default != None:
- stream.write (" ft.setString (DEFAULT, \"" + self.default + "\");\n")
- if self.desc != None:
- stream.write (" ft.setString (DESC, \"" + self.desc + "\");\n")
- stream.write (" buf.put (ft);\n\n")
-
- def genFormalParam (self, stream, variables):
- stream.write ("%s _%s" % (self.type.type.cpp, self.name))
-
-#=====================================================================================
-#
-#=====================================================================================
-class SchemaMethod:
- def __init__ (self, parent, node, typespec):
- self.parent = parent
- self.name = None
- self.desc = None
- self.args = []
-
- attrs = node.attributes
- for idx in range (attrs.length):
- key = attrs.item(idx).nodeName
- val = attrs.item(idx).nodeValue
- if key == 'name':
- self.name = makeValidCppSymbol(val)
-
- elif key == 'desc':
- self.desc = val
-
- else:
- raise ValueError ("Unknown attribute in method '%s'" % key)
-
- for child in node.childNodes:
- if child.nodeType == Node.ELEMENT_NODE:
- if child.nodeName == 'arg':
- arg = SchemaArg (child, typespec)
- self.args.append (arg)
- else:
- raise ValueError ("Unknown method tag '%s'" % child.nodeName)
-
- def getName (self):
- return self.name
-
- def getFullName (self):
- return capitalize(self.parent.getName()) + self.name[0:1].upper() +\
- self.name[1:]
-
- def getArgCount (self):
- return len (self.args)
-
- #===================================================================================
- # Code Generation Functions. The names of these functions (minus the leading "gen")
- # match the substitution keywords in the template files.
- #===================================================================================
- def genNameUpper (self, stream, variables):
- stream.write (self.getFullName ().upper ())
-
- def genNameCamel (self, stream, variables):
- stream.write (self.getFullName ())
-
- def genArguments (self, stream, variables):
- for arg in self.args:
- ctype = arg.type.type.cpp
- dirTag = arg.dir.lower() + "_"
- stream.write (" " + ctype + " " + dirTag + arg.getName () + ";\n")
-
- def genSchema (self, stream, variables):
- stream.write (" ft = FieldTable ();\n")
- stream.write (" ft.setString (NAME, \"" + self.name + "\");\n")
- stream.write (" ft.setInt (ARGCOUNT, " + str (len (self.args)) + ");\n")
- if self.desc != None:
- stream.write (" ft.setString (DESC, \"" + self.desc + "\");\n")
- stream.write (" buf.put (ft);\n\n")
- for arg in self.args:
- arg.genSchema (stream)
-
-#=====================================================================================
-#
-#=====================================================================================
-class SchemaEvent:
- def __init__ (self, parent, node, typespec):
- self.parent = parent
- self.name = None
- self.desc = None
- self.args = []
-
- attrs = node.attributes
- for idx in range (attrs.length):
- key = attrs.item(idx).nodeName
- val = attrs.item(idx).nodeValue
- if key == 'name':
- self.name = val
-
- elif key == 'desc':
- self.desc = val
-
- else:
- raise ValueError ("Unknown attribute in event '%s'" % key)
-
- for child in node.childNodes:
- if child.nodeType == Node.ELEMENT_NODE:
- if child.nodeName == 'arg':
- arg = SchemaArg (child, typespec)
- self.args.append (arg)
- else:
- raise ValueError ("Unknown event tag '%s'" % child.nodeName)
-
- def getName (self):
- return self.name
-
- def getFullName (self):
- return capitalize(self.parent.getName()) + capitalize(self.name)
-
- def getArgCount (self):
- return len (self.args)
-
- def genMethodBody (self, stream, variables, classObject):
- stream.write("void ")
- classObject.genNameCap(stream, variables)
- stream.write("::event_%s(" % self.name)
- count = 0
- for arg in self.args:
- arg.genFormalParam(stream, variables)
- count += 1
- if count < len(self.args):
- stream.write(", ")
- stream.write(") {\n")
- stream.write(" sys::Mutex::ScopedLock mutex(getMutex());\n")
- stream.write(" Buffer* buf = startEventLH();\n")
- stream.write(" objectId.encode(*buf);\n")
- stream.write(" buf->putShortString(packageName);\n")
- stream.write(" buf->putShortString(className);\n")
- stream.write(" buf->putBin128(md5Sum);\n")
- stream.write(" buf->putShortString(\"%s\");\n" % self.name)
- for arg in self.args:
- stream.write(" %s;\n" % arg.type.type.encode.replace("@", "(*buf)").replace("#", "_" + arg.name))
- stream.write(" finishEventLH(buf);\n")
- stream.write("}\n\n")
-
- def genMethodDecl (self, stream, variables):
- stream.write(" void event_%s(" % self.name)
- count = 0
- for arg in self.args:
- arg.genFormalParam(stream, variables)
- count += 1
- if count < len(self.args):
- stream.write(", ")
- stream.write(");\n")
-
- def genSchema(self, stream, variables):
- stream.write (" ft = FieldTable ();\n")
- stream.write (" ft.setString (NAME, \"" + self.name + "\");\n")
- stream.write (" ft.setInt (ARGCOUNT, " + str (len (self.args)) + ");\n")
- if self.desc != None:
- stream.write (" ft.setString (DESC, \"" + self.desc + "\");\n")
- stream.write (" buf.put (ft);\n\n")
- for arg in self.args:
- arg.genSchema (stream, True)
-
-
-
-class SchemaClass:
- def __init__ (self, package, node, typespec, fragments, options):
- self.packageName = package
- self.properties = []
- self.statistics = []
- self.methods = []
- self.events = []
- self.options = options
- self.md5Sum = md5.new ()
-
- self.hash (node)
-
- attrs = node.attributes
- self.name = makeValidCppSymbol(attrs['name'].nodeValue)
-
- children = node.childNodes
- for child in children:
- if child.nodeType == Node.ELEMENT_NODE:
- if child.nodeName == 'property':
- sub = SchemaProperty (child, typespec)
- self.properties.append (sub)
-
- elif child.nodeName == 'statistic':
- sub = SchemaStatistic (child, typespec)
- self.statistics.append (sub)
-
- elif child.nodeName == 'method':
- sub = SchemaMethod (self, child, typespec)
- self.methods.append (sub)
-
- elif child.nodeName == 'event':
- sub = SchemaEvent (self, child, typespec)
- self.events.append (sub)
-
- elif child.nodeName == 'group':
- self.expandFragment (child, fragments)
-
- else:
- raise ValueError ("Unknown class tag '%s'" % child.nodeName)
-
- # Adjust the 'assign' attributes for each statistic
- for stat in self.statistics:
- if stat.assign != None and stat.type.type.perThread:
- stat.assign = self.adjust (stat.assign, self.statistics)
-
- def adjust (self, text, statistics):
- result = text
- start = 0
- while True:
- next = None
- for stat in statistics:
- pos = result.find (stat.name, start)
- if pos != -1 and (next == None or pos < next[0]):
- next = (pos, stat.name)
- if next == None:
- return result
- pos = next[0]
- result = result[0:pos] + "threadStats->" + result[pos:]
- start = pos + 9 + len(next[1])
-
- def hash (self, node):
- attrs = node.attributes
- self.md5Sum.update (node.nodeName)
-
- for idx in range (attrs.length):
- self.md5Sum.update (attrs.item(idx).nodeName)
- self.md5Sum.update (attrs.item(idx).nodeValue)
-
- for child in node.childNodes:
- if child.nodeType == Node.ELEMENT_NODE:
- self.hash (child)
-
- def expandFragment (self, node, fragments):
- attrs = node.attributes
- name = attrs['name'].nodeValue
- for fragment in fragments:
- if fragment.name == name:
- self.md5Sum.update (fragment.md5Sum.digest())
- for config in fragment.properties:
- self.properties.append (config)
- for inst in fragment.statistics:
- self.statistics.append (inst)
- for method in fragment.methods:
- self.methods.append (method)
- for event in fragment.events:
- self.events.append (event)
- return
- raise ValueError ("Undefined group '%s'" % name)
-
- def getName (self):
- return self.name
-
- def getNameCap (self):
- return capitalize(self.name)
-
- def getMethods (self):
- return self.methods
-
- def getEvents (self):
- return self.events
-
- def getPackageNameCap (self):
- return capitalize(self.packageName)
-
- #===================================================================================
- # Code Generation Functions. The names of these functions (minus the leading "gen")
- # match the substitution keywords in the template files.
- #===================================================================================
- def testExistOptionals (self, variables):
- for prop in self.properties:
- if prop.isOptional == 1:
- return True
- return False
-
- def testExistPerThreadStats (self, variables):
- for inst in self.statistics:
- if inst.type.type.perThread:
- return True
- return False
-
- def testExistPerThreadAssign (self, variables):
- for inst in self.statistics:
- if inst.type.type.perThread and inst.assign != None:
- return True
- return False
-
- def testExistPerThreadResets (self, variables):
- for inst in self.statistics:
- if inst.type.type.perThread and inst.type.type.style == "mma":
- return True
- return False
-
- def testNoStatistics (self, variables):
- return len (self.statistics) == 0
-
- def genAccessorMethods (self, stream, variables):
- for config in self.properties:
- if config.access != "RC":
- config.genAccessor (stream)
- for inst in self.statistics:
- if inst.assign == None:
- inst.genAccessor (stream)
-
- def genConfigCount (self, stream, variables):
- stream.write ("%d" % len (self.properties))
-
- def genConfigDeclarations (self, stream, variables):
- for element in self.properties:
- element.genDeclaration (stream)
-
- def genConstructorArgs (self, stream, variables):
- # Constructor args are config elements with read-create access
- result = ""
- for element in self.properties:
- if element.isConstructorArg ():
- stream.write (", ")
- element.genFormalParam (stream, variables)
-
- def genConstructorInits (self, stream, variables):
- for element in self.properties:
- if element.isConstructorArg ():
- stream.write ("," + element.getName () + "(_" + element.getName () + ")")
-
- def genDoMethodArgs (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, Buffer&, Buffer& outBuf")
- else:
- if inArgCount == 0:
- stream.write ("string methodName, Buffer&, Buffer& outBuf")
- else:
- stream.write ("string methodName, Buffer& inBuf, Buffer& outBuf")
-
- def genEventCount (self, stream, variables):
- stream.write ("%d" % len (self.events))
-
- def genEventMethodBodies (self, stream, variables):
- for event in self.events:
- event.genMethodBody (stream, variables, self)
-
- def genEventMethodDecls (self, stream, variables):
- for event in self.events:
- event.genMethodDecl (stream, variables)
-
- def genEventSchema (self, stream, variables):
- for event in self.events:
- event.genSchema (stream, variables)
-
- def genHiLoStatResets (self, stream, variables):
- for inst in self.statistics:
- if not inst.type.type.perThread:
- inst.genHiLoStatResets (stream)
-
- def genPerThreadHiLoStatResets (self, stream, variables):
- for inst in self.statistics:
- if inst.type.type.perThread:
- inst.genPerThreadHiLoStatResets (stream)
-
- def genInitializeElements (self, stream, variables):
- for inst in self.statistics:
- if not inst.type.type.perThread:
- inst.genInitialize (stream)
-
- def genInitializePerThreadElements (self, stream, variables):
- for inst in self.statistics:
- if inst.type.type.perThread:
- inst.genInitialize (stream, "threadStats->", " ")
-
- def genInitializeTotalPerThreadStats (self, stream, variables):
- for inst in self.statistics:
- if inst.type.type.perThread:
- inst.genInitializeTotalPerThreadStats (stream)
-
- def genAggregatePerThreadStats (self, stream, variables):
- for inst in self.statistics:
- if inst.type.type.perThread:
- inst.genAggregatePerThreadStats (stream)
-
- def genInstCount (self, stream, variables):
- count = 0
- for inst in self.statistics:
- count = count + 1
- if inst.type.type.style == "wm":
- count = count + 2
- if inst.type.type.style == "mma":
- count = count + 3
- stream.write ("%d" % count)
-
- def genInstDeclarations (self, stream, variables):
- for element in self.statistics:
- if not element.type.type.perThread:
- element.genDeclaration (stream)
-
- def genPerThreadDeclarations (self, stream, variables):
- for element in self.statistics:
- if element.type.type.perThread:
- element.genDeclaration (stream, " ")
-
- def genMethodArgIncludes (self, stream, variables):
- for method in self.methods:
- if method.getArgCount () > 0:
- stream.write ("#include \"Args" + method.getFullName () + ".h\"\n")
-
- def genMethodCount (self, stream, variables):
- stream.write ("%d" % len (self.methods))
-
- def genMethodHandlers (self, stream, variables):
- for method in self.methods:
- stream.write ("\n if (methodName == \"" + method.getName () + "\") {\n")
- if method.getArgCount () == 0:
- stream.write (" ArgsNone ioArgs;\n")
- else:
- stream.write (" Args" + method.getFullName () + " ioArgs;\n")
- for arg in method.args:
- if arg.getDir () == "I" or arg.getDir () == "IO":
- stream.write (" " +\
- arg.type.type.getReadCode ("ioArgs." +\
- arg.dir.lower () + "_" +\
- arg.name, "inBuf") + ";\n")
-
- stream.write (" status = coreObject->ManagementMethod (METHOD_" +\
- method.getName().upper() + ", ioArgs);\n")
- stream.write (" outBuf.putLong (status);\n")
- stream.write (" outBuf.putShortString (Manageable::StatusText (status));\n")
- for arg in method.args:
- if arg.getDir () == "O" or arg.getDir () == "IO":
- stream.write (" " +\
- arg.type.type.getWriteCode ("ioArgs." +\
- arg.dir.lower () + "_" +\
- arg.name, "outBuf") + ";\n")
- stream.write (" return;\n }\n")
-
- def genPresenceMaskBytes (self, stream, variables):
- count = 0
- for prop in self.properties:
- if prop.isOptional == 1:
- count += 1
- if count == 0:
- stream.write("0")
- else:
- stream.write (str(((count - 1) / 8) + 1))
-
- def genPresenceMaskConstants (self, stream, variables):
- count = 0
- for prop in self.properties:
- if prop.isOptional == 1:
- stream.write(" static const uint8_t presenceByte_%s = %d;\n" % (prop.name, count / 8))
- stream.write(" static const uint8_t presenceMask_%s = %d;\n" % (prop.name, 1 << (count % 8)))
- count += 1
-
- def genPropertySchema (self, stream, variables):
- for prop in self.properties:
- prop.genSchema (stream)
-
- def genSetGeneralReferenceDeclaration (self, stream, variables):
- for prop in self.properties:
- if prop.isGeneralRef:
- stream.write ("void setReference(ObjectId objectId) { " + prop.name + " = objectId; }\n")
-
- def genStatisticSchema (self, stream, variables):
- for stat in self.statistics:
- stat.genSchema (stream)
-
- def genMethodIdDeclarations (self, stream, variables):
- number = 1
- for method in self.methods:
- stream.write (" static const uint32_t METHOD_" + method.getName().upper() +\
- " = %d;\n" % number)
- number = number + 1
-
- def genMethodSchema (self, stream, variables):
- for method in self.methods:
- method.genSchema (stream, variables)
-
- def genNameCap (self, stream, variables):
- stream.write (capitalize(self.name))
-
- def genNameLower (self, stream, variables):
- stream.write (self.name.lower ())
-
- def genNamePackageCap (self, stream, variables):
- stream.write (self.getPackageNameCap ())
-
- def genNamePackageLower (self, stream, variables):
- stream.write (self.packageName.lower ())
-
- def genNameUpper (self, stream, variables):
- stream.write (self.name.upper ())
-
- def genParentArg (self, stream, variables):
- for config in self.properties:
- if config.isParentRef == 1:
- stream.write (", Manageable* _parent")
- return
-
- def genParentRefAssignment (self, stream, variables):
- for config in self.properties:
- if config.isParentRef == 1:
- stream.write (config.getName () + \
- " = _parent->GetManagementObject ()->getObjectId ();")
- return
-
- def genSchemaMD5 (self, stream, variables):
- sum = self.md5Sum.digest ()
- for idx in range (len (sum)):
- if idx != 0:
- stream.write (",")
- stream.write (hex (ord (sum[idx])))
-
- def genAssign (self, stream, variables):
- for inst in self.statistics:
- if not inst.type.type.perThread:
- inst.genAssign (stream)
-
- def genPerThreadAssign (self, stream, variables):
- for inst in self.statistics:
- if inst.type.type.perThread:
- inst.genAssign (stream)
-
- def genWriteProperties (self, stream, variables):
- for prop in self.properties:
- prop.genWrite (stream)
-
- def genWriteStatistics (self, stream, variables):
- for stat in self.statistics:
- stat.genWrite (stream)
-
-
-
-class PackageSchema:
- def __init__ (self, typefile, schemafile, options):
-
- self.classes = []
- self.fragments = []
- self.typespec = TypeSpec (typefile)
-
- dom = parse (schemafile)
- document = dom.documentElement
- if document.tagName != 'schema':
- raise ValueError ("Expected 'schema' node")
- attrs = document.attributes
- self.packageName = makeValidCppSymbol(attrs['package'].nodeValue)
-
- children = document.childNodes
- for child in children:
- if child.nodeType == Node.ELEMENT_NODE:
- if child.nodeName == 'class':
- cls = SchemaClass (self.packageName, child, self.typespec,
- self.fragments, options)
- self.classes.append (cls)
-
- elif child.nodeName == 'group':
- cls = SchemaClass (self.packageName, child, self.typespec,
- self.fragments, options)
- self.fragments.append (cls)
-
- else:
- raise ValueError ("Unknown schema tag '%s'" % child.nodeName)
-
- def getPackageName (self):
- return self.packageName
-
- def getPackageNameCap (self):
- return capitalize(self.packageName)
-
- def getClasses (self):
- return self.classes
-
- def genPackageNameUpper (self, stream, variables):
- stream.write (self.packageName.upper ())
-
- def genPackageNameCap (self, stream, variables):
- stream.write (self.getPackageNameCap ())
-
- def genClassIncludes (self, stream, variables):
- for _class in self.classes:
- stream.write ("#include \"")
- _class.genNameCap (stream, variables)
- stream.write (".h\"\n")
-
- def genClassRegisters (self, stream, variables):
- for _class in self.classes:
- stream.write (" ")
- _class.genNameCap (stream, variables)
- stream.write ("::registerClass(agent);\n")
-
-
-#=====================================================================================
-# Utility Functions
-#=====================================================================================
-
-# Create a valid C++ symbol from the input string so that it can be
-# used in generated C++ source. For instance, change "qpid.mgmt" to
-# "qpidMgmt".
-#
-# Input: Raw string (str) to process
-# Output: String (str) suitable for use as a C++ symbol
-#
-# Limitations: Currently, only strips periods ('.') from strings,
-# eventually should strip :'s and ,'s and ''s, oh my!
-def makeValidCppSymbol(input):
- output = str()
- capitalize = False
-
- for char in input:
- skip = False
-
- if char == ".":
- capitalize = True
- skip = True
-
- if not skip:
- output += capitalize and char.upper() or char
-
- capitalize = False
-
- return output
-
-# Capitalize a string by /only/ forcing the first character to be
-# uppercase. The rest of the string is left alone. This is different
-# from str.capitalize(), which forces the first character to uppercase
-# and the rest to lowercase.
-#
-# Input: A string (str) to capitalize
-# Output: A string (str) with the first character as uppercase
-def capitalize(input):
- return input[0].upper() + input[1:]