Skip to content

Commit df73d80

Browse files
improvement: EventAggregator now considers Event-Type (iluwatar#1933)
* Implemented more granular registration of observers with HashMap; Key: Event, Value: List of Observers registered for the event; * Edited constructors and super calls of all EventEmitter extenders * Edited constructor calls in App.java * Edited EventEmitterTest * Added new white walkers event, scout emits at wednesday, varys observes and emits at saturday * Added white walkers event to KingsHandTest.java * Varys now passes events * Corrected some indentation levels and added curly braces to if statements * Corrected some styling * Switched lines in App.java, added javadoc to registerObserver * Fixed some indents, added param comments
1 parent 4588e09 commit df73d80

File tree

10 files changed

+81
-30
lines changed

10 files changed

+81
-30
lines changed

event-aggregator/src/main/java/com/iluwatar/event/aggregator/App.java

+19-4
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,28 @@ public class App {
4949
public static void main(String[] args) {
5050

5151
var kingJoffrey = new KingJoffrey();
52-
var kingsHand = new KingsHand(kingJoffrey);
52+
53+
var kingsHand = new KingsHand();
54+
kingsHand.registerObserver(kingJoffrey, Event.TRAITOR_DETECTED);
55+
kingsHand.registerObserver(kingJoffrey, Event.STARK_SIGHTED);
56+
kingsHand.registerObserver(kingJoffrey, Event.WARSHIPS_APPROACHING);
57+
kingsHand.registerObserver(kingJoffrey, Event.WHITE_WALKERS_SIGHTED);
58+
59+
var varys = new LordVarys();
60+
varys.registerObserver(kingsHand, Event.TRAITOR_DETECTED);
61+
varys.registerObserver(kingsHand, Event.WHITE_WALKERS_SIGHTED);
62+
63+
var scout = new Scout();
64+
scout.registerObserver(kingsHand, Event.WARSHIPS_APPROACHING);
65+
scout.registerObserver(varys, Event.WHITE_WALKERS_SIGHTED);
66+
67+
var baelish = new LordBaelish(kingsHand, Event.STARK_SIGHTED);
5368

5469
var emitters = List.of(
5570
kingsHand,
56-
new LordBaelish(kingsHand),
57-
new LordVarys(kingsHand),
58-
new Scout(kingsHand)
71+
baelish,
72+
varys,
73+
scout
5974
);
6075

6176
Arrays.stream(Weekday.values())

event-aggregator/src/main/java/com/iluwatar/event/aggregator/Event.java

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
@RequiredArgsConstructor
3232
public enum Event {
3333

34+
WHITE_WALKERS_SIGHTED("White walkers sighted"),
3435
STARK_SIGHTED("Stark sighted"),
3536
WARSHIPS_APPROACHING("Warships approaching"),
3637
TRAITOR_DETECTED("Traitor detected");

event-aggregator/src/main/java/com/iluwatar/event/aggregator/EventEmitter.java

+24-7
Original file line numberDiff line numberDiff line change
@@ -23,31 +23,48 @@
2323

2424
package com.iluwatar.event.aggregator;
2525

26+
import java.util.HashMap;
2627
import java.util.LinkedList;
2728
import java.util.List;
29+
import java.util.Map;
2830

2931
/**
3032
* EventEmitter is the base class for event producers that can be observed.
3133
*/
3234
public abstract class EventEmitter {
3335

34-
private final List<EventObserver> observers;
36+
private final Map<Event, List<EventObserver>> observerLists;
3537

3638
public EventEmitter() {
37-
observers = new LinkedList<>();
39+
observerLists = new HashMap<>();
3840
}
3941

40-
public EventEmitter(EventObserver obs) {
42+
public EventEmitter(EventObserver obs, Event e) {
4143
this();
42-
registerObserver(obs);
44+
registerObserver(obs, e);
4345
}
4446

45-
public final void registerObserver(EventObserver obs) {
46-
observers.add(obs);
47+
/**
48+
* Registers observer for specific event in the related list.
49+
*
50+
* @param obs the observer that observers this emitter
51+
* @param e the specific event for that observation occurs
52+
* */
53+
public final void registerObserver(EventObserver obs, Event e) {
54+
if (!observerLists.containsKey(e)) {
55+
observerLists.put(e, new LinkedList<>());
56+
}
57+
if (!observerLists.get(e).contains(obs)) {
58+
observerLists.get(e).add(obs);
59+
}
4760
}
4861

4962
protected void notifyObservers(Event e) {
50-
observers.forEach(obs -> obs.onEvent(e));
63+
if (observerLists.containsKey(e)) {
64+
observerLists
65+
.get(e)
66+
.forEach(observer -> observer.onEvent(e));
67+
}
5168
}
5269

5370
public abstract void timePasses(Weekday day);

event-aggregator/src/main/java/com/iluwatar/event/aggregator/KingsHand.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ public class KingsHand extends EventEmitter implements EventObserver {
3131
public KingsHand() {
3232
}
3333

34-
public KingsHand(EventObserver obs) {
35-
super(obs);
34+
public KingsHand(EventObserver obs, Event e) {
35+
super(obs, e);
3636
}
3737

3838
@Override
@@ -42,6 +42,5 @@ public void onEvent(Event e) {
4242

4343
@Override
4444
public void timePasses(Weekday day) {
45-
// NOP
4645
}
4746
}

event-aggregator/src/main/java/com/iluwatar/event/aggregator/LordBaelish.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ public class LordBaelish extends EventEmitter {
3131
public LordBaelish() {
3232
}
3333

34-
public LordBaelish(EventObserver obs) {
35-
super(obs);
34+
public LordBaelish(EventObserver obs, Event e) {
35+
super(obs, e);
3636
}
3737

3838
@Override

event-aggregator/src/main/java/com/iluwatar/event/aggregator/LordVarys.java

+12-3
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,19 @@
2323

2424
package com.iluwatar.event.aggregator;
2525

26+
import lombok.extern.slf4j.Slf4j;
27+
2628
/**
2729
* LordVarys produces events.
2830
*/
29-
public class LordVarys extends EventEmitter {
31+
@Slf4j
32+
public class LordVarys extends EventEmitter implements EventObserver {
3033

3134
public LordVarys() {
3235
}
3336

34-
public LordVarys(EventObserver obs) {
35-
super(obs);
37+
public LordVarys(EventObserver obs, Event e) {
38+
super(obs, e);
3639
}
3740

3841
@Override
@@ -41,4 +44,10 @@ public void timePasses(Weekday day) {
4144
notifyObservers(Event.TRAITOR_DETECTED);
4245
}
4346
}
47+
48+
49+
@Override
50+
public void onEvent(Event e) {
51+
notifyObservers(e);
52+
}
4453
}

event-aggregator/src/main/java/com/iluwatar/event/aggregator/Scout.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,17 @@ public class Scout extends EventEmitter {
3131
public Scout() {
3232
}
3333

34-
public Scout(EventObserver obs) {
35-
super(obs);
34+
public Scout(EventObserver obs, Event e) {
35+
super(obs, e);
3636
}
3737

3838
@Override
3939
public void timePasses(Weekday day) {
4040
if (day == Weekday.TUESDAY) {
4141
notifyObservers(Event.WARSHIPS_APPROACHING);
4242
}
43+
if (day == Weekday.WEDNESDAY) {
44+
notifyObservers(Event.WHITE_WALKERS_SIGHTED);
45+
}
4346
}
4447
}

event-aggregator/src/test/java/com/iluwatar/event/aggregator/EventEmitterTest.java

+8-7
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import static org.mockito.Mockito.verifyZeroInteractions;
3232

3333
import java.util.Objects;
34+
import java.util.function.BiFunction;
3435
import java.util.function.Function;
3536
import java.util.function.Supplier;
3637
import org.junit.jupiter.api.Test;
@@ -46,7 +47,7 @@ abstract class EventEmitterTest<E extends EventEmitter> {
4647
/**
4748
* Factory used to create a new instance of the test object with a default observer
4849
*/
49-
private final Function<EventObserver, E> factoryWithDefaultObserver;
50+
private final BiFunction<EventObserver, Event, E> factoryWithDefaultObserver;
5051

5152
/**
5253
* Factory used to create a new instance of the test object without passing a default observer
@@ -67,7 +68,7 @@ abstract class EventEmitterTest<E extends EventEmitter> {
6768
* Create a new event emitter test, using the given test object factories, special day and event
6869
*/
6970
EventEmitterTest(final Weekday specialDay, final Event event,
70-
final Function<EventObserver, E> factoryWithDefaultObserver,
71+
final BiFunction<EventObserver, Event, E> factoryWithDefaultObserver,
7172
final Supplier<E> factoryWithoutDefaultObserver) {
7273

7374
this.specialDay = specialDay;
@@ -129,8 +130,8 @@ private void testAllDaysWithoutDefaultObserver(final Weekday specialDay, final E
129130
final var observer2 = mock(EventObserver.class);
130131

131132
final var emitter = this.factoryWithoutDefaultObserver.get();
132-
emitter.registerObserver(observer1);
133-
emitter.registerObserver(observer2);
133+
emitter.registerObserver(observer1, event);
134+
emitter.registerObserver(observer2, event);
134135

135136
testAllDays(specialDay, event, emitter, observer1, observer2);
136137
}
@@ -146,9 +147,9 @@ private void testAllDaysWithDefaultObserver(final Weekday specialDay, final Even
146147
final var observer1 = mock(EventObserver.class);
147148
final var observer2 = mock(EventObserver.class);
148149

149-
final var emitter = this.factoryWithDefaultObserver.apply(defaultObserver);
150-
emitter.registerObserver(observer1);
151-
emitter.registerObserver(observer2);
150+
final var emitter = this.factoryWithDefaultObserver.apply(defaultObserver, event);
151+
emitter.registerObserver(observer1, event);
152+
emitter.registerObserver(observer2, event);
152153

153154
testAllDays(specialDay, event, emitter, defaultObserver, observer1, observer2);
154155
}

event-aggregator/src/test/java/com/iluwatar/event/aggregator/KingsHandTest.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,11 @@ public KingsHandTest() {
5555
@Test
5656
void testPassThrough() throws Exception {
5757
final var observer = mock(EventObserver.class);
58-
final var kingsHand = new KingsHand(observer);
58+
final var kingsHand = new KingsHand();
59+
kingsHand.registerObserver(observer, Event.STARK_SIGHTED);
60+
kingsHand.registerObserver(observer, Event.WARSHIPS_APPROACHING);
61+
kingsHand.registerObserver(observer, Event.TRAITOR_DETECTED);
62+
kingsHand.registerObserver(observer, Event.WHITE_WALKERS_SIGHTED);
5963

6064
// The kings hand should not pass any events before he received one
6165
verifyZeroInteractions(observer);

event-aggregator/src/test/java/com/iluwatar/event/aggregator/ScoutTest.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ class ScoutTest extends EventEmitterTest<Scout> {
3434
* Create a new test instance, using the correct object factory
3535
*/
3636
public ScoutTest() {
37-
super(Weekday.TUESDAY, Event.WARSHIPS_APPROACHING, Scout::new, Scout::new);
37+
38+
super(Weekday.TUESDAY, Event.WARSHIPS_APPROACHING, Scout::new, Scout::new);
39+
3840
}
3941

4042
}

0 commit comments

Comments
 (0)