Ignore:
Timestamp:
14/06/06 14:31:32 (13 years ago)
Author:
lawrence
Message:

Sundry problems fixed with respect to namespaces etc

File:
1 edited

Legend:

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

    r1173 r1175  
    1313# This module provides classes to support these activities. 
    1414 
    15 from Utilities import wrapGetText, myConfig, DIFid2NDGid 
     15from Utilities import myConfig 
    1616from htmlUtilities import hyperlink,image 
     17from ETxmlView import nsdumb,et2text 
     18 
     19def idconvert(e,helper=None): 
     20    ''' Converts an XML ndg identifier into a uri version ''' 
     21    if helper is None: 
     22        helper=nsdumb() 
     23    s='%s:%s:%s'%(helper.getText(e,'repositoryIdentifier'), 
     24                    helper.getText(e,'schemeIdentifier'), 
     25                    helper.getText(e,'localIdentifier')) 
     26    return s 
    1727 
    1828class ServiceMap(myConfig): 
     
    5464 
    5565class ServiceBinding (Service): 
    56         ''' Given a specific NDG id, we can go from the scheme identifier to the  
     66        ''' Given a specific entryID, we can go from the scheme identifier to the  
    5767        native service which one expects to be able to operate upon it, for example, 
    5868        an NDG-A type identifier should expect the NDG-A-Service running at the 
    59         specific repository. Note that we support the NDG id in one of two formats: 
    60             nativeID is an elementTree object from an xml form, and  
    61             entryID is a repository:scheme:localidentifier string  ''' 
    62         def __init__(self,n='',nativeID=None,entryID=None,serviceFile='cgi/serviceMap.config',uri='local'): 
     69        specific repository. Note that we support the NDG id in the abbreviated format 
     70        entryID is a repository:scheme:localidentifier string ''' 
     71        def __init__(self,n='',entryID=None,serviceFile='cgi/serviceMap.config'): 
    6372            Service.__init__(self) 
    6473            # regrettably we used different things in our ID's than we did in 
     
    6877            self.serviceMap=ServiceMap(serviceFile=serviceFile) 
    6978            self.name=n 
    70             if nativeID is not None:  
    71                 self.native(nativeID,uri=uri) 
    72             elif entryID is not None: 
    73                 self.entry(entryID) 
    74         def entry(self,id): 
    75             self.native(DIFid2NDGid(id)) 
    76         def native(self,elem,uri='local',seqno=1): 
    77             ''' Given an ndg id, get the native service ''' 
    78             #e.g. 
    79             #<dataModelID> 
    80             #    <schemeIdentifier>NDG-A0</schemeIdentifier> 
    81             #    <repositoryIdentifier>badc.nerc.ac.uk</repositoryIdentifier> 
    82             #    <localIdentifier>acsoe_badc_eae96_macehead_mcf_1</localIdentifier> 
    83             #</dataModelID> 
    84             if elem is None:return 'No valid URL' 
    85             s=wrapGetText(elem,'schemeIdentifier') 
    86             r=wrapGetText(elem,'repositoryIdentifier') 
    87             l=wrapGetText(elem,'localIdentifier') 
    88             if s in self.mapping: s=self.mapping[s].upper() 
    89             b=self.serviceMap.do(s,r) 
     79            if entryID is not None: 
     80                self.fromEntry(entryID) 
     81        def fromNative(self,nativeID,helper=None,seqno=1): 
     82            ''' Support native XML ID form of entryID, see also fromEntry ''' 
     83            entryID=idconvert(nativeID,helper) 
     84            return self.fromEntry(entryID,seqno) 
     85        def fromEntry(self,entryID,seqno=1): 
     86            ''' Given an entryID, get the native service ''' 
     87            #e.g. badc.nerc.ac.uk:NDG-A0:someLocalIdentifier  
     88            s,r,l,b=self.__getsrlb(entryID) 
    9089            uri=self.__makeuri(s,r,l) 
    9190            self.url=self.__makeurl(s,b,uri,seqno) 
    9291            self.serviceType=s 
    9392            return self 
    94         def related(self,elem,idelem,seqno=1): 
    95             ''' Given a DIF related URL, get a service binding ''' 
     93        def fromRelated(self,elem,entryID,helper=None,seqno=1): 
     94            ''' Given a DIF related URL, get a service binding, 
     95            using an instantiated ET helper that's available 
     96            to avoid problems with namespaces ''' 
    9697            # e.g: 
    9798            #<Related_URL> 
     
    102103            #<URL>http://badc.nerc.ac.uk/browse/badc/CDs/spade9293</URL> 
    103104            #</Related_URL> 
    104             self.description=wrapGetText(elem,'Description') 
    105             s=wrapGetText(elem,'URL_Content_Type').upper() 
     105            s,r,l,b=self.__getsrlb(entryID) 
     106            #now ovewrite the self description above with  
     107            #detail from this particular rleated url 
     108            if helper is None:helper=nsdumb() 
     109            self.description=helper.getText(elem,'Description') 
     110            s=helper.getText(elem,'URL_Content_Type').upper() 
    106111            self.serviceType=s 
    107112            if s!='': 
    108                 r=wrapGetText(elem,'URL') 
     113                r=helper.getText(elem,'URL') 
    109114                b=self.serviceMap.do(s,r) 
    110                 l=wrapGetText(idelem,'localIdentifier') 
    111115                uri=self.__makeuri(s,r,l) 
    112116                self.url=self.__makeurl(s,b,uri,seqno) 
    113117            else: 
    114                 self.url=wrapGetText(elem,'URL') 
     118                self.url=helper.getText(elem,'URL') 
    115119            return self 
    116120        def __str__(self): 
     
    120124            ''' return html icon linking to specific service ''' 
    121125            return hyperlink(image(self.serviceMap.icon,self.serviceMap.iconalt),self.url) 
    122         def __makeuri(self,s,b,l): 
     126        def __makeuri(self,s,r,l): 
    123127            ''' Actually create the URI ''' 
     128            if r=='': return l 
    124129            if s in ('NDG_B_SERVICE','DISCOVERY'): 
    125                 uri='%s/%s'%(b,l) 
     130                uri='%s/%s'%(r,l) 
    126131            else: 
    127132                uri=l 
    128133            return uri 
    129134        def __makeurl(self,s,b,uri,seqno): 
    130             ''' Actually create the URL ''' 
     135            ''' Actually create the URL, which may be sequentially 
     136            numbered if it's going to the data extractor (and so 
     137            iType read from config file will have a %s in it ) ''' 
    131138            iType=self.serviceMap.get(s,'instance','uri') 
    132139            if '%s' in iType: iType=iType%seqno 
    133140            return '%s?%s=%s'%(b,iType,uri) 
     141        def __getsrlb(self,entryID): 
     142            '''Take an entry ID, and parse it for NDG identifiers otherwise 
     143            and if not, do something sensible ''' 
     144            try: 
     145                r,s,l=entryID.split(':') 
     146                if s in self.mapping: s=self.mapping[s].upper() 
     147                b=self.serviceMap.do(s,r) 
     148            except: 
     149                #not from NDG ... provide only discovery binding 
     150                s,r,l='DISCOVERY','',entryID 
     151                b=self.serviceMap.get(s,'default') 
     152            return s,r,l,b 
    134153             
    135154if __name__=="__main__": 
     
    141160            </dataModelID>''' 
    142161        idelem=ET.fromstring(s) 
    143         n=ServiceBinding('macehead',nativeID=idelem,serviceFile='serviceMap.config') 
     162        entryID=idconvert(idelem) 
     163        n=ServiceBinding('macehead',entryID=entryID,serviceFile='serviceMap.config') 
    144164        maceheadServices=[n] 
    145165        s='''<dummy><Related_URL> 
     
    159179        for x in stuff.findall('Related_URL'): 
    160180            n=ServiceBinding('macehead',serviceFile='serviceMap.config') 
    161             maceheadServices.append(n.related(x,idelem)) 
     181            maceheadServices.append(n.fromRelated(x,idelem)) 
    162182        for i in maceheadServices:  
    163183            print str(i) 
Note: See TracChangeset for help on using the changeset viewer.