package com.github.windbender.auth;
import java.lang.reflect.Type;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;
import com.github.windbender.domain.User;
import com.sun.jersey.api.core.HttpContext;
import com.sun.jersey.core.spi.component.ComponentContext;
import com.sun.jersey.core.spi.component.ComponentScope;
import com.sun.jersey.server.impl.inject.AbstractHttpContextInjectable;
import com.sun.jersey.spi.inject.Injectable;
import com.sun.jersey.spi.inject.InjectableProvider;
@Provider
public class SessionUserProvider implements InjectableProvider<SessionUser, Type> {
private static class AuthedUserInjectable extends AbstractHttpContextInjectable<User> {
private boolean required;
HttpServletRequest request;
private AuthedUserInjectable(HttpServletRequest request, boolean required) {
this.required = required;
this.request = request;
}
@Override
public User getValue(HttpContext c) {
final User user = (User) request.getSession().getAttribute("user");
if (required) {
if (user == null) {
throw new WebApplicationException(Response.Status.UNAUTHORIZED);
}
}
return user;
}
}
private final HttpServletRequest request;
private boolean required;
public SessionUserProvider(@Context HttpServletRequest request) {
this.request = request;
}
@Override
public Injectable<User> getInjectable(ComponentContext cc, SessionUser a,
Type c) {
required = a.required();
if (c.equals(User.class)) {
return new AuthedUserInjectable(request,required);
// return this;
}
return null;
}
@Override
public ComponentScope getScope() {
return ComponentScope.PerRequest;
}
// @Override
// public User getValue() {
// final User user = (User) request.getSession().getAttribute("user");
// if (required) {
// if (user == null) {
// throw new WebApplicationException(Response.Status.UNAUTHORIZED);
// }
// }
// return user;
// }
}