1
2
3
4
5
6
7
8 /
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 public class DefaultEventWhiteboard implements EventWhiteboard
52 {
53 /*** The logger. */
54 private Logger logger;
55
56 /***
57 * The Map Listener interface -> ( Map trigger object -> Set of Listeners )
58 */
59 private Map<Class,Map<Object,Map>> interfaceMap = new HashMap<Class,Map<Object,Map>>();
60
61 /*** Created proxies for <code>Remote</code> objects. */
62 private Map<Remote,Map<Class,Object>> proxies = new WeakHashMap<Remote,Map<Class,Object>>();
63
64 /*** The EventWhiteboardFactory */
65 private EventWhiteboardFactory eventSystem;
66
67
68
69 /***
70 * Crates an EventWhiteboard instance.
71 *
72 * @param eventSystem the event system component.
73 * @param logger the logger.
74 */
75 public DefaultEventWhiteboard(EventWhiteboardFactory eventSystem, Logger logger)
76 {
77 this.logger = logger;
78 this.eventSystem = eventSystem;
79 }
80
81 /***
82 * {@inheritDoc}
83 */
84 public synchronized void addListener(Class iface, Object listener, Object object)
85 throws IllegalArgumentException
86 {
87 if (!iface.isInterface())
88 {
89 throw new IllegalArgumentException(iface.getName() + " is not an interface type");
90 }
91 if (!iface.isInstance(listener))
92 {
93 throw new IllegalArgumentException("Handler class " + listener.getClass().getName() +
94 " does not implement " + iface.getName());
95 }
96 Map<Object,Map> triggerMap = interfaceMap.get(iface);
97 if (triggerMap == null)
98 {
99 triggerMap = new WeakHashMap<Object,Map>();
100 interfaceMap.put(iface, triggerMap);
101 }
102 Map handlers = triggerMap.get(object);
103 if (handlers == null)
104 {
105 handlers = new WeakHashMap();
106 triggerMap.put(object, handlers);
107 }
108 handlers.put(listener, null);
109 }
110
111 /***
112 * {@inheritDoc}
113 */
114 public synchronized void removeListener(Class iface, Object listener, Object object)
115 {
116 Map triggerMap = (Map)interfaceMap.get(iface);
117 if (triggerMap != null)
118 {
119 Map handlers = (Map)triggerMap.get(object);
120 if (handlers != null)
121 {
122 handlers.remove(listener);
123 }
124 }
125 }
126
127 /***
128 * {@inheritDoc}
129 */
130 public synchronized void addRemoteListener(Class iface, Remote listener, Object object)
131 throws IllegalArgumentException
132 {
133 InvocationHandler handler = new RemoteInvocationHandler(iface, listener);
134 Object proxy = Proxy.newProxyInstance(this.getClass().getClassLoader(),
135 new Class[] { iface }, handler);
136 Map<Class,Object> ifMap = proxies.get(listener);
137 if(ifMap == null)
138 {
139 ifMap = new HashMap<Class,Object>();
140 proxies.put(listener, ifMap);
141 }
142 ifMap.put(iface, proxy);
143 addListener(iface, proxy, object);
144 }
145
146 /***
147 * {@inheritDoc}
148 */
149 public synchronized void removeRemoteListener(Class iface, Remote listener, Object object)
150 {
151 Map ifMap = (Map)proxies.get(listener);
152 if(ifMap != null)
153 {
154 Object proxy = ifMap.get(iface);
155 if(proxy != null)
156 {
157 removeListener(iface, proxy, object);
158 }
159 }
160 }
161
162 /***
163 * {@inheritDoc}
164 */
165 public void fireEvent(Method method, Object[] args, Object object)
166 {
167 if(eventSystem.isAsynchronous())
168 {
169 eventSystem.enqueueEvent(this, method, args, object);
170 }
171 else
172 {
173 dispatchEvent(method, args, object);
174 }
175 }
176
177 void dispatchEvent(Method method, Object[] args, Object object)
178 {
179 Class iface = method.getDeclaringClass();
180 Set currentHandlers = null;
181 synchronized(this)
182 {
183 Map<Object,Map> triggerMap = interfaceMap.get(iface);
184 if(triggerMap != null)
185 {
186 Map handlers = triggerMap.get(object);
187 if(handlers != null)
188 {
189 currentHandlers = new HashSet(handlers.keySet());
190 }
191 }
192 }
193 if(currentHandlers != null)
194 {
195 Iterator i = currentHandlers.iterator();
196 while(i.hasNext())
197 {
198 Object handler = i.next();
199 try
200 {
201 method.invoke(handler, args);
202 }
203 catch(ThreadDeath t)
204 {
205 throw t;
206 }
207 catch(VirtualMachineError t)
208 {
209 throw t;
210 }
211 catch(InvocationTargetException e)
212 {
213 logger.error("Failed to invoke handler", e.getTargetException());
214 }
215 catch(Throwable t)
216 {
217 logger.error("Failed to invoke handler", t);
218 }
219 }
220 }
221 }
222 }