diff options
| author | Rafael H. Schloming <rhs@apache.org> | 2009-12-26 12:42:57 +0000 |
|---|---|---|
| committer | Rafael H. Schloming <rhs@apache.org> | 2009-12-26 12:42:57 +0000 |
| commit | 248f1fe188fe2307b9dcf2c87a83b653eaa1920c (patch) | |
| tree | d5d0959a70218946ff72e107a6c106e32479a398 /cpp/managementgen | |
| parent | 3c83a0e3ec7cf4dc23e83a340b25f5fc1676f937 (diff) | |
| download | qpid-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.txt | 26 | ||||
| -rw-r--r-- | cpp/managementgen/Makefile.am | 61 | ||||
| -rwxr-xr-x | cpp/managementgen/main.py | 52 | ||||
| -rwxr-xr-x | cpp/managementgen/qmf-gen | 90 | ||||
| -rw-r--r-- | cpp/managementgen/qmfgen/__init__.py (renamed from cpp/managementgen/managementgen) | 9 | ||||
| -rwxr-xr-x | cpp/managementgen/qmfgen/generate.py (renamed from cpp/managementgen/generate.py) | 214 | ||||
| -rw-r--r-- | cpp/managementgen/qmfgen/management-types.xml | 56 | ||||
| -rwxr-xr-x | cpp/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.cmake | 39 | ||||
| -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.cpp | 78 | ||||
| -rw-r--r-- | cpp/managementgen/qmfgen/templates/Event.h | 59 | ||||
| -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*/_*/ |
