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

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

added EnvelopeAggregator? class and code to create an EnvelopeWithTimePeriod? for the feature collection

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