Ignore:
Timestamp:
02/04/07 16:24:18 (12 years ago)
Author:
lawrence
Message:

Sundry modifications to get browse working again and to use a
config file to identify the appropriate repositories (for
a given ndg uri, what repository holds the browse info? this
is by way of a temporary expedient).

Location:
TI07-MOLES/trunk/PythonCode/wsgi
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • TI07-MOLES/trunk/PythonCode/wsgi/DocumentRetrieve.py

    r2345 r2364  
    4949            id,summary=self.executeQuery(xquery) 
    5050            hits=summary['hits'] 
    51             #print 'bnl',targetCollection,xquery 
     51            print 'bnl',targetCollection,xquery 
    5252             
    5353            if hits!=1: raise ValueError,'%s documents returned for uri %s:%s:%s'%(hits,repository,'NDG-B0',localID) 
     
    8888                id,summary=self.executeQuery(xquery) 
    8989            except Exception,e: 
     90                print xquery 
    9091                raise Exception,e 
    9192            hits=summary['hits'] 
  • TI07-MOLES/trunk/PythonCode/wsgi/eXistInterface.py

    r2118 r2364  
    8686            host,userid,password=line.strip().split(' ') 
    8787            pw[host]=(userid,password) 
     88        if db not in pw: 
     89            raise ValueError('Unable to find eXist password for repository [%s]'%db) 
    8890        eXistConstants = InstanceObject(host=db, 
    8991                                userid=pw[db][0], 
  • TI07-MOLES/trunk/PythonCode/wsgi/ndgBrowse.py

    r1903 r2364  
    11from Utilities import myConfig 
     2from paste.request import parse_querystring 
     3from ndgObject import ndgObject 
    24 
    35def browseFactory(global_config,**local_conf): 
     
    1416        except: 
    1517            configDir=None 
    16     ndg=ndgBrowse(configDir) 
    17     return ndg 
     18             
     19    def filter(app): 
     20        return ndgBrowse(app,configDir) 
     21     
     22    return filter         
    1823 
    1924          
    2025class ndgBrowse: 
    2126     
    22     ''' This is the ndgBrowse GUI application ''' 
     27    ''' This is the ndgBrowse GUI application, all it does is clean up a URL to ensure 
     28    it passes the right things to ndgRetrieve in the case of a browse request. In the 
     29    fullness of time it may do something smart with a registyr ''' 
    2330     
    24     def __init__(self,configDir): 
     31    def __init__(self,app,configDir): 
    2532         
    26         ''' Instantiate a wsgi ndgDiscovery GUI application ''' 
     33        ''' Instantiate a wsgi ndgBrowse GUI application ''' 
    2734        self.configDir=configDir 
    2835        self.config=myConfig(configDir+'ndgDiscovery.config') 
     36        self.app=app 
    2937     
    3038    def __call__(self,environ,start_response): 
    3139         
    32         ''' This is the function which implements the ndgDiscovery ''' 
     40        ''' This is the function which implements the ndgBrowse ''' 
    3341         
    34         html='<p> Browse Test code, with server [%s]</p>'%self.config.get('DEFAULTS','server') 
    35          
    36         start_response('200 OK', [('Content-Type', 'text/html')]) 
    37          
    38         return [html] 
     42        inputs=dict(parse_querystring(environ)) 
     43        try: 
     44            if 'uri' not in inputs: raise ValueError('No URI requested') 
     45            if 'repository' not in inputs: 
     46                # check the config file to find an appropriate repository ...  
     47                n=ndgObject(inputs['uri']) 
     48                repository=self.config.get('NDG_B_SERVICE',n.repository,'NOREP') 
     49                if repository=='NOREP': 
     50                    server=self.config.get('DEFAULT','server',None) 
     51                    if server is None: raise ValueError('Corrupt browse/discovery config file') 
     52                    raise ValueError('Unable to retrieve [%s] via server [%s]'%(n.uri,server)) 
     53                # now modify the query string to get the repository into it 
     54                environ['QUERY_STRING']+='&repository=%s'%repository 
     55            html=self.app(environ,start_response) 
     56        except ValueError,e: 
     57            start_response('200 OK', [('Content-Type','text/html')]) 
     58            html=['<p> (Browse) Unable to retrieve document, error [%s]</p>'%e] 
     59        return html 
  • TI07-MOLES/trunk/PythonCode/wsgi/ndgGateKeeper.py

    r2046 r2364  
    22from paste.request import parse_querystring 
    33from ndgRetrieve import showDoc 
     4from ndgObject import ndgObject 
    45 
    56def keeperFactory(global_config,**local_conf): 
     
    6061        inputs['type']='xml' 
    6162        # modify the query string to enforce only getting the xml version at 
    62         # this stage 
     63        # this stage, since we need that to decide whether it can be shown. 
     64 
    6365        environ['QUERY_STRING']=query_replace(inputs,'type','xml') 
    6466 
    65          
    6667        ctype='text/xml' 
    6768        if outputType!='xml': ctype='text/html' 
    68         
     69 
    6970        # provide an alternative start_response to ensure that 
    7071        # the output headers are what we want 
    7172        def wrapped_start_response(status,headers,errorhandler=None): 
    7273           pass 
    73          
    7474        try: 
    7575            # now look at the document and decide whether the user can look at it ... 
    7676            r=self.wrapTarget(environ,wrapped_start_response) 
    77             # yes they can see it ... 
    78             r=self.shower.get(xml,inputs['format'],otype=outputType) 
     77            if r[0][0:3]!='<p>': 
     78                # Currently assuming error messages from the wrapped Target are coming back as <p>... 
     79                # yes they can see it ... 
     80                if 'format' not in inputs: 
     81                    n=ndgObject(inputs['uri']) 
     82                    inputs['format']=n.schema 
     83                r=self.shower.get(r,inputs['format'],otype=outputType) 
    7984        except ValueError,e: 
    8085            r=e 
     
    8489        print r 
    8590        xml=r[0] 
    86          
    87          
    88          
     91 
    8992        return r 
  • TI07-MOLES/trunk/PythonCode/wsgi/ndgObject.py

    r2345 r2364  
    6363                #this is a mapping from the ndg repository id to an actual repository id 
    6464                #understood by the ndg exist interface 
    65                 repository=self.config.get('NDG_B_SERVICE',self.repository) 
     65                repository=self.config.get('NDG_B_SERVICE',self.repository,'Unknown-B-Repository') 
    6666                self.URL=self.discoveryURL.replace('ndg',repository) 
    6767                self.xmlURL=self.URL.replace('html','xml') 
     
    8686class TestCase(unittest.TestCase): 
    8787    """ Tests as required """ 
     88     
     89    def getConfig(self): 
     90        from Utilities import myConfig 
     91        config=myConfig('ndgDiscovery.config') 
     92        return config 
    8893     
    8994    def testURI1(self): 
     
    115120        n=ndgObject(uri) 
    116121        n.schema='DIF' 
    117         from Utilities import myConfig 
    118         config=myConfig('ndgDiscovery.config') 
    119         n.setConfig(config) 
     122        n.setConfig(self.getConfig()) 
    120123        if n.gettable: 
    121124            self.assertEqual(n.discoveryURL[0:5],'http:') 
    122125            print n.discoveryURL 
    123              
     126     
     127    def testStubB(self): 
     128        uri='grid.bodc.nerc.ac.uk__MOLES-B1__PCDA47973RS2302' 
     129        n=ndgObject(uri) 
     130        n.setConfig(self.getConfig()) 
     131         
     132         
    124133 
    125134if __name__=="__main__": 
  • TI07-MOLES/trunk/PythonCode/wsgi/ndgRetrieve.py

    r2345 r2364  
    4545            if format=='DIF': 
    4646                r=DIF(xml,ndgObject=ndgObject) 
    47             elif format=='NDG-B1': 
     47            elif format=='MOLES-B1': 
    4848                r=stubB(xml,self.config) 
    4949            elif format=='DC': 
     
    9090         
    9191        inputs=dict(parse_querystring(environ)) 
     92        if environ['SCRIPT_NAME']=='/browse': browse=1 
    9293         
    9394        ctype='text/html'   # default content type (since the default 
     
    100101        return [r.encode('utf-8')] 
    101102                 
    102     def _present(self,inputs,ctype): 
     103    def _present(self,inputs,ctype,browse=0): 
    103104        ''' This is the entry point for an  inner retrieval loop for document retrieval ''' 
    104105        # we seperate this out for ease of building test cases 
     
    137138                    if outputType=='html': outputType='print'  # sanity ...     
    138139                #else: 
    139                 if 'format' not in inputs.keys(): 
    140                     format='NDG-B0' 
     140                if 'format' not in inputs: 
     141                    format=self.uri.schema 
    141142                else: 
    142143                    format=inputs['format'] 
    143                 print 'Request for %s format document'%inputs['format'] 
    144                 r=ws.get(uri.repository,uri.schema,uri.localID,format=format)    
     144                if browse: 
     145                    target='/db/ndg_B_metadata' 
     146                else: 
     147                    target='/db/discovery/moles' 
     148                r=ws.get(uri.repository,uri.schema,uri.localID,format=format,targetCollection=target) 
    145149                if isinstance(r,int): 
    146150                     r='<p> There are %s identifiers matching your request! </p>'%r 
     
    198202        ctype,r=retriever._present(inputs,'text/html') 
    199203        if r[0:3]=='<p>':raise ValueError,r 
    200     def testSOAPOriginal(self): 
     204    def AtestSOAPOriginal(self): 
    201205        ''' Tests the ability to obtain an original document via soap ''' 
    202206        inputs={'repository':'ndg','uri':testURI,'format':'original','type':'html','original':'1'} 
     
    223227        ctype,r=retriever._present(inputs,'text/html') 
    224228        if r[0:3]=='<p>':raise ValueError,r 
     229    def testCh(self): 
     230        ''' test link to local repository for NDG-B0''' 
     231        testURI='badc.nerc.ac.uk__NDG-B0__dataent_chablis' 
     232        inputs={'repository':'chinook.badc.rl.ac.uk','uri':testURI,'format':'NDG-B0','type':'xml'} 
     233        ctype,r=retriever._present(inputs,'text/html',browse=1) 
     234        if r[0:3]=='<p>':raise ValueError,r 
     235         
     236    def testCHstub(self): 
     237        ''' test link to local repository for NDG-B0''' 
     238        testURI='badc.nerc.ac.uk__NDG-B0__dataent_chablis' 
     239        testURI='badc.nerc.ac.uk__NDG-B0__activity_activity_faam' 
     240        inputs={'repository':'chinook.badc.rl.ac.uk','uri':testURI,'format':'NDG-B1','type':'xml'} 
     241        ctype,r=retriever._present(inputs,'text/html',browse=1) 
     242        if r[0:3]=='<p>':raise ValueError,r 
    225243         
    226244if __name__=="__main__": 
  • TI07-MOLES/trunk/PythonCode/wsgi/ndgSearch.py

    r2345 r2364  
    189189        return results 
    190190         
    191     def get(self,repository,schema,localID,format='original'): 
     191    def get(self,repository,schema,localID,format='original',targetCollection=None): 
    192192        ''' Obtain a document via it's NDG id split up ''' 
     193        #nb argument targetCollection is here to provide same API as exist xmlrpc interface 
    193194        uri='%s__%s__%s'%(repository,schema,localID) 
    194195        fileName=uri+'.xml' 
  • TI07-MOLES/trunk/PythonCode/wsgi/renderEntity.py

    r2315 r2364  
    189189def renderRelated(entity): 
    190190        ''' take a stub-b and create html for the related entities ''' 
     191        print entity.xml 
    191192        if entity.related!=[]: 
    192193                html='''<p><br/></p> 
  • TI07-MOLES/trunk/PythonCode/wsgi/stubB.py

    r2045 r2364  
    109109                self.labels={'activity':'Activity ','observationstation':'Observation Station ', 
    110110                                        'dataproductiontool':'Data Production Tool ','dataEntity':'Data Entity ','dataentity':'Data Entity'} 
    111                  
    112                 try: 
     111                try: 
    113112                        self.xml=xml 
    114113                        self.tree=ET.fromstring(self.xml) 
    115114                        self.name=wrapGetText(self.tree,'name') 
    116                 except: 
    117                         self.xml=None 
    118                         self.tree=None 
    119                         self.name='Not Found' 
    120                         return 
     115                except Exception,e: 
     116                        raise ValueError('Error instantiating stubB [%s]'%e) 
    121117                id=self.tree.find('dgMetadataID') 
    122118                self.entryID=idconvert(id) 
Note: See TracChangeset for help on using the changeset viewer.