RequestBean.java

package sk.iway.iwcm;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import javax.servlet.http.HttpServletRequest;

import org.springframework.context.ApplicationContext;

/**
 *  RequestBean.java - drzi zakladne info z requestu, uklada sa do hash tabulky podla thread ID
 *
 *@Title        webjet4
 *@Company      Interway s.r.o. (www.interway.sk)
 *@Copyright    Interway s.r.o. (c) 2001-2008
 *@author       $Author: jeeff $
 *@version      $Revision: 1.5 $
 *@created      Date: 16.12.2008 10:28:07
 *@modified     $Date: 2010/02/09 08:31:11 $
 */
public class RequestBean
{
	private int userId;
	private String remoteIP;
	private String remoteHost;
	private String baseHref;
	private String lng;
	private String url;
	private String queryString;
	private String userAgent;
	private String domain;
	private String httpProtocol;
	private String serverName;
	private int httpPort;
	private String sessionId;
	private String cryptoPrivateKey;
	private boolean isUserAdmin = false;
	private Map<String, String[]> parameters = new HashMap<>();
	private String headerOrigin;
	private List<String> allowedParameters = new LinkedList<>();
	private Map<String, String[]> auditValues = new HashMap<>();

	private List<String> errors;

	private HttpServletRequest request;
	private String referrer;

	private List<String> textKeyPrefixes = null;

	private ApplicationContext springContext;

	//umoznuje prenasat atributy podobne ako request.set/getAttribute
	private Map<String, Object> attributes;

	private int docId;
	private int groupId;

	public int getUserId()
	{
		return userId;
	}
	public void setUserId(int userId)
	{
		this.userId = userId;
	}
	public String getRemoteIP()
	{
		return remoteIP;
	}
	public void setRemoteIP(String remoteIP)
	{
		this.remoteIP = remoteIP;
	}
	public String getRemoteHost()
	{
		return remoteHost;
	}
	public void setRemoteHost(String remoteHost)
	{
		this.remoteHost = remoteHost;
	}
	public String getBaseHref()
	{
		return baseHref;
	}
	public void setBaseHref(String baseHref)
	{
		this.baseHref = baseHref;
	}
	public String getLng()
	{
		return lng;
	}
	public void setLng(String lng)
	{
		this.lng = lng;
	}
	public String getUrl()
	{
		return url;
	}
	public void setUrl(String url)
	{
		this.url = url;
	}
	public String getQueryString()
	{
		return queryString;
	}
	public void setQueryString(String queryString)
	{
		this.queryString = queryString;
	}
	public String getUserAgent()
	{
		return userAgent;
	}
	public void setUserAgent(String userAgent)
	{
		this.userAgent = userAgent;
	}
	public String getDomain()
	{
		return domain;
	}
	public void setDomain(String domain)
	{
		this.domain = domain;
	}
	public String getSessionId()
	{
		return sessionId;
	}
	public void setSessionId(String sessionId)
	{
		this.sessionId = sessionId;
	}
	public String getCryptoPrivateKey() { return cryptoPrivateKey; }
	public void setCryptoPrivateKey(String cryptoPrivateKey) { this.cryptoPrivateKey = cryptoPrivateKey; }

    /**
	 * Ziska HTTP request, nenastavi sa tam ale automaticky ale len pre urcite pripady, vid SetCharacterEncodingFilter
	 * @return
	 */
	public HttpServletRequest getRequest()
	{
		return request;
	}
	public void setRequest(HttpServletRequest request)
	{
		this.request = request;
	}

	public boolean isUserAdmin()
	{
		return isUserAdmin;
	}
	public void setUserAdmin(boolean isUserAdmin)
	{
		this.isUserAdmin = isUserAdmin;
	}

	public Map<String, String[]> getParameters() {
		if (allowedParameters != null && allowedParameters.size() > 0) {
			parameters = parameters.entrySet().stream().filter(x -> allowedParameters.contains(x.getKey())).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
		}

		return parameters;
	}

	protected Map<String, String[]> getAllParameters() {
		return parameters;
	}

	public void setParameters(Map<String, String[]> parameters) {
		LinkedHashMap<String, String[]> map = new LinkedHashMap<>();
		map.putAll(parameters);
		this.parameters = map;
	}

	public Enumeration<String> getParameterNames()
	{
		return Collections.enumeration(getParameters().keySet());
	}

	public String getParameter(String parameter)
	{
		if (getAllParameters().containsKey(parameter)) {
			return getAllParameters().get(parameter)[0];
		}

		return null;
	}

	public String[] getParameterValues(String parameter)
	{
		if (getAllParameters().containsKey(parameter)) {
			return getAllParameters().get(parameter);
		}

		return null;
	}

	public boolean hasParameter(String key)
	{
		return getAllParameters().containsKey(key);

	}

	public String getReferrer() {
		return referrer;
	}

	public void setReferrer(String referrer) {
		this.referrer = referrer;
	}

	public List<String> getAllowedParameters() {
		return allowedParameters;
	}

	public void setAllowedParameters(List<String> allowedParameters) {
		this.allowedParameters = allowedParameters;
	}

	public static void addAllowedParameter(String allowedParameter) {
		RequestBean requestBean = SetCharacterEncodingFilter.getCurrentRequestBean();
		if (requestBean != null) {
			List<String> parameters = requestBean.getAllowedParameters();
			parameters.add(allowedParameter);
			requestBean.setAllowedParameters(parameters);
		}
	}

	public static boolean hasAllowedParameters() {
		RequestBean requestBean = SetCharacterEncodingFilter.getCurrentRequestBean();
		if (requestBean != null) {
			return requestBean.getAllowedParameters() != null && !requestBean.getAllowedParameters().isEmpty();
		}

		return false;
	}

	public static void addParameter(String key, String value) {
		RequestBean requestBean = SetCharacterEncodingFilter.getCurrentRequestBean();
		if (requestBean != null) {
			Map<String, String[]> parameters = requestBean.getAllParameters();
			String[] val = parameters.get(key);
			if (val != null) {
				List<String> strings = new ArrayList<>(Arrays.asList(val));
				strings.add(value);
				val = strings.toArray(new String[0]);
			}
			else {
				val = new String[]{value};
			}

			parameters.put(key, val);
			requestBean.setParameters(parameters);
		}
	}

	public static void addParameter(String key, String[] value) {
		RequestBean requestBean = SetCharacterEncodingFilter.getCurrentRequestBean();
		if (requestBean != null) {
			Map<String, String[]> parameters = requestBean.getAllParameters();
			parameters.put(key, value);
			requestBean.setParameters(parameters);
		}
	}

	public Map<String, String[]> getAuditValues(boolean createIfNull) {
		if (createIfNull && auditValues == null) {
			auditValues = new LinkedHashMap<>();
		}
		return auditValues;
	}

	/**
	 * Add audit value for use with AuditEntityListener
	 * @param key
	 * @param value
	 */
	public static void addAuditValue(String key, String value) {
		RequestBean requestBean = SetCharacterEncodingFilter.getCurrentRequestBean();
		if (requestBean != null) {
			Map<String, String[]> auditValues = requestBean.getAuditValues(true);
			String[] val = auditValues.get(key);
			if (val != null) {
				List<String> strings = new ArrayList<>(Arrays.asList(val));
				strings.add(value);
				val = strings.toArray(new String[0]);
			}
			else {
				val = new String[]{value};
			}

			auditValues.put(key, val);
		}
	}

	public static void removeAuditValue(String key) {
		RequestBean requestBean = SetCharacterEncodingFilter.getCurrentRequestBean();
		if (requestBean != null) {
			Map<String, String[]> auditValues = requestBean.getAuditValues(false);
			if (auditValues != null) {
				auditValues.remove(key);
			}
		}
	}

	public static void addError(String error) {
		addError(error, true);
	}

	public static void addError(String error, boolean addToEnd) {
		RequestBean requestBean = SetCharacterEncodingFilter.getCurrentRequestBean();
		if (requestBean != null) {
			List<String> errors = requestBean.getErrors();

			if (errors == null) {
				errors = new ArrayList<>();
			}
			if (addToEnd) errors.add(error);
			else errors.add(0, error);

			requestBean.setErrors(errors);
		}
	}

	public List<String> getErrors() {
		return errors;
	}

	public void setErrors(List<String> errors) {
		this.errors = errors;
	}

	public String getErrorsString()
	{
		return Tools.join(getErrors(), ",");
	}

	/**
	 * Umozni nastavit atribut vramci requestu podobne ako request.setAttribute
	 * @param key
	 * @param value
	 */
	public static void setAttribute(String key, Object value) {
		RequestBean rb = SetCharacterEncodingFilter.getCurrentRequestBean();
		if (rb == null) return;

		if (rb.attributes==null) rb.attributes = new HashMap<>();
		rb.attributes.put(key, value);
	}

	/**
	 * Umozni ziskat atribut vramci requestu podobne ako request.setAttribute
	 * @param key
	 * @return
	 */
	public static Object getAttribute(String key) {
		RequestBean rb = SetCharacterEncodingFilter.getCurrentRequestBean();
		if (rb == null) return null;

		if (rb.attributes == null) return null;
		return rb.attributes.get(key);
	}

    /**
     * Prida prefix pre textove kluce, nasledne sa hlada preklad podla prefixu (posledny v zozname ma najvacsiu prioritu)
     * @param prefix
     * @param addToLastPosition
     */
    public static void addTextKeyPrefix(String prefix, boolean addToLastPosition) {
        RequestBean requestBean = SetCharacterEncodingFilter.getCurrentRequestBean();
        if (requestBean != null) {
            if (requestBean.textKeyPrefixes==null) requestBean.textKeyPrefixes = new ArrayList<>();
            if (addToLastPosition) requestBean.textKeyPrefixes.add(prefix);
            else requestBean.textKeyPrefixes.add(0, prefix);
        }

    }

    /**
     * Vrati zoznam prefixov pre textove kluce
     * @return
     */
    public static List<String> getTextKeyPrefixes() {
        RequestBean requestBean = SetCharacterEncodingFilter.getCurrentRequestBean();
        if (requestBean != null) return requestBean.textKeyPrefixes;

        return null;
    }

	public ApplicationContext getSpringContext() {
		return springContext;
	}

	public void setSpringContext(ApplicationContext springContext) {
		this.springContext = springContext;
	}

	public <T> T getSpringBean(String name, Class<T> clazz) {
        if (springContext == null || !springContext.containsBean(name)) {
            return null;
        }

        return springContext.getBean(name, clazz);
    }

	/**
	 * Staticka metoda pre zistenie, ci je prihlaseny admin
	 * @return
	 */
	public static boolean isAdminLogged()
	 {
		 RequestBean requestBean = SetCharacterEncodingFilter.getCurrentRequestBean();
		 if (requestBean != null) {
			 return requestBean.isUserAdmin;
		 }
		 return false;
	 }
	/**
	 * Vrati protokol/schemu pouziteho HTTP requestu
	 * @return
	 */
	public String getHttpProtocol() {
		return httpProtocol;
	}
	public void setHttpProtocol(String httpProtocol) {
		this.httpProtocol = httpProtocol;
	}
	/**
	 * Vrati port HTTP pripojenia
	 */
	public int getHttpPort() {
		return httpPort;
	}
	public void setHttpPort(int httpPort) {
		this.httpPort = httpPort;
	}
	/**
	 * Vrati request.getServerName(), moze byt odlisne od getDomain,
	 * ktora berie do uvahy aj nastavenu domenu stranky
	 * @return
	 */
	public String getServerName() {
		return serverName;
	}
	public void setServerName(String serverName) {
		this.serverName = serverName;
	}

	/**
	 * Vrati hodnotu HTTP hlavicky origin
	 * @return
	 */
	public String getHeaderOrigin() {
		return headerOrigin;
	}
	public void setHeaderOrigin(String headerOrigin) {
		this.headerOrigin = headerOrigin;
	}
	public int getDocId() {
		return docId;
	}
	public void setDocId(int docId) {
		this.docId = docId;
	}
	public int getGroupId() {
		return groupId;
	}
	public void setGroupId(int groupId) {
		this.groupId = groupId;
	}
}