package com.vladmihalcea.flexypool.event;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <code>EventPublisher</code> - This class associates events to their listeners
*
* @author Vlad Mihalcea
* @since 1.2.3
*/
public class EventPublisher {
/**
* Create a new {@link EventPublisher} instance using the current configured listeners
*
* @param eventListenerResolver event listener resolver
* @return {@link EventPublisher}
*/
public static EventPublisher newInstance(EventListenerResolver eventListenerResolver) {
List<? extends EventListener<? extends Event>> eventListeners = eventListenerResolver != null ?
eventListenerResolver.resolveListeners() : null;
return eventListeners != null && !eventListeners.isEmpty() ?
new EventPublisher(eventListeners) :
new EventPublisher();
}
private Map<Class<? extends Event>, EventListener<? extends Event>> eventListenerMap =
new HashMap<Class<? extends Event>, EventListener<? extends Event>>();
/**
* Init constructor
*
* @param eventListeners event listeners
*/
public EventPublisher(List<? extends EventListener<? extends Event>> eventListeners) {
for (EventListener<? extends Event> eventListener : eventListeners) {
Class<? extends Event> eventClass = eventListener.listensTo();
eventListenerMap.put(eventClass, eventListener);
}
}
/**
* Init constructor
*/
protected EventPublisher() {
this(new ArrayList<EventListener<? extends Event>>(0));
}
/**
* Publish an {@link Event} to all listeners
*
* @param event event
*/
public <E extends Event> void publish(E event) {
if (!eventListenerMap.isEmpty()) {
EventListener<E> eventListener = getEventListener(event);
if (eventListener != null) {
eventListener.on(event);
}
}
}
/**
* Get associated {@link EventListener}
*
* @param event event
* @param <E> event type
* @return associated {@link EventListener}
*/
private <E extends Event> EventListener<E> getEventListener(E event) {
@SuppressWarnings("unchecked")
EventListener<E> eventListener = (EventListener<E>) eventListenerMap.get(event.getClass());
return eventListener;
}
}