@Override public void run() { // TODO: ensure atomicity of below actions using TransactionController mUserActionCacher.cacheUserAction(createRequestUserAction); mRequestsCacher.updateOrInsertAndNotify(newRequest); } });
@Provides RequestsCacher requestsCacher(ContentResolver contentResolver, EventBus eventBus, Logger logger) { return new RequestsCacher(contentResolver, eventBus, logger); }
public void updateOrInsertAndNotify(RequestEntity request) { updateOrInsert(request); notifyRequestsChanged(); }
private void processResponse(@Nullable List<RequestScheme> requests) { mLogger.d(TAG, "processResponse() called"); mTransactionsController.beginTransaction(); try { if (requests == null || requests.isEmpty()) { mLogger.d(TAG, "empty request list - deleting all requests from local cache"); mRequestsCacher.deleteAllRequests(); } else { List<String> processedRequestIds = updateOrInsertRequestSchemes(requests); // currently we assume that the requests not returned by the server can be deleted // TODO: review this assumption mRequestsCacher.deleteAllRequestsWithNonMatchingIds(processedRequestIds); } mTransactionsController.setTransactionSuccessful(); } finally { mTransactionsController.endTransaction(); } notifyRequestsChanged(); }
public void updateWithPossibleIdChange(RequestEntity request, String currentRequestId) { mLogger.d(TAG, "updateWithPossibleIdChange() called; current request ID: " + request.getId()); // TODO: make operations atomic ContentValues cv = requestEntityToContentValues(request); int updateCount = mContentResolver.update( Requests.CONTENT_URI, cv, Requests.COL_REQUEST_ID + " = ?", new String[] {currentRequestId} ); if (updateCount <= 0) { throw new RuntimeException("no entries updateWithPossibleIdChange"); } }
/** * @return list containing IDs of all processed requests */ private List<String> updateOrInsertRequestSchemes(List<RequestScheme> requestSchemes) { mLogger.d(TAG, "updateOrInsertRequestSchemes() called"); List<String> processedRequestIds = new ArrayList<>(requestSchemes.size()); for (RequestScheme requestScheme : requestSchemes) { RequestEntity request = convertSchemeToRequest(requestScheme); request = addReverseGeocodedLocation(request); mRequestsCacher.updateOrInsert(request); processedRequestIds.add(request.getId()); } return processedRequestIds; }
RequestEntity updatedRequest = convertSchemeToRequest(response.body().getRequestScheme()); mRequestsCacher.updateWithPossibleIdChange(updatedRequest, requestId);
public void updateOrInsert(RequestEntity request) { mLogger.d(TAG, "updateOrInsert() called; request ID: " + request.getId()); // TODO: make operations atomic ContentValues cv = requestEntityToContentValues(request); int updateCount = mContentResolver.update( Requests.CONTENT_URI, cv, Requests.COL_REQUEST_ID + " = ?", new String[] {request.getId()} ); if (updateCount <= 0) { mContentResolver.insert( Requests.CONTENT_URI, cv ); mLogger.v(TAG, "new request inserted"); } else { mLogger.v(TAG, "request updated"); } }
@Test public void addNewRequest_requestCached() { // Arrange RequestEntity newRequest = RequestEntityProvider.getNewRequestEntity(); // Act SUT.addNewRequest(newRequest); // Assert mThreadPostersTestDouble.join(); verify(mRequestsCacherMock).updateOrInsertAndNotify(mRequestsCaptor.capture()); RequestEntity cachedRequest = mRequestsCaptor.getValue(); assertRequestsEqual(cachedRequest, newRequest); }