
com.oneandone.iocunit.contexts.jaxrs.RequestImpl Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of ioc-unit-contexts Show documentation
Show all versions of ioc-unit-contexts Show documentation
Allows tests based on cdi only
package com.oneandone.iocunit.contexts.jaxrs;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.core.EntityTag;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Variant;
import org.jboss.resteasy.core.request.ServerDrivenNegotiation;
import org.jboss.resteasy.plugins.server.servlet.ServletUtil;
import org.jboss.resteasy.specimpl.MultivaluedMapImpl;
import org.jboss.resteasy.util.DateUtil;
import org.jboss.resteasy.util.Encode;
import org.jboss.resteasy.util.HttpHeaderNames;
import org.jboss.resteasy.util.HttpResponseCodes;
/**
* Treaked from resteasy RequestImpl
*/
public class RequestImpl implements Request {
private HttpHeaders headers;
private String varyHeader;
private String httpMethod;
private HttpServletRequest request;
private HttpServletResponse response;
public RequestImpl(HttpServletRequest request, HttpServletResponse response) {
this.headers = ServletUtil.extractHttpHeaders(request);
this.httpMethod = request.getMethod().toUpperCase();
this.request = request;
this.response = response;
}
public String getMethod() {
return httpMethod;
}
public MultivaluedMap getFormParameters() {
MultivaluedMapImpl params = new MultivaluedMapImpl();
Map parameterMap = request.getParameterMap();
for (Map.Entry entry : parameterMap.entrySet()) {
for (String value : entry.getValue()) {
params.add(entry.getKey(), value);
}
}
return Encode.decode(params);
}
public Variant selectVariant(List variants) throws IllegalArgumentException {
if (variants == null || variants.size() == 0)
throw new IllegalArgumentException("Variant list must not be zero");
ServerDrivenNegotiation negotiation = new ServerDrivenNegotiation();
MultivaluedMap requestHeaders = headers.getRequestHeaders();
negotiation.setAcceptHeaders(requestHeaders.get(HttpHeaderNames.ACCEPT));
negotiation.setAcceptCharsetHeaders(requestHeaders.get(HttpHeaderNames.ACCEPT_CHARSET));
negotiation.setAcceptEncodingHeaders(requestHeaders.get(HttpHeaderNames.ACCEPT_ENCODING));
negotiation.setAcceptLanguageHeaders(requestHeaders.get(HttpHeaderNames.ACCEPT_LANGUAGE));
varyHeader = createVaryHeader(variants);
response.addHeader(HttpHeaderNames.VARY, varyHeader);
return negotiation.getBestMatch(variants);
}
public static String createVaryHeader(List variants) {
boolean accept = false;
boolean acceptLanguage = false;
boolean acceptEncoding = false;
for (Variant variant : variants) {
if (variant.getMediaType() != null)
accept = true;
if (variant.getLanguage() != null)
acceptLanguage = true;
if (variant.getEncoding() != null)
acceptEncoding = true;
}
String vary = null;
if (accept)
vary = HttpHeaderNames.ACCEPT;
if (acceptLanguage) {
if (vary == null)
vary = HttpHeaderNames.ACCEPT_LANGUAGE;
else
vary += ", " + HttpHeaderNames.ACCEPT_LANGUAGE;
}
if (acceptEncoding) {
if (vary == null)
vary = HttpHeaderNames.ACCEPT_ENCODING;
else
vary += ", " + HttpHeaderNames.ACCEPT_ENCODING;
}
return vary;
}
public List convertEtag(List tags) {
ArrayList result = new ArrayList();
for (String tag : tags) {
String[] split = tag.split(",");
for (String etag : split) {
result.add(EntityTag.valueOf(etag.trim()));
}
}
return result;
}
public Response.ResponseBuilder ifMatch(List ifMatch, EntityTag eTag) {
boolean match = false;
for (EntityTag tag : ifMatch) {
if (tag.equals(eTag) || tag.getValue().equals("*")) {
match = true;
break;
}
}
if (match)
return null;
return Response.status(HttpResponseCodes.SC_PRECONDITION_FAILED).tag(eTag);
}
public Response.ResponseBuilder ifNoneMatch(List ifMatch, EntityTag eTag) {
boolean match = false;
for (EntityTag tag : ifMatch) {
if (tag.equals(eTag) || tag.getValue().equals("*")) {
match = true;
break;
}
}
if (match) {
if ("GET".equals(httpMethod) || "HEAD".equals(httpMethod)) {
return Response.notModified(eTag);
}
return Response.status(HttpResponseCodes.SC_PRECONDITION_FAILED).tag(eTag);
}
return null;
}
public Response.ResponseBuilder evaluatePreconditions(EntityTag eTag) {
if (eTag == null)
throw new IllegalArgumentException("eTag param null");
Response.ResponseBuilder builder = null;
List ifMatch = headers.getRequestHeaders().get(HttpHeaderNames.IF_MATCH);
if (ifMatch != null && ifMatch.size() > 0) {
builder = ifMatch(convertEtag(ifMatch), eTag);
}
if (builder == null) {
List ifNoneMatch = headers.getRequestHeaders().get(HttpHeaderNames.IF_NONE_MATCH);
if (ifNoneMatch != null && ifNoneMatch.size() > 0) {
builder = ifNoneMatch(convertEtag(ifNoneMatch), eTag);
}
}
if (builder != null) {
builder.tag(eTag);
}
if (builder != null && varyHeader != null)
builder.header(HttpHeaderNames.VARY, varyHeader);
return builder;
}
public Response.ResponseBuilder ifModifiedSince(String strDate, Date lastModified) {
Date date = DateUtil.parseDate(strDate);
if (date.getTime() >= lastModified.getTime()) {
return Response.notModified();
}
return null;
}
public Response.ResponseBuilder ifUnmodifiedSince(String strDate, Date lastModified) {
Date date = DateUtil.parseDate(strDate);
if (date.getTime() >= lastModified.getTime()) {
return null;
}
return Response.status(HttpResponseCodes.SC_PRECONDITION_FAILED).lastModified(lastModified);
}
public Response.ResponseBuilder evaluatePreconditions(Date lastModified) {
if (lastModified == null)
throw new IllegalArgumentException("lastModified param null");
Response.ResponseBuilder builder = null;
String ifModifiedSince = headers.getRequestHeaders().getFirst(HttpHeaderNames.IF_MODIFIED_SINCE);
if (ifModifiedSince != null) {
builder = ifModifiedSince(ifModifiedSince, lastModified);
}
if (builder == null) {
// System.out.println("ifModified returned null");
String ifUnmodifiedSince = headers.getRequestHeaders().getFirst(HttpHeaderNames.IF_UNMODIFIED_SINCE);
if (ifUnmodifiedSince != null) {
builder = ifUnmodifiedSince(ifUnmodifiedSince, lastModified);
}
}
if (builder != null && varyHeader != null)
builder.header(HttpHeaderNames.VARY, varyHeader);
return builder;
}
public Response.ResponseBuilder evaluatePreconditions(Date lastModified, EntityTag eTag) {
if (lastModified == null)
throw new IllegalArgumentException("lastModified param null");
if (eTag == null)
throw new IllegalArgumentException("eTag param null");
Response.ResponseBuilder rtn = null;
Response.ResponseBuilder lastModifiedBuilder = evaluatePreconditions(lastModified);
Response.ResponseBuilder etagBuilder = evaluatePreconditions(eTag);
if (lastModifiedBuilder == null && etagBuilder == null)
rtn = null;
else if (lastModifiedBuilder != null && etagBuilder == null)
rtn = lastModifiedBuilder;
else if (lastModifiedBuilder == null && etagBuilder != null)
rtn = etagBuilder;
else {
rtn = lastModifiedBuilder;
rtn.tag(eTag);
}
if (rtn != null && varyHeader != null)
rtn.header(HttpHeaderNames.VARY, varyHeader);
return rtn;
}
public Response.ResponseBuilder evaluatePreconditions() {
List ifMatch = headers.getRequestHeaders().get(HttpHeaderNames.IF_MATCH);
if (ifMatch == null || ifMatch.size() == 0) {
return null;
}
return Response.status(HttpResponseCodes.SC_PRECONDITION_FAILED);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy