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

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

storage descriptor code working in scanner

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