source: TI02-CSML/branches/CSML2/parser.py @ 1902

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

beginning to refactor API module

Line 
1import cElementTree as ET
2import elementtree.ElementTree as etree
3import parser_extra
4import sys
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.ATTRIBUTES=[]
68           
69       
70    def __removeURI(self, qname):
71        try:
72            attname = qname.split('}')[1]
73        except IndexError:
74            attname = qname
75        return attname
76       
77    def _getSubstitutionType(self,tag):
78        print 'splitting tag'
79        return tag.split('}')[1]
80       
81   
82    def _getReverseSubsType(self, typename):
83        return typename
84   
85    def addChildElem(self, childname, childobj):
86        #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.
87        if hasattr(self, childname):
88            currentattribute=getattr(self,childname)
89            if type(getattr(self,childname)) is list:
90                currentattribute.append(childobj)
91            else:
92                newlist=[currentattribute]
93                newlist.append(childobj)
94                setattr(self,childname, newlist)
95        else:
96            setattr(self,childname, childobj)
97
98    def toXML(self, csmlfrag):
99        #process self and convert to XML
100        if hasattr(self, 'CONTENT'):
101            if self.CONTENT is not None: csmlfrag.text=self.CONTENT
102        if hasattr(self, 'ATTRIBUTES'):
103            for item in self.__dict__:
104                if item in self.ATTRIBUTES:
105                    csmlfrag.set(item, self.__dict__[item])
106            for item in self.__dict__:
107                if GML(item) in self.ATTRIBUTES:
108                    csmlfrag.set(GML(item), self.__dict__[item])       
109    # self.CHILDREN (recursive - calls the toXML method of children
110        for att in self.__dict__:
111            if att not in ['ATTRIBUTES', 'CHILDREN', 'CONTENT']:
112                for child in self.CHILDREN:
113                    if child == att:
114                        parserobjects=[]
115                        if type(self.__dict__[att]) is list:
116                            for a in self.__dict__[att]:
117                                parserobjects.append(a)
118                        else:
119                            parserobjects.append(self.__dict__[att])
120                        parentfrag=None
121                        if len(self.CHILDREN[child])>=3:
122                                ename2=self.CHILDREN[child][2]
123                                parentfrag=ET.Element(ename2)
124                        for po in parserobjects:
125                            if type(self.CHILDREN[child][0]) is not list:
126                                ename=self.CHILDREN[child][0]
127                            else:
128                                ename = self._getReverseSubsType(type(po).__name__)
129                            if len(self.CHILDREN[child])==3:
130                                frag=ET.Element(ename)
131                                po.toXML(frag)
132                                parentfrag.append(frag)
133                                appendLater=True
134                            elif len(self.CHILDREN[child])>=4:
135                                if self.CHILDREN[child][3]==1:
136                                    frag=ET.Element(ename)
137                                    po.toXML(frag)
138                                    parentfrag.append(frag)
139                                    csmlfrag.append(parentfrag)
140                                    parentfrag=ET.Element(parentfrag.tag)
141                                    appendLater=False
142                            else:
143                                frag=ET.Element(ename)
144                                po.toXML(frag)
145                                csmlfrag.append(frag)
146                                appendLater=True
147                        if appendLater==True and parentfrag != None:
148                            csmlfrag.append(parentfrag)
149        return csmlfrag
150       
151    def fromXML(self,csmlfrag):
152        # deal with attributes, e.g. gml id's
153        if csmlfrag.text is not None:
154                self.CONTENT = csmlfrag.text
155        for item in csmlfrag.items():
156            print item
157            if item[0] in self.ATTRIBUTES:
158                setattr(self, item[0], item[1])
159        # self.CHILDREN (recursive - calls the fromXML method of children
160        for frag in csmlfrag[:]:
161            #for each child element
162            #iterate through expected CHILDREN
163            for child in self.CHILDREN:
164                #get element name
165                if len(self.CHILDREN[child])>=3:
166                    ename = self.CHILDREN[child][2]
167                    ename2 = self.CHILDREN[child][0]
168                   
169                else:
170                    ename = self.CHILDREN[child][0] 
171                    ename2=None
172                #if there are options, then find the name that matches the frag
173                if ename2 is not None:
174                    if frag[:] != []:
175                        for subfrag in frag[:]:
176                            etype=None
177                            if type(ename2) is list:
178                                if subfrag.tag in ename2:
179                                    etype=self._getSubstitutionType(subfrag.tag)
180                            if subfrag.tag==ename2:
181                                etype=self.CHILDREN[child][1]
182                            if etype:
183                                childobj=eval(etype)()
184                                if len(self.CHILDREN[child])>=3:
185                                    if frag[:] != []:
186                                        childobj.fromXML(subfrag)
187                                else:
188                                    childobj.fromXML(frag)
189                                #set this object to be an attribute of the 'parent' (self) object
190                                if hasattr(self, child):
191                                    if type(self.__dict__[child]) is not list:
192                                        tmp=self.__dict__[child]
193                                        setattr(self, child, [tmp]) #convert to list
194                                    self.__dict__[child].append(childobj)
195                                else:
196                                    setattr(self, child, childobj)
197                else:
198                    etype=None
199                    if type(ename) is list:
200                        if frag.tag in ename:
201                            etype=self._getSubstitutionType(frag.tag)
202                    elif frag.tag==ename:
203                        etype=self.CHILDREN[child][1]
204                    if etype:
205                        childobj=eval(etype)()
206                        if len(self.CHILDREN[child])>=3:
207                            if frag[:] != []:
208                                childobj.fromXML(frag[0])
209                        else:
210                            childobj.fromXML(frag)
211                        #set this object to be an attribute of the 'parent' (self) object
212                        if hasattr(self, child):
213                            if type(self.__dict__[child]) is not list:
214                                tmp=self.__dict__[child]
215                                setattr(self, child, [tmp]) #convert to list
216                            self.__dict__[child].append(childobj)
217                        else:
218                            setattr(self, child, childobj)
219
220               
221class csString(csElement):
222    def __init__(self, text=None,**kwargs):
223        if text != None:
224            if type(text) is not str:
225                text=str(text)
226            self.CONTENT=text
227        children={}
228        addchildren(self,children)
229   
230class AbstractGML(csElement):
231    def __init__(self, **kwargs):
232        a=[GML('id'), GML('description'), GML('name'), GML('MetaDataProperty')]
233        addatts(self,a)
234
235class AssociationAttributeGroup(csElement):
236    def __init__(self, **kwargs):
237        a =[XLINK('href'),XLINK('role'), XLINK('arcrole'),XLINK('title'), XLINK('show'), XLINK('actuate')] 
238        addatts(self,a)
239        #Note the abbreviations href, role etc can be used to set these attributes rather than the full qualified name
240        if 'href' in kwargs:
241            self.__dict__[XLINK('href')]=kwargs['href']
242        if 'role' in kwargs:
243            self.__dict__[XLINK('role')]=kwargs['role']
244        if 'arcrole' in kwargs:
245            self.__dict__[XLINK('arcrole')]=kwargs['arcrole']
246        if 'title' in kwargs:
247            self.__dict__[XLINK('title')]=kwargs['title']
248        if 'show' in kwargs:
249            self.__dict__[XLINK('show')]=kwargs['show']
250        if 'actuate' in kwargs:
251            self.__dict__[XLINK('actuate')]=kwargs['actuate']
252
253class SRSReferenceGroup(csElement):
254    def __init__(self, **kwargs):
255        a =['srsName','srsDimension'] 
256        addatts(self,a)
257       
258class SRSInformationGroup(csElement):
259    def __init__(self, **kwargs):
260        a =['uomLabels','axisLabels'] 
261        addatts(self,a)
262
263class ArrayDescriptor(AbstractGML, csElement):
264    def __init__(self,**kwargs):
265        AbstractGML.__init__(self,**kwargs)
266        children={'arraySize':[CSML('arraySize'), 'csString'], 'uom':[CSML('uom'),'csString'], 'numericType':[CSML('numericType'),'csString'], 'regExpTransform':[CSML('regExpTransform'),'csString'], 'numericTransform':[CSML('numericTransform'),'csString']}
267        addchildren(self,children)
268
269class DirectPosition(AbstractGML, SRSReferenceGroup,SRSInformationGroup,csElement):
270    def __init__(self, **kwargs):
271        AbstractGML.__init__(self,**kwargs)
272
273class GridEnvelope(AbstractGML,SRSReferenceGroup, csElement):
274    def __init__(self, **kwargs):
275        SRSReferenceGroup.__init__(self,**kwargs)
276        AbstractGML.__init__(self,**kwargs)
277        children={'low':[GML('low'), 'csString'],'high':[GML('high'), 'csString']}
278        addchildren(self,children)
279
280class Envelope(AbstractGML,SRSReferenceGroup, csElement):
281    def __init__(self, **kwargs):
282        SRSReferenceGroup.__init__(self,**kwargs)
283        AbstractGML.__init__(self,**kwargs)
284        children={'lowerCorner':[GML('lowerCorner'), 'DirectPosition'],'upperCorner':[GML('upperCorner'), 'DirectPosition']}
285        addchildren(self,children)
286
287
288class AbstractFeature(AbstractGML,csElement):
289    def __init__(self, **kwargs):
290        AbstractGML.__init__(self,**kwargs)
291        children={'boundedBy':[GML('boundedBy'), 'Envelope']}
292        addchildren(self,children)
293
294class AbstractFeatureCollection(AbstractFeature,csElement):
295    def __init__(self, **kwargs):
296        AbstractFeature.__init__(self,**kwargs)
297
298class DomainSet(AbstractGML,AssociationAttributeGroup,csElement):
299    def __init__(self, **kwargs):
300        AbstractGML.__init__(self,**kwargs)
301        addchildren(self,{})
302
303class AggregatedArray(ArrayDescriptor,csElement):
304    def __init__(self, **kwargs):
305        ArrayDescriptor.__init__(self,**kwargs)
306        children={'aggType':[CSML('aggType'),'csString'], 'aggIndex':[CSML('aggIndex'),'csString'],'components':[FILEFORMATS, 'ArrayDescriptor',CSML('component')]}
307        addchildren(self,children)
308#'component':[CSML:('component'), 'ArrayDescriptor', CSML('component')],
309class MeasureOrNullList(AbstractGML,csElement):
310    def __init__(self, **kwargs):
311        AbstractGML.__init__(self,**kwargs)
312        children={}
313        addchildren(self,children)
314       
315class CompositeValue(AbstractGML,csElement):
316    def __init__(self, **kwargs):
317        AbstractGML.__init__(self,**kwargs)
318        children={'measures':[GML('measure'),'csString',GML('valueComponents')]}
319        addchildren(self,children)
320       
321class DataBlock(AbstractGML,csElement):
322    #THIS IS INCOMPLETE
323    def __init__(self, **kwargs):
324        AbstractGML.__init__(self,**kwargs)
325        children={'doubleOrNullTupleList':[GML('doubleOrNullTupleList'),'csString'],'rangeParameters':[GML('CompositeValue'), 'CompositeValue', GML('rangeParameters')]}
326        addchildren(self,children)
327
328class RangeSet(AbstractGML,AssociationAttributeGroup,csElement):
329    def __init__(self, **kwargs):
330        AbstractGML.__init__(self,**kwargs)
331        children={'quantityList':[GML('QuantityList'), 'MeasureOrNullList'],        'dataBlock':[GML('DataBlock'),'DataBlock'],'arrayDescriptor':[FILEFORMATS, 'ArrayDescriptor'],  'aggregatedArray':[CSML('AggregatedArray'), 'AggregatedArray']}
332        addchildren(self,children)
333
334class MultiPoint(AbstractGML, SRSReferenceGroup,csElement):
335    def __init__(self, **kwargs):
336        AbstractGML.__init__(self,**kwargs)
337        SRSReferenceGroup.__init__(self,**kwargs)
338        children={'pointMember':[GML('pointMember'), 'csString'],'pointMembers':[GML('pointMember'), 'csString']}
339        addchildren(self,children)
340
341class Point(AbstractGML,SRSReferenceGroup,csElement):
342    def __init__(self, **kwargs):
343        AbstractGML.__init__(self,**kwargs)
344        SRSReferenceGroup.__init__(self,**kwargs)
345        children={'pos':[GML('pos'), 'csString'],'coordinates':[GML('coordinates'), 'csString']}
346        addchildren(self,children)
347
348class PointDomain(DomainSet, MultiPoint,csElement):
349    def __init__(self, **kwargs):
350        DomainSet.__init__(self,**kwargs)
351        MultiPoint.__init__(self,**kwargs)
352        children={}
353        addchildren(self,children)
354
355class ProfileDomain(DomainSet, MultiPoint,csElement):
356    def __init__(self, **kwargs):
357        DomainSet.__init__(self,**kwargs)
358        MultiPoint.__init__(self,**kwargs)
359        children={}
360        addchildren(self,children)
361
362
363
364class AbstractCoverage(AbstractFeature, csElement):
365    def __init__(self, **kwargs):
366        AbstractFeature.__init__(self,**kwargs)
367
368class AbstractDiscreteCoverage(AbstractCoverage, csElement):
369    def __init__(self, **kwargs):
370        AbstractCoverage.__init__(self,**kwargs)
371        addchildren(self,{})
372       
373class Definition(AbstractGML):
374    def __init__(self, **kwargs):
375        AbstractGML.__init__(self,**kwargs)
376        addchildren(self,{})
377
378class Phenomenon(Definition,AssociationAttributeGroup):
379    def __init__(self, **kwargs):
380        Definition.__init__(self,**kwargs)
381        AssociationAttributeGroup.__init__(self,**kwargs)
382        children = {'':[CSML(''), '']}   
383        addchildren(self,children)
384       
385class SpatialOrTemporalPositionList(AbstractGML,csElement):
386    def __init__(self, **kwargs):
387        AbstractGML.__init__(self,**kwargs)
388        children={'coordinateList':[CSML('coordinateList'),'csString'], 'timePositionList':[CSML('timePositionList'),'csString']}
389        addchildren(self,children)
390        a=['frame']
391        addatts(self,a)
392
393class GridOrdinateDescription(AbstractGML,csElement):
394    def __init__(self, **kwargs):
395        AbstractGML.__init__(self,**kwargs)
396        children={'coordAxisLabel':[CSML('coordAxisLabel'), 'csString'], 'coordAxisValues':[CSML('SpatialOrTemporalPositionList'),'SpatialOrTemporalPositionList',CSML('coordAxisValues')], 'gridAxesSpanned':[CSML('gridAxesSpanned'), 'csString'], 'sequenceRule':[CSML('sequenceRule'),'SequenceRuleType']}
397        addchildren(self,children)
398
399class SequenceRuleType(csElement):
400    def __init__(self, **kwargs):
401        a=['axisOrder']
402        addatts(self,a)
403        children={}
404        addchildren(self,children)
405
406class GridPointDescription(AbstractGML,csElement):
407    def __init__(self, **kwargs):
408        AbstractGML.__init__(self,**kwargs)
409        children={'posList':[CSML('posList'),'csString'],'sequenceRule':[CSML('sequenceRule'),'SequenceRuleType']}
410        addchildren(self,children)
411
412
413class TimePositionList(AbstractGML,csElement):
414    def __init__(self,**kwargs):
415        a=['frame', 'calendarEraName','indeterminatePosition']
416        addatts(self,a)
417   
418
419class GridCoordinatesTable(AbstractGML,csElement):
420    def __init__(self,**kwargs):
421        '''the additional value '1' in the children dictionary is used to signify that the elements must be nested as:
422        <gml:ordinate>
423            <gml:GridOrdinateDescription>
424        </gml:ordinate>
425        <gml:ordinate>
426            <gml:GridOrdinateDescription>
427        </gml:ordinate>
428       
429        not as:
430        <gml:ordinate>
431            <gml:GridOrdinateDescription>
432            <gml:GridOrdinateDescription>
433        </gml:ordinate> '''
434        AbstractGML.__init__(self,**kwargs)
435        children={'gridOrdinates':[CSML('GridOrdinateDescription'), 'GridOrdinateDescription',CSML('gridOrdinate'),1], 'gridPoints':[CSML('GridPointDescription'),'GridPointDescription',CSML('gridPoints')]}
436        addchildren(self,children)
437       
438class ReferenceableGrid(AbstractGML, AssociationAttributeGroup, csElement):
439    def __init__(self, **kwargs):
440        AbstractGML.__init__(self,**kwargs)
441        AssociationAttributeGroup.__init__(self,**kwargs)
442        children={'coordTransformTable':[CSML('GridCoordinatesTable'), 'GridCoordinatesTable', CSML('coordTransformTable')],'axisLabels':[CSML('axisLabels'),'csString'], 'limits':[GML('GridEnvelope'),'GridEnvelope',CSML('limits')]}
443        addchildren(self,children)
444        a=['dimension']
445        addatts(self,a)
446
447class ReferenceableGridCoverage(AbstractDiscreteCoverage, csElement):
448    def __init__(self, **kwargs):
449        AbstractDiscreteCoverage.__init__(self,**kwargs)
450        children={'referenceableGridDomain':[CSML('ReferenceableGrid'),'ReferenceableGrid' ,CSML('referenceableGridDomain') ]}
451        addchildren(self,children)
452       
453class AlternatePointCoverage(AbstractDiscreteCoverage, csElement):
454    def __init__(self, **kwargs):
455        AbstractDiscreteCoverage.__init__(self,**kwargs)
456        children={'alternatePointDomain':[GML('Point'),'Point', CSML('alternatePointDomain')], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
457        addchildren(self,children)
458        print self.CHILDREN
459
460
461class ProfileCoverage(AbstractDiscreteCoverage, csElement):
462    def __init__(self, **kwargs):
463        AbstractDiscreteCoverage.__init__(self,**kwargs)
464        children={'profileDomain':[CSML('ProfileDomain'),'ProfileDomain' ,CSML('profileDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
465        addchildren(self,children)
466
467class PointCoverage(AbstractDiscreteCoverage, csElement):
468    def __init__(self, **kwargs):
469        AbstractDiscreteCoverage.__init__(self,**kwargs)
470        children={'pointDomain':[CSML('PointDomain'),'PointDomain' ,CSML('pointDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
471        addchildren(self,children)
472       
473class TimeSeriesDomain(AbstractGML, csElement):
474    def __init__(self, **kwargs):
475        AbstractGML.__init__(self,**kwargs)
476        children={'time':[CSML('time'), 'csString']}
477        addchildren(self,children)
478       
479
480class PointSeriesCoverage(AbstractDiscreteCoverage, csElement):
481    def __init__(self, **kwargs):
482        AbstractDiscreteCoverage.__init__(self,**kwargs)
483        children={'pointSeriesDomain':[CSML('TimeSeriesDomain'),'TimeSeriesDomain' ,CSML('pointSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
484        addchildren(self,children)
485
486class ProfileSeriesDomain(ReferenceableGrid, DomainSet, csElement):
487    def __init__(self, **kwargs):
488        DomainSet.__init__(self,**kwargs)
489        ReferenceableGrid.__init__(self,**kwargs)
490        children={}
491        addchildren(self,children)
492
493class ProfileSeriesCoverage(AbstractDiscreteCoverage,csElement):
494    def __init__(self, **kwargs):
495        AbstractDiscreteCoverage.__init__(self,**kwargs)
496        children={'profileSeriesDomain':[CSML('ProfileSeriesDomain'),'ProfileSeriesDomain' ,CSML('profileSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
497        addchildren(self,children)
498       
499class SectionDomain(ReferenceableGrid, DomainSet, csElement):
500    def __init__(self, **kwargs):
501        DomainSet.__init__(self,**kwargs)
502        ReferenceableGrid.__init__(self,**kwargs)
503        children={}
504        addchildren(self,children)
505       
506class SectionCoverage(AbstractDiscreteCoverage,csElement):
507    def __init__(self, **kwargs):
508        AbstractDiscreteCoverage.__init__(self,**kwargs)
509        children={'sectionDomain':[CSML('SectionDomain'),'SectionDomain' ,CSML('sectionDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
510        addchildren(self,children)
511
512class TrajectoryDomain(ReferenceableGrid, DomainSet, csElement):
513    def __init__(self, **kwargs):
514        DomainSet.__init__(self,**kwargs)
515        ReferenceableGrid.__init__(self,**kwargs)
516        children={}
517        addchildren(self,children)
518       
519class TrajectoryCoverage(AbstractDiscreteCoverage,csElement):
520    def __init__(self, **kwargs):
521        AbstractDiscreteCoverage.__init__(self,**kwargs)
522        children={'trajectoryDomain':[CSML('TrajectoryDomain'),'TrajectoryDomain' ,CSML('trajectoryDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
523        addchildren(self,children)
524
525
526class ScanningRadarDomain(ReferenceableGrid, DomainSet, csElement):
527    def __init__(self, **kwargs):
528        DomainSet.__init__(self,**kwargs)
529        ReferenceableGrid.__init__(self,**kwargs)
530        children={}
531        addchildren(self,children)
532       
533class ScanningRadarCoverage(AbstractDiscreteCoverage,csElement):
534    def __init__(self, **kwargs):
535        AbstractDiscreteCoverage.__init__(self,**kwargs)
536        children={'scanningRadarDomain':[CSML('ScanningRadarDomain'),'ScanningRadarDomain' ,CSML('scanningRadarDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
537        addchildren(self,children)
538
539
540class GridSeriesDomain(ReferenceableGrid, DomainSet, csElement):
541    def __init__(self, **kwargs):
542        DomainSet.__init__(self,**kwargs)
543        ReferenceableGrid.__init__(self,**kwargs)
544        children={}
545        addchildren(self,children)
546       
547class GridSeriesCoverage(AbstractDiscreteCoverage,csElement):
548    def __init__(self, **kwargs):
549        AbstractDiscreteCoverage.__init__(self,**kwargs)
550        children={'gridSeriesDomain':[CSML('GridSeriesDomain'),'GridSeriesDomain' ,CSML('gridSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
551        addchildren(self,children)
552
553class AlternatePointFeature(AbstractFeature, csElement):
554    def __init__(self, **kwargs):
555        AbstractFeature.__init__(self,**kwargs)
556        children={'location':[CSML('location'), 'csString'],'time':[CSML('time'), 'csString'], 'value':[CSML('AlternatePointCoverage'), 'AlternatePointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
557        addchildren(self,children)
558
559class PointFeature(AbstractFeature, csElement):
560    def __init__(self, **kwargs):
561        AbstractFeature.__init__(self,**kwargs)
562        children={'location':[CSML('location'), 'csString'],'time':[CSML('time'), 'csString'], 'value':[CSML('PointCoverage'), 'PointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
563        addchildren(self,children)
564
565class PointCollectionFeature(AbstractFeature, csElement):
566    def __init__(self, **kwargs):
567        AbstractFeature.__init__(self,**kwargs)
568        children={'time':[CSML('time'), 'csString'], 'value':[CSML('MultiPointCoverage'), 'MultiPointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
569        addchildren(self,children)
570
571
572class PointSeriesFeature(AbstractFeature, csElement):
573    def __init__(self, **kwargs):
574        AbstractFeature.__init__(self,**kwargs)
575        children={'location':[CSML('location'), 'csString'], 'value':[CSML('PointSeriesCoverage'), 'PointSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
576        addchildren(self,children)
577
578
579class GridFeature(AbstractFeature, csElement):
580    def __init__(self, **kwargs):
581        AbstractFeature.__init__(self,**kwargs)
582        children={'time':[CSML('time'), 'csString'], 'value':[CSML('ReferenceableGridCoverage'), 'ReferenceableGridCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
583        addchildren(self,children)
584
585class GridSeriesFeature(AbstractFeature, csElement):
586    def __init__(self, **kwargs):
587        AbstractFeature.__init__(self,**kwargs)
588        children={'value':[CSML('GridSeriesCoverage'), 'GridSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
589        addchildren(self,children)
590
591class ProfileFeature(AbstractFeature, csElement):
592    def __init__(self, **kwargs):
593        AbstractFeature.__init__(self,**kwargs)
594        children={'time':[CSML('time'), 'csString'],'location':[CSML('location'), 'csString'], 'value':[CSML('ProfileCoverage'), 'ProfileCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
595        addchildren(self,children)
596
597class ProfileSeriesFeature(AbstractFeature, csElement):
598    def __init__(self, **kwargs):
599        AbstractFeature.__init__(self,**kwargs)
600        children={'location':[CSML('location'), 'csString'], 'value':[CSML('ProfileSeriesCoverage'), 'ProfileSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
601        addchildren(self,children)
602
603class RaggedProfileSeriesFeature(AbstractFeature, csElement):
604    def __init__(self, **kwargs):
605        AbstractFeature.__init__(self,**kwargs)
606        children={'location':[CSML('location'), 'csString'], 'profileLength':[CSML('profileLength'), 'csString'],'value':[CSML('ProfileSeriesCoverage'), 'ProfileSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
607        addchildren(self,children)
608
609class RaggedSectionFeature(AbstractFeature, csElement):
610    def __init__(self, **kwargs):
611        AbstractFeature.__init__(self,**kwargs)
612        children={'stationLocations':[CSML('stationLocations'), 'csString'], 'stationTimes':[CSML('stationTimes'), 'csString'],'profileLength':[CSML('profileLength'),'csString'],'value':[CSML('SectionCoverage'), 'SectionCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
613        addchildren(self,children)
614
615class SectionFeature(AbstractFeature, csElement):
616    def __init__(self, **kwargs):
617        AbstractFeature.__init__(self,**kwargs)
618        children={'stationLocations':[CSML('stationLocations'), 'csString'], 'stationTimes':[CSML('stationTimes'), 'TimePositionList'],'value':[CSML('SectionCoverage'), 'SectionCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
619        addchildren(self,children)
620
621
622
623
624class ScanningRadarFeature(AbstractFeature, csElement):
625    def __init__(self, **kwargs):
626        AbstractFeature.__init__(self,**kwargs)
627        children={'elevation':[CSML('elevation'), 'csString'], 'value':[CSML('ScanningRadarCoverage'), 'ScanningRadarCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
628        addchildren(self,children)
629
630class SwathFeature(AbstractFeature, csElement):
631    def __init__(self, **kwargs):
632        AbstractFeature.__init__(self,**kwargs)
633        children={'eqCrossLon':[CSML('eqCrossLon'), 'csString'],'eqCrossTime':[CSML('eqCrossTime'), 'csString'], 'value':[CSML('ReferenceableGridCoverage'), 'ReferenceableGridCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
634        addchildren(self,children)
635
636class TrajectoryFeature(AbstractFeature, csElement):
637    def __init__(self, **kwargs):
638        AbstractFeature.__init__(self,**kwargs)
639        children={'value':[CSML('TrajectoryCoverage'), 'TrajectoryCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
640        addchildren(self,children)
641
642class FileExtract(ArrayDescriptor, csElement):
643    def __init__(self,**kwargs):
644        ArrayDescriptor.__init__(self,**kwargs)
645        children= {'fileName':[CSML('fileName'), 'csString']}
646        addchildren(self,children)
647
648class NetCDFExtract(FileExtract, csElement):
649    def __init__(self,**kwargs):
650        FileExtract.__init__(self, **kwargs)
651        children={'variableName':[CSML('variableName'), 'csString']}
652        addchildren(self,children)
653
654class NASAAmesExtract(FileExtract, csElement):
655    def __init__(self,**kwargs):
656        FileExtract.__init__(self, **kwargs)
657        children={'variableName':[CSML('variableName'), 'csString'], 'index':[CSML('index'),'csString']}
658        addchildren(self,children)
659
660class FeatureCollection(AbstractFeatureCollection,csElement):
661    def __init__(self,**kwargs):
662        AbstractFeatureCollection.__init__(self,**kwargs)
663        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')]}
664        addchildren(self,children)
665    def _getSubstitutionType(self,tag):
666        if tag==CSML('GridFeature'):
667            return 'GridFeature'
668        elif tag==CSML('GridSeriesFeature'):
669            return 'GridSeriesFeature'
670        elif tag==CSML('PointFeature'):
671            return 'PointFeature'
672        elif tag==CSML('TrajectoryFeature'):
673            return 'TrajectoryFeature'
674        elif tag==CSML('PointSeriesFeature'):
675            return 'PointSeriesFeature'
676        elif tag==CSML('ProfileFeature'):
677            return 'ProfileFeature'
678        elif tag==CSML('ProfileSeriesFeature'):
679            return 'ProfileSeriesFeature'
680        elif tag==CSML('RaggedProfileSeriesFeature'):
681            return 'RaggedProfileSeriesFeature'
682        elif tag==CSML('RaggedSectionFeature'):
683            return 'RaggedSectionFeature'
684        elif tag==CSML('SectionFeature'):
685            return 'SectionFeature'
686        elif tag==CSML('ScanningRadarFeature'):
687            return 'ScanningRadarFeature'
688        elif tag==CSML('AlternatePointFeature'):
689            return 'AlternatePointFeature'
690        else: return 'AbstractFeature'
691    def _getReverseSubsType(self, typename):
692        if typename== 'GridFeature':
693            return CSML('GridFeature')
694        elif typename == 'GridSeriesFeature':
695            return CSML('GridSeriesFeature')
696        elif typename == 'PointSeriesFeature':
697            return CSML('PointSeriesFeature')
698        elif typename == 'ProfileFeature':
699            return CSML('ProfileFeature')
700        elif typename == 'ProfileSeriesFeature':
701            return CSML('ProfileSeriesFeature')
702        elif typename == 'SectionFeature':
703            return CSML('SectionFeature')
704        elif typename == 'ScanningRadarFeature':
705            return CSML('ScanningRadarFeature')
706        elif typename == 'RaggedSectionFeature':
707            return CSML('RaggedSectionFeature')
708        elif typename == 'RaggedProfileSeriesFeature':
709            return CSML('RaggedProfileSeriesFeature')
710        elif typename == 'PointFeature':
711            return CSML('PointFeature')
712        elif typename == 'TrajectoryFeature':
713            return CSML('TrajectoryFeature')
714        elif typename == 'AlternatePointFeature':
715            return CSML('AlternatePointFeature')
716        else: return CSML('AbstractFeature')
717
718       
719class Dataset(AbstractGML, csElement):   
720    ''' Dataset class, needed as root of tree'''
721    def __init__(self, **kwargs):
722        AbstractGML.__init__(self,**kwargs)
723        children = {'featureCollection':[GML('FeatureCollection') ,'FeatureCollection'],'fileExtracts':[FILEFORMATS, 'ArrayDescriptor']}
724        addchildren(self,children)
725    def toXML(self):
726        csmlfrag=ET.Element(CSML('Dataset'))
727        csElement.toXML(self, csmlfrag)
728        return csmlfrag
729    def _getSubstitutionType(self,tag):
730        if tag==CSML('NetCDFExtract'):
731            return 'NetCDFExtract'
732        elif tag==CSML('NASAAmesExtract'):
733            return 'NASAAmesExtract'
734        else: return 'ArrayDescriptor'
735    def _getReverseSubsType(self, typename):
736        if typename== 'NetCDFExtract':
737            return CSML('NetCDFExtract')
738        elif typename == 'NASAAmesExtract':
739            return CSML('NASAAmesExtract')
740        else: return CSML('ArrayDescriptor')
741       
742        return typename
743
744   
745def main():
746    '''round trip for testing purposes:'''
747    print '\n'
748    tree=ET.ElementTree(file='test.xml')
749    ds=Dataset()
750    ds.fromXML(tree.getroot())
751    csmltree=ds.toXML()
752    #print csmltree
753   
754    csmlout=parser_extra.PrettyPrint(csmltree)
755    csmlout=parser_extra.removeInlineNS(csmlout)
756    print '\n %s'% csmlout
757    #for member in ds.featureCollection.members:
758      #print dir(member.value)
759       
760
761if __name__=='__main__':
762    main()
Note: See TracBrowser for help on using the repository browser.