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 | }; |