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

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

ProfileSeriesFeature? mostly working in scanner - location attribute needs finishing

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={'timePosition':[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'), 'EnvelopeWithTimePeriod', 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 DirectPositionList(SRSReferenceGroup, csElement):
682    def __init__(self, **kwargs):
683        SRSReferenceGroup.__init__(self,**kwargs)
684        children=[]
685        addchildren(self,children)
686        csElement.__init__(self,**kwargs)
687       
688class PointFeature(AbstractFeature, csElement):
689    def __init__(self, **kwargs):
690        AbstractFeature.__init__(self,**kwargs)
691        children={'location':[CSML('location'), 'DirectPositionList'],'time':[CSML('time'), 'csString'], 'value':[CSML('PointCoverage'), 'PointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
692        addchildren(self,children)
693        csElement.__init__(self,**kwargs)
694
695class PointCollectionFeature(AbstractFeature, csElement):
696    def __init__(self, **kwargs):
697        AbstractFeature.__init__(self,**kwargs)
698        children={'time':[CSML('time'), 'csString'], 'value':[CSML('MultiPointCoverage'), 'MultiPointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
699        addchildren(self,children)
700        csElement.__init__(self,**kwargs)
701
702
703class PointSeriesFeature(AbstractFeature, csElement):
704    def __init__(self, **kwargs):
705        AbstractFeature.__init__(self,**kwargs)
706        children={'location':[CSML('location'), 'csString'], 'value':[CSML('PointSeriesCoverage'), 'PointSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
707        addchildren(self,children)
708        csElement.__init__(self,**kwargs)
709
710
711class GridFeature(AbstractFeature, csElement):
712    def __init__(self, **kwargs):
713        AbstractFeature.__init__(self,**kwargs)
714        children={'time':[CSML('time'), 'csString'], 'value':[CSML('ReferenceableGridCoverage'), 'ReferenceableGridCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
715        addchildren(self,children)
716        csElement.__init__(self,**kwargs)
717
718class GridSeriesFeature(AbstractFeature, csElement):
719    def __init__(self, **kwargs):
720        AbstractFeature.__init__(self,**kwargs)
721        children={'value':[CSML('GridSeriesCoverage'), 'GridSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
722        addchildren(self,children)
723        csElement.__init__(self,**kwargs)
724
725class ProfileFeature(AbstractFeature, csElement):
726    def __init__(self, **kwargs):
727        AbstractFeature.__init__(self,**kwargs)
728        children={'time':[CSML('time'), 'csString'],'location':[CSML('location'), 'csString'], 'value':[CSML('ProfileCoverage'), 'ProfileCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
729        addchildren(self,children)
730        csElement.__init__(self,**kwargs)
731
732class ProfileSeriesFeature(AbstractFeature, csElement):
733    def __init__(self, **kwargs):
734        AbstractFeature.__init__(self,**kwargs)
735        children={'location':[CSML('location'), 'csString'], 'value':[CSML('ProfileSeriesCoverage'), 'ProfileSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
736        addchildren(self,children)
737        csElement.__init__(self,**kwargs)
738
739class RaggedProfileSeriesFeature(AbstractFeature, csElement):
740    def __init__(self, **kwargs):
741        AbstractFeature.__init__(self,**kwargs)
742        children={'location':[CSML('location'), 'csString'], 'profileLength':[CSML('profileLength'), 'csString'],'value':[CSML('ProfileSeriesCoverage'), 'ProfileSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
743        addchildren(self,children)
744        csElement.__init__(self,**kwargs)
745
746class RaggedSectionFeature(AbstractFeature, csElement):
747    def __init__(self, **kwargs):
748        AbstractFeature.__init__(self,**kwargs)
749        children={'stationLocations':[CSML('stationLocations'), 'csString'], 'stationTimes':[CSML('stationTimes'), 'csString'],'profileLength':[CSML('profileLength'),'csString'],'value':[CSML('SectionCoverage'), 'SectionCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
750        addchildren(self,children)
751        csElement.__init__(self,**kwargs)
752
753class SectionFeature(AbstractFeature, csElement):
754    def __init__(self, **kwargs):
755        AbstractFeature.__init__(self,**kwargs)
756        children={'stationLocations':[CSML('stationLocations'), 'csString'], 'stationTimes':[CSML('stationTimes'), 'TimePositionList'],'value':[CSML('SectionCoverage'), 'SectionCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
757        addchildren(self,children)
758        csElement.__init__(self,**kwargs)
759
760class ScanningRadarFeature(AbstractFeature, csElement):
761    def __init__(self, **kwargs):
762        AbstractFeature.__init__(self,**kwargs)
763        children={'elevation':[CSML('elevation'), 'csString'], 'value':[CSML('ScanningRadarCoverage'), 'ScanningRadarCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
764        addchildren(self,children)
765        csElement.__init__(self,**kwargs)
766
767       
768class SwathFeature(AbstractFeature, csElement):
769    def __init__(self, **kwargs):
770        AbstractFeature.__init__(self,**kwargs)
771        children={'eqCrossLon':[CSML('eqCrossLon'), 'csString'],'eqCrossTime':[CSML('eqCrossTime'), 'csString'], 'value':[CSML('ReferenceableGridCoverage'), 'ReferenceableGridCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
772        addchildren(self,children)
773        csElement.__init__(self,**kwargs)
774       
775class TrajectoryFeature(AbstractFeature, csElement):
776    def __init__(self, **kwargs):
777        AbstractFeature.__init__(self,**kwargs)
778        children={'value':[CSML('TrajectoryCoverage'), 'TrajectoryCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
779        addchildren(self,children)
780        csElement.__init__(self,**kwargs)
781       
782class FileList(AssociationAttributeGroup,AbstractGML,csElement):
783    def __init__(self,**kwargs):
784        AssociationAttributeGroup.__init__(self,**kwargs)
785        AbstractGML.__init__(self,**kwargs)
786        addatts(self,[])
787        children= {'fileNames':[CSML('fileNames'), 'csString']}
788        addchildren(self,children)
789        csElement.__init__(self,**kwargs)
790       
791class FileExtract(ArrayDescriptor, csElement):
792    def __init__(self,**kwargs):
793        ArrayDescriptor.__init__(self,**kwargs)
794        children= {'fileName':[CSML('fileName'), 'csString'],  'fileList':[CSML('FileList'), 'FileList', CSML('fileList')],'fileListXLINK':[CSML('fileList'), 'csString']}
795        addchildren(self,children)
796        csElement.__init__(self,**kwargs)
797
798class NetCDFExtract(FileExtract, csElement):
799    def __init__(self,**kwargs):
800        FileExtract.__init__(self, **kwargs)
801        children={'variableName':[CSML('variableName'), 'csString']}
802        addchildren(self,children)
803        csElement.__init__(self,**kwargs)
804
805class NASAAmesExtract(FileExtract, csElement):
806    def __init__(self,**kwargs):
807        FileExtract.__init__(self, **kwargs)
808        children={'variableName':[CSML('variableName'), 'csString'], 'index':[CSML('index'),'csString']}
809        addchildren(self,children)
810        csElement.__init__(self,**kwargs)
811
812class CSMLStorageDescriptor(csElement):
813    def __init__(self,**kwargs):
814        addatts(self,[])
815        children={'descriptors':[[CSML('NetCDFExtract'),CSML('AggregatedArray')], 'FileExtract', CSML('descriptor'),1]}
816        addchildren(self,children)
817        csElement.__init__(self,**kwargs)
818
819class CSMLFeatureCollection(AbstractFeatureCollection,csElement,):
820    def __init__(self,**kwargs):
821        AbstractFeatureCollection.__init__(self,**kwargs)
822        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]}
823        addchildren(self,children)
824        csElement.__init__(self,**kwargs)
825    def _getSubstitutionType(self,tag):
826        if tag==CSML('GridFeature'):
827            return 'GridFeature'
828        elif tag==CSML('GridSeriesFeature'):
829            return 'GridSeriesFeature'
830        elif tag==CSML('PointFeature'):
831            return 'PointFeature'
832        elif tag==CSML('TrajectoryFeature'):
833            return 'TrajectoryFeature'
834        elif tag==CSML('PointSeriesFeature'):
835            return 'PointSeriesFeature'
836        elif tag==CSML('ProfileFeature'):
837            return 'ProfileFeature'
838        elif tag==CSML('ProfileSeriesFeature'):
839            return 'ProfileSeriesFeature'
840        elif tag==CSML('RaggedProfileSeriesFeature'):
841            return 'RaggedProfileSeriesFeature'
842        elif tag==CSML('RaggedSectionFeature'):
843            return 'RaggedSectionFeature'
844        elif tag==CSML('SectionFeature'):
845            return 'SectionFeature'
846        elif tag==CSML('ScanningRadarFeature'):
847            return 'ScanningRadarFeature'
848        elif tag==CSML('AlternatePointFeature'):
849            return 'AlternatePointFeature'
850        else: return 'AbstractFeature'
851    def _getReverseSubsType(self, typename):
852        if typename== 'GridFeature':
853            return CSML('GridFeature')
854        elif typename == 'GridSeriesFeature':
855            return CSML('GridSeriesFeature')
856        elif typename == 'PointSeriesFeature':
857            return CSML('PointSeriesFeature')
858        elif typename == 'ProfileFeature':
859            return CSML('ProfileFeature')
860        elif typename == 'ProfileSeriesFeature':
861            return CSML('ProfileSeriesFeature')
862        elif typename == 'SectionFeature':
863            return CSML('SectionFeature')
864        elif typename == 'ScanningRadarFeature':
865            return CSML('ScanningRadarFeature')
866        elif typename == 'RaggedSectionFeature':
867            return CSML('RaggedSectionFeature')
868        elif typename == 'RaggedProfileSeriesFeature':
869            return CSML('RaggedProfileSeriesFeature')
870        elif typename == 'PointFeature':
871            return CSML('PointFeature')
872        elif typename == 'TrajectoryFeature':
873            return CSML('TrajectoryFeature')
874        elif typename == 'AlternatePointFeature':
875            return CSML('AlternatePointFeature')
876        else: return CSML('AbstractFeature')
877
878       
879class Dataset(csElement):   
880    ''' Dataset class, needed as root of tree'''
881    def __init__(self, **kwargs):
882        a=[CSML('id')]
883        addatts(self,a)
884        children = {'featureCollection':[CSML('CSMLFeatureCollection') ,'CSMLFeatureCollection'],'storageDescriptor':[CSML('CSMLStorageDescriptor'), 'CSMLStorageDescriptor']}
885        addchildren(self,children)
886        csElement.__init__(self,**kwargs)
887   
888    def toXML(self):
889        csmlfrag=ET.Element(CSML('Dataset'))
890        csElement.toXML(self, csmlfrag)
891        return csmlfrag
892    #def _getSubstitutionType(self,tag): 
893        #if tag==CSML('NetCDFExtract'):
894            #return 'NetCDFExtract'
895        #elif tag==CSML('NASAAmesExtract'):
896            #return 'NASAAmesExtract'
897        #else: return 'ArrayDescriptor'
898    #def _getReverseSubsType(self, typename):
899        #if typename== 'NetCDFExtract':
900            #return CSML('NetCDFExtract')
901        #elif typename == 'NASAAmesExtract':
902            #return CSML('NASAAmesExtract')
903        #else: return CSML('ArrayDescriptor')
904       
905        return typename
906
907   
908def main():
909    '''round trip for testing purposes:'''
910    print '\n'
911    tree=ET.ElementTree(file='test.xml')
912    ds=Dataset()
913    ds.fromXML(tree.getroot())
914    csmltree=ds.toXML()
915    #print csmltree
916   
917    csmlout=parser_extra.PrettyPrint(csmltree)
918    csmlout=parser_extra.removeInlineNS(csmlout)
919    print '\n %s'% csmlout
920    #for member in ds.featureCollection.members:
921      #print dir(member.value)
922       
923
924if __name__=='__main__':
925    main()
Note: See TracBrowser for help on using the repository browser.