From d63b9ba21fbff9c7781478d9e247bc464782f58c Mon Sep 17 00:00:00 2001 From: = Date: Fri, 24 Apr 2026 13:46:58 +0200 Subject: [PATCH] Feat: Implemented a pub/sub design --- .../g40/mappe/service/event/EventData.java | 13 +++++ .../g40/mappe/service/event/EventManager.java | 57 +++++++++++++++++++ .../mappe/service/event/EventPublisher.java | 20 +++++++ .../mappe/service/event/EventSubscriber.java | 18 ++++++ .../g40/mappe/service/event/EventType.java | 38 +++++++++++++ 5 files changed, 146 insertions(+) create mode 100644 src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventData.java create mode 100644 src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventManager.java create mode 100644 src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventPublisher.java create mode 100644 src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventSubscriber.java create mode 100644 src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventType.java diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventData.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventData.java new file mode 100644 index 0000000..70465f6 --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventData.java @@ -0,0 +1,13 @@ +package edu.ntnu.idi.idatt2003.g40.mappe.service.event; + +/** + * Data object sent through the event system by the {@link EventManager}. + * + * @param the type of data this object represents. + * @param eventType the event type this object represents. + * @param data the data this object contains. + * + */ +public record EventData(EventType eventType, T data) { + +} diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventManager.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventManager.java new file mode 100644 index 0000000..a2bf1b5 --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventManager.java @@ -0,0 +1,57 @@ +package edu.ntnu.idi.idatt2003.g40.mappe.service.event; + +import java.util.ArrayList; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; + +/** + * Event broker in the pub/sub model. + * + *

Read more about pub/sub + * + * Here + * + *

+ * + * @see EventSubscriber + * @see EventPublisher + * + */ +public final class EventManager { + + /** + * Map where key is {@link EventType} and value is list of {@link EventSubscriber} objects. + * + *

Used to identify which subscribers to fire the event towards.

+ * + */ + private final Map> subscriberMap = + new EnumMap<>(EventType.class); + + /** + * Method for adding a subscriber to the subscriber map given an event type. + * + * @param subscriber the {@link EventSubscriber} object to add. + * @param eventType the {@link EventType} this subscriber should subscribe to. + * + * + */ + public void addSubscriber(final EventSubscriber subscriber, final EventType eventType) { + subscriberMap.computeIfAbsent(eventType, k -> new ArrayList<>()).add(subscriber); + } + + /** + * Method for invoking event to all subscriber of that type. + * + * @param the type of event data to send. + * @param data the data to send. + * + * + */ + public void invokeEvent(final EventData data) { + for (EventSubscriber e : subscriberMap.get(data.eventType())) { + e.handleEvent(data); + } + } +} diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventPublisher.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventPublisher.java new file mode 100644 index 0000000..a26b85c --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventPublisher.java @@ -0,0 +1,20 @@ +package edu.ntnu.idi.idatt2003.g40.mappe.service.event; + +/** + * Interface representing a publisher in the pub/sub model (observer pattern). + * + * @see EventManager + * @see EventSubscriber + */ +public interface EventPublisher { + + /** + * Method for triggering (invoking) the event. + * + * @param the type of event data to invoke. + * @param data the data to invoke. + * @param eventManager the {@link EventManager} object to use as broker when invoking event. + */ + void invoke(EventData data, EventManager eventManager); +} + diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventSubscriber.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventSubscriber.java new file mode 100644 index 0000000..69645d7 --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventSubscriber.java @@ -0,0 +1,18 @@ +package edu.ntnu.idi.idatt2003.g40.mappe.service.event; + +/** + * Interface representing a subscriber in a pub/sub model. + * + * @see EventManager + * @see EventSubscriber + */ +public interface EventSubscriber { + + /** + * Method for handling the event subscribed to. + * + * @param the type of event data to handle. + * @param data the actual data to handle. + */ + void handleEvent(EventData data); +} diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventType.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventType.java new file mode 100644 index 0000000..52a60b9 --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/event/EventType.java @@ -0,0 +1,38 @@ +package edu.ntnu.idi.idatt2003.g40.mappe.service.event; + +/** + * Enum representing different event types. + * + *

Examples:

+ *
    + *
  • Scene changes
  • + *
  • Database operations
  • + *
  • Other
  • + *
+ * + * + */ +public enum EventType { + + /** + * Event type representing events that causes the current scene to change. + * + *

Primarily handled by the active + * {@link edu.ntnu.idi.idatt2003.g40.mappe.view.ViewManager} object.

+ * + * @see edu.ntnu.idi.idatt2003.g40.mappe.view.ViewManager + * + */ + SCENE_CHANGE, + + /** + * Event type representing events that causes the scene to change to the previous one. + * + *

Primarily handled by the active + * {@link edu.ntnu.idi.idatt2003.g40.mappe.view.ViewManager} object.

+ * + * @see edu.ntnu.idi.idatt2003.g40.mappe.view.ViewManager + * + */ + SCENE_BACK, +}