|
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