summaryrefslogtreecommitdiff
path: root/cpp/managementgen
diff options
context:
space:
mode:
authorCarl C. Trieloff <cctrieloff@apache.org>2008-02-28 18:55:21 +0000
committerCarl C. Trieloff <cctrieloff@apache.org>2008-02-28 18:55:21 +0000
commitac3f850123c903f00c163d6d2dbad22d98aec7a2 (patch)
tree2e622a3e9349a9062454d16bf4bca83a5a3e9d90 /cpp/managementgen
parent1820dd421a096ed184a08deee9512e809312fed2 (diff)
downloadqpid-python-ac3f850123c903f00c163d6d2dbad22d98aec7a2.tar.gz
QPID-820 from tross
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@632087 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/managementgen')
-rwxr-xr-xcpp/managementgen/main.py8
-rwxr-xr-xcpp/managementgen/schema.py85
-rw-r--r--cpp/managementgen/templates/Class.cpp31
-rw-r--r--cpp/managementgen/templates/Class.h19
4 files changed, 108 insertions, 35 deletions
diff --git a/cpp/managementgen/main.py b/cpp/managementgen/main.py
index de8ce4cbe6..677c7321ae 100755
--- a/cpp/managementgen/main.py
+++ b/cpp/managementgen/main.py
@@ -28,6 +28,9 @@ usage = "usage: %prog [options] schema-document type-document template-director
parser = OptionParser (usage=usage)
parser.add_option ("-m", "--makefile", dest="makefile", metavar="FILE",
help="Makefile fragment")
+parser.add_option ("-i", "--include-prefix", dest="include_prefix", metavar="PATH",
+ default="qpid/management/",
+ help="Prefix for #include of generated headers in generated source, default: qpid/management/")
(opts, args) = parser.parse_args ()
@@ -39,8 +42,11 @@ typefile = args[1]
templatedir = args[2]
outdir = args[3]
+if opts.include_prefix == ".":
+ opts.include_prefix = None
+
gen = Generator (outdir, templatedir)
-schema = PackageSchema (typefile, schemafile)
+schema = PackageSchema (typefile, schemafile, opts)
gen.makeClassFiles ("Class.h", schema)
gen.makeClassFiles ("Class.cpp", schema)
diff --git a/cpp/managementgen/schema.py b/cpp/managementgen/schema.py
index a459db7a47..fd76ba9112 100755
--- a/cpp/managementgen/schema.py
+++ b/cpp/managementgen/schema.py
@@ -21,6 +21,7 @@
from xml.dom.minidom import parse, parseString, Node
from cStringIO import StringIO
+import md5
#=====================================================================================
#
@@ -575,15 +576,18 @@ class SchemaEvent:
def getArgCount (self):
return len (self.args)
-#=====================================================================================
-#
-#=====================================================================================
+
class SchemaClass:
- def __init__ (self, node, typespec):
+ def __init__ (self, package, node, typespec, fragments, options):
+ self.packageName = package
self.configElements = []
self.instElements = []
self.methods = []
self.events = []
+ self.options = options
+ self.md5Sum = md5.new ()
+
+ self.hash (node)
attrs = node.attributes
self.name = attrs['name'].nodeValue
@@ -607,9 +611,40 @@ class SchemaClass:
sub = SchemaEvent (self, child, typespec)
self.events.append (sub)
+ elif child.nodeName == 'group':
+ self.expandFragment (child, fragments)
+
else:
raise ValueError ("Unknown class tag '%s'" % child.nodeName)
+ 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:
+ for config in fragment.configElements:
+ self.configElements.append (config)
+ for inst in fragment.instElements:
+ self.instElements.append (inst)
+ for method in fragment.methods:
+ self.methods.append (method)
+ for event in fragment.events:
+ self.events.append (event)
+ return
+ raise ValueError ("Undefined group '%s'" % name)
+
def getName (self):
return self.name
@@ -644,13 +679,9 @@ class SchemaClass:
def genConstructorArgs (self, stream, variables):
# Constructor args are config elements with read-create access
result = ""
- first = 1
for element in self.configElements:
if element.isConstructorArg ():
- if first == 1:
- first = 0
- else:
- stream.write (", ")
+ stream.write (", ")
element.genFormalParam (stream)
def genConstructorInits (self, stream, variables):
@@ -715,8 +746,8 @@ class SchemaClass:
def genMethodArgIncludes (self, stream, variables):
for method in self.methods:
if method.getArgCount () > 0:
- stream.write ("#include \"qpid/management/Args" +\
- method.getFullName () + ".h\"\n")
+ stream.write ("#include \"" + (self.options.include_prefix or "") +\
+ "Args" + method.getFullName () + ".h\"\n")
def genMethodCount (self, stream, variables):
stream.write ("%d" % len (self.methods))
@@ -765,13 +796,16 @@ class SchemaClass:
def genNameLower (self, stream, variables):
stream.write (self.name.lower ())
+ def genNamePackageLower (self, stream, variables):
+ stream.write (self.packageName.lower ())
+
def genNameUpper (self, stream, variables):
stream.write (self.name.upper ())
def genParentArg (self, stream, variables):
for config in self.configElements:
if config.isParentRef == 1:
- stream.write (" _parent")
+ stream.write (", Manageable* _parent")
return
def genParentRefAssignment (self, stream, variables):
@@ -781,6 +815,13 @@ class SchemaClass:
" = _parent->GetManagementObject ()->getObjectId ();")
return
+ def genSchemaMD5 (self, stream, variables):
+ sum = self.md5Sum.digest ()
+ for idx in range (len (sum)):
+ if idx != 0:
+ stream.write (",")
+ stream.write (hex (ord (sum[idx])))
+
def genWriteConfig (self, stream, variables):
for config in self.configElements:
config.genWrite (stream);
@@ -790,14 +831,13 @@ class SchemaClass:
inst.genWrite (stream);
-#=====================================================================================
-#
-#=====================================================================================
+
class PackageSchema:
- def __init__ (self, typefile, schemafile):
+ def __init__ (self, typefile, schemafile, options):
- self.classes = []
- self.typespec = TypeSpec (typefile)
+ self.classes = []
+ self.fragments = []
+ self.typespec = TypeSpec (typefile)
dom = parse (schemafile)
document = dom.documentElement
@@ -810,8 +850,15 @@ class PackageSchema:
for child in children:
if child.nodeType == Node.ELEMENT_NODE:
if child.nodeName == 'class':
- cls = SchemaClass (child, self.typespec)
+ cls = SchemaClass (self.packageName, child, self.typespec,
+ self.fragments, options)
self.classes.append (cls)
+
+ elif child.nodeName == 'group':
+ cls = SchemaClass (self.packageName, child, self.typespec,
+ self.fragments, options)
+ self.fragments.append (cls)
+
else:
raise ValueError ("Unknown schema tag '%s'" % child.nodeName)
diff --git a/cpp/managementgen/templates/Class.cpp b/cpp/managementgen/templates/Class.cpp
index d87d11f767..2a3f71e262 100644
--- a/cpp/managementgen/templates/Class.cpp
+++ b/cpp/managementgen/templates/Class.cpp
@@ -31,11 +31,14 @@ using namespace qpid::sys;
using namespace qpid::framing;
using std::string;
-bool /*MGEN:Class.NameCap*/::schemaNeeded = true;
-
-/*MGEN:Class.NameCap*/::/*MGEN:Class.NameCap*/ (Manageable* _core, Manageable*/*MGEN:Class.ParentArg*/,
- /*MGEN:Class.ConstructorArgs*/) :
- ManagementObject(_core, "/*MGEN:Class.NameLower*/")
+string /*MGEN:Class.NameCap*/::packageName = string ("/*MGEN:Class.NamePackageLower*/");
+string /*MGEN:Class.NameCap*/::className = string ("/*MGEN:Class.NameLower*/");
+uint8_t /*MGEN:Class.NameCap*/::md5Sum[16] =
+ {/*MGEN:Class.SchemaMD5*/};
+bool /*MGEN:Class.NameCap*/::firstInst = true;
+
+/*MGEN:Class.NameCap*/::/*MGEN:Class.NameCap*/ (Manageable* _core/*MGEN:Class.ParentArg*//*MGEN:Class.ConstructorArgs*/) :
+ ManagementObject(_core)
/*MGEN:Class.ConstructorInits*/
{
/*MGEN:Class.ParentRefAssignment*/
@@ -60,14 +63,26 @@ namespace {
const string DEFAULT("default");
}
+bool /*MGEN:Class.NameCap*/::firstInstance (void)
+{
+ Mutex::ScopedLock alock(accessorLock);
+ if (firstInst)
+ {
+ firstInst = false;
+ return true;
+ }
+
+ return false;
+}
+
void /*MGEN:Class.NameCap*/::writeSchema (Buffer& buf)
{
FieldTable ft;
- schemaNeeded = false;
-
// Schema class header:
- buf.putShortString (className); // Class Name
+ 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
diff --git a/cpp/managementgen/templates/Class.h b/cpp/managementgen/templates/Class.h
index ba6a1183e2..82fac00d47 100644
--- a/cpp/managementgen/templates/Class.h
+++ b/cpp/managementgen/templates/Class.h
@@ -33,22 +33,24 @@ class /*MGEN:Class.NameCap*/ : public ManagementObject
{
private:
- static bool schemaNeeded;
+ static std::string packageName;
+ static std::string className;
+ static uint8_t md5Sum[16];
+ static bool firstInst;
// Configuration Elements
/*MGEN:Class.ConfigDeclarations*/
// Instrumentation Elements
/*MGEN:Class.InstDeclarations*/
// Private Methods
- std::string getObjectName (void) { return "/*MGEN:Class.NameLower*/"; }
- void writeSchema (qpid::framing::Buffer& buf);
+ static void writeSchema (qpid::framing::Buffer& buf);
void writeConfig (qpid::framing::Buffer& buf);
void writeInstrumentation (qpid::framing::Buffer& buf);
- bool getSchemaNeeded (void) { return schemaNeeded; }
- void setSchemaNeeded (void) { schemaNeeded = true; }
void doMethod (std::string methodName,
qpid::framing::Buffer& inBuf,
qpid::framing::Buffer& outBuf);
+ writeSchemaCall_t getWriteSchemaCall (void) { return writeSchema; }
+ bool firstInstance (void);
/*MGEN:Class.InstChangedStub*/
public:
@@ -56,10 +58,13 @@ class /*MGEN:Class.NameCap*/ : public ManagementObject
typedef boost::shared_ptr</*MGEN:Class.NameCap*/> shared_ptr;
qpid::sys::Mutex accessorLock;
- /*MGEN:Class.NameCap*/ (Manageable* coreObject, Manageable* parentObject,
- /*MGEN:Class.ConstructorArgs*/);
+ /*MGEN:Class.NameCap*/ (Manageable* coreObject/*MGEN:Class.ParentArg*//*MGEN:Class.ConstructorArgs*/);
~/*MGEN:Class.NameCap*/ (void);
+ std::string getPackageName (void) { return packageName; }
+ std::string getClassName (void) { return className; }
+ uint8_t* getMd5Sum (void) { return md5Sum; }
+
// Method IDs
/*MGEN:Class.MethodIdDeclarations*/
// Accessor Methods