summaryrefslogtreecommitdiff
path: root/js/dojo-1.7.2/dojox/store/LightstreamerStore.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/dojo-1.7.2/dojox/store/LightstreamerStore.js')
-rw-r--r--js/dojo-1.7.2/dojox/store/LightstreamerStore.js205
1 files changed, 205 insertions, 0 deletions
diff --git a/js/dojo-1.7.2/dojox/store/LightstreamerStore.js b/js/dojo-1.7.2/dojox/store/LightstreamerStore.js
new file mode 100644
index 0000000..8ad05c5
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/store/LightstreamerStore.js
@@ -0,0 +1,205 @@
+//>>built
+define("dojox/store/LightstreamerStore", [
+ "dojo/_base/lang",
+ "dojo/_base/array",
+ "dojo/_base/declare",
+ "dojo/_base/Deferred",
+ "dojo/store/util/QueryResults"
+], function(dojo){
+ dojo.getObject("store", true, dojox);
+
+ // NOTE: The usual Lightstreamer web client MUST be loaded to use this store,
+ // and will not be wrapped as an AMD module for now.
+ var nextId = 0;
+
+ function translate(id, updateInfo, schema, o){
+ // private function to convert the returned object from an update to a JSON-like object.
+ o = o || {};
+ dojo.forEach(schema, function(field){
+ o[field] = updateInfo.getNewValue(field);
+ });
+ if(!("id" in o)){ o["id"] = id; }
+ return o;
+ }
+
+/*=====
+dojox.store.LightstreamerStore.__queryOptionsArgs = function(dataAdapter, itemsRange, requestedBufferSize, requestedMaxFrequency, selector, snapshotRequired, commandLogic){
+ // dataAdapter: String?
+ // The data adapter to be used for a query.
+ // itemsRange: Array?
+ // The range of items in the form of [ start, end ] to receive back from Lightstreamer.
+ // requestedBufferSize: Number?
+ // The length of the internal queuing buffers to be used by the server.
+ // requestedMaxFrequency: Number?
+ // The maximum update frequency (updates per second) to be used by Lightstreamer.
+ // selector: String?
+ // The name of a selector, to be recognized by the Metadata Adapter in Lightstreamer.
+ // snapshotRequired: Boolean?
+ // Whether or not to request snapshot delivery.
+ // commandLogic: Array?
+ // An array of arguments in the following form: [ flag, commandPos, keyPos, underSchema, underDataAdapter ]
+
+ this.dataAdapter = dataAdapter;
+ this.itemsRange = itemsRange;
+ this.requestedBufferSize = requestedBufferSize;
+ this.requestedMaxFrequency = requestedMaxFrequency;
+ this.selector = selector;
+ this.snapshotRequired = snapshotRequired;
+ this.commandLogic = commandLogic;
+}
+=====*/
+
+ dojo.declare("dojox.store.LightstreamerStore", [], {
+ _index: {}, // a cache for data objects returned
+
+ // pushPage: (Lightstreamer)pushPage
+ // The main connection created by the typical Lightstreamer Web Client
+ pushPage: null,
+
+ // group: String[]
+ // The group of items to be returned from the Lightstreamer Server.
+ group: [],
+
+ // schema: String[]
+ // The list of fields for each item you wish to get back from Lightstreamer
+ schema: [],
+
+ constructor: function(pushPage, group, schema, dataAdapter){
+ // summary:
+ // The constructor for the LightstreamerStore.
+ // pushPage: pushPage
+ // This is the pushPage created by using the typical Lightstreamer web client
+ // dataAdapter: String
+ // This is the data adapter to connect to (defined with the Lightstreamer server)
+ // group: String[]
+ // An array of the item names you wish to get back from Lightstreamer.
+ // schema: String[]
+ // The list of fields for each item you wish to get back from Lightstreamer.
+
+ this.pushPage = pushPage;
+ this.group = group;
+ this.schema = schema;
+ this.dataAdapter = dataAdapter || "DEFAULT";
+ },
+
+ query: function(query, options){
+ // summary:
+ // Start receiving streams from the Lightstreamer server.
+ //
+ // description:
+ // The main method of the LightstreamerStore, query opens up a data stream
+ // from a Lightstreamer server (based on the pushPage definition used in the
+ // constructor) and sets up a way to observe the returned results from said
+ // stream. It is based on Lightstreamer's NonVisualTable object, and by
+ // default will run the return from the Lightstreamer server through a
+ // private "translate" function, which takes the updateInfo object normally
+ // returned by Lightstreamer's web client and converts it into a straight
+ // JSON-like object that can be used for data consumption.
+ //
+ // query: String
+ // The name of the mode to use for the resulting stream. (RAW, MERGE, COMMAND or DISTINCT)
+ //
+ // options: LightstreamerStore.__QueryOptionsArgs
+ // Additional options to consume. See http://www.lightstreamer.com/docs/client_web_jsdoc/NonVisualTable.html
+ // for more information on these properties. All properties are optional.
+ //
+ // returns: dojo.store.util.QueryResults
+ // A query results object that can be used to observe data being returned,
+ // as well as stop the stream of data. Note that this results object is
+ // customized with an "observe" method and a "close" method; observe is the
+ // main hook into the constant data stream returned by Lightstreamer, and
+ // the close method will stop the query/stream.
+ //
+ // example:
+ // Query a server:
+ // | var results = myLSStore.query("MERGE", { dataAdapter: "QUOTE_ADAPTER", snapshotRequired: true });
+ // | results.observe(function(obj){
+ // | // do something with obj
+ // | });
+
+ options = options || {};
+ var results = new dojo.Deferred(),
+ snapshotReceived,
+ resultsArray = [],
+ self = this,
+ id = "store-" + nextId++,
+ pushPage = this.pushPage,
+ table = new NonVisualTable(this.group, this.schema, query);
+
+ if(!("dataAdapter" in options) && this.dataAdapter){
+ table.setDataAdapter(this.dataAdapter);
+ }
+
+ for(var prop in options) {
+ var setter = "set" + prop.charAt(0).toUpperCase() + prop.slice(1);
+ if(setter in table && dojo.isFunction(table[setter])){
+ table[setter][(dojo.isArray(options[prop])?"apply":"call")](table, options[prop]);
+ }
+ }
+
+ table.onItemUpdate = function(id, updateInfo){
+ var obj = translate(id, updateInfo, self.schema, self._index[id]);
+ var newObject;
+ if(!self._index[id]){
+ newObject = true;
+ self._index[id] = obj;
+ if(!snapshotReceived){
+ resultsArray.push(obj);
+ }
+ }
+ table[snapshotReceived?"onPostSnapShot":"onPreSnapShot"](obj, newObject);
+ };
+
+ if(query == "MERGE" || options.snapshotRequired === false){
+ snapshotReceived = true;
+ results.resolve(resultsArray);
+ } else { // eventually properly handle other subscription modes
+ table.onEndOfSnapshot = function(){
+ snapshotReceived = true;
+ results.resolve(resultsArray);
+ };
+ }
+
+ // note that these need to be two separate function objects.
+ table.onPreSnapShot = function(){};
+ table.onPostSnapShot = function(){};
+
+ // modify the deferred
+ results = dojo.store.util.QueryResults(results);
+
+ // set up the two main ways of working with results
+ var foreachHandler;
+ results.forEach = function(callback){
+ foreachHandler = dojo.connect(table, "onPreSnapShot", callback);
+ };
+
+ var observeHandler;
+ results.observe = function(listener){
+ observeHandler = dojo.connect(table, "onPostSnapShot", function(object, newObject){
+ listener.call(results, object, newObject ? -1 : undefined);
+ });
+ };
+
+ // set up the way to stop the stream
+ results.close = function(){
+ if(foreachHandler){ dojo.disconnect(foreachHandler); }
+ if(observeHandler){ dojo.disconnect(observeHandler); }
+ pushPage.removeTable(id);
+ table = null;
+ };
+
+ // start up the stream
+ pushPage.addTable(table, id);
+ return results;
+ },
+ get: function(id){
+ // summary:
+ // Return a (cached) object from the Lightstreamer.
+ // id: String
+ // The identity of the object to retrieve.
+ return this._index[id];
+ }
+ });
+
+ return dojox.store.LightstreamerStore;
+});