|
13 | 13 | import java.io.FileNotFoundException; |
14 | 14 | import java.io.IOException; |
15 | 15 | import java.io.InputStream; |
| 16 | +import java.lang.reflect.Method; |
| 17 | +import java.lang.reflect.Modifier; |
| 18 | +import java.lang.reflect.Parameter; |
16 | 19 | import java.net.HttpURLConnection; |
17 | 20 | import java.net.URL; |
18 | 21 | import java.text.SimpleDateFormat; |
@@ -170,6 +173,65 @@ public Map<String, ServerEventCallback> getNamedReceivers() { |
170 | 173 | } |
171 | 174 |
|
172 | 175 | public ServerEventsClient registerNamedReceiver(String name, Class<?> namedReceiverClass) { |
| 176 | + |
| 177 | + if (!IReceiver.class.isAssignableFrom(namedReceiverClass)) |
| 178 | + throw new IllegalArgumentException(namedReceiverClass.getSimpleName() + " must implement IReceiver"); |
| 179 | + |
| 180 | + namedReceivers.put(name, new ServerEventCallback() { |
| 181 | + @Override |
| 182 | + public void execute(ServerEventsClient client, ServerEventMessage msg) { |
| 183 | + try { |
| 184 | + IReceiver receiver = (IReceiver)resolver.TryResolve(namedReceiverClass); |
| 185 | + |
| 186 | + if (receiver instanceof ServerEventReceiver){ |
| 187 | + ServerEventReceiver injectReceiver = (ServerEventReceiver)receiver; |
| 188 | + injectReceiver.setClient(client); |
| 189 | + injectReceiver.setRequest(msg); |
| 190 | + } |
| 191 | + |
| 192 | + String target = msg.getTarget().replace("-",""); //css bg-image |
| 193 | + |
| 194 | + for (Method mi : namedReceiverClass.getDeclaredMethods()){ |
| 195 | + if (!Modifier.isPublic(mi.getModifiers()) || Modifier.isStatic(mi.getModifiers())) |
| 196 | + continue; |
| 197 | + if (mi.getParameterCount() != 1) |
| 198 | + continue; |
| 199 | + if ("equals".equals(mi.getName())) |
| 200 | + continue; |
| 201 | + |
| 202 | + Parameter[] args = mi.getParameters(); |
| 203 | + |
| 204 | + Class requestType = args[0].getType(); |
| 205 | + |
| 206 | + if (target.equals(requestType.getSimpleName())) { |
| 207 | + Object request = msg.getJson() != null |
| 208 | + ? JsonUtils.fromJson(msg.getJson(), requestType) |
| 209 | + : requestType.newInstance(); |
| 210 | + mi.invoke(receiver, request); |
| 211 | + return; |
| 212 | + } |
| 213 | + |
| 214 | + String actionName = mi.getName(); |
| 215 | + if (!target.equalsIgnoreCase(actionName) && actionName.startsWith("set")) |
| 216 | + actionName = actionName.substring(3); //= "set".length() |
| 217 | + |
| 218 | + if (target.equalsIgnoreCase(actionName)) { |
| 219 | + Object request = msg.getJson() != null |
| 220 | + ? JsonUtils.fromJson(msg.getJson(), requestType) |
| 221 | + : requestType.newInstance(); |
| 222 | + mi.invoke(receiver, request); |
| 223 | + return; |
| 224 | + } |
| 225 | + } |
| 226 | + |
| 227 | + receiver.noSuchMethod(msg.getTarget(), msg); |
| 228 | + |
| 229 | + } catch (Exception e) { |
| 230 | + throw new RuntimeException(e); |
| 231 | + } |
| 232 | + } |
| 233 | + }); |
| 234 | + |
173 | 235 | return this; |
174 | 236 | } |
175 | 237 |
|
|
0 commit comments