diff options
| author | Carl C. Trieloff <cctrieloff@apache.org> | 2008-02-28 18:55:21 +0000 |
|---|---|---|
| committer | Carl C. Trieloff <cctrieloff@apache.org> | 2008-02-28 18:55:21 +0000 |
| commit | ac3f850123c903f00c163d6d2dbad22d98aec7a2 (patch) | |
| tree | 2e622a3e9349a9062454d16bf4bca83a5a3e9d90 /cpp/managementgen | |
| parent | 1820dd421a096ed184a08deee9512e809312fed2 (diff) | |
| download | qpid-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-x | cpp/managementgen/main.py | 8 | ||||
| -rwxr-xr-x | cpp/managementgen/schema.py | 85 | ||||
| -rw-r--r-- | cpp/managementgen/templates/Class.cpp | 31 | ||||
| -rw-r--r-- | cpp/managementgen/templates/Class.h | 19 |
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 |
