ISCE_INSAR/components/isceobj/Renderer/XmlRenderer.py

135 lines
4.8 KiB
Python

#!/usr/bin/env python3
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Copyright 2010 California Institute of Technology. ALL RIGHTS RESERVED.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# United States Government Sponsorship acknowledged. This software is subject to
# U.S. export control laws and regulations and has been classified as 'EAR99 NLR'
# (No [Export] License Required except when exporting to an embargoed country,
# end user, or in support of a prohibited end use). By downloading this software,
# the user agrees to comply with all applicable U.S. export laws and regulations.
# The user has the responsibility to obtain export licenses, or other export
# authority as may be required before exporting this software to any 'EAR99'
# embargoed foreign country or citizen of those countries.
#
# Author: Walter Szeliga
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
import types
import datetime
from xml.etree import ElementTree
from iscesys.Component.Component import Component
from iscesys.Util.decorators import type_check
##
# This class provides a basis for image and metadata renderers (How?)
#
class BaseRenderer(Component):
## This is overridden, so why does it exisit?
dictionaryOfVariables = {'COMPONENT': ['component',
Component,
True]}
@type_check(Component)
def setComponent(self, component):
self._component = component
def getComponent(self):
return self._component
component = property(getComponent, setComponent)
pass
##
# A class to render metadata in xml format
#
#class XmlRenderer(Component,BaseRenderer):
class XmlRenderer(BaseRenderer):
dictionaryOfVariables = {'OUTPUT': ['output','str','mandatory']}
def __init__(self):
super(XmlRenderer, self).__init__()
self.component = None
self.output = None
self.variables = {}
self.documentation = {}
self.descriptionOfVariables = {}
return None
def setComponent(self, component):
self.component = component
self.variables = component.dictionaryOfVariables
self.documentation = component.descriptionOfVariables
def setOutput(self,output):
self.output = output
def getOutput(self):
return self.output
def render(self):
root = ElementTree.Element('component')
self.subrender(root)
from isceobj.XmlUtil.xmlUtils import indent
indent(root)
tree = ElementTree.ElementTree(root)
tree.write(self.output)
pass
# change note; how can the attribute.replace work with 'self' removed from
# the dict?
# Why the exec statements? There are assig nments (eval works). Why use eval.
# there are on variables in them? the needs refactoring
def subrender(self,root):
value = 'value'
selfPos = 0
typePos = 1
nameSubEl = ElementTree.SubElement(root,'name')
nameSubEl.text = self.component.__class__.__name__
for key, val in self.variables.items():
propSubEl = ElementTree.SubElement(root,'property')
isUndef = False
ElementTree.SubElement(propSubEl, 'name').text = key
attribute = val[selfPos]
attribute = attribute.replace('self.','self.component.')
exec('type = ' + attribute + '.__class__')
# type = attribute.__class__
if (type in [types.NoneType,types.IntType,types.LongType,types.StringType,types.FloatType,datetime.datetime]):
exec('ElementTree.SubElement(propSubEl, \'value\').text = str(' + attribute + ')')
elif (type == types.ListType):
exec('valList = ' + attribute)
# Test by printing to the screen
#for val in valList:
# print val
else:
exec('component = ' + attribute)
subrenderer = XmlRenderer()
subrenderer.setComponent(component)
subrenderer.subrender(root)
if key in self.documentation:
for keyDict,valDict in self.documentation[key].items():
ElementTree.SubElement(propSubEl,keyDict).text = str(valDict)