/**
*
*/
package org.minnal.security.auth;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status.Family;
import javax.ws.rs.core.Response.StatusType;
import org.glassfish.jersey.message.internal.OutboundJaxrsResponse;
import org.glassfish.jersey.message.internal.OutboundMessageContext;
import org.minnal.core.MinnalException;
import org.minnal.security.session.Session;
import org.pac4j.core.context.WebContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Charsets;
/**
* @author ganeshs
*
*/
public class JaxrsWebContext implements WebContext {
private ContainerRequestContext request;
private Response response;
private OutboundMessageContext context;
private Session session;
private static final Logger logger = LoggerFactory.getLogger(JaxrsWebContext.class);
/**
* @param request
* @param response
* @param session
*/
public JaxrsWebContext(ContainerRequestContext request, OutboundMessageContext context, Session session) {
this.request = request;
this.context = context;
this.session = session;
this.response = new OutboundJaxrsResponse.Builder(context).build();
}
/**
* @return the request
*/
public ContainerRequestContext getRequest() {
return request;
}
/**
* @return the response
*/
public Response getResponse() {
return response;
}
/**
* @return the session
*/
public Session getSession() {
return session;
}
@Override
public String getRequestParameter(String name) {
return request.getUriInfo().getQueryParameters().getFirst(name);
}
@Override
public Map<String, String[]> getRequestParameters() {
Set<Entry<String, List<String>>> entries = request.getUriInfo().getQueryParameters().entrySet();
Map<String, String[]> params = new HashMap<String, String[]>();
for (Entry<String, List<String>> entry : entries) {
params.put(entry.getKey(), entry.getValue().toArray(new String[0]));
}
return params;
}
@Override
public String getRequestHeader(String name) {
return request.getHeaderString(name);
}
@Override
public void setSessionAttribute(String name, Object value) {
session.addAttribute(name, value);
}
@Override
public Object getSessionAttribute(String name) {
return session.getAttribute(name);
}
@Override
public String getRequestMethod() {
return request.getMethod();
}
@Override
public void writeResponseContent(String content) {
try {
context.getEntityStream().write(content.getBytes(Charsets.UTF_8));
} catch (IOException e) {
logger.error("Failed while writing the response content", e);
throw new MinnalException("Failed while writing the response content", e);
}
}
@Override
public void setResponseStatus(final int code) {
StatusType type = Response.Status.fromStatusCode(code);
if (type == null) {
type = new StatusType() {
@Override
public int getStatusCode() {
return code;
}
@Override
public String getReasonPhrase() {
return null;
}
@Override
public Family getFamily() {
return Family.familyOf(code);
}
};
}
response = new OutboundJaxrsResponse(type, context);
}
@Override
public void setResponseHeader(String name, String value) {
response.getHeaders().add(name, value);
}
public String getServerName() {
return request.getUriInfo().getRequestUri().getHost();
}
@Override
public int getServerPort() {
return request.getUriInfo().getRequestUri().getPort();
}
@Override
public String getScheme() {
return request.getUriInfo().getRequestUri().getScheme();
}
@Override
public String getFullRequestURL() {
return request.getUriInfo().getRequestUri().toASCIIString();
}
}