All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jglue.cdiunit.internal.jaxrs.RequestImpl Maven / Gradle / Ivy

There is a newer version: 5.0.0-EA7
Show newest version
package org.jglue.cdiunit.internal.jaxrs;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
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