/**
* Dianping.com Inc.
* Copyright (c) 2003-2013 All Rights Reserved.
*/
package com.dianping.pigeon.remoting.common.util;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.lang.StringUtils;
import com.dianping.pigeon.config.ConfigManager;
import com.dianping.pigeon.config.ConfigManagerLoader;
import com.dianping.pigeon.extension.ExtensionLoader;
import com.dianping.pigeon.remoting.common.domain.InvocationRequest;
import com.dianping.pigeon.remoting.common.domain.InvocationResponse;
import com.dianping.pigeon.remoting.invoker.domain.InvokerContext;
import com.dianping.pigeon.remoting.invoker.exception.RequestTimeoutException;
public class InvocationUtils {
private static InvocationBuilder builder;
static {
builder = ExtensionLoader.getExtension(InvocationBuilder.class);
if(builder == null) {
builder = new DefaultInvocationBuilder();
}
}
private static ConcurrentHashMap<String, String> remoteCallNameCache = new ConcurrentHashMap<String, String>();
private static ConfigManager configManager = ConfigManagerLoader.getConfigManager();
private static final int defaultStrMaxLength = configManager.getIntValue(Constants.KEY_STRING_MAXLENGTH,
Constants.DEFAULT_STRING_MAXLENGTH);
private static final int defaultStrMaxItems = configManager.getIntValue(Constants.KEY_STRING_MAXITEMS,
Constants.DEFAULT_STRING_MAXITEMS);
public static String toJsonString(Object obj) {
return StringizerUtils.forJson().from(obj, defaultStrMaxLength, defaultStrMaxItems);
}
public static String toJsonString(Object obj, int strMaxLength, int strMaxItems) {
return StringizerUtils.forJson().from(obj, strMaxLength, strMaxItems);
}
public static String getRemoteCallFullName(String methodName, Object[] parameters) {
if (parameters != null) {
StringBuilder str = new StringBuilder(methodName).append("(");
for (int i = 0; i < parameters.length; i++) {
if (parameters[i] == null) {
str.append("null,");
} else {
str.append(parameters[i].getClass().getName()).append(",");
}
}
if (parameters.length > 0) {
str.deleteCharAt(str.length() - 1);
}
str.append(")");
return str.toString();
} else {
return methodName;
}
}
public static String getRemoteCallFullName(String serviceName, String methodName, Class<?>[] parameterTypes) {
if (parameterTypes != null) {
String[] parameterTypes_ = new String[parameterTypes.length];
for (int i = 0; i < parameterTypes.length; i++) {
parameterTypes_[i] = parameterTypes[i].getSimpleName();
}
return getRemoteCallFullName(serviceName, methodName, parameterTypes_);
} else {
return getRemoteCallFullName(serviceName, methodName, new String[0]);
}
}
public static String getRemoteCallFullName(String serviceName, String methodName, String[] parameterTypes) {
String cacheKey = new StringBuilder(serviceName).append("#").append(methodName).append("#")
.append(StringUtils.join(parameterTypes, "#")).toString();
String name = remoteCallNameCache.get(cacheKey);
if (name == null) {
List<String> serviceFrags = SplitterUtils.by("/").noEmptyItem().split(serviceName);
int fragLenght = serviceFrags.size();
name = "Unknown";
StringBuilder sb = new StringBuilder(128);
if (fragLenght > 2) {
sb.append(serviceFrags.get(fragLenght - 2)).append(':').append(serviceFrags.get(fragLenght - 1))
.append(':').append(methodName);
} else {
sb.append(serviceName).append(':').append(methodName);
}
sb.append('(');
int pLen = parameterTypes.length;
for (int i = 0; i < pLen; i++) {
String parameter = parameterTypes[i];
int idx = parameter.lastIndexOf(".");
if (idx > -1) {
parameter = parameter.substring(idx + 1);
}
sb.append(parameter);
if (i < pLen - 1) {
sb.append(',');
}
}
sb.append(')');
name = sb.toString();
remoteCallNameCache.putIfAbsent(cacheKey, name);
}
return name;
}
public static InvocationRequest newRequest() {
return builder.newRequest();
}
public static InvocationRequest newRequest(InvokerContext invokerContext) {
return builder.newRequest(invokerContext);
}
public static InvocationRequest newRequest(String serviceName, String methodName, Object[] parameters, byte serialize, int messageType,
int timeout, Class<?>[] parameterClasses) {
return builder.newRequest(serviceName, methodName, parameters, serialize, messageType, timeout, parameterClasses);
}
public static InvocationRequest newRequest(String serviceName, String methodName, Object[] parameters, byte serialize, int messageType,
int timeout, int callType, long seq) {
return builder.newRequest(serviceName, methodName, parameters, serialize, messageType, timeout, callType, seq);
}
public static Class<? extends InvocationRequest> getRequestClass() {
return builder.getRequestClass();
}
public static InvocationResponse newResponse() {
return builder.newResponse();
}
public static InvocationResponse newResponse(int messageType, byte serialize) {
return builder.newResponse(messageType, serialize);
}
public static InvocationResponse newResponse(byte serialize, long seq, int messageType, Object returnVal) {
return builder.newResponse(serialize, seq, messageType, returnVal);
}
public static Class<? extends InvocationResponse> getResponseClass() {
return builder.getResponseClass();
}
public static RequestTimeoutException newTimeoutException(String message) {
return builder.newTimeoutException(message);
}
}