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):