package org.fluxtream.core.services.impl;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.fluxtream.core.domain.Event;
import org.fluxtream.core.events.EventListener;
import org.fluxtream.core.services.EventListenerService;
import org.fluxtream.core.aspects.FlxLogger;
import org.codehaus.plexus.util.ExceptionUtils;
import org.springframework.stereotype.Service;
/**
*
* @author Candide Kemmler (candide@fluxtream.com)
*/
@Service
public class EventListenerServiceImpl implements EventListenerService {
private final FlxLogger logger = FlxLogger.getLogger(EventListenerServiceImpl.class);
Map<String, List<EventListener>> listeners =
new Hashtable<String,List<EventListener>>();
@Override
public <T extends Event> void addEventListener(final Class<T> eventClass, final EventListener<T> listener) {
StringBuilder sb = new StringBuilder("module=events component=EventListenerServiceImpl action=addEventListener");
if (eventClass!=null)
sb.append(" eventClass=" + eventClass.toString());
if (listener!=null)
sb.append(" listener=" + listener.toString());
logger.info(sb.toString());
if (listeners.get(eventClass.getName())==null) {
listeners.put(eventClass.getName(), new Vector<EventListener>());
}
sb = new StringBuilder("module=events component=EventListenerServiceImpl action=addEventListener");
if (!listeners.get(eventClass.getName()).contains(listener)) {
logger.info(sb.append(" message=\"adding listener " + listener.toString() + "\"").toString());
listeners.get(eventClass.getName()).add(listener);
} else {
logger.warn(sb.append(" message=\"preventing duplicate listener registration\"").toString());
}
}
@Override
public void fireEvent(final Event event) {
StringBuilder msgAtts = new StringBuilder("module=events component=EventListenerServiceImpl action=fireEvent");
try {
StringBuilder sb = new StringBuilder(msgAtts);
if (event!=null) sb.append(" event=").append(event.toString());
logger.info(sb.toString());
List<EventListener> eventListeners = listeners.get(event.getClass().getName());
if (eventListeners!=null) {
for (EventListener eventListener : eventListeners) {
eventListener.handleEvent(event);
}
} else {
logger.info(new StringBuffer(msgAtts)
.append(" message=\"No Event Listeners were registered for events of type ")
.append(event.getClass())
.append("\"").toString());
}
} catch (Throwable t) {
logger.warn(new StringBuffer(msgAtts)
.append(" message=\"Error firing event\"")
.append(" stackTrace=<![CDATA[" + ExceptionUtils.getStackTrace(t))
.append("]]>").toString());
}
}
}