summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xqpid/cpp/managementgen/generate.py164
-rwxr-xr-xqpid/cpp/managementgen/main.py29
-rwxr-xr-xqpid/cpp/managementgen/schema.py64
-rw-r--r--qpid/cpp/managementgen/templates/Args.h1
-rw-r--r--qpid/cpp/managementgen/templates/Class.cpp1
-rw-r--r--qpid/cpp/managementgen/templates/Class.h1
-rw-r--r--qpid/cpp/src/Makefile.am8
-rw-r--r--qpid/cpp/src/qpid/broker/Broker.cpp2
-rw-r--r--qpid/cpp/src/qpid/broker/Queue.cpp13
-rw-r--r--qpid/cpp/src/qpid/broker/Vhost.cpp2
-rw-r--r--qpid/cpp/src/qpid/management/ManagementAgent.cpp11
-rw-r--r--qpid/cpp/src/qpid/management/ManagementAgent.h4
-rw-r--r--qpid/python/mgmt-cli/managementdata.py38
13 files changed, 196 insertions, 142 deletions
diff --git a/qpid/cpp/managementgen/generate.py b/qpid/cpp/managementgen/generate.py
index 1d0987e685..4c042bd3f6 100755
--- a/qpid/cpp/managementgen/generate.py
+++ b/qpid/cpp/managementgen/generate.py
@@ -27,13 +27,18 @@ import os
import os.path
import filecmp
-#=====================================================================================
-#
-#=====================================================================================
class Template:
+ """
+ Expandable File Template - This class is instantiated each time a
+ template is to be expanded. It is instantiated with the "filename"
+ which is the full path to the template file and the "handler" which
+ is an object that is responsible for storing variables (setVariable)
+ and expanding tags (substHandler).
+ """
def __init__ (self, filename, handler):
self.filename = filename
self.handler = handler
+ self.handler.initExpansion ()
def expandLine (self, line, stream, object):
cursor = 0
@@ -47,29 +52,78 @@ class Template:
stream.write (line[cursor:sub])
cursor = subend + 2
- tag = line[sub:subend]
- dotPos = tag.find (".")
- if dotPos == -1:
- raise ValueError ("Invalid tag: %s" % tag)
- tagObject = tag[7:dotPos]
- tagName = tag[dotPos + 1:len (tag)]
-
- self.handler (object, stream, tagObject, tagName)
+ tag = line[sub:subend]
+ equalPos = tag.find ("=")
+ if equalPos == -1:
+ dotPos = tag.find (".")
+ if dotPos == -1:
+ raise ValueError ("Invalid tag: %s" % tag)
+ tagObject = tag[7:dotPos]
+ tagName = tag[dotPos + 1:len (tag)]
+ self.handler.substHandler (object, stream, tagObject, tagName)
+ else:
+ tagKey = tag[7:equalPos]
+ tagVal = tag[equalPos + 1:len (tag)]
+ self.handler.setVariable (tagKey, tagVal)
def expand (self, object):
fd = open (self.filename)
stream = StringIO ()
-
+
for line in fd:
self.expandLine (line, stream, object)
fd.close ()
return stream
-#=====================================================================================
-#
-#=====================================================================================
+
+class Makefile:
+ """ Object representing a makefile fragment """
+ def __init__ (self, filelists, templateFiles):
+ self.filelists = filelists
+ self.templateFiles = templateFiles
+
+ def genGenSources (self, stream, variables):
+ mdir = variables["mgenDir"]
+ sdir = variables["specDir"]
+ stream.write (mdir + "/main.py \\\n")
+ stream.write (" " + mdir + "/generate.py \\\n")
+ stream.write (" " + mdir + "/schema.py \\\n")
+ stream.write (" " + sdir + "/management-types.xml \\\n")
+ stream.write (" " + sdir + "/management-schema.xml \\\n")
+ first = True
+ for template in self.templateFiles:
+ if first:
+ first = False
+ stream.write (" ")
+ else:
+ stream.write (" \\\n ")
+ stream.write (mdir + "/templates/" + template)
+
+ def genGenCppFiles (self, stream, variables):
+ first = True
+ for file in self.filelists["cpp"]:
+ if first:
+ first = False
+ else:
+ stream.write (" \\\n ")
+ stream.write (file)
+
+ def genGenHFiles (self, stream, variables):
+ first = True
+ for file in self.filelists["h"]:
+ if first:
+ first = False
+ else:
+ stream.write (" \\\n ")
+ stream.write (file)
+
+
class Generator:
+ """
+ This class manages code generation using template files. It is instantiated
+ once for an entire code generation session.
+ """
def createPath (self, path):
exists = True
try:
@@ -99,10 +153,12 @@ class Generator:
self.filelists["cpp"] = []
self.filelists["mk"] = []
self.templateFiles = []
+ self.variables = {}
- def genDisclaimer (self, stream):
- stream.write ("// This source file was created by a code generator.\n")
- stream.write ("// Please do not edit.")
+ def genDisclaimer (self, stream, variables):
+ prefix = variables["commentPrefix"]
+ stream.write (prefix + " This source file was created by a code generator.\n")
+ stream.write (prefix + " Please do not edit.")
def fileExt (self, path):
dot = path.rfind (".")
@@ -150,29 +206,35 @@ class Generator:
path = self.dest + "Args" + method.getFullName () + extension
return path
+ def initExpansion (self):
+ self.variables = {}
+
def substHandler (self, object, stream, tagObject, tag):
if tagObject == "Root":
obj = "self"
else:
obj = "object" # MUST be the same as the 2nd formal parameter
- call = obj + ".gen" + tag + "(stream)"
+ call = obj + ".gen" + tag + "(stream, self.variables)"
eval (call)
- def makeClassFiles (self, templateFile, schema):
+ def setVariable (self, key, value):
+ self.variables[key] = value
+
+ def makeClassFiles (self, templateFile, schema, force=False):
""" Generate an expanded template per schema class """
classes = schema.getClasses ()
- template = Template (self.input + templateFile, self.substHandler)
+ template = Template (self.input + templateFile, self)
self.templateFiles.append (templateFile)
for _class in classes:
target = self.targetClassFile (_class, templateFile)
stream = template.expand (_class)
- self.writeIfChanged (stream, target)
+ self.writeIfChanged (stream, target, force)
- def makeMethodFiles (self, templateFile, schema):
+ def makeMethodFiles (self, templateFile, schema, force=False):
""" Generate an expanded template per method-with-arguments """
classes = schema.getClasses ()
- template = Template (self.input + templateFile, self.substHandler)
+ template = Template (self.input + templateFile, self)
self.templateFiles.append (templateFile)
for _class in classes:
methods = _class.getMethods ()
@@ -180,50 +242,12 @@ class Generator:
if method.getArgCount () > 0:
target = self.targetMethodFile (method, templateFile)
stream = template.expand (method)
- self.writeIfChanged (stream, target)
+ self.writeIfChanged (stream, target, force)
- def makeMakeFile (self, target):
- stream = StringIO ()
- stream.write ("# Generated makefile fragment.\n\n")
- stream.write ("mgen_generator=$(mgen_dir)/main.py \\\n")
- stream.write (" $(mgen_dir)/generate.py \\\n")
- stream.write (" $(mgen_dir)/schema.py \\\n")
- stream.write (" $(top_srcdir)/../specs/management-types.xml \\\n")
- stream.write (" $(top_srcdir)/../specs/management-schema.xml \\\n ")
- first = 1
- for template in self.templateFiles:
- if first == 1:
- first = 0
- else:
- stream.write (" \\\n ")
- stream.write ("$(mgen_dir)/templates/" + template)
-
- stream.write ("\n\nmgen_broker_cpp=")
- first = 1
- for file in self.filelists["cpp"]:
- if first == 1:
- first = 0
- else:
- stream.write (" \\\n ")
- stream.write (file.replace ("../src", "."))
- stream.write ("\n\n")
-
- stream.write ("# Header file install rules.\n")
- stream.write ("qpid_managementdir = $(includedir)/qpid/management\n")
- stream.write ("dist_qpid_management_HEADERS = ")
- first = 1
- for file in self.filelists["h"]:
- if first == 1:
- first = 0
- else:
- stream.write (" \\\n ")
- stream.write (file.replace ("../src", "."))
- stream.write ("\n\n")
-
- stream.write ("if GENERATE\n")
- stream.write ("$(srcdir)/managementgen.mk: $(mgen_generator)\n")
- stream.write ("\t$(mgen_cmd)\n")
- stream.write ("\n$(mgen_generator):\n")
- stream.write ("endif\n")
-
- self.writeIfChanged (stream, target, force=True)
+ def makeSingleFile (self, templateFile, target, force=False):
+ """ Generate a single expanded template """
+ makefile = Makefile (self.filelists, self.templateFiles)
+ template = Template (self.input + templateFile, self)
+ self.templateFiles.append (templateFile)
+ stream = template.expand (makefile)
+ self.writeIfChanged (stream, target, force)
diff --git a/qpid/cpp/managementgen/main.py b/qpid/cpp/managementgen/main.py
index ddf18ef873..de8ce4cbe6 100755
--- a/qpid/cpp/managementgen/main.py
+++ b/qpid/cpp/managementgen/main.py
@@ -24,32 +24,27 @@ from generate import Generator
from optparse import OptionParser
# Set command line options
-parser = OptionParser ()
-parser.add_option ("-o", "--outDir", dest="outdir", metavar="DIR",
- help="Destination directory for generated files")
-parser.add_option ("-t", "--typeFile", dest="typefile", metavar="FILE",
- help="Schema type document (XML file)")
-parser.add_option ("-s", "--schemaFile", dest="schemafile", metavar="FILE",
- help="Schema defintion document (XML file)")
-parser.add_option ("-i", "--templateDir", dest="templatedir", metavar="DIR",
- help="Directory where template files can be found")
+usage = "usage: %prog [options] schema-document type-document template-directory out-directory"
+parser = OptionParser (usage=usage)
parser.add_option ("-m", "--makefile", dest="makefile", metavar="FILE",
help="Makefile fragment")
(opts, args) = parser.parse_args ()
-if opts.outdir == None or \
- opts.typefile == None or \
- opts.schemafile == None or \
- opts.templatedir == None:
- parser.error ("Incorrect options, see --help for help")
+if len (args) < 4:
+ parser.error ("Too few arguments")
-gen = Generator (opts.outdir, opts.templatedir)
-schema = PackageSchema (opts.typefile, opts.schemafile)
+schemafile = args[0]
+typefile = args[1]
+templatedir = args[2]
+outdir = args[3]
+
+gen = Generator (outdir, templatedir)
+schema = PackageSchema (typefile, schemafile)
gen.makeClassFiles ("Class.h", schema)
gen.makeClassFiles ("Class.cpp", schema)
gen.makeMethodFiles ("Args.h", schema)
if opts.makefile != None:
- gen.makeMakeFile (opts.makefile)
+ gen.makeSingleFile ("Makefile.mk", opts.makefile, force=True)
diff --git a/qpid/cpp/managementgen/schema.py b/qpid/cpp/managementgen/schema.py
index 34121a2544..ef3fb50667 100755
--- a/qpid/cpp/managementgen/schema.py
+++ b/qpid/cpp/managementgen/schema.py
@@ -461,19 +461,19 @@ class SchemaMethod:
# Code Generation Functions. The names of these functions (minus the leading "gen")
# match the substitution keywords in the template files.
#===================================================================================
- def genNameUpper (self, stream):
+ def genNameUpper (self, stream, variables):
stream.write (self.getFullName ().upper ())
- def genNameCamel (self, stream):
+ def genNameCamel (self, stream, variables):
stream.write (self.getFullName ())
- def genArguments (self, stream):
+ def genArguments (self, stream, variables):
for arg in self.args:
ctype = arg.type.type.cpp
dirTag = arg.dir.lower() + "_"
stream.write (" " + ctype + " " + dirTag + arg.getName () + ";\n")
- def genSchema (self, stream):
+ def genSchema (self, stream, variables):
stream.write (" ft = FieldTable ();\n")
stream.write (" ft.setString (NAME, \"" + self.name + "\");\n")
stream.write (" ft.setInt (ARGCOUNT, " + str (len (self.args)) + ");\n")
@@ -571,25 +571,25 @@ class SchemaClass:
# Code Generation Functions. The names of these functions (minus the leading "gen")
# match the substitution keywords in the template files.
#===================================================================================
- def genAccessorMethods (self, stream):
+ def genAccessorMethods (self, stream, variables):
for config in self.configElements:
if config.access != "RC":
config.genAccessor (stream)
for inst in self.instElements:
inst.genAccessor (stream)
- def genConfigCount (self, stream):
+ def genConfigCount (self, stream, variables):
stream.write ("%d" % len (self.configElements))
- def genConfigDeclarations (self, stream):
+ def genConfigDeclarations (self, stream, variables):
for element in self.configElements:
element.genDeclaration (stream)
- def genConfigElementSchema (self, stream):
+ def genConfigElementSchema (self, stream, variables):
for config in self.configElements:
config.genSchema (stream)
- def genConstructorArgs (self, stream):
+ def genConstructorArgs (self, stream, variables):
# Constructor args are config elements with read-create access
result = ""
first = 1
@@ -601,12 +601,12 @@ class SchemaClass:
stream.write (", ")
element.genFormalParam (stream)
- def genConstructorInits (self, stream):
+ def genConstructorInits (self, stream, variables):
for element in self.configElements:
if element.isConstructorArg ():
stream.write ("," + element.getName () + "(_" + element.getName () + ")")
- def genDoMethodArgs (self, stream):
+ def genDoMethodArgs (self, stream, variables):
methodCount = 0
inArgCount = 0
for method in self.methods:
@@ -623,26 +623,26 @@ class SchemaClass:
else:
stream.write ("string methodName, Buffer& inBuf, Buffer& outBuf")
- def genEventCount (self, stream):
+ def genEventCount (self, stream, variables):
stream.write ("%d" % len (self.events))
- def genEventSchema (self, stream):
+ def genEventSchema (self, stream, variables):
pass ###########################################################################
- def genHiLoStatResets (self, stream):
+ def genHiLoStatResets (self, stream, variables):
for inst in self.instElements:
inst.genHiLoStatResets (stream)
- def genInitializeElements (self, stream):
+ def genInitializeElements (self, stream, variables):
for inst in self.instElements:
inst.genInitialize (stream)
- def genInstChangedStub (self, stream):
+ def genInstChangedStub (self, stream, variables):
if len (self.instElements) == 0:
stream.write (" // Stub for getInstChanged. There are no inst elements\n")
stream.write (" bool getInstChanged (void) { return false; }\n")
- def genInstCount (self, stream):
+ def genInstCount (self, stream, variables):
count = 0
for inst in self.instElements:
count = count + 1
@@ -650,24 +650,24 @@ class SchemaClass:
count = count + 2
stream.write ("%d" % count)
- def genInstDeclarations (self, stream):
+ def genInstDeclarations (self, stream, variables):
for element in self.instElements:
element.genDeclaration (stream)
- def genInstElementSchema (self, stream):
+ def genInstElementSchema (self, stream, variables):
for inst in self.instElements:
inst.genSchema (stream)
- def genMethodArgIncludes (self, stream):
+ def genMethodArgIncludes (self, stream, variables):
for method in self.methods:
if method.getArgCount () > 0:
stream.write ("#include \"qpid/management/Args" +\
method.getFullName () + ".h\"\n")
- def genMethodCount (self, stream):
+ def genMethodCount (self, stream, variables):
stream.write ("%d" % len (self.methods))
- def genMethodHandlers (self, stream):
+ def genMethodHandlers (self, stream, variables):
for method in self.methods:
stream.write ("\n if (methodName == \"" + method.getName () + "\")\n {\n")
if method.getArgCount () == 0:
@@ -694,44 +694,44 @@ class SchemaClass:
stream.write (" return;\n }\n")
- def genMethodIdDeclarations (self, stream):
+ def genMethodIdDeclarations (self, stream, variables):
number = 1
for method in self.methods:
stream.write (" static const uint32_t METHOD_" + method.getName().upper() +\
" = %d;\n" % number)
number = number + 1
- def genMethodSchema (self, stream):
+ def genMethodSchema (self, stream, variables):
for method in self.methods:
- method.genSchema (stream)
+ method.genSchema (stream, variables)
- def genNameCap (self, stream):
+ def genNameCap (self, stream, variables):
stream.write (self.name.capitalize ())
- def genNameLower (self, stream):
+ def genNameLower (self, stream, variables):
stream.write (self.name.lower ())
- def genNameUpper (self, stream):
+ def genNameUpper (self, stream, variables):
stream.write (self.name.upper ())
- def genParentArg (self, stream):
+ def genParentArg (self, stream, variables):
for config in self.configElements:
if config.isParentRef == 1:
stream.write (" _parent")
return
- def genParentRefAssignment (self, stream):
+ def genParentRefAssignment (self, stream, variables):
for config in self.configElements:
if config.isParentRef == 1:
stream.write (config.getName () + \
" = _parent->GetManagementObject ()->getObjectId ();")
return
- def genWriteConfig (self, stream):
+ def genWriteConfig (self, stream, variables):
for config in self.configElements:
config.genWrite (stream);
- def genWriteInst (self, stream):
+ def genWriteInst (self, stream, variables):
for inst in self.instElements:
inst.genWrite (stream);
diff --git a/qpid/cpp/managementgen/templates/Args.h b/qpid/cpp/managementgen/templates/Args.h
index 4a6413ddc9..576d891a3f 100644
--- a/qpid/cpp/managementgen/templates/Args.h
+++ b/qpid/cpp/managementgen/templates/Args.h
@@ -1,3 +1,4 @@
+/*MGEN:commentPrefix=//*/
#ifndef _ARGS_/*MGEN:Method.NameUpper*/_
#define _ARGS_/*MGEN:Method.NameUpper*/_
diff --git a/qpid/cpp/managementgen/templates/Class.cpp b/qpid/cpp/managementgen/templates/Class.cpp
index d3b95fd674..d87d11f767 100644
--- a/qpid/cpp/managementgen/templates/Class.cpp
+++ b/qpid/cpp/managementgen/templates/Class.cpp
@@ -1,3 +1,4 @@
+/*MGEN:commentPrefix=//*/
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
diff --git a/qpid/cpp/managementgen/templates/Class.h b/qpid/cpp/managementgen/templates/Class.h
index 6a54b2131c..ba6a1183e2 100644
--- a/qpid/cpp/managementgen/templates/Class.h
+++ b/qpid/cpp/managementgen/templates/Class.h
@@ -1,3 +1,4 @@
+/*MGEN:commentPrefix=//*/
#ifndef _MANAGEMENT_/*MGEN:Class.NameUpper*/_
#define _MANAGEMENT_/*MGEN:Class.NameUpper*/_
diff --git a/qpid/cpp/src/Makefile.am b/qpid/cpp/src/Makefile.am
index 2efad2d116..d663bbf9f0 100644
--- a/qpid/cpp/src/Makefile.am
+++ b/qpid/cpp/src/Makefile.am
@@ -22,10 +22,10 @@ rgen_cmd=ruby -I $(rgen_dir) $(rgen_dir)/generate $(srcdir)/gen $(specs) all $(s
# Management generator.
mgen_dir=$(top_srcdir)/managementgen
-mgen_cmd=$(mgen_dir)/main.py -o $(srcdir)/gen/qpid/management \
- -t $(top_srcdir)/../specs/management-types.xml \
- -s $(top_srcdir)/../specs/management-schema.xml \
- -i $(mgen_dir)/templates -m $(srcdir)/managementgen.mk
+mgen_cmd=$(mgen_dir)/main.py -m $(srcdir)/managementgen.mk \
+ $(top_srcdir)/../specs/management-schema.xml \
+ $(top_srcdir)/../specs/management-types.xml \
+ $(mgen_dir)/templates $(srcdir)/gen/qpid/management
endif # GENERATE
diff --git a/qpid/cpp/src/qpid/broker/Broker.cpp b/qpid/cpp/src/qpid/broker/Broker.cpp
index 5607d22498..c4a83b05e7 100644
--- a/qpid/cpp/src/qpid/broker/Broker.cpp
+++ b/qpid/cpp/src/qpid/broker/Broker.cpp
@@ -146,7 +146,7 @@ Broker::Broker(const Broker::Options& conf) :
mgmtObject->set_clusterName ("");
mgmtObject->set_version (PACKAGE_VERSION);
- managementAgent->addObject (mgmtObject);
+ managementAgent->addObject (mgmtObject, 1, 0);
// Since there is currently no support for virtual hosts, a placeholder object
// representing the implied single virtual host is added here to keep the
diff --git a/qpid/cpp/src/qpid/broker/Queue.cpp b/qpid/cpp/src/qpid/broker/Queue.cpp
index f753e7ef75..c7dd656a4e 100644
--- a/qpid/cpp/src/qpid/broker/Queue.cpp
+++ b/qpid/cpp/src/qpid/broker/Queue.cpp
@@ -65,7 +65,11 @@ Queue::Queue(const string& _name, bool _autodelete,
{
mgmtObject = management::Queue::shared_ptr
(new management::Queue (this, parent, _name, _store != 0, _autodelete, 0));
- agent->addObject (mgmtObject);
+
+ // Add the object to the management agent only if this queue is not durable.
+ // If it's durable, we will add it later when the queue is assigned a persistenceId.
+ if (store == 0)
+ agent->addObject (mgmtObject);
}
}
}
@@ -519,7 +523,12 @@ uint64_t Queue::getPersistenceId() const
void Queue::setPersistenceId(uint64_t _persistenceId) const
{
- persistenceId = _persistenceId;
+ if (mgmtObject != 0 && persistenceId == 0)
+ {
+ ManagementAgent::shared_ptr agent = ManagementAgent::getAgent ();
+ agent->addObject (mgmtObject, _persistenceId);
+ }
+ persistenceId = _persistenceId;
}
void Queue::encode(framing::Buffer& buffer) const
diff --git a/qpid/cpp/src/qpid/broker/Vhost.cpp b/qpid/cpp/src/qpid/broker/Vhost.cpp
index 537d2abf0e..06a8c8eca3 100644
--- a/qpid/cpp/src/qpid/broker/Vhost.cpp
+++ b/qpid/cpp/src/qpid/broker/Vhost.cpp
@@ -33,7 +33,7 @@ Vhost::Vhost (management::Manageable* parentBroker)
{
mgmtObject = management::Vhost::shared_ptr
(new management::Vhost (this, parentBroker, "/"));
- agent->addObject (mgmtObject);
+ agent->addObject (mgmtObject, 2, 0);
}
}
}
diff --git a/qpid/cpp/src/qpid/management/ManagementAgent.cpp b/qpid/cpp/src/qpid/management/ManagementAgent.cpp
index d3c5d7c266..39fab270af 100644
--- a/qpid/cpp/src/qpid/management/ManagementAgent.cpp
+++ b/qpid/cpp/src/qpid/management/ManagementAgent.cpp
@@ -73,10 +73,17 @@ void ManagementAgent::setExchange (broker::Exchange::shared_ptr _mexchange,
dExchange = _dexchange;
}
-void ManagementAgent::addObject (ManagementObject::shared_ptr object)
+void ManagementAgent::addObject (ManagementObject::shared_ptr object,
+ uint64_t persistenceId,
+ uint64_t idOffset)
{
RWlock::ScopedWlock writeLock (userLock);
- uint64_t objectId = nextObjectId++;
+ uint64_t objectId;
+
+ if (persistenceId == 0)
+ objectId = nextObjectId++;
+ else
+ objectId = 0x8000000000000000ULL | (persistenceId + idOffset);
object->setObjectId (objectId);
managementObjects[objectId] = object;
diff --git a/qpid/cpp/src/qpid/management/ManagementAgent.h b/qpid/cpp/src/qpid/management/ManagementAgent.h
index 36ba1f0542..30b8857c27 100644
--- a/qpid/cpp/src/qpid/management/ManagementAgent.h
+++ b/qpid/cpp/src/qpid/management/ManagementAgent.h
@@ -51,7 +51,9 @@ class ManagementAgent
void setInterval (uint16_t _interval) { interval = _interval; }
void setExchange (broker::Exchange::shared_ptr mgmtExchange,
broker::Exchange::shared_ptr directExchange);
- void addObject (ManagementObject::shared_ptr object);
+ void addObject (ManagementObject::shared_ptr object,
+ uint64_t persistenceId = 0,
+ uint64_t idOffset = 10);
void clientAdded (void);
void dispatchCommand (broker::Deliverable& msg,
const std::string& routingKey,
diff --git a/qpid/python/mgmt-cli/managementdata.py b/qpid/python/mgmt-cli/managementdata.py
index 419cbd13c0..e7233c98ae 100644
--- a/qpid/python/mgmt-cli/managementdata.py
+++ b/qpid/python/mgmt-cli/managementdata.py
@@ -44,6 +44,21 @@ class ManagementData:
# element :== (<element-name>, <element-value>)
#
+ def registerObjId (self, objId):
+ if self.baseId == 0:
+ if objId & 0x8000000000000000L == 0:
+ self.baseId = objId - 1000
+
+ def displayObjId (self, objId):
+ if objId & 0x8000000000000000L == 0:
+ return objId - self.baseId
+ return (objId & 0x7fffffffffffffffL) + 5000
+
+ def rawObjId (self, displayId):
+ if displayId < 5000:
+ return displayId + self.baseId
+ return displayId - 5000 + 0x8000000000000000L
+
def dataHandler (self, context, className, list, timestamps):
""" Callback for configuration and instrumentation data updates """
self.lock.acquire ()
@@ -53,10 +68,9 @@ class ManagementData:
if className not in self.tables:
self.tables[className] = {}
- # Calculate a base-id so displayed IDs are reasonable 4-digit numbers
+ # Register the ID so a more friendly presentation can be displayed
id = long (list[0][1])
- if self.baseId == 0:
- self.baseId = id - 1000
+ self.registerObjId (id)
# If this object hasn't been seen before, create a new object record with
# the timestamps and empty lists for configuration and instrumentation data.
@@ -129,7 +143,7 @@ class ManagementData:
def refName (self, oid):
if oid == 0:
return "NULL"
- return str (oid - self.baseId)
+ return str (self.displayObjId (oid))
def valueDisplay (self, className, key, value):
for kind in range (2):
@@ -244,12 +258,12 @@ class ManagementData:
list = []
if tokens[0] == "all":
for id in self.tables[className]:
- list.append (id - self.baseId)
+ list.append (self.displayObjId (id))
elif tokens[0] == "active":
for id in self.tables[className]:
if self.tables[className][id][0][2] == 0:
- list.append (id - self.baseId)
+ list.append (self.displayObjId (id))
else:
for token in tokens:
@@ -257,7 +271,7 @@ class ManagementData:
if token.find ("-") != -1:
ids = token.split("-", 2)
for id in range (int (ids[0]), int (ids[1]) + 1):
- if self.getClassForId (long (id) + self.baseId) == className:
+ if self.getClassForId (self.rawObjId (long (id))) == className:
list.append (id)
else:
list.append (token)
@@ -329,7 +343,7 @@ class ManagementData:
else:
rootId = int (tokens[0])
- className = self.getClassForId (rootId + self.baseId)
+ className = self.getClassForId (self.rawObjId (rootId))
remaining = tokens
if className == None:
print "Id not known: %d" % int (tokens[0])
@@ -348,8 +362,8 @@ class ManagementData:
ids = []
for id in userIds:
- if self.getClassForId (long (id) + self.baseId) == className:
- ids.append (long (id) + self.baseId)
+ if self.getClassForId (self.rawObjId (long (id))) == className:
+ ids.append (self.rawObjId (long (id)))
rows = []
timestamp = None
@@ -481,7 +495,7 @@ class ManagementData:
self.lock.acquire ()
methodOk = True
try:
- className = self.getClassForId (userOid + self.baseId)
+ className = self.getClassForId (self.rawObjId (userOid))
if className == None:
raise ValueError ()
@@ -505,7 +519,7 @@ class ManagementData:
self.lock.release ()
if methodOk:
# try:
- self.broker.method (self.methodSeq, userOid + self.baseId, className,
+ self.broker.method (self.methodSeq, self.rawObjId (userOid), className,
methodName, namedArgs)
# except ValueError, e:
# print "Error invoking method:", e