package com.github.kristofa.brave.resteasy;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.ext.Provider;
import com.github.kristofa.brave.Brave;
import com.github.kristofa.brave.ServerRequestInterceptor;
import com.github.kristofa.brave.http.DefaultSpanNameProvider;
import com.github.kristofa.brave.http.HttpServerRequest;
import com.github.kristofa.brave.http.HttpServerRequestAdapter;
import com.github.kristofa.brave.http.SpanNameProvider;
import org.jboss.resteasy.annotations.interception.ServerInterceptor;
import org.jboss.resteasy.core.ResourceMethod;
import org.jboss.resteasy.core.ServerResponse;
import org.jboss.resteasy.spi.Failure;
import org.jboss.resteasy.spi.HttpRequest;
import org.jboss.resteasy.spi.interception.PreProcessInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import static com.github.kristofa.brave.internal.Util.checkNotNull;
/**
* Rest Easy {@link PreProcessInterceptor} that will:
* <ol>
* <li>Get trace data (trace id, span id, parent span id) from http headers and initialize state for request + submit 'server
* received' for request.</li>
* <li>If no trace information is submitted we will start a new span. In that case it means client does not support tracing
* and should be adapted.</li>
* </ol>
*
* @author kristof
* @deprecated There is no plan to continue supporting RestEasy 2.x
*/
@Deprecated
@Component
@Provider
@ServerInterceptor
public class BravePreProcessInterceptor implements PreProcessInterceptor {
/** Creates a tracing interceptor with defaults. Use {@link #builder(Brave)} to customize. */
public static BravePreProcessInterceptor create(Brave brave) {
return new Builder(brave).build();
}
public static Builder builder(Brave brave) {
return new Builder(brave);
}
public static final class Builder {
final Brave brave;
SpanNameProvider spanNameProvider = new DefaultSpanNameProvider();
Builder(Brave brave) { // intentionally hidden
this.brave = checkNotNull(brave, "brave");
}
public Builder spanNameProvider(SpanNameProvider spanNameProvider) {
this.spanNameProvider = checkNotNull(spanNameProvider, "spanNameProvider");
return this;
}
public BravePreProcessInterceptor build() {
return new BravePreProcessInterceptor(this);
}
}
private final ServerRequestInterceptor requestInterceptor;
private final SpanNameProvider spanNameProvider;
@Context
HttpServletRequest servletRequest;
@Autowired // internal
BravePreProcessInterceptor(SpanNameProvider spanNameProvider, Brave brave) {
this(builder(brave).spanNameProvider(spanNameProvider));
}
BravePreProcessInterceptor(Builder b) { // intentionally hidden
this.requestInterceptor = b.brave.serverRequestInterceptor();
this.spanNameProvider = b.spanNameProvider;
}
/**
* Creates a new instance.
*
* @param requestInterceptor Request interceptor.
* @param spanNameProvider Span name provider.
* @deprecated please use {@link #create(Brave)} or {@link #builder(Brave)}
*/
@Deprecated
public BravePreProcessInterceptor(ServerRequestInterceptor requestInterceptor,
SpanNameProvider spanNameProvider
) {
this.requestInterceptor = requestInterceptor;
this.spanNameProvider = spanNameProvider;
}
/**
* {@inheritDoc}
*/
@Override
public ServerResponse preProcess(final HttpRequest request, final ResourceMethod method) throws Failure,
WebApplicationException {
HttpServerRequest req = new RestEasyHttpServerRequest(request);
HttpServerRequestAdapter reqAdapter = new HttpServerRequestAdapter(req, spanNameProvider);
requestInterceptor.handle(reqAdapter);
return null;
}
}