/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for * full list of contributors). Published under the 2-clause BSD license. * See license.txt in the OpenLayers distribution or repository for the * full text of the license. */ /** * @requires OpenLayers/Format/WMSCapabilities.js * @requires OpenLayers/Format/OGCExceptionReport.js * @requires OpenLayers/Format/XML.js */ /** * Class: OpenLayers.Format.WMSCapabilities.v1 * Abstract class not to be instantiated directly. Creates * the common parts for both WMS 1.1.X and WMS 1.3.X. * * Inherits from: * - */ OpenLayers.Format.WMSCapabilities.v1 = OpenLayers.Class( OpenLayers.Format.XML, { /** * Property: namespaces * {Object} Mapping of namespace aliases to namespace URIs. */ namespaces: { wms: "http://www.opengis.net/wms", xlink: "http://www.w3.org/1999/xlink", xsi: "http://www.w3.org/2001/XMLSchema-instance" }, /** * Property: defaultPrefix */ defaultPrefix: "wms", /** * Constructor: OpenLayers.Format.WMSCapabilities.v1 * Create an instance of one of the subclasses. * * Parameters: * options - {Object} An optional object whose properties will be set on * this instance. */ /** * APIMethod: read * Read capabilities data from a string, and return a list of layers. * * Parameters: * data - {String} or {DOMElement} data to read/parse. * * Returns: * {Array} List of named layers. */ read: function(data) { if(typeof data == "string") { data = OpenLayers.Format.XML.prototype.read.apply(this, [data]); } var raw = data; if(data && data.nodeType == 9) { data = data.documentElement; } var capabilities = {}; this.readNode(data, capabilities); if (capabilities.service === undefined) { // an exception must have occurred, so parse it var parser = new OpenLayers.Format.OGCExceptionReport(); capabilities.error = parser.read(raw); } return capabilities; }, /** * Property: readers * Contains public functions, grouped by namespace prefix, that will * be applied when a namespaced node is found matching the function * name. The function will be applied in the scope of this parser * with two arguments: the node being read and a context object passed * from the parent. */ readers: { "wms": { "Service": function(node, obj) { obj.service = {}; this.readChildNodes(node, obj.service); }, "Name": function(node, obj) { obj.name = this.getChildValue(node); }, "Title": function(node, obj) { obj.title = this.getChildValue(node); }, "Abstract": function(node, obj) { obj["abstract"] = this.getChildValue(node); }, "BoundingBox": function(node, obj) { var bbox = {}; bbox.bbox = [ parseFloat(node.getAttribute("minx")), parseFloat(node.getAttribute("miny")), parseFloat(node.getAttribute("maxx")), parseFloat(node.getAttribute("maxy")) ]; var res = { x: parseFloat(node.getAttribute("resx")), y: parseFloat(node.getAttribute("resy")) }; if (! (isNaN(res.x) && isNaN(res.y))) { bbox.res = res; } // return the bbox so that descendant classes can set the // CRS and SRS and add it to the obj return bbox; }, "OnlineResource": function(node, obj) { obj.href = this.getAttributeNS(node, this.namespaces.xlink, "href"); }, "ContactInformation": function(node, obj) { obj.contactInformation = {}; this.readChildNodes(node, obj.contactInformation); }, "ContactPersonPrimary": function(node, obj) { obj.personPrimary = {}; this.readChildNodes(node, obj.personPrimary); }, "ContactPerson": function(node, obj) { obj.person = this.getChildValue(node); }, "ContactOrganization": function(node, obj) { obj.organization = this.getChildValue(node); }, "ContactPosition": function(node, obj) { obj.position = this.getChildValue(node); }, "ContactAddress": function(node, obj) { obj.contactAddress = {}; this.readChildNodes(node, obj.contactAddress); }, "AddressType": function(node, obj) { obj.type = this.getChildValue(node); }, "Address": function(node, obj) { obj.address = this.getChildValue(node); }, "City": function(node, obj) { obj.city = this.getChildValue(node); }, "StateOrProvince": function(node, obj) { obj.stateOrProvince = this.getChildValue(node); }, "PostCode": function(node, obj) { obj.postcode = this.getChildValue(node); }, "Country": function(node, obj) { obj.country = this.getChildValue(node); }, "ContactVoiceTelephone": function(node, obj) { obj.phone = this.getChildValue(node); }, "ContactFacsimileTelephone": function(node, obj) { obj.fax = this.getChildValue(node); }, "ContactElectronicMailAddress": function(node, obj) { obj.email = this.getChildValue(node); }, "Fees": function(node, obj) { var fees = this.getChildValue(node); if (fees && fees.toLowerCase() != "none") { obj.fees = fees; } }, "AccessConstraints": function(node, obj) { var constraints = this.getChildValue(node); if (constraints && constraints.toLowerCase() != "none") { obj.accessConstraints = constraints; } }, "Capability": function(node, obj) { obj.capability = { nestedLayers: [], layers: [] }; this.readChildNodes(node, obj.capability); }, "Request": function(node, obj) { obj.request = {}; this.readChildNodes(node, obj.request); }, "GetCapabilities": function(node, obj) { obj.getcapabilities = {formats: []}; this.readChildNodes(node, obj.getcapabilities); }, "Format": function(node, obj) { if (OpenLayers.Util.isArray(obj.formats)) { obj.formats.push(this.getChildValue(node)); } else { obj.format = this.getChildValue(node); } }, "DCPType": function(node, obj) { this.readChildNodes(node, obj); }, "HTTP": function(node, obj) { this.readChildNodes(node, obj); }, "Get": function(node, obj) { obj.get = {}; this.readChildNodes(node, obj.get); // backwards compatibility if (!obj.href) { obj.href = obj.get.href; } }, "Post": function(node, obj) { obj.post = {}; this.readChildNodes(node, obj.post); // backwards compatibility if (!obj.href) { obj.href = obj.get.href; } }, "GetMap": function(node, obj) { obj.getmap = {formats: []}; this.readChildNodes(node, obj.getmap); }, "GetFeatureInfo": function(node, obj) { obj.getfeatureinfo = {formats: []}; this.readChildNodes(node, obj.getfeatureinfo); }, "Exception": function(node, obj) { obj.exception = {formats: []}; this.readChildNodes(node, obj.exception); }, "Layer": function(node, obj) { var parentLayer, capability; if (obj.capability) { capability = obj.capability; parentLayer = obj; } else { capability = obj; } var attrNode = node.getAttributeNode("queryable"); var queryable = (attrNode && attrNode.specified) ? node.getAttribute("queryable") : null; attrNode = node.getAttributeNode("cascaded"); var cascaded = (attrNode && attrNode.specified) ? node.getAttribute("cascaded") : null; attrNode = node.getAttributeNode("opaque"); var opaque = (attrNode && attrNode.specified) ? node.getAttribute('opaque') : null; var noSubsets = node.getAttribute('noSubsets'); var fixedWidth = node.getAttribute('fixedWidth'); var fixedHeight = node.getAttribute('fixedHeight'); var parent = parentLayer || {}, extend = OpenLayers.Util.extend; var layer = { nestedLayers: [], styles: parentLayer ? [].concat(parentLayer.styles) : [], srs: parentLayer ? extend({}, parent.srs) : {}, metadataURLs: [], bbox: parentLayer ? extend({}, parent.bbox) : {}, llbbox: parent.llbbox, dimensions: parentLayer ? extend({}, parent.dimensions) : {}, authorityURLs: parentLayer ? extend({}, parent.authorityURLs) : {}, identifiers: {}, keywords: [], queryable: (queryable && queryable !== "") ? (queryable === "1" || queryable === "true" ) : (parent.queryable || false), cascaded: (cascaded !== null) ? parseInt(cascaded) : (parent.cascaded || 0), opaque: opaque ? (opaque === "1" || opaque === "true" ) : (parent.opaque || false), noSubsets: (noSubsets !== null) ? (noSubsets === "1" || noSubsets === "true" ) : (parent.noSubsets || false), fixedWidth: (fixedWidth != null) ? parseInt(fixedWidth) : (parent.fixedWidth || 0), fixedHeight: (fixedHeight != null) ? parseInt(fixedHeight) : (parent.fixedHeight || 0), minScale: parent.minScale, maxScale: parent.maxScale, attribution: parent.attribution }; obj.nestedLayers.push(layer); layer.capability = capability; this.readChildNodes(node, layer); delete layer.capability; if(layer.name) { var parts = layer.name.split(":"), request = capability.request, gfi = request.getfeatureinfo; if(parts.length > 0) { layer.prefix = parts[0]; } capability.layers.push(layer); if (layer.formats === undefined) { layer.formats = request.getmap.formats; } if (layer.infoFormats === undefined && gfi) { layer.infoFormats = gfi.formats; } } }, "Attribution": function(node, obj) { obj.attribution = {}; this.readChildNodes(node, obj.attribution); }, "LogoURL": function(node, obj) { obj.logo = { width: node.getAttribute("width"), height: node.getAttribute("height") }; this.readChildNodes(node, obj.logo); }, "Style": function(node, obj) { var style = {}; obj.styles.push(style); this.readChildNodes(node, style); }, "LegendURL": function(node, obj) { var legend = { width: node.getAttribute("width"), height: node.getAttribute("height") }; obj.legend = legend; this.readChildNodes(node, legend); }, "MetadataURL": function(node, obj) { var metadataURL = {type: node.getAttribute("type")}; obj.metadataURLs.push(metadataURL); this.readChildNodes(node, metadataURL); }, "DataURL": function(node, obj) { obj.dataURL = {}; this.readChildNodes(node, obj.dataURL); }, "FeatureListURL": function(node, obj) { obj.featureListURL = {}; this.readChildNodes(node, obj.featureListURL); }, "AuthorityURL": function(node, obj) { var name = node.getAttribute("name"); var authority = {}; this.readChildNodes(node, authority); obj.authorityURLs[name] = authority.href; }, "Identifier": function(node, obj) { var authority = node.getAttribute("authority"); obj.identifiers[authority] = this.getChildValue(node); }, "KeywordList": function(node, obj) { this.readChildNodes(node, obj); }, "SRS": function(node, obj) { obj.srs[this.getChildValue(node)] = true; } } }, CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1" });