source: TI02-CSML/trunk/csml/parser.py @ 2025

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI02-CSML/trunk/csml/parser.py@2025
Revision 2025, 37.0 KB checked in by domlowe, 13 years ago (diff)

support for ValueArray and xlink attributes in rangeSet

Line 
1import cElementTree as ET
2import elementtree.ElementTree as etree
3import parser_extra
4import sys, traceback
5'''CSML v2 Parser ''' 
6
7#this map needs updating for V2
8etree._namespace_map.update({'http://www.opengis.net/om': 'om', 'http://www.opengis.net/swe': 'swe',  'http://www.opengis.net/gml': 'gml','http://ndg.nerc.ac.uk/csml' : 'csml', 'http://www.w3.org/1999/xlink':'xlink'})
9
10nsCSML = 'http://ndg.nerc.ac.uk/csml'
11nsGML = 'http://www.opengis.net/gml'
12nsOM = 'http://www.opengis.net/om'
13nsXLINK = 'http://www.w3.org/1999/xlink'
14nsXML = 'http://ndg.nerc.ac.uk/csml'
15nsMOLES='http://ndg.nerc.ac.uk/moles'
16nsSWE='http://www.opengis.net/swe'
17   
18def myQName(uri,tag):
19    return "{"+uri+"}"+tag
20
21def CSML(tag):
22    return myQName(nsCSML,tag)
23
24def GML(tag):
25    return myQName(nsGML,tag)
26
27def SWE(tag):
28    return myQName(nsSWE,tag)
29
30def XLINK(tag):
31    return myQName(nsXLINK,tag)
32
33def addchildren(obj, dict):
34    ''' merges (adds) dictionary to existing self.CHILDREN dictionary '''
35    dict1 = dict
36    if hasattr(obj, 'CHILDREN'):
37      dict2=obj.CHILDREN
38    else:
39      dict2={}
40    dict3={}
41    for item in dict1:
42        dict3[item] =dict1[item]
43    for item in dict2:
44        dict3[item] =dict2[item]
45    obj.CHILDREN=dict3
46   
47
48def addatts(obj, atts):
49  ''' merges self.ATTRIBUTES'''
50  if hasattr(obj, 'ATTRIBUTES'):
51    for att in atts:
52        obj.ATTRIBUTES.append(att)
53  else:
54    obj.ATTRIBUTES=atts
55
56
57#Some variable definitions: these things are often repeated so store in variables.
58FILEFORMATS=[CSML('NetCDFExtract'),CSML('NASAAmesExtract'), CSML('GRIBExtract'),CSML('CDMLExtract'), CSML('RawFileExtract')]
59
60
61class csElement(object):
62    ''' main csElement class - all other elements inherit from this baseclass 
63    all the from/to XML conversion is done by this class'''
64   
65    def __init__(self, **kwargs):
66        if not hasattr(self, 'ATTRIBUTES'):
67            self.__dict__['ATTRIBUTES']=[]
68   
69    #The __setattr__ and __getattribute__ special methods have been overridden.
70    #This is so that attributes can be called by their fully qualified name internally
71    #while being referenced by their short name externally.
72    # so 'id' and {'http://www.opengis.net/gml'}id always have the same value
73    #you can set either of them at any time and the other will be kept in sync.
74       
75    def __setattr__(self, name, value):
76        if hasattr(self, CSML(name)):
77            object.__setattr__(self, CSML(name), value)
78            object.__setattr__(self, name, value)
79        elif hasattr(self,GML(name)):
80            object.__setattr__(self, GML(name), value)
81            object.__setattr__(self, name, value)
82        elif hasattr(self,XLINK(name)):
83            object.__setattr__(self, XLINK(name), value)
84            object.__setattr__(self, name, value)
85        else:
86            if hasattr(self, 'ATTRIBUTES'):
87                if CSML(name) in self.__dict__['ATTRIBUTES']:
88                    object.__setattr__(self, CSML(name), value)
89                    object.__setattr__(self, name, value)
90                elif GML(name) in self.__dict__['ATTRIBUTES']:
91                    object.__setattr__(self, GML(name), value)
92                    object.__setattr__(self, name, value)
93                elif XLINK(name) in self.__dict__['ATTRIBUTES']:
94                    object.__setattr__(self, XLINK(name), value)
95                    object.__setattr__(self, name, value)
96                elif name in self.__dict__['ATTRIBUTES']:
97                    object.__setattr__(self, name, value)
98                    try:
99                        name=name.split('}')[1]
100                    except IndexError:
101                        pass
102                    object.__setattr__(self, name, value)
103                else:
104                    object.__setattr__(self, name, value)
105            else:
106                    object.__setattr__(self, name, value)
107   
108    def __getattribute__(self, name):
109            if CSML(name) in object.__dict__:
110                return object.__getattribute__(self,CSML(name))
111            elif GML(name) in object.__dict__:
112                return object.__getattribute__(self,GML(name))
113            elif XLINK(name) in object.__dict__:
114                return object.__getattribute__(self,XLINK(name))
115            else:
116                return object.__getattribute__(self,name) 
117       
118    def __removeURI(self, qname):
119        try:
120            attname = qname.split('}')[1]
121        except IndexError:
122            attname = qname
123        return attname
124       
125    def _getSubstitutionType(self,tag):
126        return tag.split('}')[1]
127       
128   
129    def _getReverseSubsType(self, typename):
130        return typename
131   
132    def addChildElem(self, childname, childobj):
133        #sometimes you want to add a child element but don't know if there is one already. In which case you want to create a list of child objects.
134        if hasattr(self, childname):
135            currentattribute=getattr(self,childname)
136            if type(getattr(self,childname)) is list:
137                currentattribute.append(childobj)
138            else:
139                newlist=[currentattribute]
140                newlist.append(childobj)
141                setattr(self,childname, newlist)
142        else:
143            setattr(self,childname, childobj)
144
145    def toXML(self, csmlfrag):
146        #process self and convert to XML
147        if hasattr(self, 'CONTENT'):
148            if self.CONTENT is not None: csmlfrag.text=self.CONTENT
149        if hasattr(self, 'ATTRIBUTES'):
150            for item in self.__dict__:
151                if item in self.ATTRIBUTES:                   
152                    csmlfrag.set(item, self.__dict__[item])
153            for item in self.__dict__:
154                if GML(item) in self.ATTRIBUTES:
155                    csmlfrag.set(GML(item), self.__dict__[item])       
156    # self.CHILDREN (recursive - calls the toXML method of children
157        for att in self.__dict__:
158            if att not in ['ATTRIBUTES', 'CHILDREN', 'CONTENT']:
159                for child in self.CHILDREN:
160                    if child == att:
161                        parserobjects=[]
162                        if type(self.__dict__[att]) is list:
163                            for a in self.__dict__[att]:
164                                parserobjects.append(a)
165                        else:
166                            parserobjects.append(self.__dict__[att])
167                        parentfrag=None
168                        if len(self.CHILDREN[child])>=3:
169                                ename2=self.CHILDREN[child][2]
170                                parentfrag=ET.Element(ename2)
171                        for po in parserobjects:
172                            if type(self.CHILDREN[child][0]) is not list:
173                                ename=self.CHILDREN[child][0]
174                            else:
175                                ename = self._getReverseSubsType(type(po).__name__)
176                            if len(self.CHILDREN[child])==3:
177                                frag=ET.Element(ename)
178                                po.toXML(frag)
179                                parentfrag.append(frag)
180                                appendLater=True
181                            elif len(self.CHILDREN[child])>=4:
182                                if self.CHILDREN[child][3]==1:
183                                    frag=ET.Element(ename)
184                                    po.toXML(frag)
185                                    parentfrag.append(frag)
186                                    csmlfrag.append(parentfrag)
187                                    parentfrag=ET.Element(parentfrag.tag)
188                                    appendLater=False
189                            else:
190                                frag=ET.Element(ename)
191                                try:
192                                    po.toXML(frag)
193                                except:
194                                    print 'PARSING ERROR - could not convert %s to XML'%frag
195                                    raise
196                                csmlfrag.append(frag)
197                                appendLater=True
198                        if appendLater==True and parentfrag != None:
199                            csmlfrag.append(parentfrag)
200        return csmlfrag
201       
202    def fromXML(self,csmlfrag):
203        # deal with attributes, e.g. gml id's
204        if csmlfrag.text is not None:
205                self.CONTENT = csmlfrag.text
206        for item in csmlfrag.items():
207            if item[0] in self.ATTRIBUTES:
208                setattr(self, item[0], item[1])
209        #self.CHILDREN (recursive - calls the fromXML method of children
210        for frag in csmlfrag[:]:
211            #for each child element
212            #iterate through expected CHILDREN
213            for child in self.CHILDREN:
214                #get element name
215                if len(self.CHILDREN[child])>=3:
216                    ename = self.CHILDREN[child][2]
217                    ename2 = self.CHILDREN[child][0]
218                   
219                else:
220                    ename = self.CHILDREN[child][0] 
221                    ename2=None
222                #if there are options, then find the name that matches the frag
223                if ename2 is not None:
224                    if frag[:] != []:
225                        for subfrag in frag[:]:
226                            etype=None
227                            if type(ename2) is list:
228                                if subfrag.tag in ename2:
229                                    etype=self._getSubstitutionType(subfrag.tag)
230                            if subfrag.tag==ename2:
231                                etype=self.CHILDREN[child][1]
232                            if etype:
233                                childobj=eval(etype)()
234                                if len(self.CHILDREN[child])>=3:
235                                    if frag[:] != []:
236                                        childobj.fromXML(subfrag)
237                                else:
238                                    childobj.fromXML(frag)
239                                #set this object to be an attribute of the 'parent' (self) object
240                                if hasattr(self, child):
241                                    if type(self.__dict__[child]) is not list:
242                                        tmp=self.__dict__[child]
243                                        setattr(self, child, [tmp]) #convert to list
244                                    self.__dict__[child].append(childobj)
245                                else:
246                                    setattr(self, child, childobj)
247                else:
248                    etype=None
249                    if type(ename) is list:
250                        if frag.tag in ename:
251                            etype=self._getSubstitutionType(frag.tag)
252                    elif frag.tag==ename:
253                        etype=self.CHILDREN[child][1]
254                    if etype:
255                        childobj=eval(etype)()
256                        if len(self.CHILDREN[child])>=3:
257                            if frag[:] != []:
258                                childobj.fromXML(frag[0])
259                        else:
260                            childobj.fromXML(frag)
261                           
262                        #set this object to be an attribute of the 'parent' (self) object
263                        if hasattr(self, child):
264                            if type(self.__dict__[child]) is not list:
265                                tmp=self.__dict__[child]
266                                setattr(self, child, [tmp]) #convert to list
267                            self.__dict__[child].append(childobj)
268                        else:
269                            setattr(self, child, childobj)
270
271               
272class csString(csElement):
273    def __init__(self, text=None,**kwargs):
274        if text != None:
275            if type(text) is not str:
276                text=str(text)
277            self.CONTENT=text
278        children={}
279        addchildren(self,children)
280   
281class AbstractGML(csElement):
282    def __init__(self, **kwargs):
283        a=[GML('id'), GML('description'), GML('name'), GML('MetaDataProperty')]
284        addatts(self,a)
285
286class AssociationAttributeGroup(csElement):
287    def __init__(self, **kwargs):
288        a =[XLINK('href'),XLINK('role'), XLINK('arcrole'),XLINK('title'), XLINK('show'), XLINK('actuate')] 
289        addatts(self,a)
290
291class SRSReferenceGroup(csElement):
292    def __init__(self, **kwargs):
293        a =['srsName','srsDimension'] 
294        addatts(self,a)
295       
296class SRSInformationGroup(csElement):
297    def __init__(self, **kwargs):
298        a =['uomLabels','axisLabels'] 
299        addatts(self,a)
300
301class ArrayDescriptor(AbstractGML, csElement):
302    def __init__(self,**kwargs):
303        AbstractGML.__init__(self,**kwargs)
304        children={'arraySize':[CSML('arraySize'), 'csString'], 'uom':[CSML('uom'),'csString'], 'numericType':[CSML('numericType'),'csString'], 'regExpTransform':[CSML('regExpTransform'),'csString'], 'numericTransform':[CSML('numericTransform'),'csString']}
305        addchildren(self,children)
306
307class DirectPosition(AbstractGML, SRSReferenceGroup,SRSInformationGroup,csElement):
308    def __init__(self, **kwargs):
309        AbstractGML.__init__(self,**kwargs)
310
311class GridEnvelope(AbstractGML,SRSReferenceGroup, csElement):
312    def __init__(self, **kwargs):
313        SRSReferenceGroup.__init__(self,**kwargs)
314        AbstractGML.__init__(self,**kwargs)
315        children={'low':[GML('low'), 'csString'],'high':[GML('high'), 'csString']}
316        addchildren(self,children)
317
318class Envelope(AbstractGML,SRSReferenceGroup, csElement):
319    def __init__(self, **kwargs):
320        SRSReferenceGroup.__init__(self,**kwargs)
321        AbstractGML.__init__(self,**kwargs)
322        children={'lowerCorner':[GML('lowerCorner'), 'DirectPosition'],'upperCorner':[GML('upperCorner'), 'DirectPosition']}
323        addchildren(self,children)
324
325
326class AbstractFeature(AbstractGML,csElement):
327    def __init__(self, **kwargs):
328        AbstractGML.__init__(self,**kwargs)
329        children={'boundedBy':[GML('boundedBy'), 'Envelope']}
330        addchildren(self,children)
331
332class AbstractFeatureCollection(AbstractFeature,csElement):
333    def __init__(self, **kwargs):
334        AbstractFeature.__init__(self,**kwargs)
335
336class DomainSet(AbstractGML,AssociationAttributeGroup,csElement):
337    def __init__(self, **kwargs):
338        AbstractGML.__init__(self,**kwargs)
339        addchildren(self,{})
340
341class AggregatedArray(ArrayDescriptor,csElement):
342    def __init__(self, **kwargs):
343        ArrayDescriptor.__init__(self,**kwargs)
344        children={'aggType':[CSML('aggType'),'csString'], 'aggIndex':[CSML('aggIndex'),'csString'],'components':[FILEFORMATS, 'ArrayDescriptor',CSML('component')]}
345        addchildren(self,children)
346#'component':[CSML:('component'), 'ArrayDescriptor', CSML('component')],
347class MeasureOrNullList(AbstractGML,csElement):
348    def __init__(self, **kwargs):
349        AbstractGML.__init__(self,**kwargs)
350        children={}
351        addchildren(self,children)
352        a =['uom'] 
353        addatts(self,a)
354       
355class CompositeValue(AbstractGML,csElement):
356    def __init__(self, **kwargs):
357        AbstractGML.__init__(self,**kwargs)
358        children={'measures':[GML('measure'),'csString',GML('valueComponents')]}
359        addchildren(self,children)
360       
361class DataBlock(AbstractGML,csElement):
362    #THIS IS INCOMPLETE
363    def __init__(self, **kwargs):
364        AbstractGML.__init__(self,**kwargs)
365        children={'doubleOrNullTupleList':[GML('doubleOrNullTupleList'),'csString'],'rangeParameters':[GML('CompositeValue'), 'CompositeValue', GML('rangeParameters')]}
366        addchildren(self,children)
367
368
369class ValueComponent(AbstractGML, AssociationAttributeGroup, csElement):
370    def __init__(self, **kwargs):
371        AbstractGML.__init__(self,**kwargs)
372        AssociationAttributeGroup.__init__(self,**kwargs)
373        children=children={'quantityList':[GML('QuantityList'), 'MeasureOrNullList']}
374        addchildren(self,children)
375
376
377class ValueArray(AbstractGML, csElement):
378    def __init__(self, **kwargs):
379        AbstractGML.__init__(self,**kwargs)
380        #this is a bit of a diversion from the object/property pattern but is necessary to
381        #make valueComponent a class so valueComponent can have xlink attributes
382        children=children={'valueComponent':[GML('valueComponent'), 'ValueComponent', ]}
383        addchildren(self,children)
384       
385class RangeSet(AbstractGML,AssociationAttributeGroup,csElement):
386    def __init__(self, **kwargs):
387        AbstractGML.__init__(self,**kwargs)
388        AssociationAttributeGroup.__init__(self,**kwargs)
389        children={'quantityList':[GML('QuantityList'), 'MeasureOrNullList'],        'dataBlock':[GML('DataBlock'),'DataBlock'],'arrayDescriptor':[FILEFORMATS, 'ArrayDescriptor'],  'aggregatedArray':[CSML('AggregatedArray'), 'AggregatedArray'],
390        'valueArray':[GML('ValueArray'),'ValueArray']}
391        addchildren(self,children)
392
393class MultiPoint(AbstractGML, SRSReferenceGroup,csElement):
394    def __init__(self, **kwargs):
395        AbstractGML.__init__(self,**kwargs)
396        SRSReferenceGroup.__init__(self,**kwargs)
397        children={'pointMember':[GML('pointMember'), 'csString'],'pointMembers':[GML('pointMember'), 'csString']}
398        addchildren(self,children)
399
400class Point(AbstractGML,SRSReferenceGroup,csElement):
401    def __init__(self, **kwargs):
402        AbstractGML.__init__(self,**kwargs)
403        SRSReferenceGroup.__init__(self,**kwargs)
404        children={'pos':[GML('pos'), 'csString'],'coordinates':[GML('coordinates'), 'csString']}
405        addchildren(self,children)
406
407class PointDomain(DomainSet, MultiPoint,csElement):
408    def __init__(self, **kwargs):
409        DomainSet.__init__(self,**kwargs)
410        MultiPoint.__init__(self,**kwargs)
411        children={}
412        addchildren(self,children)
413
414class ProfileDomain(DomainSet, MultiPoint,csElement):
415    def __init__(self, **kwargs):
416        DomainSet.__init__(self,**kwargs)
417        MultiPoint.__init__(self,**kwargs)
418        children={}
419        addchildren(self,children)
420
421
422
423class AbstractCoverage(AbstractFeature, csElement):
424    def __init__(self, **kwargs):
425        AbstractFeature.__init__(self,**kwargs)
426
427class AbstractDiscreteCoverage(AbstractCoverage, csElement):
428    def __init__(self, **kwargs):
429        AbstractCoverage.__init__(self,**kwargs)
430        addchildren(self,{})
431       
432class Definition(AbstractGML):
433    def __init__(self, **kwargs):
434        AbstractGML.__init__(self,**kwargs)
435        addchildren(self,{})
436
437class Phenomenon(Definition,AssociationAttributeGroup):
438    def __init__(self, **kwargs):
439        Definition.__init__(self,**kwargs)
440        AssociationAttributeGroup.__init__(self,**kwargs)
441        children = {'':[CSML(''), '']}   
442        addchildren(self,children)
443       
444class SpatialOrTemporalPositionList(AbstractGML,csElement):
445    def __init__(self, **kwargs):
446        AbstractGML.__init__(self,**kwargs)
447        children={'coordinateList':[CSML('coordinateList'),'csString'], 'timePositionList':[CSML('timePositionList'),'TimePositionList']}
448        addchildren(self,children)
449        a=['frame']
450        addatts(self,a)
451
452class GridOrdinateDescription(AbstractGML,csElement):
453    def __init__(self, **kwargs):
454        AbstractGML.__init__(self,**kwargs)
455        children={'coordAxisLabel':[CSML('coordAxisLabel'), 'csString'], 'coordAxisValues':[CSML('SpatialOrTemporalPositionList'),'SpatialOrTemporalPositionList',CSML('coordAxisValues')], 'gridAxesSpanned':[CSML('gridAxesSpanned'), 'csString'], 'sequenceRule':[CSML('sequenceRule'),'SequenceRule']}
456        addchildren(self,children)
457
458class SequenceRule(csElement):
459    def __init__(self, **kwargs):
460        a=['axisOrder']
461        addatts(self,a)
462        children={}
463        addchildren(self,children)
464
465class GridPointDescription(AbstractGML,csElement):
466    def __init__(self, **kwargs):
467        AbstractGML.__init__(self,**kwargs)
468        children={'posList':[CSML('posList'),'csString'],'sequenceRule':[CSML('sequenceRule'),'SequenceRule']}
469        addchildren(self,children)
470
471
472class TimePositionList(AbstractGML,csElement):
473    def __init__(self,**kwargs):
474        a=['frame', 'calendarEraName','indeterminatePosition']
475        addatts(self,a)
476        addchildren(self,{})
477   
478
479class GridCoordinatesTable(AbstractGML,csElement):
480    def __init__(self,**kwargs):
481        '''the additional value '1' in the children dictionary is used to signify that the elements must be nested as:
482        <gml:ordinate>
483            <gml:GridOrdinateDescription>
484        </gml:ordinate>
485        <gml:ordinate>
486            <gml:GridOrdinateDescription>
487        </gml:ordinate>
488       
489        not as:
490        <gml:ordinate>
491            <gml:GridOrdinateDescription>
492            <gml:GridOrdinateDescription>
493        </gml:ordinate> '''
494        AbstractGML.__init__(self,**kwargs)
495        children={'gridOrdinates':[CSML('GridOrdinateDescription'), 'GridOrdinateDescription',CSML('gridOrdinate'),1], 'gridPoints':[CSML('GridPointDescription'),'GridPointDescription',CSML('gridPoints')]}
496        addchildren(self,children)
497       
498class ReferenceableGrid(AbstractGML, AssociationAttributeGroup, SRSInformationGroup, SRSReferenceGroup,csElement):
499    def __init__(self, **kwargs):
500        AbstractGML.__init__(self,**kwargs)
501        AssociationAttributeGroup.__init__(self,**kwargs)
502        SRSReferenceGroup.__init__(self,**kwargs)
503        SRSInformationGroup.__init__(self,**kwargs)
504        children={'coordTransformTable':[CSML('GridCoordinatesTable'), 'GridCoordinatesTable', CSML('coordTransformTable')],'aLabels':[CSML('axisLabels'),'csString'], 'limits':[GML('GridEnvelope'),'GridEnvelope',CSML('limits')]}
505        addchildren(self,children)
506
507
508class ReferenceableGridCoverage(AbstractDiscreteCoverage, csElement):
509    def __init__(self, **kwargs):
510        AbstractDiscreteCoverage.__init__(self,**kwargs)
511        children={'referenceableGridDomain':[CSML('ReferenceableGrid'),'ReferenceableGrid' ,CSML('referenceableGridDomain') ]}
512        addchildren(self,children)
513       
514class AlternatePointCoverage(AbstractDiscreteCoverage, csElement):
515    def __init__(self, **kwargs):
516        AbstractDiscreteCoverage.__init__(self,**kwargs)
517        children={'alternatePointDomain':[GML('Point'),'Point', CSML('alternatePointDomain')], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
518        addchildren(self,children)
519
520
521class ProfileCoverage(AbstractDiscreteCoverage, csElement):
522    def __init__(self, **kwargs):
523        AbstractDiscreteCoverage.__init__(self,**kwargs)
524        children={'profileDomain':[CSML('ProfileDomain'),'ProfileDomain' ,CSML('profileDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
525        addchildren(self,children)
526
527class PointCoverage(AbstractDiscreteCoverage, csElement):
528    def __init__(self, **kwargs):
529        AbstractDiscreteCoverage.__init__(self,**kwargs)
530        children={'pointDomain':[CSML('PointDomain'),'PointDomain' ,CSML('pointDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
531        addchildren(self,children)
532       
533class TimeSeriesDomain(AbstractGML, csElement):
534    def __init__(self, **kwargs):
535        AbstractGML.__init__(self,**kwargs)
536        children={'time':[CSML('time'), 'csString']}
537        addchildren(self,children)
538       
539
540class PointSeriesCoverage(AbstractDiscreteCoverage, csElement):
541    def __init__(self, **kwargs):
542        AbstractDiscreteCoverage.__init__(self,**kwargs)
543        children={'pointSeriesDomain':[CSML('TimeSeriesDomain'),'TimeSeriesDomain' ,CSML('pointSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
544        addchildren(self,children)
545
546class ProfileSeriesDomain(ReferenceableGrid, DomainSet, csElement):
547    def __init__(self, **kwargs):
548        DomainSet.__init__(self,**kwargs)
549        ReferenceableGrid.__init__(self,**kwargs)
550        children={}
551        addchildren(self,children)
552
553class ProfileSeriesCoverage(AbstractDiscreteCoverage,csElement):
554    def __init__(self, **kwargs):
555        AbstractDiscreteCoverage.__init__(self,**kwargs)
556        children={'profileSeriesDomain':[CSML('ProfileSeriesDomain'),'ProfileSeriesDomain' ,CSML('profileSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
557        addchildren(self,children)
558       
559class SectionDomain(ReferenceableGrid, DomainSet, csElement):
560    def __init__(self, **kwargs):
561        DomainSet.__init__(self,**kwargs)
562        ReferenceableGrid.__init__(self,**kwargs)
563        children={}
564        addchildren(self,children)
565       
566class SectionCoverage(AbstractDiscreteCoverage,csElement):
567    def __init__(self, **kwargs):
568        AbstractDiscreteCoverage.__init__(self,**kwargs)
569        children={'sectionDomain':[CSML('SectionDomain'),'SectionDomain' ,CSML('sectionDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
570        addchildren(self,children)
571
572class TrajectoryDomain(ReferenceableGrid, DomainSet, csElement):
573    def __init__(self, **kwargs):
574        DomainSet.__init__(self,**kwargs)
575        ReferenceableGrid.__init__(self,**kwargs)
576        children={}
577        addchildren(self,children)
578       
579class TrajectoryCoverage(AbstractDiscreteCoverage,csElement):
580    def __init__(self, **kwargs):
581        AbstractDiscreteCoverage.__init__(self,**kwargs)
582        children={'trajectoryDomain':[CSML('TrajectoryDomain'),'TrajectoryDomain' ,CSML('trajectoryDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
583        addchildren(self,children)
584
585
586class ScanningRadarDomain(ReferenceableGrid, DomainSet, csElement):
587    def __init__(self, **kwargs):
588        DomainSet.__init__(self,**kwargs)
589        ReferenceableGrid.__init__(self,**kwargs)
590        children={}
591        addchildren(self,children)
592       
593class ScanningRadarCoverage(AbstractDiscreteCoverage,csElement):
594    def __init__(self, **kwargs):
595        AbstractDiscreteCoverage.__init__(self,**kwargs)
596        children={'scanningRadarDomain':[CSML('ScanningRadarDomain'),'ScanningRadarDomain' ,CSML('scanningRadarDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
597        addchildren(self,children)
598
599
600class GridSeriesDomain(ReferenceableGrid, csElement):
601    def __init__(self, **kwargs):
602        #DomainSet.__init__(self,**kwargs)
603        ReferenceableGrid.__init__(self,**kwargs)
604        children={}
605        addchildren(self,children)
606       
607class GridSeriesCoverage(AbstractDiscreteCoverage,csElement):
608    def __init__(self, **kwargs):
609        AbstractDiscreteCoverage.__init__(self,**kwargs)
610        children={'gridSeriesDomain':[CSML('GridSeriesDomain'),'GridSeriesDomain' ,CSML('gridSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
611        addchildren(self,children)
612
613class AlternatePointFeature(AbstractFeature, csElement):
614    def __init__(self, **kwargs):
615        AbstractFeature.__init__(self,**kwargs)
616        children={'location':[CSML('location'), 'csString'],'time':[CSML('time'), 'csString'], 'value':[CSML('AlternatePointCoverage'), 'AlternatePointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
617        addchildren(self,children)
618
619class PointFeature(AbstractFeature, csElement):
620    def __init__(self, **kwargs):
621        AbstractFeature.__init__(self,**kwargs)
622        children={'location':[CSML('location'), 'csString'],'time':[CSML('time'), 'csString'], 'value':[CSML('PointCoverage'), 'PointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
623        addchildren(self,children)
624
625class PointCollectionFeature(AbstractFeature, csElement):
626    def __init__(self, **kwargs):
627        AbstractFeature.__init__(self,**kwargs)
628        children={'time':[CSML('time'), 'csString'], 'value':[CSML('MultiPointCoverage'), 'MultiPointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
629        addchildren(self,children)
630
631
632class PointSeriesFeature(AbstractFeature, csElement):
633    def __init__(self, **kwargs):
634        AbstractFeature.__init__(self,**kwargs)
635        children={'location':[CSML('location'), 'csString'], 'value':[CSML('PointSeriesCoverage'), 'PointSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
636        addchildren(self,children)
637
638
639class GridFeature(AbstractFeature, csElement):
640    def __init__(self, **kwargs):
641        AbstractFeature.__init__(self,**kwargs)
642        children={'time':[CSML('time'), 'csString'], 'value':[CSML('ReferenceableGridCoverage'), 'ReferenceableGridCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
643        addchildren(self,children)
644
645class GridSeriesFeature(AbstractFeature, csElement):
646    def __init__(self, **kwargs):
647        AbstractFeature.__init__(self,**kwargs)
648        children={'value':[CSML('GridSeriesCoverage'), 'GridSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
649        addchildren(self,children)
650
651class ProfileFeature(AbstractFeature, csElement):
652    def __init__(self, **kwargs):
653        AbstractFeature.__init__(self,**kwargs)
654        children={'time':[CSML('time'), 'csString'],'location':[CSML('location'), 'csString'], 'value':[CSML('ProfileCoverage'), 'ProfileCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
655        addchildren(self,children)
656
657class ProfileSeriesFeature(AbstractFeature, csElement):
658    def __init__(self, **kwargs):
659        AbstractFeature.__init__(self,**kwargs)
660        children={'location':[CSML('location'), 'csString'], 'value':[CSML('ProfileSeriesCoverage'), 'ProfileSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
661        addchildren(self,children)
662
663class RaggedProfileSeriesFeature(AbstractFeature, csElement):
664    def __init__(self, **kwargs):
665        AbstractFeature.__init__(self,**kwargs)
666        children={'location':[CSML('location'), 'csString'], 'profileLength':[CSML('profileLength'), 'csString'],'value':[CSML('ProfileSeriesCoverage'), 'ProfileSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
667        addchildren(self,children)
668
669class RaggedSectionFeature(AbstractFeature, csElement):
670    def __init__(self, **kwargs):
671        AbstractFeature.__init__(self,**kwargs)
672        children={'stationLocations':[CSML('stationLocations'), 'csString'], 'stationTimes':[CSML('stationTimes'), 'csString'],'profileLength':[CSML('profileLength'),'csString'],'value':[CSML('SectionCoverage'), 'SectionCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
673        addchildren(self,children)
674
675class SectionFeature(AbstractFeature, csElement):
676    def __init__(self, **kwargs):
677        AbstractFeature.__init__(self,**kwargs)
678        children={'stationLocations':[CSML('stationLocations'), 'csString'], 'stationTimes':[CSML('stationTimes'), 'TimePositionList'],'value':[CSML('SectionCoverage'), 'SectionCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
679        addchildren(self,children)
680
681
682
683
684class ScanningRadarFeature(AbstractFeature, csElement):
685    def __init__(self, **kwargs):
686        AbstractFeature.__init__(self,**kwargs)
687        children={'elevation':[CSML('elevation'), 'csString'], 'value':[CSML('ScanningRadarCoverage'), 'ScanningRadarCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
688        addchildren(self,children)
689
690class SwathFeature(AbstractFeature, csElement):
691    def __init__(self, **kwargs):
692        AbstractFeature.__init__(self,**kwargs)
693        children={'eqCrossLon':[CSML('eqCrossLon'), 'csString'],'eqCrossTime':[CSML('eqCrossTime'), 'csString'], 'value':[CSML('ReferenceableGridCoverage'), 'ReferenceableGridCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
694        addchildren(self,children)
695
696class TrajectoryFeature(AbstractFeature, csElement):
697    def __init__(self, **kwargs):
698        AbstractFeature.__init__(self,**kwargs)
699        children={'value':[CSML('TrajectoryCoverage'), 'TrajectoryCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
700        addchildren(self,children)
701
702class FileExtract(ArrayDescriptor, csElement):
703    def __init__(self,**kwargs):
704        ArrayDescriptor.__init__(self,**kwargs)
705        children= {'fileName':[CSML('fileName'), 'csString']}
706        addchildren(self,children)
707
708class NetCDFExtract(FileExtract, csElement):
709    def __init__(self,**kwargs):
710        FileExtract.__init__(self, **kwargs)
711        children={'variableName':[CSML('variableName'), 'csString']}
712        addchildren(self,children)
713
714class NASAAmesExtract(FileExtract, csElement):
715    def __init__(self,**kwargs):
716        FileExtract.__init__(self, **kwargs)
717        children={'variableName':[CSML('variableName'), 'csString'], 'index':[CSML('index'),'csString']}
718        addchildren(self,children)
719
720class CSMLStorageDescriptor(csElement):
721    def __init__(self,**kwargs):
722        addatts(self,[])
723        children={'descriptors':[[CSML('NetCDFExtract'),CSML('PointFeature'),CSML('AggregatedArray')], 'FileExtract', CSML('descriptor')]}
724        addchildren(self,children)
725   
726
727class CSMLFeatureCollection(AbstractFeatureCollection,csElement):
728    def __init__(self,**kwargs):
729        AbstractFeatureCollection.__init__(self,**kwargs)
730        children={'featureMembers':[[CSML('GridFeature'), CSML('GridSeriesFeature'),CSML('PointFeature'),CSML('TrajectoryFeature'),CSML('ProfileFeature'),CSML('ProfileSeriesFeature'),CSML('RaggedProfileSeriesFeature'),CSML('RaggedSectionFeature'),CSML('SectionFeature'),CSML('ScanningRadarFeature'),CSML('PointSeriesFeature'),CSML('AlternatePointFeature')], 'AbstractFeature', GML('featureMember'),1]}
731     
732        addchildren(self,children)
733    def _getSubstitutionType(self,tag):
734        if tag==CSML('GridFeature'):
735            return 'GridFeature'
736        elif tag==CSML('GridSeriesFeature'):
737            return 'GridSeriesFeature'
738        elif tag==CSML('PointFeature'):
739            return 'PointFeature'
740        elif tag==CSML('TrajectoryFeature'):
741            return 'TrajectoryFeature'
742        elif tag==CSML('PointSeriesFeature'):
743            return 'PointSeriesFeature'
744        elif tag==CSML('ProfileFeature'):
745            return 'ProfileFeature'
746        elif tag==CSML('ProfileSeriesFeature'):
747            return 'ProfileSeriesFeature'
748        elif tag==CSML('RaggedProfileSeriesFeature'):
749            return 'RaggedProfileSeriesFeature'
750        elif tag==CSML('RaggedSectionFeature'):
751            return 'RaggedSectionFeature'
752        elif tag==CSML('SectionFeature'):
753            return 'SectionFeature'
754        elif tag==CSML('ScanningRadarFeature'):
755            return 'ScanningRadarFeature'
756        elif tag==CSML('AlternatePointFeature'):
757            return 'AlternatePointFeature'
758        else: return 'AbstractFeature'
759    def _getReverseSubsType(self, typename):
760        if typename== 'GridFeature':
761            return CSML('GridFeature')
762        elif typename == 'GridSeriesFeature':
763            return CSML('GridSeriesFeature')
764        elif typename == 'PointSeriesFeature':
765            return CSML('PointSeriesFeature')
766        elif typename == 'ProfileFeature':
767            return CSML('ProfileFeature')
768        elif typename == 'ProfileSeriesFeature':
769            return CSML('ProfileSeriesFeature')
770        elif typename == 'SectionFeature':
771            return CSML('SectionFeature')
772        elif typename == 'ScanningRadarFeature':
773            return CSML('ScanningRadarFeature')
774        elif typename == 'RaggedSectionFeature':
775            return CSML('RaggedSectionFeature')
776        elif typename == 'RaggedProfileSeriesFeature':
777            return CSML('RaggedProfileSeriesFeature')
778        elif typename == 'PointFeature':
779            return CSML('PointFeature')
780        elif typename == 'TrajectoryFeature':
781            return CSML('TrajectoryFeature')
782        elif typename == 'AlternatePointFeature':
783            return CSML('AlternatePointFeature')
784        else: return CSML('AbstractFeature')
785
786       
787class Dataset(AbstractGML, csElement):   
788    ''' Dataset class, needed as root of tree'''
789    def __init__(self, **kwargs):
790        AbstractGML.__init__(self,**kwargs)
791        children = {'featureCollection':[CSML('CSMLFeatureCollection') ,'CSMLFeatureCollection'],'storageDescriptor':[CSML('CSMLStorageDescriptor'), 'CSMLStorageDescriptor']}
792       
793        addchildren(self,children)
794    def toXML(self):
795        csmlfrag=ET.Element(CSML('Dataset'))
796        csElement.toXML(self, csmlfrag)
797        return csmlfrag
798    #def _getSubstitutionType(self,tag): 
799        #if tag==CSML('NetCDFExtract'):
800            #return 'NetCDFExtract'
801        #elif tag==CSML('NASAAmesExtract'):
802            #return 'NASAAmesExtract'
803        #else: return 'ArrayDescriptor'
804    #def _getReverseSubsType(self, typename):
805        #if typename== 'NetCDFExtract':
806            #return CSML('NetCDFExtract')
807        #elif typename == 'NASAAmesExtract':
808            #return CSML('NASAAmesExtract')
809        #else: return CSML('ArrayDescriptor')
810       
811        return typename
812
813   
814def main():
815    '''round trip for testing purposes:'''
816    print '\n'
817    tree=ET.ElementTree(file='test.xml')
818    ds=Dataset()
819    ds.fromXML(tree.getroot())
820    csmltree=ds.toXML()
821    #print csmltree
822   
823    csmlout=parser_extra.PrettyPrint(csmltree)
824    csmlout=parser_extra.removeInlineNS(csmlout)
825    print '\n %s'% csmlout
826    #for member in ds.featureCollection.members:
827      #print dir(member.value)
828       
829
830if __name__=='__main__':
831    main()
Note: See TracBrowser for help on using the repository browser.