1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.xnap.plugin.overnet.net.msg;
22
23 import java.util.Collections;
24 import java.util.Hashtable;
25 import java.util.LinkedList;
26 import java.util.List;
27
28 import org.xnap.plugin.overnet.net.msg.core.MessageListener;
29
30 public class MessageHandler
31 {
32
33
34
35
36
37 /***
38 * Maps message types to <code>MessageListener</code> objects.
39 */
40 private Hashtable listeners = new Hashtable();
41
42 public MessageHandler()
43 {
44 }
45
46
47
48
49 /***
50 * Handles message itself first and then sends it to all listeners. A
51 * listener can consume the message to prevent other listeners from
52 * getting it.
53 */
54 public void handle(OvernetMessage msg)
55 {
56 msg.receive();
57
58 Object[] listeners = getListeners(msg.type).toArray();
59 for (int i = 0; i < listeners.length; i++) {
60 ((MessageListener)listeners[i]).messageReceived(msg);
61 }
62 }
63
64 public void subscribe(byte type, MessageListener listener)
65 {
66 getListeners(type).add(listener);
67 }
68
69 public void unsubscribe(byte type, MessageListener listener)
70 {
71 getListeners(type).remove(listener);
72 }
73
74 private synchronized List getListeners(byte type)
75 {
76 List list = (List)listeners.get(new Byte(type));
77
78 if (list == null) {
79 list = Collections.synchronizedList(new LinkedList());
80 listeners.put(new Byte(type), list);
81 }
82 return list;
83 }
84 }