summaryrefslogtreecommitdiff
path: root/cpp/managementgen
diff options
context:
space:
mode:
authorRafael H. Schloming <rhs@apache.org>2009-12-26 12:42:57 +0000
committerRafael H. Schloming <rhs@apache.org>2009-12-26 12:42:57 +0000
commit248f1fe188fe2307b9dcf2c87a83b653eaa1920c (patch)
treed5d0959a70218946ff72e107a6c106e32479a398 /cpp/managementgen
parent3c83a0e3ec7cf4dc23e83a340b25f5fc1676f937 (diff)
downloadqpid-python-248f1fe188fe2307b9dcf2c87a83b653eaa1920c.tar.gz
synchronized with trunk except for ruby dir
git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/qpid.rnr@893970 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/managementgen')
-rw-r--r--cpp/managementgen/CMakeLists.txt26
-rw-r--r--cpp/managementgen/Makefile.am61
-rwxr-xr-xcpp/managementgen/main.py52
-rwxr-xr-xcpp/managementgen/qmf-gen90
-rw-r--r--cpp/managementgen/qmfgen/__init__.py (renamed from cpp/managementgen/managementgen)9
-rwxr-xr-xcpp/managementgen/qmfgen/generate.py (renamed from cpp/managementgen/generate.py)214
-rw-r--r--cpp/managementgen/qmfgen/management-types.xml56
-rwxr-xr-xcpp/managementgen/qmfgen/schema.py (renamed from cpp/managementgen/schema.py)491
-rw-r--r--cpp/managementgen/qmfgen/templates/Args.h (renamed from cpp/managementgen/templates/Args.h)10
-rw-r--r--cpp/managementgen/qmfgen/templates/CMakeLists.cmake39
-rw-r--r--cpp/managementgen/qmfgen/templates/Class.cpp (renamed from cpp/managementgen/templates/Class.cpp)54
-rw-r--r--cpp/managementgen/qmfgen/templates/Class.h (renamed from cpp/managementgen/templates/Class.h)56
-rw-r--r--cpp/managementgen/qmfgen/templates/Event.cpp78
-rw-r--r--cpp/managementgen/qmfgen/templates/Event.h59
-rw-r--r--cpp/managementgen/qmfgen/templates/Makefile.mk (renamed from cpp/managementgen/templates/Makefile.mk)11
-rw-r--r--cpp/managementgen/qmfgen/templates/Package.cpp (renamed from cpp/managementgen/templates/Package.cpp)6
-rw-r--r--cpp/managementgen/qmfgen/templates/Package.h (renamed from cpp/managementgen/templates/Package.h)14
17 files changed, 1036 insertions, 290 deletions
diff --git a/cpp/managementgen/CMakeLists.txt b/cpp/managementgen/CMakeLists.txt
new file mode 100644
index 0000000000..2511b745a3
--- /dev/null
+++ b/cpp/managementgen/CMakeLists.txt
@@ -0,0 +1,26 @@
+#
+# 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.
+#
+project(qpidc-qmfgen)
+cmake_minimum_required(VERSION 2.4.0 FATAL_ERROR)
+
+install(PROGRAMS qmf-gen DESTINATION managementgen
+ COMPONENT ${QPID_COMPONENT_QMF})
+install(DIRECTORY qmfgen DESTINATION managementgen
+ COMPONENT ${QPID_COMPONENT_QMF}
+ PATTERN ".svn" EXCLUDE PATTERN "*.pyc" EXCLUDE)
diff --git a/cpp/managementgen/Makefile.am b/cpp/managementgen/Makefile.am
index 993eeb1d20..7f85834093 100644
--- a/cpp/managementgen/Makefile.am
+++ b/cpp/managementgen/Makefile.am
@@ -1,27 +1,36 @@
-managementgendir = $(datadir)/managementgen
-dist_managementgen_SCRIPTS = \
- main.py
-nobase_managementgen_DATA = \
- schema.py generate.py \
- templates/Args.h \
- templates/Class.cpp \
- templates/Class.h \
- templates/Makefile.mk \
- templates/Package.cpp \
- templates/Package.h \
- management-types.xml
-
-dist_bin_SCRIPTS = managementgen
-
-EXTRA_DIST = $(nobase_managementgen_DATA)
-
-# This should depend on ../../specs/management-types.xml, but can't
-# because it won't exist in a dist. This rule means that dist-gzip
-# (and rpmbuild) cannot be run purely on the cpp/ directory, the
-# cpp/../specs/ directory must exist, which is not a new dependency
-# but this is an additional instance of the dependency.
#
-# WARNING: Because this target does not have a proper dependency
-# changes to the specs/management-types.xml will not be picked up!
-management-types.xml:
- cp $(top_srcdir)/../specs/management-types.xml .
+# 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.
+#
+qmfpythondir = $(pythondir)
+dist_bin_SCRIPTS = \
+ qmf-gen
+nobase_qmfpython_DATA = \
+ qmfgen/__init__.py \
+ qmfgen/generate.py \
+ qmfgen/schema.py \
+ qmfgen/templates/Args.h \
+ qmfgen/templates/Class.cpp \
+ qmfgen/templates/Class.h \
+ qmfgen/templates/Event.cpp \
+ qmfgen/templates/Event.h \
+ qmfgen/templates/Makefile.mk \
+ qmfgen/templates/Package.cpp \
+ qmfgen/templates/Package.h \
+ qmfgen/management-types.xml
+
+EXTRA_DIST = $(nobase_qmfpython_DATA) CMakeLists.txt
diff --git a/cpp/managementgen/main.py b/cpp/managementgen/main.py
deleted file mode 100755
index 4459177a53..0000000000
--- a/cpp/managementgen/main.py
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/env python
-
-#
-# 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 schema import PackageSchema, SchemaClass
-from generate import Generator
-from optparse import OptionParser
-
-# Set command line options
-usage = "usage: %prog [options] schema-document type-document template-directory out-directory"
-parser = OptionParser (usage=usage)
-parser.add_option ("-m", "--makefile", dest="makefile", metavar="FILE",
- help="Makefile fragment")
-
-(opts, args) = parser.parse_args ()
-
-if len (args) < 4:
- parser.error ("Too few arguments")
-
-schemafile = args[0]
-typefile = args[1]
-templatedir = args[2]
-outdir = args[3]
-
-gen = Generator (outdir, templatedir)
-schema = PackageSchema (typefile, schemafile, opts)
-
-gen.makeClassFiles ("Class.h", schema)
-gen.makeClassFiles ("Class.cpp", schema)
-gen.makeMethodFiles ("Args.h", schema)
-gen.makePackageFile ("Package.h", schema)
-gen.makePackageFile ("Package.cpp", schema)
-
-if opts.makefile != None:
- gen.makeSingleFile ("Makefile.mk", opts.makefile, force=True)
diff --git a/cpp/managementgen/qmf-gen b/cpp/managementgen/qmf-gen
new file mode 100755
index 0000000000..ebc07137ae
--- /dev/null
+++ b/cpp/managementgen/qmf-gen
@@ -0,0 +1,90 @@
+#!/usr/bin/env python
+#
+# 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.
+#
+
+import sys
+import os
+from qmfgen.schema import SchemaPackage, SchemaClass
+from qmfgen.generate import Generator
+from optparse import OptionParser
+
+dataPath = os.path.dirname(Generator.getModulePath())
+defaultTypeFile = dataPath + "/management-types.xml"
+defaultTemplateDir = dataPath + "/templates"
+
+# Set command line options
+usage = "usage: %prog [options] schema-document..."
+parser = OptionParser(usage=usage)
+parser.add_option("-o", "--outputdir", dest="outputdir", metavar="DIR", default="./",
+ help="Output directory")
+parser.add_option("-c", "--cmakelists", dest="cmakelists", metavar="FILE",
+ help="CMakeLists fragment")
+parser.add_option("-m", "--makefile", dest="makefile", metavar="FILE",
+ help="Makefile fragment")
+parser.add_option("-t", "--typefile", dest="typefile", metavar="FILE", default=defaultTypeFile,
+ help="Override type descriptor file")
+parser.add_option("-d", "--templatedir", dest="templatedir", metavar="DIR", default=defaultTemplateDir,
+ help="Override template directory")
+parser.add_option("-p", "--gen-prefix", dest="genprefix", default="",
+ help="Prefix for generated files in make dependencies")
+parser.add_option("-q", "--qpid-broker", dest="qpidbroker", default=False, action="store_true",
+ help="Generate makefile for Qpid broker")
+parser.add_option("-b", "--broker-plugin", dest="brokerplugin", default=False, action="store_true",
+ help="Generate code for use in a qpid broker plugin")
+
+(opts, args) = parser.parse_args()
+
+typefile = opts.typefile
+templatedir = opts.templatedir
+outdir = opts.outputdir
+gen = Generator(outdir, templatedir)
+
+if len(args) == 0:
+ print "no input files"
+ parser.exit()
+
+vargs = {}
+if opts.brokerplugin:
+ vargs["agentHeaderDir"] = "management"
+else:
+ vargs["agentHeaderDir"] = "agent"
+
+for schemafile in args:
+ package = SchemaPackage(typefile, schemafile, opts)
+
+ gen.setPackage (package.packageName)
+ gen.makeClassFiles ("Class.h", package, vars=vargs)
+ gen.makeClassFiles ("Class.cpp", package, vars=vargs)
+ gen.makeMethodFiles ("Args.h", package, vars=vargs)
+ gen.makeEventFiles ("Event.h", package, vars=vargs)
+ gen.makeEventFiles ("Event.cpp", package, vars=vargs)
+ gen.makePackageFile ("Package.h", package, vars=vargs)
+ gen.makePackageFile ("Package.cpp", package, vars=vargs)
+
+if opts.makefile != None:
+ args = {}
+ args["qpidbroker"] = opts.qpidbroker
+ args["genprefix"] = opts.genprefix
+ gen.makeSingleFile("Makefile.mk", opts.makefile, force=True, vars=args)
+
+if opts.cmakelists != None:
+ args = {}
+ args["qpidbroker"] = opts.qpidbroker
+ args["genprefix"] = opts.genprefix
+ gen.makeSingleFile("CMakeLists.cmake", opts.cmakelists, force=True, vars=args)
diff --git a/cpp/managementgen/managementgen b/cpp/managementgen/qmfgen/__init__.py
index 55ea846270..63a3f41f28 100644
--- a/cpp/managementgen/managementgen
+++ b/cpp/managementgen/qmfgen/__init__.py
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
@@ -9,7 +7,7 @@
# "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
+# 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
@@ -19,8 +17,3 @@
# under the License.
#
-import sys
-
-sys.path.append("/usr/share/managementgen")
-
-import main
diff --git a/cpp/managementgen/generate.py b/cpp/managementgen/qmfgen/generate.py
index 6024173f67..4052b8c853 100755
--- a/cpp/managementgen/generate.py
+++ b/cpp/managementgen/qmfgen/generate.py
@@ -7,7 +7,7 @@
# "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
+# 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
@@ -24,6 +24,7 @@ from errno import *
import os
import os.path
import filecmp
+import re
class Template:
"""
@@ -100,17 +101,18 @@ class Template:
class Makefile:
""" Object representing a makefile fragment """
- def __init__ (self, filelists, templateFiles):
+ def __init__ (self, filelists, templateFiles, packagelist):
self.filelists = filelists
self.templateFiles = templateFiles
+ self.packagelist = packagelist
def genGenSources (self, stream, variables):
mdir = variables["mgenDir"]
sdir = variables["specDir"]
- stream.write (mdir + "/main.py \\\n")
- stream.write (" " + mdir + "/generate.py \\\n")
- stream.write (" " + mdir + "/schema.py \\\n")
- stream.write (" " + sdir + "/management-types.xml \\\n")
+ stream.write (mdir + "/qmf-gen \\\n")
+ stream.write (" " + mdir + "/qmfgen/generate.py \\\n")
+ stream.write (" " + mdir + "/qmfgen/schema.py \\\n")
+ stream.write (" " + mdir + "/qmfgen/management-types.xml \\\n")
stream.write (" " + sdir + "/management-schema.xml \\\n")
first = True
for template in self.templateFiles:
@@ -119,7 +121,7 @@ class Makefile:
stream.write (" ")
else:
stream.write (" \\\n ")
- stream.write (mdir + "/templates/" + template)
+ stream.write (mdir + "/qmfgen/templates/" + template)
def genGenCppFiles (self, stream, variables):
first = True
@@ -139,6 +141,116 @@ class Makefile:
stream.write (" \\\n ")
stream.write (file)
+ def genGeneratedFiles(self, stream, variables):
+ first = True
+ extensions = ("h", "cpp")
+ for ext in extensions:
+ for file in self.filelists[ext]:
+ if first:
+ first = False
+ else:
+ stream.write(" \\\n ")
+ if "genprefix" in variables:
+ prefix = variables["genprefix"]
+ if prefix != "":
+ stream.write(prefix + "/")
+ stream.write(file)
+
+ def genHeaderInstalls (self, stream, variables):
+ for package in self.packagelist:
+ name = "_".join(package.split("/"))
+ stream.write(name + "dir = $(includedir)/qmf/" + package + "\n")
+ stream.write("dist_" + name + "_HEADERS = ")
+ first = True
+ for file in self.filelists["h"]:
+ if file.find("qmf/" + package) == 0:
+ if first:
+ first = False
+ else:
+ stream.write (" \\\n ")
+ stream.write(file)
+ stream.write("\n\n")
+
+ def testQpidBroker(self, variables):
+ if "qpidbroker" in variables:
+ return variables["qpidbroker"]
+ return False
+
+class CMakeLists(Makefile):
+ """ Object representing a makefile fragment """
+
+ # Regardless of what normalize() did, switch all the dir separators back
+ # to '/' - cmake expects that regardless of platform.
+ def unNormCase (self, path):
+ return re.sub("\\\\", "/", path)
+
+ def genGenSources (self, stream, variables):
+ mdir = self.unNormCase(variables["mgenDir"])
+ sdir = self.unNormCase(variables["specDir"])
+ stream.write (mdir + "/qmf-gen \n")
+ stream.write (" " + mdir + "/qmfgen/generate.py\n")
+ stream.write (" " + mdir + "/qmfgen/schema.py\n")
+ stream.write (" " + mdir + "/qmfgen/management-types.xml\n")
+ stream.write (" " + sdir + "/management-schema.xml\n")
+ first = True
+ for template in self.templateFiles:
+ if first:
+ first = False
+ stream.write (" ")
+ else:
+ stream.write ("\n ")
+ stream.write (mdir + "/qmfgen/templates/" + template)
+
+ def genGenCppFiles (self, stream, variables):
+ first = True
+ for file in self.filelists["cpp"]:
+ if first:
+ first = False
+ else:
+ stream.write (" \n ")
+ stream.write (self.unNormCase(file))
+
+ def genGenHFiles (self, stream, variables):
+ first = True
+ for file in self.filelists["h"]:
+ if first:
+ first = False
+ else:
+ stream.write (" \n ")
+ stream.write (self.unNormCase(file))
+
+ def genGeneratedFiles(self, stream, variables):
+ first = True
+ extensions = ("h", "cpp")
+ for ext in extensions:
+ for file in self.filelists[ext]:
+ if first:
+ first = False
+ else:
+ stream.write(" \n ")
+ if "genprefix" in variables:
+ prefix = variables["genprefix"]
+ if prefix != "":
+ stream.write(prefix + "/")
+ stream.write(self.unNormCase(file))
+
+ def genHeaderInstalls (self, stream, variables):
+ for package in self.packagelist:
+ stream.write("#Come back to this later...\n")
+ name = "_".join(package.split("/"))
+ stream.write("#" + name + "dir = $(includedir)/qmf/" + package + "\n")
+ stream.write("#dist_" + name + "_HEADERS = ")
+ first = True
+ for file in self.filelists["h"]:
+ file = self.unNormCase(file)
+ if file.find("qmf/" + package) == 0:
+ if first:
+ first = False
+ else:
+ stream.write ("\n ")
+ stream.write("#" + file)
+ stream.write("\n\n")
+
class Generator:
"""
@@ -150,7 +262,7 @@ class Generator:
try:
mode = os.stat (path)[ST_MODE]
except OSError, (err,text):
- if err == ENOENT:
+ if err == ENOENT or err == ESRCH:
exists = False
else:
raise
@@ -168,15 +280,23 @@ class Generator:
return newpath + "/"
def __init__ (self, destDir, templateDir):
- self.dest = self.normalize (destDir)
- self.input = self.normalize (templateDir)
- self.filelists = {}
- self.filelists["h"] = []
- self.filelists["cpp"] = []
- self.filelists["mk"] = []
+ self.dest = self.normalize (destDir)
+ self.input = self.normalize (templateDir)
+ self.packagePath = self.dest
+ self.filelists = {}
+ self.filelists["h"] = []
+ self.filelists["cpp"] = []
+ self.filelists["mk"] = []
+ self.filelists["cmake"] = []
+ self.packagelist = []
self.templateFiles = []
self.variables = {}
+ def setPackage (self, packageName):
+ path = "/".join(packageName.split("."))
+ self.packagelist.append(path)
+ self.packagePath = self.normalize(self.dest + path)
+
def genDisclaimer (self, stream, variables):
prefix = variables["commentPrefix"]
stream.write (prefix + " This source file was created by a code generator.\n")
@@ -191,7 +311,7 @@ class Generator:
def writeIfChanged (self, stream, target, force=False):
ext = self.fileExt (target)
self.filelists[ext].append (target)
- tempFile = self.dest + "gen.tmp"
+ tempFile = target + ".gen.tmp"
fd = open (tempFile, "w")
fd.write (stream.getvalue ())
fd.close ()
@@ -216,7 +336,7 @@ class Generator:
if dot == -1:
raise ValueError ("Invalid template file name %s" % templateFile)
extension = templateFile[dot:len (templateFile)]
- path = self.dest + "Package" + schema.getPackageNameCap() + extension
+ path = self.packagePath + "Package" + extension
return path
def targetClassFile (self, _class, templateFile):
@@ -224,7 +344,15 @@ class Generator:
if dot == -1:
raise ValueError ("Invalid template file name %s" % templateFile)
extension = templateFile[dot:len (templateFile)]
- path = self.dest + _class.getNameCap () + extension
+ path = self.packagePath + _class.getNameCap () + extension
+ return path
+
+ def targetEventFile (self, event, templateFile):
+ dot = templateFile.find(".")
+ if dot == -1:
+ raise ValueError ("Invalid template file name %s" % templateFile)
+ extension = templateFile[dot:len (templateFile)]
+ path = self.packagePath + "Event" + event.getNameCap () + extension
return path
def targetMethodFile (self, method, templateFile):
@@ -233,7 +361,7 @@ class Generator:
if dot == -1:
raise ValueError ("Invalid template file name %s" % templateFile)
extension = templateFile[dot:]
- path = self.dest + "Args" + method.getFullName () + extension
+ path = self.packagePath + "Args" + method.getFullName () + extension
return path
def initExpansion (self):
@@ -260,20 +388,39 @@ class Generator:
def setVariable (self, key, value):
self.variables[key] = value
- def makeClassFiles (self, templateFile, schema, force=False):
+ def makeClassFiles (self, templateFile, schema, force=False, vars=None):
""" Generate an expanded template per schema class """
classes = schema.getClasses ()
template = Template (self.input + templateFile, self)
+ if vars:
+ for arg in vars:
+ self.setVariable(arg, vars[arg])
self.templateFiles.append (templateFile)
for _class in classes:
target = self.targetClassFile (_class, templateFile)
stream = template.expand (_class)
self.writeIfChanged (stream, target, force)
- def makeMethodFiles (self, templateFile, schema, force=False):
+ def makeEventFiles (self, templateFile, schema, force=False, vars=None):
+ """ Generate an expanded template per schema event """
+ events = schema.getEvents()
+ template = Template (self.input + templateFile, self)
+ if vars:
+ for arg in vars:
+ self.setVariable(arg, vars[arg])
+ self.templateFiles.append (templateFile)
+ for event in events:
+ target = self.targetEventFile(event, templateFile)
+ stream = template.expand(event)
+ self.writeIfChanged(stream, target, force)
+
+ def makeMethodFiles (self, templateFile, schema, force=False, vars=None):
""" Generate an expanded template per method-with-arguments """
classes = schema.getClasses ()
template = Template (self.input + templateFile, self)
+ if vars:
+ for arg in vars:
+ self.setVariable(arg, vars[arg])
self.templateFiles.append (templateFile)
for _class in classes:
methods = _class.getMethods ()
@@ -283,18 +430,39 @@ class Generator:
stream = template.expand (method)
self.writeIfChanged (stream, target, force)
- def makePackageFile (self, templateFile, schema, force=False):
+ def makePackageFile (self, templateFile, schema, force=False, vars=None):
""" Generate a package-specific file """
template = Template (self.input + templateFile, self)
+ if vars:
+ for arg in vars:
+ self.setVariable(arg, vars[arg])
self.templateFiles.append (templateFile)
target = self.targetPackageFile (schema, templateFile)
stream = template.expand (schema)
self.writeIfChanged (stream, target, force)
- def makeSingleFile (self, templateFile, target, force=False):
+ def makeSingleFile (self, templateFile, target, force=False, vars=None):
""" Generate a single expanded template """
- makefile = Makefile (self.filelists, self.templateFiles)
+ dot = templateFile.find(".")
+ if dot == -1:
+ raise ValueError ("Invalid template file name %s" % templateFile)
+ className = templateFile[0:dot]
+ if className == "Makefile":
+ classType = Makefile
+ elif className == "CMakeLists":
+ classType = CMakeLists
+ else:
+ raise ValueError ("Invalid class name %s" % className)
+ makefile = classType (self.filelists, self.templateFiles, self.packagelist)
template = Template (self.input + templateFile, self)
+ if vars:
+ for arg in vars:
+ self.setVariable(arg, vars[arg])
self.templateFiles.append (templateFile)
stream = template.expand (makefile)
self.writeIfChanged (stream, target, force)
+
+ def getModulePath():
+ return __file__
+
+ getModulePath = staticmethod(getModulePath)
diff --git a/cpp/managementgen/qmfgen/management-types.xml b/cpp/managementgen/qmfgen/management-types.xml
new file mode 100644
index 0000000000..626880afb3
--- /dev/null
+++ b/cpp/managementgen/qmfgen/management-types.xml
@@ -0,0 +1,56 @@
+<schema-types>
+
+<!--
+ 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.
+-->
+
+<type name="objId" base="REF" cpp="::qpid::management::ObjectId" encode="#.encode(@)" decode="#.decode(@)" accessor="direct" init="::qpid::management::ObjectId()" byRef="y"/>
+<type name="uint8" base="U8" cpp="uint8_t" encode="@.putOctet(#)" decode="# = @.getOctet()" accessor="direct" init="0"/>
+<type name="uint16" base="U16" cpp="uint16_t" encode="@.putShort(#)" decode="# = @.getShort()" accessor="direct" init="0"/>
+<type name="uint32" base="U32" cpp="uint32_t" encode="@.putLong(#)" decode="# = @.getLong()" accessor="direct" init="0"/>
+<type name="uint64" base="U64" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" accessor="direct" init="0"/>
+<type name="int8" base="S8" cpp="int8_t" encode="@.putInt8(#)" decode="# = @.getInt8()" accessor="direct" init="0"/>
+<type name="int16" base="S16" cpp="int16_t" encode="@.putInt16(#)" decode="# = @.getInt16()" accessor="direct" init="0"/>
+<type name="int32" base="S32" cpp="int32_t" encode="@.putInt32(#)" decode="# = @.getInt32()" accessor="direct" init="0"/>
+<type name="int64" base="S64" cpp="int64_t" encode="@.putInt64(#)" decode="# = @.getInt64()" accessor="direct" init="0"/>
+<type name="bool" base="BOOL" cpp="uint8_t" encode="@.putOctet(#?1:0)" decode="# = @.getOctet()==1" accessor="direct" init="0"/>
+<type name="sstr" base="SSTR" cpp="std::string" encode="@.putShortString(#)" decode="@.getShortString(#)" accessor="direct" init='""' byRef="y"/>
+<type name="lstr" base="LSTR" cpp="std::string" encode="@.putMediumString(#)" decode="@.getMediumString(#)" accessor="direct" init='""' byRef="y"/>
+<type name="absTime" base="ABSTIME" cpp="int64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" accessor="direct" init="0"/>
+<type name="deltaTime" base="DELTATIME" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" accessor="direct" init="0"/>
+<type name="float" base="FLOAT" cpp="float" encode="@.putFloat(#)" decode="# = @.getFloat()" accessor="direct" init="0."/>
+<type name="double" base="DOUBLE" cpp="double" encode="@.putDouble(#)" decode="# = @.getDouble()" accessor="direct" init="0."/>
+<type name="uuid" base="UUID" cpp="::qpid::framing::Uuid" encode="#.encode(@)" decode="#.decode(@)" accessor="direct" init="::qpid::framing::Uuid()" byRef="y"/>
+<type name="map" base="FTABLE" cpp="::qpid::framing::FieldTable" encode="#.encode(@)" decode="#.decode(@)" accessor="direct" init="::qpid::framing::FieldTable()" byRef="y"/>
+
+<type name="hilo8" base="U8" cpp="uint8_t" encode="@.putOctet(#)" decode="# = @.getOctet()" style="wm" accessor="counter" init="0"/>
+<type name="hilo16" base="U16" cpp="uint16_t" encode="@.putShort(#)" decode="# = @.getShort()" style="wm" accessor="counter" init="0"/>
+<type name="hilo32" base="U32" cpp="uint32_t" encode="@.putLong(#)" decode="# = @.getLong()" style="wm" accessor="counter" init="0"/>
+<type name="hilo64" base="U64" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" style="wm" accessor="counter" init="0"/>
+
+<type name="count8" base="U8" cpp="uint8_t" encode="@.putOctet(#)" decode="# = @.getOctet()" accessor="counter" init="0" perThread="y"/>
+<type name="count16" base="U16" cpp="uint16_t" encode="@.putShort(#)" decode="# = @.getShort()" accessor="counter" init="0" perThread="y"/>
+<type name="count32" base="U32" cpp="uint32_t" encode="@.putLong(#)" decode="# = @.getLong()" accessor="counter" init="0" perThread="y"/>
+<type name="count64" base="U64" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" accessor="counter" init="0" perThread="y"/>
+
+<!-- Min/Max/Average statistics -->
+<type name="mma32" base="U32" cpp="uint32_t" encode="@.putLong(#)" decode="# = @.getLong()" style="mma" accessor="direct" init="0" perThread="y"/>
+<type name="mma64" base="U64" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" style="mma" accessor="direct" init="0" perThread="y"/>
+<type name="mmaTime" base="DELTATIME" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" style="mma" accessor="direct" init="0" perThread="y"/>
+
+</schema-types>
diff --git a/cpp/managementgen/schema.py b/cpp/managementgen/qmfgen/schema.py
index 2ee61fff80..3b53830c69 100755
--- a/cpp/managementgen/schema.py
+++ b/cpp/managementgen/qmfgen/schema.py
@@ -7,7 +7,7 @@
# "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
+# 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
@@ -21,6 +21,32 @@ from xml.dom.minidom import parse, parseString, Node
from cStringIO import StringIO
import md5
+class Hash:
+ """ Manage the hash of an XML sub-tree """
+ def __init__(self, node):
+ self.md5Sum = md5.new()
+ self._compute(node)
+
+ def addSubHash(self, hash):
+ """ Use this method to add the hash of a dependend-on XML fragment that is not in the sub-tree """
+ self.md5Sum.update(hash.getDigest())
+
+ def getDigest(self):
+ return self.md5Sum.digest()
+
+ def _compute(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._compute(child)
+
+
#=====================================================================================
#
#=====================================================================================
@@ -35,6 +61,7 @@ class SchemaType:
self.accessor = None
self.init = "0"
self.perThread = False
+ self.byRef = False
attrs = node.attributes
for idx in range (attrs.length):
@@ -69,6 +96,11 @@ class SchemaType:
raise ValueError ("Expected 'y' in perThread attribute")
self.perThread = True
+ elif key == 'byRef':
+ if val != 'y':
+ raise ValueError ("Expected 'y' in byRef attribute")
+ self.byRef = True
+
else:
raise ValueError ("Unknown attribute in type '%s'" % key)
@@ -76,10 +108,15 @@ class SchemaType:
self.encode == None or self.decode == None:
raise ValueError ("Missing required attribute(s) in type")
+ if self.byRef:
+ self.asArg = "const " + self.cpp + "&"
+ else:
+ self.asArg = self.cpp
+
def getName (self):
return self.name
- def genAccessor (self, stream, varName, changeFlag = None):
+ def genAccessor (self, stream, varName, changeFlag = None, optional = False):
if self.perThread:
prefix = "getThreadStats()->"
if self.style == "wm":
@@ -87,11 +124,13 @@ class SchemaType:
else:
prefix = ""
if self.accessor == "direct":
- stream.write (" inline void set_" + varName + " (" + self.cpp + " val){\n");
+ stream.write (" inline void set_" + varName + " (" + self.asArg + " val) {\n");
if not self.perThread:
- stream.write (" sys::Mutex::ScopedLock mutex(accessLock);\n")
+ stream.write (" ::qpid::sys::Mutex::ScopedLock mutex(accessLock);\n")
if self.style != "mma":
- stream.write (" " + prefix + varName + " = val;\n");
+ 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")
@@ -106,11 +145,26 @@ class SchemaType:
stream.write (" " + prefix + varName + "Max = val;\n")
if changeFlag != None:
stream.write (" " + changeFlag + " = true;\n")
- stream.write (" }\n");
+ stream.write (" }\n")
+ if self.style != "mma":
+ stream.write (" inline " + self.asArg + " get_" + varName + "() {\n");
+ if not self.perThread:
+ stream.write (" ::qpid::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");
+ stream.write (" inline void inc_" + varName + " (" + self.asArg + " by = 1) {\n");
if not self.perThread:
- stream.write (" sys::Mutex::ScopedLock mutex(accessLock);\n")
+ stream.write (" ::qpid::sys::Mutex::ScopedLock mutex(accessLock);\n")
stream.write (" " + prefix + varName + " += by;\n")
if self.style == "wm":
stream.write (" if (" + varName + "High < " + varName + ")\n")
@@ -118,9 +172,9 @@ class SchemaType:
if changeFlag != None:
stream.write (" " + changeFlag + " = true;\n")
stream.write (" }\n");
- stream.write (" inline void dec_" + varName + " (" + self.cpp + " by = 1){\n");
+ stream.write (" inline void dec_" + varName + " (" + self.asArg + " by = 1) {\n");
if not self.perThread:
- stream.write (" sys::Mutex::ScopedLock mutex(accessLock);\n")
+ stream.write (" ::qpid::sys::Mutex::ScopedLock mutex(accessLock);\n")
stream.write (" " + prefix + varName + " -= by;\n")
if self.style == "wm":
stream.write (" if (" + varName + "Low > " + varName + ")\n")
@@ -146,22 +200,22 @@ class SchemaType:
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):
+ def genWrite (self, stream, varName, indent=" "):
if self.style != "mma":
- stream.write (" " + self.encode.replace ("@", "buf").replace ("#", varName) + ";\n")
+ stream.write (indent + self.encode.replace ("@", "buf").replace ("#", varName) + ";\n")
if self.style == "wm":
- stream.write (" " + self.encode.replace ("@", "buf") \
+ stream.write (indent + self.encode.replace ("@", "buf") \
.replace ("#", varName + "High") + ";\n")
- stream.write (" " + self.encode.replace ("@", "buf") \
+ stream.write (indent + self.encode.replace ("@", "buf") \
.replace ("#", varName + "Low") + ";\n")
if self.style == "mma":
- stream.write (" " + self.encode.replace ("@", "buf") \
+ stream.write (indent + self.encode.replace ("@", "buf") \
.replace ("#", varName + "Count") + ";\n")
- stream.write (" " + self.encode.replace ("@", "buf") \
+ stream.write (indent + self.encode.replace ("@", "buf") \
.replace ("#", varName + "Count ? " + varName + "Min : 0") + ";\n")
- stream.write (" " + self.encode.replace ("@", "buf") \
+ stream.write (indent + self.encode.replace ("@", "buf") \
.replace ("#", varName + "Max") + ";\n")
- stream.write (" " + self.encode.replace ("@", "buf") \
+ stream.write (indent + self.encode.replace ("@", "buf") \
.replace ("#", varName + "Count ? " + varName + "Total / " +
varName + "Count : 0") + ";\n")
@@ -207,7 +261,7 @@ class Type:
#=====================================================================================
#
#=====================================================================================
-class SchemaConfig:
+class SchemaProperty:
def __init__ (self, node, typespec):
self.name = None
self.type = None
@@ -216,6 +270,7 @@ class SchemaConfig:
self.isIndex = 0
self.isParentRef = 0
self.isGeneralRef = 0
+ self.isOptional = 0
self.unit = None
self.min = None
self.max = None
@@ -255,6 +310,11 @@ class SchemaConfig:
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
@@ -273,6 +333,9 @@ class SchemaConfig:
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:
@@ -289,18 +352,23 @@ class SchemaConfig:
def genDeclaration (self, stream, prefix=" "):
stream.write (prefix + self.type.type.cpp + " " + self.name + ";\n")
- def genFormalParam (self, stream):
- stream.write (self.type.type.cpp + " _" + self.name)
+ def genFormalParam (self, stream, variables):
+ stream.write (self.type.type.asArg + " _" + self.name)
def genAccessor (self, stream):
- self.type.type.genAccessor (stream, self.name, "configChanged")
+ self.type.type.genAccessor (stream, self.name, "configChanged", self.isOptional == 1)
+
+ def genInitialize (self, stream, prefix="", indent=" "):
+ val = self.type.type.init
+ stream.write (indent + prefix + self.name + " = " + val + ";\n")
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.clear();\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 (IS_INDEX, " + str (self.isIndex) + ");\n")
+ stream.write (" ft.setInt (IS_OPTIONAL, " + str (self.isOptional) + ");\n")
if self.unit != None:
stream.write (" ft.setString (UNIT, \"" + self.unit + "\");\n")
if self.min != None:
@@ -314,13 +382,19 @@ class SchemaConfig:
stream.write (" buf.put (ft);\n\n")
def genWrite (self, stream):
- self.type.type.genWrite (stream, self.name)
+ 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 SchemaInst:
+class SchemaStatistic:
def __init__ (self, node, typespec):
self.name = None
self.type = None
@@ -380,7 +454,7 @@ class SchemaInst:
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.clear();\n")
stream.write (" ft.setString (NAME, \"" + name + "\");\n")
stream.write (" ft.setInt (TYPE, TYPE_" + self.type.type.base +");\n")
if self.unit != None:
@@ -477,6 +551,7 @@ class SchemaArg:
self.maxLen = None
self.desc = None
self.default = None
+ self.hash = Hash(node)
attrs = node.attributes
for idx in range (attrs.length):
@@ -523,25 +598,30 @@ class SchemaArg:
def getDir (self):
return self.dir
- def genSchema (self, stream):
- stream.write (" ft = FieldTable ();\n")
+ def genSchema (self, stream, event=False):
+ stream.write (" ft.clear();\n")
stream.write (" ft.setString (NAME, \"" + self.name + "\");\n")
stream.write (" ft.setInt (TYPE, TYPE_" + self.type.type.base +");\n")
- stream.write (" ft.setString (DIR, \"" + self.dir + "\");\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 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 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")
- if self.default != None:
- stream.write (" ft.setString (DEFAULT, \"" + self.default + "\");\n")
stream.write (" buf.put (ft);\n\n")
+ def genFormalParam (self, stream, variables):
+ stream.write ("%s _%s" % (self.type.type.asArg, self.name))
+
#=====================================================================================
#
#=====================================================================================
@@ -593,14 +673,23 @@ class SchemaMethod:
def genNameCamel (self, stream, variables):
stream.write (self.getFullName ())
+ def genOpenNamespaces (self, stream, variables):
+ self.parent.genOpenNamespaces(stream, variables)
+
+ def genCloseNamespaces (self, stream, variables):
+ self.parent.genCloseNamespaces(stream, variables)
+
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 genNamePackageLower (self, stream, variables):
+ self.parent.genNamePackageLower(stream, variables)
+
def genSchema (self, stream, variables):
- stream.write (" ft = FieldTable ();\n")
+ stream.write (" ft.clear();\n")
stream.write (" ft.setString (NAME, \"" + self.name + "\");\n")
stream.write (" ft.setInt (ARGCOUNT, " + str (len (self.args)) + ");\n")
if self.desc != None:
@@ -613,11 +702,13 @@ class SchemaMethod:
#
#=====================================================================================
class SchemaEvent:
- def __init__ (self, parent, node, typespec):
- self.parent = parent
- self.name = None
- self.desc = None
- self.args = []
+ def __init__ (self, package, node, typespec, argset):
+ self.packageName = package
+ self.name = None
+ self.desc = None
+ self.sevText = "inform"
+ self.args = []
+ self.hash = Hash(node)
attrs = node.attributes
for idx in range (attrs.length):
@@ -629,26 +720,117 @@ class SchemaEvent:
elif key == 'desc':
self.desc = val
+ elif key == 'sev':
+ self.sevText = val
+
+ elif key == 'args':
+ list = val.replace(" ", "").split(",")
+ for item in list:
+ if item not in argset.args:
+ raise Exception("undefined argument '%s' in event" % item)
+ self.args.append(argset.args[item])
+ self.hash.addSubHash(argset.args[item].hash)
+
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)
+ if self.sevText == "emerg" : self.sev = 0
+ elif self.sevText == "alert" : self.sev = 1
+ elif self.sevText == "crit" : self.sev = 2
+ elif self.sevText == "error" : self.sev = 3
+ elif self.sevText == "warn" : self.sev = 4
+ elif self.sevText == "notice" : self.sev = 5
+ elif self.sevText == "inform" : self.sev = 6
+ elif self.sevText == "debug" : self.sev = 7
+ else:
+ raise ValueError("Unknown severity '%s' in event '%s'" % (self.sevText, self.name))
def getName (self):
return self.name
+ def getNameCap(self):
+ return capitalize(self.name)
+
def getFullName (self):
- return capitalize(self.parent.getName()) + capitalize(self.name)
+ return capitalize(self.package + capitalize(self.name))
+
+ def genAgentHeaderLocation (self, stream, variables):
+ stream.write(variables["agentHeaderDir"])
def getArgCount (self):
return len (self.args)
+ def genArgCount (self, stream, variables):
+ stream.write("%d" % len(self.args))
+
+ def genArgDeclarations(self, stream, variables):
+ for arg in self.args:
+ if arg.type.type.byRef:
+ ref = "&"
+ else:
+ ref = ""
+ stream.write(" const %s%s %s;\n" % (arg.type.type.cpp, ref, arg.name))
+
+ def genCloseNamespaces (self, stream, variables):
+ for item in self.packageName.split("."):
+ stream.write ("}")
+
+ def genConstructorArgs(self, stream, variables):
+ pre = ""
+ for arg in self.args:
+ if arg.type.type.byRef:
+ ref = "&"
+ else:
+ ref = ""
+ stream.write("%sconst %s%s _%s" % (pre, arg.type.type.cpp, ref, arg.name))
+ pre = ",\n "
+
+ def genConstructorInits(self, stream, variables):
+ pre = ""
+ for arg in self.args:
+ stream.write("%s%s(_%s)" % (pre, arg.name, arg.name))
+ pre = ",\n "
+
+ def genName(self, stream, variables):
+ stream.write(self.name)
+
+ def genNameCap(self, stream, variables):
+ stream.write(capitalize(self.name))
+
+ def genNamespace (self, stream, variables):
+ stream.write("::".join(self.packageName.split(".")))
+
+ def genNameLower(self, stream, variables):
+ stream.write(self.name.lower())
+
+ def genNameUpper(self, stream, variables):
+ stream.write(self.name.upper())
+
+ def genNamePackageLower(self, stream, variables):
+ stream.write(self.packageName.lower())
+
+ def genOpenNamespaces (self, stream, variables):
+ for item in self.packageName.split("."):
+ stream.write ("namespace %s {\n" % item)
+
+ def genSeverity(self, stream, variables):
+ stream.write("%d" % self.sev)
+
+ def genArgEncodes(self, stream, variables):
+ for arg in self.args:
+ 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)
+
+ def genSchemaMD5(self, stream, variables):
+ sum = self.hash.getDigest()
+ for idx in range (len (sum)):
+ if idx != 0:
+ stream.write (",")
+ stream.write (hex (ord (sum[idx])))
+
class SchemaClass:
def __init__ (self, package, node, typespec, fragments, options):
@@ -658,9 +840,7 @@ class SchemaClass:
self.methods = []
self.events = []
self.options = options
- self.md5Sum = md5.new ()
-
- self.hash (node)
+ self.hash = Hash(node)
attrs = node.attributes
self.name = makeValidCppSymbol(attrs['name'].nodeValue)
@@ -669,21 +849,17 @@ class SchemaClass:
for child in children:
if child.nodeType == Node.ELEMENT_NODE:
if child.nodeName == 'property':
- sub = SchemaConfig (child, typespec)
+ sub = SchemaProperty (child, typespec)
self.properties.append (sub)
elif child.nodeName == 'statistic':
- sub = SchemaInst (child, typespec)
+ 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)
@@ -710,24 +886,12 @@ class SchemaClass:
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())
+ self.hash.addSubHash(fragment.hash)
for config in fragment.properties:
self.properties.append (config)
for inst in fragment.statistics:
@@ -758,6 +922,12 @@ class SchemaClass:
# 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:
@@ -787,6 +957,13 @@ class SchemaClass:
if inst.assign == None:
inst.genAccessor (stream)
+ def genAgentHeaderLocation (self, stream, variables):
+ stream.write(variables["agentHeaderDir"])
+
+ def genCloseNamespaces (self, stream, variables):
+ for item in self.packageName.split("."):
+ stream.write ("}")
+
def genConfigCount (self, stream, variables):
stream.write ("%d" % len (self.properties))
@@ -794,17 +971,13 @@ class SchemaClass:
for element in self.properties:
element.genDeclaration (stream)
- def genConfigElementSchema (self, stream, variables):
- for config in self.properties:
- config.genSchema (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)
+ element.genFormalParam (stream, variables)
def genConstructorInits (self, stream, variables):
for element in self.properties:
@@ -821,18 +994,12 @@ class SchemaClass:
inArgCount = inArgCount + 1
if methodCount == 0:
- stream.write ("string, Buffer&, Buffer& outBuf")
+ stream.write ("string&, Buffer&, Buffer& outBuf")
else:
if inArgCount == 0:
- stream.write ("string methodName, Buffer&, Buffer& outBuf")
+ 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 genEventSchema (self, stream, variables):
- pass ###########################################################################
+ stream.write ("string& methodName, Buffer& inBuf, Buffer& outBuf")
def genHiLoStatResets (self, stream, variables):
for inst in self.statistics:
@@ -845,6 +1012,9 @@ class SchemaClass:
inst.genPerThreadHiLoStatResets (stream)
def genInitializeElements (self, stream, variables):
+ for prop in self.properties:
+ if not prop.isConstructorArg() and not prop.isParentRef:
+ prop.genInitialize(stream)
for inst in self.statistics:
if not inst.type.type.perThread:
inst.genInitialize (stream)
@@ -884,9 +1054,8 @@ class SchemaClass:
if element.type.type.perThread:
element.genDeclaration (stream, " ")
- def genInstElementSchema (self, stream, variables):
- for inst in self.statistics:
- inst.genSchema (stream)
+ def genNamespace (self, stream, variables):
+ stream.write("::".join(self.packageName.split(".")))
def genMethodArgIncludes (self, stream, variables):
for method in self.methods:
@@ -898,9 +1067,9 @@ class SchemaClass:
def genMethodHandlers (self, stream, variables):
for method in self.methods:
- stream.write ("\n if (methodName == \"" + method.getName () + "\")\n {\n")
+ stream.write ("\n if (methodName == \"" + method.getName () + "\") {\n")
if method.getArgCount () == 0:
- stream.write (" ArgsNone ioArgs;\n")
+ stream.write (" ::qpid::management::ArgsNone ioArgs;\n")
else:
stream.write (" Args" + method.getFullName () + " ioArgs;\n")
for arg in method.args:
@@ -911,9 +1080,9 @@ class SchemaClass:
arg.name, "inBuf") + ";\n")
stream.write (" status = coreObject->ManagementMethod (METHOD_" +\
- method.getName().upper() + ", ioArgs);\n")
+ method.getName().upper() + ", ioArgs, text);\n")
stream.write (" outBuf.putLong (status);\n")
- stream.write (" outBuf.putShortString (Manageable::StatusText (status));\n")
+ stream.write (" outBuf.putMediumString(::qpid::management::Manageable::StatusText (status, text));\n")
for arg in method.args:
if arg.getDir () == "O" or arg.getDir () == "IO":
stream.write (" " +\
@@ -922,10 +1091,40 @@ class SchemaClass:
arg.name, "outBuf") + ";\n")
stream.write (" return;\n }\n")
+ def genOpenNamespaces (self, stream, variables):
+ for item in self.packageName.split("."):
+ stream.write ("namespace %s {\n" % item)
+
+ 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(uint64_t objectId) { " + prop.name + " = objectId; }\n")
+ stream.write ("void setReference(::qpid::management::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
@@ -956,7 +1155,7 @@ class SchemaClass:
def genParentArg (self, stream, variables):
for config in self.properties:
if config.isParentRef == 1:
- stream.write (", Manageable* _parent")
+ stream.write (", ::qpid::management::Manageable* _parent")
return
def genParentRefAssignment (self, stream, variables):
@@ -967,7 +1166,7 @@ class SchemaClass:
return
def genSchemaMD5 (self, stream, variables):
- sum = self.md5Sum.digest ()
+ sum = self.hash.getDigest()
for idx in range (len (sum)):
if idx != 0:
stream.write (",")
@@ -983,29 +1182,47 @@ class SchemaClass:
if inst.type.type.perThread:
inst.genAssign (stream)
- def genWriteConfig (self, stream, variables):
- for config in self.properties:
- config.genWrite (stream)
+ def genWriteProperties (self, stream, variables):
+ for prop in self.properties:
+ prop.genWrite (stream)
- def genWriteInst (self, stream, variables):
- for inst in self.statistics:
- inst.genWrite (stream)
+ def genWriteStatistics (self, stream, variables):
+ for stat in self.statistics:
+ stat.genWrite (stream)
+class SchemaEventArgs:
+ def __init__(self, package, node, typespec, fragments, options):
+ self.packageName = package
+ self.options = options
+ self.args = {}
-class PackageSchema:
+ children = node.childNodes
+ for child in children:
+ if child.nodeType == Node.ELEMENT_NODE:
+ if child.nodeName == 'arg':
+ arg = SchemaArg(child, typespec)
+ self.args[arg.name] = arg
+ else:
+ raise Exception("Unknown tag '%s' in <eventArguments>" % child.nodeName)
+
+class SchemaPackage:
def __init__ (self, typefile, schemafile, options):
self.classes = []
self.fragments = []
self.typespec = TypeSpec (typefile)
+ self.eventArgSet = None
+ self.events = []
dom = parse (schemafile)
document = dom.documentElement
if document.tagName != 'schema':
raise ValueError ("Expected 'schema' node")
attrs = document.attributes
- self.packageName = makeValidCppSymbol(attrs['package'].nodeValue)
+ pname = attrs['package'].nodeValue
+ namelist = pname.split('.')
+ self.packageName = ".".join(namelist)
children = document.childNodes
for child in children:
@@ -1020,6 +1237,15 @@ class PackageSchema:
self.fragments, options)
self.fragments.append (cls)
+ elif child.nodeName == 'eventArguments':
+ if self.eventArgSet:
+ raise Exception("Only one <eventArguments> may appear in a package")
+ self.eventArgSet = SchemaEventArgs(self.packageName, child, self.typespec, self.fragments, options)
+
+ elif child.nodeName == 'event':
+ event = SchemaEvent(self.packageName, child, self.typespec, self.eventArgSet)
+ self.events.append(event)
+
else:
raise ValueError ("Unknown schema tag '%s'" % child.nodeName)
@@ -1029,32 +1255,55 @@ class PackageSchema:
def getPackageNameCap (self):
return capitalize(self.packageName)
+ def getPackageNameLower (self):
+ return self.packageName.lower()
+
def getClasses (self):
return self.classes
+ def getEvents(self):
+ return self.events
+
+ def genAgentHeaderLocation (self, stream, variables):
+ stream.write(variables["agentHeaderDir"])
+
+ def genCloseNamespaces (self, stream, variables):
+ for item in self.packageName.split("."):
+ stream.write ("}")
+
+ def genNamespace (self, stream, variables):
+ stream.write("::".join(self.packageName.split(".")))
+
+ def genOpenNamespaces (self, stream, variables):
+ for item in self.packageName.split("."):
+ stream.write ("namespace %s {\n" % item)
+
def genPackageNameUpper (self, stream, variables):
- stream.write (self.packageName.upper ())
+ up = "_".join(self.packageName.split("."))
+ stream.write (up.upper())
- def genPackageNameCap (self, stream, variables):
- stream.write (self.getPackageNameCap ())
+ def genNamePackageLower (self, stream, variables):
+ stream.write (self.packageName.lower ())
def genClassIncludes (self, stream, variables):
for _class in self.classes:
stream.write ("#include \"")
_class.genNameCap (stream, variables)
stream.write (".h\"\n")
+ for _event in self.events:
+ stream.write ("#include \"Event")
+ _event.genNameCap(stream, variables)
+ stream.write (".h\"\n")
- def genClassRegisters (self, stream, variables):
+ def genClassRegisters(self, stream, variables):
for _class in self.classes:
- stream.write ("agent->RegisterClass (")
- _class.genNameCap (stream, variables)
- stream.write ("::packageName, ")
- _class.genNameCap (stream, variables)
- stream.write ("::className, ")
- _class.genNameCap (stream, variables)
- stream.write ("::md5Sum, ")
- _class.genNameCap (stream, variables)
- stream.write ("::writeSchema);\n")
+ stream.write(" ")
+ _class.genNameCap(stream, variables)
+ stream.write("::registerSelf(agent);\n")
+ for _event in self.events:
+ stream.write(" Event")
+ _event.genNameCap(stream, variables)
+ stream.write("::registerSelf(agent);\n")
#=====================================================================================
diff --git a/cpp/managementgen/templates/Args.h b/cpp/managementgen/qmfgen/templates/Args.h
index 576d891a3f..074ccf9940 100644
--- a/cpp/managementgen/templates/Args.h
+++ b/cpp/managementgen/qmfgen/templates/Args.h
@@ -24,17 +24,19 @@
/*MGEN:Root.Disclaimer*/
#include "qpid/management/Args.h"
+#include "qpid/framing/FieldTable.h"
+#include "qpid/framing/Uuid.h"
#include <string>
-namespace qpid {
-namespace management {
+namespace qmf {
+/*MGEN:Method.OpenNamespaces*/
-class Args/*MGEN:Method.NameCamel*/ : public Args
+ class Args/*MGEN:Method.NameCamel*/ : public ::qpid::management::Args
{
public:
/*MGEN:Method.Arguments*/
};
-}}
+}/*MGEN:Method.CloseNamespaces*/
#endif /*!_ARGS_/*MGEN:Method.NameUpper*/_*/
diff --git a/cpp/managementgen/qmfgen/templates/CMakeLists.cmake b/cpp/managementgen/qmfgen/templates/CMakeLists.cmake
new file mode 100644
index 0000000000..54f446a437
--- /dev/null
+++ b/cpp/managementgen/qmfgen/templates/CMakeLists.cmake
@@ -0,0 +1,39 @@
+#
+# 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.
+#
+/*MGEN:commentPrefix=#*/
+/*MGEN:Root.Disclaimer*/
+/*MGEN:IF(CMakeLists.QpidBroker)*/
+/*MGEN:mgenDir=${mgen_dir}*/
+/*MGEN:specDir=${qpid-cpp_SOURCE_DIR}/../specs*/
+
+set(mgen_generator /*MGEN:CMakeLists.GenSources*/)
+
+set(mgen_broker_cpp /*MGEN:CMakeLists.GenCppFiles*/)
+
+# Header file install rules.
+#/*MGEN:CMakeLists.HeaderInstalls*/
+#if GENERATE
+#$(srcdir)/managementgen.mk: $(mgen_generator)
+# $(mgen_cmd)
+#
+#$(mgen_generator):
+#endif
+#/*MGEN:ENDIF*/
+
+set(qmfgen_sources /*MGEN:CMakeLists.GeneratedFiles*/)
diff --git a/cpp/managementgen/templates/Class.cpp b/cpp/managementgen/qmfgen/templates/Class.cpp
index 289427d742..973d92586a 100644
--- a/cpp/managementgen/templates/Class.cpp
+++ b/cpp/managementgen/qmfgen/templates/Class.cpp
@@ -23,13 +23,16 @@
#include "qpid/log/Statement.h"
#include "qpid/framing/FieldTable.h"
#include "qpid/management/Manageable.h"
-#include "qpid/agent/ManagementAgent.h"
+#include "qpid//*MGEN:Class.AgentHeaderLocation*//ManagementAgent.h"
#include "/*MGEN:Class.NameCap*/.h"
/*MGEN:Class.MethodArgIncludes*/
-using namespace qpid::management;
-using namespace qpid::sys;
+using namespace qmf::/*MGEN:Class.Namespace*/;
using namespace qpid::framing;
+using qpid::management::ManagementAgent;
+using qpid::management::Manageable;
+using qpid::management::ManagementObject;
+using qpid::management::Args;
using std::string;
string /*MGEN:Class.NameCap*/::packageName = string ("/*MGEN:Class.NamePackageLower*/");
@@ -37,13 +40,17 @@ string /*MGEN:Class.NameCap*/::className = string ("/*MGEN:Class.NameLower*/
uint8_t /*MGEN:Class.NameCap*/::md5Sum[16] =
{/*MGEN:Class.SchemaMD5*/};
-/*MGEN:Class.NameCap*/::/*MGEN:Class.NameCap*/ (ManagementAgent* _agent, Manageable* _core/*MGEN:Class.ParentArg*//*MGEN:Class.ConstructorArgs*/) :
- ManagementObject(_agent, _core)/*MGEN:Class.ConstructorInits*/
+/*MGEN:Class.NameCap*/::/*MGEN:Class.NameCap*/ (ManagementAgent*, Manageable* _core/*MGEN:Class.ParentArg*//*MGEN:Class.ConstructorArgs*/) :
+ ManagementObject(_core)/*MGEN:Class.ConstructorInits*/
{
/*MGEN:Class.ParentRefAssignment*/
/*MGEN:Class.InitializeElements*/
+/*MGEN:IF(Class.ExistOptionals)*/
+ // Optional properties start out not-present
+ for (uint8_t idx = 0; idx < /*MGEN:Class.PresenceMaskBytes*/; idx++)
+ presenceMask[idx] = 0;
+/*MGEN:ENDIF*/
/*MGEN:IF(Class.ExistPerThreadStats)*/
- maxThreads = agent->getMaxThreads();
perThreadStatsArray = new struct PerThreadStats*[maxThreads];
for (int idx = 0; idx < maxThreads; idx++)
perThreadStatsArray[idx] = 0;
@@ -64,7 +71,8 @@ namespace {
const string NAME("name");
const string TYPE("type");
const string ACCESS("access");
- const string INDEX("index");
+ const string IS_INDEX("index");
+ const string IS_OPTIONAL("optional");
const string UNIT("unit");
const string MIN("min");
const string MAX("max");
@@ -76,27 +84,30 @@ namespace {
const string DEFAULT("default");
}
+void /*MGEN:Class.NameCap*/::registerSelf(ManagementAgent* agent)
+{
+ agent->registerClass(packageName, className, md5Sum, writeSchema);
+}
+
void /*MGEN:Class.NameCap*/::writeSchema (Buffer& buf)
{
FieldTable ft;
// Schema class header:
+ buf.putOctet (CLASS_KIND_TABLE);
buf.putShortString (packageName); // Package Name
buf.putShortString (className); // Class Name
buf.putBin128 (md5Sum); // Schema Hash
buf.putShort (/*MGEN:Class.ConfigCount*/); // Config Element Count
buf.putShort (/*MGEN:Class.InstCount*/); // Inst Element Count
buf.putShort (/*MGEN:Class.MethodCount*/); // Method Count
- buf.putShort (/*MGEN:Class.EventCount*/); // Event Count
// Properties
-/*MGEN:Class.ConfigElementSchema*/
+/*MGEN:Class.PropertySchema*/
// Statistics
-/*MGEN:Class.InstElementSchema*/
+/*MGEN:Class.StatisticSchema*/
// Methods
/*MGEN:Class.MethodSchema*/
- // Events
-/*MGEN:Class.EventSchema*/
}
/*MGEN:IF(Class.ExistPerThreadStats)*/
@@ -114,16 +125,20 @@ void /*MGEN:Class.NameCap*/::aggregatePerThreadStats(struct PerThreadStats* tota
void /*MGEN:Class.NameCap*/::writeProperties (Buffer& buf)
{
- sys::Mutex::ScopedLock mutex(accessLock);
+ ::qpid::sys::Mutex::ScopedLock mutex(accessLock);
configChanged = false;
writeTimestamps (buf);
-/*MGEN:Class.WriteConfig*/
+/*MGEN:IF(Class.ExistOptionals)*/
+ for (uint8_t idx = 0; idx < /*MGEN:Class.PresenceMaskBytes*/; idx++)
+ buf.putOctet(presenceMask[idx]);
+/*MGEN:ENDIF*/
+/*MGEN:Class.WriteProperties*/
}
void /*MGEN:Class.NameCap*/::writeStatistics (Buffer& buf, bool skipHeaders)
{
- sys::Mutex::ScopedLock mutex(accessLock);
+ ::qpid::sys::Mutex::ScopedLock mutex(accessLock);
instChanged = false;
/*MGEN:IF(Class.ExistPerThreadAssign)*/
for (int idx = 0; idx < maxThreads; idx++) {
@@ -140,7 +155,7 @@ void /*MGEN:Class.NameCap*/::writeStatistics (Buffer& buf, bool skipHeaders)
/*MGEN:Class.Assign*/
if (!skipHeaders)
writeTimestamps (buf);
-/*MGEN:Class.WriteInst*/
+/*MGEN:Class.WriteStatistics*/
// Maintenance of hi-lo statistics
/*MGEN:Class.HiLoStatResets*/
@@ -157,8 +172,9 @@ void /*MGEN:Class.NameCap*/::writeStatistics (Buffer& buf, bool skipHeaders)
void /*MGEN:Class.NameCap*/::doMethod (/*MGEN:Class.DoMethodArgs*/)
{
Manageable::status_t status = Manageable::STATUS_UNKNOWN_METHOD;
+ std::string text;
+
/*MGEN:Class.MethodHandlers*/
- outBuf.putLong (status);
- outBuf.putShortString (Manageable::StatusText (status));
+ outBuf.putLong(status);
+ outBuf.putShortString(Manageable::StatusText(status, text));
}
-
diff --git a/cpp/managementgen/templates/Class.h b/cpp/managementgen/qmfgen/templates/Class.h
index fac63d5d55..225090f0a9 100644
--- a/cpp/managementgen/templates/Class.h
+++ b/cpp/managementgen/qmfgen/templates/Class.h
@@ -28,15 +28,25 @@
#include "qpid/framing/Uuid.h"
namespace qpid {
-namespace management {
+ namespace management {
+ class ManagementAgent;
+ }
+}
+
+namespace qmf {
+/*MGEN:Class.OpenNamespaces*/
-class /*MGEN:Class.NameCap*/ : public ManagementObject
+class /*MGEN:Class.NameCap*/ : public ::qpid::management::ManagementObject
{
private:
static std::string packageName;
static std::string className;
static uint8_t md5Sum[16];
+/*MGEN:IF(Class.ExistOptionals)*/
+ uint8_t presenceMask[/*MGEN:Class.PresenceMaskBytes*/];
+/*MGEN:Class.PresenceMaskConstants*/
+/*MGEN:ENDIF*/
// Properties
/*MGEN:Class.ConfigDeclarations*/
@@ -51,11 +61,11 @@ class /*MGEN:Class.NameCap*/ : public ManagementObject
struct PerThreadStats** perThreadStatsArray;
inline struct PerThreadStats* getThreadStats() {
- int index = getThreadIndex();
- struct PerThreadStats* threadStats = perThreadStatsArray[index];
+ int idx = getThreadIndex();
+ struct PerThreadStats* threadStats = perThreadStatsArray[idx];
if (threadStats == 0) {
threadStats = new(PerThreadStats);
- perThreadStatsArray[index] = threadStats;
+ perThreadStatsArray[idx] = threadStats;
/*MGEN:Class.InitializePerThreadElements*/
}
return threadStats;
@@ -64,31 +74,31 @@ class /*MGEN:Class.NameCap*/ : public ManagementObject
void aggregatePerThreadStats(struct PerThreadStats*);
/*MGEN:ENDIF*/
// Private Methods
- static void writeSchema (qpid::framing::Buffer& buf);
- void writeProperties (qpid::framing::Buffer& buf);
- void writeStatistics (qpid::framing::Buffer& buf,
- bool skipHeaders = false);
- void doMethod (std::string methodName,
- qpid::framing::Buffer& inBuf,
- qpid::framing::Buffer& outBuf);
- writeSchemaCall_t getWriteSchemaCall(void) { return writeSchema; }
+ static void writeSchema(::qpid::framing::Buffer& buf);
+ void writeProperties(::qpid::framing::Buffer& buf);
+ void writeStatistics(::qpid::framing::Buffer& buf,
+ bool skipHeaders = false);
+ void doMethod(std::string& methodName,
+ ::qpid::framing::Buffer& inBuf,
+ ::qpid::framing::Buffer& outBuf);
+ writeSchemaCall_t getWriteSchemaCall() { return writeSchema; }
/*MGEN:IF(Class.NoStatistics)*/
// Stub for getInstChanged. There are no statistics in this class.
- bool getInstChanged (void) { return false; }
+ bool getInstChanged() { return false; }
+ bool hasInst() { return false; }
/*MGEN:ENDIF*/
public:
- friend class Package/*MGEN:Class.NamePackageCap*/;
-
- /*MGEN:Class.NameCap*/ (ManagementAgent* agent,
- Manageable* coreObject/*MGEN:Class.ParentArg*//*MGEN:Class.ConstructorArgs*/);
- ~/*MGEN:Class.NameCap*/ (void);
+ /*MGEN:Class.NameCap*/(::qpid::management::ManagementAgent* agent,
+ ::qpid::management::Manageable* coreObject/*MGEN:Class.ParentArg*//*MGEN:Class.ConstructorArgs*/);
+ ~/*MGEN:Class.NameCap*/();
/*MGEN:Class.SetGeneralReferenceDeclaration*/
- std::string& getPackageName (void) { return packageName; }
- std::string& getClassName (void) { return className; }
- uint8_t* getMd5Sum (void) { return md5Sum; }
+ static void registerSelf(::qpid::management::ManagementAgent* agent);
+ std::string& getPackageName() const { return packageName; }
+ std::string& getClassName() const { return className; }
+ uint8_t* getMd5Sum() const { return md5Sum; }
// Method IDs
/*MGEN:Class.MethodIdDeclarations*/
@@ -96,6 +106,6 @@ class /*MGEN:Class.NameCap*/ : public ManagementObject
/*MGEN:Class.AccessorMethods*/
};
-}}
+}/*MGEN:Class.CloseNamespaces*/
#endif /*!_MANAGEMENT_/*MGEN:Class.NameUpper*/_*/
diff --git a/cpp/managementgen/qmfgen/templates/Event.cpp b/cpp/managementgen/qmfgen/templates/Event.cpp
new file mode 100644
index 0000000000..a4fc28990d
--- /dev/null
+++ b/cpp/managementgen/qmfgen/templates/Event.cpp
@@ -0,0 +1,78 @@
+/*MGEN:commentPrefix=//*/
+//
+// 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.
+//
+
+/*MGEN:Root.Disclaimer*/
+
+#include "qpid/log/Statement.h"
+#include "qpid/framing/FieldTable.h"
+#include "qpid/management/Manageable.h"
+#include "qpid//*MGEN:Event.AgentHeaderLocation*//ManagementAgent.h"
+#include "Event/*MGEN:Event.NameCap*/.h"
+
+using namespace qmf::/*MGEN:Event.Namespace*/;
+using namespace qpid::framing;
+using qpid::management::ManagementAgent;
+using qpid::management::Manageable;
+using qpid::management::ManagementObject;
+using qpid::management::Args;
+using std::string;
+
+string Event/*MGEN:Event.NameCap*/::packageName = string ("/*MGEN:Event.NamePackageLower*/");
+string Event/*MGEN:Event.NameCap*/::eventName = string ("/*MGEN:Event.Name*/");
+uint8_t Event/*MGEN:Event.NameCap*/::md5Sum[16] =
+ {/*MGEN:Event.SchemaMD5*/};
+
+Event/*MGEN:Event.NameCap*/::Event/*MGEN:Event.NameCap*/ (/*MGEN:Event.ConstructorArgs*/) :
+ /*MGEN:Event.ConstructorInits*/
+{}
+
+namespace {
+ const string NAME("name");
+ const string TYPE("type");
+ const string DESC("desc");
+ const string ARGCOUNT("argCount");
+ const string ARGS("args");
+}
+
+void Event/*MGEN:Event.NameCap*/::registerSelf(ManagementAgent* agent)
+{
+ agent->registerEvent(packageName, eventName, md5Sum, writeSchema);
+}
+
+void Event/*MGEN:Event.NameCap*/::writeSchema (Buffer& buf)
+{
+ FieldTable ft;
+
+ // Schema class header:
+ buf.putOctet (CLASS_KIND_EVENT);
+ buf.putShortString (packageName); // Package Name
+ buf.putShortString (eventName); // Event Name
+ buf.putBin128 (md5Sum); // Schema Hash
+ buf.putOctet (0); // No Superclass
+ buf.putShort (/*MGEN:Event.ArgCount*/); // Argument Count
+
+ // Arguments
+/*MGEN:Event.ArgSchema*/
+}
+
+void Event/*MGEN:Event.NameCap*/::encode(::qpid::framing::Buffer& buf) const
+{
+/*MGEN:Event.ArgEncodes*/
+}
diff --git a/cpp/managementgen/qmfgen/templates/Event.h b/cpp/managementgen/qmfgen/templates/Event.h
new file mode 100644
index 0000000000..b5c2a211d1
--- /dev/null
+++ b/cpp/managementgen/qmfgen/templates/Event.h
@@ -0,0 +1,59 @@
+/*MGEN:commentPrefix=//*/
+#ifndef _MANAGEMENT_/*MGEN:Event.NameUpper*/_
+#define _MANAGEMENT_/*MGEN:Event.NameUpper*/_
+
+//
+// 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.
+//
+
+/*MGEN:Root.Disclaimer*/
+
+#include "qpid/management/ManagementEvent.h"
+#include "qpid/framing/FieldTable.h"
+#include "qpid/framing/Uuid.h"
+
+namespace qmf {
+/*MGEN:Event.OpenNamespaces*/
+
+class Event/*MGEN:Event.NameCap*/ : public ::qpid::management::ManagementEvent
+{
+ private:
+ static void writeSchema (::qpid::framing::Buffer& buf);
+ static std::string packageName;
+ static std::string eventName;
+ static uint8_t md5Sum[16];
+
+/*MGEN:Event.ArgDeclarations*/
+
+ public:
+ writeSchemaCall_t getWriteSchemaCall(void) { return writeSchema; }
+
+ Event/*MGEN:Event.NameCap*/(/*MGEN:Event.ConstructorArgs*/);
+ ~Event/*MGEN:Event.NameCap*/() {};
+
+ static void registerSelf(::qpid::management::ManagementAgent* agent);
+ std::string& getPackageName() const { return packageName; }
+ std::string& getEventName() const { return eventName; }
+ uint8_t* getMd5Sum() const { return md5Sum; }
+ uint8_t getSeverity() const { return /*MGEN:Event.Severity*/; }
+ void encode(::qpid::framing::Buffer& buffer) const;
+};
+
+}/*MGEN:Event.CloseNamespaces*/
+
+#endif /*!_MANAGEMENT_/*MGEN:Event.NameUpper*/_*/
diff --git a/cpp/managementgen/templates/Makefile.mk b/cpp/managementgen/qmfgen/templates/Makefile.mk
index 0e6454c13a..2b32c7c0f2 100644
--- a/cpp/managementgen/templates/Makefile.mk
+++ b/cpp/managementgen/qmfgen/templates/Makefile.mk
@@ -17,21 +17,24 @@
# under the License.
#
/*MGEN:commentPrefix=#*/
+/*MGEN:Root.Disclaimer*/
+/*MGEN:IF(Makefile.QpidBroker)*/
/*MGEN:mgenDir=$(mgen_dir)*/
/*MGEN:specDir=$(top_srcdir)/../specs*/
-/*MGEN:Root.Disclaimer*/
mgen_generator=/*MGEN:Makefile.GenSources*/
mgen_broker_cpp=/*MGEN:Makefile.GenCppFiles*/
# Header file install rules.
-qpid_managementdir = $(includedir)/qpid/management
-dist_qpid_management_HEADERS = /*MGEN:Makefile.GenHFiles*/
-
+/*MGEN:Makefile.HeaderInstalls*/
if GENERATE
$(srcdir)/managementgen.mk: $(mgen_generator)
$(mgen_cmd)
$(mgen_generator):
endif
+/*MGEN:ENDIF*/
+
+qmfgen_sources=/*MGEN:Makefile.GeneratedFiles*/
+
diff --git a/cpp/managementgen/templates/Package.cpp b/cpp/managementgen/qmfgen/templates/Package.cpp
index 15e7fc15ec..f6bd7f4654 100644
--- a/cpp/managementgen/templates/Package.cpp
+++ b/cpp/managementgen/qmfgen/templates/Package.cpp
@@ -20,12 +20,12 @@
/*MGEN:Root.Disclaimer*/
-#include "Package/*MGEN:Schema.PackageNameCap*/.h"
+#include "Package.h"
/*MGEN:Schema.ClassIncludes*/
-using namespace qpid::management;
+using namespace qmf::/*MGEN:Schema.Namespace*/;
-Package/*MGEN:Schema.PackageNameCap*/::Package/*MGEN:Schema.PackageNameCap*/ (ManagementAgent* agent)
+Package::Package (::qpid::management::ManagementAgent* agent)
{
/*MGEN:Schema.ClassRegisters*/
}
diff --git a/cpp/managementgen/templates/Package.h b/cpp/managementgen/qmfgen/templates/Package.h
index 3f3ac35ffc..569c7cfb33 100644
--- a/cpp/managementgen/templates/Package.h
+++ b/cpp/managementgen/qmfgen/templates/Package.h
@@ -23,19 +23,19 @@
/*MGEN:Root.Disclaimer*/
-#include "qpid/agent/ManagementAgent.h"
+#include "qpid//*MGEN:Class.AgentHeaderLocation*//ManagementAgent.h"
-namespace qpid {
-namespace management {
+namespace qmf {
+/*MGEN:Class.OpenNamespaces*/
-class Package/*MGEN:Schema.PackageNameCap*/
+class Package
{
public:
- Package/*MGEN:Schema.PackageNameCap*/ (ManagementAgent* agent);
- ~Package/*MGEN:Schema.PackageNameCap*/ () {}
+ Package (::qpid::management::ManagementAgent* agent);
+ ~Package () {}
};
-}}
+}/*MGEN:Class.CloseNamespaces*/
#endif /*!_MANAGEMENT_PACKAGE_/*MGEN:Schema.PackageNameUpper*/_*/