[Commits] r1164 - in core/trunk/geoext: lib lib/GeoExt/data tests tests/lib/GeoExt/data
commits at geoext.org
commits at geoext.org
Mon Jun 29 18:48:53 CEST 2009
Author: sbenthall
Date: 2009-06-29 18:48:53 +0200 (Mon, 29 Jun 2009)
New Revision: 1164
Added:
core/trunk/geoext/lib/GeoExt/data/WMSDescribeLayerReader.js
core/trunk/geoext/lib/GeoExt/data/WMSDescribeLayerStore.js
core/trunk/geoext/tests/lib/GeoExt/data/WMSDescribeLayerReader.html
core/trunk/geoext/tests/lib/GeoExt/data/WMSDescribeLayerReader.js
Modified:
core/trunk/geoext/lib/GeoExt.js
core/trunk/geoext/tests/list-tests.html
Log:
WMSDescribeLayerReader and WMSDescribeLayerStore. r=ahocevar (Closes #108)
Added: core/trunk/geoext/lib/GeoExt/data/WMSDescribeLayerReader.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/data/WMSDescribeLayerReader.js (rev 0)
+++ core/trunk/geoext/lib/GeoExt/data/WMSDescribeLayerReader.js 2009-06-29 16:48:53 UTC (rev 1164)
@@ -0,0 +1,94 @@
+/**
+ * Copyright (c) 2008-2009 The Open Source Geospatial Foundation
+ *
+ * Published under the BSD license.
+ * See http://svn.geoext.org/core/trunk/geoext/license.txt for the full text
+ * of the license.
+ */
+
+/** api: (define)
+ * module = GeoExt.data
+ * class = WMSDescribeLayerReader
+ * base_link = `Ext.data.DataReader <http://extjs.com/deploy/dev/docs/?class=Ext.data.DataReader>`_
+ */
+Ext.namespace("GeoExt.data");
+
+/** api: constructor
+ * .. class:: WMSDescribeLayerReader(meta, recordType)
+ *
+ * :param meta: ``Object`` Reader configuration.
+ * :param recordType: ``Array | Ext.data.Record`` An array of field
+ * configuration objects or a record object. Default has
+ * fields for owsType, owsURL, and typeName.
+ *
+ * Data reader class to create an array of
+ * layer description objects from a WMS DescribeLayer
+ * response.
+ */
+GeoExt.data.WMSDescribeLayerReader = function(meta, recordType) {
+ meta = meta || {};
+ if(!meta.format) {
+ meta.format = new OpenLayers.Format.WMSDescribeLayer();
+ }
+ if(!(typeof recordType === "function")) {
+ recordType = Ext.data.Record.create(
+ recordType || meta.fields || [
+ {name: "owsType", type: "string"},
+ {name: "owsURL", type: "string"},
+ {name: "typeName", type: "string"}
+ ]
+ );
+ }
+ GeoExt.data.WMSDescribeLayerReader.superclass.constructor.call(
+ this, meta, recordType
+ );
+};
+
+Ext.extend(GeoExt.data.WMSDescribeLayerReader, Ext.data.DataReader, {
+
+ /** private: method[read]
+ * :param request: ``Object`` The XHR object which contains the parsed XML
+ * document.
+ * :return: ``Object`` A data block which is used by an ``Ext.data.Store``
+ * as a cache of ``Ext.data.Record`` objects.
+ */
+ read: function(request) {
+ var data = request.responseXML;
+ if(!data || !data.documentElement) {
+ data = request.responseText;
+ }
+ return this.readRecords(data);
+ },
+
+ /** private: method[readRecords]
+ * :param data: ``DOMElement | Strint | Object`` A document element or XHR
+ * response string. As an alternative to fetching layer description data
+ * from a remote source, an object representing the layer descriptions can
+ * be provided given that the structure mirrors that returned from the
+ * layer description parser.
+ * :return: ``Object`` A data block which is used by an ``Ext.data.Store``
+ * as a cache of ``Ext.data.Record`` objects.
+ *
+ * Create a data block containing Ext.data.Records from an XML document.
+ */
+ readRecords: function(data) {
+
+ if(typeof data === "string" || data.nodeType) {
+ data = this.meta.format.read(data);
+ }
+ var records = [], description;
+ for(var i=0, len=data.length; i<len; i++){
+ description = data[i];
+ if(description) {
+ records.push(new this.recordType(description));
+ }
+ }
+
+ return {
+ totalRecords: records.length,
+ success: true,
+ records: records
+ };
+
+ }
+});
Added: core/trunk/geoext/lib/GeoExt/data/WMSDescribeLayerStore.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/data/WMSDescribeLayerStore.js (rev 0)
+++ core/trunk/geoext/lib/GeoExt/data/WMSDescribeLayerStore.js 2009-06-29 16:48:53 UTC (rev 1164)
@@ -0,0 +1,61 @@
+/**x
+ * Copyright (c) 2008-2009 The Open Source Geospatial Foundation
+ *
+ * Published under the BSD license.
+ * See http://svn.geoext.org/core/trunk/geoext/license.txt for the full text
+ * of the license.
+ */
+
+/**
+ * @include GeoExt/data/WMSDescribeLayerReader.js
+ */
+
+/** api: (define)
+ * module = GeoExt.data
+ * class = WMSDescribeLayerStore
+ * base_link = `Ext.data.DataStore <http://extjs.com/deploy/dev/docs/?class=Ext.data.DataStore>`_
+ */
+Ext.namespace("GeoExt.data");
+
+/** api: constructor
+ * .. class:: WMSDescribeLayerStore
+ *
+ * Small helper class to make creating stores for remote WMS layer description
+ * easier. The store is pre-configured with a built-in
+ * ``Ext.data.HttpProxy`` and :class:`GeoExt.data.WMSDescribeLayerReader`.
+ * The proxy is configured to allow caching and issues requests via GET.
+ * If you require some other proxy/reader combination then you'll have to
+ * configure this with your own proxy or create a basic
+ * store and configure as needed.
+ */
+
+/** api: config[format]
+ * ``OpenLayers.Format``
+ * A parser for transforming the XHR response into an array of objects
+ * representing attributes. Defaults to an ``OpenLayers.Format.WMSCapabilities``
+ * parser.
+ */
+
+/** api: config[fields]
+ * ``Array | Function``
+ * Either an Array of field definition objects as passed to
+ * ``Ext.data.Record.create``, or a record constructor created using
+ * ``Ext.data.Record.create``. Defaults to ``["name", "type"]``.
+ */
+
+GeoExt.data.WMSDescribeLayerStore = function(c) {
+ c = c || {};
+ GeoExt.data.WMSDescribeLayerStore.superclass.constructor.call(
+ this,
+ Ext.apply(c, {
+ proxy: c.proxy || (!c.data ?
+ new Ext.data.HttpProxy({url: c.url, disableCaching: false, method: "GET"}) :
+ undefined
+ ),
+ reader: new GeoExt.data.WMSDescribeLayerReader(
+ c, c.fields
+ )
+ })
+ );
+};
+Ext.extend(GeoExt.data.WMSDescribeLayerStore, Ext.data.Store);
Modified: core/trunk/geoext/lib/GeoExt.js
===================================================================
--- core/trunk/geoext/lib/GeoExt.js 2009-06-29 11:09:36 UTC (rev 1163)
+++ core/trunk/geoext/lib/GeoExt.js 2009-06-29 16:48:53 UTC (rev 1164)
@@ -73,6 +73,8 @@
"GeoExt/data/ScaleStore.js",
"GeoExt/data/WMSCapabilitiesReader.js",
"GeoExt/data/WMSCapabilitiesStore.js",
+ "GeoExt/data/WMSDescribeLayerReader.js",
+ "GeoExt/data/WMSDescribeLayerStore.js",
"GeoExt/widgets/Action.js",
"GeoExt/data/ProtocolProxy.js",
"GeoExt/widgets/MapPanel.js",
Added: core/trunk/geoext/tests/lib/GeoExt/data/WMSDescribeLayerReader.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/data/WMSDescribeLayerReader.html (rev 0)
+++ core/trunk/geoext/tests/lib/GeoExt/data/WMSDescribeLayerReader.html 2009-06-29 16:48:53 UTC (rev 1164)
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html debug="true">
+ <head>
+ <script type="text/javascript" src="../../../../../ext/adapter/ext/ext-base.js"></script>
+ <script type="text/javascript" src="../../../../../ext/ext-all-debug.js"></script>
+
+ <script type="text/javascript" src="../../../../../openlayers/lib/OpenLayers.js"></script>
+ <script type="text/javascript" src="../../../../lib/GeoExt.js"></script>
+ <script type="text/javascript" src="WMSDescribeLayerReader.js"></script>
+
+ <script type="text/javascript">
+
+ function test_constructor(t) {
+ t.plan(2);
+ var reader = new GeoExt.data.WMSDescribeLayerReader();
+
+ var fields = reader.recordType.prototype.fields;
+
+ // 1 test
+ t.eq(fields.items.length, 3, 'number of default items is correct');
+
+
+ var reader = new GeoExt.data.WMSDescribeLayerReader({},[
+ {name: "foo"},
+ {name: "bar"}
+ ]);
+
+ var fields = reader.recordType.prototype.fields;
+
+ //1 test
+ t.ok(fields.items[0].name == 'foo' &&
+ fields.items[1].name == 'bar',
+ 'field values set from configuration are correct');
+ }
+ function test_read(t) {
+ t.plan(4);
+
+ var reader = new GeoExt.data.WMSDescribeLayerReader();
+
+ var records = reader.read({responseXML : doc});
+
+ //1 test
+ t.eq(records.totalRecords, 2, 'readRecords returns correct number of records');
+
+ var record = records.records[0];
+
+ //3 tests -- testing the fields of a record
+ t.eq(record.get("owsType"), "WFS", "[0] correct owsType");
+ t.eq(record.get("owsURL"), "http://demo.opengeo.org/geoserver/wfs/WfsDispatcher?", "[0] correct owsURL");
+ t.eq(record.get("typeName"),"topp:states", "[0] correct typeName");
+ }
+ </script>
+ <body>
+ <div id="map"></div>
+ </body>
+</html>
Added: core/trunk/geoext/tests/lib/GeoExt/data/WMSDescribeLayerReader.js
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/data/WMSDescribeLayerReader.js (rev 0)
+++ core/trunk/geoext/tests/lib/GeoExt/data/WMSDescribeLayerReader.js 2009-06-29 16:48:53 UTC (rev 1164)
@@ -0,0 +1,11 @@
+var doc = (new OpenLayers.Format.XML).read(
+ '<?xml version="1.0" encoding="UTF-8"?>'+
+ '<!DOCTYPE WMS_DescribeLayerResponse SYSTEM "http://demo.opengeo.org/geoserver/schemas/wms/1.1.1/WMS_DescribeLayerResponse.dtd">'+
+ '<WMS_DescribeLayerResponse version="1.1.1">'+
+ '<LayerDescription name="topp:states" wfs="http://demo.opengeo.org/geoserver/wfs/WfsDispatcher?">'+
+ '<Query typeName="topp:states"/>'+
+ '</LayerDescription>'+
+ '<LayerDescription name="topp:bluemarble" wfs="http://demo.opengeo.org/geoserver/wfs/WfsDispatcher?">'+
+ '</LayerDescription>'+
+ '</WMS_DescribeLayerResponse>'
+);
Modified: core/trunk/geoext/tests/list-tests.html
===================================================================
--- core/trunk/geoext/tests/list-tests.html 2009-06-29 11:09:36 UTC (rev 1163)
+++ core/trunk/geoext/tests/list-tests.html 2009-06-29 16:48:53 UTC (rev 1164)
@@ -8,6 +8,7 @@
<li>lib/GeoExt/data/ScaleStore.html</li>
<li>lib/GeoExt/data/ProtocolProxy.html</li>
<li>lib/GeoExt/data/WMSCapabilitiesReader.html</li>
+ <li>lib/GeoExt/data/WMSDescribeLayerReader.html</li>
<li>lib/GeoExt/widgets/Action.html</li>
<li>lib/GeoExt/widgets/MapPanel.html</li>
<li>lib/GeoExt/widgets/Popup.html</li>
More information about the Commits
mailing list