[Commits] r264 - in sandbox/opengeo/geoexplorer: lib lib/GeoExt/data tests tests/data

commits at geoext.org commits at geoext.org
Tue Mar 24 21:42:54 CET 2009


Author: tschaub
Date: 2009-03-24 21:42:54 +0100 (Tue, 24 Mar 2009)
New Revision: 264

Added:
   sandbox/opengeo/geoexplorer/lib/GeoExt/data/LayerReader.js
   sandbox/opengeo/geoexplorer/tests/data/LayerReader.html
Modified:
   sandbox/opengeo/geoexplorer/lib/GeoExt.js
   sandbox/opengeo/geoexplorer/lib/GeoExt/data/LayerRecord.js
   sandbox/opengeo/geoexplorer/lib/GeoExt/data/LayerStore.js
   sandbox/opengeo/geoexplorer/tests/data/LayerRecord.html
   sandbox/opengeo/geoexplorer/tests/data/LayerStore.html
   sandbox/opengeo/geoexplorer/tests/list-tests.html
Log:
merge r246:HEAD from trunk

Copied: sandbox/opengeo/geoexplorer/lib/GeoExt/data/LayerReader.js (from rev 263, core/trunk/lib/GeoExt/data/LayerReader.js)
===================================================================
--- sandbox/opengeo/geoexplorer/lib/GeoExt/data/LayerReader.js	                        (rev 0)
+++ sandbox/opengeo/geoexplorer/lib/GeoExt/data/LayerReader.js	2009-03-24 20:42:54 UTC (rev 264)
@@ -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: sandbox/opengeo/geoexplorer/lib/GeoExt/data/LayerRecord.js
===================================================================
--- sandbox/opengeo/geoexplorer/lib/GeoExt/data/LayerRecord.js	2009-03-24 14:54:34 UTC (rev 263)
+++ sandbox/opengeo/geoexplorer/lib/GeoExt/data/LayerRecord.js	2009-03-24 20:42:54 UTC (rev 264)
@@ -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: sandbox/opengeo/geoexplorer/lib/GeoExt/data/LayerStore.js
===================================================================
--- sandbox/opengeo/geoexplorer/lib/GeoExt/data/LayerStore.js	2009-03-24 14:54:34 UTC (rev 263)
+++ sandbox/opengeo/geoexplorer/lib/GeoExt/data/LayerStore.js	2009-03-24 20:42:54 UTC (rev 264)
@@ -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: sandbox/opengeo/geoexplorer/lib/GeoExt.js
===================================================================
--- sandbox/opengeo/geoexplorer/lib/GeoExt.js	2009-03-24 14:54:34 UTC (rev 263)
+++ sandbox/opengeo/geoexplorer/lib/GeoExt.js	2009-03-24 20:42:54 UTC (rev 264)
@@ -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/data/WMSCapabilitiesReader.js",
@@ -96,4 +97,4 @@
             document.write(allScriptTags.join(""));
         }
     }
-})();
\ No newline at end of file
+})();

Copied: sandbox/opengeo/geoexplorer/tests/data/LayerReader.html (from rev 263, core/trunk/tests/data/LayerReader.html)
===================================================================
--- sandbox/opengeo/geoexplorer/tests/data/LayerReader.html	                        (rev 0)
+++ sandbox/opengeo/geoexplorer/tests/data/LayerReader.html	2009-03-24 20:42:54 UTC (rev 264)
@@ -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: sandbox/opengeo/geoexplorer/tests/data/LayerRecord.html
===================================================================
--- sandbox/opengeo/geoexplorer/tests/data/LayerRecord.html	2009-03-24 14:54:34 UTC (rev 263)
+++ sandbox/opengeo/geoexplorer/tests/data/LayerRecord.html	2009-03-24 20:42:54 UTC (rev 264)
@@ -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: sandbox/opengeo/geoexplorer/tests/data/LayerStore.html
===================================================================
--- sandbox/opengeo/geoexplorer/tests/data/LayerStore.html	2009-03-24 14:54:34 UTC (rev 263)
+++ sandbox/opengeo/geoexplorer/tests/data/LayerStore.html	2009-03-24 20:42:54 UTC (rev 264)
@@ -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: sandbox/opengeo/geoexplorer/tests/list-tests.html
===================================================================
--- sandbox/opengeo/geoexplorer/tests/list-tests.html	2009-03-24 14:54:34 UTC (rev 263)
+++ sandbox/opengeo/geoexplorer/tests/list-tests.html	2009-03-24 20:42:54 UTC (rev 264)
@@ -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