ContextRequestWrapper.java

package sk.iway.iwcm.system.context;

import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpSession;

import sk.iway.iwcm.Constants;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.SetCharacterEncodingFilter;
import sk.iway.iwcm.Tools;

/**
 *  ContextRequestWrapper.java
 *
 *@Title        webjet7
 *@Company      Interway s.r.o. (www.interway.sk)
 *@Copyright    Interway s.r.o. (c) 2001-2012
 *@author       $Author: jeeff jeeff $
 *@version      $Revision: 1.3 $
 *@created      Date: 10.8.2012 14:23:53
 *@modified     $Date: 2004/08/16 06:26:11 $
 */
public class ContextRequestWrapper extends HttpServletRequestWrapper
{
	private HttpServletRequest original;
	private final String contextPath;
	private Map<String, List<String>> changedParameters;

	public ContextRequestWrapper(HttpServletRequest request)
	{
		super(request);
		this.contextPath = request.getContextPath();
		this.original = request;
		changedParameters = new Hashtable<>();
	}

	/**
	 * Odstrani context path z celej sady parametrov
	 * @param values
	 * @return
	 */
	private String[] removeCp(String[] values)
	{
		String[] newValues = new String[values.length];
		for (int i=0; i<values.length; i++)
		{
			newValues[i] = ContextFilter.removeContextPath(contextPath, values[i]);
		}
		return newValues;
	}

	@Override
	public String getParameter(String name)
	{
		String ret = ContextFilter.removeContextPath(contextPath, original.getParameter(name));
		List<String> changed = changedParameters.get(name);
		if (changed != null && changed.size()>0) ret = ContextFilter.removeContextPath(contextPath, changed.get(0));
		//Logger.debug(ContextRequestWrapper.class, "getParameter n="+name+"="+original.getParameter(name)+" super="+super.getParameter(name)+" ret="+ret);
		return ret;
	}

	@Override
	public Map<String, String[]> getParameterMap()
	{
		//Logger.debug(ContextRequestWrapper.class, "getParameterMap");
		Map<String, String[]> newMap = new LinkedHashMap<>();
		Set<Map.Entry<String, String[]>> set = original.getParameterMap().entrySet();
		for(Map.Entry<String, String[]> me : set)
		{
			newMap.put(me.getKey(), removeCp(me.getValue()));
		}

		//prenes zmeny z changed parameters
		for (Map.Entry<String, List<String>> me : changedParameters.entrySet())
		{
			//Logger.debug(ContextRequestWrapper.class, "Pridavam parameter: "+me.getKey()+" val="+me.getValue());
			newMap.put(me.getKey(), removeCp(me.getValue().toArray(new String[0])));
		}

		return newMap;
	}

	@Override
	public String[] getParameterValues(String name)
	{
		//Logger.debug(ContextRequestWrapper.class, "getParameterValues, name="+name);
		return removeCp(original.getParameterValues(name));
	}

	@Override
	public void setRequest(ServletRequest request)
	{
		super.setRequest(request);
		if (request instanceof HttpServletRequest)
		{
			original = (HttpServletRequest)request;
			//TODO: sparsovanie QS na parametre
			parseUrlParameters(((HttpServletRequest)request).getQueryString());
		}
	}

	/**
	 * Toto sa vola napr. v PathFilter ked sa spravi include /showdoc.do?docid=XX a musia sa sparsovat aj QueryString parametre
	 * @param url
	 */
	private void parseUrlParameters(String url)
	{
		if (Tools.isEmpty(url)) return;

		String[] urlParts = url.split("\\?");
		if (urlParts.length > 1)
		{
			String query = urlParts[1];
			for (String param : query.split("&"))
			{
				try
				{
					String[] pair = param.split("=");
					String key = URLDecoder.decode(pair[0], SetCharacterEncodingFilter.getEncoding());
					String value = "";
					if (pair.length > 1)
					{
						value = URLDecoder.decode(pair[1], SetCharacterEncodingFilter.getEncoding());
					}
					List<String> values = changedParameters.get(key);
					if (values == null)
					{
						values = new ArrayList<>();
						changedParameters.put(key, values);
					}
					values.add(value);
				}
				catch (Exception e)
				{
					sk.iway.iwcm.Logger.error(e);
				}
			}
		}
	}

	@Override
	public String getServletPath()
	{
		String servletPath = super.getServletPath();

		if (Tools.isNotEmpty(contextPath) && "/".equals(contextPath)==false && servletPath.startsWith(contextPath))
		{
			try
			{
				servletPath = servletPath.substring(contextPath.length());
			}
			catch (Exception e)
			{
				sk.iway.iwcm.Logger.error(e);
			}

		}

		return servletPath;
	}

	@Override
	public HttpSession getSession()
	{
		if (Constants.getBoolean("contextPathDebug")) Logger.debug(ContextRequestWrapper.class, "GET SESSION="+original.getSession().getId());

		return original.getSession();
	}
}