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

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

xlinks in domain resolve to insertedElement.

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