/* This code is part of Freenet. It is distributed under the GNU General * Public License, version 2 (or at your option any later version). See * http://www.gnu.org/ for further details of the GPL. */ package freenet.client.events; import java.io.Serializable; import java.util.ArrayList; import freenet.client.async.ClientContext; /** * Event handeling for clients. SimpleEventProducer is a simple * ClientEventProducer implementation that can be used for others. * * @author oskar **/ public class SimpleEventProducer implements ClientEventProducer, Serializable { private static final long serialVersionUID = 1L; private ArrayList<ClientEventListener> listeners; /** * Create a new SimpleEventProducer * **/ public SimpleEventProducer() { listeners = new ArrayList<ClientEventListener>(); } /** Create a new SimpleEventProducer with the given listeners. */ public SimpleEventProducer(ClientEventListener[] cela) { this(); for (int i = 0; i < cela.length; i++) addEventListener(cela[i]); } @Override public synchronized void addEventListener(ClientEventListener cel) { if (cel != null) listeners.add(cel); else throw new IllegalArgumentException("Adding a null listener!"); } @Override public synchronized boolean removeEventListener(ClientEventListener cel) { boolean b = listeners.remove(cel); listeners.trimToSize(); return b; } /** * Sends the ClientEvent to all registered listeners of this object. * * Please do not change SimpleEventProducer to always produce events off-thread, it * is better to run the client layer method that produces the event off-thread, because events * could be re-ordered, which matters for some events notably SimpleProgressEvent. * See e.g. ClientGetter.innerNotifyClients()), **/ @Override public void produceEvent(ClientEvent ce, ClientContext context) { // Events are relatively uncommon. Consistency more important than speed. ClientEventListener[] list; synchronized(this) { list = getEventListeners(); } for (ClientEventListener cel : list) { try { cel.receive(ce, context); } catch (Exception ue) { System.err.println("---Unexpected Exception------------------"); ue.printStackTrace(); System.err.println("-----------------------------------------"); } } } /** Returns the listeners as an array. */ public synchronized ClientEventListener[] getEventListeners() { ClientEventListener[] ret = new ClientEventListener[listeners.size()]; return listeners.toArray(ret); } /** Adds all listeners in the given array. */ public synchronized void addEventListeners(ClientEventListener[] cela) { for (int i = 0; i < cela.length; i++) addEventListener(cela[i]); } }