package pctelelog; import io.netty.channel.socket.DatagramChannel; import java.util.concurrent.CopyOnWriteArrayList; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import pctelelog.events.AbstractEvent; import pctelelog.events.HeartBeatEvent; public class EventOperator { private Logger logger = LogManager.getLogger(EventOperator.class); private static final EventOperator instance = new EventOperator(); private CopyOnWriteArrayList<EventListener> m_listeners = new CopyOnWriteArrayList<EventListener>(); private DatagramChannel m_multi = null; /* Shutdown flag is used to keep the * operator from dispatching events when shutting down. * Not catching this will cause the server to spend 5-10sec * longer shutting down rather than immediately. */ private boolean isShutdown = false; public static EventOperator instance() { return instance; } /** * Add/Register the event listener to receive events. * @param listener An event listener to add * @return True if the listener was added. False if it was not (ie: Already added). */ public boolean addEventListener(EventListener listener) { if(m_listeners.addIfAbsent(listener)) { logger.info("Event Listener added"); return true; } return false; } /** * Remove/Unregister the event listener from the pool * @param listener An event listener to remove * @return True if a listener was removed. False if it was not (ie: Not present). */ public boolean removeEventListener(EventListener listener) { if(m_listeners.remove(listener)) { logger.info("Event Listener removed."); return true; } return false; } public void setMultiCast(DatagramChannel ch) { m_multi = ch; } protected void onEvent(AbstractEvent event, boolean sendMulti) { if(event == null) { return; } else if(event instanceof HeartBeatEvent) { return; } if(sendMulti && m_multi != null) { // Relay to multicast m_multi.writeAndFlush(event); } dispatchEvent(event); } private void dispatchEvent(AbstractEvent event) { if(isShutdown) return; if(event != null) { for(EventListener listener : m_listeners) { listener.onEvent(event); } } } }