package org.toop.eventbus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; /** * Thread-safe registry for storing events and tracking readiness of event types. */ public class EventRegistry { private static final Logger logger = LogManager.getLogger(EventRegistry.class); private static final Map, CopyOnWriteArrayList>> eventHistory = new ConcurrentHashMap<>(); private static final Map, Boolean> readyStates = new ConcurrentHashMap<>(); /** * Stores an event in the registry. Safe for concurrent use. */ public static void storeEvent(EventMeta eventMeta) { logger.info("Storing event: {}", eventMeta.toString()); eventHistory .computeIfAbsent(eventMeta.getType(), k -> new CopyOnWriteArrayList<>()) .add(new EventEntry<>(eventMeta)); } /** * Marks a specific event type as ready (safe to post). */ public static void markReady(Class type) { logger.info("Marking event as ready: {}", type.toString()); readyStates.put(type, true); } /** * Marks a specific event type as not ready (posting will fail). */ public static void markNotReady(Class type) { logger.info("Marking event as not ready: {}", type.toString()); readyStates.put(type, false); } /** * Returns true if this event type is marked ready. */ public static boolean isReady(Class type) { return readyStates.getOrDefault(type, false); } /** * Gets all stored events of a given type. */ @SuppressWarnings("unchecked") public static List> getEvents(Class type) { return (List>) (List) eventHistory .getOrDefault(type, new CopyOnWriteArrayList<>()); } /** * Gets the most recent event of a given type, or null if none exist. */ @SuppressWarnings("unchecked") public static EventEntry getLastEvent(Class type) { List> entries = eventHistory.get(type); if (entries == null || entries.isEmpty()) { return null; } return (EventEntry) entries.getLast(); } /** * Clears the stored events for a given type. */ public static void clearEvents(Class type) { logger.info("Clearing events: {}", type.toString()); eventHistory.remove(type); } /** * Clears all events and resets readiness. */ public static void reset() { logger.info("Resetting event registry events"); eventHistory.clear(); readyStates.clear(); } /** * Wrapper for stored events, with a ready flag for per-event state. */ public static class EventEntry { private final T event; private volatile boolean ready = false; public EventEntry(T event) { this.event = event; } public T getEvent() { return event; } public boolean isReady() { return ready; } public void setReady(boolean ready) { this.ready = ready; } @Override public String toString() { return "EventEntry{" + "event=" + event + ", ready=" + ready + '}'; } } }