From 53e80a0a3f6372e6fce77743225de574d3faa21b Mon Sep 17 00:00:00 2001 From: Zeyad-37 Date: Mon, 19 Nov 2018 11:32:50 +0200 Subject: [PATCH] fixed delete use case, query returns a list of results --- .../com/zeyad/usecases/api/DataService.kt | 4 +- .../com/zeyad/usecases/api/IDataService.kt | 2 +- .../java/com/zeyad/usecases/db/BaseDao.kt | 2 +- .../com/zeyad/usecases/db/DataBaseManager.kt | 8 +- .../com/zeyad/usecases/db/RealmManager.java | 328 ------------------ .../java/com/zeyad/usecases/db/RoomManager.kt | 19 +- .../com/zeyad/usecases/stores/CloudStore.kt | 41 +-- .../com/zeyad/usecases/stores/DataStore.kt | 18 +- .../com/zeyad/usecases/stores/DiskStore.kt | 44 +-- .../com/zeyad/usecases/api/DataServiceTest.kt | 10 +- .../com/zeyad/usecases/db/RoomManagerTest.kt | 6 +- .../zeyad/usecases/stores/DiskStoreTest.kt | 2 +- 12 files changed, 80 insertions(+), 404 deletions(-) delete mode 100644 usecases/src/main/java/com/zeyad/usecases/db/RealmManager.java diff --git a/usecases/src/main/java/com/zeyad/usecases/api/DataService.kt b/usecases/src/main/java/com/zeyad/usecases/api/DataService.kt index 6006c76..3d86caa 100644 --- a/usecases/src/main/java/com/zeyad/usecases/api/DataService.kt +++ b/usecases/src/main/java/com/zeyad/usecases/api/DataService.kt @@ -184,8 +184,8 @@ internal class DataService(private val mDataStoreFactory: DataStoreFactory, } } - override fun queryDisk(query: String, clazz: Class): Single { - val result: Single = try { + override fun queryDisk(query: String, clazz: Class): Single> { + val result: Single> = try { mDataStoreFactory.disk(Any::class.java).queryDisk(query, clazz) .compose(ReplayingShare.instance()).singleOrError() } catch (e: IllegalAccessException) { diff --git a/usecases/src/main/java/com/zeyad/usecases/api/IDataService.kt b/usecases/src/main/java/com/zeyad/usecases/api/IDataService.kt index 21998e5..b46f7b4 100644 --- a/usecases/src/main/java/com/zeyad/usecases/api/IDataService.kt +++ b/usecases/src/main/java/com/zeyad/usecases/api/IDataService.kt @@ -95,7 +95,7 @@ interface IDataService { * @param realmQueryProvider query tp select list of item(s). * @return */ - fun queryDisk(query: String, clazz: Class): Single + fun queryDisk(query: String, clazz: Class): Single> /** * Creates a repository pattern with live objects diff --git a/usecases/src/main/java/com/zeyad/usecases/db/BaseDao.kt b/usecases/src/main/java/com/zeyad/usecases/db/BaseDao.kt index 40e018e..ae044d9 100644 --- a/usecases/src/main/java/com/zeyad/usecases/db/BaseDao.kt +++ b/usecases/src/main/java/com/zeyad/usecases/db/BaseDao.kt @@ -13,7 +13,7 @@ interface BaseDao { fun getAllItems(query: SupportSQLiteQuery): Single> @RawQuery - fun getQuery(query: SupportSQLiteQuery): Single + fun getQuery(query: SupportSQLiteQuery): Single> @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertItemsReplace(vararg objects: E): List diff --git a/usecases/src/main/java/com/zeyad/usecases/db/DataBaseManager.kt b/usecases/src/main/java/com/zeyad/usecases/db/DataBaseManager.kt index 1f07be5..8e3d867 100644 --- a/usecases/src/main/java/com/zeyad/usecases/db/DataBaseManager.kt +++ b/usecases/src/main/java/com/zeyad/usecases/db/DataBaseManager.kt @@ -32,7 +32,7 @@ interface DataBaseManager { * * @param query The query used to look for inside the DB. */ - fun getQuery(query: String, clazz: Class): Flowable + fun getQuery(query: String, clazz: Class): Flowable> /** * Puts and element into the DB. @@ -70,7 +70,7 @@ interface DataBaseManager { * * @param clazz Class type of the items to be deleted. */ - fun evictAll(clazz: Class): Single + fun evictAll(clazz: Class): Single /** * Evict a collection elements of the DB. @@ -78,7 +78,7 @@ interface DataBaseManager { * @param list List to be deleted. * @param clazz Class type of the items to be deleted. */ - fun evictCollection(list: List, clazz: Class): Single + fun evictCollection(list: List, clazz: Class): Single /** * Evict a collection elements of the DB. @@ -86,7 +86,7 @@ interface DataBaseManager { * @param list List of ids to be deleted. * @param clazz Class type of the items to be deleted. */ - fun evictCollectionById(list: List, clazz: Class, idFieldName: String): Single + fun evictCollectionById(list: List, clazz: Class, idFieldName: String): Single /** * Evict element by id of the DB. diff --git a/usecases/src/main/java/com/zeyad/usecases/db/RealmManager.java b/usecases/src/main/java/com/zeyad/usecases/db/RealmManager.java deleted file mode 100644 index 114c57f..0000000 --- a/usecases/src/main/java/com/zeyad/usecases/db/RealmManager.java +++ /dev/null @@ -1,328 +0,0 @@ -//package com.zeyad.usecases.db; -// -//import android.support.annotation.NonNull; -//import android.support.annotation.Nullable; -//import android.util.Log; -// -//import org.json.JSONArray; -//import org.json.JSONException; -//import org.json.JSONObject; -// -//import java.util.List; -// -//import io.reactivex.BackpressureStrategy; -//import io.reactivex.Flowable; -//import io.reactivex.Observable; -//import io.reactivex.Single; -//import io.reactivex.disposables.Disposables; -//import io.realm.Realm; -//import io.realm.RealmChangeListener; -//import io.realm.RealmConfiguration; -//import io.realm.RealmModel; -//import io.realm.RealmObject; -//import io.realm.RealmResults; -// -///** -// * {@link DataBaseManager} implementation. -// */ -//public class RealmManager implements DataBaseManager { -// -// private static final String NO_ID = "Could not find id!"; -// -// /** -// * Gets an {@link Flowable} which will emit an Object -// * -// * @param idColumnName name of ID variable -// * @param itemId ID value -// * @param itemIdType type of the ID -// * @param dataClass type of the data requested -// * @param type of the data requested -// * @return a {@link Flowable} containing an object of type M. -// */ -// @NonNull -// @Override -// public Flowable getById(@NonNull final String idColumnName, final Object itemId, -// final Class itemIdType, Class dataClass) { -// return Flowable.defer(() -> { -// Realm realm = Realm.getDefaultInstance(); -// return getItemById(realm, dataClass, idColumnName, itemId, itemIdType) -// .map(realmModel -> (M) realm.copyFromRealm(realmModel)); -// }); -// } -// -// /** -// * Gets an {@link Flowable} which will emit a List of Objects. -// * -// * @param clazz Class type of the items to get. -// */ -// @NonNull -// @Override -// public Flowable> getAll(Class clazz) { -// return Flowable.defer(() -> { -// Realm realm = Realm.getDefaultInstance(); -// return realm.where(clazz).findAll().asFlowable() -// .filter(o -> ((RealmResults) o).isLoaded()) -// .map(o -> realm.copyFromRealm((RealmResults) o)) -// .flatMap(o -> ((List) o).isEmpty() ? -// Flowable.error(new IllegalAccessException(String -// .format("%s(s) were not found!", clazz.getSimpleName()))) -// : Flowable.just(o)); -// }); -// } -// -// /** -// * Takes a query to be executed and return a list of containing the result. -// * -// * @param queryFactory The query used to look for inside the DB. -// * @param the return type from the query -// * @return {@link List} a result list that matches the given query. -// */ -// @NonNull -// @Override -// public Flowable> getQuery(@NonNull RealmQueryProvider queryFactory) { -// return Flowable.defer(() -> { -// Realm realm = Realm.getDefaultInstance(); -// return queryFactory.create(realm).findAll().asFlowable() -// .filter(RealmResults::isLoaded) -// .map(realm::copyFromRealm); -// }); -// } -// -// /** -// * Puts and element into the DB. -// * -// * @param realmModel Element to insert in the DB. -// * @param dataClass Class type of the items to be put. -// */ -// @NonNull -// @Override -// // TODO: 6/13/17 Remove ? remove : create flow -// public Single put(@NonNull M realmModel, @NonNull Class dataClass) { -// return Single.fromCallable(() -> -// RealmObject.isValid(executeWriteOperationInRealm(Realm.getDefaultInstance(), -// (ExecuteAndReturn) realm -> realm.copyToRealmOrUpdate(realmModel)))); -// } -// -// -// /** -// * Puts and element into the DB. -// * -// * @param jsonObject Element to insert in the DB. -// * @param dataClass Class type of the items to be put. -// */ -// @NonNull -// @Override -// public Single put(@Nullable JSONObject jsonObject, @Nullable String idColumnName, -// Class itemIdType, @NonNull Class dataClass) { -// return Single.fromCallable(() -> { -// if (jsonObject == null) { -// throw new IllegalArgumentException("JSONObject is invalid"); -// } else { -// final JSONObject updatedJSON = -// updateJsonObjectWithIdValue(jsonObject, idColumnName, itemIdType, dataClass); -// return RealmObject.isValid(executeWriteOperationInRealm(Realm.getDefaultInstance(), -// (ExecuteAndReturn) realm -> -// realm.createOrUpdateObjectFromJson(dataClass, updatedJSON))); -// } -// }); -// } -// -// @NonNull -// @Override -// public Single putAll(List realmObjects, Class dataClass) { -// return Single.fromCallable(() -> executeWriteOperationInRealm(Realm.getDefaultInstance(), -// (ExecuteAndReturn>) realm -> -// realm.copyToRealmOrUpdate(realmObjects)).size() == realmObjects.size()); -// } -// -// /** -// * Puts and element into the DB. -// * -// * @param jsonArray Element to insert in the DB. -// * @param idColumnName Name of the id field. -// * @param dataClass Class type of the items to be put. -// */ -// @NonNull -// @Override -// public Single putAll(@NonNull JSONArray jsonArray, String idColumnName, Class itemIdType, -// @NonNull Class dataClass) { -// return Single.fromCallable(() -> { -// final JSONArray updatedJSONArray = -// updateJsonArrayWithIdValue(jsonArray, idColumnName, itemIdType, dataClass); -// executeWriteOperationInRealm(Realm.getDefaultInstance(), (Execute) realm -> -// realm.createOrUpdateAllFromJson(dataClass, updatedJSONArray)); -// return true; -// }); -// } -// -// /** -// * Evict all elements of the DB. -// * -// * @param clazz Class type of the items to be deleted. -// */ -// @NonNull -// @Override -// public Single evictAll(@NonNull Class clazz) { -// return Single.fromCallable(() -> { -// executeWriteOperationInRealm(Realm.getDefaultInstance(), (Execute) realm -> realm.delete(clazz)); -// return true; -// }); -// } -// -// /** -// * Evict a collection elements of the DB. -// * -// * @param idFieldName The id used to look for inside the DB. -// * @param list List of ids to be deleted. -// * @param dataClass Class type of the items to be deleted. -// */ -// @NonNull -// @Override -// public Single evictCollection(@NonNull String idFieldName, @NonNull List list, -// final Class itemIdType, @NonNull Class dataClass) { -// return Single.fromCallable(() -> list.isEmpty() ? false : Observable.fromIterable(list) -// .map(id -> evictById(dataClass, idFieldName, id, itemIdType)) -// .reduce((aBoolean, aBoolean2) -> aBoolean && aBoolean2) -// .blockingGet()); -// } -// -// /** -// * Evict element by id of the DB. -// * -// * @param dataClass Class type of the items to be deleted. -// * @param idColumnName The id used to look for inside the DB. -// * @param itemId Name of the id field. -// * @param itemIdType Class type of the item id to be deleted. -// */ -// @Override -// public boolean evictById(@NonNull Class dataClass, @NonNull String idColumnName, final Object itemId, -// final Class itemIdType) { -// Realm realm = Realm.getDefaultInstance(); -// return getItemById(realm, dataClass, idColumnName, itemId, itemIdType) -// .map(realmModel -> { -// if (realmModel == null) { -// return false; -// } else { -// executeWriteOperationInRealm(realm, (Execute) unused -> RealmObject.deleteFromRealm -// (realmModel)); -// return !RealmObject.isValid(realmModel); -// } -// }) -// .blockingFirst(); -// } -// -// private Flowable getItemById(Realm realm, @NonNull Class dataClass, @NonNull String idColumnName, -// final Object itemId, final Class itemIdType) { -// Object result; -// if (itemIdType.equals(long.class)) { -// result = realm.where(dataClass).equalTo(idColumnName, (long) itemId).findFirst(); -// } else if (itemIdType.equals(Long.class)) { -// result = realm.where(dataClass).equalTo(idColumnName, (Long) itemId).findFirst(); -// } else if (itemIdType.equals(int.class)) { -// result = realm.where(dataClass).equalTo(idColumnName, (int) itemId).findFirst(); -// } else if (itemIdType.equals(Integer.class)) { -// result = realm.where(dataClass).equalTo(idColumnName, (Integer) itemId).findFirst(); -// } -// // else if (itemIdType.equals(short.class) || itemIdType.equals(Short.class)) { -// // result = realm.where(dataClass).equalTo(idColumnName, (short) itemId).findFirst(); -// // } -// else if (itemIdType.equals(byte.class) || itemIdType.equals(Byte.class)) { -// result = realm.where(dataClass).equalTo(idColumnName, (byte) itemId).findFirst(); -// } else if (itemIdType.equals(String.class)) { -// result = realm.where(dataClass).equalTo(idColumnName, String.valueOf(itemId)).findFirst(); -// } else { -// return Flowable.error(new IllegalArgumentException("Unsupported ID type!")); -// } -// if (result == null) { -// return Flowable.error(new IllegalAccessException(String -// .format("%s with ID: %s was not found!", dataClass.getSimpleName(), itemId))); -// } -// return Flowable.just((RealmModel) result); -// } -// -// private void executeWriteOperationInRealm(@NonNull Realm realm, @NonNull Execute execute) { -// if (realm.isInTransaction()) { -// realm.cancelTransaction(); -// } -// realm.beginTransaction(); -// execute.run(realm); -// realm.commitTransaction(); -// } -// -// private T executeWriteOperationInRealm(@NonNull Realm realm, @NonNull ExecuteAndReturn executor) { -// T toReturnValue; -// if (realm.isInTransaction()) { -// realm.cancelTransaction(); -// } -// realm.beginTransaction(); -// toReturnValue = executor.runAndReturn(realm); -// realm.commitTransaction(); -// return toReturnValue; -// } -// -// @NonNull -// private JSONArray updateJsonArrayWithIdValue(@NonNull JSONArray jsonArray, @Nullable String idColumnName, -// Class itemIdType, Class dataClass) throws JSONException { -// if (idColumnName == null || idColumnName.isEmpty()) { -// throw new IllegalArgumentException(NO_ID); -// } -// int length = jsonArray.length(); -// JSONArray updatedJSONArray = new JSONArray(); -// for (int i = 0; i < length; i++) { -// if (jsonArray.opt(i) instanceof JSONObject) { -// updatedJSONArray.put(updateJsonObjectWithIdValue(jsonArray.optJSONObject(i), idColumnName, itemIdType, -// dataClass)); -// } -// } -// return updatedJSONArray; -// } -// -// @NonNull -// private JSONObject updateJsonObjectWithIdValue(@NonNull JSONObject jsonObject, @Nullable String idColumnName, -// Class itemIdType, Class dataClass) throws JSONException { -// if (idColumnName == null || idColumnName.isEmpty()) { -// throw new IllegalArgumentException(NO_ID); -// } -// if (itemIdType.equals(String.class)) { -// return jsonObject; -// } else if (jsonObject.optInt(idColumnName) == 0) { -// jsonObject.put(idColumnName, getNextId(dataClass, idColumnName)); -// } -// return jsonObject; -// } -// -// private int getNextId(Class clazz, String column) { -// Realm realm = Realm.getDefaultInstance(); -// try { -// Number currentMax = realm.where(clazz).max(column); -// return currentMax != null ? currentMax.intValue() + 1 : 1; -// } finally { -// realm.close(); -// } -// } -// -// @Deprecated -// private Flowable getRealm(Realm realm) { -// return Flowable.create(emitter -> { -// RealmConfiguration realmConfiguration = realm.getConfiguration(); -// Realm observableRealm = Realm.getInstance(realmConfiguration); -// final RealmChangeListener listener = emitter::onNext; -// emitter.setDisposable(Disposables.fromRunnable(() -> { -// observableRealm.removeChangeListener(listener); -// observableRealm.close(); -// Log.d(RealmManager.class.getSimpleName(), "Realm instance closed!"); -// })); -// observableRealm.addChangeListener(listener); -// emitter.onNext(observableRealm); -// }, BackpressureStrategy.BUFFER); -// } -// -// private interface Execute { -// void run(Realm realm); -// } -// -// private interface ExecuteAndReturn { -// @NonNull -// T runAndReturn(Realm realm); -// } -//} diff --git a/usecases/src/main/java/com/zeyad/usecases/db/RoomManager.kt b/usecases/src/main/java/com/zeyad/usecases/db/RoomManager.kt index 6b33b6a..329a7e6 100644 --- a/usecases/src/main/java/com/zeyad/usecases/db/RoomManager.kt +++ b/usecases/src/main/java/com/zeyad/usecases/db/RoomManager.kt @@ -11,8 +11,8 @@ import org.json.JSONObject @Mockable class RoomManager(private val db: RoomDatabase, private val daoResolver: DaoResolver) : DataBaseManager { - // typealias Predicate = (T) -> Boolean - override fun getQuery(query: String, clazz: Class): Flowable { + + override fun getQuery(query: String, clazz: Class): Flowable> { return db.singleTypedTransactionBlock { daoResolver.getDao(clazz).getQuery(SimpleSQLiteQuery(query)) }.toFlowable() @@ -59,22 +59,23 @@ class RoomManager(private val db: RoomDatabase, private val daoResolver: DaoReso list.add(Config.gson.fromJson(jsonArray.get(i).toString(), clazz)) } return putAll(list, clazz) - } - override fun evictAll(clazz: Class): Single { - return db.singleTransactionBlock { + override fun evictAll(clazz: Class): Single { + return db.singleTypedTransactionBlock { Single.just(daoResolver.getDao(clazz) .deleteAllItems(SimpleSQLiteQuery("DELETE FROM ${clazz.simpleName}")) > 0) } } - override fun evictCollection(list: List, clazz: Class): Single { - return db.singleTransactionBlock { Single.just(daoResolver.getDao(clazz).deleteItems(list) > 0) } + override fun evictCollection(list: List, clazz: Class): Single { + return db.singleTypedTransactionBlock { + Single.just(daoResolver.getDao(clazz).deleteItems(list) > 0) + } } - override fun evictCollectionById(list: List, clazz: Class, idFieldName: String): Single { - return db.singleTransactionBlock { + override fun evictCollectionById(list: List, clazz: Class, idFieldName: String): Single { + return db.singleTypedTransactionBlock { Single.just(list).flatMap { evictById(clazz, idFieldName, it) } } } diff --git a/usecases/src/main/java/com/zeyad/usecases/stores/CloudStore.kt b/usecases/src/main/java/com/zeyad/usecases/stores/CloudStore.kt index a739375..616825f 100644 --- a/usecases/src/main/java/com/zeyad/usecases/stores/CloudStore.kt +++ b/usecases/src/main/java/com/zeyad/usecases/stores/CloudStore.kt @@ -14,6 +14,7 @@ import io.reactivex.disposables.Disposable import okhttp3.MediaType import okhttp3.MultipartBody import okhttp3.RequestBody +import okhttp3.RequestBody.create import org.json.JSONArray import org.json.JSONObject import java.io.* @@ -56,7 +57,7 @@ class CloudStore(private val mApiConnection: ApiConnection, .map { mEntityDataMapper.mapTo(it, requestType) } } - override fun queryDisk(query: String, clazz: Class): Flowable { + override fun queryDisk(query: String, clazz: Class): Flowable> { return Flowable.error(IllegalAccessException("Can not search disk in cloud data store!")) } @@ -68,7 +69,7 @@ class CloudStore(private val mApiConnection: ApiConnection, saveLocally(idColumnName, jsonObject, requestType, persist, cache) }, { mApiConnection.dynamicPatch(url, - RequestBody.create(MediaType.parse(APPLICATION_JSON), jsonObject.toString())) + create(MediaType.parse(APPLICATION_JSON), jsonObject.toString())) .map { daoMapHelper(responseType, it) } }) } @@ -82,7 +83,7 @@ class CloudStore(private val mApiConnection: ApiConnection, saveLocally(idColumnName, jsonObject, requestType, persist, cache) }, { mApiConnection.dynamicPost(url, - RequestBody.create(MediaType.parse(APPLICATION_JSON), jsonObject.toString())) + create(MediaType.parse(APPLICATION_JSON), jsonObject.toString())) .map { daoMapHelper(responseType, it) } }) } @@ -96,7 +97,7 @@ class CloudStore(private val mApiConnection: ApiConnection, saveAllLocally(idColumnName, jsonArray, requestType, persist, cache) }, { mApiConnection.dynamicPost(url, - RequestBody.create(MediaType.parse(APPLICATION_JSON), jsonArray.toString())) + create(MediaType.parse(APPLICATION_JSON), jsonArray.toString())) .map { daoMapHelper(responseType, it) } }) } @@ -110,7 +111,7 @@ class CloudStore(private val mApiConnection: ApiConnection, saveLocally(idColumnName, jsonObject, requestType, persist, cache) }, { mApiConnection.dynamicPut(url, - RequestBody.create(MediaType.parse(APPLICATION_JSON), jsonObject.toString())) + create(MediaType.parse(APPLICATION_JSON), jsonObject.toString())) .map { daoMapHelper(responseType, it) } }) } @@ -124,39 +125,39 @@ class CloudStore(private val mApiConnection: ApiConnection, saveAllLocally(idColumnName, jsonArray, requestType, persist, cache) }, { mApiConnection.dynamicPut(url, - RequestBody.create(MediaType.parse(APPLICATION_JSON), jsonArray.toString())) + create(MediaType.parse(APPLICATION_JSON), jsonArray.toString())) .map { daoMapHelper(responseType, it) } }) } } - // TODO("Finish and Fix") - override fun dynamicDeleteCollection(url: String, idColumnName: String, itemIdType: Class<*>, - jsonArray: JSONArray, requestType: Class<*>, responseType: Class, - persist: Boolean, cache: Boolean): Single { + override fun dynamicDeleteCollection(url: String, idColumnName: String, itemIdType: Class<*>, + jsonArray: JSONArray, requestType: Class, + responseType: Class, persist: Boolean, cache: Boolean): Single { return Single.defer { persistErrorExecute({ - val list = mutableListOf() + val list = mutableListOf() for (i in 0..(jsonArray.length() - 1)) { list.add(gson.fromJson(jsonArray.getJSONObject(i).toString(), requestType)) } deleteLocally(list, idColumnName, requestType, persist, cache) }, { mApiConnection.dynamicDelete(url, - RequestBody.create(MediaType.parse(APPLICATION_JSON), jsonArray.toString())) + create(MediaType.parse(APPLICATION_JSON), jsonArray.toString())) .map { daoMapHelper(responseType, it) } }) } } - override fun dynamicDeleteCollectionById(url: String, idColumnName: String, itemIdType: Class<*>, jsonArray: JSONArray, requestType: Class<*>, responseType: Class, persist: Boolean, cache: Boolean): Single { + override fun dynamicDeleteCollectionById(url: String, idColumnName: String, itemIdType: Class<*>, + jsonArray: JSONArray, requestType: Class<*>, + responseType: Class, persist: Boolean, cache: Boolean): Single { return Single.defer { persistErrorExecute({ deleteLocallyById(convertToListOfId(jsonArray, itemIdType), idColumnName, requestType, persist, cache) }, { - mApiConnection.dynamicDelete(url, - RequestBody.create(MediaType.parse(APPLICATION_JSON), jsonArray.toString())) + mApiConnection.dynamicDelete(url, create(MediaType.parse(APPLICATION_JSON), jsonArray.toString())) .map { daoMapHelper(responseType, it) } }) } @@ -212,12 +213,12 @@ class CloudStore(private val mApiConnection: ApiConnection, val multiPartBodyParts = ArrayList() keyFileMap.toMap().forEach { entry -> multiPartBodyParts.add(MultipartBody.Part.createFormData(entry.key, - entry.value.name, RequestBody.create(MediaType.parse(MULTIPART_FORM_DATA), + entry.value.name, create(MediaType.parse(MULTIPART_FORM_DATA), entry.value))) } val map = mutableMapOf() for ((key, value) in parameters) { - map[key] = RequestBody.create(MediaType.parse(MULTIPART_FORM_DATA), + map[key] = create(MediaType.parse(MULTIPART_FORM_DATA), value.toString()) } if (isNetworkNotAvailable(Config.context)) { @@ -278,12 +279,12 @@ class CloudStore(private val mApiConnection: ApiConnection, } } - private fun deleteLocally(list: List, idColumnName: String, requestType: Class<*>, - persist: Boolean, cache: Boolean) { + private fun deleteLocally(list: List, idColumnName: String, requestType: Class, + persist: Boolean, cache: Boolean) { if (withDisk(persist)) { val collectionSize = list.size for (i in 0 until collectionSize) { -// mDataBaseManager?.evictCollection(list, requestType) + mDataBaseManager?.evictCollection(list, requestType) } } if (withCache(cache)) { diff --git a/usecases/src/main/java/com/zeyad/usecases/stores/DataStore.kt b/usecases/src/main/java/com/zeyad/usecases/stores/DataStore.kt index 3721215..fafe73f 100644 --- a/usecases/src/main/java/com/zeyad/usecases/stores/DataStore.kt +++ b/usecases/src/main/java/com/zeyad/usecases/stores/DataStore.kt @@ -33,7 +33,7 @@ interface DataStore { * Search disk with a query which returns an [Flowable] that will emit a list of * Object. */ - fun queryDisk(query: String, clazz: Class): Flowable + fun queryDisk(query: String, clazz: Class): Flowable> /** * Patch a JSONObject which returns an [Flowable] that will emit a Object. @@ -97,14 +97,14 @@ interface DataStore { * Delete a HashMap, Object> from cloud which returns an [Flowable] that will emit * a Object. */ - fun dynamicDeleteCollection(url: String, - idColumnName: String, - itemIdType: Class<*>, - jsonArray: JSONArray, - requestType: Class<*>, - responseType: Class, - persist: Boolean, - cache: Boolean): Single + fun dynamicDeleteCollection(url: String, + idColumnName: String, + itemIdType: Class<*>, + jsonArray: JSONArray, + requestType: Class, + responseType: Class, + persist: Boolean, + cache: Boolean): Single fun dynamicDeleteCollectionById(url: String, idColumnName: String, diff --git a/usecases/src/main/java/com/zeyad/usecases/stores/DiskStore.kt b/usecases/src/main/java/com/zeyad/usecases/stores/DiskStore.kt index e704dab..dcfea5c 100644 --- a/usecases/src/main/java/com/zeyad/usecases/stores/DiskStore.kt +++ b/usecases/src/main/java/com/zeyad/usecases/stores/DiskStore.kt @@ -2,6 +2,7 @@ package com.zeyad.usecases.stores import com.zeyad.usecases.Config.gson import com.zeyad.usecases.Mockable +import com.zeyad.usecases.convertToListOfId import com.zeyad.usecases.convertToStringListOfId import com.zeyad.usecases.db.DataBaseManager import com.zeyad.usecases.withCache @@ -126,25 +127,26 @@ class DiskStore(private val mDataBaseManager: DataBaseManager, * Delete a HashMap, Object> from cloud which returns an [Single] that will emit * a Object. */ - override fun dynamicDeleteCollection(url: String, - idColumnName: String, - itemIdType: Class<*>, - jsonArray: JSONArray, - requestType: Class<*>, - responseType: Class, - persist: Boolean, - cache: Boolean): Single { - throw NotImplementedError("Not Implemented Yet") -// val stringIds = convertToStringListOfId(jsonArray) -// return mDataBaseManager.evictCollection(idColumnName, convertToListOfId(jsonArray, itemIdType), -// itemIdType, requestType) -// .doOnSuccess { -// onNext(cache) { -// mMemoryStore?.deleteListById(stringIds, requestType) -// } -// } -// .map { it as M } -// .toSingle() + override fun dynamicDeleteCollection(url: String, + idColumnName: String, + itemIdType: Class<*>, + jsonArray: JSONArray, + requestType: Class, + responseType: Class, + persist: Boolean, + cache: Boolean): Single { + val list = mutableListOf() + for (i in 0..(jsonArray.length() - 1)) { + list.add(gson.fromJson(jsonArray.getJSONObject(i).toString(), requestType)) + } + return mDataBaseManager.evictCollection(list, requestType) + .doOnSuccess { + onNext(cache) { + mMemoryStore?.deleteListById(convertToListOfId(jsonArray, String::class.java), + requestType) + } + } + .map { it as M } } override fun dynamicDeleteCollectionById(url: String, @@ -165,12 +167,12 @@ class DiskStore(private val mDataBaseManager: DataBaseManager, .map { it as M } } - override fun queryDisk(query: String, clazz: Class): Flowable { + override fun queryDisk(query: String, clazz: Class): Flowable> { return mDataBaseManager.getQuery(query, clazz) } override fun dynamicDeleteAll(requestType: Class<*>): Single { - return mDataBaseManager.evictAll(requestType).map { it as Boolean } + return mDataBaseManager.evictAll(requestType).map { it } } override fun dynamicDownloadFile(url: String, file: File): Single { diff --git a/usecases/src/test/java/com/zeyad/usecases/api/DataServiceTest.kt b/usecases/src/test/java/com/zeyad/usecases/api/DataServiceTest.kt index d1756b7..f31bb78 100644 --- a/usecases/src/test/java/com/zeyad/usecases/api/DataServiceTest.kt +++ b/usecases/src/test/java/com/zeyad/usecases/api/DataServiceTest.kt @@ -326,7 +326,7 @@ class DataServiceTest { fun deleteItemById() { `when`(dataStoreFactory .dynamically(anyString(), anyObject()) - .dynamicDeleteCollection( + .dynamicDeleteCollection( anyString(), anyString(), anyObject(), @@ -340,7 +340,7 @@ class DataServiceTest { dataService.deleteItemById(postRequest) verify(dataStoreFactory.dynamically(anyString(), anyObject()), times(1)) - .dynamicDeleteCollection( + .dynamicDeleteCollection( anyString(), anyString(), anyObject(), @@ -356,7 +356,7 @@ class DataServiceTest { fun deleteCollection() { `when`(dataStoreFactory .dynamically(anyString(), anyObject()) - .dynamicDeleteCollection( + .dynamicDeleteCollection( anyString(), anyString(), anyObject(), @@ -370,7 +370,7 @@ class DataServiceTest { dataService.deleteCollectionByIds(postRequest) verify(dataStoreFactory.dynamically(anyString(), anyObject()), times(1)) - .dynamicDeleteCollection( + .dynamicDeleteCollection( anyString(), anyString(), anyObject(), @@ -397,7 +397,7 @@ class DataServiceTest { fun queryDisk() { `when`(dataStoreFactory.disk(Any::class.java) .queryDisk(anyString(), anyObject>())) - .thenReturn(Flowable.just(TestModel())) + .thenReturn(Flowable.just(listOf(TestModel()))) dataService.queryDisk("", TestModel::class.java) diff --git a/usecases/src/test/java/com/zeyad/usecases/db/RoomManagerTest.kt b/usecases/src/test/java/com/zeyad/usecases/db/RoomManagerTest.kt index 0023d05..0897e23 100644 --- a/usecases/src/test/java/com/zeyad/usecases/db/RoomManagerTest.kt +++ b/usecases/src/test/java/com/zeyad/usecases/db/RoomManagerTest.kt @@ -33,7 +33,7 @@ class RoomManagerTest { val testDao = mock(TestDao::class.java) `when`(testDao.getAllItems(anyObject())).thenReturn(Single.just(listOf(TestModel()))) `when`(testDao.getItem(anyObject())).thenReturn(Single.just(TestModel())) - `when`(testDao.getQuery(anyObject())).thenReturn(Single.just(TestModel())) + `when`(testDao.getQuery(anyObject())).thenReturn(Single.just(listOf(TestModel()))) `when`(testDao.insertItemsReplace(anyObject())).thenReturn(listOf(1)) `when`(testDao.updateItemsReplace(anyObject())).thenReturn(1) `when`(testDao.deleteItems(anyObject())).thenReturn(1) @@ -47,7 +47,7 @@ class RoomManagerTest { }) } - private fun applyTestSingleSubscriber(single: Single) { + private fun applyTestSingleSubscriber(single: Single<*>) { val testSubscriber = TestObserver() single.subscribe(testSubscriber) testSubscriber.assertComplete() @@ -81,7 +81,7 @@ class RoomManagerTest { applyTestFlowableSubscriber(flowable) - assertEquals(TestModel::class.java, flowable.firstElement().blockingGet().javaClass) + assertEquals(TestModel::class.java, flowable.firstElement().blockingGet()[0].javaClass) } @Test diff --git a/usecases/src/test/java/com/zeyad/usecases/stores/DiskStoreTest.kt b/usecases/src/test/java/com/zeyad/usecases/stores/DiskStoreTest.kt index 3e0d46d..bacf690 100644 --- a/usecases/src/test/java/com/zeyad/usecases/stores/DiskStoreTest.kt +++ b/usecases/src/test/java/com/zeyad/usecases/stores/DiskStoreTest.kt @@ -61,7 +61,7 @@ class DiskStoreTest { // TODO: 6/5/17 add cache verifications @Test fun testSearchDiskQuery() { `when`(dbManager.getQuery(anyString(), anyObject>())) - .thenReturn(Flowable.just(TestModel())) + .thenReturn(Flowable.just(listOf(TestModel()))) mDiskStore.queryDisk("", TestModel::class.java)