libraries/edge/opensearch/atomresponse.py (126 lines of code) (raw):

import logging from xml.dom.minidom import Document import xml.sax.saxutils from edge.opensearch.response import Response class AtomResponse(Response): def __init__(self): super(AtomResponse, self).__init__() self.namespaces = { '': 'http://www.w3.org/2005/Atom', 'opensearch': 'http://a9.com/-/spec/opensearch/1.1/', 'podaac': 'http://podaac.jpl.nasa.gov/opensearch/', 'georss': 'http://www.georss.org/georss', 'gml': 'http://www.opengis.net/gml', 'time': 'http://a9.com/-/opensearch/extensions/time/1.0/' } self.title = None self.link = None self.update = None self.authors = [] self.variables = [] self.items = [] self.id = None self.updated = None self.parameters = {} def addNamespace(self, name, uri): self.namespaces[name] = uri def removeNamespace(self, name): del self.namespaces[name] def generate(self, pretty=False): logging.debug('AtomResponse.generate is called.') document = Document() feed = document.createElement('feed') for namespace in list(self.namespaces.keys()): namespaceAttr = 'xmlns' if namespace != '': namespaceAttr += ':'+namespace feed.setAttribute(namespaceAttr, self.namespaces[namespace]) document.appendChild(feed) title = document.createElement('title') feed.appendChild(title) title.appendChild(document.createTextNode(xml.sax.saxutils.escape(self.title))) ''' link = document.createElement('link') feed.appendChild(link) link.appendChild(document.createTextNode(xml.sax.saxutils.escape(self.link))) ''' updated = document.createElement('updated') feed.appendChild(updated) updated.appendChild(document.createTextNode(xml.sax.saxutils.escape(self.updated))) id = document.createElement('id') feed.appendChild(id) id.appendChild(document.createTextNode(xml.sax.saxutils.escape(self.id))) author = document.createElement('author') feed.appendChild(author) for authorName in self.authors: authorElement = document.createElement('name') author.appendChild(authorElement) authorElement.appendChild(document.createTextNode(xml.sax.saxutils.escape(authorName))) for variable in self.variables: ''' elementName = variable['name'] if 'namespace' in variable: elementName = variable['namespace']+':'+elementName variableElement = document.createElement(elementName) feed.appendChild(variableElement) variableElement.appendChild(document.createTextNode(xml.sax.saxutils.escape(str(variable['value'])))) ''' self._createNode(document, variable, feed) for item in self.items: itemElement = document.createElement('entry') feed.appendChild(itemElement) for itemEntry in item: self._createNode(document, itemEntry, itemElement); ''' elementName = itemEntry['name'] if 'namespace' in itemEntry: elementName = itemEntry['namespace']+':'+elementName variableElement = document.createElement(elementName) itemElement.appendChild(variableElement) if 'value' in itemEntry: value = itemEntry['value'] if isinstance(value, list): if len(value) > 1: for valueEntry in value: valueName = 'value' if 'namespace' in itemEntry: valueName = itemEntry['namespace']+':'+valueName valueElement = document.createElement(valueName) variableElement.appendChild(valueElement) valueElement.appendChild(document.createTextNode(xml.sax.saxutils.escape(str(valueEntry)))) else: variableElement.appendChild(document.createTextNode(xml.sax.saxutils.escape(str(value[0])))) elif isinstance(value, dict): for key in value.keys(): valueName = key if 'namespace' in itemEntry: valueName = itemEntry['namespace']+':'+valueName valueElement = document.createElement(valueName) variableElement.appendChild(valueElement) valueElement.appendChild(document.createTextNode(xml.sax.saxutils.escape(str(value[key])))) else: variableElement.appendChild(document.createTextNode(xml.sax.saxutils.escape(str(value)))) else: if 'attribute' in itemEntry: for attr in itemEntry['attribute'].keys(): variableElement.setAttribute(attr, itemEntry['attribute'][attr]) ''' return document.toprettyxml() if pretty else document.toxml('utf-8') def _createNode(self, document, itemEntry, itemElement): elementName = itemEntry['name'] if 'namespace' in itemEntry: elementName = itemEntry['namespace']+':'+elementName variableElement = document.createElement(elementName) itemElement.appendChild(variableElement) if 'value' in itemEntry: value = itemEntry['value'] if isinstance(value, list): for valueEntry in value: self._createNode(document, valueEntry, variableElement) elif isinstance(value, dict): self._createNode(document, value, variableElement) else: variableElement.appendChild(document.createTextNode(xml.sax.saxutils.escape(str(value)))) if 'attribute' in itemEntry: for attr in list(itemEntry['attribute'].keys()): variableElement.setAttribute(attr, itemEntry['attribute'][attr])