Changeset 4272


Ignore:
Timestamp:
02/10/08 12:48:23 (11 years ago)
Author:
domlowe
Message:

Splitting CSML backend into common and service specific elements.

Location:
cows/trunk/cows/service/imps/csmlbackend
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • cows/trunk/cows/service/imps/csmlbackend/csmlcommon.py

    r4269 r4272  
     1""" Common CSML code shared between WMS, WFS and WCS backends  
     2@Author: Dominic Lowe  
     3""" 
     4 
     5import os, string 
     6import logging 
     7import csml 
     8from pylons import config, request, session  #config must have tmpfilebuffer and csmlstore values 
     9import ConfigParser 
     10log = logging.getLogger(__name__) 
     11  
     12try: 
     13    from ndgUtils import ndgObject, ndgRetrieve 
     14except: 
     15    log.warning("ndgUtils library could not be loaded, files in the eXist database won't be available, although you should still be able to access files from the csmlstore directory referenced in the ini file.") 
     16 
     17from cows.service.wxs_iface import ILayerMapper 
     18 
     19class CSMLLayerMapper(ILayerMapper): 
     20    """ 
     21    Map keyword arguments to a collection of layers. 
     22    Supports the retrieval of sets of layers according to arbitary 
     23    keyword/value pairs. 
     24    Implements  ILayerMapper  
     25     
     26    """ 
     27    def __init__(self): 
     28        self.layermapcache={} 
     29        self.connector=CSMLConnector() 
     30     
     31    def _getInfo(self, feature): 
     32        ''' given a csml feature, return basic info about the layer/feature 
     33        @return:   title, abstract''' 
     34 
     35        try: 
     36            title=feature.name.CONTENT 
     37        except: 
     38            title='' 
     39        try: 
     40            abstract=feature.description.CONTENT 
     41        except: 
     42            abstract=title 
     43         
     44        return title, abstract 
     45 
     46 
     47 
     48 
     49class CSMLConnector(object): 
     50    """ Contains common methods for CSML backend used across all WXS services """     
     51     
     52    def __init__(self): 
     53        pass 
     54     
     55    def get_csml_doc(self, fileoruri): 
     56        """ 
     57        Gets a csml document from file or exist when passed a file name or uri          
     58                
     59        Note, access control is not implemented on file access, only on exist access. 
     60         
     61        """ 
     62        if string.find(fileoruri,'__NDG-A0__') == -1: 
     63            #it's a local file not an identifier, read from local csmlstore 
     64            file=fileoruri 
     65            csml_dir = config['csmlstore'] 
     66            path = os.path.join(csml_dir, file) 
     67            if os.path.exists(path+'.csml'): 
     68                f = path+'.csml' 
     69            elif os.path.exists(path+'.xml'): 
     70                f = path +'.xml' 
     71            else: 
     72                raise ValueError("Cannot find CSML file %s" % file) 
     73             
     74            d = csml.parser.Dataset() 
     75            d.parse(f) 
     76         
     77        else: 
     78            #it's an NDG identifier, get the document from exist. 
     79            uri=fileoruri  
     80            uriN=ndgObject(uri) 
     81            conflocation=config['ndgconfig'] 
     82            cf=ConfigParser.ConfigParser() 
     83            cf.read(conflocation) 
     84            status,x=ndgRetrieve(uriN, cf, discovery=0) 
     85            d=csml.parser.Dataset() 
     86            d.parse(x)                          
     87        return d 
  • cows/trunk/cows/service/imps/csmlbackend/wms_csmllayer.py

    r4270 r4272  
    1111import Image 
    1212from copy import copy 
    13 from pywms.render_imp import RGBARenderer 
     13from cows.service.imps.pywms.render_imp import RGBARenderer 
    1414from matplotlib import cm 
    15 import genutil 
    16 from pylons import config, request, session  #config must have tmpfilebuffer and csmlstore values 
    1715import cdtime 
    1816import logging 
    1917log = logging.getLogger(__name__) 
    20 import ConfigParser 
    21  
    22 from cows.service.wxs_iface import ILayerMapper 
     18 
     19 
    2320from cows.service.wms_iface import IwmsLayer, IwmsDimension, IwmsLayerSlab 
    24  
    25 try: 
    26     from ndgUtils import ndgObject, ndgRetrieve 
    27 except: 
    28     log.warning("ndgUtils library could not be loaded, files in the eXist database won't be available, although you should still be able to access files from the csmlstore directory referenced in the ini file.") 
    29  
    30  
    31  
    32  
    33 class CSMLLayerMapper(ILayerMapper): 
     21from cows.service.imps.csmlbackend.csmlcommon import CSMLLayerMapper, CSMLConnector 
     22 
     23 
     24 
     25class CSMLwmsLayerMapper(CSMLLayerMapper): 
    3426    """ 
    3527    Map keyword arguments to a collection of layers. 
     
    4032    """ 
    4133    def __init__(self): 
    42         self.layermapcache={} 
     34        super(CSMLwmsLayerMapper, self).__init__() 
    4335     
    4436    def _getInfo(self, feature): 
     
    4638        @return:   title, abstract, dimensions, units, crss ''' 
    4739 
    48         try: 
    49             title=feature.name.CONTENT 
    50         except: 
    51             title='' 
    52         try: 
    53             abstract=feature.description.CONTENT 
    54         except: 
    55             abstract=title 
    56          
     40        title, abstract = super(CSMLwmsLayerMapper, self)._getInfo(feature) 
    5741        units=feature.getDomainUnits() 
    5842        dimensions={} 
     
    6145        domain = feature.getDomain() 
    6246        for dim in feature.getAxisLabels(): 
    63             nextdim=CSMLDimension(domain, dim, tmpunits.pop()) 
     47            nextdim=CSMLwmsDimension(domain, dim, tmpunits.pop()) 
    6448            if dim not in ['latitude', 'longitude']: 
    6549                dimensions[dim]=nextdim 
     
    7054            crss.append('WGS84') 
    7155        return title, abstract, dimensions, units, crss 
    72          
    73          
    74  
    75     def _get_csml_doc(self, fileoruri): 
    76         """ 
    77         Gets a csml document from file or exist when passed a file name or uri          
    78                 
    79         Note, access control is not implemented on file access, only on exist access. 
    80          
    81         """ 
    82         if string.find(fileoruri,'__NDG-A0__') == -1: 
    83             #it's a local file not an identifier, read from local csmlstore 
    84             file=fileoruri 
    85             csml_dir = config['csmlstore'] 
    86             path = os.path.join(csml_dir, file) 
    87             if os.path.exists(path+'.csml'): 
    88                 f = path+'.csml' 
    89             elif os.path.exists(path+'.xml'): 
    90                 f = path +'.xml' 
    91             else: 
    92                 raise ValueError("Cannot find CSML file %s" % file) 
    93              
    94             d = csml.parser.Dataset() 
    95             d.parse(f) 
    96          
    97         else: 
    98             #it's an NDG identifier, get the document from exist. 
    99             uri=fileoruri  
    100             uriN=ndgObject(uri) 
    101             conflocation=config['ndgconfig'] 
    102             cf=ConfigParser.ConfigParser() 
    103             cf.read(conflocation) 
    104             status,x=ndgRetrieve(uriN, cf, discovery=0) 
    105             d=csml.parser.Dataset() 
    106             d.parse(x)                          
    107         return d 
    108      
     56        
     57         
     58       
    10959    def map(self, **kwargs): 
    11060        """ 
     
    12070            return self.layermapcache[fileoruri] 
    12171          
    122         ds = self._get_csml_doc(fileoruri) 
     72        ds = self.connector.get_csml_doc(fileoruri) 
    12373        layermap={} 
    12474        self._crscat=csml.csmllibs.csmlcrs.CRSCatalogue() 
    12575        for feature in csml.csmllibs.csmlextra.listify(ds.featureCollection.featureMembers): 
    12676            title, abstract, dimensions, units, crss=self._getInfo(feature) 
    127             layermap[feature.id]=CSMLLayer(title,abstract, dimensions, units, crss, feature) 
     77            layermap[feature.id]=CSMLwmsLayer(title,abstract, dimensions, units, crss, feature) 
    12878        if len(layermap) > 0: 
    12979            self.layermapcache[fileoruri]=layermap 
     
    13383 
    13484 
    135 class CSMLLayer(IwmsLayer): 
     85class CSMLwmsLayer(IwmsLayer): 
    13686    """ 
    13787     representing a WMS layer.    Implements ILayer 
     
    215165            os.system('rm %s'%result[1]) 
    216166            bbox=self.getBBox(crs) 
    217             return CSMLLayerSlab(netcdf, self, crs, dimValues, renderOpts, bbox) 
     167            return CSMLwmsLayerSlab(netcdf, self, crs, dimValues, renderOpts, bbox) 
    218168        else: 
    219169            raise NotImplementedError 
     
    299249 
    300250 
    301 class CSMLDimension(IwmsDimension): 
     251class CSMLwmsDimension(IwmsDimension): 
    302252    """ 
    303253    implements IDimension 
     
    327277            self.units='ISO8601' 
    328278        
    329 class CSMLLayerSlab(IwmsLayerSlab): 
     279class CSMLwmsLayerSlab(IwmsLayerSlab): 
    330280    """ 
    331281    Implements LayerSlab 
     
    428378        self.dy=abs(lat[0]-lat[1]) 
    429379         
    430      
    431  
    432          
     380            
    433381 
    434382        self.nx=len(lon) 
Note: See TracChangeset for help on using the changeset viewer.