135 lines
4.8 KiB
Python
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)
|
|
|
|
|
|
|
|
|