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

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

parameter, and AggregatedArray? implemented in scanner. Also changes to AssociationAttributeGroup in parser

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