[Commits] r260 - in core/trunk: lib lib/GeoExt/data tests tests/data
commits at geoext.org
commits at geoext.org
Tue Mar 24 09:17:27 CET 2009
Author: elemoine
Date: 2009-03-24 09:17:27 +0100 (Tue, 24 Mar 2009)
New Revision: 260
Added:
core/trunk/lib/GeoExt/data/LayerReader.js
core/trunk/tests/data/LayerReader.html
Modified:
core/trunk/lib/GeoExt.js
core/trunk/lib/GeoExt/data/LayerRecord.js
core/trunk/lib/GeoExt/data/LayerStore.js
core/trunk/tests/data/LayerRecord.html
core/trunk/tests/data/LayerStore.html
core/trunk/tests/list-tests.html
Log:
add LayerReader, r=ahocevar (closes #25, #27)
Added: core/trunk/lib/GeoExt/data/LayerReader.js
===================================================================
--- core/trunk/lib/GeoExt/data/LayerReader.js (rev 0)
+++ core/trunk/lib/GeoExt/data/LayerReader.js 2009-03-24 08:17:27 UTC (rev 260)
@@ -0,0 +1,88 @@
+/* Copyright (C) 2008-2009 The Open Source Geospatial Foundation
+ * Published under the BSD license.
+ * See http://geoext.org/svn/geoext/core/trunk/license.txt for the full text
+ * of the license.
+ *
+ * ¹ pending approval */
+
+Ext.namespace("GeoExt", "GeoExt.data");
+
+/**
+ * Class: GeoExt.data.LayerReader
+ * LayerReader is a specific Ext.data.DataReader for converting
+ * layers into layer records, i.e. {OpenLayers.Layer} objects
+ * into {GeoExt.data.LayerRecor} objects.
+ *
+ * Usage example:
+ * (start code)
+ * var reader = new GeoExt.data.LayerReader();
+ * var layerData = reader.readRecords(map.layers);
+ * var numRecords = layerData.totalRecords;
+ * var layerRecords = layerData.records;
+ * (end)
+ *
+ * Inherits from:
+ * - {Ext.data.DataReader}
+ */
+
+/**
+ * Constructor: GeoExt.data.LayerReader
+ * Create a layer reader. The arguments passed are similar to those
+ * passed to {Ext.data.DataReader} constructor.
+ */
+GeoExt.data.LayerReader = function(meta, recordType) {
+ meta = meta || {};
+ if(!(recordType instanceof Function)) {
+ recordType = GeoExt.data.LayerRecord.create(
+ recordType || meta.fields || {});
+ }
+ GeoExt.data.LayerReader.superclass.constructor.call(
+ this, meta, recordType);
+};
+
+Ext.extend(GeoExt.data.LayerReader, Ext.data.DataReader, {
+
+ /**
+ * APIProperty: totalRecords
+ * {Integer}
+ */
+ totalRecords: null,
+
+ /**
+ * APIMethod: readRecords
+ * From an array of {OpenLayers.Layer} objects create a data block
+ * containing {<GeoExt.data.LayerRecord>} objects.
+ *
+ * Parameters:
+ * layers - {Array({OpenLayers.Layer})} Array of layers.
+ *
+ * Returns:
+ * {Object} An object with two properties. The value of the property "records"
+ * is the array of layer records. The value of the property "totalRecords"
+ * is the number of records in the array.
+ */
+ readRecords : function(layers) {
+ var records = [];
+ if(layers) {
+ var recordType = this.recordType, fields = recordType.prototype.fields;
+ var i, lenI, j, lenJ, layer, values, field, v;
+ for(i = 0, lenI = layers.length; i < lenI; i++) {
+ layer = layers[i];
+ values = {};
+ for(j = 0, lenJ = fields.length; j < lenJ; j++){
+ field = fields.items[j];
+ v = layer[field.mapping || field.name] ||
+ field.defaultValue;
+ v = field.convert(v);
+ values[field.name] = v;
+ }
+ values.layer = layer;
+ records[records.length] = new recordType(values, layer.id);
+ }
+ }
+ return {
+ records: records,
+ totalRecords: this.totalRecords != null ? this.totalRecords : records.length
+ };
+ }
+});
Modified: core/trunk/lib/GeoExt/data/LayerRecord.js
===================================================================
--- core/trunk/lib/GeoExt/data/LayerRecord.js 2009-03-24 05:48:28 UTC (rev 259)
+++ core/trunk/lib/GeoExt/data/LayerRecord.js 2009-03-24 08:17:27 UTC (rev 260)
@@ -1,9 +1,9 @@
-/* Copyright (C) 2008-2009 The Open Source Geospatial Foundation ¹
+/* Copyright (C) 2008-2009 The Open Source Geospatial Foundation
* Published under the BSD license.
* See http://geoext.org/svn/geoext/core/trunk/license.txt for the full text
* of the license.
*
- * ¹ pending approval */
+ * pending approval */
Ext.namespace("GeoExt.data");
@@ -17,26 +17,10 @@
* Inherits from
* - {Ext.data.Record}
*/
-GeoExt.data.LayerRecord = Ext.extend(Ext.data.Record, {
-
- /**
- * Constructor: GeoExt.data.LayerRecord
- * This constructor should not be used directly. Instead, the create method of
- * this class should be used to create a constructor. The parameters are the
- * same.
- *
- * Parameters:
- * layer - {OpenLayers.Layer}
- * data - {Object} additional values, keyed by field name
- */
- constructor: function(layer, data) {
- this.data = Ext.applyIf({
- title: layer.name,
- layer: layer
- }, data);
- this.id = layer.id;
- }
-});
+GeoExt.data.LayerRecord = Ext.data.Record.create([
+ {name: "layer"},
+ {name: "title", type: "string", mapping: "name"}
+]);
/**
* APIFunction: GeoExt.data.LayerRecord.create
@@ -44,26 +28,20 @@
* fields.
*
* Parameters:
- * fieldDefinition - {Array} Field definition as in {Ext.data.Record.create}.
- * Can be omitted if no additional fields are required (records will
- * always have a {OpenLayers.Layer} layer and a {String} title field).
+ * o - {Array} Field definition as in {Ext.data.Record.create}. Can be omitted
+ * if no additional fields are required (records will always have a
+ * {OpenLayers.Layer} layer and a {String} title field).
+ *
+ * Returns:
+ * {Function} A specialized {<GeoExt.data.LayerRecord>} constructor.
*/
-GeoExt.data.LayerRecord.create = function(fieldDefinition) {
- var o = [
- {name: "layer"},
- {name: "title"}
- ].concat(fieldDefinition);
-
+GeoExt.data.LayerRecord.create = function(o) {
var f = Ext.extend(GeoExt.data.LayerRecord, {});
var p = f.prototype;
- p.fields = new Ext.util.MixedCollection(false, function(field){
- return field.name;
- });
- for(var i = 0, len = o.length; i < len; i++){
- p.fields.add(new Ext.data.Field(o[i]));
+ if(o) {
+ for(var i = 0, len = o.length; i < len; i++){
+ p.fields.add(new Ext.data.Field(o[i]));
+ }
}
- f.getField = function(name){
- return p.fields.get(name);
- };
return f;
}
Modified: core/trunk/lib/GeoExt/data/LayerStore.js
===================================================================
--- core/trunk/lib/GeoExt/data/LayerStore.js 2009-03-24 05:48:28 UTC (rev 259)
+++ core/trunk/lib/GeoExt/data/LayerStore.js 2009-03-24 08:17:27 UTC (rev 260)
@@ -37,13 +37,14 @@
* {OpenLayers.Map} Map that this store will be in sync with.
*/
map: null,
-
+
/**
- * APIProperty: recordType
- * {<GeoExt.data.LayerRecord>} type of the layer records used by this
- * store.
+ * Property: reader
+ * {<GeoExt.data.LayerReader>} The reader used to get
+ * <GeoExt.data.LayerRecord> objects from {OpenLayers.Layer}
+ * objects.
*/
- recordType: null,
+ reader: null,
/**
* Constructor: GeoExt.LayerStore
@@ -63,7 +64,7 @@
constructor: function(config) {
arguments.callee.superclass.constructor.apply(this, arguments);
config = config || {};
- this.recordType = config.recordType || GeoExt.data.LayerRecord.create();
+ this.reader = new GeoExt.data.LayerReader({}, config.recordType);
var map = config.map instanceof GeoExt.MapPanel ?
config.map.map : config.map;
if(map) {
@@ -73,7 +74,7 @@
// walk through the layers snapshot and add layers to the store
for(var i=0; i<layers.length; ++i) {
layer = layers[i];
- this.add(new this.recordType(layer));
+ this.add((this.reader.readRecords([layer])).records);
}
this.setMap(map);
@@ -111,7 +112,7 @@
onAddLayer: function(evt) {
var layer = evt.layer;
this._adding = true;
- this.add(new this.recordType(layer));
+ this.add((this.reader.readRecords([layer])).records);
delete this._adding;
},
Modified: core/trunk/lib/GeoExt.js
===================================================================
--- core/trunk/lib/GeoExt.js 2009-03-24 05:48:28 UTC (rev 259)
+++ core/trunk/lib/GeoExt.js 2009-03-24 08:17:27 UTC (rev 260)
@@ -60,8 +60,9 @@
var jsfiles = new Array(
"GeoExt/data/FeatureReader.js",
"GeoExt/data/FeatureStoreMediator.js",
+ "GeoExt/data/LayerRecord.js",
+ "GeoExt/data/LayerReader.js",
"GeoExt/data/LayerStore.js",
- "GeoExt/data/LayerRecord.js",
"GeoExt/data/LayerStoreMediator.js",
"GeoExt/data/ProtocolProxy.js",
"GeoExt/widgets/MapPanel.js"
@@ -90,4 +91,4 @@
document.write(allScriptTags.join(""));
}
}
-})();
\ No newline at end of file
+})();
Added: core/trunk/tests/data/LayerReader.html
===================================================================
--- core/trunk/tests/data/LayerReader.html (rev 0)
+++ core/trunk/tests/data/LayerReader.html 2009-03-24 08:17:27 UTC (rev 260)
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html debug="true">
+ <head>
+ <script type="text/javascript" src="../../../../openlayers/lib/OpenLayers.js"></script>
+ <script type="text/javascript" src="../../../../ext/2.2.1/adapter/ext/ext-base.js"></script>
+ <script type="text/javascript" src="../../../../ext/2.2.1/ext-all-debug.js"></script>
+ <script type="text/javascript" src="../../lib/GeoExt.js"></script>
+
+ <script type="text/javascript">
+ function test_constructor(t) {
+ t.plan(4);
+
+ var reader, recordType;
+
+ reader = new GeoExt.data.LayerReader();
+ var record = new reader.recordType();
+ t.ok(record instanceof GeoExt.data.LayerRecord,
+ "ctor creates a LayerRecord type if none is provided");
+
+ recordType = [{name: "extra"}];
+ reader = new GeoExt.data.LayerReader(null, recordType);
+ t.eq(reader.recordType.prototype.fields.items[2].name, "extra",
+ "ctor creates a LayerRecord type with the correct field");
+
+ recordType = GeoExt.data.LayerRecord.create([{name: "extra"}]);
+ reader = new GeoExt.data.LayerReader(null, recordType);
+ t.ok(reader.recordType == recordType,
+ "ctor configures reader with passed LayerRecord type");
+
+ reader = new GeoExt.data.LayerReader({fields: [{name: "extra"}]});
+ t.eq(reader.recordType.prototype.fields.items[2].name, "extra",
+ "ctor creates a LayerRecord type with the correct field");
+ }
+
+ function test_readRecords(t) {
+ t.plan(5);
+
+ var reader, layers, data;
+
+ reader = new GeoExt.data.LayerReader(null, [{name: "extra"}]);
+ layers = [
+ new OpenLayers.Layer("layer1"),
+ new OpenLayers.Layer("layer2")
+ ];
+ layers[0].extra = "layer1extra";
+ layers[1].extra = "layer2extra";
+
+ data = reader.readRecords(layers);
+ t.eq(data.totalRecords, 2,
+ "readRecords returns expected number of records");
+ t.ok(data.records[0] instanceof GeoExt.data.LayerRecord,
+ "readRecords returns records of expected type");
+ t.ok(data.records[0].get("layer") == layers[0],
+ "readRecords returns records with expected \"layer\" field");
+ t.eq(data.records[0].get("title"), layers[0].name,
+ "readRecords returns records with expected \"title\" field");
+ t.eq(data.records[0].get("extra"), layers[0].extra,
+ "readRecords returns records with expected \"extra\" field");
+ }
+ </script>
+ <body>
+ </body>
+</html>
Modified: core/trunk/tests/data/LayerRecord.html
===================================================================
--- core/trunk/tests/data/LayerRecord.html 2009-03-24 05:48:28 UTC (rev 259)
+++ core/trunk/tests/data/LayerRecord.html 2009-03-24 08:17:27 UTC (rev 260)
@@ -9,18 +9,36 @@
<script type="text/javascript">
function test_layerrecord(t) {
- t.plan(4);
+ t.plan(12);
+
+ var c, layer, record;
- var c = GeoExt.data.LayerRecord.create();
-
- var layer = new OpenLayers.Layer();
- var record = new c(layer);
+ c = GeoExt.data.LayerRecord.create();
+ t.ok(c instanceof Function, "create returns a func");
+ t.eq(c.prototype.fields.items[0].name, "layer",
+ "\"create\" returns a func with a \"layer\" field in its prototype");
+ t.eq(c.prototype.fields.items[1].name, "title",
+ "\"create\" returns a func with a \"title\" field in its prototype");
- t.ok(record instanceof GeoExt.data.LayerRecord, "create returns a constructor");
- t.eq(record.get("layer").id, layer.id, "Layer stored correctly");
- t.eq(record.id, layer.id, "ID set correctly");
-
- var record = new c(layer, {"foo": "bar"});
+ c = GeoExt.data.LayerRecord.create([
+ {name: "extra1"}, {name: "extra2"}
+ ]);
+ t.eq(c.prototype.fields.items[0].name, "layer",
+ "\"create(o)\" returns a func with a \"layer\" field in its prototype");
+ t.eq(c.prototype.fields.items[1].name, "title",
+ "\"create(o)\" returns a func with a \"title\" field in its prototype");
+ t.eq(c.prototype.fields.items[2].name, "extra1",
+ "\"create(o)\" returns a func with a \"extra1\" field in its prototype");
+ t.eq(c.prototype.fields.items[3].name, "extra2",
+ "\"create(o)\" returns a func with a \"extra2\" field in its prototype");
+
+ layer = new OpenLayers.Layer();
+ record = new c({layer: layer, title: layer.name}, layer.id);
+ t.ok(record instanceof GeoExt.data.LayerRecord, "create returns a constructor (LayerRecord)");
+ t.ok(record instanceof c, "create returns a constructor (c)");
+ t.eq(record.get("layer").id, layer.id, "layer stored correctly");
+ t.eq(record.id, layer.id, "id set correctly");
+ record = new c({layer: layer, title: layer.name, foo: "bar"}, layer.id);
t.eq(record.get("foo"), "bar", "foo data row set correctly");
}
</script>
Modified: core/trunk/tests/data/LayerStore.html
===================================================================
--- core/trunk/tests/data/LayerStore.html 2009-03-24 05:48:28 UTC (rev 259)
+++ core/trunk/tests/data/LayerStore.html 2009-03-24 08:17:27 UTC (rev 260)
@@ -16,7 +16,7 @@
function loadMapPanel() {
var map = createMap();
- mapPanel = new GeoExt.MapPanel({
+ var mapPanel = new GeoExt.MapPanel({
// panel options
id: "map-panel",
title: "GeoExt MapPanel",
@@ -41,20 +41,17 @@
var layer = new OpenLayers.Layer.Vector("Foo Layer");
map.addLayer(layer);
+ t.eq(map.layers.length, 1, "Adding layer to map does not create duplicate layers on map");
+ t.eq(mapPanel.layers.getCount(), 1, "Adding layer to map does not create duplicate records in LayerStore");
- t.eq(map.layers.length,1,"Adding layer to map does not create duplicate layers on map");
- t.eq(mapPanel.layers.getCount(),1,"Adding layer to map does not create duplicate records in LayerStore");
-
mapPanel.layers.remove(mapPanel.layers.getById(layer.id));
-
t.eq(map.layers.length,0,"removeLayer on MapPanel's LayerStore removes layer from map");
t.eq(mapPanel.layers.getCount(),0,"removeLayer on MapPanel's LayerStore removes layer from map");
- mapPanel.layers.add(new GeoExt.data.LayerRecord(layer));
+ var reader = new GeoExt.data.LayerReader();
+ mapPanel.layers.add((reader.readRecords([layer])).records);
t.eq(map.layers.length,1,"Adding layer to MapPanel's LayerStore adds only one layer to map");
t.eq(mapPanel.layers.getCount(),1,"Adding layers to MapPanel's LayerStore does not create duplicate layers");
-
-
}
</script>
<body>
Modified: core/trunk/tests/list-tests.html
===================================================================
--- core/trunk/tests/list-tests.html 2009-03-24 05:48:28 UTC (rev 259)
+++ core/trunk/tests/list-tests.html 2009-03-24 08:17:27 UTC (rev 260)
@@ -2,6 +2,7 @@
<li>data/FeatureReader.html</li>
<li>data/FeatureStoreMediator.html</li>
<li>data/LayerRecord.html</li>
+ <li>data/LayerReader.html</li>
<li>data/LayerStore.html</li>
<li>data/LayerStoreMediator.html</li>
<li>data/ProtocolProxy.html</li>
More information about the Commits
mailing list