| import logging |
| |
| from xml.dom.minidom import Document |
| import xml.sax.saxutils |
| |
| from edge.opensearch.response import Response |
| |
| class RssResponse(Response): |
| def __init__(self): |
| super(RssResponse, self).__init__() |
| self.namespaces = { |
| '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/', |
| 'atom': 'http://www.w3.org/2005/Atom' |
| } |
| |
| self.title = None |
| self.link = None |
| self.description = None |
| self.variables = [] |
| self.items = [] |
| 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('RssResponse.generate is called.') |
| |
| document = Document() |
| rss = document.createElement('rss') |
| rss.setAttribute('version', '2.0') |
| for namespace in list(self.namespaces.keys()): |
| rss.setAttribute('xmlns:'+namespace, self.namespaces[namespace]) |
| document.appendChild(rss) |
| |
| channel = document.createElement('channel') |
| rss.appendChild(channel) |
| |
| title = document.createElement('title') |
| channel.appendChild(title) |
| title.appendChild(document.createTextNode(xml.sax.saxutils.escape(self.title))) |
| |
| description = document.createElement('description') |
| channel.appendChild(description) |
| description.appendChild(document.createTextNode(xml.sax.saxutils.escape(self.description))) |
| |
| link = document.createElement('link') |
| channel.appendChild(link) |
| link.appendChild(document.createTextNode(xml.sax.saxutils.escape(self.link))) |
| |
| for variable in self.variables: |
| ''' |
| elementName = variable['name'] |
| if 'namespace' in variable: |
| elementName = variable['namespace']+':'+elementName |
| |
| variableElement = document.createElement(elementName) |
| channel.appendChild(variableElement) |
| variableElement.appendChild(document.createTextNode(xml.sax.saxutils.escape(str(variable['value'])))) |
| ''' |
| self._createNode(document, variable, channel) |
| |
| for item in self.items: |
| itemElement = document.createElement('item') |
| channel.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) |
| |
| 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)))) |
| ''' |
| 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]) |