package ws.wamplay.models;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import com.fasterxml.jackson.databind.JsonNode;
import play.Logger;
import play.Logger.ALogger;
import play.libs.Json;
import ws.wamplay.annotations.onRPC;
import ws.wamplay.callbacks.RPCCallback;
import ws.wamplay.controllers.WAMPlayContoller;
public class RPC {
static ALogger log = Logger.of(RPC.class.getSimpleName());
static ConcurrentMap<String, RPCCallback> procURIs = new ConcurrentHashMap<String, RPCCallback>();
public static void addController(String prefix, final WAMPlayContoller controller) {
for (final Method method : controller.getClass().getMethods()) {
if (method.isAnnotationPresent(onRPC.class)) {
String procURI = prefix
+ method.getAnnotation(onRPC.class).value();
procURIs.put(procURI, new RPCCallback() {
@Override
public JsonNode call(String sessionID, JsonNode... args) throws Throwable {
try {
if (args.length == 0) {
log.debug("No RPC arguments!");
return Json.toJson(method.invoke(controller, sessionID));
}
return Json.toJson(method.invoke(controller, sessionID, args));
} catch (InvocationTargetException e) {
throw e.getCause();
}
}
});
}
}
}
public static void addCallback(String procURI, RPCCallback cb) {
procURIs.put(procURI, cb);
}
public static RPCCallback getCallback(String procURI) {
return procURIs.get(procURI);
}
public static void reset() {
procURIs.clear();
}
}