base_records/collection.js

159 lines, 79 LOC, 76 covered (96%)

11 1
/* ***** BEGIN LICENSE BLOCK *****
2
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3
 *
4
 * The contents of this file are subject to the Mozilla Public License Version
5
 * 1.1 (the "License"); you may not use this file except in compliance with
6
 * the License. You may obtain a copy of the License at
7
 * http://www.mozilla.org/MPL/
8
 *
9
 * Software distributed under the License is distributed on an "AS IS" basis,
10
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11
 * for the specific language governing rights and limitations under the
12
 * License.
13
 *
14
 * The Original Code is Weave.
15
 *
16
 * The Initial Developer of the Original Code is Mozilla.
17
 * Portions created by the Initial Developer are Copyright (C) 2008
18
 * the Initial Developer. All Rights Reserved.
19
 *
20
 * Contributor(s):
21
 *  Dan Mills <thunder@mozilla.com>
22
 *
23
 * Alternatively, the contents of this file may be used under the terms of
24
 * either the GNU General Public License Version 2 or later (the "GPL"), or
25
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26
 * in which case the provisions of the GPL or the LGPL are applicable instead
27
 * of those above. If you wish to allow use of your version of this file only
28
 * under the terms of either the GPL or the LGPL, and not to allow others to
29
 * use your version of this file under the terms of the MPL, indicate your
30
 * decision by deleting the provisions above and replace them with the notice
31
 * and other provisions required by the GPL or the LGPL. If you do not delete
32
 * the provisions above, a recipient may use your version of this file under
33
 * the terms of any one of the MPL, the GPL or the LGPL.
34
 *
35
 * ***** END LICENSE BLOCK ***** */
36
77 37
const EXPORTED_SYMBOLS = ['Collection'];
38
44 39
const Cc = Components.classes;
44 40
const Ci = Components.interfaces;
44 41
const Cr = Components.results;
44 42
const Cu = Components.utils;
43
55 44
Cu.import("resource://weave/util.js");
55 45
Cu.import("resource://weave/resource.js");
46
78 47
function Collection(uri, recordObj) {
336 48
  Resource.call(this, uri);
168 49
  this._recordObj = recordObj;
50
168 51
  this._full = false;
168 52
  this._ids = null;
168 53
  this._limit = 0;
168 54
  this._older = 0;
168 55
  this._newer = 0;
224 56
  this._data = [];
57
}
22 58
Collection.prototype = {
33 59
  __proto__: Resource.prototype,
22 60
  _logName: "Collection",
61
232 62
  _rebuildURL: function Coll__rebuildURL() {
63
    // XXX should consider what happens if it's not a URL...
1470 64
    this.uri.QueryInterface(Ci.nsIURL);
65
420 66
    let args = [];
420 67
    if (this.older)
68
      args.push('older=' + this.older);
420 69
    else if (this.newer) {
847 70
      args.push('newer=' + this.newer);
71
    }
420 72
    if (this.full)
780 73
      args.push('full=1');
420 74
    if (this.sort)
903 75
      args.push('sort=' + this.sort);
630 76
    if (this.ids != null)
329 77
      args.push("ids=" + this.ids);
1106 78
    if (this.limit > 0 && this.limit != Infinity)
175 79
      args.push("limit=" + this.limit);
80
2910 81
    this.uri.query = (args.length > 0)? '?' + args.join('&') : '';
82
  },
83
84
  // get full items
652 85
  get full() { return this._full; },
50 86
  set full(value) {
84 87
    this._full = value;
140 88
    this._rebuildURL();
89
  },
90
91
  // Apply the action to a certain set of ids
793 92
  get ids() this._ids,
69 93
  set ids(value) {
141 94
    this._ids = value;
235 95
    this._rebuildURL();
96
  },
97
98
  // Limit how many records to get
895 99
  get limit() this._limit,
74 100
  set limit(value) {
156 101
    this._limit = value;
260 102
    this._rebuildURL();
103
  },
104
105
  // get only items modified before some date
652 106
  get older() { return this._older; },
22 107
  set older(value) {
108
    this._older = value;
109
    this._rebuildURL();
110
  },
111
112
  // get only items modified since some date
1015 113
  get newer() { return this._newer; },
76 114
  set newer(value) {
162 115
    this._newer = value;
270 116
    this._rebuildURL();
117
  },
118
119
  // get items sorted by some criteria. valid values:
120
  // oldest (oldest first)
121
  // newest (newest first)
122
  // index
1039 123
  get sort() { return this._sort; },
51 124
  set sort(value) {
87 125
    this._sort = value;
145 126
    this._rebuildURL();
127
  },
128
2368 129
  pushData: function Coll_pushData(data) {
16422 130
    this._data.push(data);
131
  },
132
47 133
  clearRecords: function Coll_clearRecords() {
100 134
    this._data = [];
135
  },
136
91 137
  set recordHandler(onRecord) {
138
    // Save this because onProgress is called with this as the ChannelListener
72 139
    let coll = this;
140
141
    // Switch to newline separated records for incremental parsing
216 142
    coll.setHeader("Accept", "application/newlines");
143
199 144
    this._onProgress = function() {
182 145
      let newline;
13409 146
      while ((newline = this._data.indexOf("\n")) > 0) {
147
        // Split the json record from the rest of the data
8813 148
        let json = this._data.slice(0, newline);
11331 149
        this._data = this._data.slice(newline + 1);
150
151
        // Deserialize a record from json and give it to the callback
5036 152
        let record = new coll._recordObj();
6295 153
        record.deserialize(json);
5036 154
        record.baseUri = coll.uri;
6295 155
        onRecord(record);
91 156
      }
36 157
    };
158
  }
11 159
};