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

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

support for setting XLINK attributes without having to use namespace

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                        #set this object to be an attribute of the 'parent' (self) object
262                        if hasattr(self, child):
263                            if type(self.__dict__[child]) is not list:
264                                tmp=self.__dict__[child]
265                                setattr(self, child, [tmp]) #convert to list
266                            self.__dict__[child].append(childobj)
267                        else:
268                            setattr(self, child, childobj)
269
270               
271class csString(csElement):
272    def __init__(self, text=None,**kwargs):
273        if text != None:
274            if type(text) is not str:
275                text=str(text)
276            self.CONTENT=text
277        children={}
278        addchildren(self,children)
279   
280class AbstractGML(csElement):
281    def __init__(self, **kwargs):
282        a=[GML('id'), GML('description'), GML('name'), GML('MetaDataProperty')]
283        addatts(self,a)
284
285class AssociationAttributeGroup(csElement):
286    def __init__(self, **kwargs):
287        a =[XLINK('href'),XLINK('role'), XLINK('arcrole'),XLINK('title'), XLINK('show'), XLINK('actuate')] 
288        addatts(self,a)
289
290class SRSReferenceGroup(csElement):
291    def __init__(self, **kwargs):
292        a =['srsName','srsDimension'] 
293        addatts(self,a)
294       
295class SRSInformationGroup(csElement):
296    def __init__(self, **kwargs):
297        a =['uomLabels','axisLabels'] 
298        addatts(self,a)
299
300class ArrayDescriptor(AbstractGML, csElement):
301    def __init__(self,**kwargs):
302        AbstractGML.__init__(self,**kwargs)
303        children={'arraySize':[CSML('arraySize'), 'csString'], 'uom':[CSML('uom'),'csString'], 'numericType':[CSML('numericType'),'csString'], 'regExpTransform':[CSML('regExpTransform'),'csString'], 'numericTransform':[CSML('numericTransform'),'csString']}
304        addchildren(self,children)
305
306class DirectPosition(AbstractGML, SRSReferenceGroup,SRSInformationGroup,csElement):
307    def __init__(self, **kwargs):
308        AbstractGML.__init__(self,**kwargs)
309
310class GridEnvelope(AbstractGML,SRSReferenceGroup, csElement):
311    def __init__(self, **kwargs):
312        SRSReferenceGroup.__init__(self,**kwargs)
313        AbstractGML.__init__(self,**kwargs)
314        children={'low':[GML('low'), 'csString'],'high':[GML('high'), 'csString']}
315        addchildren(self,children)
316
317class Envelope(AbstractGML,SRSReferenceGroup, csElement):
318    def __init__(self, **kwargs):
319        SRSReferenceGroup.__init__(self,**kwargs)
320        AbstractGML.__init__(self,**kwargs)
321        children={'lowerCorner':[GML('lowerCorner'), 'DirectPosition'],'upperCorner':[GML('upperCorner'), 'DirectPosition']}
322        addchildren(self,children)
323
324
325class AbstractFeature(AbstractGML,csElement):
326    def __init__(self, **kwargs):
327        AbstractGML.__init__(self,**kwargs)
328        children={'boundedBy':[GML('boundedBy'), 'Envelope']}
329        addchildren(self,children)
330
331class AbstractFeatureCollection(AbstractFeature,csElement):
332    def __init__(self, **kwargs):
333        AbstractFeature.__init__(self,**kwargs)
334
335class DomainSet(AbstractGML,AssociationAttributeGroup,csElement):
336    def __init__(self, **kwargs):
337        AbstractGML.__init__(self,**kwargs)
338        addchildren(self,{})
339
340class AggregatedArray(ArrayDescriptor,csElement):
341    def __init__(self, **kwargs):
342        ArrayDescriptor.__init__(self,**kwargs)
343        children={'aggType':[CSML('aggType'),'csString'], 'aggIndex':[CSML('aggIndex'),'csString'],'components':[FILEFORMATS, 'ArrayDescriptor',CSML('component')]}
344        addchildren(self,children)
345#'component':[CSML:('component'), 'ArrayDescriptor', CSML('component')],
346class MeasureOrNullList(AbstractGML,csElement):
347    def __init__(self, **kwargs):
348        AbstractGML.__init__(self,**kwargs)
349        children={}
350        addchildren(self,children)
351       
352class CompositeValue(AbstractGML,csElement):
353    def __init__(self, **kwargs):
354        AbstractGML.__init__(self,**kwargs)
355        children={'measures':[GML('measure'),'csString',GML('valueComponents')]}
356        addchildren(self,children)
357       
358class DataBlock(AbstractGML,csElement):
359    #THIS IS INCOMPLETE
360    def __init__(self, **kwargs):
361        AbstractGML.__init__(self,**kwargs)
362        children={'doubleOrNullTupleList':[GML('doubleOrNullTupleList'),'csString'],'rangeParameters':[GML('CompositeValue'), 'CompositeValue', GML('rangeParameters')]}
363        addchildren(self,children)
364
365class RangeSet(AbstractGML,AssociationAttributeGroup,csElement):
366    def __init__(self, **kwargs):
367        AbstractGML.__init__(self,**kwargs)
368        AssociationAttributeGroup.__init__(self,**kwargs)
369        children={'quantityList':[GML('QuantityList'), 'MeasureOrNullList'],        'dataBlock':[GML('DataBlock'),'DataBlock'],'arrayDescriptor':[FILEFORMATS, 'ArrayDescriptor'],  'aggregatedArray':[CSML('AggregatedArray'), 'AggregatedArray']}
370        addchildren(self,children)
371
372class MultiPoint(AbstractGML, SRSReferenceGroup,csElement):
373    def __init__(self, **kwargs):
374        AbstractGML.__init__(self,**kwargs)
375        SRSReferenceGroup.__init__(self,**kwargs)
376        children={'pointMember':[GML('pointMember'), 'csString'],'pointMembers':[GML('pointMember'), 'csString']}
377        addchildren(self,children)
378
379class Point(AbstractGML,SRSReferenceGroup,csElement):
380    def __init__(self, **kwargs):
381        AbstractGML.__init__(self,**kwargs)
382        SRSReferenceGroup.__init__(self,**kwargs)
383        children={'pos':[GML('pos'), 'csString'],'coordinates':[GML('coordinates'), 'csString']}
384        addchildren(self,children)
385
386class PointDomain(DomainSet, MultiPoint,csElement):
387    def __init__(self, **kwargs):
388        DomainSet.__init__(self,**kwargs)
389        MultiPoint.__init__(self,**kwargs)
390        children={}
391        addchildren(self,children)
392
393class ProfileDomain(DomainSet, MultiPoint,csElement):
394    def __init__(self, **kwargs):
395        DomainSet.__init__(self,**kwargs)
396        MultiPoint.__init__(self,**kwargs)
397        children={}
398        addchildren(self,children)
399
400
401
402class AbstractCoverage(AbstractFeature, csElement):
403    def __init__(self, **kwargs):
404        AbstractFeature.__init__(self,**kwargs)
405
406class AbstractDiscreteCoverage(AbstractCoverage, csElement):
407    def __init__(self, **kwargs):
408        AbstractCoverage.__init__(self,**kwargs)
409        addchildren(self,{})
410       
411class Definition(AbstractGML):
412    def __init__(self, **kwargs):
413        AbstractGML.__init__(self,**kwargs)
414        addchildren(self,{})
415
416class Phenomenon(Definition,AssociationAttributeGroup):
417    def __init__(self, **kwargs):
418        Definition.__init__(self,**kwargs)
419        AssociationAttributeGroup.__init__(self,**kwargs)
420        children = {'':[CSML(''), '']}   
421        addchildren(self,children)
422       
423class SpatialOrTemporalPositionList(AbstractGML,csElement):
424    def __init__(self, **kwargs):
425        AbstractGML.__init__(self,**kwargs)
426        children={'coordinateList':[CSML('coordinateList'),'csString'], 'timePositionList':[CSML('timePositionList'),'csString']}
427        addchildren(self,children)
428        a=['frame']
429        addatts(self,a)
430
431class GridOrdinateDescription(AbstractGML,csElement):
432    def __init__(self, **kwargs):
433        AbstractGML.__init__(self,**kwargs)
434        children={'coordAxisLabel':[CSML('coordAxisLabel'), 'csString'], 'coordAxisValues':[CSML('SpatialOrTemporalPositionList'),'SpatialOrTemporalPositionList',CSML('coordAxisValues')], 'gridAxesSpanned':[CSML('gridAxesSpanned'), 'csString'], 'sequenceRule':[CSML('sequenceRule'),'SequenceRule']}
435        addchildren(self,children)
436
437class SequenceRule(csElement):
438    def __init__(self, **kwargs):
439        a=['axisOrder']
440        addatts(self,a)
441        children={}
442        addchildren(self,children)
443
444class GridPointDescription(AbstractGML,csElement):
445    def __init__(self, **kwargs):
446        AbstractGML.__init__(self,**kwargs)
447        children={'posList':[CSML('posList'),'csString'],'sequenceRule':[CSML('sequenceRule'),'SequenceRule']}
448        addchildren(self,children)
449
450
451class TimePositionList(AbstractGML,csElement):
452    def __init__(self,**kwargs):
453        a=['frame', 'calendarEraName','indeterminatePosition']
454        addatts(self,a)
455   
456
457class GridCoordinatesTable(AbstractGML,csElement):
458    def __init__(self,**kwargs):
459        '''the additional value '1' in the children dictionary is used to signify that the elements must be nested as:
460        <gml:ordinate>
461            <gml:GridOrdinateDescription>
462        </gml:ordinate>
463        <gml:ordinate>
464            <gml:GridOrdinateDescription>
465        </gml:ordinate>
466       
467        not as:
468        <gml:ordinate>
469            <gml:GridOrdinateDescription>
470            <gml:GridOrdinateDescription>
471        </gml:ordinate> '''
472        AbstractGML.__init__(self,**kwargs)
473        children={'gridOrdinates':[CSML('GridOrdinateDescription'), 'GridOrdinateDescription',CSML('gridOrdinate'),1], 'gridPoints':[CSML('GridPointDescription'),'GridPointDescription',CSML('gridPoints')]}
474        addchildren(self,children)
475       
476class ReferenceableGrid(AbstractGML, AssociationAttributeGroup, SRSInformationGroup, SRSReferenceGroup,csElement):
477    def __init__(self, **kwargs):
478        AbstractGML.__init__(self,**kwargs)
479        AssociationAttributeGroup.__init__(self,**kwargs)
480        SRSReferenceGroup.__init__(self,**kwargs)
481        SRSInformationGroup.__init__(self,**kwargs)
482        children={'coordTransformTable':[CSML('GridCoordinatesTable'), 'GridCoordinatesTable', CSML('coordTransformTable')],'aLabels':[CSML('axisLabels'),'csString'], 'limits':[GML('GridEnvelope'),'GridEnvelope',CSML('limits')]}
483        addchildren(self,children)
484
485
486class ReferenceableGridCoverage(AbstractDiscreteCoverage, csElement):
487    def __init__(self, **kwargs):
488        AbstractDiscreteCoverage.__init__(self,**kwargs)
489        children={'referenceableGridDomain':[CSML('ReferenceableGrid'),'ReferenceableGrid' ,CSML('referenceableGridDomain') ]}
490        addchildren(self,children)
491       
492class AlternatePointCoverage(AbstractDiscreteCoverage, csElement):
493    def __init__(self, **kwargs):
494        AbstractDiscreteCoverage.__init__(self,**kwargs)
495        children={'alternatePointDomain':[GML('Point'),'Point', CSML('alternatePointDomain')], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
496        addchildren(self,children)
497
498
499class ProfileCoverage(AbstractDiscreteCoverage, csElement):
500    def __init__(self, **kwargs):
501        AbstractDiscreteCoverage.__init__(self,**kwargs)
502        children={'profileDomain':[CSML('ProfileDomain'),'ProfileDomain' ,CSML('profileDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
503        addchildren(self,children)
504
505class PointCoverage(AbstractDiscreteCoverage, csElement):
506    def __init__(self, **kwargs):
507        AbstractDiscreteCoverage.__init__(self,**kwargs)
508        children={'pointDomain':[CSML('PointDomain'),'PointDomain' ,CSML('pointDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
509        addchildren(self,children)
510       
511class TimeSeriesDomain(AbstractGML, csElement):
512    def __init__(self, **kwargs):
513        AbstractGML.__init__(self,**kwargs)
514        children={'time':[CSML('time'), 'csString']}
515        addchildren(self,children)
516       
517
518class PointSeriesCoverage(AbstractDiscreteCoverage, csElement):
519    def __init__(self, **kwargs):
520        AbstractDiscreteCoverage.__init__(self,**kwargs)
521        children={'pointSeriesDomain':[CSML('TimeSeriesDomain'),'TimeSeriesDomain' ,CSML('pointSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
522        addchildren(self,children)
523
524class ProfileSeriesDomain(ReferenceableGrid, DomainSet, csElement):
525    def __init__(self, **kwargs):
526        DomainSet.__init__(self,**kwargs)
527        ReferenceableGrid.__init__(self,**kwargs)
528        children={}
529        addchildren(self,children)
530
531class ProfileSeriesCoverage(AbstractDiscreteCoverage,csElement):
532    def __init__(self, **kwargs):
533        AbstractDiscreteCoverage.__init__(self,**kwargs)
534        children={'profileSeriesDomain':[CSML('ProfileSeriesDomain'),'ProfileSeriesDomain' ,CSML('profileSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
535        addchildren(self,children)
536       
537class SectionDomain(ReferenceableGrid, DomainSet, csElement):
538    def __init__(self, **kwargs):
539        DomainSet.__init__(self,**kwargs)
540        ReferenceableGrid.__init__(self,**kwargs)
541        children={}
542        addchildren(self,children)
543       
544class SectionCoverage(AbstractDiscreteCoverage,csElement):
545    def __init__(self, **kwargs):
546        AbstractDiscreteCoverage.__init__(self,**kwargs)
547        children={'sectionDomain':[CSML('SectionDomain'),'SectionDomain' ,CSML('sectionDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
548        addchildren(self,children)
549
550class TrajectoryDomain(ReferenceableGrid, DomainSet, csElement):
551    def __init__(self, **kwargs):
552        DomainSet.__init__(self,**kwargs)
553        ReferenceableGrid.__init__(self,**kwargs)
554        children={}
555        addchildren(self,children)
556       
557class TrajectoryCoverage(AbstractDiscreteCoverage,csElement):
558    def __init__(self, **kwargs):
559        AbstractDiscreteCoverage.__init__(self,**kwargs)
560        children={'trajectoryDomain':[CSML('TrajectoryDomain'),'TrajectoryDomain' ,CSML('trajectoryDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
561        addchildren(self,children)
562
563
564class ScanningRadarDomain(ReferenceableGrid, DomainSet, csElement):
565    def __init__(self, **kwargs):
566        DomainSet.__init__(self,**kwargs)
567        ReferenceableGrid.__init__(self,**kwargs)
568        children={}
569        addchildren(self,children)
570       
571class ScanningRadarCoverage(AbstractDiscreteCoverage,csElement):
572    def __init__(self, **kwargs):
573        AbstractDiscreteCoverage.__init__(self,**kwargs)
574        children={'scanningRadarDomain':[CSML('ScanningRadarDomain'),'ScanningRadarDomain' ,CSML('scanningRadarDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
575        addchildren(self,children)
576
577
578class GridSeriesDomain(ReferenceableGrid, csElement):
579    def __init__(self, **kwargs):
580        #DomainSet.__init__(self,**kwargs)
581        ReferenceableGrid.__init__(self,**kwargs)
582        children={}
583        addchildren(self,children)
584       
585class GridSeriesCoverage(AbstractDiscreteCoverage,csElement):
586    def __init__(self, **kwargs):
587        AbstractDiscreteCoverage.__init__(self,**kwargs)
588        children={'gridSeriesDomain':[CSML('GridSeriesDomain'),'GridSeriesDomain' ,CSML('gridSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
589        addchildren(self,children)
590
591class AlternatePointFeature(AbstractFeature, csElement):
592    def __init__(self, **kwargs):
593        AbstractFeature.__init__(self,**kwargs)
594        children={'location':[CSML('location'), 'csString'],'time':[CSML('time'), 'csString'], 'value':[CSML('AlternatePointCoverage'), 'AlternatePointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
595        addchildren(self,children)
596
597class PointFeature(AbstractFeature, csElement):
598    def __init__(self, **kwargs):
599        AbstractFeature.__init__(self,**kwargs)
600        children={'location':[CSML('location'), 'csString'],'time':[CSML('time'), 'csString'], 'value':[CSML('PointCoverage'), 'PointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
601        addchildren(self,children)
602
603class PointCollectionFeature(AbstractFeature, csElement):
604    def __init__(self, **kwargs):
605        AbstractFeature.__init__(self,**kwargs)
606        children={'time':[CSML('time'), 'csString'], 'value':[CSML('MultiPointCoverage'), 'MultiPointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
607        addchildren(self,children)
608
609
610class PointSeriesFeature(AbstractFeature, csElement):
611    def __init__(self, **kwargs):
612        AbstractFeature.__init__(self,**kwargs)
613        children={'location':[CSML('location'), 'csString'], 'value':[CSML('PointSeriesCoverage'), 'PointSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
614        addchildren(self,children)
615
616
617class GridFeature(AbstractFeature, csElement):
618    def __init__(self, **kwargs):
619        AbstractFeature.__init__(self,**kwargs)
620        children={'time':[CSML('time'), 'csString'], 'value':[CSML('ReferenceableGridCoverage'), 'ReferenceableGridCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
621        addchildren(self,children)
622
623class GridSeriesFeature(AbstractFeature, csElement):
624    def __init__(self, **kwargs):
625        AbstractFeature.__init__(self,**kwargs)
626        children={'value':[CSML('GridSeriesCoverage'), 'GridSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
627        addchildren(self,children)
628
629class ProfileFeature(AbstractFeature, csElement):
630    def __init__(self, **kwargs):
631        AbstractFeature.__init__(self,**kwargs)
632        children={'time':[CSML('time'), 'csString'],'location':[CSML('location'), 'csString'], 'value':[CSML('ProfileCoverage'), 'ProfileCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
633        addchildren(self,children)
634
635class ProfileSeriesFeature(AbstractFeature, csElement):
636    def __init__(self, **kwargs):
637        AbstractFeature.__init__(self,**kwargs)
638        children={'location':[CSML('location'), 'csString'], 'value':[CSML('ProfileSeriesCoverage'), 'ProfileSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
639        addchildren(self,children)
640
641class RaggedProfileSeriesFeature(AbstractFeature, csElement):
642    def __init__(self, **kwargs):
643        AbstractFeature.__init__(self,**kwargs)
644        children={'location':[CSML('location'), 'csString'], 'profileLength':[CSML('profileLength'), 'csString'],'value':[CSML('ProfileSeriesCoverage'), 'ProfileSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
645        addchildren(self,children)
646
647class RaggedSectionFeature(AbstractFeature, csElement):
648    def __init__(self, **kwargs):
649        AbstractFeature.__init__(self,**kwargs)
650        children={'stationLocations':[CSML('stationLocations'), 'csString'], 'stationTimes':[CSML('stationTimes'), 'csString'],'profileLength':[CSML('profileLength'),'csString'],'value':[CSML('SectionCoverage'), 'SectionCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
651        addchildren(self,children)
652
653class SectionFeature(AbstractFeature, csElement):
654    def __init__(self, **kwargs):
655        AbstractFeature.__init__(self,**kwargs)
656        children={'stationLocations':[CSML('stationLocations'), 'csString'], 'stationTimes':[CSML('stationTimes'), 'TimePositionList'],'value':[CSML('SectionCoverage'), 'SectionCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
657        addchildren(self,children)
658
659
660
661
662class ScanningRadarFeature(AbstractFeature, csElement):
663    def __init__(self, **kwargs):
664        AbstractFeature.__init__(self,**kwargs)
665        children={'elevation':[CSML('elevation'), 'csString'], 'value':[CSML('ScanningRadarCoverage'), 'ScanningRadarCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
666        addchildren(self,children)
667
668class SwathFeature(AbstractFeature, csElement):
669    def __init__(self, **kwargs):
670        AbstractFeature.__init__(self,**kwargs)
671        children={'eqCrossLon':[CSML('eqCrossLon'), 'csString'],'eqCrossTime':[CSML('eqCrossTime'), 'csString'], 'value':[CSML('ReferenceableGridCoverage'), 'ReferenceableGridCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
672        addchildren(self,children)
673
674class TrajectoryFeature(AbstractFeature, csElement):
675    def __init__(self, **kwargs):
676        AbstractFeature.__init__(self,**kwargs)
677        children={'value':[CSML('TrajectoryCoverage'), 'TrajectoryCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
678        addchildren(self,children)
679
680class FileExtract(ArrayDescriptor, csElement):
681    def __init__(self,**kwargs):
682        ArrayDescriptor.__init__(self,**kwargs)
683        children= {'fileName':[CSML('fileName'), 'csString']}
684        addchildren(self,children)
685
686class NetCDFExtract(FileExtract, csElement):
687    def __init__(self,**kwargs):
688        FileExtract.__init__(self, **kwargs)
689        children={'variableName':[CSML('variableName'), 'csString']}
690        addchildren(self,children)
691
692class NASAAmesExtract(FileExtract, csElement):
693    def __init__(self,**kwargs):
694        FileExtract.__init__(self, **kwargs)
695        children={'variableName':[CSML('variableName'), 'csString'], 'index':[CSML('index'),'csString']}
696        addchildren(self,children)
697
698class FeatureCollection(AbstractFeatureCollection,csElement):
699    def __init__(self,**kwargs):
700        AbstractFeatureCollection.__init__(self,**kwargs)
701        children={'members':[[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('featureMembers')]}
702        addchildren(self,children)
703    def _getSubstitutionType(self,tag):
704        if tag==CSML('GridFeature'):
705            return 'GridFeature'
706        elif tag==CSML('GridSeriesFeature'):
707            return 'GridSeriesFeature'
708        elif tag==CSML('PointFeature'):
709            return 'PointFeature'
710        elif tag==CSML('TrajectoryFeature'):
711            return 'TrajectoryFeature'
712        elif tag==CSML('PointSeriesFeature'):
713            return 'PointSeriesFeature'
714        elif tag==CSML('ProfileFeature'):
715            return 'ProfileFeature'
716        elif tag==CSML('ProfileSeriesFeature'):
717            return 'ProfileSeriesFeature'
718        elif tag==CSML('RaggedProfileSeriesFeature'):
719            return 'RaggedProfileSeriesFeature'
720        elif tag==CSML('RaggedSectionFeature'):
721            return 'RaggedSectionFeature'
722        elif tag==CSML('SectionFeature'):
723            return 'SectionFeature'
724        elif tag==CSML('ScanningRadarFeature'):
725            return 'ScanningRadarFeature'
726        elif tag==CSML('AlternatePointFeature'):
727            return 'AlternatePointFeature'
728        else: return 'AbstractFeature'
729    def _getReverseSubsType(self, typename):
730        if typename== 'GridFeature':
731            return CSML('GridFeature')
732        elif typename == 'GridSeriesFeature':
733            return CSML('GridSeriesFeature')
734        elif typename == 'PointSeriesFeature':
735            return CSML('PointSeriesFeature')
736        elif typename == 'ProfileFeature':
737            return CSML('ProfileFeature')
738        elif typename == 'ProfileSeriesFeature':
739            return CSML('ProfileSeriesFeature')
740        elif typename == 'SectionFeature':
741            return CSML('SectionFeature')
742        elif typename == 'ScanningRadarFeature':
743            return CSML('ScanningRadarFeature')
744        elif typename == 'RaggedSectionFeature':
745            return CSML('RaggedSectionFeature')
746        elif typename == 'RaggedProfileSeriesFeature':
747            return CSML('RaggedProfileSeriesFeature')
748        elif typename == 'PointFeature':
749            return CSML('PointFeature')
750        elif typename == 'TrajectoryFeature':
751            return CSML('TrajectoryFeature')
752        elif typename == 'AlternatePointFeature':
753            return CSML('AlternatePointFeature')
754        else: return CSML('AbstractFeature')
755
756       
757class Dataset(AbstractGML, csElement):   
758    ''' Dataset class, needed as root of tree'''
759    def __init__(self, **kwargs):
760        AbstractGML.__init__(self,**kwargs)
761        children = {'featureCollection':[GML('FeatureCollection') ,'FeatureCollection'],'fileExtracts':[FILEFORMATS, 'ArrayDescriptor']}
762        addchildren(self,children)
763    def toXML(self):
764        csmlfrag=ET.Element(CSML('Dataset'))
765        csElement.toXML(self, csmlfrag)
766        return csmlfrag
767    def _getSubstitutionType(self,tag):
768        if tag==CSML('NetCDFExtract'):
769            return 'NetCDFExtract'
770        elif tag==CSML('NASAAmesExtract'):
771            return 'NASAAmesExtract'
772        else: return 'ArrayDescriptor'
773    def _getReverseSubsType(self, typename):
774        if typename== 'NetCDFExtract':
775            return CSML('NetCDFExtract')
776        elif typename == 'NASAAmesExtract':
777            return CSML('NASAAmesExtract')
778        else: return CSML('ArrayDescriptor')
779       
780        return typename
781
782   
783def main():
784    '''round trip for testing purposes:'''
785    print '\n'
786    tree=ET.ElementTree(file='test.xml')
787    ds=Dataset()
788    ds.fromXML(tree.getroot())
789    csmltree=ds.toXML()
790    #print csmltree
791   
792    csmlout=parser_extra.PrettyPrint(csmltree)
793    csmlout=parser_extra.removeInlineNS(csmlout)
794    print '\n %s'% csmlout
795    #for member in ds.featureCollection.members:
796      #print dir(member.value)
797       
798
799if __name__=='__main__':
800    main()
Note: See TracBrowser for help on using the repository browser.