package org.jboss.resteasy.plugins.guice.ext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.core.UriInfo;
import org.jboss.resteasy.core.ResteasyContext;
import org.jboss.resteasy.plugins.guice.RequestScoped;
import com.google.inject.AbstractModule;
import com.google.inject.Key;
import com.google.inject.Provider;
import com.google.inject.Scope;
public class RequestScopeModule extends AbstractModule
{
@Override
protected void configure()
{
bindScope(RequestScoped.class, new Scope()
{
@Override
public <T> Provider<T> scope(final Key<T> key, final Provider<T> creator)
{
return new Provider<T>()
{
@SuppressWarnings("unchecked")
@Override
public T get()
{
Class<T> instanceClass = (Class<T>) key.getTypeLiteral().getType();
T instance = ResteasyContext.getContextData(instanceClass);
if (instance == null) {
instance = creator.get();
ResteasyContext.pushContext(instanceClass, instance);
}
return instance;
}
@Override
public String toString() {
return String.format("%s[%s]", creator, super.toString());
}
};
}
});
bind(HttpServletRequest.class).toProvider(new ResteasyContextProvider<HttpServletRequest>(HttpServletRequest.class)).in(RequestScoped.class);
bind(HttpServletResponse.class).toProvider(new ResteasyContextProvider<HttpServletResponse>(HttpServletResponse.class)).in(RequestScoped.class);
bind(Request.class).toProvider(new ResteasyContextProvider<Request>(Request.class)).in(RequestScoped.class);
bind(HttpHeaders.class).toProvider(new ResteasyContextProvider<HttpHeaders>(HttpHeaders.class)).in(RequestScoped.class);
bind(UriInfo.class).toProvider(new ResteasyContextProvider<UriInfo>(UriInfo.class)).in(RequestScoped.class);
bind(SecurityContext.class).toProvider(new ResteasyContextProvider<SecurityContext>(SecurityContext.class)).in(RequestScoped.class);
}
private static class ResteasyContextProvider<T> implements Provider<T> {
private final Class<T> instanceClass;
ResteasyContextProvider(final Class<T> instanceClass)
{
this.instanceClass = instanceClass;
}
@Override
public T get() {
return ResteasyContext.getContextData(instanceClass);
}
}
}