|
@@ -536,143 +536,10 @@ class StatsHttpd:
|
|
|
return self.xml_body
|
|
|
|
|
|
def xsd_handler(self, module_name=None, item_name=None):
|
|
|
- """Requests the specified statistics specification by using
|
|
|
- the function get_stats_spec respectively and loads the XSD
|
|
|
- template file and returns the string of the XSD document.The
|
|
|
- first argument is the module name which owns the statistics
|
|
|
- data, the second argument is one name of the statistics items
|
|
|
- which the the module owns. The second argument cannot be
|
|
|
- specified when the first argument is not specified."""
|
|
|
-
|
|
|
- # TODO: Separate the following recursive function by type of
|
|
|
- # the parameter. Because we should be sure what type there is
|
|
|
- # when we call it recursively.
|
|
|
- def stats_spec2xsd(stats_spec, xsd_elem):
|
|
|
- """Internal use for xsd_handler. Reads stats_spec
|
|
|
- specified as first arguments, and modify the xml object
|
|
|
- specified as second argument. xsd_elem must be
|
|
|
- modified. Always returns None with no exceptions."""
|
|
|
- # assumed module_spec or one stats_spec
|
|
|
- if type(stats_spec) is dict:
|
|
|
- # assumed module_spec
|
|
|
- if 'item_name' not in stats_spec:
|
|
|
- for mod in stats_spec.keys():
|
|
|
- elem = xml.etree.ElementTree.Element(
|
|
|
- "element", { "name" : mod })
|
|
|
- complextype = xml.etree.ElementTree.Element("complexType")
|
|
|
- alltag = xml.etree.ElementTree.Element("all")
|
|
|
- stats_spec2xsd(stats_spec[mod], alltag)
|
|
|
- complextype.append(alltag)
|
|
|
- elem.append(complextype)
|
|
|
- xsd_elem.append(elem)
|
|
|
- # assumed stats_spec
|
|
|
- else:
|
|
|
- if stats_spec['item_type'] == 'map':
|
|
|
- alltag = xml.etree.ElementTree.Element("all")
|
|
|
- stats_spec2xsd(stats_spec['map_item_spec'], alltag)
|
|
|
- complextype = xml.etree.ElementTree.Element("complexType")
|
|
|
- complextype.append(alltag)
|
|
|
- elem = xml.etree.ElementTree.Element(
|
|
|
- "element", attrib={ "name" : stats_spec["item_name"],
|
|
|
- "minOccurs": "0" \
|
|
|
- if stats_spec["item_optional"] \
|
|
|
- else "1",
|
|
|
- "maxOccurs": "unbounded" })
|
|
|
- elem.append(complextype)
|
|
|
- xsd_elem.append(elem)
|
|
|
- elif stats_spec['item_type'] == 'list':
|
|
|
- alltag = xml.etree.ElementTree.Element("sequence")
|
|
|
- stats_spec2xsd(stats_spec['list_item_spec'], alltag)
|
|
|
- complextype = xml.etree.ElementTree.Element("complexType")
|
|
|
- complextype.append(alltag)
|
|
|
- elem = xml.etree.ElementTree.Element(
|
|
|
- "element", attrib={ "name" : stats_spec["item_name"],
|
|
|
- "minOccurs": "0" \
|
|
|
- if stats_spec["item_optional"] \
|
|
|
- else "1",
|
|
|
- "maxOccurs": "1" })
|
|
|
- elem.append(complextype)
|
|
|
- xsd_elem.append(elem)
|
|
|
- else:
|
|
|
- # determine the datatype of XSD
|
|
|
- # TODO: Should consider other item_format types
|
|
|
- datatype = stats_spec["item_type"] \
|
|
|
- if stats_spec["item_type"].lower() != 'real' \
|
|
|
- else 'float'
|
|
|
- if "item_format" in stats_spec:
|
|
|
- item_format = stats_spec["item_format"]
|
|
|
- if datatype.lower() == 'string' \
|
|
|
- and item_format.lower() == 'date-time':
|
|
|
- datatype = 'dateTime'
|
|
|
- elif datatype.lower() == 'string' \
|
|
|
- and (item_format.lower() == 'date' \
|
|
|
- or item_format.lower() == 'time'):
|
|
|
- datatype = item_format.lower()
|
|
|
- elem = xml.etree.ElementTree.Element(
|
|
|
- "element",
|
|
|
- attrib={
|
|
|
- 'name' : stats_spec["item_name"],
|
|
|
- 'type' : datatype,
|
|
|
- 'minOccurs' : "0" \
|
|
|
- if stats_spec["item_optional"] \
|
|
|
- else "1",
|
|
|
- 'maxOccurs' : "1"
|
|
|
- }
|
|
|
- )
|
|
|
- annotation = xml.etree.ElementTree.Element("annotation")
|
|
|
- appinfo = xml.etree.ElementTree.Element("appinfo")
|
|
|
- documentation = xml.etree.ElementTree.Element("documentation")
|
|
|
- if "item_title" in stats_spec:
|
|
|
- appinfo.text = stats_spec["item_title"]
|
|
|
- if "item_description" in stats_spec:
|
|
|
- documentation.text = stats_spec["item_description"]
|
|
|
- annotation.append(appinfo)
|
|
|
- annotation.append(documentation)
|
|
|
- elem.append(annotation)
|
|
|
- xsd_elem.append(elem)
|
|
|
- # multiple stats_specs
|
|
|
- elif type(stats_spec) is list:
|
|
|
- for item_spec in stats_spec:
|
|
|
- stats_spec2xsd(item_spec, xsd_elem)
|
|
|
-
|
|
|
- # for XSD
|
|
|
- stats_spec = self.get_stats_spec(module_name, item_name)
|
|
|
- alltag = xml.etree.ElementTree.Element("all")
|
|
|
- stats_spec2xsd(stats_spec, alltag)
|
|
|
- complextype = xml.etree.ElementTree.Element("complexType")
|
|
|
- complextype.append(alltag)
|
|
|
- documentation = xml.etree.ElementTree.Element("documentation")
|
|
|
- documentation.text = "A set of statistics data"
|
|
|
- annotation = xml.etree.ElementTree.Element("annotation")
|
|
|
- annotation.append(documentation)
|
|
|
- elem = xml.etree.ElementTree.Element(
|
|
|
- "element", attrib={ 'name' : 'statistics' })
|
|
|
- elem.append(annotation)
|
|
|
- elem.append(complextype)
|
|
|
- documentation = xml.etree.ElementTree.Element("documentation")
|
|
|
- documentation.text = "XML schema of the statistics data in BIND 10"
|
|
|
- annotation = xml.etree.ElementTree.Element("annotation")
|
|
|
- annotation.append(documentation)
|
|
|
- xsd_root = xml.etree.ElementTree.Element(
|
|
|
- "schema",
|
|
|
- attrib={ 'xmlns' : "http://www.w3.org/2001/XMLSchema",
|
|
|
- 'targetNamespace' : XSD_NAMESPACE,
|
|
|
- 'xmlns:bind10' : XSD_NAMESPACE })
|
|
|
- xsd_root.append(annotation)
|
|
|
- xsd_root.append(elem)
|
|
|
- # The coding conversion is tricky. xml..tostring() of Python 3.2
|
|
|
- # returns bytes (not string) regardless of the coding, while
|
|
|
- # tostring() of Python 3.1 returns a string. To support both
|
|
|
- # cases transparently, we first make sure tostring() returns
|
|
|
- # bytes by specifying utf-8 and then convert the result to a
|
|
|
- # plain string (code below assume it).
|
|
|
- # FIXME: Non-ASCII characters might be lost here. Consider how
|
|
|
- # the whole system should handle non-ASCII characters.
|
|
|
- xsd_string = str(xml.etree.ElementTree.tostring(xsd_root, encoding='utf-8'),
|
|
|
- encoding='us-ascii')
|
|
|
+ """Loads the XSD template file, replaces the variable strings,
|
|
|
+ and returns the string of the XSD document."""
|
|
|
self.xsd_body = self.open_template(XSD_TEMPLATE_LOCATION).substitute(
|
|
|
- xsd_string=xsd_string)
|
|
|
- assert self.xsd_body is not None
|
|
|
+ xsd_namespace=XSD_NAMESPACE)
|
|
|
return self.xsd_body
|
|
|
|
|
|
def xsl_handler(self, module_name=None, item_name=None):
|