/*
 * Copyright 2008 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.user.server.rpc;

import java.lang.reflect.Method;

/**
 * Describes an incoming RPC request in terms of a resolved {@link Method} and
 * an array of arguments.
 */
public final class RPCRequest {

  /**
   * The flags associated with the RPC request.
   */
  private final int flags;

  /**
   * The method for this request.
   */
  private final Method method;

  /**
   * The parameters for this request.
   */
  private final Object[] parameters;

  /**
   * {@link SerializationPolicy} used for decoding this request and for encoding
   * the responses.
   */
  private final SerializationPolicy serializationPolicy;

  /**
   * Construct an RPCRequest.
   */
  public RPCRequest(Method method, Object[] parameters,
      SerializationPolicy serializationPolicy, int flags) {
    this.method = method;
    this.parameters = parameters;
    this.serializationPolicy = serializationPolicy;
    this.flags = flags;
  }

  public int getFlags() {
    return flags;
  }

  /**
   * Get the request's method.
   */
  public Method getMethod() {
    return method;
  }

  /**
   * Get the request's parameters.
   */
  public Object[] getParameters() {
    return parameters;
  }

  /**
   * Returns the {@link SerializationPolicy} used to decode this request. This
   * is also the <code>SerializationPolicy</code> that should be used to encode
   * responses.
   * 
   * @return {@link SerializationPolicy} used to decode this request
   */
  public SerializationPolicy getSerializationPolicy() {
    return serializationPolicy;
  }

  /**
   * For debugging use only.
   */
  @Override
  public String toString() {
    StringBuilder callSignature = new StringBuilder();

    // Add the class and method names
    callSignature.append(method.getDeclaringClass().getName());
    callSignature.append('.');
    callSignature.append(method.getName());

    // Add the list of parameters
    callSignature.append('(');
    for (Object param : parameters) {
      if (param instanceof String) {
        // Put it within quotes and escape quotes, for readability
        callSignature.append('"');
        String strParam = (String) param;
        String escapedStrParam = strParam.replaceAll("\\\"", "\\\\\"");
        callSignature.append(escapedStrParam);
        callSignature.append('"');
      } else if (param == null) {
        callSignature.append("null");
      } else {
        // We assume that anyone who wants to use this method will implement
        // toString on his serializable objects.
        callSignature.append(param.toString());
      }
      callSignature.append(", ");
    }

    // Remove the last ", "
    int length = callSignature.length();
    callSignature.delete(length - 2, length);
    callSignature.append(')');

    return callSignature.toString();
  }
}
