/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.asual.summer.core.util;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import javax.inject.Named;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.util.WebUtils;
import com.asual.summer.core.RequestFilter;
/**
*
* @author Rostislav Hristov
*
*/
@Named
public class RequestUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
private static final String QUERY_STRING_SEPARATOR = "?";
private static final String PARAMETER_SEPARATOR = "&";
private static final String NAME_VALUE_SEPARATOR = "=";
public static HttpServletRequest getRequest() {
return RequestFilter.getRequest();
}
public static String getRequestUri() {
String requestUri = (String) getAttribute(WebUtils.FORWARD_REQUEST_URI_ATTRIBUTE);
if (requestUri != null) {
return requestUri;
}
return getRequest().getRequestURI();
}
public static String getQueryString() {
String requestURI = (String) getAttribute(WebUtils.FORWARD_REQUEST_URI_ATTRIBUTE);
if (requestURI != null) {
return (String) getAttribute(WebUtils.FORWARD_QUERY_STRING_ATTRIBUTE);
}
return getRequest().getQueryString();
}
public static String getUrl() {
return getRequestUri() + (getQueryString() != null ? QUERY_STRING_SEPARATOR + getQueryString() : "");
}
public static UrlBuilder getUrlBuilder() {
return getUrlBuilder(getUrl());
}
public static UrlBuilder getUrlBuilder(String url) {
return new UrlBuilder(url);
}
public static Map<String, Object[]> getParameterMap() {
Map<String, Object[]> normalized = new HashMap<String, Object[]>();
Map<String, String[]> params = getRequest().getParameterMap();
for (String key : params.keySet()) {
String[] value = (String[]) params.get(key);
Object[] result = new Object[value.length];
for (int i = 0; i < value.length; i++) {
result[i] = ObjectUtils.convert(value[i]);
}
normalized.put(key, result);
}
return normalized;
}
public static Object getParameter(String name) {
if (getParameterMap().get(name) != null) {
return getParameterMap().get(name)[0];
}
return null;
}
public static Object[] getParameterValues(String name) {
return getParameterMap().get(name);
}
public static String getHeader(String name) {
return getRequest().getHeader(name);
}
public static String getUserAgent() {
return getHeader("User-Agent");
}
public static boolean isValidation() {
return "Validation".equalsIgnoreCase(getHeader("X-Requested-Operation"));
}
public static boolean isAjaxRequest() {
return "XMLHttpRequest".equalsIgnoreCase(getHeader("X-Requested-With"));
}
public static boolean isGetRequest() {
return "GET".equalsIgnoreCase(getRequest().getMethod());
}
public static boolean isPostRequest() {
return "POST".equalsIgnoreCase(getRequest().getMethod());
}
public static boolean isMethodBrowserSupported(String method) {
return ("GET".equalsIgnoreCase(method) || "POST".equalsIgnoreCase(method));
}
public static boolean isGecko() {
String userAgent = getUserAgent();
if (userAgent != null) {
return Pattern.compile("Mozilla").matcher(userAgent).find() && !Pattern.compile("compatible|WebKit").matcher(userAgent).find();
}
return false;
}
public static boolean isTrident() {
String userAgent = getUserAgent();
if (userAgent != null) {
return Pattern.compile("MSIE").matcher(userAgent).find() && !Pattern.compile("Opera").matcher(userAgent).find();
}
return false;
}
public static boolean isPresto() {
String userAgent = getUserAgent();
if (userAgent != null) {
return Pattern.compile("Opera").matcher(userAgent).find();
}
return false;
}
public static boolean isWebKit() {
String userAgent = getUserAgent();
if (userAgent != null) {
return Pattern.compile("WebKit").matcher(userAgent).find();
}
return false;
}
public static String getEngine() {
if (isGecko()) {
return "gecko";
} else if (isTrident()) {
return "trident";
} else if (isPresto()) {
return "presto";
} else if (isWebKit()) {
return "webkit";
}
return null;
}
public static void setAttribute(String name, Object value) {
getRequest().setAttribute(name, value);
}
public static Object getAttribute(String name) {
return getRequest().getAttribute(name);
}
public static String serializeParameters(Map<String, String[]> parameterMap) {
List<String> pairs = new ArrayList<String>();
for (String key : parameterMap.keySet()) {
for (String value : parameterMap.get(key)) {
pairs.add(key + NAME_VALUE_SEPARATOR + StringUtils.encode(value));
}
}
return StringUtils.join(pairs, PARAMETER_SEPARATOR);
}
public static String contextRelative(String uri, boolean contextRelative) {
if (uri != null && uri.startsWith("/")) {
String contextPath = getRequest().getContextPath();
uri = uri.replaceFirst("^" + contextPath + "/?", "/");
if (contextRelative) {
uri = contextPath.concat(uri);
}
}
return uri;
}
public static Throwable getError() {
return (Throwable) getAttribute("javax.servlet.error.exception");
}
public static int getErrorCode() {
return (Integer) getAttribute("javax.servlet.error.status_code");
}
public static ServletContext getServletContext() {
if (applicationContext instanceof WebApplicationContext) {
return ((WebApplicationContext) applicationContext).getServletContext();
}
return null;
}
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
RequestUtils.applicationContext = applicationContext;
}
private static class UrlBuilder {
private String path;
private String extension;
private Map<String, List<String>> parameters = new LinkedHashMap<String, List<String>>();
public UrlBuilder(String url) {
int index = url.indexOf(QUERY_STRING_SEPARATOR);
String urlPath = index != -1 ? url.substring(0, index) : url;
setPath(urlPath.replaceFirst("\\.[^/]*$", ""));
setExtension(urlPath.equals(path) ? null : urlPath.substring(path.length() + 1));
if (index != -1) {
addParameters(url.substring(index + 1));
}
}
public UrlBuilder setPath(String path) {
this.path = path;
return this;
}
public UrlBuilder setExtension(String extension) {
this.extension = extension;
return this;
}
@SuppressWarnings("unused")
public UrlBuilder addPath(String path) {
setPath(this.path.concat("/" + path.replaceFirst("^/", "")));
return this;
}
@SuppressWarnings("unused")
public UrlBuilder removePath(String path) {
setPath(this.path.replaceFirst(path + "$", ""));
return this;
}
public UrlBuilder addParameter(String parameter) {
if (!StringUtils.isEmpty(parameter)) {
String[] pair = parameter.split(NAME_VALUE_SEPARATOR);
if (pair.length > 0) {
addParameter(pair[0], pair.length > 1 ? StringUtils.decode(pair[1]) : null);
}
}
return this;
}
public UrlBuilder addParameter(String name, Object value) {
if (value != null) {
List<String> values;
if (parameters.containsKey(name)) {
values = parameters.get(name);
} else {
values = new ArrayList<String>();
}
if (value instanceof String) {
values.add((String) value);
} else if (value.getClass().isArray()) {
for (Object v : (Object[]) value) {
values.add(String.valueOf(v));
}
} else if (value instanceof Collection) {
for (Object v : (Collection<?>) value) {
values.add(String.valueOf(v));
}
} else {
values.add(String.valueOf(value));
}
parameters.put(name, values);
}
return this;
}
public UrlBuilder setParameter(String parameter) {
if (!StringUtils.isEmpty(parameter)) {
String[] pair = parameter.split(NAME_VALUE_SEPARATOR);
if (pair.length > 0) {
setParameter(pair[0], pair.length > 1 ? StringUtils.decode(pair[1]) : null);
}
}
return this;
}
public UrlBuilder setParameter(String name, Object value) {
if (value != null) {
parameters.put(name, new ArrayList<String>());
addParameter(name, value);
} else {
removeParameter(name);
}
return this;
}
public UrlBuilder removeParameter(String name) {
parameters.remove(name);
return this;
}
public UrlBuilder addParameters(String parameters) {
if (!StringUtils.isEmpty(parameters)) {
String[] params = parameters.replaceAll("&", PARAMETER_SEPARATOR).split(PARAMETER_SEPARATOR);
for (String param : params) {
addParameter(param);
}
}
return this;
}
@SuppressWarnings("unused")
public UrlBuilder setParameters(String parameters) {
if (!StringUtils.isEmpty(parameters)) {
String[] params = parameters.replaceAll("&", PARAMETER_SEPARATOR).split(PARAMETER_SEPARATOR);
for (String param : params) {
setParameter(param);
}
}
return this;
}
public String toString() {
StringBuilder sb = new StringBuilder();
if (!StringUtils.isEmpty(extension)) {
sb.append(path.replaceAll("(.+)/$", "$1"));
if (!extension.startsWith(".")) {
sb.append(".");
}
sb.append(extension);
} else {
sb.append(path);
}
for (String key : parameters.keySet()) {
sb.append(sb.toString().contains(QUERY_STRING_SEPARATOR) ? PARAMETER_SEPARATOR : QUERY_STRING_SEPARATOR);
int count = 0;
for (String v : parameters.get(key)) {
if (count != 0) {
sb.append(PARAMETER_SEPARATOR);
}
sb.append(key);
sb.append(NAME_VALUE_SEPARATOR);
sb.append(StringUtils.encode(v));
count++;
}
}
return sb.toString();
}
}
}