diff options
author | Ted Ross <tross@apache.org> | 2010-12-15 04:53:10 +0000 |
---|---|---|
committer | Ted Ross <tross@apache.org> | 2010-12-15 04:53:10 +0000 |
commit | 086fd98a8869bf141a525b30e9c0f33d71b2a655 (patch) | |
tree | 372997eadc2e903a99ddd0e7504337bbc67e697b | |
parent | dfd13447e4e26c14ea8c71cd7bdbea886f4f7d4b (diff) | |
download | qpid-python-086fd98a8869bf141a525b30e9c0f33d71b2a655.tar.gz |
Added an option to the qmf-gen tool to generate v2-style schema declarations.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1049425 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | cpp/managementgen/Makefile.am | 2 | ||||
-rwxr-xr-x | cpp/managementgen/qmf-gen | 24 | ||||
-rwxr-xr-x | cpp/managementgen/qmfgen/generate.py | 19 | ||||
-rwxr-xr-x | cpp/managementgen/qmfgen/schema.py | 139 | ||||
-rw-r--r-- | cpp/managementgen/qmfgen/templates/V2Package.cpp | 37 | ||||
-rw-r--r-- | cpp/managementgen/qmfgen/templates/V2Package.h | 44 |
6 files changed, 257 insertions, 8 deletions
diff --git a/cpp/managementgen/Makefile.am b/cpp/managementgen/Makefile.am index 7f85834093..6c2024ccaa 100644 --- a/cpp/managementgen/Makefile.am +++ b/cpp/managementgen/Makefile.am @@ -31,6 +31,8 @@ nobase_qmfpython_DATA = \ qmfgen/templates/Makefile.mk \ qmfgen/templates/Package.cpp \ qmfgen/templates/Package.h \ + qmfgen/templates/V2Package.cpp \ + qmfgen/templates/V2Package.h \ qmfgen/management-types.xml EXTRA_DIST = $(nobase_qmfpython_DATA) CMakeLists.txt diff --git a/cpp/managementgen/qmf-gen b/cpp/managementgen/qmf-gen index 667aa1ba2d..6e8f864256 100755 --- a/cpp/managementgen/qmf-gen +++ b/cpp/managementgen/qmf-gen @@ -47,12 +47,15 @@ parser.add_option("-q", "--qpid-broker", dest="qpidbroker", default=False, actio 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") +parser.add_option("-2", "--v2-style", dest="v2_style", default=False, action="store_true", + help="Generate code for use with the QMFv2 Agent API") (opts, args) = parser.parse_args() typefile = opts.typefile templatedir = opts.templatedir outdir = opts.outputdir +v2_style = opts.v2_style gen = Generator(outdir, templatedir) if len(args) == 0: @@ -70,14 +73,19 @@ else: 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) + gen.setPackage(package.packageName) + + if v2_style: + gen.makeV2PackageFile("V2Package.h", package, vars=vargs) + gen.makeV2PackageFile("V2Package.cpp", package, vars=vargs) + else: + 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 = {} diff --git a/cpp/managementgen/qmfgen/generate.py b/cpp/managementgen/qmfgen/generate.py index 8a00b69761..4e688e3bc7 100755 --- a/cpp/managementgen/qmfgen/generate.py +++ b/cpp/managementgen/qmfgen/generate.py @@ -346,6 +346,14 @@ class Generator: path = self.packagePath + "Package" + extension return path + def targetV2PackageFile (self, schema, templateFile): + dot = templateFile.find(".") + if dot == -1: + raise ValueError ("Invalid template file name %s" % templateFile) + extension = templateFile[dot:len (templateFile)] + path = self.packagePath + "QmfPackage" + extension + return path + def targetClassFile (self, _class, templateFile): dot = templateFile.find(".") if dot == -1: @@ -448,6 +456,17 @@ class Generator: stream = template.expand (schema) self.writeIfChanged (stream, target, force) + def makeV2PackageFile (self, templateFile, schema, force=False, vars=None): + """ Generate a QMFv2 package definition file """ + template = Template (self.input + templateFile, self) + if vars: + for arg in vars: + self.setVariable(arg, vars[arg]) + self.templateFiles.append (templateFile) + target = self.targetV2PackageFile (schema, templateFile) + stream = template.expand (schema) + self.writeIfChanged (stream, target, force) + def makeSingleFile (self, templateFile, target, force=False, vars=None): """ Generate a single expanded template """ dot = templateFile.find(".") diff --git a/cpp/managementgen/qmfgen/schema.py b/cpp/managementgen/qmfgen/schema.py index fdbc7c7be8..afdfe42639 100755 --- a/cpp/managementgen/qmfgen/schema.py +++ b/cpp/managementgen/qmfgen/schema.py @@ -1483,6 +1483,9 @@ class SchemaClass: for method in self.methods: method.genSchemaMap(stream, variables) + def genName (self, stream, variables): + stream.write (self.name) + def genNameCap (self, stream, variables): stream.write (capitalize(self.name)) @@ -1647,6 +1650,9 @@ class SchemaPackage: up = "_".join(self.packageName.split(".")) stream.write (up.upper()) + def genPackageName (self, stream, variables): + stream.write(self.packageName) + def genNamePackageLower (self, stream, variables): stream.write (self.packageName.lower ()) @@ -1670,6 +1676,139 @@ class SchemaPackage: _event.genNameCap(stream, variables) stream.write("::registerSelf(agent);\n") + def genV2ClassMembers(self, stream, variables): + for _class in self.classes: + stream.write(" ::qmf::Schema data_%s;\n" % _class.name) + for _event in self.events: + stream.write(" ::qmf::Schema event_%s;\n" % _event.name) + + def genV2ClassDefines(self, stream, variables): + for _class in self.classes: + stream.write("\n //\n // Data: %s\n //\n" % _class.name) + stream.write(" data_%s = qmf::Schema(SCHEMA_TYPE_DATA, package, \"%s\");\n" % (_class.name, _class.name)) + + for prop in _class.properties: + typeName, subType = self.qmfv2Type(prop.type) + access = self.qmfv2Access(prop.access) + stream.write(" {\n") + stream.write(" qmf::SchemaProperty prop(\"%s\", %s);\n" % (prop.name, typeName)) + if subType: + stream.write(" prop.setSubtype(\"%s\");\n" % subType) + stream.write(" prop.setAccess(%s);\n" % access) + if prop.isIndex == 1: + stream.write(" prop.setIndex(true);\n") + if prop.isOptional == 1: + stream.write(" prop.setOptional(true);\n") + if prop.unit: + stream.write(" prop.setUnit(\"%s\");\n" % prop.unit) + if prop.desc: + stream.write(" prop.setDesc(\"%s\");\n" % prop.desc) + stream.write(" data_%s.addProperty(prop);\n" % _class.name) + stream.write(" }\n\n") + + for stat in _class.statistics: + typeName, subType = self.qmfv2Type(stat.type) + stream.write(" {\n") + stream.write(" qmf::SchemaProperty prop(\"%s\", %s);\n" % (stat.name, typeName)) + if subType: + stream.write(" prop.setSubtype(\"%s\");\n" % subType) + if stat.unit: + stream.write(" prop.setUnit(\"%s\");\n" % stat.unit) + if stat.desc: + stream.write(" prop.setDesc(\"%s\");\n" % stat.desc) + stream.write(" data_%s.addProperty(prop);\n" % _class.name) + stream.write(" }\n\n") + + for method in _class.methods: + stream.write(" {\n") + stream.write(" qmf::SchemaMethod method(\"%s\");\n" % method.name) + if method.desc: + stream.write(" method.setDesc(\"%s\");\n" % method.desc) + + for arg in method.args: + typeName, subType = self.qmfv2Type(arg.type) + stream.write(" {\n") + stream.write(" qmf::SchemaProperty arg(\"%s\", %s);\n" % (arg.name, typeName)) + if subType: + stream.write(" arg.setSubtype(\"%s\");\n" % subType) + if stat.unit: + stream.write(" arg.setUnit(\"%s\");\n" % arg.unit) + if stat.desc: + stream.write(" arg.setDesc(\"%s\");\n" % arg.desc) + stream.write(" arg.setDirection(%s);\n" % self.qmfv2Dir(arg.dir)) + stream.write(" method.addArgument(arg);\n") + stream.write(" }\n\n") + + stream.write(" data_%s.addMethod(method);\n" % _class.name) + stream.write(" }\n\n") + + stream.write(" session.registerSchema(data_%s);\n" % _class.name) + + for _event in self.events: + stream.write("\n //\n // Event: %s\n //\n" % _event.name) + stream.write(" event_%s = qmf::Schema(SCHEMA_TYPE_EVENT, package, \"%s\");\n" % (_event.name, _event.name)) + stream.write(" event_%s.setDefaultSeverity(%s);\n" % (_event.name, self.qmfv2Severity(_event.sev))) + for prop in _event.args: + typeName, subType = self.qmfv2Type(prop.type) + stream.write(" {\n") + stream.write(" qmf::SchemaProperty prop(\"%s\", %s);\n" % (prop.name, typeName)) + if subType: + stream.write(" prop.setSubtype(\"%s\");\n" % subType) + if prop.unit: + stream.write(" prop.setUnit(\"%s\");\n" % prop.unit) + if prop.desc: + stream.write(" prop.setDesc(\"%s\");\n" % prop.desc) + stream.write(" event_%s.addProperty(prop);\n" % _event.name) + stream.write(" }\n\n") + + stream.write(" session.registerSchema(event_%s);\n" % _event.name) + + + def qmfv2Type(self, typecode): + base = typecode.type.base + if base == "REF" : return ("qmf::SCHEMA_DATA_MAP", "reference") + if base == "U8" : return ("qmf::SCHEMA_DATA_INT", None) + if base == "U16" : return ("qmf::SCHEMA_DATA_INT", None) + if base == "U32" : return ("qmf::SCHEMA_DATA_INT", None) + if base == "U64" : return ("qmf::SCHEMA_DATA_INT", None) + if base == "S8" : return ("qmf::SCHEMA_DATA_INT", None) + if base == "S16" : return ("qmf::SCHEMA_DATA_INT", None) + if base == "S32" : return ("qmf::SCHEMA_DATA_INT", None) + if base == "S64" : return ("qmf::SCHEMA_DATA_INT", None) + if base == "BOOL" : return ("qmf::SCHEMA_DATA_BOOL", None) + if base == "SSTR" : return ("qmf::SCHEMA_DATA_STRING", None) + if base == "LSTR" : return ("qmf::SCHEMA_DATA_STRING", None) + if base == "ABSTIME" : return ("qmf::SCHEMA_DATA_INT", "abstime") + if base == "DELTATIME" : return ("qmf::SCHEMA_DATA_INT", "deltatime") + if base == "FLOAT" : return ("qmf::SCHEMA_DATA_FLOAT", None) + if base == "DOUBLE" : return ("qmf::SCHEMA_DATA_FLOAT", None) + if base == "UUID" : return ("qmf::SCHEMA_DATA_UUID", None) + if base == "FTABLE" : return ("qmf::SCHEMA_DATA_MAP", None) + if base == "LIST" : return ("qmf::SCHEMA_DATA_LIST", None) + raise ValueError("Unknown base type %s" % base) + + def qmfv2Access(self, code): + if code == "RC": return "qmf::ACCESS_READ_CREATE" + if code == "RO": return "qmf::ACCESS_READ_ONLY" + if code == "RW": return "qmf::ACCESS_READ_WRITE" + raise ValueError("Unknown access type %s" % code) + + def qmfv2Dir(self, code): + if code == "I" : return "qmf::DIR_IN" + if code == "O" : return "qmf::DIR_OUT" + if code == "IO": return "qmf::DIR_IN_OUT" + raise ValueError("Unknown direction type %s" % code) + + def qmfv2Severity(self, code): + if code == 0 : return "qmf::SEV_EMERG" + if code == 1 : return "qmf::SEV_ALERT" + if code == 2 : return "qmf::SEV_CRIT" + if code == 3 : return "qmf::SEV_ERROR" + if code == 4 : return "qmf::SEV_WARN" + if code == 5 : return "qmf::SEV_NOTICE" + if code == 6 : return "qmf::SEV_INFORM" + if code == 7 : return "qmf::SEV_DEBUG" + raise ValueError("Out of Range Severity %d" % code) #===================================================================================== # Utility Functions diff --git a/cpp/managementgen/qmfgen/templates/V2Package.cpp b/cpp/managementgen/qmfgen/templates/V2Package.cpp new file mode 100644 index 0000000000..2c87805bdb --- /dev/null +++ b/cpp/managementgen/qmfgen/templates/V2Package.cpp @@ -0,0 +1,37 @@ +/*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 "QmfPackage.h" +#include <qmf/Schema.h> +#include <qmf/SchemaProperty.h> +#include <qmf/SchemaMethod.h> +#include <string> + +using namespace std; +using namespace qmf::/*MGEN:Schema.Namespace*/; + +PackageDefinition::PackageDefinition(::qmf::AgentSession& session) +{ + string package("/*MGEN:Schema.PackageName*/"); +/*MGEN:Schema.V2ClassDefines*/ +} + diff --git a/cpp/managementgen/qmfgen/templates/V2Package.h b/cpp/managementgen/qmfgen/templates/V2Package.h new file mode 100644 index 0000000000..663a69ac86 --- /dev/null +++ b/cpp/managementgen/qmfgen/templates/V2Package.h @@ -0,0 +1,44 @@ +/*MGEN:commentPrefix=//*/ +#ifndef _QMF_PACKAGE_/*MGEN:Schema.PackageNameUpper*/_ +#define _QMF_PACKAGE_/*MGEN:Schema.PackageNameUpper*/_ + +// +// 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 <qmf/AgentSession.h> +#include <qmf/Schema.h> + +namespace qmf { +/*MGEN:Class.OpenNamespaces*/ + +class PackageDefinition +{ + public: + PackageDefinition (::qmf::AgentSession& session); + ~PackageDefinition () {} + +/*MGEN:Schema.V2ClassMembers*/ +}; + +}/*MGEN:Class.CloseNamespaces*/ + + +#endif /*!_QMF_PACKAGE_/*MGEN:Schema.PackageNameUpper*/_*/ |