diff --git a/event-driven-architecture/etc/eda.png b/event-driven-architecture/etc/eda.png
index 38c433a40..743726451 100644
Binary files a/event-driven-architecture/etc/eda.png and b/event-driven-architecture/etc/eda.png differ
diff --git a/event-driven-architecture/etc/eda.ucls b/event-driven-architecture/etc/eda.ucls
index 4ddb8b20c..776bedc81 100644
--- a/event-driven-architecture/etc/eda.ucls
+++ b/event-driven-architecture/etc/eda.ucls
@@ -4,7 +4,7 @@
-
+
@@ -15,7 +15,7 @@
project="event-driven-architecture"
file="/event-driven-architecture/src/main/java/com/iluwatar/eda/handler/UserUpdatedEventHandler.java" binary="false"
corner="BOTTOM_RIGHT">
-
+
@@ -26,17 +26,17 @@
project="event-driven-architecture"
file="/event-driven-architecture/src/main/java/com/iluwatar/eda/handler/UserCreatedEventHandler.java" binary="false"
corner="BOTTOM_RIGHT">
-
+
-
-
+
@@ -46,7 +46,7 @@
-
+
@@ -56,7 +56,7 @@
-
+
@@ -66,7 +66,7 @@
-
+
@@ -76,17 +76,17 @@
-
+
-
-
+
@@ -94,99 +94,87 @@
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
diff --git a/event-driven-architecture/src/main/java/com/iluwatar/eda/App.java b/event-driven-architecture/src/main/java/com/iluwatar/eda/App.java
index 4179046c8..866b3c9e9 100644
--- a/event-driven-architecture/src/main/java/com/iluwatar/eda/App.java
+++ b/event-driven-architecture/src/main/java/com/iluwatar/eda/App.java
@@ -22,9 +22,9 @@
*/
package com.iluwatar.eda;
-import com.iluwatar.eda.event.Event;
import com.iluwatar.eda.event.UserCreatedEvent;
import com.iluwatar.eda.event.UserUpdatedEvent;
+import com.iluwatar.eda.framework.Event;
import com.iluwatar.eda.framework.EventDispatcher;
import com.iluwatar.eda.handler.UserCreatedEventHandler;
import com.iluwatar.eda.handler.UserUpdatedEventHandler;
@@ -53,12 +53,12 @@ public class App {
public static void main(String[] args) {
EventDispatcher dispatcher = new EventDispatcher();
- dispatcher.registerChannel(UserCreatedEvent.class, new UserCreatedEventHandler());
- dispatcher.registerChannel(UserUpdatedEvent.class, new UserUpdatedEventHandler());
+ dispatcher.registerHandler(UserCreatedEvent.class, new UserCreatedEventHandler());
+ dispatcher.registerHandler(UserUpdatedEvent.class, new UserUpdatedEventHandler());
User user = new User("iluwatar");
- dispatcher.onEvent(new UserCreatedEvent(user));
- dispatcher.onEvent(new UserUpdatedEvent(user));
+ dispatcher.dispatch(new UserCreatedEvent(user));
+ dispatcher.dispatch(new UserUpdatedEvent(user));
}
}
diff --git a/event-driven-architecture/src/main/java/com/iluwatar/eda/event/Event.java b/event-driven-architecture/src/main/java/com/iluwatar/eda/event/AbstractEvent.java
similarity index 85%
rename from event-driven-architecture/src/main/java/com/iluwatar/eda/event/Event.java
rename to event-driven-architecture/src/main/java/com/iluwatar/eda/event/AbstractEvent.java
index 3ed0f9c9d..54a916c7b 100644
--- a/event-driven-architecture/src/main/java/com/iluwatar/eda/event/Event.java
+++ b/event-driven-architecture/src/main/java/com/iluwatar/eda/event/AbstractEvent.java
@@ -23,10 +23,10 @@
package com.iluwatar.eda.event;
import com.iluwatar.eda.framework.EventDispatcher;
-import com.iluwatar.eda.framework.Message;
+import com.iluwatar.eda.framework.Event;
/**
- * The {@link Event} class serves as a base class for defining custom events happening with your
+ * The {@link AbstractEvent} class serves as a base class for defining custom events happening with your
* system. In this example we have two types of events defined.
*
* - {@link UserCreatedEvent} - used when a user is created
@@ -34,16 +34,16 @@ import com.iluwatar.eda.framework.Message;
*
* Events can be distinguished using the {@link #getType() getType} method.
*/
-public class Event implements Message {
+public abstract class AbstractEvent implements Event {
/**
* Returns the event type as a {@link Class} object
* In this example, this method is used by the {@link EventDispatcher} to
* dispatch events depending on their type.
*
- * @return the Event type as a {@link Class}.
+ * @return the AbstractEvent type as a {@link Class}.
*/
- public Class extends Message> getType() {
+ public Class extends Event> getType() {
return getClass();
}
}
\ No newline at end of file
diff --git a/event-driven-architecture/src/main/java/com/iluwatar/eda/event/UserCreatedEvent.java b/event-driven-architecture/src/main/java/com/iluwatar/eda/event/UserCreatedEvent.java
index e3354aaf2..717ed1a9d 100644
--- a/event-driven-architecture/src/main/java/com/iluwatar/eda/event/UserCreatedEvent.java
+++ b/event-driven-architecture/src/main/java/com/iluwatar/eda/event/UserCreatedEvent.java
@@ -29,7 +29,7 @@ import com.iluwatar.eda.model.User;
* This class can be extended to contain details about the user has been created. In this example,
* the entire {@link User} object is passed on as data with the event.
*/
-public class UserCreatedEvent extends Event {
+public class UserCreatedEvent extends AbstractEvent {
private User user;
diff --git a/event-driven-architecture/src/main/java/com/iluwatar/eda/event/UserUpdatedEvent.java b/event-driven-architecture/src/main/java/com/iluwatar/eda/event/UserUpdatedEvent.java
index 37ca05932..9646957dc 100644
--- a/event-driven-architecture/src/main/java/com/iluwatar/eda/event/UserUpdatedEvent.java
+++ b/event-driven-architecture/src/main/java/com/iluwatar/eda/event/UserUpdatedEvent.java
@@ -29,7 +29,7 @@ import com.iluwatar.eda.model.User;
* This class can be extended to contain details about the user has been updated. In this example,
* the entire {@link User} object is passed on as data with the event.
*/
-public class UserUpdatedEvent extends Event {
+public class UserUpdatedEvent extends AbstractEvent {
private User user;
diff --git a/event-driven-architecture/src/main/java/com/iluwatar/eda/framework/Message.java b/event-driven-architecture/src/main/java/com/iluwatar/eda/framework/Event.java
similarity index 91%
rename from event-driven-architecture/src/main/java/com/iluwatar/eda/framework/Message.java
rename to event-driven-architecture/src/main/java/com/iluwatar/eda/framework/Event.java
index ee9c48965..c63d2746f 100644
--- a/event-driven-architecture/src/main/java/com/iluwatar/eda/framework/Message.java
+++ b/event-driven-architecture/src/main/java/com/iluwatar/eda/framework/Event.java
@@ -23,15 +23,15 @@
package com.iluwatar.eda.framework;
/**
- * A {@link Message} is an object with a specific type that is associated
+ * A {@link Event} is an object with a specific type that is associated
* to a specific {@link Handler}.
*/
-public interface Message {
+public interface Event {
/**
* Returns the message type as a {@link Class} object. In this example the message type is
* used to handle events by their type.
* @return the message type as a {@link Class}.
*/
- Class extends Message> getType();
+ Class extends Event> getType();
}
diff --git a/event-driven-architecture/src/main/java/com/iluwatar/eda/framework/EventDispatcher.java b/event-driven-architecture/src/main/java/com/iluwatar/eda/framework/EventDispatcher.java
index 69e2cf0e3..9f8e29315 100644
--- a/event-driven-architecture/src/main/java/com/iluwatar/eda/framework/EventDispatcher.java
+++ b/event-driven-architecture/src/main/java/com/iluwatar/eda/framework/EventDispatcher.java
@@ -22,19 +22,16 @@
*/
package com.iluwatar.eda.framework;
-import com.iluwatar.eda.event.Event;
-
import java.util.HashMap;
import java.util.Map;
/**
* Handles the routing of {@link Event} messages to associated handlers.
* A {@link HashMap} is used to store the association between events and their respective handlers.
- *
*/
public class EventDispatcher {
- private Map, Handler>> handlers;
+ private Map, Handler extends Event>> handlers;
public EventDispatcher() {
handlers = new HashMap<>();
@@ -46,8 +43,8 @@ public class EventDispatcher {
* @param eventType The {@link Event} to be registered
* @param handler The {@link Handler} that will be handling the {@link Event}
*/
- public void registerChannel(Class extends Event> eventType,
- Handler> handler) {
+ public void registerHandler(Class eventType,
+ Handler handler) {
handlers.put(eventType, handler);
}
@@ -56,8 +53,12 @@ public class EventDispatcher {
*
* @param event The {@link Event} to be dispatched
*/
- public void onEvent(Event event) {
- handlers.get(event.getClass()).onEvent(event);
+ @SuppressWarnings("unchecked")
+ public void dispatch(E event) {
+ Handler handler = (Handler) handlers.get(event.getClass());
+ if (handler != null) {
+ handler.onEvent(event);
+ }
}
}
\ No newline at end of file
diff --git a/event-driven-architecture/src/main/java/com/iluwatar/eda/framework/Handler.java b/event-driven-architecture/src/main/java/com/iluwatar/eda/framework/Handler.java
index 9c800a4d4..44bdab6dc 100644
--- a/event-driven-architecture/src/main/java/com/iluwatar/eda/framework/Handler.java
+++ b/event-driven-architecture/src/main/java/com/iluwatar/eda/framework/Handler.java
@@ -22,13 +22,11 @@
*/
package com.iluwatar.eda.framework;
-import com.iluwatar.eda.event.Event;
-
/**
* This interface can be implemented to handle different types of messages.
* Every handler is responsible for a single of type message
*/
-public interface Handler {
+public interface Handler {
/**
* The onEvent method should implement and handle behavior related to the event.
@@ -36,5 +34,5 @@ public interface Handler {
* a queue to be consumed by other sub systems.
* @param event the {@link Event} object to be handled.
*/
- void onEvent(Event event);
+ void onEvent(E event);
}
\ No newline at end of file
diff --git a/event-driven-architecture/src/main/java/com/iluwatar/eda/handler/UserCreatedEventHandler.java b/event-driven-architecture/src/main/java/com/iluwatar/eda/handler/UserCreatedEventHandler.java
index c51b3391a..3ef4e8255 100644
--- a/event-driven-architecture/src/main/java/com/iluwatar/eda/handler/UserCreatedEventHandler.java
+++ b/event-driven-architecture/src/main/java/com/iluwatar/eda/handler/UserCreatedEventHandler.java
@@ -22,7 +22,6 @@
*/
package com.iluwatar.eda.handler;
-import com.iluwatar.eda.event.Event;
import com.iluwatar.eda.event.UserCreatedEvent;
import com.iluwatar.eda.framework.Handler;
@@ -32,9 +31,10 @@ import com.iluwatar.eda.framework.Handler;
public class UserCreatedEventHandler implements Handler {
@Override
- public void onEvent(Event message) {
+ public void onEvent(UserCreatedEvent event) {
- UserCreatedEvent userCreatedEvent = (UserCreatedEvent) message;
- System.out.printf("User with %s has been Created!", userCreatedEvent.getUser().getUsername());
+ System.out.println(String.format(
+ "User '%s' has been Created!", event.getUser().getUsername()));
}
+
}
diff --git a/event-driven-architecture/src/main/java/com/iluwatar/eda/handler/UserUpdatedEventHandler.java b/event-driven-architecture/src/main/java/com/iluwatar/eda/handler/UserUpdatedEventHandler.java
index 5be4ab5cc..0311d5781 100644
--- a/event-driven-architecture/src/main/java/com/iluwatar/eda/handler/UserUpdatedEventHandler.java
+++ b/event-driven-architecture/src/main/java/com/iluwatar/eda/handler/UserUpdatedEventHandler.java
@@ -22,7 +22,6 @@
*/
package com.iluwatar.eda.handler;
-import com.iluwatar.eda.event.Event;
import com.iluwatar.eda.event.UserUpdatedEvent;
import com.iluwatar.eda.framework.Handler;
@@ -32,9 +31,9 @@ import com.iluwatar.eda.framework.Handler;
public class UserUpdatedEventHandler implements Handler {
@Override
- public void onEvent(Event message) {
+ public void onEvent(UserUpdatedEvent event) {
- UserUpdatedEvent userUpdatedEvent = (UserUpdatedEvent) message;
- System.out.printf("User with %s has been Updated!", userUpdatedEvent.getUser().getUsername());
+ System.out.println(String.format(
+ "User '%s' has been Updated!", event.getUser().getUsername()));
}
}
diff --git a/event-driven-architecture/src/test/java/com/iluwatar/eda/event/UserCreatedEventTest.java b/event-driven-architecture/src/test/java/com/iluwatar/eda/event/UserCreatedEventTest.java
index 754fac678..b9074faf2 100644
--- a/event-driven-architecture/src/test/java/com/iluwatar/eda/event/UserCreatedEventTest.java
+++ b/event-driven-architecture/src/test/java/com/iluwatar/eda/event/UserCreatedEventTest.java
@@ -29,13 +29,13 @@ import org.junit.Test;
import static org.junit.Assert.assertEquals;
/**
- * {@link UserCreatedEventTest} tests and verifies {@link Event} behaviour.
+ * {@link UserCreatedEventTest} tests and verifies {@link AbstractEvent} behaviour.
*/
public class UserCreatedEventTest {
/**
- * This unit test should correctly return the {@link Event} class type when calling the
- * {@link Event#getType() getType} method.
+ * This unit test should correctly return the {@link AbstractEvent} class type when calling the
+ * {@link AbstractEvent#getType() getType} method.
*/
@Test
public void testGetEventType() {
diff --git a/event-driven-architecture/src/test/java/com/iluwatar/eda/framework/EventDispatcherTest.java b/event-driven-architecture/src/test/java/com/iluwatar/eda/framework/EventDispatcherTest.java
index 8db315ff4..21956afec 100644
--- a/event-driven-architecture/src/test/java/com/iluwatar/eda/framework/EventDispatcherTest.java
+++ b/event-driven-architecture/src/test/java/com/iluwatar/eda/framework/EventDispatcherTest.java
@@ -22,7 +22,6 @@
*/
package com.iluwatar.eda.framework;
-import com.iluwatar.eda.framework.EventDispatcher;
import com.iluwatar.eda.event.UserCreatedEvent;
import com.iluwatar.eda.event.UserUpdatedEvent;
import com.iluwatar.eda.handler.UserCreatedEventHandler;
@@ -49,8 +48,8 @@ public class EventDispatcherTest {
EventDispatcher dispatcher = spy(new EventDispatcher());
UserCreatedEventHandler userCreatedEventHandler = spy(new UserCreatedEventHandler());
UserUpdatedEventHandler userUpdatedEventHandler = spy(new UserUpdatedEventHandler());
- dispatcher.registerChannel(UserCreatedEvent.class, userCreatedEventHandler);
- dispatcher.registerChannel(UserUpdatedEvent.class, userUpdatedEventHandler);
+ dispatcher.registerHandler(UserCreatedEvent.class, userCreatedEventHandler);
+ dispatcher.registerHandler(UserUpdatedEvent.class, userUpdatedEventHandler);
User user = new User("iluwatar");
@@ -58,15 +57,14 @@ public class EventDispatcherTest {
UserUpdatedEvent userUpdatedEvent = new UserUpdatedEvent(user);
//fire a userCreatedEvent and verify that userCreatedEventHandler has been invoked.
- dispatcher.onEvent(userCreatedEvent);
+ dispatcher.dispatch(userCreatedEvent);
verify(userCreatedEventHandler).onEvent(userCreatedEvent);
- verify(dispatcher).onEvent(userCreatedEvent);
+ verify(dispatcher).dispatch(userCreatedEvent);
//fire a userCreatedEvent and verify that userUpdatedEventHandler has been invoked.
- dispatcher.onEvent(userUpdatedEvent);
+ dispatcher.dispatch(userUpdatedEvent);
verify(userUpdatedEventHandler).onEvent(userUpdatedEvent);
- verify(dispatcher).onEvent(userUpdatedEvent);
+ verify(dispatcher).dispatch(userUpdatedEvent);
}
-
}