1 31 package org.blojsom.event; 32 33 import org.apache.commons.logging.Log; 34 import org.apache.commons.logging.LogFactory; 35 36 import java.util.*; 37 38 53 public class SimpleEventBroadcaster implements EventBroadcaster { 54 55 private Log _logger = LogFactory.getLog(SimpleEventBroadcaster.class); 56 57 private static Set _listeners; 58 private static Map _listenerToHandler; 59 60 63 public SimpleEventBroadcaster() { 64 if (_listeners == null) { 65 _listeners = new HashSet(); 66 } else { 67 if (_logger.isDebugEnabled()) { 69 _logger.debug("Using shared listeners map"); 70 } 71 } 72 73 if (_listenerToHandler == null) { 74 _listenerToHandler = new HashMap(); 75 } else { 76 if (_logger.isDebugEnabled()) { 78 _logger.debug("Using shared listener to handler map"); 79 } 80 } 81 82 if (_logger.isDebugEnabled()) { 83 _logger.debug("Initialized simple event broadcaster"); 84 } 85 } 86 87 92 public void addListener(Listener listener) { 93 EventHandler handler = new EventHandler(listener, new Filter() { 94 100 public boolean processEvent(Event event) { 101 return true; 102 } 103 }); 104 105 if (!_listenerToHandler.containsKey(listener.getClass().getName())) { 106 _listeners.add(handler); 107 _listenerToHandler.put(listener.getClass().getName(), handler); 108 if (_logger.isDebugEnabled()) { 109 _logger.debug("Added event listener: " + listener.getClass().getName() + " with process all events filter"); 110 } 111 } 112 } 113 114 121 public void addListener(Listener listener, Filter filter) { 122 EventHandler handler = new EventHandler(listener, filter); 123 124 if (!_listenerToHandler.containsKey(listener.getClass().getName())) { 125 _listeners.add(handler); 126 _listenerToHandler.put(listener.getClass().getName(), handler); 127 if (_logger.isDebugEnabled()) { 128 _logger.debug("Added event listener: " + listener.getClass().getName() + " with filter: " + filter.getClass().getName()); 129 } 130 } 131 } 132 133 138 public void removeListener(Listener listener) { 139 if (_listenerToHandler.containsKey(listener.getClass().getName())) { 140 EventHandler handler = (EventHandler) _listenerToHandler.get(listener.getClass().getName()); 141 _listeners.remove(handler); 142 _listenerToHandler.remove(listener.getClass().getName()); 143 } 144 145 if (_logger.isDebugEnabled()) { 146 _logger.debug("Removed event listener: " + listener.getClass().getName()); 147 } 148 } 149 150 155 public void broadcastEvent(Event event) { 156 Thread eventBroadcaster = new Thread (new AsynchronousEventBroadcaster(event)); 157 eventBroadcaster.setDaemon(true); 158 eventBroadcaster.start(); 159 } 160 161 166 public void processEvent(Event event) { 167 Iterator handlerIterator = _listeners.iterator(); 168 while (handlerIterator.hasNext()) { 169 EventHandler eventHandler = (EventHandler) handlerIterator.next(); 170 if (eventHandler._filter.processEvent(event)) { 171 eventHandler._listener.processEvent(event); 172 } 173 } 174 } 175 176 179 protected class EventHandler { 180 181 protected Listener _listener; 182 protected Filter _filter; 183 184 190 protected EventHandler(Listener listener, Filter filter) { 191 _listener = listener; 192 _filter = filter; 193 } 194 } 195 196 199 private class AsynchronousEventBroadcaster implements Runnable { 200 201 private Event _event; 202 203 public AsynchronousEventBroadcaster(Event event) { 204 _event = event; 205 } 206 207 212 public void run() { 213 Iterator handlerIterator = _listeners.iterator(); 214 while (handlerIterator.hasNext()) { 215 EventHandler eventHandler = (EventHandler) handlerIterator.next(); 216 if (eventHandler._filter.processEvent(_event)) { 217 eventHandler._listener.handleEvent(_event); 218 } 219 } 220 } 221 } 222 } | Popular Tags |