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

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

kwargs carried through all classes to csElement class

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