Sitelet https://github.com/KrailOrg/eventbus-mbassador/commit/de34a9430a8d7b8e01ae17df3b104aa18fe41d14
Skip to content

Commit de34a94

Browse files
author
David Sowerby
committed
Provide bindings for MessageBus and EventBus.
No longer any need for MessageBusProvider and EventBusProivder as we can use the Guice Provider<MessageBus> and Provider<EventBus> Also Fix #6, referencing SubscribeTo documentation
1 parent 1a76880 commit de34a94

8 files changed

Lines changed: 101 additions & 113 deletions

File tree

‎build.gradle‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ ext.slf4jVersion = '1.7.6'
4747

4848
kaytee {
4949
version {
50-
number = "0.4.0.0"
50+
number = "0.5.0.0"
5151
}
5252
}
5353

@@ -70,7 +70,7 @@ dependencies {
7070
compile 'org.slf4j:slf4j-api:' + slf4jVersion
7171
compile 'ch.qos.logback:logback-classic:1.1.2'
7272
compile 'ch.qos.logback:logback-core:1.1.2'
73-
compile 'uk.q3c.krail:eventbus-api:0.10.0.0'
73+
compile 'uk.q3c.krail:eventbus-api:0.11.0.0'
7474

7575
compile 'com.google.inject:guice:4.1.0'
7676
compile "net.engio:mbassador:1.3.1"

‎src/main/java/uk/q3c/krail/eventbus/mbassador/EventBusModule.java‎

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515

1616
import com.google.inject.AbstractModule;
1717
import com.google.inject.Binder;
18+
import com.google.inject.Key;
1819
import com.google.inject.Provider;
1920
import com.google.inject.Provides;
21+
import com.google.inject.Singleton;
2022
import com.google.inject.TypeLiteral;
2123
import com.google.inject.matcher.AbstractMatcher;
2224
import com.google.inject.spi.TypeEncounter;
@@ -28,8 +30,8 @@
2830
import net.engio.mbassy.bus.error.IPublicationErrorHandler;
2931
import net.engio.mbassy.listener.Listener;
3032
import uk.q3c.krail.eventbus.BusMessage;
31-
import uk.q3c.krail.eventbus.EventBusProvider;
32-
import uk.q3c.krail.eventbus.MessageBusProvider;
33+
import uk.q3c.krail.eventbus.EventBus;
34+
import uk.q3c.krail.eventbus.MessageBus;
3335

3436
/**
3537
* Configures MBassador EventBus and MessageBus implementations for Singleton scope.
@@ -52,25 +54,37 @@ protected void configure() {
5254
* This avoids an annotated constructor parameter in a super-class being ignored / overridden in a sub-class
5355
*/
5456

55-
final Provider<MBassadorMessageBusProvider> messageBusProviderProvider = this.getProvider(MBassadorMessageBusProvider.class);
56-
final Provider<MBassadorEventBusProvider> eventBusProviderProvider = this.getProvider(MBassadorEventBusProvider.class);
57+
TypeLiteral<Provider<MessageBus>> ppm = new TypeLiteral<Provider<MessageBus>>() {
58+
59+
};
60+
TypeLiteral<Provider<EventBus>> ppe = new TypeLiteral<Provider<EventBus>>() {
61+
62+
};
63+
Key<Provider<MessageBus>> keym = Key.get(ppm);
64+
Key<Provider<EventBus>> keye = Key.get(ppe);
65+
66+
final Provider<Provider<MessageBus>> messageBusProviderProvider = this.getProvider(keym);
67+
final Provider<Provider<EventBus>> eventBusProviderProvider = this.getProvider(keye);
5768

5869

5970
bindListener(new ListenerAnnotationMatcher(), new BusTypeListener(messageBusProviderProvider, eventBusProviderProvider));
6071
bindPublicationErrorHandlers();
6172
bindMessageBusConfiguration();
62-
bindMessageBusProvider();
63-
bindEventBusProvider();
6473

6574

6675
}
6776

68-
protected void bindMessageBusProvider() {
69-
bind(MessageBusProvider.class).to(MBassadorMessageBusProvider.class);
77+
@Provides
78+
@Singleton
79+
private MessageBus bindMessageBus(MBassador<BusMessage> nativeBus) {
80+
return new MBassadorMessageBus(nativeBus);
81+
7082
}
7183

72-
protected void bindEventBusProvider() {
73-
bind(EventBusProvider.class).to(MBassadorEventBusProvider.class);
84+
@Provides
85+
@Singleton
86+
private EventBus bindEventBus(MBassador<Object> nativeBus) {
87+
return new MBassadorEventBus(nativeBus);
7488
}
7589

7690

@@ -138,15 +152,15 @@ public boolean matches(TypeLiteral<?> t) {
138152
}
139153

140154
private static class BusTypeListener implements TypeListener {
141-
private Provider<MBassadorMessageBusProvider> messageBusProviderProvider;
142-
private Provider<MBassadorEventBusProvider> eventBusProviderProvider;
155+
private Provider<Provider<MessageBus>> messageBusProviderProvider;
156+
private Provider<Provider<EventBus>> eventBusProviderProvider;
143157

144158
/**
145159
* We need a "provider provider" because this listener is invoked before injector is fully resolved
146160
*
147161
* @param eventBusProviderProvider
148162
*/
149-
public BusTypeListener(Provider<MBassadorMessageBusProvider> messageBusProviderProvider, Provider<MBassadorEventBusProvider> eventBusProviderProvider) {
163+
public BusTypeListener(Provider<Provider<MessageBus>> messageBusProviderProvider, Provider<Provider<EventBus>> eventBusProviderProvider) {
150164
this.messageBusProviderProvider = messageBusProviderProvider;
151165
this.eventBusProviderProvider = eventBusProviderProvider;
152166
}
@@ -160,7 +174,7 @@ public BusTypeListener(Provider<MBassadorMessageBusProvider> messageBusProviderP
160174
* @param <I>
161175
*/
162176
public <I> void hear(TypeLiteral<I> type, TypeEncounter<I> encounter) {
163-
encounter.register(new MbassadorEventBusAutoSubscriber(messageBusProviderProvider.get(), eventBusProviderProvider.get()));
177+
encounter.register(new MBassadorEventBusAutoSubscriber(messageBusProviderProvider, eventBusProviderProvider));
164178
}
165179
}
166180
}

‎src/main/kotlin/uk/q3c/krail/eventbus/mbassador/BusProvider.kt‎

Lines changed: 0 additions & 38 deletions
This file was deleted.

src/main/kotlin/uk/q3c/krail/eventbus/mbassador/MbassadorEventBusAutoSubscriber.kt renamed to src/main/kotlin/uk/q3c/krail/eventbus/mbassador/MBassadorEventBusAutoSubscriber.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,20 @@
1212
package uk.q3c.krail.eventbus.mbassador
1313

1414
import com.google.inject.Inject
15+
import com.google.inject.Provider
1516
import com.google.inject.spi.InjectionListener
1617
import net.engio.mbassy.listener.Listener
1718
import uk.q3c.krail.eventbus.*
1819
import kotlin.reflect.KClass
1920

2021
/**
2122
* Provides logic for automatically subscribing to event buses. This is used as an [InjectionListener], and cannot therefore use injection in its
22-
* constructor
23+
* constructor. See [SubscribeTo] for expected behaviour
2324
*
2425
*
2526
* Created by David Sowerby on 13/03/15.
2627
*/
27-
class MbassadorEventBusAutoSubscriber @Inject constructor(private val messageBusProvider: MessageBusProvider, private val eventBusProvider: EventBusProvider) : EventBusAutoSubscriber {
28+
class MBassadorEventBusAutoSubscriber @Inject constructor(val messageBusProvider: Provider<Provider<MessageBus>>, val eventBusProvider: Provider<Provider<EventBus>>) : EventBusAutoSubscriber {
2829

2930
/**
3031
* Invoked by Guice after it injects the fields and methods of instance. `injectee` must have a [Listener] annotation in order to get this
@@ -47,8 +48,8 @@ class MbassadorEventBusAutoSubscriber @Inject constructor(private val messageBus
4748
// subscribe for the annotations we recognise, but ignore others - they may be managed by another InjectionListener
4849
for (target in subscriptions) {
4950
when (target) {
50-
GlobalMessageBus::class -> messageBusProvider.get().subscribe(injectee)
51-
GlobalEventBus::class -> eventBusProvider.get().subscribe(injectee)
51+
GlobalMessageBus::class -> messageBusProvider.get().get().subscribe(injectee)
52+
GlobalEventBus::class -> eventBusProvider.get().get().subscribe(injectee)
5253
}
5354

5455
}

‎src/test/kotlin/uk/q3c/krail/eventbus/mbassador/BusProviderTest.kt‎

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,48 @@
11
package uk.q3c.krail.eventbus.mbassador
22

33
import com.google.inject.Guice
4+
import com.google.inject.Key
5+
import com.google.inject.Provider
6+
import com.google.inject.TypeLiteral
47
import org.assertj.core.api.Assertions.assertThat
58
import org.junit.Before
69
import org.junit.Test
10+
import uk.q3c.krail.eventbus.EventBus
11+
import uk.q3c.krail.eventbus.MessageBus
712

813
/**
914
* Created by David Sowerby on 19 Oct 2017
1015
*/
1116

1217
class BusProviderTest {
13-
private lateinit var messageBusProvider: MBassadorMessageBusProvider
14-
private lateinit var eventBusProvider: MBassadorEventBusProvider
18+
private lateinit var messageBusProvider: Provider<MessageBus>
19+
private lateinit var eventBusProvider: Provider<EventBus>
20+
private lateinit var eventBusProvider2: Provider<EventBus>
1521
private lateinit var consumerOnMessage1: MessageConsumerExplicitlySubscribedToGlobalMessageBus
1622
private lateinit var consumerOnMessage2: MessageConsumerShouldDefaultToGlobalMessageBus
1723
private lateinit var consumerOnEvent: MessageConsumerExplicitlySubscribedToGlobalEventBus
1824
private lateinit var consumerOnBoth: MessageConsumerExplicitlySubscribedToBothGlobalBuses
19-
25+
private lateinit var eventBus: EventBus
26+
private lateinit var messageBus: MessageBus
2027

2128
@Before
2229
fun setup() {
2330
val injector = Guice.createInjector(EventBusModule())
24-
messageBusProvider = injector.getInstance(MBassadorMessageBusProvider::class.java)
25-
eventBusProvider = injector.getInstance(MBassadorEventBusProvider::class.java)
31+
val pm = object : TypeLiteral<Provider<MessageBus>>() {
32+
33+
}
34+
val pe = object : TypeLiteral<Provider<EventBus>>() {
35+
36+
}
37+
38+
messageBusProvider = injector.getInstance(Key.get(pm))
39+
eventBusProvider = injector.getInstance(Key.get(pe))
40+
eventBusProvider2 = injector.getProvider(EventBus::class.java)
2641
consumerOnMessage1 = injector.getInstance(MessageConsumerExplicitlySubscribedToGlobalMessageBus::class.java)
2742
consumerOnMessage2 = injector.getInstance(MessageConsumerShouldDefaultToGlobalMessageBus::class.java)
2843
consumerOnEvent = injector.getInstance(MessageConsumerExplicitlySubscribedToGlobalEventBus::class.java)
2944
consumerOnBoth = injector.getInstance(MessageConsumerExplicitlySubscribedToBothGlobalBuses::class.java)
45+
eventBus = injector.getInstance(EventBus::class.java)
3046
}
3147

3248
@Test
@@ -37,10 +53,14 @@ class BusProviderTest {
3753
val messageBus2 = messageBusProvider.get()
3854
val eventBus1 = eventBusProvider.get()
3955
val eventBus2 = eventBusProvider.get()
56+
val eventBus2a = eventBusProvider2.get()
57+
4058

4159
// then: buses are singleton
4260
assertThat(messageBus1).isSameAs(messageBus2)
4361
assertThat(eventBus1).isSameAs(eventBus2)
62+
assertThat(eventBus).isSameAs(eventBus1)
63+
assertThat(eventBus).isSameAs(eventBus2a)
4464

4565
// then: separated event and message buses
4666
assertThat(eventBus1).isNotSameAs(messageBus1)
@@ -51,7 +71,7 @@ class BusProviderTest {
5171
}
5272

5373
@Test
54-
fun publishOnMessageBusOnly() {
74+
fun publishMessagesSyncAndAsync() {
5575
// given
5676
val messageBus = messageBusProvider.get()
5777
val eventBus = eventBusProvider.get()
@@ -71,5 +91,21 @@ class BusProviderTest {
7191
assertThat(consumerOnBoth.msgs).containsOnly("published message", "published async message", "published event", "published async event")
7292
}
7393

94+
/**
95+
* Checks that an incorrectly annotated message consumer causes no Guice failure
96+
*/
97+
@Test
98+
fun incorrectConsumerAnnotation() {
99+
// given:
100+
val injector = Guice.createInjector(EventBusModule())
101+
102+
// when:
103+
injector.getInstance(MessageBus::class.java)
104+
injector.getInstance(MessageConsumerInvalidAnnotation::class.java)
105+
106+
// then: no exception if we get here
107+
assertThat(true).isTrue()
108+
}
109+
74110

75111
}

‎src/test/kotlin/uk/q3c/krail/eventbus/mbassador/BusProviderTest2.kt‎

Lines changed: 0 additions & 27 deletions
This file was deleted.

‎src/test/kotlin/uk/q3c/krail/eventbus/mbassador/EventBusModuleTest.kt‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import com.google.inject.Injector
55
import org.assertj.core.api.Assertions.assertThat
66
import org.junit.Before
77
import org.junit.Test
8-
import uk.q3c.krail.eventbus.EventBusProvider
9-
import uk.q3c.krail.eventbus.MessageBusProvider
8+
import uk.q3c.krail.eventbus.EventBus
9+
import uk.q3c.krail.eventbus.MessageBus
1010

1111
/**
1212
* Created by David Sowerby on 07 Jan 2018
@@ -22,17 +22,17 @@ class EventBusModuleTest {
2222

2323
@Test
2424
fun bindings() {
25-
assertThat(injector.getInstance(MessageBusProvider::class.java)).isInstanceOf(MBassadorMessageBusProvider::class.java)
26-
assertThat(injector.getInstance(EventBusProvider::class.java)).isInstanceOf(MBassadorEventBusProvider::class.java)
25+
assertThat(injector.getInstance(MessageBus::class.java)).isInstanceOf(MBassadorMessageBus::class.java)
26+
assertThat(injector.getInstance(EventBus::class.java)).isInstanceOf(MBassadorEventBus::class.java)
2727
}
2828

2929
@Test
3030
fun separation() {
3131

3232
// when:
3333

34-
var pEvent = injector.getInstance(EventBusProvider::class.java)
35-
var pMessage = injector.getInstance(MessageBusProvider::class.java)
34+
val pEvent = injector.getProvider(EventBus::class.java)
35+
val pMessage = injector.getProvider(MessageBus::class.java)
3636

3737
// then:
3838

0 commit comments

Comments
 (0)