Changeset 804


Ignore:
Timestamp:
20/04/06 14:41:47 (14 years ago)
Author:
lawrence
Message:

Significant enhancments to the stub-b class to support many
of the data entity attributes ... the methods are there, but
it looks like the xpath expressions aren't right yet, because
while the code still runs in the browser, it hasn't populated
the attributes correctly.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/stubB.py

    r801 r804  
    11#!/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#  
    27import ElementTree as ET 
    38from insecure import * 
    4 class stubB: 
     9 
     10def 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         
     24class 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 
     40class 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         
     68class 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 
     105class stubB(DataEntity): 
    5106        ''' Holds the stub-b document and provides methods which get and manipulate it ''' 
    6107        def __init__(self,uri,xsltMethod='JavaXalan'): 
     
    22123                #note that the root of the ElementTree instance is dgMetadataRecord 
    23124                #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') 
    29136                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                 
    47151        def bind2service(self,host,service,ndgElement): 
    48152                '''Takes the various parts of an  id and bind to a service to produce a URL''' 
     
    73177if __name__=="__main__": 
    74178        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.