Changeset 5502 for cowsclient


Ignore:
Timestamp:
21/07/09 14:10:00 (10 years ago)
Author:
pnorton
Message:

Made a first attempt at dynamically populating the rendering options by retrieving JSON from the <MetadataURL> in the capabilities response.

Location:
cowsclient/branches/qesdi/cowsclient
Files:
4 added
8 edited

Legend:

Unmodified
Added
Removed
  • cowsclient/branches/qesdi/cowsclient/controllers/wmsviz.py

    r5484 r5502  
    1414from paste.request import parse_querystring 
    1515#from ows_server.models import Utilities 
    16 from cowsclient.lib.wmc_util import GetWebMapContext, GetWebMapCapabilities, GetLegend 
     16from cowsclient.lib.wmc_util import GetWebMapContext, GetWebMapCapabilities, GetLegend, openURL, GetResponse 
    1717from cowsclient.model import selectedItem 
    1818 
     
    3030        """ 
    3131        log.debug('wmsviz controller') 
     32         
    3233         
    3334        g.helpIcon='layout/icons/help.png'  #needs to go in config 
     
    6061            elif self.inputs['REQUEST'] == 'GetLegend': 
    6162                return GetLegend(self) 
     63             
     64            if self.inputs['REQUEST'] == 'GetDisplayOptions': 
     65                 
     66                jsonTxt = GetResponse(self.inputs['URL']) 
     67                 
     68                response.headers['Content-Type'] = 'application/json' 
     69                response.write(jsonTxt) 
     70                return 
     71                 
    6272 
    6373         
     
    8393            req.add_header('Cookie', request.headers.get('Cookie', '')) 
    8494            try: 
    85                     filehandle = urllib2.urlopen(req) 
     95                    filehandle = openURL(req) 
    8696            except urllib2.HTTPError, e: 
     97                 
     98                log.exception("exception occurred") 
     99                 
    87100                if e.code == 401: 
    88101                    log.info ('401 unauthorized error in cowsclient') 
  • cowsclient/branches/qesdi/cowsclient/lib/wmc_util.py

    r5484 r5502  
    1313from cowsclient.lib import exceptions 
    1414import urllib2, urllib 
     15import os 
    1516import logging 
     17import urlparse 
    1618log = logging.getLogger(__name__) 
    1719 
     
    6971        url = req.get_full_url() 
    7072 
    71         filehandle = urllib2.urlopen(req) 
     73        filehandle = openURL(req) 
    7274    except IOError: 
    7375        raise exceptions.URLUnavailable, "Could not access WMC endpoint: %s" % endpoint 
     
    9496    req = urllib2.Request(urlstring) 
    9597    req.add_header('Cookie', request.headers.get('Cookie', '')) 
    96     filehandle = urllib2.urlopen(req) 
     98    filehandle = openURL(req) 
    9799    return filehandle.read() 
    98100 
     
    101103     
    102104    urlstring=('%s?request=GetCapabilities&service=WMS'%(str(endpoint))) 
    103      
     105    log.debug("GetWebMapCapabilities endpoint = %s" % (endpoint,)) 
    104106    req = urllib2.Request(urlstring) 
    105107    req.add_header('Cookie', request.headers.get('Cookie', '')) 
    106     filehandle = urllib2.urlopen(req) 
     108    filehandle = openURL(req) 
    107109    return filehandle.read()     
    108110 
     111 
     112def GetResponse(url): 
     113    req = urllib2.Request(url) 
     114    req.add_header('Cookie', request.headers.get('Cookie', '')) 
     115    filehandle = openURL(req) 
     116    return filehandle.read()     
     117     
     118 
     119noProxyOpener = urllib2.build_opener(urllib2.HTTPHandler(), urllib2.ProxyHandler({})) 
     120 
     121def openURL(req): 
     122    log.debug("req.get_full_url() = %s" % (req.get_full_url(),)) 
     123     
     124    if _shouldUseProxy(req.get_full_url()): 
     125        log.debug("using proxy") 
     126        fh = urllib2.urlopen(req) 
     127    else: 
     128        log.debug("not using proxy") 
     129        fh = noProxyOpener.open(req) 
     130         
     131    return fh 
     132 
     133def _shouldUseProxy(urlstring) : 
     134    no_proxy   = os.environ.get('no_proxy', '') 
     135     
     136    urlObj = urlparse.urlparse(urlstring) 
     137    for np in no_proxy.split(','): 
     138        if urlObj.hostname == urlparse.urlparse(np).hostname: 
     139            return False 
     140     
     141    return True 
  • cowsclient/branches/qesdi/cowsclient/public/js/capabilities.js

    r5484 r5502  
    194194       
    195195    }, 
     196     
     197    getDisplayOptionsURL: function() { 
     198        var displayOpts = null; 
     199         
     200        for (var i=0; i<this.node.getElementsByTagName('MetadataURL').length; i++) 
     201            var metaURL = this.node.getElementsByTagName('MetadataURL')[i]; 
     202 
     203            if (metaURL.getAttribute('type') == 'display_options') { 
     204                var olr = metaURL.getElementsByTagName('OnlineResource')[0]; 
     205                displayOpts = olr.getAttribute('xlink:href'); 
     206            } 
     207         
     208        return displayOpts; 
     209    } 
    196210}; 
    197211 
  • cowsclient/branches/qesdi/cowsclient/public/js/layerControl.js

    r5484 r5502  
    100100    addWMS: function(wmsEndpoint, context, depth)  
    101101    { 
     102        alert("Adding WMS!!!"); 
    102103        var treeNode = new YAHOO.widget.MenuNode( 
    103104                 {endpoint: wmsEndpoint, 
     
    214215        { 
    215216            this._addLayerTree(subLayers[i],  
    216                 {endpoint: nodeData.endpoint}, 
     217                {endpoint: nodeData.endpoint, 
     218                wmcEndpoint: nodeData.wmcEndpoint}, 
    217219                treeNode); 
    218220        } 
     
    320322        var node1; 
    321323 
     324        // clear the already selected node 
    322325        node1 = this._selectedTreeNode; 
    323326        while (node1 != null)  
     
    336339        this._selectedTreeNode = node; 
    337340        node1 = this._selectedTreeNode; 
     341         
     342        // select the new nodes 
    338343        while (node1 != null)  
    339344        { 
     
    360365 
    361366            // add the selected layer to the layers panel 
    362             this._updateLeafLayer(); 
     367            this._addLayer(node); 
    363368             
    364369            // set the selected layer 
    365370            this._selectedLayer = node; 
    366              
    367             // update the selections control to match the selected layer 
    368             //this.coordControl.updateDomainDiv(this._selectedLayer.data.layerData.getDimensions()); 
    369  
    370             // now refresh the displayed map layers - this is done in the BaseMap.updateVisLayer fn 
    371             //this.events.triggerEvent('changeWMS'); 
    372371        } 
    373372    }, 
     
    421420 
    422421    /** 
    423      * Update what layers are displayed in the layer panel and add appropriate event listeners 
    424      * to their associated delete icons 
    425      * 
    426      * @param xhr - XmlHttpRequest object returned by Ajax call 
    427      */ 
    428     _updateLeafLayer: function(xhr)  
     422     * Add a new Layer 
     423     */ 
     424    _addLayer: function(node)  
    429425    {     
    430426         
    431         var node = this._selectedTreeNode; 
    432427         
    433428        var newLayer = this.makeNewLayer(node.data.wmcEndpoint, node.data.layer); 
     
    437432        return; 
    438433         
    439         // check this layer isn't already present and visible 
    440         layers = document.getElementById("layerlist"); 
    441         for (var i = 0; i < layerList.childNodes.length; i++) 
    442         { 
    443             child = layerList.childNodes[i]; 
    444             if (child.className == "hiddenList") 
    445                 continue; 
    446                  
    447             if (child.nodeName == "LI") 
    448             { 
    449                 title = child.getAttribute("title"); 
    450                 if (title == node.data.label) 
    451                     return; 
    452             } 
    453         }         
    454  
    455         // check what node was selected; if this was a webmapcontext one 
    456         // load this info, if not, load the capabilities 
    457         this.layerNo++; 
    458         if (this.layerNo > this.MAX_LAYER_NO) 
    459         { 
    460             alert('Can only select 10 layers at once; please delete an existing layer and try again.'); 
    461             this.layerNo--; 
    462             return; 
    463         } 
    464          
    465         this._updateLeafLayerMessage(); 
    466                  
    467         // Populate the leafLayer div 
    468         // - check if there are any existing, unused lists first 
    469         layer = this._getFirstHiddenListElement(); 
    470          
    471         listItemNumber = this.layerNo; 
    472         if (layer == null) 
    473         { 
    474             layer = document.createElement('li'); 
    475             layer.id = "li_" + this.layerNo; 
    476         } 
    477         else 
    478         { 
    479             // get the listItemNumber - to ensure the delete button matches 
    480             listItemNumber = layer.id.substring(layer.id.indexOf("_") + 1, layer.id.length); 
    481         } 
    482         layer.className = "list"; 
    483         layer.setAttribute("title", node.data.label); 
    484         layer.setAttribute("layerName", node.data.layer); 
    485         layer.setAttribute("wmcURL", node.data.wmcEndpoint); 
    486         layer.dimensions=node.data.layerData.getDimensions();  
    487         layer.innerHTML =  
    488             '<table><tr><td class="layerTitle">' + node.data.label + 
    489             '</td><td class="delIcon"><img id="del_' + listItemNumber + '" src="js/img/close.gif" />' + 
    490             '</td></tr></table>'; 
    491              
    492  
    493          
    494         //put layer at top of list  
    495         prependChild(layers, layer); 
    496         //instead of at bottom: 
    497         //layers.appendChild(layer); 
    498          
    499         // Add listener to delete icon to allow layer to be removed 
    500         deleteIcon = document.getElementById("del_" + listItemNumber); 
    501         deleteIcon.onclick = this._removeLayer.bindAsEventListener(this); 
    502434    }, 
    503435     
     
    531463    }, 
    532464 
    533     /**  
    534      * A hook to change the display of Dimension items. 
    535      *   Override this in subclasses to implement  
    536      */ 
    537     getDimensionText: function(dim, value)  
    538     { 
    539         return value; 
    540     }, 
    541      
     465    
    542466    onNewEndpointClick: function(evt) { 
    543467        var element = Event.element(evt); 
  • cowsclient/branches/qesdi/cowsclient/public/js/layerParameters.js

    r5484 r5502  
    1  
    21LayerParameters = function(propertiesDivId, selectionFormId, wmcRetriever) { 
    32    this.propertiesDiv = document.getElementById(propertiesDivId); 
     
    65    this.wmcRetriever = wmcRetriever; 
    76     
     7    this.displayOptsRetriever = new DisplayOptionsRetriever(); 
     8     
    89    this.dimFormID = 'WMSC_dimForm'; 
    910    this.hideControls(); 
     11     
     12    this.styleSelectFormId = 'style_select'; 
     13    this.styleSelectForm = document.getElementById(this.styleSelectFormId); 
    1014 
    1115     
     
    2024        EVENTS_RAISED: ['LAYER_PROPERTY_CHANGED'], 
    2125         
    22     addChangedListeners: function() { 
    23  
    24         for (i in this.selectionForm.elements) { 
    25                 element = this.selectionForm.elements[i]; 
     26    addChangedListeners: function(form) { 
     27     
     28        for (var i=0; i< form.elements.length; i++) { 
     29                element = form.elements[i]; 
     30 
    2631            handler = addHTMLEventListener(element, 'change', this.onSelectionChange, this); 
    2732            this._selectionEventHandlers[element.id] = handler; 
     
    3136     
    3237    removeChangedListeners: function() { 
    33  
    34         for (i in this.selectionForm.elements) { 
    35                 element = this.selectionForm.elements[i]; 
    36                 handler = this._selectionEventHandlers[element.id]; 
     38         
     39         
     40        for (id in this._selectionEventHandlers) { 
     41//            console.log("removing listeners form element " + id); 
     42                element = document.getElementById(id); 
     43                handler = this._selectionEventHandlers[id]; 
    3744                 
    3845                if (handler != null) { 
     
    7986    selectValuesForCurrentLayer: function() { 
    8087         
    81         var elements = this.selectionForm.elements; 
    82          
     88        this._setValuesFromForm(this.selectionForm); 
     89        this._setValuesFromForm($(this.dimFormID)); 
     90        this._setValuesFromForm(this.styleSelectForm); 
     91                 
     92        $('layer_url').innerHTML = this.currentLayer.url; 
     93        $('layer_name').innerHTML = this.currentLayer.params['LAYERS']; 
     94         
     95    }, 
     96 
     97    _setValuesFromForm: function(form) { 
     98        var elements = form.elements; 
     99         
    83100        for (var i=0; i< elements.length; i++){ 
    84101            param = elements[i].id.substr(7); 
    85102 
    86103            val = this.currentLayer.params[param.toUpperCase()]; 
    87             elements[i].value = val; 
    88         } 
    89          
    90         var elements = $(this.dimFormID).elements; 
    91          
    92         for (var i=0; i< elements.length; i++){ 
    93             param = elements[i].id.substr(7); 
    94  
    95             val = this.currentLayer.params[param.toUpperCase()]; 
    96             elements[i].value = val; 
    97         } 
    98          
    99         $('layer_url').innerHTML = this.currentLayer.url; 
    100         $('layer_name').innerHTML = this.currentLayer.params['LAYERS']; 
    101          
    102     }, 
    103  
     104            if (val != undefined) { 
     105                elements[i].value = val; 
     106            } 
     107        } 
     108    }, 
     109     
    104110    hideControls: function() { 
    105111        this.propertiesDiv.style.display = 'none'; 
     
    122128        var wmcLayer = this.searchSubLayers(wmc.getSubLayers()); 
    123129                 
     130        //add the style selection 
    124131        this.buildStyleSelection(wmcLayer); 
     132         
     133        //add the display options (if set) 
     134        dispURL = wmcLayer.getDisplayOptionsURL(); 
     135         
     136        if (dispURL != null) { 
     137             
     138            successFn =this._buildDisplayOptions.bindAsEventListener(this); 
     139             
     140            this.displayOptsRetriever.getDisplayOptions(dispURL, successFn ); 
     141        } 
    125142         
    126143        //build the select controls 
    127144                this.updateDomainDiv(wmcLayer.getDimensions()); 
    128                  
    129         this.addChangedListeners(); 
    130         this.selectValuesForCurrentLayer();              
     145 
    131146    }, 
    132147     
     
    184199    buildStyleSelection: function(layer) { 
    185200         
     201 
     202                
     203 
     204        this._buildStyleSelector(layer); 
     205 
     206        this.addChangedListeners(this.styleSelectForm); 
     207        this.selectValuesForCurrentLayer(); 
     208 
     209         
     210    }, 
     211     
     212    _buildDisplayOptions: function(displayOptions) { 
    186213        this.selectionForm.innerHTML = ''; 
    187          
    188         this.selectionForm.innerHTML += "Display Options: <br />"; 
    189          
     214        this.selectionForm.appendChild(this._buildDisplayOptionsList(displayOptions.common)); 
     215         
     216        this.addChangedListeners(this.selectionForm); 
     217        this.selectValuesForCurrentLayer();      
     218    }, 
     219     
     220    _buildDisplayOptionsList: function(optionsList) { 
    190221        var div = document.createElement('div'); 
    191         div.innerHTML = '<b>Style:</b> '; 
    192          
     222        div.innerHTML = '<b>Display Options</b> <br /> '; 
     223 
     224        for (var i=0; i< optionsList.length; i++) { 
     225            var opt = optionsList[i]; 
     226//            console.log("opt.name = " + opt.name + " opt.type = " + opt.type); 
     227             
     228            if (opt.type == 'select') { 
     229                div.appendChild(this._buildDisplayOptionSelect(opt)); 
     230            }  
     231            else if (opt.type == 'value') { 
     232                div.appendChild(this._buildDisplayOptionValue(opt)); 
     233            } 
     234        } 
     235         
     236        return div 
     237    }, 
     238     
     239    _buildDisplayOptionSelect: function(opt) { 
     240        div = document.createElement('div'); 
     241        div.innerHTML = '<b>'+ opt.name +':</b> '; 
     242        select = this._buildSelect(opt.name , opt.options, opt.options); 
     243        div.appendChild(select); 
     244        return div 
     245    }, 
     246     
     247    _buildDisplayOptionValue: function(opt) { 
     248        div = document.createElement('div'); 
     249        div.innerHTML = '<b>'+ opt.name +':</b> '; 
     250        var input = document.createElement('input'); 
     251        input.id = 'select_' + opt.name; 
     252        input.name = 'select_' + opt.name; 
     253        input.type = 'text'; 
     254        input.value = ''; 
     255         
     256        div.appendChild(input); 
     257        return div 
     258    }, 
     259     
     260    _buildStyleSelector: function(layer) { 
     261             
     262        this.styleSelectForm.innerHTML = '<b>Style:</b> '; 
    193263        var values = []; 
    194264        var descriptions = []; 
     
    201271        select = this._buildSelect('styles', descriptions, values); 
    202272         
    203          
    204         div.appendChild(select); 
    205         this.selectionForm.appendChild(div); 
    206  
    207         div = document.createElement('div'); 
    208         div.innerHTML = '<b>Cmap:</b> '; 
    209         select = this._buildSelect('cmap', ['jet', 'copper', 'bone', 'gray'], ['jet', 'copper', 'bone', 'gray']); 
    210         div.appendChild(select); 
    211         this.selectionForm.appendChild(div); 
    212          
    213          
     273        this.styleSelectForm.appendChild(select); 
    214274    }, 
    215275     
  • cowsclient/branches/qesdi/cowsclient/public/js/legendContainer.js

    r5484 r5502  
    55                initialize: function(legendDivId) { 
    66                        this.legendDiv = document.getElementById(legendDivId); 
    7                          
     7                        this.legendRetriever = new LegendRetriever(); 
    88                }, 
    99                 
     
    2727                                        REQUEST: 'GetLegend', 
    2828                        }); 
    29                                          
    30                                 var params = {REQUEST: 'GetLegend', 
    31                                                   ENDPOINT: url}; 
    3229                         
    33                         new Ajax.Request('',  
    34                                         {parameters: params, 
    35                                 method: "get", 
    36                                 onSuccess: this.setLegend.bindAsEventListener(this) 
    37                                         }); 
     30                        onSuccessFn = this.setLegend.bindAsEventListener(this) 
     31                        this.legendRetriever.getLegend(url, onSuccessFn) 
     32 
    3833                } 
    3934                }, 
    4035                 
    4136                setLegend: function (xhr) { 
    42                         console.log("setting legend at" +new Date()); 
     37//                      console.log("setting legend at" +new Date()); 
    4338                this.legendDiv.innerHTML = ''; 
    4439                var legendHTML =xhr.responseText; 
  • cowsclient/branches/qesdi/cowsclient/public/js/wmcRetriever.js

    r5484 r5502  
    3939                                        {parameters: params, 
    4040                                 method: "get", 
    41                                  onSuccess: onRetrieveWMC.bindAsEventListener(this) 
     41                                 onSuccess: onRetrieveWMC.bindAsEventListener(this), 
     42                                 onException : function(resp, e) {   alert("Exception:" + e); }, 
    4243                                        }); 
    4344                } 
  • cowsclient/branches/qesdi/cowsclient/templates/wmsviz.html

    r5484 r5502  
    5252<script src="$g.server/js/wcs.js"></script> 
    5353 
     54<script src="$g.server/js/displayOptionsRetriever.js"></script> 
     55<script src="$g.server/js/legendRetriever.js"></script> 
     56<script src="$g.server/js/json2.js"></script> 
    5457 
    5558<script src="$g.server/js/layerList.js"></script> 
     
    254257                            <br /> 
    255258                             
    256                              
     259                <form id='style_select'> 
     260                </form> 
     261                                             
    257262                            <form id='selection_form'> 
    258263                            </form> 
Note: See TracChangeset for help on using the changeset viewer.