/**
* Dianping.com Inc.
* Copyright (c) 2003-2013 All Rights Reserved.
*/
package com.dianping.pigeon.remoting.provider.util;
import java.util.HashMap;
import java.util.Map;
import com.dianping.pigeon.remoting.common.domain.InvocationSerializable;
import com.dianping.pigeon.remoting.common.domain.generic.UnifiedInvocation;
import org.apache.commons.lang.StringUtils;
import com.dianping.pigeon.config.ConfigManager;
import com.dianping.pigeon.config.ConfigManagerLoader;
import com.dianping.pigeon.remoting.common.codec.SerializerFactory;
import com.dianping.pigeon.remoting.common.codec.SerializerType;
import com.dianping.pigeon.remoting.common.domain.InvocationRequest;
import com.dianping.pigeon.remoting.common.domain.InvocationResponse;
import com.dianping.pigeon.remoting.common.domain.generic.UnifiedRequest;
import com.dianping.pigeon.remoting.common.domain.generic.UnifiedResponse;
import com.dianping.pigeon.remoting.common.exception.BadRequestException;
import com.dianping.pigeon.remoting.common.util.Constants;
import com.dianping.pigeon.remoting.common.util.InvocationUtils;
import com.dianping.pigeon.remoting.provider.config.ProviderConfig;
import com.dianping.pigeon.remoting.provider.domain.ProviderContext;
import com.dianping.pigeon.remoting.provider.process.ProviderExceptionTranslator;
import com.dianping.pigeon.remoting.provider.publish.ServicePublisher;
import com.dianping.pigeon.util.LangUtils;
import com.dianping.pigeon.util.VersionUtils;
public final class ProviderUtils {
private static ConfigManager configManager = ConfigManagerLoader.getConfigManager();
private static ProviderExceptionTranslator exceptionTranslator = new ProviderExceptionTranslator();
private ProviderUtils() {
}
public static InvocationResponse createThrowableResponse(long seq, byte serialization, Throwable e) {
InvocationResponse response = null;
response = SerializerFactory.getSerializer(serialization).newResponse();
response.setSequence(seq);
response.setSerialize(serialization);
response.setMessageType(Constants.MESSAGE_TYPE_EXCEPTION);
if (SerializerType.isJson(serialization)) {
response.setReturn(LangUtils.getFullStackTrace(e));
} else {
response.setReturn(exceptionTranslator.translate(e));
}
return response;
}
public static InvocationResponse createThrowableResponse(InvocationSerializable invocation, byte serialization, Throwable e) {
if (invocation instanceof UnifiedInvocation) {
if (invocation instanceof UnifiedRequest) {
return createThrowableResponse0((UnifiedRequest) invocation, e);
} else if (invocation instanceof UnifiedResponse) {
return createThrowableResponse0((UnifiedResponse) invocation, e);
} else {
throw new IllegalArgumentException("unsupported this class " + invocation.getClass());
}
} else {
return createThrowableResponse(invocation.getSequence(), serialization, e);
}
}
public static InvocationResponse createThrowableResponse(InvocationRequest request, byte serialization, Throwable e) {
if (request instanceof UnifiedRequest) {
return createThrowableResponse0((UnifiedRequest) request, e);
} else {
return createThrowableResponse0(request, e);
}
}
public static InvocationResponse createThrowableResponse0(InvocationRequest request, Throwable e) {
InvocationResponse response = null;
byte serialize = request.getSerialize();
response = SerializerFactory.getSerializer(serialize).newResponse();
response.setSequence(request.getSequence());
response.setSerialize(serialize);
response.setMessageType(Constants.MESSAGE_TYPE_EXCEPTION);
if (SerializerType.isJson(serialize)) {
response.setReturn(LangUtils.getFullStackTrace(e));
} else {
response.setReturn(exceptionTranslator.translate(e));
}
return response;
}
public static InvocationResponse createThrowableResponse0(UnifiedRequest request, Throwable e) {
UnifiedResponse response = null;
byte serialize = request.getSerialize();
response = (UnifiedResponse) SerializerFactory.getSerializer(serialize).newResponse();
response.setSequence(request.getSequence());
response.setSerialize(serialize);
response.setServiceName(request.getServiceName());
response.setMethodName(request.getMethodName());
response.setMessageType(Constants.MESSAGE_TYPE_EXCEPTION);
if (SerializerType.isJson(serialize)) {
response.setReturn(LangUtils.getFullStackTrace(e));
} else {
response.setReturn(exceptionTranslator.translate(e));
}
response.setSeqId(request.getSeqId());
return response;
}
public static InvocationResponse createThrowableResponse0(UnifiedResponse response, Throwable e) {
UnifiedResponse response0 = null;
byte serialize = response.getSerialize();
response0 = (UnifiedResponse) SerializerFactory.getSerializer(serialize).newResponse();
response0.setSequence(response.getSequence());
response0.setSerialize(serialize);
response0.setServiceName(response.getServiceName());
response0.setMethodName(response.getMethodName());
response0.setMessageType(Constants.MESSAGE_TYPE_EXCEPTION);
if (SerializerType.isJson(serialize)) {
response0.setReturn(LangUtils.getFullStackTrace(e));
} else {
response0.setReturn(exceptionTranslator.translate(e));
}
response0.setSeqId(response.getSeqId());
return response;
}
public static InvocationResponse createFailResponse(InvocationRequest request, Throwable e) {
InvocationResponse response = null;
if (request.getMessageType() == Constants.MESSAGE_TYPE_HEART) {
response = InvocationUtils.newResponse(request.getSerialize(), request.getSequence(), Constants.MESSAGE_TYPE_HEART,
exceptionTranslator.translate(e));
} else {
response = createThrowableResponse(request, request.getSerialize(), e);
}
return response;
}
public static InvocationResponse createServiceExceptionResponse(InvocationRequest request, Throwable e) {
if (request instanceof UnifiedRequest) {
return createServiceExceptionResponse0((UnifiedRequest) request, e);
} else {
return createServiceExceptionResponse0(request, e);
}
}
public static InvocationResponse createServiceExceptionResponse0(InvocationRequest request, Throwable e) {
InvocationResponse response = null;
byte serialize = request.getSerialize();
response = SerializerFactory.getSerializer(serialize).newResponse();
response.setSequence(request.getSequence());
response.setSerialize(serialize);
response.setMessageType(Constants.MESSAGE_TYPE_SERVICE_EXCEPTION);
if (SerializerType.isJson(serialize)) {
response.setReturn(LangUtils.getFullStackTrace(e));
} else {
response.setReturn(e);
}
return response;
}
public static InvocationResponse createServiceExceptionResponse0(UnifiedRequest request, Throwable e) {
UnifiedResponse response = null;
byte serialize = request.getSerialize();
response = (UnifiedResponse) SerializerFactory.getSerializer(serialize).newResponse();
response.setSequence(request.getSequence());
response.setSerialize(serialize);
response.setMessageType(Constants.MESSAGE_TYPE_SERVICE_EXCEPTION);
response.setServiceName(request.getServiceName());
response.setMethodName(request.getMethodName());
if (SerializerType.isJson(serialize)) {
response.setReturn(LangUtils.getFullStackTrace(e));
} else {
response.setReturn(e);
}
response.setSeqId(request.getSeqId());
return response;
}
public static InvocationResponse createSuccessResponse(InvocationRequest request, Object returnObj) {
if (request instanceof UnifiedRequest) {
return createSuccessResponse0((UnifiedRequest) request, returnObj);
} else {
return createSuccessResponse0(request, returnObj);
}
}
public static InvocationResponse createSuccessResponse0(InvocationRequest request, Object returnObj) {
InvocationResponse response = null;
byte serialize = request.getSerialize();
response = SerializerFactory.getSerializer(serialize).newResponse();
response.setSequence(request.getSequence());
response.setSerialize(serialize);
response.setMessageType(Constants.MESSAGE_TYPE_SERVICE);
response.setReturn(returnObj);
return response;
}
public static InvocationResponse createSuccessResponse0(UnifiedRequest request, Object returnObj) {
UnifiedResponse response = null;
byte serialize = request.getSerialize();
response = (UnifiedResponse) SerializerFactory.getSerializer(serialize).newResponse();
response.setSequence(request.getSequence());
response.setSerialize(serialize);
response.setMessageType(Constants.MESSAGE_TYPE_SERVICE);
response.setServiceName(request.getServiceName());
response.setMethodName(request.getMethodName());
response.setReturn(returnObj);
response.setSeqId(request.getSeqId());
return response;
}
public static InvocationResponse createHeartResponse(InvocationRequest request) {
if (request instanceof UnifiedRequest) {
return createHeartResponse0((UnifiedRequest) request);
} else {
return createHeartResponse0(request);
}
}
public static InvocationResponse createHeartResponse0(UnifiedRequest request) {
UnifiedResponse response = null;
byte serialize = request.getSerialize();
response = (UnifiedResponse) SerializerFactory.getSerializer(serialize).newResponse();
response.setSequence(request.getSequence());
response.setSerialize(serialize);
response.setMessageType(Constants.MESSAGE_TYPE_HEART);
response.setServiceName(request.getServiceName());
response.setMethodName(request.getMethodName());
response.setSeqId(request.getSeqId());
response.setCreateMillisTime(System.currentTimeMillis());
return response;
}
public static InvocationResponse createHeartResponse0(InvocationRequest request) {
InvocationResponse response = InvocationUtils.newResponse(Constants.MESSAGE_TYPE_HEART, request.getSerialize());
response.setSequence(request.getSequence());
response.setReturn(Constants.VERSION_150);
return response;
}
public static InvocationResponse createScannerHeartResponse(InvocationRequest request) {
if (request instanceof UnifiedRequest) {
UnifiedResponse response = null;
byte serialize = request.getSerialize();
response = (UnifiedResponse) SerializerFactory.getSerializer(serialize).newResponse();
response.setSequence(request.getSequence());
response.setSerialize(serialize);
response.setMessageType(Constants.MESSAGE_TYPE_SCANNER_HEART);
response.setServiceName(request.getServiceName());
response.setMethodName(request.getMethodName());
response.setSeqId(((UnifiedRequest) request).getSeqId());
response.setCreateMillisTime(System.currentTimeMillis());
return response;
} else {
throw new BadRequestException("invalid scanner heartbeat request");
}
}
public static InvocationResponse createHealthCheckResponse(ProviderContext invocationContext) {
InvocationRequest request = invocationContext.getRequest();
InvocationResponse response = InvocationUtils.newResponse(Constants.MESSAGE_TYPE_HEALTHCHECK, request.getSerialize());
response.setSequence(request.getSequence());
Map<String, Object> info = new HashMap<String, Object>();
info.put("version", VersionUtils.VERSION);
info.put("group", configManager.getGroup());
info.put("env", configManager.getEnv());
//check service exists
info.put("serviceCheck", Boolean.FALSE);
String serviceName = request.getServiceName();
if (StringUtils.isNotBlank(serviceName)) {
Map<String, ProviderConfig<?>> serviceCache = ServicePublisher.getAllServiceProviders();
ProviderConfig providerConfig = serviceCache.get(serviceName);
if (providerConfig != null
&& invocationContext.getChannel().getPort() == providerConfig.getServerConfig().getActualPort()) {
info.put("serviceCheck", Boolean.TRUE);
}
}
response.setReturn(info);
return response;
}
public static InvocationResponse createHealthCheckResponse(InvocationRequest request) {
InvocationResponse response = InvocationUtils.newResponse(Constants.MESSAGE_TYPE_HEALTHCHECK, request.getSerialize());
response.setSequence(request.getSequence());
Map<String, Object> info = new HashMap<String, Object>();
info.put("version", VersionUtils.VERSION);
info.put("group", configManager.getGroup());
info.put("env", configManager.getEnv());
response.setReturn(info);
return response;
}
public static String getRequestDetailInfo(String title, ProviderContext providerContext, InvocationRequest request) {
StringBuilder msg = new StringBuilder();
msg.append(title).append(", from:")
.append(providerContext.getChannel() == null ? "" : providerContext.getChannel().getRemoteAddress())
.append(", to:").append(ConfigManagerLoader.getConfigManager().getLocalIp())
.append(", time:").append(System.currentTimeMillis()).append("\r\nrequest:")
.append(request);
return msg.toString();
}
}