Class RPC

java.lang.Object
com.google.gwt.user.server.rpc.RPC

public final class RPC extends Object
Utility class for integrating with the RPC system. This class exposes methods for decoding of RPC requests, encoding of RPC responses, and invocation of RPC calls on service objects. The operations exposed by this class can be reused by framework implementors such as Spring and G4jsf to support a wide range of service invocation policies.

Canonical Example

The following example demonstrates the canonical way to use this class.
@Override
public String processCall(String payload) throws SerializationException {
  try {
    RPCRequest rpcRequest = RPC.decodeRequest(payload, this.getClass());
    return RPC.invokeAndEncodeResponse(this, rpcRequest.getMethod(),
        rpcRequest.getParameters());
  } catch (IncompatibleRemoteServiceException ex) {
    return RPC.encodeResponseForFailure(null, ex);
  }
}

Advanced Example

The following example shows a more advanced way of using this class to create an adapter between GWT RPC entities and POJOs.
@Override
public void doPost(HttpServletRequest httpRequest,
    HttpServletResponse httpResponse) {
  String payload = readPayloadAsUtf8(httpRequest);

  try {
    try {
      RPCRequest rpcRequest = RPC.decodeRequest(payload);

      Object targetInstance = getInstanceToHandleRequest(httpRequest,
          rpcRequest);

      Method targetMethod = maybeMapRequestedMethod(targetInstance,
          rpcRequest.getMethod());

      Object[] targetParameters = maybeMapParameters(rpcRequest.getParameters());

      try {
        Object result = targetMethod.invoke(targetInstance, targetParameters);

        result = maybeMapResult(rpcRequest.getMethod(), result);

        /*
         * Encode the object that will be given to the client code's
         * AsyncCallback::onSuccess(Object) method.
         */
        String encodedResult = RPC.encodeResponseForSuccess(
            rpcRequest.getMethod(), result);

        sendResponseForSuccess(httpResponse, encodedResult);
      } catch (IllegalArgumentException e) {
        SecurityException securityException = new SecurityException(
            "Blocked attempt to invoke method " + targetMethod);
        securityException.initCause(e);
        throw securityException;
      } catch (IllegalAccessException e) {
        SecurityException securityException = new SecurityException(
            "Blocked attempt to access inaccessible method "
                + targetMethod
                + (targetInstance != null ? " on target " + targetInstance
                    : ""));
        securityException.initCause(e);
        throw securityException;
      } catch (InvocationTargetException e) {
        Throwable cause = e.getCause();

        Throwable mappedThrowable = maybeMapThrowable(cause,
            rpcRequest.getMethod());

        /*
         * Encode the exception that will be passed back to the client's
         * client code's AsyncCallback::onFailure(Throwable) method.
         */
        String failurePayload = RPC.encodeResponseForFailure(
            rpcRequest.getMethod(), mappedThrowable);

        sendResponseForFailure(httpResponse, failurePayload);
      }
    } catch (IncompatibleRemoteServiceException e) {
      sendResponseForFailure(httpResponse, RPC.encodeResponseForFailure(null,
          e));
    }
  } catch (Throwable e) {
    /*
     * Return a generic error which will be passed to the client code's
     * AsyncCallback::onFailure(Throwable) method.
     */
    sendResponseForGenericFailure(httpResponse);
  }
}
  • Method Details

    • decodeRequest

      public static RPCRequest decodeRequest(String encodedRequest)
      Returns an RPCRequest that is built by decoding the contents of an encoded RPC request.

      This method is equivalent to calling decodeRequest(String, Class) with null for the type parameter.

      Parameters:
      encodedRequest - a string that encodes the RemoteService interface, the service method to call, and the arguments to for the service method
      Returns:
      an RPCRequest instance
      Throws:
      IncompatibleRemoteServiceException - if any of the following conditions apply:
      • if the types in the encoded request cannot be deserialized
      • if the ClassLoader acquired from Thread.currentThread().getContextClassLoader() cannot load the service interface or any of the types specified in the encodedRequest
      • the requested interface is not assignable to RemoteService
      • the service method requested in the encodedRequest is not a member of the requested service interface
      • the type parameter is not null and is not assignable to the requested RemoteService interface
    • decodeRequest

      public static RPCRequest decodeRequest(String encodedRequest, Class<?> type)
      Returns an RPCRequest that is built by decoding the contents of an encoded RPC request and optionally validating that type can handle the request. If the type parameter is not null, the implementation checks that the type is assignable to the RemoteService interface requested in the encoded request string.

      Invoking this method with null for the type parameter, decodeRequest(encodedRequest, null), is equivalent to calling decodeRequest(encodedRequest).

      Parameters:
      encodedRequest - a string that encodes the RemoteService interface, the service method, and the arguments to pass to the service method
      type - if not null, the implementation checks that the type is assignable to the RemoteService interface encoded in the encoded request string.
      Returns:
      an RPCRequest instance
      Throws:
      NullPointerException - if the encodedRequest is null
      IllegalArgumentException - if the encodedRequest is an empty string
      IncompatibleRemoteServiceException - if any of the following conditions apply:
      • if the types in the encoded request cannot be deserialized
      • if the ClassLoader acquired from Thread.currentThread().getContextClassLoader() cannot load the service interface or any of the types specified in the encodedRequest
      • the requested interface is not assignable to RemoteService
      • the service method requested in the encodedRequest is not a member of the requested service interface
      • the type parameter is not null and is not assignable to the requested RemoteService interface
    • decodeRequest

      public static RPCRequest decodeRequest(String encodedRequest, Class<?> type, SerializationPolicyProvider serializationPolicyProvider)
      Returns an RPCRequest that is built by decoding the contents of an encoded RPC request and optionally validating that type can handle the request. If the type parameter is not null, the implementation checks that the type is assignable to the RemoteService interface requested in the encoded request string.

      If the serializationPolicyProvider parameter is not null, it is asked for a SerializationPolicy to use to restrict the set of types that can be decoded from the request. If this parameter is null, then only subtypes of IsSerializable or types which have custom field serializers can be decoded.

      Invoking this method with null for the type parameter, decodeRequest(encodedRequest, null), is equivalent to calling decodeRequest(encodedRequest).

      Parameters:
      encodedRequest - a string that encodes the RemoteService interface, the service method, and the arguments to pass to the service method
      type - if not null, the implementation checks that the type is assignable to the RemoteService interface encoded in the encoded request string.
      serializationPolicyProvider - if not null, the implementation asks this provider for a SerializationPolicy which will be used to restrict the set of types that can be decoded from this request
      Returns:
      an RPCRequest instance
      Throws:
      NullPointerException - if the encodedRequest is null
      IllegalArgumentException - if the encodedRequest is an empty string
      IncompatibleRemoteServiceException - if any of the following conditions apply:
      • if the types in the encoded request cannot be deserialized
      • if the ClassLoader acquired from Thread.currentThread().getContextClassLoader() cannot load the service interface or any of the types specified in the encodedRequest
      • the requested interface is not assignable to RemoteService
      • the service method requested in the encodedRequest is not a member of the requested service interface
      • the type parameter is not null and is not assignable to the requested RemoteService interface
    • encodeResponseForFailedRequest

      public static String encodeResponseForFailedRequest(RPCRequest rpcRequest, Throwable cause) throws SerializationException
      Returns a string that encodes an exception. If rpcRequest is null a default serialization policy and default request flags will be used. Otherwise these information are taken from rpcRequest.

      This method should be used if the RPC request could not be decoded or could not be executed because of an exception thrown, e.g. IncompatibleRemoteServiceException, RpcTokenException

      Parameters:
      rpcRequest - the RPCRequest that failed to execute, may be null
      cause - the Throwable that was thrown
      Returns:
      a String that encodes the exception
      Throws:
      SerializationException - if the result cannot be serialized
    • encodeResponseForFailure

      public static String encodeResponseForFailure(Method serviceMethod, Throwable cause) throws SerializationException
      Returns a string that encodes an exception. If method is not null, it is an error if the exception is not in the method's list of checked exceptions.
      Parameters:
      serviceMethod - the method that threw the exception, may be null
      cause - the Throwable that was thrown
      Returns:
      a string that encodes the exception
      Throws:
      NullPointerException - if the cause is null
      SerializationException - if the result cannot be serialized
      UnexpectedException - if the result was an unexpected exception (a checked exception not declared in the serviceMethod's signature)
    • encodeResponseForFailure

      public static String encodeResponseForFailure(Method serviceMethod, Throwable cause, SerializationPolicy serializationPolicy) throws SerializationException
      Returns a string that encodes an exception. If method is not null, it is an error if the exception is not in the method's list of checked exceptions.

      If the serializationPolicy parameter is not null, it is used to determine what types can be encoded as part of this response. If this parameter is null, then only subtypes of IsSerializable or types which have custom field serializers may be encoded.

      Parameters:
      serviceMethod - the method that threw the exception, may be null
      cause - the Throwable that was thrown
      serializationPolicy - determines the serialization policy to be used
      Returns:
      a string that encodes the exception
      Throws:
      NullPointerException - if the cause or the serializationPolicy are null
      SerializationException - if the result cannot be serialized
      UnexpectedException - if the result was an unexpected exception (a checked exception not declared in the serviceMethod's signature)
    • encodeResponseForFailure

      public static String encodeResponseForFailure(Method serviceMethod, Throwable cause, SerializationPolicy serializationPolicy, int flags) throws SerializationException
      Throws:
      SerializationException
    • encodeResponseForSuccess

      public static String encodeResponseForSuccess(Method serviceMethod, Object object) throws SerializationException
      Returns a string that encodes the object. It is an error to try to encode an object that is not assignable to the service method's return type.
      Parameters:
      serviceMethod - the method whose result we are encoding
      object - the instance that we wish to encode
      Returns:
      a string that encodes the object, if the object is compatible with the service method's declared return type
      Throws:
      IllegalArgumentException - if the result is not assignable to the service method's return type
      NullPointerException - if the service method is null
      SerializationException - if the result cannot be serialized
    • encodeResponseForSuccess

      public static String encodeResponseForSuccess(Method serviceMethod, Object object, SerializationPolicy serializationPolicy) throws SerializationException
      Returns a string that encodes the object. It is an error to try to encode an object that is not assignable to the service method's return type.

      If the serializationPolicy parameter is not null, it is used to determine what types can be encoded as part of this response. If this parameter is null, then only subtypes of IsSerializable or types which have custom field serializers may be encoded.

      Parameters:
      serviceMethod - the method whose result we are encoding
      object - the instance that we wish to encode
      serializationPolicy - determines the serialization policy to be used
      Returns:
      a string that encodes the object, if the object is compatible with the service method's declared return type
      Throws:
      IllegalArgumentException - if the result is not assignable to the service method's return type
      NullPointerException - if the serviceMethod or the serializationPolicy are null
      SerializationException - if the result cannot be serialized
    • encodeResponseForSuccess

      public static String encodeResponseForSuccess(Method serviceMethod, Object object, SerializationPolicy serializationPolicy, int flags) throws SerializationException
      Throws:
      SerializationException
    • getDefaultSerializationPolicy

      public static SerializationPolicy getDefaultSerializationPolicy()
      Returns a default serialization policy.
      Returns:
      the default serialization policy.
    • invokeAndEncodeResponse

      public static String invokeAndEncodeResponse(Object target, Method serviceMethod, Object[] args) throws SerializationException
      Returns a string that encodes the result of calling a service method, which could be the value returned by the method or an exception thrown by it.

      This method does no security checking; security checking must be done on the method prior to this invocation.

      Parameters:
      target - instance on which to invoke the serviceMethod
      serviceMethod - the method to invoke
      args - arguments used for the method invocation
      Returns:
      a string which encodes either the method's return or a checked exception thrown by the method
      Throws:
      SecurityException - if the method cannot be accessed or if the number or type of actual and formal arguments differ
      SerializationException - if an object could not be serialized by the stream
      UnexpectedException - if the serviceMethod throws a checked exception that is not declared in its signature
    • invokeAndEncodeResponse

      public static String invokeAndEncodeResponse(Object target, Method serviceMethod, Object[] args, SerializationPolicy serializationPolicy) throws SerializationException
      Returns a string that encodes the result of calling a service method, which could be the value returned by the method or an exception thrown by it.

      If the serializationPolicy parameter is not null, it is used to determine what types can be encoded as part of this response. If this parameter is null, then only subtypes of IsSerializable or types which have custom field serializers may be encoded.

      This method does no security checking; security checking must be done on the method prior to this invocation.

      Parameters:
      target - instance on which to invoke the serviceMethod
      serviceMethod - the method to invoke
      args - arguments used for the method invocation
      serializationPolicy - determines the serialization policy to be used
      Returns:
      a string which encodes either the method's return or a checked exception thrown by the method
      Throws:
      NullPointerException - if the serviceMethod or the serializationPolicy are null
      SecurityException - if the method cannot be accessed or if the number or type of actual and formal arguments differ
      SerializationException - if an object could not be serialized by the stream
      UnexpectedException - if the serviceMethod throws a checked exception that is not declared in its signature
    • invokeAndEncodeResponse

      public static String invokeAndEncodeResponse(Object target, Method serviceMethod, Object[] args, SerializationPolicy serializationPolicy, int flags) throws SerializationException
      Throws:
      SerializationException