27
27
package com .salesforce .androidsdk .mobilesync .target ;
28
28
29
29
import com .salesforce .androidsdk .mobilesync .manager .SyncManager ;
30
+ import com .salesforce .androidsdk .mobilesync .target .CompositeRequestHelper .RecordRequest ;
31
+ import com .salesforce .androidsdk .mobilesync .target .CompositeRequestHelper .RecordResponse ;
30
32
import com .salesforce .androidsdk .mobilesync .util .Constants ;
31
33
import com .salesforce .androidsdk .mobilesync .util .SyncState ;
32
- import com .salesforce .androidsdk .rest .CompositeResponse .CompositeSubResponse ;
33
- import com .salesforce .androidsdk .rest .RestRequest ;
34
- import com .salesforce .androidsdk .rest .RestResponse ;
35
34
import com .salesforce .androidsdk .smartstore .store .SmartStore ;
36
35
import com .salesforce .androidsdk .util .JSONObjectHelper ;
37
36
import java .io .IOException ;
38
- import java .net .HttpURLConnection ;
39
- import java .util .LinkedHashMap ;
37
+ import java .util .LinkedList ;
40
38
import java .util .List ;
41
39
import java .util .Map ;
42
40
import org .json .JSONException ;
@@ -131,7 +129,7 @@ private void syncUpRecords(SyncManager syncManager, List<JSONObject> records, Li
131
129
return ;
132
130
}
133
131
134
- LinkedHashMap < String , RestRequest > refIdToRequests = new LinkedHashMap <>();
132
+ List < RecordRequest > recordRequests = new LinkedList <>();
135
133
for (int i = 0 ; i < records .size (); i ++) {
136
134
JSONObject record = records .get (i );
137
135
String id = JSONObjectHelper .optString (record , getIdFieldName ());
@@ -142,15 +140,18 @@ private void syncUpRecords(SyncManager syncManager, List<JSONObject> records, Li
142
140
record .put (getIdFieldName (), id );
143
141
}
144
142
145
- RestRequest request = buildRequestForRecord (syncManager .apiVersion , record , fieldlist );
146
- if (request != null ) refIdToRequests .put (id , request );
143
+ RecordRequest request = buildRequestForRecord (record , fieldlist );
144
+ if (request != null ) {
145
+ request .referenceId = id ;
146
+ recordRequests .add (request );
147
+ }
147
148
}
148
149
149
- // Sending composite request
150
- Map <String , CompositeSubResponse > refIdToResponses = CompositeRequestHelper . sendCompositeRequest (syncManager , false , refIdToRequests );
150
+ // Sending requests
151
+ Map <String , RecordResponse > refIdToRecordResponses = sendRecordRequests (syncManager , recordRequests );
151
152
152
- // Build refId to server id / status code / time stamp maps
153
- Map <String , String > refIdToServerId = CompositeRequestHelper .parseIdsFromResponses (refIdToResponses . values () );
153
+ // Build refId to server id map
154
+ Map <String , String > refIdToServerId = CompositeRequestHelper .parseIdsFromResponses (refIdToRecordResponses );
154
155
155
156
// Will a re-run be required?
156
157
boolean needReRun = false ;
@@ -161,7 +162,7 @@ private void syncUpRecords(SyncManager syncManager, List<JSONObject> records, Li
161
162
String id = record .getString (getIdFieldName ());
162
163
163
164
if (isDirty (record )) {
164
- needReRun = needReRun || updateRecordInLocalStore (syncManager , syncSoupName , record , mergeMode , refIdToServerId , refIdToResponses .get (id ), isReRun );
165
+ needReRun = needReRun || updateRecordInLocalStore (syncManager , syncSoupName , record , mergeMode , refIdToServerId , refIdToRecordResponses .get (id ), isReRun );
165
166
}
166
167
}
167
168
@@ -172,9 +173,13 @@ private void syncUpRecords(SyncManager syncManager, List<JSONObject> records, Li
172
173
173
174
}
174
175
175
- protected RestRequest buildRequestForRecord (String apiVersion ,
176
- JSONObject record ,
177
- List <String > fieldlist ) throws JSONException {
176
+ protected Map <String , RecordResponse > sendRecordRequests (SyncManager syncManager , List <RecordRequest > recordRequests )
177
+ throws JSONException , IOException {
178
+ return CompositeRequestHelper .sendAsCompositeBatchRequest (syncManager , false , recordRequests );
179
+ }
180
+
181
+ protected RecordRequest buildRequestForRecord (JSONObject record ,
182
+ List <String > fieldlist ) throws JSONException {
178
183
179
184
if (!isDirty (record )) {
180
185
return null ; // nothing to do
@@ -191,7 +196,7 @@ protected RestRequest buildRequestForRecord(String apiVersion,
191
196
return null ; // no need to go to server
192
197
}
193
198
else {
194
- return RestRequest . getRequestForDelete ( apiVersion , objectType , id );
199
+ return RecordRequest . requestForDelete ( objectType , id );
195
200
}
196
201
}
197
202
// Create/update cases
@@ -208,53 +213,52 @@ protected RestRequest buildRequestForRecord(String apiVersion,
208
213
// where the the external id field is the id field
209
214
// and the field is populated by a local id
210
215
&& !isLocalId (externalId )) {
211
- return RestRequest . getRequestForUpsert ( apiVersion , objectType , getExternalIdFieldName (), externalId , fields );
216
+ return RecordRequest . requestForUpsert ( objectType , getExternalIdFieldName (), externalId , fields );
212
217
}
213
218
// Do a create otherwise
214
219
else {
215
- return RestRequest . getRequestForCreate ( apiVersion , objectType , fields );
220
+ return RecordRequest . requestForCreate ( objectType , fields );
216
221
}
217
222
}
218
223
else {
219
224
fieldlist = this .updateFieldlist != null ? this .updateFieldlist : fieldlist ;
220
225
fields = buildFieldsMap (record , fieldlist , getIdFieldName (), getModificationDateFieldName ());
221
- return RestRequest . getRequestForUpdate ( apiVersion , objectType , id , fields );
226
+ return RecordRequest . requestForUpdate ( objectType , id , fields );
222
227
}
223
228
}
224
229
}
225
230
226
231
227
- protected boolean updateRecordInLocalStore (SyncManager syncManager , String soupName , JSONObject record , SyncState .MergeMode mergeMode , Map <String , String > refIdToServerId , CompositeSubResponse response , boolean isReRun ) throws JSONException , IOException {
232
+ protected boolean updateRecordInLocalStore (SyncManager syncManager , String soupName , JSONObject record , SyncState .MergeMode mergeMode , Map <String , String > refIdToServerId , RecordResponse response , boolean isReRun ) throws JSONException , IOException {
228
233
229
234
boolean needReRun = false ;
230
- final Integer statusCode = response != null ? response .httpStatusCode : - 1 ;
235
+ String lastError = ( response != null && response . errorJson != null ) ? response .errorJson . toString () : null ;
231
236
232
237
// Delete case
233
238
if (isLocallyDeleted (record )) {
234
239
if (isLocallyCreated (record ) // we didn't go to the sever
235
- || RestResponse .isSuccess (statusCode ) // or we successfully deleted on the server
236
- || statusCode == HttpURLConnection .HTTP_NOT_FOUND ) // or the record was already deleted on the server
237
-
240
+ || response .success // or we successfully deleted on the server
241
+ || response .recordDoesNotExist ) // or the record was already deleted on the server
238
242
{
239
243
deleteFromLocalStore (syncManager , soupName , record );
240
244
}
241
245
// Failure
242
246
else {
243
- saveRecordToLocalStoreWithError (syncManager , soupName , record , response != null ? response . toString () : null );
247
+ saveRecordToLocalStoreWithError (syncManager , soupName , record , lastError );
244
248
}
245
249
}
246
250
// Create / update case
247
251
else {
248
252
// Success case
249
- if (RestResponse . isSuccess ( statusCode ) ) {
253
+ if (response . success ) {
250
254
// Plugging server id in id field
251
255
CompositeRequestHelper .updateReferences (record , getIdFieldName (), refIdToServerId );
252
256
253
257
// Clean and save
254
258
cleanAndSaveInLocalStore (syncManager , soupName , record );
255
259
}
256
260
// Handling remotely deleted records
257
- else if (statusCode == HttpURLConnection . HTTP_NOT_FOUND
261
+ else if (response . recordDoesNotExist
258
262
&& mergeMode == SyncState .MergeMode .OVERWRITE // Record needs to be recreated
259
263
&& !isReRun ) {
260
264
record .put (LOCAL , true );
@@ -263,10 +267,9 @@ else if (statusCode == HttpURLConnection.HTTP_NOT_FOUND
263
267
}
264
268
// Failure
265
269
else {
266
- saveRecordToLocalStoreWithError (syncManager , soupName , record , response != null ? response . toString () : null );
270
+ saveRecordToLocalStoreWithError (syncManager , soupName , record , lastError );
267
271
}
268
272
}
269
273
return needReRun ;
270
274
}
271
-
272
275
}
0 commit comments