-
Notifications
You must be signed in to change notification settings - Fork 89
Expand file tree
/
Copy pathDispatcher.java
More file actions
145 lines (118 loc) · 4.2 KB
/
Dispatcher.java
File metadata and controls
145 lines (118 loc) · 4.2 KB
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package nodebox.node;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class Dispatcher {
public static class Receiver {
private Object object;
private Method method;
private String signal;
private Object sender;
public Receiver(Object object, Method method, String signal, Object sender) {
this.object = object;
this.method = method;
this.signal = signal;
this.sender = sender;
}
public Object getObject() {
return object;
}
public Method getMethod() {
return method;
}
public String getSignal() {
return signal;
}
public Object getSender() {
return sender;
}
public void send() {
try {
method.invoke(object);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//// Instance attributes ////
private static List<Receiver> receivers = new ArrayList<Receiver>();
public static void removeAllReceivers() {
receivers.clear();
}
public static boolean connect(Object object, String methodName, String signal) {
return connect(object, methodName, signal, null);
}
public static boolean connect(Object object, String methodName, String signal, Object sender) {
Method m;
try {
m = object.getClass().getMethod(methodName);
} catch (NoSuchMethodException e) {
e.printStackTrace();
return false;
}
return connect(object, m, signal, sender);
}
public static boolean connect(Object object, Method method, String signal) {
return connect(object, method, signal, null);
}
public static boolean connect(Object object, Method method, String signal, Object sender) {
Receiver r = new Receiver(object, method, signal, sender);
if (getReceiver(object, method, signal, sender) != null) return false;
return receivers.add(r);
}
public static boolean disconnect(Object object, String methodName, String signal) {
return disconnect(object, methodName, signal, null);
}
public static boolean disconnect(Object object, String methodName, String signal, Object sender) {
Method m;
try {
m = object.getClass().getMethod(methodName);
} catch (NoSuchMethodException e) {
e.printStackTrace();
return false;
}
return disconnect(object, m, signal, sender);
}
public static boolean disconnect(Object object, Method method, String signal) {
return disconnect(object, method, signal, null);
}
public static boolean disconnect(Object object, Method method, String signal, Object sender) {
Receiver r = getReceiver(object, method, signal, sender);
if (r == null) return false;
return receivers.remove(r);
}
public static Receiver getReceiver(Object object, Method method, String signal, Object sender) {
for (Receiver r : receivers) {
if (r.getObject() == object
&& r.method.equals(method)
&& r.getSignal().equals(signal)
&& (r.getSender() == null || r.getSender() == sender))
return r;
}
return null;
}
public static List<Receiver> getReceivers(String signal) {
return getReceivers(signal, null);
}
public static List<Receiver> getReceivers(String signal, Object sender) {
List<Receiver> tmp = new ArrayList<Receiver>();
for (Receiver r : receivers) {
if (r.getSignal().equals(signal) && (r.getSender() == null || r.getSender() == sender)) {
tmp.add(r);
}
}
return tmp;
}
public static void send(String signal) {
List<Receiver> tmp = getReceivers(signal);
for (Receiver r : tmp) {
r.send();
}
}
public static void send(String signal, Object sender) {
List<Receiver> tmp = getReceivers(signal, sender);
for (Receiver r : tmp) {
r.send();
}
}
}