Changeset 2618


Ignore:
Timestamp:
20/06/07 09:09:28 (12 years ago)
Author:
lawrence
Message:

Fixing (I hope) a path problem for Dom with what I've done.

Location:
TI05-delivery/ows_framework/trunk/ows_server/ows_server
Files:
1 added
1 deleted
6 edited

Legend:

Unmodified
Added
Removed
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/config/ndgDiscovery.config

    r2615 r2618  
    2727 
    2828repository:       glue.badc.rl.ac.uk 
     29passwordFile:     passwords.txt 
    2930 
    3031[SEARCH] 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/config/ndgMiddleware.py

    r2616 r2618  
    11# ndg middleware 
    22from paste.deploy import CONFIG 
    3 from ows_server.lib.ndg.Utilities import myConfig 
     3from ows_server.models.Utilities import myConfig 
    44 
    55class ndgMiddleware: 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/controllers/retrieve.py

    r2616 r2618  
    1 import cgi,time 
     1 
    22from ows_server.lib.base import * 
    3 from ows_server.models import ndgObject, DocumentRetrieve, ndgSearch, xmlHandler 
     3from ows_server.models import ndgObject,  xmlHandler, ndgRetrieve 
    44from paste.request import parse_querystring 
    55 
     
    2020        self.uri.setConfig(self.cf) 
    2121        self.requestor=request.environ['REMOTE_ADDR'] 
     22        self.logger=0 
     23        if logger: self.logger=logger 
    2224        return 0 
    2325        
     
    2628        status=self.__setup(uri) 
    2729        if status: return Response(status) 
    28         status,xml=self._getit() 
     30        status,xml=ndgRetrieve.ndgRetrieve(self.uri,self.cf,logger=self.logger,requestor=self.requestor) 
    2931        if status: 
    3032            return Response(xml) 
     
    3537        status=self.__setup(uri) 
    3638        if status: return Response(status) 
    37         status,xml=self.__getit() 
     39        status,xml=ndgRetrieve.ndgRetrieve(self.uri,self.cf,logger=self.logger,requestor=self.requestor) 
    3840        if status: 
    3941            inputs=dict(parse_querystring(request.environ)) 
     
    4951            return Response(xml) 
    5052 
    51     def __getit(self): 
     53     
    5254         
    53         ''' This is the function which implements the document retrieval itself ''' 
    54          
    55         # note that at the moment we'll be instantiating an xmlrpc connection every 
    56         # time, ideally we'd have a pool of them available via the g object  
    57         # see http://docs.pythonweb.org/display/pylonscookbook/Using+the+DB-API+in+Pylons 
    58          
    59         server=self.cf.get('DEFAULT','server') 
    60         if self.uri.schema=='DIF': 
    61             r=server 
    62             ws=ndgSearch.ndgSearch() 
    63         elif self.uri.schema[0:5]=='NDG-B': 
    64             r=self.cf.get('NDG_B_SERVICE',self.uri.repository) 
    65             if r<> server: 
    66                 return 0,'The uri [%s] is not available on [%s]'%(self.uri,server) 
    67             ws=DocumentRetrieve.DocumentRetrieve(r) 
    68         elif self.uri.schema=='CSML': 
    69             return 0,'CSML recovery not yet implemented' 
    70         try: 
    71             target='/db/ndg_B_metadata' 
    72             format=self.uri.schema # for now 
    73              
    74             #do the actual search: 
    75             time1=time.time() 
    76             r=ws.get(self.uri.repository,self.uri.schema,self.uri.localID, 
    77                         format=format,targetCollection=target) 
    78             time2=time.time()-time1 
    79             logString='Document retrieve [%s] for [%s] took [%ss]'%(self.uri,self.requestor,time2) 
    80             if logger: logger.info(logString) 
    81  
    82             # did we get a sensible answer? 
    83             if isinstance(r,int): 
    84                return 0,'<p> There are %s identifiers matching your request! </p>'%r 
    85               
    86         except Exception,e: 
    87             return 0,'<p> Unable to retrieve [%s], reason was [%s]</p>'%(self.uri,cgi.escape(str(e))) 
    88                  
    89         return 1,r 
    90          
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/DocumentRetrieve.py

    r2615 r2618  
    1919class DocumentRetrieve (ndg_eXist): 
    2020    ''' This class provides a document retrieval service via the NDG exist interfaces ''' 
    21     def __init__(self,repository): 
     21    def __init__(self,repository,pwfile='passwords.txt'): 
    2222 
    23         ndg_eXist.__init__(self,db=repository) 
     23        ndg_eXist.__init__(self,db=repository,passwordFile=pwfile) 
    2424        self.repository=repository 
    2525 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/eXistInterface.py

    r2615 r2618  
    11# Code inspired by example on eXist website. 
    2 import urllib2, base64, urllib, urlparse, httplib, xmlrpclib, types 
     2import urllib2, base64, urllib, urlparse, httplib, xmlrpclib, types, os 
    33 
    44class   InstanceObject(object): 
     
    8181    ''' Adds ndg methods to a "standard" exist Connector ''' 
    8282    def __init__(self,db='glue.badc.rl.ac.uk',passwordFile='passwords.txt'): 
    83         f=file(passwordFile,'r') 
     83        try: 
     84            f=file(passwordFile,'r') 
     85        except IOError,e: 
     86            raise IOError('%s [lookin in %s]'%(e,os.getcwd())) 
     87             
    8488        pw={} 
    8589        for line in f.readlines(): 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/ndgRetrieve.py

    r2615 r2618  
     1import DocumentRetrieve, ndgSearch, ndgObject 
     2import cgi,time 
    13from Utilities import myConfig 
    2 from paste.request import parse_querystring 
    3 from renderEntity import renderEntity 
    4 import xmlHandler 
    5 from DC import DC 
    6 from DIF import DIF 
    7 from stubB import stubB 
    8 from ndgObject import ndgObject 
    9 from MDIP import MDIP 
    10 from ndgSearch import ndgSearch 
    11 import time 
    12 import cgi 
    134 
    14 # any class with a get method can be used here, and then only 
    15 # the instantiation within ndgRetrieve would need 
    16 # modification to use it ... 
     5def ndgRetrieve(uri,config,logger=0,requestor='test'): 
     6     
     7    ''' Given an ndgObject, uri, retrieve it, with security in place ''' 
     8     
     9    server=config.get('DEFAULT','server') 
     10    if uri.schema=='DIF': 
     11        r=server 
     12        ws=ndgSearch.ndgSearch() 
     13    elif uri.schema[0:5]=='NDG-B': 
     14        # The logic here is that 
     15        #    this code is running on server, which supports repositories sr 
     16        #    this particular object needs the repository for uri.repository 
     17        #    which had better be the same as sr, and then we use the 
     18        #    actual exist repository er. 
     19        #    I'm sure this can be cleaned up further :-) 
     20        r=config.get('NDG_B_SERVICE',uri.repository) 
     21        sr=config.get('DEFAULT','repository') 
     22        if r<> sr: 
     23            return 0,'The uri [%s] is not available on [%s]'%(uri,server) 
     24        er=config.get('NDG_EXIST',uri.repository) 
     25        pwf=config.get('DEFAULT','passwordFile') 
     26        ws=DocumentRetrieve.DocumentRetrieve(er,pwfile=pwf) 
     27    elif uri.schema=='CSML': 
     28        return 0,'CSML recovery not yet implemented' 
     29    try: 
     30        target='/db/ndg_B_metadata' 
     31        format=uri.schema # for now 
     32         
     33        #do the actual search: 
     34        time1=time.time() 
     35        r=ws.get(uri.repository,uri.schema,uri.localID,format=format,targetCollection=target) 
     36        time2=time.time()-time1 
     37        logString='Document retrieve [%s] for [%s] took [%ss]'%(uri,requestor,time2) 
     38        if logger: logger.info(logString) 
    1739 
    18 from DocumentRetrieve import DocumentRetrieve 
    19 debug=0 
    20 def retrieveFactory(global_config,**local_conf): 
    21      
    22     ''' This factory is intended to be used by paste-deploy to return 
    23     the ndgRetrieve wsgi application, configured to use the configDir 
    24     to find local configuration information ''' 
    25      
    26     if 'configDir' in local_conf.keys(): 
    27         configDir=local_conf[configDir] 
    28     else: 
    29         try: 
    30             configDir=global_config['configDir'] 
    31         except: 
    32             configDir=None 
    33     ndg=ndgRetrieve(configDir) 
    34     return ndg 
    35  
    36 class showDoc: 
    37     ''' Given an xml document (xml), of format ('DIF','DC','NDG-B1'), return 
    38     either the document rendered as "pretty" xml for printing, or as html  
    39     rendered by an appropriate application''' 
    40      
    41     def __init__(self,config): 
    42         self.config=config 
    43         self.renderer=renderEntity(self.config) 
    44          
    45     def get(self,xml,format,otype='html',ndgObj=None): 
    46         if otype=='html': 
    47             if format=='DIF': 
    48                 r=DIF(xml,ndgObj=ndgObj) 
    49             elif format=='NDG-B1': 
    50                 r=stubB(xml,self.config) 
    51             elif format=='DC': 
    52                 r=DC(xml) 
    53             elif format=='MDIP': 
    54                 r=MDIP(xml) 
    55             else: 
    56                 raise ValueError,'Unknown format [%s] for rendering'%format 
    57             r=self.renderer.render(r) 
    58         elif otype=='print': 
    59             x=xmlHandler.xmlHandler(xml,string=1) 
    60             r=x.html 
    61         elif otype=='xml': 
    62             return xml 
    63         else: 
    64             raise TypeError('Invalid output type [%s]'%otype) 
    65         return r 
    66  
    67 class ndgRetrieve: 
    68      
    69     ''' This is the ndgRetrieve application which simply allows one to enter a uri 
    70     of a document held in a LOCAL exist repository and return one of  
    71        - the raw document (type=xml), 
    72        - an html version fully rendered (type=html, which is the default), or 
    73        - a pretty printed version suitable for printing (type=print) 
    74     Note that this WSGI application SHOULD be wrapped by an ndgGatekeeper MIDDLEWARE application and 
    75     not exposed directly to users (except in testing of course :-) ''' 
    76      
    77     def __init__(self,configDir): 
    78          
    79         ''' Instantiate the wsgi document retrieval application ''' 
    80         self.configDir=configDir 
    81         self.config=myConfig(configDir+'ndgDiscovery.config') 
    82         self.logger=None 
    83         self.requestor='None' 
    84  
    85         self.shower=showDoc(self.config) 
    86         # nb ... we don't instantiate the retrieval web service, since 
    87         # we expect to potentially have multiple web services pointing 
    88         # at multiple databases (eg. BADC + NEODC + NDG ) ... 
    89         self.retrieveWS=DocumentRetrieve 
    90         self.WScursors={} 
    91      
    92     def __call__(self,environ,start_response): 
    93          
    94         ''' This is the function which implements the document retrieval ''' 
    95         self.logger=environ['wsgilog.logger'] 
    96         self.requestor=environ['REMOTE_ADDR'] 
    97         browse=0 
    98         inputs=dict(parse_querystring(environ)) 
    99         if environ['SCRIPT_NAME']=='/browse': browse=1 
    100          
    101         ctype='text/html'   # default content type (since the default 
    102                             # may be an error return ...) the actual default 
    103                             # data type for return is xml. 
    104         ctype,r=self._present(inputs,ctype,browse=browse) 
    105         #there appears to be a problem that if r is a python string (not unicode) 
    106         #and then we try and encode it we get in trouble ... 
    107         start_response('200 OK', [('Content-Type', ctype),('charset','utf-8')]) 
    108         return [r.encode('utf-8')] 
    109                  
    110     def _present(self,inputs,ctype,browse=0): 
    111         ''' This is the entry point for an  inner retrieval loop for document retrieval ''' 
    112         # we seperate this out for ease of building test cases 
    113         ori,format=0,None 
    114          
    115         if 'original' in inputs.keys(): ori=1 
    116         try: 
    117             outputType=inputs['type'] 
    118         except KeyError: 
    119             outputType='print' 
    120          
    121         if 'uri' not in inputs.keys(): 
    122             r=self.__prompt() 
    123             raise ValueError,r 
    124         else: 
    125             #this will raise a ValueError if there is a problem 
    126             uri=ndgObject(inputs['uri']) 
    127             uri.setConfig(self.config) 
    128             self.uri=uri 
    129             if 'repository' in inputs.keys():  
    130                 db=inputs['repository'] 
    131             else: 
    132                 db=uri.repository 
    133             if 'format' not in inputs: 
    134                 format=self.uri.schema 
    135             else: 
    136                 format=inputs['format'] 
    137             if db in self.WScursors.keys(): 
    138                 ws=self.WScursors[db] 
    139             else: 
    140                 if db.upper()=='NDG' or format.upper()=='ORIGINAL' : 
    141                     ws=ndgSearch() 
    142                 else: 
    143                     ws=DocumentRetrieve(db) 
    144                 self.WScursors[db]=ws 
    145             ok=1 
    146             try: 
    147                 if ori: 
    148                 #    r=ws.getOriginal(uri.uri) 
    149                     if outputType=='html': outputType='print'  # sanity ...     
    150                 #else: 
    151                 if browse or format=='NDG-B1': 
    152                     target='/db/ndg_B_metadata' 
    153                 else: 
    154                     target='/db/discovery/moles' 
    155                      
    156                 #do the actual search: 
    157                 time1=time.time() 
    158                 r=ws.get(uri.repository,uri.schema,uri.localID,format=format,targetCollection=target) 
    159                 time2=time.time()-time1 
    160                 logString='Document retrieve [%s] for [%s] took [%ss]'%(uri.uri,self.requestor,time2) 
    161                  
    162                 if self.logger: 
    163                     self.logger.info(logString) 
    164                 else: print logString 
    165                  
    166                 if isinstance(r,int): 
    167                      r='<p> There are %s identifiers matching your request! </p>'%r 
    168                      ok=0 
    169             except Exception,e: 
    170                  r='<p> Unable to retrieve [%s], reason was [%s]</p>'%(uri.uri,cgi.escape(str(e))) 
    171                  ok=0 
    172          
    173         if not ok: return ctype,r 
    174          
    175         if outputType!='xml':  
    176             if debug: 
    177                 r=self.shower.get(r,format,otype=outputType,ndgObj=self.uri) 
    178             else: 
    179                 try: 
    180                     self.logger.info('Doc--\n%s\n--\n'%r) 
    181                     r=self.shower.get(r,format,otype=outputType,ndgObj=self.uri) 
    182                 except Exception,e: 
    183                     r='<p> Unable to show document, reason was [%s]<p>'%cgi.escape(str(e)) 
    184         else: 
    185             ctype='text/xml' 
    186         return ctype,r 
    187      
    188      
    189     def __prompt(self): 
    190         ''' If the URI is not an argument to the request, prompt the user for a URI ''' 
    191         h=''' 
    192         <form method='get' action=''> 
    193         <p> 
    194           Enter a Document Identifier to View:   
    195             <input type='text' name='uri'/><br/> 
    196             (uri format: e.g. badc.nerc.ac.uk:DIF:xyz39) <br/> 
    197             (Querying <input type='text' name='repository' value='gepidae.esc.rl.ac.uk'/>)<br/> 
    198             Return: <input type="radio" name="type" value="xml"/> XML Raw 
    199                 <input type="radio" name="type" value="html"/> Formatted 
    200                 <input type="radio" name="type" value="print"/> XML Printable 
    201           <input type='submit'/> 
    202         </p> 
    203         </form> 
    204         ''' 
    205         return h 
     40        # did we get a sensible answer? 
     41        if isinstance(r,int): 
     42            return 0,'<p> There are %s identifiers matching your request! </p>'%r 
     43             
     44    except Exception,e: 
     45        return 0,'<p> Unable to retrieve [%s], reason was [%s]</p>'%(uri,cgi.escape(str(e))) 
     46             
     47    return 1,r 
    20648     
    20749import unittest 
    208 #testURI='noc.soton.ac.uk__DIF__NOCSDAT193' 
    209 #testURI='ndg.noc.soton.ac.uk__NDG-B0__NOCSDAT274' 
    210 #testURI='grid.bodc.nerc.ac.uk__DIF__EDMED1048034' 
    211 #testURI='grid.bodc.nerc.ac.uk__DIF__EDMED1048008' 
    212 testURI='bgs.nerc.ac.uk__DIF__GEOP_EAST' 
    213 testURI='neodc.nerc.ac.uk__DIF__NEODC_NEXTMAP' 
    214 retriever=ndgRetrieve('./') 
     50 
     51 
    21552class TestCase(unittest.TestCase): 
     53     
     54    def setup(self): 
     55        self.c=myConfig('../config/ndgDiscovery.config') 
     56     
     57    def testSOAP(self): 
     58        ''' test link to SOAP web service for DIF''' 
     59 
     60        self.setup() 
     61        doc='neodc.nerc.ac.uk__DIF__NEODC_NEXTMAP' 
     62        uri=ndgObject.ndgObject(doc) 
     63        status,xml=ndgRetrieve(uri,self.c) 
     64        if not status: raise ValueError(xml) 
     65 
     66    def testEXIST(self): 
     67        ''' test link to local exist via xml rpc. 
     68                users will need to ensure that the document is actually  
     69                in your exist database! ''' 
    21670         
    217     def AtestOriginal(self): 
    218         ''' Tests the ability to obtain an original document via xmlrpc ''' 
    219         inputs={'repository':'glue.badc.rl.ac.uk','uri':testURI,'format':'original','type':'html','original':'1'} 
    220         ctype,r=retriever._present(inputs,'text/html') 
    221         if r[0:3]=='<p>':raise ValueError,r 
    222     def AtestSOAPOriginal(self): 
    223         ''' Tests the ability to obtain an original document via soap ''' 
    224         inputs={'repository':'ndg','uri':testURI,'format':'original','type':'html','original':'1'} 
    225         ctype,r=retriever._present(inputs,'text/html') 
    226         if r[0:3]=='<p>':raise ValueError,r 
    227     def AtestDIF(self): 
    228         ''' Tests the ability to obtain a DIF document ''' 
    229         inputs={'repository':'glue.badc.rl.ac.uk','uri':testURI,'format':'DIF','type':'html'} 
    230         ctype,r=retriever._present(inputs,'text/html') 
    231         if r[0:3]=='<p>':raise ValueError,r 
    232     def AtestMDIP(self): 
    233         ''' Tests the ability to obtain an MDIP document ''' 
    234         inputs={'repository':'glue.badc.rl.ac.uk','uri':testURI,'format':'MDIP','type':'html'} 
    235         ctype,r=retriever._present(inputs,'text/html') 
    236         if r[0:3]=='<p>':raise ValueError,r 
    237     def AtestISO(self): 
    238         ''' Tests the ability to obtain an ISO document ''' 
    239         inputs={'repository':'glue.badc.rl.ac.uk','uri':testURI,'format':'ISO19139','type':'html'} 
    240         ctype,r=retriever._present(inputs,'text/html') 
    241         if r[0:3]=='<p>':raise ValueError,r 
    242     def AtestDC(self): 
    243         ''' Tests the ability to obtain a DC document ''' 
    244         inputs={'repository':'glue.badc.rl.ac.uk','uri':testURI,'format':'DC','type':'html'} 
    245         ctype,r=retriever._present(inputs,'text/html') 
    246         if r[0:3]=='<p>':raise ValueError,r 
    247     def testCh(self): 
    248         ''' test link to local repository for NDG-B0''' 
    249         testURI='badc.nerc.ac.uk__NDG-B0__dataent_chablis' 
    250         inputs={'repository':'chinook.badc.rl.ac.uk','uri':testURI,'format':'NDG-B0','type':'xml'} 
    251         ctype,r=retriever._present(inputs,'text/html',browse=1) 
    252         if r[0:3]=='<p>':raise ValueError,r 
     71        self.setup() 
     72        doc='badc.nerc.ac.uk__NDG-B0__activity_activity_cwvc' 
     73        uri=ndgObject.ndgObject(doc) 
     74        status,xml=ndgRetrieve(uri,self.c) 
     75        if not status: raise ValueError(xml) 
    25376         
    254     def testBODC(self): 
    255         ''' Tests the link to BODC exist ''' 
    256         uri='grid.bodc.nerc.ac.uk:DIF:PCDA47973RS2302' 
    257         inputs={'repository':'grid.bodc.nerc.ac.uk','uri':uri,'format':'NDG-B1','type':'xml'} 
    258         ctype,r=retriever._present(inputs,'text/html',browse=1) 
    259         if r[0:3]=='<p>':raise ValueError,r 
     77    def testNoSOAP(self): 
     78        ''' Test that we get a sensible error if a DIF doesn't exist ''' 
    26079         
    261     def testCHstub(self): 
    262         ''' test link to local repository for NDG-B0''' 
    263         testURI='badc.nerc.ac.uk__NDG-B0__dataent_chablis' 
    264         #testURI='badc.nerc.ac.uk__NDG-B0__activity_activity_faam' 
    265         #testURI='badc.nerc.ac.uk__NDG-B0__activity_activity_hadat' 
    266         #testURI='badc.nerc.ac.uk__NDG-B0__activity_activity_cwvc' 
    267         testURI='badc.nerc.ac.uk__NDG-B1__obs_1162914786499342' 
    268         inputs={'repository':'chinook.badc.rl.ac.uk','uri':testURI,'format':'NDG-B1','type':'xml'} 
    269         ctype,r=retriever._present(inputs,'text/html',browse=1) 
    270         f=file('%s.xml'%testURI,'w') 
    271         f.write(r) 
    272         f.close() 
    273         if r[0:3]=='<p>':raise ValueError,r 
     80        self.setup() 
     81        doc='badc.nerc.ac.uk__DIF__blah' 
     82        uri=ndgObject.ndgObject(doc) 
     83        status,xml=ndgRetrieve(uri,self.c) 
     84        if status: raise ValueError(' DIF [%s] should not exist [%s]'%(doc,xml)) 
     85         
     86    def testNoB(self): 
     87        ''' Test that we get a sensible error if a NDG-B doc doesn't exist ''' 
     88         
     89        self.setup() 
     90        doc='badc.nerc.ac.uk__NDG-B0__blah' 
     91        uri=ndgObject.ndgObject(doc) 
     92        status,xml=ndgRetrieve(uri,self.c) 
     93        if status: raise ValueError(' NDG-B0 [%s] should not exist [%s]'%(doc,xml) ) 
     94         
    27495         
    27596if __name__=="__main__": 
    27697    unittest.main() 
    277      
Note: See TracChangeset for help on using the changeset viewer.