From 0af85456f0dee5eacb4ba5d59e84294b508ae2b5 Mon Sep 17 00:00:00 2001 From: Thibaud Giovannetti Date: Thu, 4 May 2017 10:34:20 +0200 Subject: [PATCH] Refactor observer execution and handle null observer to limit calls into the storage - change getById signature to int --- README.md | 2 +- store2store/build.gradle | 2 +- .../store2store/mock/MemoryService.java | 2 +- .../store2store/mock/MemoryStoreDao.java | 5 +- .../playmoweb/store2store/dao/IStoreDao.java | 2 +- .../store2store/service/AbstractService.java | 118 ++++++++---------- .../store2store/service/IService.java | 2 +- .../playmoweb/store2store/utils/Filter.java | 35 +++++- 8 files changed, 87 insertions(+), 81 deletions(-) diff --git a/README.md b/README.md index 434e02e..f47070a 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ public class MyStoreService extends AbstractService { } ``` -Or use one implemented on this library : +Have a look to existing implementations : - Realm : https://github.com/playmoweb/store2realm diff --git a/store2store/build.gradle b/store2store/build.gradle index 4babaeb..e6b4cae 100644 --- a/store2store/build.gradle +++ b/store2store/build.gradle @@ -30,7 +30,7 @@ dependencies { exclude group: 'com.android.support', module: 'support-annotations' }) - compile 'com.android.support:appcompat-v7:25.1.1' + compile 'com.android.support:appcompat-v7:25.3.1' compile "io.reactivex:rxandroid:1.2.1" testCompile 'junit:junit:4.12' diff --git a/store2store/src/androidTest/java/com/playmoweb/store2store/mock/MemoryService.java b/store2store/src/androidTest/java/com/playmoweb/store2store/mock/MemoryService.java index 7fab7ee..c905a37 100644 --- a/store2store/src/androidTest/java/com/playmoweb/store2store/mock/MemoryService.java +++ b/store2store/src/androidTest/java/com/playmoweb/store2store/mock/MemoryService.java @@ -38,7 +38,7 @@ protected Observable getOne(Filter filter, SortingMode sortingMode) { } @Override - protected Observable getById(String id) { + protected Observable getById(int id) { return myCustomAPI.getById(id); } diff --git a/store2store/src/androidTest/java/com/playmoweb/store2store/mock/MemoryStoreDao.java b/store2store/src/androidTest/java/com/playmoweb/store2store/mock/MemoryStoreDao.java index bc8a4fd..79b5a17 100644 --- a/store2store/src/androidTest/java/com/playmoweb/store2store/mock/MemoryStoreDao.java +++ b/store2store/src/androidTest/java/com/playmoweb/store2store/mock/MemoryStoreDao.java @@ -32,11 +32,10 @@ public Observable getOne(Filter filter, SortingMode sortingMode) { } @Override - public Observable getById(String id) { - int integerId = Integer.valueOf(id); + public Observable getById(int id) { TestModel t = null; for(TestModel tm : models) { - if(tm.getId() == integerId) { + if(tm.getId() == id) { t = tm; break; } diff --git a/store2store/src/main/java/com/playmoweb/store2store/dao/IStoreDao.java b/store2store/src/main/java/com/playmoweb/store2store/dao/IStoreDao.java index f4fbb0f..c63d06b 100644 --- a/store2store/src/main/java/com/playmoweb/store2store/dao/IStoreDao.java +++ b/store2store/src/main/java/com/playmoweb/store2store/dao/IStoreDao.java @@ -34,7 +34,7 @@ public interface IStoreDao { * @param id * @return */ - Observable getById(String id); + Observable getById(int id); /** * diff --git a/store2store/src/main/java/com/playmoweb/store2store/service/AbstractService.java b/store2store/src/main/java/com/playmoweb/store2store/service/AbstractService.java index 3b1ab14..4b71d87 100644 --- a/store2store/src/main/java/com/playmoweb/store2store/service/AbstractService.java +++ b/store2store/src/main/java/com/playmoweb/store2store/service/AbstractService.java @@ -30,7 +30,7 @@ public abstract class AbstractService implements IService { /** * The storage used by this manager */ - private IStoreDao storage; + private final IStoreDao storage; /** * A local subscription to handle local observers @@ -56,7 +56,7 @@ public IStoreDao getStorage() { @Override public Observable> getAll(final Filter filter, final SortingMode sortingMode, CustomObserver> otherSubscriber) { - final Subscription s = getAll(filter, sortingMode) + Observable> observable = getAll(filter, sortingMode) .flatMap(new Func1, Observable>>() { @Override public Observable> call(final List ts) { @@ -74,12 +74,9 @@ public Observable> call(List ts) { storage.insertOrUpdate(ts); return storage.getAll(filter, sortingMode); } - }) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(new SimpleObserver<>(otherSubscriber)); + }); - subscriptions.add(s); + subscribeNonNullObserver(observable, otherSubscriber); return storage.getAll(filter, sortingMode); } @@ -88,46 +85,36 @@ public final Observable> getAll(final CustomObserver> otherSubsc } @Override - public final Observable getById(final String id, final CustomObserver otherSubscriber) { - final Subscription s = getById(id) + public final Observable getById(final int id, final CustomObserver otherSubscriber) { + Observable observable = getById(id) .flatMap(new Func1>() { @Override public Observable call(T itemFromAsync) { return storage.insertOrUpdate(itemFromAsync); } - }) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(new SimpleObserver<>(otherSubscriber)); + }); - subscriptions.add(s); + subscribeNonNullObserver(observable, otherSubscriber); return storage.getOne(new Filter("id", id), null); } - public final Observable getById(final int idValue, final CustomObserver otherSubscriber) { - return getById(String.valueOf(idValue), otherSubscriber); - } - @Override public Observable getOne(Filter filter, SortingMode sortingMode, CustomObserver otherSubscriber) { - final Subscription s = getOne(filter, sortingMode) + Observable observable = getOne(filter, sortingMode) .flatMap(new Func1>() { @Override public Observable call(T itemFromAsync) { return storage.insertOrUpdate(itemFromAsync); } - }) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(new SimpleObserver<>(otherSubscriber)); + }); - subscriptions.add(s); + subscribeNonNullObserver(observable, otherSubscriber); return storage.getOne(filter, sortingMode); } @Override public Observable insert(final T object, CustomObserver otherSubscriber) { - final Subscription s = insert(object) + Observable observable = insert(object) .onErrorResumeNext(new Func1>() { @Override public Observable call(final Throwable throwable) { @@ -144,18 +131,15 @@ public Observable call(Void aVoid) { public Observable call(T item) { return storage.insertOrUpdate(item); } - }) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(new SimpleObserver<>(otherSubscriber)); + }); - subscriptions.add(s); + subscribeNonNullObserver(observable, otherSubscriber); return storage.insertOrUpdate(object); } @Override public Observable> insert(final List objects, CustomObserver> otherSubscriber) { - final Subscription s = insert(objects) + Observable> observable = insert(objects) .onErrorResumeNext(new Func1>>() { @Override public Observable> call(final Throwable throwable) { @@ -172,52 +156,43 @@ public Observable> call(Void aVoid) { public Observable> call(List items) { return storage.insertOrUpdate(items); } - }) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(new SimpleObserver<>(otherSubscriber)); + }); - subscriptions.add(s); + subscribeNonNullObserver(observable, otherSubscriber); return storage.insertOrUpdate(objects); } @Override public Observable update(final T object, CustomObserver otherSubscriber) { - final Subscription s = update(object) + Observable observable = update(object) .flatMap(new Func1>() { @Override public Observable call(T item) { return storage.insertOrUpdate(item); } - }) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(new SimpleObserver<>(otherSubscriber)); + }); - subscriptions.add(s); + subscribeNonNullObserver(observable, otherSubscriber); return Observable.just(object); } @Override public Observable> update(final List objects, CustomObserver> otherSubscriber) { - final Subscription s = update(objects) + Observable> observable = update(objects) .flatMap(new Func1, Observable>>() { @Override public Observable> call(List items) { return storage.insertOrUpdate(items); } - }) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(new SimpleObserver<>(otherSubscriber)); + }); - subscriptions.add(s); + subscribeNonNullObserver(observable, otherSubscriber); return storage.insertOrUpdate(objects); } @Override public Observable delete(final T object, CustomObserver otherSubscriber) { - final Subscription s = delete(object) + Observable observable = delete(object) .onErrorResumeNext(new Func1>() { @Override public Observable call(final Throwable throwable) { @@ -228,18 +203,15 @@ public Observable call(T item) { } }); } - }) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(new SimpleObserver<>(otherSubscriber)); + }); - subscriptions.add(s); + subscribeNonNullObserver(observable, otherSubscriber); return storage.delete(object); } @Override public Observable delete(final List objects, CustomObserver otherSubscriber) { - final Subscription s = delete(objects) + Observable observable = delete(objects) .onErrorResumeNext(new Func1>() { @Override public Observable call(final Throwable throwable) { @@ -250,18 +222,15 @@ public Observable call(List items) { } }); } - }) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(new SimpleObserver<>(otherSubscriber)); + }); - subscriptions.add(s); + subscribeNonNullObserver(observable, otherSubscriber); return storage.delete(objects); } @Override public Observable deleteAll(CustomObserver otherSubscriber) { - final Subscription s = deleteAll() + Observable observable = deleteAll() .onErrorResumeNext(new Func1>() { @Override public Observable call(final Throwable throwable) { @@ -278,15 +247,30 @@ public Observable call(List ts) { } }); } - }) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(new SimpleObserver<>(otherSubscriber)); + }); - subscriptions.add(s); + subscribeNonNullObserver(observable, otherSubscriber); return storage.deleteAll(); } + /** + * This method execute an observable only if the subscriber exists. + * + * @note The defaults schedulers are io() for subscribeOn and Android.mainThread() for observeOn. + * @param observable + * @param otherSubscriber + * @param + */ + private void subscribeNonNullObserver(final Observable observable, final CustomObserver otherSubscriber) { + if(observable != null && otherSubscriber != null) { + final Subscription s = observable + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(new SimpleObserver<>(otherSubscriber)); + subscriptions.add(s); + } + } + /************************************************************************** * Abstracts protected methods called by operations above *************************************************************************/ @@ -311,7 +295,7 @@ public Observable call(List ts) { * @param id * @return */ - protected abstract Observable getById(String id); + protected abstract Observable getById(int id); /** * diff --git a/store2store/src/main/java/com/playmoweb/store2store/service/IService.java b/store2store/src/main/java/com/playmoweb/store2store/service/IService.java index 722f9d6..cd67e9a 100644 --- a/store2store/src/main/java/com/playmoweb/store2store/service/IService.java +++ b/store2store/src/main/java/com/playmoweb/store2store/service/IService.java @@ -29,7 +29,7 @@ public interface IService { * @param otherSubscriber * @return */ - Observable getById(final String id, final CustomObserver otherSubscriber); + Observable getById(final int id, final CustomObserver otherSubscriber); /** * Get one object for filter and sorting mode diff --git a/store2store/src/main/java/com/playmoweb/store2store/utils/Filter.java b/store2store/src/main/java/com/playmoweb/store2store/utils/Filter.java index b527642..06b33e7 100644 --- a/store2store/src/main/java/com/playmoweb/store2store/utils/Filter.java +++ b/store2store/src/main/java/com/playmoweb/store2store/utils/Filter.java @@ -1,5 +1,6 @@ package com.playmoweb.store2store.utils; +import java.util.List; import java.util.WeakHashMap; /** @@ -8,9 +9,12 @@ public class Filter extends WeakHashMap { // TODO optimize access with a copy in an weak list - public Filter(String key, T value) { + public Filter() { super(); - add(key, FilterType.EQUAL, value); + } + + public Filter(String key, T value) { + this(key, FilterType.EQUAL, value); } public Filter(String key, FilterType type, T value) { @@ -18,19 +22,38 @@ public Filter(String key, FilterType type, T value) { add(key, type, value); } + public Filter add(String key, T value) { + this.put(key, new KeyValuePair<>(FilterType.EQUAL, value)); + return this; + } + public Filter add(String key, FilterType type, T value) { this.put(key, new KeyValuePair<>(type, value)); return this; } + public Filter add(String key, FilterType type, List values) { + for(T value : values) { + this.put(key, new KeyValuePair<>(type, value)); + } + return this; + } + + public Filter add(String key, FilterType type, T[] values) { + for(T value : values) { + this.put(key, new KeyValuePair<>(type, value)); + } + return this; + } + /** * Immutable KeyValuePair class */ - public static class KeyValuePair { - public final FilterType filterType; - public final T value; + static class KeyValuePair { + final FilterType filterType; + final T value; - public KeyValuePair(FilterType ft, T v){ + KeyValuePair(FilterType ft, T v){ value = v; filterType = ft; }