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

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

support for fileList and xlink when creating csml

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