/** * A base provider for communicating using JSON. This is an abstract class * and should not be instanced directly. * * @abstract */Ext.define('Ext.direct.JsonProvider', { extend: 'Ext.direct.Provider', alias: 'direct.jsonprovider', uses: [ 'Ext.direct.ExceptionEvent', 'Ext.direct.Manager' ], /** * Parse the JSON response * @private * * @param {Object} response The XHR response object * * @return {Object} The data in the response. */ parseResponse: function(response) { var text = response && response.responseText; // Empty string should blow up in JSON decoder if (text != null) { if (Ext.isObject(text) || Ext.isArray(text)) { return text; } return Ext.decode(text); } return null; }, /** * Creates a set of events based on the XHR response * * @param {Object} response The XHR response * * @return {Ext.direct.Event[]} An array of Ext.direct.Event */ createEvents: function(response) { var me = this, data = null, events = [], event, i, len; try { data = me.parseResponse(response); } catch (e) { event = new Ext.direct.ExceptionEvent({ parsingError: true, data: e, xhr: response, code: Ext.direct.Manager.exceptions.PARSE, message: 'Error parsing json response: \n\n ' + e }); return [event]; } if (Ext.isArray(data)) { for (i = 0, len = data.length; i < len; ++i) { events.push(me.createEvent(data[i])); } } else if (Ext.isObject(data)) { events.push(me.createEvent(data)); } return events; }, /** * Create an event from a response object * * @param {Object} response Response object * * @return {Ext.direct.Event} The event */ createEvent: function(response) { if (typeof response !== 'object' || !('type' in response)) { return new Ext.direct.ExceptionEvent({ data: response, code: Ext.direct.Manager.exceptions.DATA, message: 'Invalid data: event type is not specified' }); } return Ext.create('direct.' + response.type, response); }});