Changeset 1175 for TI07-MOLES/trunk


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

Sundry problems fixed with respect to namespaces etc

Location:
TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/browse
Files:
10 edited

Legend:

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

    r1173 r1175  
    99from secure import AccessControl 
    1010from renderEntity import renderEntity 
    11 from ETxmlView import loadET 
     11from ETxmlView import loadET, nsdumb 
    1212 
    1313class DIF: 
     
    1919        self.metadataType='DIF' 
    2020        try: 
    21             self.elem=loadET(xml) 
     21            self.tree=loadET(xml) 
    2222            self.xml=xml 
    2323        except: 
    2424            # for some reason we can't parse the document ... 
    25             raise 
    26             self.elem=None 
    27             return 
     25            self.tree=None 
     26        if self.tree is None: return None 
     27        helper=nsdumb(self.tree) 
    2828        self.type='DIF' 
    29         self.entryID=wrapGetText(self.elem,'Entry_ID') 
    30          
    31         self.abstract=wrapGetText(self.elem,'Summary') 
    32         self.name=wrapGetText(self.elem,'Entry_Title') 
     29        self.entryID=helper.getText(self.tree,'Entry_ID') 
     30        self.abstract=helper.getText(self.tree,'Summary') 
     31        self.name=helper.getText(self.tree,'Entry_Title') 
    3332        self.abbreviation=self.name[0:min(5,len(self.name))] 
    3433        self.binding=ServiceBinding(n=self.abbreviation, 
    35                     nativeID=DIFid2NDGid(self.entryID),serviceFile=serviceFile) 
     34                    entryID=self.entryID,serviceFile=serviceFile) 
     35        print self.entryID,self.binding.url 
    3636        #Note that entity.constraints.html is about access control on the metadata, 
    3737        #and so we don't populate this here ... 
     
    4646        self.variables=[] 
    4747        self.parameters=[] 
     48         
    4849        match={'Category':self.categories,'Topic':self.topics,'Term':self.terms, 
    4950                'Variable':self.variables,'Detailed_Variable':self.parameters} 
    50         for level in ['Category','Topic','Term','Variable','Detailed_Variable']: 
    51             for item in self.elem.findall('Parameters/'+level): 
    52                 value=item.text 
    53                 if value not in match[level]: match[level].append(value) 
     51                 
     52        for parameter in helper.findall(self.tree,'Parameters'): 
     53            name='' 
     54            for level in ['Category','Topic','Term','Variable','Detailed_Variable']: 
     55                name+=helper.getText(parameter,level)+'/' 
     56            self.parameters.append(name.rstrip('/')) 
     57            #values=helper.getText(self.tree,'Parameters/'+level,multiple=1) 
     58            #for value in values:  
     59            #    if value not in match[level]: match[level].append(value) 
    5460         
    5561        #load up information about spatial bounding box  
    56         self.bbox=Bounding(self.elem,entity='DIF') 
     62        self.bbox=Bounding(self.tree,entity='DIF') 
    5763         
    5864        #load up information about temporal extent 
    5965        self.timeCoverage=( 
    60             wrapGetText(self.elem,'Temporal_Coverage/Start_Date'), 
    61             wrapGetText(self.elem,'Temporal_Coverage/Stop_Date'), 
    62             wrapGetText(self.elem,'Data_Set_Progress') ) 
     66            helper.getText(self.tree,'Temporal_Coverage/Start_Date'), 
     67            helper.getText(self.tree,'Temporal_Coverage/Stop_Date'), 
     68            helper.getText(self.tree,'Data_Set_Progress') ) 
    6369             
    6470        #Data curator information 
    65         self.centre=DIFcontact(self.elem.find('Data_Center'),ctype='centre') 
    66         self.curator=DIFcontact(self.elem) 
     71        self.centre=DIFcontact(helper.find(self.tree,'Data_Center'),ctype='centre') 
     72        self.curator=DIFcontact(self.tree) 
    6773             
    6874        #Data Creators 
     
    7076         
    7177        self.services=[] 
    72         f=file('tmplog.log','a') 
    73         for item in self.elem.findall('Related_URL'): 
     78         
     79        for item in helper.findall(self.tree,'Related_URL'): 
    7480            n=ServiceBinding(self.name,serviceFile=serviceFile) 
    75             self.services.append(n.related(item,DIFid2NDGid(self.entryID))) 
    76             f.write(str(self.services[-1])+self.services[-1].icon()) 
    77         f.close() 
     81            self.services.append(n.fromRelated(item,self.entryID,helper=helper)) 
     82             
    7883    def toHTML(self,config): 
    79         if self.elem is not None: 
     84        if self.tree is not None: 
    8085            renderer=renderEntity(config) 
    8186            return renderer.render(self) 
     
    8590if __name__=="__main__": 
    8691     
    87     f=file('../../../exampleD/spade.xml') 
     92    #f=file('../../../exampleD/spade.xml') 
     93    f=file('difeg.xml') 
    8894    g=file('../../../exampleD/ucar.xml') 
    8995    dif1xml=f.read() 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/browse/ETxmlView.py

    r1164 r1175  
    99import re 
    1010from sub_orphan import * 
     11 
     12class nsdumb: 
     13    ''' provides an xpath interface to element tree nodes which 
     14    is namespace agnostic ''' 
     15    def __init__(self,root=None): 
     16        ''' Provide a root element with namespace definitions when 
     17        instantiatin ''' 
     18        if root is None:  
     19            self.xmlns='' 
     20            return 
     21        ns=['xmlns','{http://www.w3.org/2001/XMLSchema-instance}schemaLocation'] 
     22        for i in ns:  
     23            if i in root.keys(): 
     24                self.xmlns='{%s}'%root.attrib[i].split(' ')[0] 
     25                break 
     26            else: 
     27                self.xmlns='' 
     28    def __str__(self): 
     29        return 'Element Tree namespace helper with namespace: [%s]'%self.xmlns 
     30    def getText(self,elem,xpathExpression,multiple=0): 
     31        ''' Get a text object sensibly ''' 
     32        if multiple: 
     33                r=elem.findall(self.xmlns+xpathExpression) 
     34        else: 
     35                r=[elem.find(self.xmlns+xpathExpression),] 
     36        try: 
     37                rr=[i.text for i in r] 
     38        except: 
     39                rr=['',] 
     40        if multiple:  
     41                return rr 
     42        else: return rr[0]  
     43         
     44    def find(self,elem,xpathExpression): 
     45       ''' Return relevant subelement ''' 
     46       xe=self.xmlns+xpathExpression 
     47       return elem.find(xe) 
     48    
     49    def findall(self,elem,xpathExpression): 
     50       ''' Return all relevant subelements ''' 
     51       xe=self.xmlns+xpathExpression 
     52       return elem.findall(xe) 
    1153 
    1254def et2text(elem,indent='',html=0,space='   '): 
     
    73115    might work''' 
    74116      
     117    if inputString is None: return None 
    75118    inputString=re.sub(r'&(?!\w+;)', '&', inputString) 
    76      
     119   
    77120    # first just try and do it so we don't waste time if we don't need to ... 
    78121    try: 
  • 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) 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/browse/Utilities.py

    r1173 r1175  
    9898        <localIdentifier>%s</localIdentifier></DIFid>'''%string 
    9999        return ET.fromstring(r) 
    100 def idconvert(e): 
    101     ''' Converts an XML ndg identifier into a uri version ''' 
    102     s='%s:%s:%s'%(wrapGetText(e,'repositoryIdentifier'), 
    103                     wrapGetText(e,'schemeIdentifier'), 
    104                     wrapGetText(e,'localIdentifier')) 
    105     return s 
    106100 
    107101if __name__=="__main__": 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/browse/browseCGI.py

    r1173 r1175  
    2121from DiscoveryWS import * 
    2222from DIF import DIF 
     23import base64 
    2324 
    2425import Cookie 
     
    4445                xml='<ndgCookie><bh>' 
    4546                for uri,name in self.getHistory(): 
    46                         xml+='<i><u>%s</u><n>%s</n></i>'%(uri,name) 
     47                        xml+='<i><u>%s</u><n>%s</n></i>'%(base64.urlsafe_b64encode(uri),name) 
    4748                xml+='</bh><sh>' 
    4849                for uri,name in self.getSelected(): 
    49                     xml+='<i><u>%s</u><n>%s</n></i>'%(uri,name) 
     50                    xml+='<i><u>%s</u><n>%s</n></i>'%(base64.urlsafe_b64encode(uri),name) 
    5051                xml+='</sh></ndgCookie>' 
    5152                return xml 
     
    5859                    for item in se: 
    5960                        uri,name=item.find('u'),item.find('n') 
    60                         self.__addTo(uri.text,name.text,se.tag) 
     61                        self.__addTo(base64.urlsafe_b64decode(uri.text),name.text,se.tag) 
    6162            except KeyError: 
    6263                pass 
     
    219220                 
    220221                if self.b.xml is None: 
    221                     content=self.error('Unable to obtain record from database') 
     222                    content=self.error('Unable to obtain record [%s] from database'%self.uri) 
    222223                    return content,0 
    223224                else: 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/browse/insecure.py

    r1171 r1175  
    6262        javaBin='java' 
    6363        jarLoc='../../returnstubb.jar' 
    64         id='badc.nerc.ac.uk/dataent1' 
     64        id='badc.nerc.ac.uk/dataent2' 
    6565        db='glue.badc.rl.ac.uk' 
    6666        d= insecureGetDoc(id,db=db,jar=jarLoc,javaBin=javaBin,format='DIF') 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/browse/renderDiscoverySet.py

    r1173 r1175  
    8080        i=-1*i 
    8181         
    82         if d.elem is None: 
     82        if d.tree is None: 
    8383            html+='<tr class="%s"><td colspan="%s"> Unparseable record </td></tr>'%(bgc,len(columns)) 
    8484        else: 
     
    131131    querystring='dummyUrl' 
    132132    state=DiscoveryState(ws.sessID,querystring,hits,stride=5) 
    133     #g=file('log.xml','w') 
    134133    for result in results: 
    135         #g.write(xmlCleanup(result)+'\n') 
    136134        difs.append(DIF(result,serviceFile='serviceMap.config')) 
    137135    html=renderDiscoverySet(difs,state,summary=1,spatial=1,temporal=1) 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/browse/renderEntity.py

    r1164 r1175  
    6666        picon=hyperlink(image(self.config.get('layout','printer'),'[Print]'),entity.binding.url+'&text=1') 
    6767        html+='<tr><td>%s</td><td> Printable version of XML content</td></tr>'%picon 
     68        for item in entity.services: 
     69            html+='<tr><td>%s</td><td>%s</td></tr>'%(item.icon(),item.description) 
    6870        html+='</tbody></table>' 
     71        
    6972        return html 
    7073 
     
    168171if __name__=="__main__": 
    169172        from stubB import stubB 
    170         xml=open('../../exampleB/methyl.example.xml').read() 
    171         renderer=renderEntity('browse.config') 
    172         x=stubB(xml,makeHTML=renderer,serviceFile='serviceMap.config') 
    173         html=x.toHTML() 
     173        from DIF import DIF 
     174        from Utilities import myConfig 
     175 
     176        xml=open('../../../exampleB/methyl.example.xml').read() 
     177        x=stubB(xml,serviceFile='serviceMap.config') 
     178        html=x.toHTML(myConfig('browse.config')) 
    174179        f=open('output.html','w') 
    175180        f.write(html) 
    176          
     181         
     182        xml=open('difeg.xml').read() 
     183        x=DIF(xml,serviceFile='serviceMap.config') 
     184        html=x.toHTML(myConfig('browse.config')) 
     185        g=open('difeg.html','w') 
     186        g.write(html) 
    177187         
    178188 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/browse/serviceMap.config

    r1173 r1175  
    3232service_name: Catalogue 
    3333badc.nerc.ac.uk: %(localhost)s/browse.py 
     34default: %(localhost)s/browse.py 
    3435instance: D=1&uri 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/browse/stubB.py

    r1173 r1175  
    1818                self.elem=elem 
    1919                self.constraints=AccessControl(elem.find('accessControlPolicy')) 
    20                 self.binding=ServiceBinding(n=name,nativeID=elem.find('dataModelID'), 
     20                self.binding=ServiceBinding(n=name,entryID=idconvert(elem.find('dataModelID')), 
    2121                                            serviceFile=serviceFile) 
    2222                self.Aurl=self.binding.url 
     
    9898                self.metadataType='stubB' 
    9999                self.serviceFile=serviceFile 
     100                self.services=[] 
    100101                 
    101102                self.labels={'activity':'Activity ','observationstation':'Observation Station ', 
     
    112113                        return 
    113114                id=self.tree.find('dgMetadataID') 
     115                self.entryID=idconvert(id) 
    114116                self.binding=ServiceBinding(n=wrapGetText(self.tree,'abbreviation'), 
    115                                 nativeID=id,serviceFile=serviceFile) 
     117                                entryID=self.entryID,serviceFile=serviceFile) 
    116118                self.Burl=self.binding.url 
    117                 self.entryID=idconvert(id) 
    118119                               
    119120                #Note that the root of the ElementTree instance is dgMetadataRecord 
     
    157158                                        for subitem in subitems: 
    158159                                                name=wrapGetText(subitem,'name') 
    159                                                 binding=ServiceBinding(name,nativeID=subitem.find('dgMetadataID'),uri='stubB',serviceFile=serviceFile) 
     160                                                entryID=idconvert(subitem.find('dgMetadataID')) 
     161                                                binding=ServiceBinding(name,entryID=entryID,serviceFile=serviceFile) 
    160162                                                aa.append(binding) 
    161163                                        deployment[1].append([self.labels[item],aa]) 
Note: See TracChangeset for help on using the changeset viewer.