summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2010-12-15 04:53:10 +0000
committerTed Ross <tross@apache.org>2010-12-15 04:53:10 +0000
commit086fd98a8869bf141a525b30e9c0f33d71b2a655 (patch)
tree372997eadc2e903a99ddd0e7504337bbc67e697b
parentdfd13447e4e26c14ea8c71cd7bdbea886f4f7d4b (diff)
downloadqpid-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.am2
-rwxr-xr-xcpp/managementgen/qmf-gen24
-rwxr-xr-xcpp/managementgen/qmfgen/generate.py19
-rwxr-xr-xcpp/managementgen/qmfgen/schema.py139
-rw-r--r--cpp/managementgen/qmfgen/templates/V2Package.cpp37
-rw-r--r--cpp/managementgen/qmfgen/templates/V2Package.h44
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*/_*/