// Copyright (c) 2007-Present Pivotal Software, Inc. All rights reserved.
//
// This software, the RabbitMQ Java client library, is triple-licensed under the
// Mozilla Public License 1.1 ("MPL"), the GNU General Public License version 2
// ("GPL") and the Apache License version 2 ("ASL"). For the MPL, please see
// LICENSE-MPL-RabbitMQ. For the GPL, please see LICENSE-GPL2. For the ASL,
// please see LICENSE-APACHE2.
//
// This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND,
// either express or implied. See the LICENSE file for specific language governing
// rights and limitations of this software.
//
// If you have any questions regarding licensing, please contact us at
// info@rabbitmq.com.
package com.rabbitmq.tools.jsonrpc;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
import com.rabbitmq.tools.json.JSONUtil;
/**
* Description of a single JSON-RPC procedure.
*/
public class ProcedureDescription {
/** Procedure name */
public String name;
/** Human-readable procedure summary */
public String summary;
/** Human-readable instructions for how to get information on the procedure's operation */
public String help;
/** True if this procedure is idempotent, that is, can be accessed via HTTP GET */
public boolean idempotent;
/** Descriptions of parameters for this procedure */
private ParameterDescription[] params;
/** Return type for this procedure */
private String returnType;
/** Reflected method object, used for service invocation */
private Method method;
public ProcedureDescription(Map<String, Object> pm) {
JSONUtil.tryFill(this, pm);
@SuppressWarnings("unchecked")
List<Map<String, Object>> p = (List<Map<String, Object>>) pm.get("params");
params = new ParameterDescription[p.size()];
int count = 0;
for (Map<String, Object> param_map: p) {
ParameterDescription param = new ParameterDescription(param_map);
params[count++] = param;
}
}
public ProcedureDescription(Method m) {
this.method = m;
this.name = m.getName();
this.summary = "";
this.help = "";
this.idempotent = false;
Class<?>[] parameterTypes = m.getParameterTypes();
this.params = new ParameterDescription[parameterTypes.length];
for (int i = 0; i < parameterTypes.length; i++) {
params[i] = new ParameterDescription(i, parameterTypes[i]);
}
this.returnType = ParameterDescription.lookup(m.getReturnType());
}
public ProcedureDescription() {
// no work to do here
}
/** Getter for return type */
public String getReturn() { return returnType; }
/** Private API - used via reflection during parsing/loading */
public void setReturn(String value) { returnType = value; }
/** Private API - used to get the reflected method object, for servers */
public Method internal_getMethod() { return method; }
/** Gets an array of parameter descriptions for all this procedure's parameters */
public ParameterDescription[] internal_getParams() {
return params;
}
/** Retrieves the parameter count for this procedure */
public int arity() {
return (params == null) ? 0 : params.length;
}
public ParameterDescription[] getParams() {
return params;
}
}