Author: nunofsantos
Date: 2007-11-26 11:30:24 -0500 (Mon, 26 Nov 2007)
New Revision: 1357
Added:
mgmt/mint/python/mint/schemaparser.py
Removed:
mgmt/mint/schemaparser.py
Log:
moving schemaparser.py to python/mint
Copied: mgmt/mint/python/mint/schemaparser.py (from rev 1355, mgmt/mint/schemaparser.py)
===================================================================
--- mgmt/mint/python/mint/schemaparser.py (rev 0)
+++ mgmt/mint/python/mint/schemaparser.py 2007-11-26 16:30:24 UTC (rev 1357)
@@ -0,0 +1,151 @@
+import mllib
+from sqlobject import *
+
+class SchemaParser:
+ """parses broker XML schema"""
+
+ def __init__(self):
+ self.options = dict()
+ self.parseConfigFile()
+ self.style = MixedCaseUnderscoreStyle()
+ self.pythonOutput = "from sqlobject import *\n"
+ self.pythonOutput += "from datetime import datetime\n"
+ self.additionalPythonOutput = ""
+ self.currentClass = ""
+ self.finalPythonOutput = "\nclassToSchemaNameMap = dict()\n"
+ self.finalPythonOutput += "schemaNameToClassMap = dict()\n"
+ self.pythonOutput += "conn = connectionForURI(\"%s\")\n" %
(self.options["dsn"])
+ self.pythonOutput += "sqlhub.processConnection = conn\n\n"
+ # mapping between xml schema types and database column types
+ # see xml/MintTypes.xml
+ self.dataTypesMap = dict()
+ self.dataTypesMap["objId"] = "ForeignKey"
+ self.dataTypesMap["uint8"] = self.dataTypesMap["hilo8"] =
self.dataTypesMap["count8"] = "SmallIntCol"
+ self.dataTypesMap["uint16"] = self.dataTypesMap["hilo16"] =
self.dataTypesMap["count16"] = "SmallIntCol"
+ self.dataTypesMap["uint32"] = self.dataTypesMap["hilo32"] =
self.dataTypesMap["count32"] = "IntCol"
+ self.dataTypesMap["uint64"] = self.dataTypesMap["hilo64"] =
self.dataTypesMap["count64"] = "BigIntCol"
+ self.dataTypesMap["bool"] = "BoolCol"
+ self.dataTypesMap["sstr"] = self.dataTypesMap["lstr"] =
"StringCol"
+
+ def attrNameFromDbColumn(self, name, removeSuffix=""):
+ return self.style.dbColumnToPythonAttr(name.replace(removeSuffix, ""))
+
+ def generateAttrib(self, attribName, attribType, params=""):
+ if (params.find("default") < 0):
+ if (params == ""):
+ params = "default=None"
+ else:
+ params += ", default=None"
+ self.pythonOutput += " %s = %s(%s)\n" % (attribName, attribType, params)
+
+ def generateTimestampAttrib(self, col):
+ self.generateAttrib(col + "Time", "TimestampCol") #,
"default=datetime.min")
+
+ def generateForeignKeyAttrib(self, name, reference):
+ params = "'%s', cascade='null'" % (reference)
+ self.generateAttrib(name, "ForeignKey", params)
+
+ def generateHiLoAttrib(self, name, type):
+ self.generateAttrib(name, type)
+ self.generateAttrib(name + "Low", type)
+ self.generateAttrib(name + "High", type)
+
+ def generateMultipleJoin(self, tableFrom, tableTo):
+ attrib = tableTo.lower() + "s"
+ self.additionalPythonOutput += "\n%s.sqlmeta.addJoin(MultipleJoin('%s',
joinMethodName='%s'))\n" % (tableFrom, tableTo, attrib)
+
+ def generateClassAttribs(self, schemaName, elements):
+ for elem in elements:
+ if (elem["(a)name"].endswith("Ref")):
+ reference =
self.style.dbTableToPythonClass(elem["(a)name"]).replace("Ref",
"")
+ attrib = reference[0].lower() + reference[1:]
+ self.generateForeignKeyAttrib(attrib, reference)
+ self.generateMultipleJoin(reference, self.currentClass)
+ elif (elem["(a)type"].startswith("hilo")):
+ self.generateHiLoAttrib(self.attrNameFromDbColumn(elem["@name"]),
self.dataTypesMap[elem["@type"]])
+ else:
+ args = ""
+ if (elem["@type"] == "sstr"):
+ args += "length=1000"
+ elif (elem["@type"] == "lstr"):
+ args += "length=4000"
+ self.generateAttrib(self.attrNameFromDbColumn(elem["@name"]),
self.dataTypesMap[elem["@type"]], args)
+
+ def startClass(self, schemaName, stats=False):
+ if (stats):
+ pythonName = self.style.dbTableToPythonClass(schemaName + "_stats")
+ colPythonName = self.style.dbColumnToPythonAttr(schemaName)
+ keyPythonName = self.style.dbTableToPythonClass(schemaName)
+ else:
+ pythonName = self.style.dbTableToPythonClass(schemaName)
+ statsPythonName = self.style.dbTableToPythonClass(schemaName + "_stats")
+ self.currentClass = pythonName
+ self.pythonOutput += "\nclass %s(SQLObject):\n" % (pythonName)
+ self.generateAttrib("idOriginal", "BigIntCol")
+ self.generateTimestampAttrib("rec")
+ if (stats):
+ self.generateForeignKeyAttrib(colPythonName, keyPythonName)
+ else:
+ self.generateTimestampAttrib("creation")
+ self.generateTimestampAttrib("deletion")
+ self.generateAttrib("managedBroker", "StringCol",
"length=1000")
+ self.generateForeignKeyAttrib("stats", statsPythonName)
+ self.generateForeignKeyAttrib("statsPrev", statsPythonName)
+ self.finalPythonOutput += "classToSchemaNameMap['%s'] =
'%s'\n" % (pythonName, schemaName)
+ self.finalPythonOutput += "schemaNameToClassMap['%s'] = %s\n" %
(schemaName, pythonName)
+
+ def generateMethod(self, elem):
+ if (elem["@desc"] != None):
+ comment = ' """' + elem["@desc"] +
'"""\n'
+ else:
+ comment = ""
+ formalArgs = ", "
+ actualArgs = " actualArgs = dict()\n"
+ for arg in elem.query["arg"]:
+ formalArgs += "%s, " % (arg["@name"])
+ actualArgs += " actualArgs[\"%s\"] = %s\n" %
(arg["@name"], arg["@name"])
+ if (formalArgs != ", "):
+ formalArgs = formalArgs[:-2]
+ else:
+ formalArgs = ""
+ self.pythonOutput += "\n def %s(self, model, managedBrokerLabel,
callbackMethod%s):\n" % (elem["@name"], formalArgs)
+ self.pythonOutput += comment
+ self.pythonOutput += actualArgs
+ self.pythonOutput += " methodId =
model.registerCallback(callbackMethod)\n"
+ self.pythonOutput += "
model.getConnectedBroker(managedBrokerLabel).method(methodId, self.idOriginal, \\\n"
+ self.pythonOutput += " classToSchemaNameMap[self.__class__.__name__],
\"%s\", " % (elem["@name"])
+ self.pythonOutput += "args=actualArgs, packageName=\"qpid\")\n"
+
+ def endClass(self):
+ if (self.additionalPythonOutput != ""):
+ self.pythonOutput += self.additionalPythonOutput + "\n"
+ self.additionalPythonOutput = ""
+ if (self.pythonOutput.endswith("(SQLObject):\n")):
+ self.pythonOutput += " pass\n"
+ self.currentClass = ""
+
+ def parseConfigFile(self):
+ config = mllib.xml_parse("config.xml")
+ configOptions = config.query["config/configOption"]
+ for opt in configOptions:
+ self.options[opt["@name"]] = opt["@value"]
+
+ def generateCode(self):
+ outputFile = open(self.options["pythonOutput"], "w")
+ schema = mllib.xml_parse(self.options["schemaXML"])
+ classes = schema.query["schema/class"]
+ for cls in classes:
+ self.startClass(cls["@name"])
+ self.generateClassAttribs(cls["@name"],
cls.query["configElement"])
+ for elem in cls.query["method"]:
+ self.generateMethod(elem)
+ self.endClass()
+ self.startClass(cls["@name"], stats=True)
+ self.generateClassAttribs(cls["@name"],
cls.query["instElement"])
+ self.endClass()
+ outputFile.write(self.pythonOutput + self.finalPythonOutput)
+ outputFile.close()
+
+
+parser = SchemaParser()
+parser.generateCode()
Deleted: mgmt/mint/schemaparser.py
===================================================================
--- mgmt/mint/schemaparser.py 2007-11-26 14:46:02 UTC (rev 1356)
+++ mgmt/mint/schemaparser.py 2007-11-26 16:30:24 UTC (rev 1357)
@@ -1,151 +0,0 @@
-import mllib
-from sqlobject import *
-
-class SchemaParser:
- """parses broker XML schema"""
-
- def __init__(self):
- self.options = dict()
- self.parseConfigFile()
- self.style = MixedCaseUnderscoreStyle()
- self.pythonOutput = "from sqlobject import *\n"
- self.pythonOutput += "from datetime import datetime\n"
- self.additionalPythonOutput = ""
- self.currentClass = ""
- self.finalPythonOutput = "\nclassToSchemaNameMap = dict()\n"
- self.finalPythonOutput += "schemaNameToClassMap = dict()\n"
- self.pythonOutput += "conn = connectionForURI(\"%s\")\n" %
(self.options["dsn"])
- self.pythonOutput += "sqlhub.processConnection = conn\n\n"
- # mapping between xml schema types and database column types
- # see xml/MintTypes.xml
- self.dataTypesMap = dict()
- self.dataTypesMap["objId"] = "ForeignKey"
- self.dataTypesMap["uint8"] = self.dataTypesMap["hilo8"] =
self.dataTypesMap["count8"] = "SmallIntCol"
- self.dataTypesMap["uint16"] = self.dataTypesMap["hilo16"] =
self.dataTypesMap["count16"] = "SmallIntCol"
- self.dataTypesMap["uint32"] = self.dataTypesMap["hilo32"] =
self.dataTypesMap["count32"] = "IntCol"
- self.dataTypesMap["uint64"] = self.dataTypesMap["hilo64"] =
self.dataTypesMap["count64"] = "BigIntCol"
- self.dataTypesMap["bool"] = "BoolCol"
- self.dataTypesMap["sstr"] = self.dataTypesMap["lstr"] =
"StringCol"
-
- def attrNameFromDbColumn(self, name, removeSuffix=""):
- return self.style.dbColumnToPythonAttr(name.replace(removeSuffix, ""))
-
- def generateAttrib(self, attribName, attribType, params=""):
- if (params.find("default") < 0):
- if (params == ""):
- params = "default=None"
- else:
- params += ", default=None"
- self.pythonOutput += " %s = %s(%s)\n" % (attribName, attribType, params)
-
- def generateTimestampAttrib(self, col):
- self.generateAttrib(col + "Time", "TimestampCol") #,
"default=datetime.min")
-
- def generateForeignKeyAttrib(self, name, reference):
- params = "'%s', cascade='null'" % (reference)
- self.generateAttrib(name, "ForeignKey", params)
-
- def generateHiLoAttrib(self, name, type):
- self.generateAttrib(name, type)
- self.generateAttrib(name + "Low", type)
- self.generateAttrib(name + "High", type)
-
- def generateMultipleJoin(self, tableFrom, tableTo):
- attrib = tableTo.lower() + "s"
- self.additionalPythonOutput += "\n%s.sqlmeta.addJoin(MultipleJoin('%s',
joinMethodName='%s'))\n" % (tableFrom, tableTo, attrib)
-
- def generateClassAttribs(self, schemaName, elements):
- for elem in elements:
- if (elem["(a)name"].endswith("Ref")):
- reference =
self.style.dbTableToPythonClass(elem["(a)name"]).replace("Ref",
"")
- attrib = reference[0].lower() + reference[1:]
- self.generateForeignKeyAttrib(attrib, reference)
- self.generateMultipleJoin(reference, self.currentClass)
- elif (elem["(a)type"].startswith("hilo")):
- self.generateHiLoAttrib(self.attrNameFromDbColumn(elem["@name"]),
self.dataTypesMap[elem["@type"]])
- else:
- args = ""
- if (elem["@type"] == "sstr"):
- args += "length=1000"
- elif (elem["@type"] == "lstr"):
- args += "length=4000"
- self.generateAttrib(self.attrNameFromDbColumn(elem["@name"]),
self.dataTypesMap[elem["@type"]], args)
-
- def startClass(self, schemaName, stats=False):
- if (stats):
- pythonName = self.style.dbTableToPythonClass(schemaName + "_stats")
- colPythonName = self.style.dbColumnToPythonAttr(schemaName)
- keyPythonName = self.style.dbTableToPythonClass(schemaName)
- else:
- pythonName = self.style.dbTableToPythonClass(schemaName)
- statsPythonName = self.style.dbTableToPythonClass(schemaName + "_stats")
- self.currentClass = pythonName
- self.pythonOutput += "\nclass %s(SQLObject):\n" % (pythonName)
- self.generateAttrib("idOriginal", "BigIntCol")
- self.generateTimestampAttrib("rec")
- if (stats):
- self.generateForeignKeyAttrib(colPythonName, keyPythonName)
- else:
- self.generateTimestampAttrib("creation")
- self.generateTimestampAttrib("deletion")
- self.generateAttrib("managedBroker", "StringCol",
"length=1000")
- self.generateForeignKeyAttrib("stats", statsPythonName)
- self.generateForeignKeyAttrib("statsPrev", statsPythonName)
- self.finalPythonOutput += "classToSchemaNameMap['%s'] =
'%s'\n" % (pythonName, schemaName)
- self.finalPythonOutput += "schemaNameToClassMap['%s'] = %s\n" %
(schemaName, pythonName)
-
- def generateMethod(self, elem):
- if (elem["@desc"] != None):
- comment = ' """' + elem["@desc"] +
'"""\n'
- else:
- comment = ""
- formalArgs = ", "
- actualArgs = " actualArgs = dict()\n"
- for arg in elem.query["arg"]:
- formalArgs += "%s, " % (arg["@name"])
- actualArgs += " actualArgs[\"%s\"] = %s\n" %
(arg["@name"], arg["@name"])
- if (formalArgs != ", "):
- formalArgs = formalArgs[:-2]
- else:
- formalArgs = ""
- self.pythonOutput += "\n def %s(self, model, managedBrokerLabel,
callbackMethod%s):\n" % (elem["@name"], formalArgs)
- self.pythonOutput += comment
- self.pythonOutput += actualArgs
- self.pythonOutput += " methodId =
model.registerCallback(callbackMethod)\n"
- self.pythonOutput += "
model.getConnectedBroker(managedBrokerLabel).method(methodId, self.idOriginal, \\\n"
- self.pythonOutput += " classToSchemaNameMap[self.__class__.__name__],
\"%s\", " % (elem["@name"])
- self.pythonOutput += "args=actualArgs, packageName=\"qpid\")\n"
-
- def endClass(self):
- if (self.additionalPythonOutput != ""):
- self.pythonOutput += self.additionalPythonOutput + "\n"
- self.additionalPythonOutput = ""
- if (self.pythonOutput.endswith("(SQLObject):\n")):
- self.pythonOutput += " pass\n"
- self.currentClass = ""
-
- def parseConfigFile(self):
- config = mllib.xml_parse("config.xml")
- configOptions = config.query["config/configOption"]
- for opt in configOptions:
- self.options[opt["@name"]] = opt["@value"]
-
- def generateCode(self):
- outputFile = open(self.options["pythonOutput"], "w")
- schema = mllib.xml_parse(self.options["schemaXML"])
- classes = schema.query["schema/class"]
- for cls in classes:
- self.startClass(cls["@name"])
- self.generateClassAttribs(cls["@name"],
cls.query["configElement"])
- for elem in cls.query["method"]:
- self.generateMethod(elem)
- self.endClass()
- self.startClass(cls["@name"], stats=True)
- self.generateClassAttribs(cls["@name"],
cls.query["instElement"])
- self.endClass()
- outputFile.write(self.pythonOutput + self.finalPythonOutput)
- outputFile.close()
-
-
-parser = SchemaParser()
-parser.generateCode()