- // TODO: implement readResponse for XmlReader
- readResponse : Ext.emptyFn
-});/**\r
- * @class Ext.data.XmlStore\r
- * @extends Ext.data.Store\r
- * <p>Small helper class to make creating {@link Ext.data.Store}s from XML data easier.\r
- * A XmlStore will be automatically configured with a {@link Ext.data.XmlReader}.</p>\r
- * <p>A store configuration would be something like:<pre><code>\r
-var store = new Ext.data.XmlStore({\r
- // store configs\r
- autoDestroy: true,\r
- storeId: 'myStore',\r
- url: 'sheldon.xml', // automatically configures a HttpProxy\r
- // reader configs\r
- record: 'Item', // records will have an "Item" tag\r
- idPath: 'ASIN',\r
- totalRecords: '@TotalResults'\r
- fields: [\r
- // set up the fields mapping into the xml doc\r
- // The first needs mapping, the others are very basic\r
- {name: 'Author', mapping: 'ItemAttributes > Author'},\r
- 'Title', 'Manufacturer', 'ProductGroup'\r
- ]\r
-});\r
- * </code></pre></p>\r
- * <p>This store is configured to consume a returned object of the form:<pre><code>\r
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2009-05-15">\r
- <Items>\r
- <Request>\r
- <IsValid>True</IsValid>\r
- <ItemSearchRequest>\r
- <Author>Sidney Sheldon</Author>\r
- <SearchIndex>Books</SearchIndex>\r
- </ItemSearchRequest>\r
- </Request>\r
- <TotalResults>203</TotalResults>\r
- <TotalPages>21</TotalPages>\r
- <Item>\r
- <ASIN>0446355453</ASIN>\r
- <DetailPageURL>\r
- http://www.amazon.com/\r
- </DetailPageURL>\r
- <ItemAttributes>\r
- <Author>Sidney Sheldon</Author>\r
- <Manufacturer>Warner Books</Manufacturer>\r
- <ProductGroup>Book</ProductGroup>\r
- <Title>Master of the Game</Title>\r
- </ItemAttributes>\r
- </Item>\r
- </Items>\r
-</ItemSearchResponse>\r
- * </code></pre>\r
- * An object literal of this form could also be used as the {@link #data} config option.</p>\r
- * <p><b>Note:</b> Although not listed here, this class accepts all of the configuration options of \r
- * <b>{@link Ext.data.XmlReader XmlReader}</b>.</p>\r
- * @constructor\r
- * @param {Object} config\r
- * @xtype xmlstore\r
- */\r
-Ext.data.XmlStore = Ext.extend(Ext.data.Store, {\r
- /**\r
- * @cfg {Ext.data.DataReader} reader @hide\r
- */\r
- constructor: function(config){\r
- Ext.data.XmlStore.superclass.constructor.call(this, Ext.apply(config, {\r
- reader: new Ext.data.XmlReader(config)\r
- }));\r
- }\r
-});\r
+ /**
+ * Decode an XML response from server.
+ * @param {String} action [{@link Ext.data.Api#actions} create|read|update|destroy]
+ * @param {Object} response HTTP Response object from browser.
+ * @return {Ext.data.Response} An instance of {@link Ext.data.Response}
+ */
+ readResponse : function(action, response) {
+ var q = Ext.DomQuery,
+ doc = response.responseXML,
+ root = doc.documentElement || doc;
+
+ // create general Response instance.
+ var res = new Ext.data.Response({
+ action: action,
+ success : this.getSuccess(root),
+ message: this.getMessage(root),
+ data: this.extractData(q.select(this.meta.record, root) || q.select(this.meta.root, root), false),
+ raw: doc
+ });
+
+ if (Ext.isEmpty(res.success)) {
+ throw new Ext.data.DataReader.Error('successProperty-response', this.meta.successProperty);
+ }
+
+ // Create actions from a response having status 200 must return pk
+ if (action === Ext.data.Api.actions.create) {
+ var def = Ext.isDefined(res.data);
+ if (def && Ext.isEmpty(res.data)) {
+ throw new Ext.data.JsonReader.Error('root-empty', this.meta.root);
+ }
+ else if (!def) {
+ throw new Ext.data.JsonReader.Error('root-undefined-response', this.meta.root);
+ }
+ }
+ return res;
+ },
+
+ getSuccess : function() {
+ return true;
+ },
+
+ /**
+ * build response-data extractor functions.
+ * @private
+ * @ignore
+ */
+ buildExtractors : function() {
+ if(this.ef){
+ return;
+ }
+ var s = this.meta,
+ Record = this.recordType,
+ f = Record.prototype.fields,
+ fi = f.items,
+ fl = f.length;
+
+ if(s.totalProperty) {
+ this.getTotal = this.createAccessor(s.totalProperty);
+ }
+ if(s.successProperty) {
+ this.getSuccess = this.createAccessor(s.successProperty);
+ }
+ if (s.messageProperty) {
+ this.getMessage = this.createAccessor(s.messageProperty);
+ }
+ this.getRoot = function(res) {
+ return (!Ext.isEmpty(res[this.meta.record])) ? res[this.meta.record] : res[this.meta.root];
+ };
+ if (s.idPath || s.idProperty) {
+ var g = this.createAccessor(s.idPath || s.idProperty);
+ this.getId = function(rec) {
+ var id = g(rec) || rec.id;
+ return (id === undefined || id === '') ? null : id;
+ };
+ } else {
+ this.getId = function(){return null;};
+ }
+ var ef = [];
+ for(var i = 0; i < fl; i++){
+ f = fi[i];
+ var map = (f.mapping !== undefined && f.mapping !== null) ? f.mapping : f.name;
+ ef.push(this.createAccessor(map));
+ }
+ this.ef = ef;
+ },
+
+ /**
+ * Creates a function to return some particular key of data from a response.
+ * @param {String} key
+ * @return {Function}
+ * @private
+ * @ignore
+ */
+ createAccessor : function(){
+ var q = Ext.DomQuery;
+ return function(key) {
+ if (Ext.isFunction(key)) {
+ return key;
+ }
+ switch(key) {
+ case this.meta.totalProperty:
+ return function(root, def){
+ return q.selectNumber(key, root, def);
+ };
+ break;
+ case this.meta.successProperty:
+ return function(root, def) {
+ var sv = q.selectValue(key, root, true);
+ var success = sv !== false && sv !== 'false';
+ return success;
+ };
+ break;
+ default:
+ return function(root, def) {
+ return q.selectValue(key, root, def);
+ };
+ break;
+ }
+ };
+ }(),
+
+ /**
+ * extracts values and type-casts a row of data from server, extracted by #extractData
+ * @param {Hash} data
+ * @param {Ext.data.Field[]} items
+ * @param {Number} len
+ * @private
+ * @ignore
+ */
+ extractValues : function(data, items, len) {
+ var f, values = {};
+ for(var j = 0; j < len; j++){
+ f = items[j];
+ var v = this.ef[j](data);
+ values[f.name] = f.convert((v !== undefined) ? v : f.defaultValue, data);
+ }
+ return values;
+ }
+});/**
+ * @class Ext.data.XmlStore
+ * @extends Ext.data.Store
+ * <p>Small helper class to make creating {@link Ext.data.Store}s from XML data easier.
+ * A XmlStore will be automatically configured with a {@link Ext.data.XmlReader}.</p>
+ * <p>A store configuration would be something like:<pre><code>
+var store = new Ext.data.XmlStore({
+ // store configs
+ autoDestroy: true,
+ storeId: 'myStore',
+ url: 'sheldon.xml', // automatically configures a HttpProxy
+ // reader configs
+ record: 'Item', // records will have an "Item" tag
+ idPath: 'ASIN',
+ totalRecords: '@TotalResults'
+ fields: [
+ // set up the fields mapping into the xml doc
+ // The first needs mapping, the others are very basic
+ {name: 'Author', mapping: 'ItemAttributes > Author'},
+ 'Title', 'Manufacturer', 'ProductGroup'
+ ]
+});
+ * </code></pre></p>
+ * <p>This store is configured to consume a returned object of the form:<pre><code>
+<?xml version="1.0" encoding="UTF-8"?>
+<ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2009-05-15">
+ <Items>
+ <Request>
+ <IsValid>True</IsValid>
+ <ItemSearchRequest>
+ <Author>Sidney Sheldon</Author>
+ <SearchIndex>Books</SearchIndex>
+ </ItemSearchRequest>
+ </Request>
+ <TotalResults>203</TotalResults>
+ <TotalPages>21</TotalPages>
+ <Item>
+ <ASIN>0446355453</ASIN>
+ <DetailPageURL>
+ http://www.amazon.com/
+ </DetailPageURL>
+ <ItemAttributes>
+ <Author>Sidney Sheldon</Author>
+ <Manufacturer>Warner Books</Manufacturer>
+ <ProductGroup>Book</ProductGroup>
+ <Title>Master of the Game</Title>
+ </ItemAttributes>
+ </Item>
+ </Items>
+</ItemSearchResponse>
+ * </code></pre>
+ * An object literal of this form could also be used as the {@link #data} config option.</p>
+ * <p><b>Note:</b> Although not listed here, this class accepts all of the configuration options of
+ * <b>{@link Ext.data.XmlReader XmlReader}</b>.</p>
+ * @constructor
+ * @param {Object} config
+ * @xtype xmlstore
+ */
+Ext.data.XmlStore = Ext.extend(Ext.data.Store, {
+ /**
+ * @cfg {Ext.data.DataReader} reader @hide
+ */
+ constructor: function(config){
+ Ext.data.XmlStore.superclass.constructor.call(this, Ext.apply(config, {
+ reader: new Ext.data.XmlReader(config)
+ }));
+ }
+});