|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 package org.mozilla.gecko.sync.net; |
|
6 |
|
7 import java.io.UnsupportedEncodingException; |
|
8 import java.net.URI; |
|
9 import java.net.URISyntaxException; |
|
10 |
|
11 import org.json.simple.JSONArray; |
|
12 import org.json.simple.JSONObject; |
|
13 import org.mozilla.gecko.sync.CryptoRecord; |
|
14 import org.mozilla.gecko.sync.ThreadPool; |
|
15 |
|
16 /** |
|
17 * Resource class that implements expected headers and processing for Sync. |
|
18 * Accepts a simplified delegate. |
|
19 * |
|
20 * Includes: |
|
21 * * Basic Auth headers (via Resource) |
|
22 * * Error responses: |
|
23 * * 401 |
|
24 * * 503 |
|
25 * * Headers: |
|
26 * * Retry-After |
|
27 * * X-Weave-Backoff |
|
28 * * X-Backoff |
|
29 * * X-Weave-Records? |
|
30 * * ... |
|
31 * * Timeouts |
|
32 * * Network errors |
|
33 * * application/newlines |
|
34 * * JSON parsing |
|
35 * * Content-Type and Content-Length validation. |
|
36 */ |
|
37 public class SyncStorageRecordRequest extends SyncStorageRequest { |
|
38 |
|
39 public class SyncStorageRecordResourceDelegate extends SyncStorageResourceDelegate { |
|
40 SyncStorageRecordResourceDelegate(SyncStorageRequest request) { |
|
41 super(request); |
|
42 } |
|
43 } |
|
44 |
|
45 public SyncStorageRecordRequest(URI uri) { |
|
46 super(uri); |
|
47 } |
|
48 |
|
49 public SyncStorageRecordRequest(String url) throws URISyntaxException { |
|
50 this(new URI(url)); |
|
51 } |
|
52 |
|
53 @Override |
|
54 protected BaseResourceDelegate makeResourceDelegate(SyncStorageRequest request) { |
|
55 return new SyncStorageRecordResourceDelegate(request); |
|
56 } |
|
57 |
|
58 @SuppressWarnings("unchecked") |
|
59 public void post(JSONObject body) { |
|
60 // Let's do this the trivial way for now. |
|
61 // Note that POSTs should be an array, so we wrap here. |
|
62 final JSONArray toPOST = new JSONArray(); |
|
63 toPOST.add(body); |
|
64 try { |
|
65 this.resource.post(toPOST); |
|
66 } catch (UnsupportedEncodingException e) { |
|
67 this.delegate.handleRequestError(e); |
|
68 } |
|
69 } |
|
70 |
|
71 public void post(JSONArray body) { |
|
72 // Let's do this the trivial way for now. |
|
73 try { |
|
74 this.resource.post(body); |
|
75 } catch (UnsupportedEncodingException e) { |
|
76 this.delegate.handleRequestError(e); |
|
77 } |
|
78 } |
|
79 |
|
80 public void put(JSONObject body) { |
|
81 // Let's do this the trivial way for now. |
|
82 try { |
|
83 this.resource.put(body); |
|
84 } catch (UnsupportedEncodingException e) { |
|
85 this.delegate.handleRequestError(e); |
|
86 } |
|
87 } |
|
88 |
|
89 public void post(CryptoRecord record) { |
|
90 this.post(record.toJSONObject()); |
|
91 } |
|
92 |
|
93 public void put(CryptoRecord record) { |
|
94 this.put(record.toJSONObject()); |
|
95 } |
|
96 |
|
97 public void deferGet() { |
|
98 final SyncStorageRecordRequest self = this; |
|
99 ThreadPool.run(new Runnable() { |
|
100 @Override |
|
101 public void run() { |
|
102 self.get(); |
|
103 }}); |
|
104 } |
|
105 |
|
106 public void deferPut(final JSONObject body) { |
|
107 final SyncStorageRecordRequest self = this; |
|
108 ThreadPool.run(new Runnable() { |
|
109 @Override |
|
110 public void run() { |
|
111 self.put(body); |
|
112 }}); |
|
113 } |
|
114 } |