package com.navercorp.pinpoint.plugin.jetty.interceptor;
import com.navercorp.pinpoint.bootstrap.config.Filter;
import com.navercorp.pinpoint.bootstrap.context.MethodDescriptor;
import com.navercorp.pinpoint.bootstrap.context.TraceContext;
import com.navercorp.pinpoint.bootstrap.interceptor.annotation.TargetMethod;
import org.eclipse.jetty.server.Request;
import java.lang.reflect.Method;
/**
* @author Taejin Koo
*/
@TargetMethod(name = "handle", paramTypes = { "org.eclipse.jetty.server.AbstractHttpConnection" })
public class Jetty8ServerHandleInterceptor extends AbstractServerHandleInterceptor {
private volatile Method getRequestMethod;
public Jetty8ServerHandleInterceptor(TraceContext traceContext, MethodDescriptor descriptor, Filter<String> excludeFilter) {
super(traceContext, descriptor, excludeFilter);
}
@Override
protected Request getRequest(Object[] args) {
try {
final Object object = args[0];
final Method getRequestMethod = getGetRequestMethod(object);
if (getRequestMethod != null) {
final Request request = (Request) getRequestMethod.invoke(object);
return request;
}
} catch (Exception e) {
logger.warn(e.getMessage(), e);
}
return null;
}
private Method getGetRequestMethod(Object target) {
if (getRequestMethod != null) {
return getRequestMethod;
}
synchronized (this) {
if (getRequestMethod != null) {
return getRequestMethod;
}
try {
final Class<?> clazz = target.getClass();
final Method findedMethod = clazz.getMethod("getRequest");
if (findedMethod != null) {
getRequestMethod = findedMethod;
return getRequestMethod;
}
} catch (NoSuchMethodException e) {
logger.warn(e.getMessage(), e);
}
}
return null;
}
}