package com.revolsys.ui.web.utils;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.util.UrlPathHelper;
import org.springframework.web.util.WebUtils;
import com.revolsys.datatype.DataTypes;
import com.revolsys.ui.web.controller.PathAliasController;
import com.revolsys.util.Property;
public final class HttpServletUtils {
private static ThreadLocal<HttpServletRequest> REQUEST_LOCAL = new ThreadLocal<>();
private static ThreadLocal<HttpServletResponse> RESPONSE_LOCAL = new ThreadLocal<>();
private static final UrlPathHelper URL_PATH_HELPER = new UrlPathHelper();
public static void clearRequestAndResponse() {
REQUEST_LOCAL.remove();
RESPONSE_LOCAL.remove();
}
public static String getAbsoluteUrl(final String url) {
if (url == null) {
return null;
} else if (url.startsWith("/")) {
final HttpServletRequest request = getRequest();
final String serverUrl = getServerUrl(request);
final String contextPath = URL_PATH_HELPER.getOriginatingContextPath(request);
return serverUrl + contextPath + url;
} else {
return url;
}
}
@SuppressWarnings("unchecked")
public static <T> T getAttribute(final String name) {
final HttpServletRequest request = getRequest();
if (request == null) {
return null;
} else {
return (T)request.getAttribute(name);
}
}
public static boolean getBooleanParameter(final HttpServletRequest request,
final String paramName) {
final String value = request.getParameter(paramName);
if (Property.hasValue(value)) {
return Boolean.parseBoolean(value);
}
return false;
}
public static String getFullRequestUrl() {
final HttpServletRequest request = getRequest();
return getFullRequestUrl(request);
}
public static String getFullRequestUrl(final HttpServletRequest request) {
final String serverUrl = getServerUrl(request);
final String requestUri = getOriginatingRequestUri();
return serverUrl + requestUri;
}
public static String getFullUrl(final String url) {
final String aliasUrl = PathAliasController.getPath(url);
return getAbsoluteUrl(aliasUrl);
}
public static int getIntegerParameter(final HttpServletRequest request, final String paramName) {
final String value = request.getParameter(paramName);
if (Property.hasValue(value)) {
try {
return Integer.parseInt(value);
} catch (final NumberFormatException e) {
}
}
return 0;
}
public static String getOriginatingContextPath() {
final HttpServletRequest request = getRequest();
return URL_PATH_HELPER.getOriginatingContextPath(request);
}
public static String getOriginatingRequestUri() {
final HttpServletRequest request = getRequest();
return getOriginatingRequestUri(request);
}
public static String getOriginatingRequestUri(final HttpServletRequest request) {
final String originatingRequestUri = new UrlPathHelper().getOriginatingRequestUri(request);
return originatingRequestUri;
}
public static String getParameter(final String name) {
final HttpServletRequest request = getRequest();
return request.getParameter(name);
}
public static Map<String, Object> getParameterMap(final HttpServletRequest request) {
final Map<String, Object> parameters = new LinkedHashMap<>();
final Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()) {
final String name = parameterNames.nextElement();
final String[] values = request.getParameterValues(name);
if (values.length == 0) {
parameters.put(name, null);
} else if (values.length == 1) {
parameters.put(name, values[0]);
} else if (values.length == 1) {
parameters.put(name, Arrays.asList(values));
}
}
return parameters;
}
public static String[] getParameterValues(final String name) {
final HttpServletRequest request = getRequest();
return request.getParameterValues(name);
}
public static String getPathVariable(final String name) {
return getPathVariables().get(name);
}
public static Map<String, String> getPathVariables() {
final HttpServletRequest request = getRequest();
if (request != null) {
@SuppressWarnings("unchecked")
Map<String, String> pathVariables = (Map<String, String>)request
.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
if (pathVariables == null) {
pathVariables = new HashMap<>();
request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, pathVariables);
}
return pathVariables;
}
return new HashMap<>();
}
public static HttpServletRequest getRequest() {
final HttpServletRequest request = REQUEST_LOCAL.get();
return request;
}
public static String getRequestBaseFileName() {
final String originatingRequestUri = getOriginatingRequestUri();
final String baseName = WebUtils.extractFilenameFromUrlPath(originatingRequestUri);
return baseName;
}
public static String getRequestFileName() {
final String originatingRequestUri = getOriginatingRequestUri();
final String baseName = WebUtils.extractFullFilenameFromUrlPath(originatingRequestUri);
return baseName;
}
public static HttpServletResponse getResponse() {
final HttpServletResponse response = RESPONSE_LOCAL.get();
return response;
}
public static String getServerUrl() {
return getServerUrl(getRequest());
}
public static String getServerUrl(final HttpServletRequest request) {
final String scheme = request.getScheme();
final String serverName = request.getServerName();
final int serverPort = request.getServerPort();
final StringBuilder url = new StringBuilder();
url.append(scheme);
url.append("://");
url.append(serverName);
if ("http".equals(scheme)) {
if (serverPort != 80 && serverPort != -1) {
url.append(":").append(serverPort);
}
} else if ("https".equals(scheme)) {
if (serverPort != 443 && serverPort != -1) {
url.append(":").append(serverPort);
}
}
return url.toString();
}
public static boolean isApiCall() {
final HttpServletRequest request = getRequest();
return isApiCall(request);
}
public static boolean isApiCall(final HttpServletRequest request) {
final String requestedWith = request.getHeader("x-requested-with");
if (Property.hasValue(requestedWith)) {
return true;
} else {
final String referrer = request.getHeader("referrer");
if (Property.hasValue(referrer)) {
return false;
} else {
final String accept = request.getHeader("accept");
if (accept == null) {
return true;
} else {
return !accept.contains("*/*");
}
}
}
}
public static <T> T notFound() {
final HttpServletResponse response = getResponse();
try {
response.sendError(HttpServletResponse.SC_NOT_FOUND, "Not found");
} catch (final IOException e) {
}
return null;
}
public static void redirect(final String url) {
try {
final HttpServletResponse response = getResponse();
response.sendRedirect(url);
} catch (final IOException e) {
}
}
public static <T> T seeOther(final String location) {
final HttpServletResponse response = getResponse();
response.setStatus(HttpServletResponse.SC_SEE_OTHER);
response.setHeader("Location", location);
return null;
}
public static <T> T sendRedirect(final String location) {
final HttpServletResponse response = getResponse();
try {
response.sendRedirect(location);
} catch (final IOException e) {
}
return null;
}
public static void setAttribute(final String name, final Object value) {
final HttpServletRequest request = getRequest();
request.setAttribute(name, value);
}
public static Charset setContentTypeWithCharset(final HttpHeaders headers, MediaType mediaType) {
Charset charset = mediaType.getCharSet();
if (charset == null) {
charset = StandardCharsets.UTF_8;
final Map<String, String> params = Collections.singletonMap("charset", "utf-8");
mediaType = new MediaType(mediaType, params);
}
headers.setContentType(mediaType);
return charset;
}
public static Charset setContentTypeWithCharset(final HttpOutputMessage outputMessage,
final MediaType mediaType) {
final HttpHeaders headers = outputMessage.getHeaders();
return setContentTypeWithCharset(headers, mediaType);
}
public static void setPathVariable(final String name, final Object value) {
if (value == null) {
setPathVariable(name, null);
} else {
setPathVariable(name, DataTypes.toString(value));
}
}
public static void setPathVariable(final String name, final String value) {
getPathVariables().put(name, value);
}
public static void setRequestAndResponse(final HttpServletRequest request,
final HttpServletResponse response) {
REQUEST_LOCAL.set(request);
RESPONSE_LOCAL.set(response);
}
private HttpServletUtils() {
}
}