From 40a14abe028602f87275d02d6b645200a7caa646 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 6 Dec 2019 20:25:33 +0100 Subject: [PATCH] Fix NPEs in repositories --- .../messenger/MercuryImApplication.java | 2 +- .../messenger/di/component/AppComponent.java | 14 ++---- .../data/di/RepositoryComponent.java | 23 +++++++++ .../messenger/data/di/RepositoryModule.java | 49 ++++++++++++++----- .../repository/XmppAccountRepository.java | 7 +-- .../repository/XmppDirectChatRepository.java | 17 ++++--- .../repository/XmppGroupChatRepository.java | 7 +-- .../data/repository/XmppPeerRepository.java | 7 +-- .../data/di/RepositoryTestComponent.java | 1 - .../repository/AccountRepositoryTest.java | 2 + .../data/repository/DirectChatRepository.java | 4 ++ 11 files changed, 91 insertions(+), 42 deletions(-) create mode 100644 data/src/main/java/org/mercury_im/messenger/data/di/RepositoryComponent.java diff --git a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java index 8953c9b..d560b1b 100644 --- a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java +++ b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java @@ -9,6 +9,7 @@ import android.content.Context; import android.content.Intent; import android.os.Build; +import org.mercury_im.messenger.data.di.MappingModule; import org.mercury_im.messenger.data.di.RepositoryModule; import org.mercury_im.messenger.di.component.AppComponent; import org.mercury_im.messenger.di.component.DaggerAppComponent; @@ -72,7 +73,6 @@ public class MercuryImApplication extends Application { public AppComponent createAppComponent() { AppComponent appComponent = DaggerAppComponent.builder() .appModule(new AppModule(this)) - .repositoryModule(new RepositoryModule()) .build(); appComponent.inject(this); diff --git a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java index f7eda00..84ff078 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java +++ b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java @@ -1,6 +1,7 @@ package org.mercury_im.messenger.di.component; import org.mercury_im.messenger.MercuryImApplication; +import org.mercury_im.messenger.data.di.MappingModule; import org.mercury_im.messenger.data.di.RepositoryModule; import org.mercury_im.messenger.di.module.AndroidPersistenceModule; import org.mercury_im.messenger.di.module.AppModule; @@ -28,20 +29,11 @@ import dagger.Component; @Component( modules = { AppModule.class, - AndroidPersistenceModule.class + AndroidPersistenceModule.class, + RepositoryModule.class }) public interface AppComponent { - @Component.Builder - interface Builder { - - AppComponent build(); - - Builder appModule(AppModule appModule); - - Builder repositoryModule(RepositoryModule module); - } - // Application void inject(MercuryImApplication mercuryImApplication); diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryComponent.java b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryComponent.java new file mode 100644 index 0000000..0f7264c --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryComponent.java @@ -0,0 +1,23 @@ +package org.mercury_im.messenger.data.di; + +import org.mercury_im.messenger.data.repository.XmppAccountRepository; +import org.mercury_im.messenger.data.repository.XmppDirectChatRepository; +import org.mercury_im.messenger.data.repository.XmppGroupChatRepository; +import org.mercury_im.messenger.data.repository.XmppPeerRepository; + +import dagger.Component; + +@Component(modules = { + RepositoryModule.class +}) +public interface RepositoryComponent { + + void inject(XmppAccountRepository accountRepository); + + void inject(XmppPeerRepository peerRepository); + + void inject(XmppDirectChatRepository directChatRepository); + + void inject(XmppGroupChatRepository groupChatRepository); + +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java index 84368ed..4a83441 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java @@ -1,11 +1,17 @@ package org.mercury_im.messenger.data.di; +import org.mercury_im.messenger.data.mapping.AccountMapping; +import org.mercury_im.messenger.data.mapping.DirectChatMapping; +import org.mercury_im.messenger.data.mapping.GroupChatMapping; +import org.mercury_im.messenger.data.mapping.PeerMapping; import org.mercury_im.messenger.data.repository.AccountRepository; +import org.mercury_im.messenger.data.repository.GroupChatRepository; import org.mercury_im.messenger.data.repository.PeerRepository; import org.mercury_im.messenger.data.repository.DirectChatRepository; import org.mercury_im.messenger.data.repository.EntityCapsRepository; import org.mercury_im.messenger.data.repository.XmppAccountRepository; import org.mercury_im.messenger.data.repository.XmppDirectChatRepository; +import org.mercury_im.messenger.data.repository.XmppGroupChatRepository; import org.mercury_im.messenger.data.repository.XmppPeerRepository; import org.mercury_im.messenger.util.ThreadUtils; @@ -26,17 +32,41 @@ public class RepositoryModule { public static AccountRepository provideAccountRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { - return new XmppAccountRepository(data, ioScheduler, uiScheduler); + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler, + AccountMapping accountMapping) { + return new XmppAccountRepository(data, ioScheduler, uiScheduler, accountMapping); } @Provides @Singleton - public static DirectChatRepository provideChatRepository( + public static PeerRepository providePeerRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { - return new XmppDirectChatRepository(data, ioScheduler, uiScheduler); + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler, + PeerMapping peerMapping) { + return new XmppPeerRepository(data, ioScheduler, uiScheduler, peerMapping); + } + + @Provides + @Singleton + public static DirectChatRepository provideDirectChatRepository( + ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler, + AccountMapping accountMapping, + PeerMapping peerMapping, + DirectChatMapping directChatMapping) { + return new XmppDirectChatRepository(data, ioScheduler, uiScheduler, accountMapping, peerMapping, directChatMapping); + } + + @Provides + @Singleton + public static GroupChatRepository provideGroupChatRepository( + ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler, + GroupChatMapping groupChatMapping) { + return new XmppGroupChatRepository(data, ioScheduler, uiScheduler, groupChatMapping); } @Provides @@ -48,12 +78,5 @@ public class RepositoryModule { return new EntityCapsRepository(data, ioScheduler, uiScheduler); } - @Provides - @Singleton - public static PeerRepository provideRosterRepository( - ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { - return new XmppPeerRepository(data, ioScheduler, uiScheduler); - } + } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java index 274bcd8..dc988ba 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java @@ -26,14 +26,15 @@ public class XmppAccountRepository extends RequeryRepository implements AccountRepository { - @Inject - AccountMapping accountMapping; + private final AccountMapping accountMapping; @Inject public XmppAccountRepository(ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler, + AccountMapping accountMapping) { super(data, subscriberScheduler, observerScheduler); + this.accountMapping = accountMapping; } @Override diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java index 71e0ff0..4e2b1c2 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java @@ -30,21 +30,24 @@ public class XmppDirectChatRepository extends RequeryRepository implements DirectChatRepository { - @Inject - AccountMapping accountMapping; + private final AccountMapping accountMapping; - @Inject - PeerMapping peerMapping; + private final PeerMapping peerMapping; - @Inject - DirectChatMapping directChatMapping; + private final DirectChatMapping directChatMapping; @Inject public XmppDirectChatRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler, + AccountMapping accountMapping, + PeerMapping peerMapping, + DirectChatMapping directChatMapping) { super(data, subscriberScheduler, observerScheduler); + this.accountMapping = accountMapping; + this.peerMapping = peerMapping; + this.directChatMapping = directChatMapping; } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java index d78ca5d..516a0e1 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java @@ -28,15 +28,16 @@ public class XmppGroupChatRepository extends RequeryRepository implements GroupChatRepository { - @Inject - GroupChatMapping groupChatMapping; + private final GroupChatMapping groupChatMapping; @Inject public XmppGroupChatRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler, + GroupChatMapping groupChatMapping) { super(data, subscriberScheduler, observerScheduler); + this.groupChatMapping = groupChatMapping; } @Override diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java index ce52c8a..ba539d9 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java @@ -29,14 +29,15 @@ public class XmppPeerRepository @Inject AccountRepository accountRepository; - @Inject - PeerMapping peerMapping; + private final PeerMapping peerMapping; @Inject public XmppPeerRepository(ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler, + PeerMapping peerMapping) { super(data, subscriberScheduler, observerScheduler); + this.peerMapping = peerMapping; } @Override diff --git a/data/src/test/java/org/mercury_im/messenger/data/di/RepositoryTestComponent.java b/data/src/test/java/org/mercury_im/messenger/data/di/RepositoryTestComponent.java index b40ee68..2fe90a9 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/di/RepositoryTestComponent.java +++ b/data/src/test/java/org/mercury_im/messenger/data/di/RepositoryTestComponent.java @@ -8,7 +8,6 @@ import dagger.Component; @Component(modules = { RepositoryModule.class, - MappingModule.class, TestDatabaseModule.class, TestingSchedulerModule.class }) diff --git a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java index 8611389..3180528 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java @@ -61,5 +61,7 @@ public class AccountRepositoryTest { DirectChat chatModel = directChatRepository.insertDirectChat(directChat) .blockingGet(); assertEquals(1, chatModel.getId()); + + dataStore.close(); } } diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java index 8dbaaf2..62effd7 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java @@ -16,6 +16,10 @@ public interface DirectChatRepository { Single insertDirectChat(DirectChat chat); + default Observable> observeDirectChat(DirectChat chat) { + return observeDirectChat(chat.getId()); + } + Observable> observeDirectChat(long chatId); Maybe getDirectChat(long chatId);