Skip to content

Commit cd0c8df

Browse files
committed
Implement registerNamedReceiver
1 parent f44ca06 commit cd0c8df

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

src/AndroidClient/client/src/main/java/net/servicestack/client/sse/ServerEventsClient.java

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
import java.io.FileNotFoundException;
1414
import java.io.IOException;
1515
import java.io.InputStream;
16+
import java.lang.reflect.Method;
17+
import java.lang.reflect.Modifier;
18+
import java.lang.reflect.Parameter;
1619
import java.net.HttpURLConnection;
1720
import java.net.URL;
1821
import java.text.SimpleDateFormat;
@@ -170,6 +173,65 @@ public Map<String, ServerEventCallback> getNamedReceivers() {
170173
}
171174

172175
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+
173235
return this;
174236
}
175237

0 commit comments

Comments
 (0)