Author: tross
Date: Wed Dec 15 04:53:10 2010
New Revision: 1049425

URL: http://svn.apache.org/viewvc?rev=1049425&view=rev
Log:
Added an option to the qmf-gen tool to generate v2-style schema declarations.

Added:
    qpid/trunk/qpid/cpp/managementgen/qmfgen/templates/V2Package.cpp
    qpid/trunk/qpid/cpp/managementgen/qmfgen/templates/V2Package.h
Modified:
    qpid/trunk/qpid/cpp/managementgen/Makefile.am
    qpid/trunk/qpid/cpp/managementgen/qmf-gen
    qpid/trunk/qpid/cpp/managementgen/qmfgen/generate.py
    qpid/trunk/qpid/cpp/managementgen/qmfgen/schema.py

Modified: qpid/trunk/qpid/cpp/managementgen/Makefile.am
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/managementgen/Makefile.am?rev=1049425&r1=1049424&r2=1049425&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/managementgen/Makefile.am (original)
+++ qpid/trunk/qpid/cpp/managementgen/Makefile.am Wed Dec 15 04:53:10 2010
@@ -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

Modified: qpid/trunk/qpid/cpp/managementgen/qmf-gen
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/managementgen/qmf-gen?rev=1049425&r1=1049424&r2=1049425&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/managementgen/qmf-gen (original)
+++ qpid/trunk/qpid/cpp/managementgen/qmf-gen Wed Dec 15 04:53:10 2010
@@ -47,12 +47,15 @@ parser.add_option("-q", "--qpid-broker",
                   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 = {}

Modified: qpid/trunk/qpid/cpp/managementgen/qmfgen/generate.py
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/managementgen/qmfgen/generate.py?rev=1049425&r1=1049424&r2=1049425&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/managementgen/qmfgen/generate.py (original)
+++ qpid/trunk/qpid/cpp/managementgen/qmfgen/generate.py Wed Dec 15 04:53:10 
2010
@@ -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(".")

Modified: qpid/trunk/qpid/cpp/managementgen/qmfgen/schema.py
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/managementgen/qmfgen/schema.py?rev=1049425&r1=1049424&r2=1049425&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/managementgen/qmfgen/schema.py (original)
+++ qpid/trunk/qpid/cpp/managementgen/qmfgen/schema.py Wed Dec 15 04:53:10 2010
@@ -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

Added: qpid/trunk/qpid/cpp/managementgen/qmfgen/templates/V2Package.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/managementgen/qmfgen/templates/V2Package.cpp?rev=1049425&view=auto
==============================================================================
--- qpid/trunk/qpid/cpp/managementgen/qmfgen/templates/V2Package.cpp (added)
+++ qpid/trunk/qpid/cpp/managementgen/qmfgen/templates/V2Package.cpp Wed Dec 15 
04:53:10 2010
@@ -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*/
+}
+

Added: qpid/trunk/qpid/cpp/managementgen/qmfgen/templates/V2Package.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/managementgen/qmfgen/templates/V2Package.h?rev=1049425&view=auto
==============================================================================
--- qpid/trunk/qpid/cpp/managementgen/qmfgen/templates/V2Package.h (added)
+++ qpid/trunk/qpid/cpp/managementgen/qmfgen/templates/V2Package.h Wed Dec 15 
04:53:10 2010
@@ -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*/_*/



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:[email protected]

Reply via email to