You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

RpcManager.java 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*
  2. @VaadinApache2LicenseForJavaFiles@
  3. */
  4. package com.vaadin.terminal.gwt.client.communication;
  5. import java.util.Collection;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8. import com.google.gwt.core.client.GWT;
  9. import com.google.gwt.json.client.JSONArray;
  10. import com.google.gwt.json.client.JSONString;
  11. import com.vaadin.shared.communication.ClientRpc;
  12. import com.vaadin.shared.communication.MethodInvocation;
  13. import com.vaadin.terminal.gwt.client.ApplicationConnection;
  14. import com.vaadin.terminal.gwt.client.ConnectorMap;
  15. import com.vaadin.terminal.gwt.client.ServerConnector;
  16. import com.vaadin.terminal.gwt.client.VConsole;
  17. /**
  18. * Client side RPC manager that can invoke methods based on RPC calls received
  19. * from the server.
  20. *
  21. * A GWT generator is used to create an implementation of this class at
  22. * run-time.
  23. *
  24. * @since 7.0
  25. */
  26. public class RpcManager {
  27. private final Map<String, RpcMethod> methodMap = new HashMap<String, RpcMethod>();
  28. public RpcManager() {
  29. GeneratedRpcMethodProvider provider = GWT
  30. .create(GeneratedRpcMethodProvider.class);
  31. Collection<RpcMethod> methods = provider.getGeneratedRpcMethods();
  32. for (RpcMethod rpcMethod : methods) {
  33. methodMap.put(
  34. rpcMethod.getInterfaceName() + "."
  35. + rpcMethod.getMethodName(), rpcMethod);
  36. }
  37. }
  38. /**
  39. * Perform server to client RPC invocation.
  40. *
  41. * @param invocation
  42. * method to invoke
  43. */
  44. public void applyInvocation(MethodInvocation invocation,
  45. ServerConnector connector) {
  46. String signature = getSignature(invocation);
  47. RpcMethod rpcMethod = getRpcMethod(signature);
  48. Collection<ClientRpc> implementations = connector
  49. .getRpcImplementations(invocation.getInterfaceName());
  50. for (ClientRpc clientRpc : implementations) {
  51. rpcMethod.applyInvocation(clientRpc, invocation.getParameters());
  52. }
  53. }
  54. private RpcMethod getRpcMethod(String signature) {
  55. RpcMethod rpcMethod = methodMap.get(signature);
  56. if (rpcMethod == null) {
  57. throw new IllegalStateException("There is no information about "
  58. + signature
  59. + ". Did you remember to compile the right widgetset?");
  60. }
  61. return rpcMethod;
  62. }
  63. private static String getSignature(MethodInvocation invocation) {
  64. return invocation.getInterfaceName() + "." + invocation.getMethodName();
  65. }
  66. public Type[] getParameterTypes(MethodInvocation invocation) {
  67. return getRpcMethod(getSignature(invocation)).getParameterTypes();
  68. }
  69. public void parseAndApplyInvocation(JSONArray rpcCall,
  70. ApplicationConnection connection) {
  71. ConnectorMap connectorMap = ConnectorMap.get(connection);
  72. String connectorId = ((JSONString) rpcCall.get(0)).stringValue();
  73. String interfaceName = ((JSONString) rpcCall.get(1)).stringValue();
  74. String methodName = ((JSONString) rpcCall.get(2)).stringValue();
  75. JSONArray parametersJson = (JSONArray) rpcCall.get(3);
  76. ServerConnector connector = connectorMap.getConnector(connectorId);
  77. MethodInvocation invocation = new MethodInvocation(connectorId,
  78. interfaceName, methodName);
  79. if (connector instanceof HasJavaScriptConnectorHelper) {
  80. ((HasJavaScriptConnectorHelper) connector)
  81. .getJavascriptConnectorHelper().invokeJsRpc(invocation,
  82. parametersJson);
  83. } else {
  84. if (connector == null) {
  85. throw new IllegalStateException("Target connector ("
  86. + connector + ") not found for RCC to "
  87. + getSignature(invocation));
  88. }
  89. parseMethodParameters(invocation, parametersJson, connection);
  90. VConsole.log("Server to client RPC call: " + invocation);
  91. applyInvocation(invocation, connector);
  92. }
  93. }
  94. private void parseMethodParameters(MethodInvocation methodInvocation,
  95. JSONArray parametersJson, ApplicationConnection connection) {
  96. Type[] parameterTypes = getParameterTypes(methodInvocation);
  97. Object[] parameters = new Object[parametersJson.size()];
  98. for (int j = 0; j < parametersJson.size(); ++j) {
  99. parameters[j] = JsonDecoder.decodeValue(parameterTypes[j],
  100. parametersJson.get(j), null, connection);
  101. }
  102. methodInvocation.setParameters(parameters);
  103. }
  104. }