|
81 | 81 | Object apply(Object oldValue, String key);
|
82 | 82 | }
|
83 | 83 |
|
84 |
| -final class ParseFieldOperations { |
85 |
| - private ParseFieldOperations() { |
86 |
| - } |
87 |
| - |
88 |
| - /** |
89 |
| - * A function that creates a ParseFieldOperation from a JSONObject or a Parcel. |
90 |
| - */ |
91 |
| - private interface ParseFieldOperationFactory { |
92 |
| - ParseFieldOperation decode(JSONObject object, ParseDecoder decoder) throws JSONException; |
93 |
| - ParseFieldOperation decode(Parcel source, ParseParcelDecoder decoder); |
94 |
| - } |
95 |
| - |
96 |
| - // A map of all known decoders. |
97 |
| - private static Map<String, ParseFieldOperationFactory> opDecoderMap = new HashMap<>(); |
98 |
| - |
99 |
| - /** |
100 |
| - * Registers a single factory for a given __op field value. |
101 |
| - */ |
102 |
| - private static void registerDecoder(String opName, ParseFieldOperationFactory factory) { |
103 |
| - opDecoderMap.put(opName, factory); |
104 |
| - } |
105 |
| - |
106 |
| - /** |
107 |
| - * Registers a list of default decoder functions that convert a JSONObject with an __op field, |
108 |
| - * or a Parcel with a op name string, into a ParseFieldOperation. |
109 |
| - */ |
110 |
| - static void registerDefaultDecoders() { |
111 |
| - registerDecoder(ParseRelationOperation.OP_NAME_BATCH, new ParseFieldOperationFactory() { |
112 |
| - @Override |
113 |
| - public ParseFieldOperation decode(JSONObject object, ParseDecoder decoder) |
114 |
| - throws JSONException { |
115 |
| - ParseFieldOperation op = null; |
116 |
| - JSONArray ops = object.getJSONArray("ops"); |
117 |
| - for (int i = 0; i < ops.length(); ++i) { |
118 |
| - ParseFieldOperation nextOp = ParseFieldOperations.decode(ops.getJSONObject(i), decoder); |
119 |
| - op = nextOp.mergeWithPrevious(op); |
120 |
| - } |
121 |
| - return op; |
122 |
| - } |
123 |
| - |
124 |
| - @Override |
125 |
| - public ParseFieldOperation decode(Parcel source, ParseParcelDecoder decoder) { |
126 |
| - // Decode AddRelation and then RemoveRelation |
127 |
| - ParseFieldOperation add = ParseFieldOperations.decode(source, decoder); |
128 |
| - ParseFieldOperation remove = ParseFieldOperations.decode(source, decoder); |
129 |
| - return remove.mergeWithPrevious(add); |
130 |
| - } |
131 |
| - }); |
132 |
| - |
133 |
| - registerDecoder(ParseDeleteOperation.OP_NAME, new ParseFieldOperationFactory() { |
134 |
| - @Override |
135 |
| - public ParseFieldOperation decode(JSONObject object, ParseDecoder decoder) |
136 |
| - throws JSONException { |
137 |
| - return ParseDeleteOperation.getInstance(); |
138 |
| - } |
139 |
| - |
140 |
| - @Override |
141 |
| - public ParseFieldOperation decode(Parcel source, ParseParcelDecoder decoder) { |
142 |
| - return ParseDeleteOperation.getInstance(); |
143 |
| - } |
144 |
| - }); |
145 |
| - |
146 |
| - registerDecoder(ParseIncrementOperation.OP_NAME, new ParseFieldOperationFactory() { |
147 |
| - @Override |
148 |
| - public ParseFieldOperation decode(JSONObject object, ParseDecoder decoder) |
149 |
| - throws JSONException { |
150 |
| - return new ParseIncrementOperation((Number) decoder.decode(object.opt("amount"))); |
151 |
| - } |
152 |
| - |
153 |
| - @Override |
154 |
| - public ParseFieldOperation decode(Parcel source, ParseParcelDecoder decoder) { |
155 |
| - return new ParseIncrementOperation((Number) decoder.decode(source)); |
156 |
| - } |
157 |
| - }); |
158 |
| - |
159 |
| - registerDecoder(ParseAddOperation.OP_NAME, new ParseFieldOperationFactory() { |
160 |
| - @Override |
161 |
| - public ParseFieldOperation decode(JSONObject object, ParseDecoder decoder) |
162 |
| - throws JSONException { |
163 |
| - return new ParseAddOperation((Collection) decoder.decode(object.opt("objects"))); |
164 |
| - } |
165 |
| - |
166 |
| - @Override |
167 |
| - public ParseFieldOperation decode(Parcel source, ParseParcelDecoder decoder) { |
168 |
| - int size = source.readInt(); |
169 |
| - List<Object> list = new ArrayList<>(size); |
170 |
| - for (int i = 0; i < size; i++) { |
171 |
| - list.set(i, decoder.decode(source)); |
172 |
| - } |
173 |
| - return new ParseAddOperation(list); |
174 |
| - } |
175 |
| - }); |
176 |
| - |
177 |
| - registerDecoder(ParseAddUniqueOperation.OP_NAME, new ParseFieldOperationFactory() { |
178 |
| - @Override |
179 |
| - public ParseFieldOperation decode(JSONObject object, ParseDecoder decoder) |
180 |
| - throws JSONException { |
181 |
| - return new ParseAddUniqueOperation((Collection) decoder.decode(object.opt("objects"))); |
182 |
| - } |
183 |
| - |
184 |
| - @Override |
185 |
| - public ParseFieldOperation decode(Parcel source, ParseParcelDecoder decoder) { |
186 |
| - int size = source.readInt(); |
187 |
| - List<Object> list = new ArrayList<>(size); |
188 |
| - for (int i = 0; i < size; i++) { |
189 |
| - list.set(i, decoder.decode(source)); |
190 |
| - } |
191 |
| - return new ParseAddUniqueOperation(list); |
192 |
| - } |
193 |
| - }); |
194 |
| - |
195 |
| - registerDecoder(ParseRemoveOperation.OP_NAME, new ParseFieldOperationFactory() { |
196 |
| - @Override |
197 |
| - public ParseFieldOperation decode(JSONObject object, ParseDecoder decoder) |
198 |
| - throws JSONException { |
199 |
| - return new ParseRemoveOperation((Collection) decoder.decode(object.opt("objects"))); |
200 |
| - } |
201 |
| - |
202 |
| - @Override |
203 |
| - public ParseFieldOperation decode(Parcel source, ParseParcelDecoder decoder) { |
204 |
| - int size = source.readInt(); |
205 |
| - List<Object> list = new ArrayList<>(size); |
206 |
| - for (int i = 0; i < size; i++) { |
207 |
| - list.set(i, decoder.decode(source)); |
208 |
| - } |
209 |
| - return new ParseRemoveOperation(list); |
210 |
| - } |
211 |
| - }); |
212 |
| - |
213 |
| - registerDecoder(ParseRelationOperation.OP_NAME_ADD, new ParseFieldOperationFactory() { |
214 |
| - @Override |
215 |
| - public ParseFieldOperation decode(JSONObject object, ParseDecoder decoder) |
216 |
| - throws JSONException { |
217 |
| - JSONArray objectsArray = object.optJSONArray("objects"); |
218 |
| - List<ParseObject> objectsList = (List<ParseObject>) decoder.decode(objectsArray); |
219 |
| - return new ParseRelationOperation<>(new HashSet<>(objectsList), null); |
220 |
| - } |
221 |
| - |
222 |
| - @Override |
223 |
| - public ParseFieldOperation decode(Parcel source, ParseParcelDecoder decoder) { |
224 |
| - int size = source.readInt(); |
225 |
| - Set<ParseObject> set = new HashSet<>(size); |
226 |
| - for (int i = 0; i < size; i++) { |
227 |
| - set.add((ParseObject) decoder.decode(source)); |
228 |
| - } |
229 |
| - return new ParseRelationOperation<>(set, null); |
230 |
| - } |
231 |
| - }); |
232 |
| - |
233 |
| - registerDecoder(ParseRelationOperation.OP_NAME_REMOVE, new ParseFieldOperationFactory() { |
234 |
| - @Override |
235 |
| - public ParseFieldOperation decode(JSONObject object, ParseDecoder decoder) |
236 |
| - throws JSONException { |
237 |
| - JSONArray objectsArray = object.optJSONArray("objects"); |
238 |
| - List<ParseObject> objectsList = (List<ParseObject>) decoder.decode(objectsArray); |
239 |
| - return new ParseRelationOperation<>(null, new HashSet<>(objectsList)); |
240 |
| - } |
241 |
| - |
242 |
| - @Override |
243 |
| - public ParseFieldOperation decode(Parcel source, ParseParcelDecoder decoder) { |
244 |
| - int size = source.readInt(); |
245 |
| - Set<ParseObject> set = new HashSet<>(size); |
246 |
| - for (int i = 0; i < size; i++) { |
247 |
| - set.add((ParseObject) decoder.decode(source)); |
248 |
| - } |
249 |
| - return new ParseRelationOperation<>(null, set); |
250 |
| - } |
251 |
| - }); |
252 |
| - |
253 |
| - registerDecoder(ParseSetOperation.OP_NAME, new ParseFieldOperationFactory() { |
254 |
| - @Override |
255 |
| - public ParseFieldOperation decode(JSONObject object, ParseDecoder decoder) throws JSONException { |
256 |
| - return null; // Not called. |
257 |
| - } |
258 |
| - |
259 |
| - @Override |
260 |
| - public ParseFieldOperation decode(Parcel source, ParseParcelDecoder decoder) { |
261 |
| - return new ParseSetOperation(decoder.decode(source)); |
262 |
| - } |
263 |
| - }); |
264 |
| - } |
265 |
| - |
266 |
| - /** |
267 |
| - * Converts a parsed JSON object into a ParseFieldOperation. |
268 |
| - * |
269 |
| - * @param encoded |
270 |
| - * A JSONObject containing an __op field. |
271 |
| - * @return A ParseFieldOperation. |
272 |
| - */ |
273 |
| - static ParseFieldOperation decode(JSONObject encoded, ParseDecoder decoder) throws JSONException { |
274 |
| - String op = encoded.optString("__op"); |
275 |
| - ParseFieldOperationFactory factory = opDecoderMap.get(op); |
276 |
| - if (factory == null) { |
277 |
| - throw new RuntimeException("Unable to decode operation of type " + op); |
278 |
| - } |
279 |
| - return factory.decode(encoded, decoder); |
280 |
| - } |
281 |
| - |
282 |
| - /** |
283 |
| - * Reads a ParseFieldOperation out of the given Parcel. |
284 |
| - * |
285 |
| - * @param source |
286 |
| - * The source Parcel. |
287 |
| - * @param decoder |
288 |
| - * The given ParseParcelableDecoder. |
289 |
| - * |
290 |
| - * @return A ParseFieldOperation. |
291 |
| - */ |
292 |
| - static ParseFieldOperation decode(Parcel source, ParseParcelDecoder decoder) { |
293 |
| - String op = source.readString(); |
294 |
| - ParseFieldOperationFactory factory = opDecoderMap.get(op); |
295 |
| - if (factory == null) { |
296 |
| - throw new RuntimeException("Unable to decode operation of type " + op); |
297 |
| - } |
298 |
| - return factory.decode(source, decoder); |
299 |
| - } |
300 |
| - |
301 |
| - /** |
302 |
| - * Converts a JSONArray into an ArrayList. |
303 |
| - */ |
304 |
| - static ArrayList<Object> jsonArrayAsArrayList(JSONArray array) { |
305 |
| - ArrayList<Object> result = new ArrayList<>(array.length()); |
306 |
| - for (int i = 0; i < array.length(); ++i) { |
307 |
| - try { |
308 |
| - result.add(array.get(i)); |
309 |
| - } catch (JSONException e) { |
310 |
| - // This can't actually happen. |
311 |
| - throw new RuntimeException(e); |
312 |
| - } |
313 |
| - } |
314 |
| - return result; |
315 |
| - } |
316 |
| -} |
0 commit comments