has been done in the NaturalDocs branch back to trunk. Thanks to everyone who helped out in making this happen. (I could list people, but the list would be long, and I'm already mentally on vacation.) git-svn-id: http://svn.openlayers.org/trunk/openlayers@3545 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
216 lines
6.8 KiB
JavaScript
216 lines
6.8 KiB
JavaScript
/* Copyright (c) 2006 MetaCarta, Inc., published under a modified BSD license.
|
|
* See http://svn.openlayers.org/trunk/openlayers/repository-license.txt
|
|
* for the full text of the license. */
|
|
|
|
|
|
/**
|
|
* @requires OpenLayers/Layer.js
|
|
*
|
|
* Class: OpenLayers.Layer.HTTPRequest
|
|
*
|
|
* Inherits:
|
|
* - OpenLayers.Layer
|
|
*/
|
|
OpenLayers.Layer.HTTPRequest = OpenLayers.Class.create();
|
|
OpenLayers.Layer.HTTPRequest.prototype =
|
|
OpenLayers.Class.inherit( OpenLayers.Layer, {
|
|
|
|
/**
|
|
* Constant: URL_HASH_FACTOR
|
|
* {Float} Used to hash URL param strings for multi-WMS server selection.
|
|
* Set to the Golden Ratio per Knuth's recommendation.
|
|
*/
|
|
URL_HASH_FACTOR: (Math.sqrt(5) - 1) / 2,
|
|
|
|
/**
|
|
* Property: url
|
|
* {Array(String) or String} This is either an array of url strings or
|
|
* a single url string.
|
|
*/
|
|
url: null,
|
|
|
|
/**
|
|
* Property: params
|
|
* {Object} Hashtable of key/value parameters
|
|
*/
|
|
params: null,
|
|
|
|
/**
|
|
* APIProperty: reproject
|
|
* {Boolean} Whether layer should reproject itself based on base layer
|
|
* locations. This allows reprojection onto commercial layers.
|
|
* Default is false: Most layers can't reproject, but layers
|
|
* which can create non-square geographic pixels can, like WMS.
|
|
*/
|
|
reproject: false,
|
|
|
|
/**
|
|
* Constructor: OpenLayers.Layer.HTTPRequest
|
|
*
|
|
* Parameters:
|
|
* name - {String}
|
|
* url - {Array(String) or String}
|
|
* params - {Object}
|
|
* options - {Object} Hashtable of extra options to tag onto the layer
|
|
*/
|
|
initialize: function(name, url, params, options) {
|
|
var newArguments = arguments;
|
|
newArguments = [name, options];
|
|
OpenLayers.Layer.prototype.initialize.apply(this, newArguments);
|
|
this.url = url;
|
|
this.params = OpenLayers.Util.extend( new Object(), params);
|
|
},
|
|
|
|
/**
|
|
* APIMethod: destroy
|
|
*/
|
|
destroy: function() {
|
|
this.url = null;
|
|
this.params = null;
|
|
OpenLayers.Layer.prototype.destroy.apply(this, arguments);
|
|
},
|
|
|
|
/**
|
|
* APIMethod: clone
|
|
*
|
|
* Parameters:
|
|
* obj - {Object}
|
|
*
|
|
* Return:
|
|
* {<OpenLayers.Layer.HTTPRequest>} An exact clone of this
|
|
* <OpenLayers.Layer.HTTPRequest>
|
|
*/
|
|
clone: function (obj) {
|
|
|
|
if (obj == null) {
|
|
obj = new OpenLayers.Layer.HTTPRequest(this.name,
|
|
this.url,
|
|
this.params,
|
|
this.options);
|
|
}
|
|
|
|
//get all additions from superclasses
|
|
obj = OpenLayers.Layer.prototype.clone.apply(this, [obj]);
|
|
|
|
// copy/set any non-init, non-simple values here
|
|
|
|
return obj;
|
|
},
|
|
|
|
/**
|
|
* APIMethod: setUrl
|
|
*
|
|
* Parameters:
|
|
* newUrl - {String}
|
|
*/
|
|
setUrl: function(newUrl) {
|
|
this.url = newUrl;
|
|
},
|
|
|
|
/**
|
|
* APIMethod: mergeNewParams
|
|
*
|
|
* Parameters:
|
|
* newParams - {Object}
|
|
*/
|
|
mergeNewParams:function(newParams) {
|
|
this.params = OpenLayers.Util.extend(this.params, newParams);
|
|
},
|
|
|
|
/**
|
|
* Method: selectUrl
|
|
* selectUrl() implements the standard floating-point multiplicative
|
|
* hash function described by Knuth, and hashes the contents of the
|
|
* given param string into a float between 0 and 1. This float is then
|
|
* scaled to the size of the provided urls array, and used to select
|
|
* a URL.
|
|
*
|
|
* Parameters:
|
|
* paramString - {String}
|
|
* urls - {Array(String)}
|
|
*
|
|
* Return:
|
|
* {String} An entry from the urls array, deterministically selected based
|
|
* on the paramString.
|
|
*/
|
|
selectUrl: function(paramString, urls) {
|
|
var product = 1;
|
|
for (var i = 0; i < paramString.length; i++) {
|
|
product *= paramString.charCodeAt(i) * this.URL_HASH_FACTOR;
|
|
product -= Math.floor(product);
|
|
}
|
|
return urls[Math.floor(product * urls.length)];
|
|
},
|
|
|
|
/**
|
|
* Method: getFullRequestString
|
|
* Combine url with layer's params and these newParams.
|
|
*
|
|
* does checking on the serverPath variable, allowing for cases when it
|
|
* is supplied with trailing ? or &, as well as cases where not.
|
|
*
|
|
* return in formatted string like this:
|
|
* "server?key1=value1&key2=value2&key3=value3"
|
|
*
|
|
* WARNING: The altUrl parameter is deprecated and will be removed in 3.0.
|
|
*
|
|
* Parameters:
|
|
* newParams - {Object}
|
|
* altUrl - {String} Use this as the url instead of the layer's url
|
|
*
|
|
* Return:
|
|
* {String}
|
|
*/
|
|
getFullRequestString:function(newParams, altUrl) {
|
|
|
|
// if not altUrl passed in, use layer's url
|
|
var url = altUrl || this.url;
|
|
|
|
// create a new params hashtable with all the layer params and the
|
|
// new params together. then convert to string
|
|
var allParams = OpenLayers.Util.extend(new Object(), this.params);
|
|
allParams = OpenLayers.Util.extend(allParams, newParams);
|
|
var paramsString = OpenLayers.Util.getParameterString(allParams);
|
|
|
|
// if url is not a string, it should be an array of strings,
|
|
// in which case we will deterministically select one of them in
|
|
// order to evenly distribute requests to different urls.
|
|
//
|
|
if (url instanceof Array) {
|
|
url = this.selectUrl(paramsString, url);
|
|
}
|
|
|
|
// ignore parameters that are already in the url search string
|
|
var urlParams =
|
|
OpenLayers.Util.upperCaseObject(OpenLayers.Util.getArgs(url));
|
|
for(var key in allParams) {
|
|
if(key.toUpperCase() in urlParams) {
|
|
delete allParams[key];
|
|
}
|
|
}
|
|
paramsString = OpenLayers.Util.getParameterString(allParams);
|
|
|
|
// requestString always starts with url
|
|
var requestString = url;
|
|
|
|
if (paramsString != "") {
|
|
var lastServerChar = url.charAt(url.length - 1);
|
|
if ((lastServerChar == "&") || (lastServerChar == "?")) {
|
|
requestString += paramsString;
|
|
} else {
|
|
if (url.indexOf('?') == -1) {
|
|
//serverPath has no ? -- add one
|
|
requestString += '?' + paramsString;
|
|
} else {
|
|
//serverPath contains ?, so must already have paramsString at the end
|
|
requestString += '&' + paramsString;
|
|
}
|
|
}
|
|
}
|
|
return requestString;
|
|
},
|
|
|
|
/** @final @type String */
|
|
CLASS_NAME: "OpenLayers.Layer.HTTPRequest"
|
|
});
|