Changeset 804
- Timestamp:
- 20/04/06 14:41:47 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/stubB.py
r801 r804 1 1 #!/usr/bin/env python 2 # 3 # This python code (will) handle all forms of stub-B and provide HTML 4 # methods to the extent required by the NDG browse functionality 5 # BNL April 2006 6 # 2 7 import ElementTree as ET 3 8 from insecure import * 4 class stubB: 9 10 def wrapGetText(element,xpathExpression,multiple=0): 11 ''' Wraps a call to ET to get a text object in an error handler ''' 12 if multiple: 13 r=element.findall(xpathExpression) 14 else: 15 r=[element.find(xpathExpression),] 16 try: 17 rr=[i.text for i in r] 18 except: 19 rr='Metadata Element [%s] Not Found'%xpathExpression 20 if multiple: 21 return rr 22 else: return rr[0] 23 24 class dgPerson: 25 '''The ET representation of a contact ''' 26 def __init__(self,element): 27 ''' Instantiate a MOLES person element ''' 28 self.elem=element 29 if self.elem is None: return 30 self.name=wrapGetText(self.elem,'') 31 self.org=wrapGetText(self.elem,'dgRoleHolder/dgOrganisation/name') 32 self.email=wrapGetText(self.elem,'contactDetails/eMail') 33 self.phone=wrapGetText(self.elem,'contactDetails/telephone') 34 def toHTML(self): 35 ''' Convert to simple HTML ''' 36 html=''' 37 %s<br/>%s<br/>%s<br/> 38 ''' % (self.name,self.email,self.phone) 39 return html 40 class Bounding: 41 ''' Separated out because this may change with versions ''' 42 def __init__(self,elem): 43 '''Parse a data entity and load a bounding box ''' 44 North=wrapGetText(elem, 45 'dgDataCoverage/dgSpatialCoverage/BoundingBox/LimitNorth') 46 South=wrapGetText(elem, 47 'dgDataCoverage/dgSpatialCoverage/BoundingBox/LimitSouth') 48 West=wrapGetText(elem, 49 'dgDataCoverage/dgSpatialCoverage/BoundingBox/LimitWest') 50 East=wrapGetText(elem, 51 'dgDataCoverage/dgSpatialCoverage/BoundingBox/LimitEast') 52 try: 53 self.box=[float(i) for i in [North, South,West, East]] 54 except: 55 self.box=None 56 def toHTML(self): 57 if self.box is not None: 58 html=''' 59 Limit North: %s <br/> 60 Limit South: %s <br/> 61 Limit West: %s <br/> 62 Limit East: %s <br/> 63 '''%self.box 64 else: 65 html='No bounding box' 66 return html 67 68 class DataEntity: 69 def __init__(self,element): 70 ''' Attempt to instantiate this stubB as a data entity''' 71 self.elem=element 72 #just one curator 73 self.curator=dgPerson(self.elem.find('dgDataRoles/dgDataCurator')) 74 #possibly multiple creators 75 self.creators=[dgPerson(i) for i in self.elem.findall('dgDataRoles/dgDataCreator')] 76 host,service = '','' # dummy for now 77 #possibly multiple granules 78 self.granules=[self.bind2Aservice(host,service,i) for i in self.elem.findall('dgDataGranule')] 79 #bounding box, handled as a class because this is going to be difficult ... 80 b=Bounding(self.elem) 81 self.bbox=b.box 82 self.temporal() 83 #parameters 84 self.parameters=wrapGetText(self.elem,'dgParameterSummary/ParameterName',multiple=1) 85 86 def temporal(self): 87 '''Instantiate the timeCoverage attribute by parsing for temporal coverage ''' 88 t=self.elem.find('dgDataCoverage/dgTemporalCoverage/DateRange') 89 if t is not None: 90 try: 91 self.timeCoverage=[float(i.text) for i in t] 92 except: 93 self.timeCoverage='No time information' 94 else: 95 t=self.elem.find('dgDataCoverage/dgTemporalCoverage/DateSingle') 96 try: 97 self.timeCoverage=t.text 98 except: 99 self.timeCoverage='No time information' 100 101 def bind2Aservice(self,host,service,elem): 102 #dummy for now 103 return 'Alink' 104 105 class stubB(DataEntity): 5 106 ''' Holds the stub-b document and provides methods which get and manipulate it ''' 6 107 def __init__(self,uri,xsltMethod='JavaXalan'): … … 22 123 #note that the root of the ElementTree instance is dgMetadataRecord 23 124 #so we don't need (or want) that in our xpath expressions. 24 self.name=self.wrapGetText(self.tree,'name') 25 #watch out, we need the real ElementPath to be present for these to work ... 26 # (not just the simple version inside ElementTree ... it needs ElementPath!) 27 host=''# bodge 28 self.abstract=self.wrapGetText(self.tree,'dgMetadataDescription/abstract/abstractText') 125 host='' #bodge 126 self.name=wrapGetText(self.tree,'name') 127 elem=self.tree.find('dgDataEntity') 128 if elem is not None: 129 DataEntity.__init__(self,elem) 130 self.type='dgDataEntity' 131 self.others=('activity','observationstation','dataproductiontool') 132 else: 133 #handle other forms 134 pass 135 self.abstract=wrapGetText(self.tree,'dgMetadataDescription/abstract/abstractText') 29 136 self.Burl=self.bind2service(host,'browse.py',self.tree.find('dgMetadataID')) 30 #are there going to be multiple granules? 31 ndgAelement=self.tree.find('dgDataEntity/dgDataGranule/dataModelID') 32 self.Aurl=self.bind2service(host,'aservice',ndgAelement) 33 if xsltMethod is 'local': 34 for item in self.tree: print item.tag 35 print self.name 36 print self.abstract 37 print self.Burl 38 print self.Aurl 39 def wrapGetText(self,element,xpathExpression): 40 ''' Wraps a call to ET to get a text object in an error handler ''' 41 try: 42 r= element.find(xpathExpression).text 43 except: 44 r='Metadata Element [%s] Not Found'%xpathExpression 45 return r 46 137 138 # now go get all the related links 139 self.related=[] 140 for related in self.tree.findall('RelatedDeployment'): 141 for item in self.others: 142 subitems=related.findall(item) 143 if subitems != []: 144 aa=[] 145 for subitem in subitems: 146 name=wrapGetText(subitem,'name') 147 url=self.bind2service(host,'browse.py',subitem.find('dgMetadataID')) 148 aa.append([name,url]) 149 self.related.append([item,aa]) 150 47 151 def bind2service(self,host,service,ndgElement): 48 152 '''Takes the various parts of an id and bind to a service to produce a URL''' … … 73 177 if __name__=="__main__": 74 178 x=stubB('../../exampleB/methyl.example.xml',xsltMethod='local') 179 print x.related 180 print x.name 181 print x.parameters
Note: See TracChangeset
for help on using the changeset viewer.