package com.github.atemerev.pms.listeners; import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; /** * A delegate class for broadcasting message events to multiple listeners. * All implementations of MessageListenersAware interface should usually use * this delegate for actual implementation of events broadcasting. * This is a "poor-man JMS" publish/subscribe model, if you like it this way. * <p/> * This delegate implementation is (finally hoped to be) thread-safe. * * @author Alexander Temerev * @version $Id:$ */ public class MessageListenerDelegate implements MessageListener, HasMessageListeners { private final List<MessageListener> listeners = new CopyOnWriteArrayList<MessageListener>(); /** * Broadcast received message to registered listeners. If no listerers are * registered yet, do nothing. * * @param message Message to broadcast. */ @Override public void processMessage(Object message) { synchronized (listeners) { if (listeners.size() > 0) { ListIterator<MessageListener> i = listeners.listIterator(listeners.size()); while (i.hasPrevious()) { i.previous().processMessage(message); } } } } /** * Get attached listeners list. * * @return Linked list of attached message listeners. */ @Override public List<MessageListener> listeners() { return this.listeners; } /** * Set the list of listeners to already supplied argument. This is useful * for Spring integration. * * @param listeners List of message listeners. */ public synchronized void setListeners(List<MessageListener> listeners) { List<MessageListener> reversed = new ArrayList<MessageListener>(listeners); Collections.reverse(reversed); this.listeners.addAll(reversed); } }