UrlTools.java

package eu.javaexperience.url;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Pattern;

import eu.javaexperience.arrays.ArrayTools;
import eu.javaexperience.collection.map.SmallMap;
import eu.javaexperience.reflect.Mirror;

public class UrlTools
{
	private UrlTools() {}
	
	public static final Pattern domSplit = Pattern.compile("\\.");
	public static final Pattern pathSplit = Pattern.compile("/+");
	
	public static void modifyUrlDecode(String[] arr)
	{
		for(int i= 0;i<arr.length;i++)
			arr[i] = URLDecoder.decode(arr[i]);
	}
	
	public static Map<String,String[]> resolvMap(String params)
	{
		String[] pairs = params.split("&");
		Map<String,String[]> ret = new SmallMap<>();
		for (String pair : pairs)
		{
			int idx = pair.indexOf("=");
			String key = idx > 0 ? pair.substring(0, idx): pair;
			String value = idx > 0 && pair.length() > idx + 1 ?pair.substring(idx + 1): "";
			if(null != value)
			{
				value = URLDecoder.decode(value);
			}
			String[] add = ret.get(key);
			if(null == add)
			{
				add = new String[]{value};
			}
			else
			{
				add = Arrays.copyOf(add, add.length+1);
				add[add.length-1] = value;
			}
			ret.put(key, add);
		}
		return ret;
	}
	
	public static Map<String,String> convMapMulti(Map<String,String[]> map)
	{
		Map<String,String> ret = new HashMap<>();
		for(Entry<String, String[]> kv:map.entrySet())
			if(kv.getValue() != null)
				if(kv.getValue().length > 0)
					ret.put(kv.getKey(), kv.getValue()[0]);
		
		return ret;
	}
	
	public static void fillMultiMap(Map<String, String> dst, Map<String,String[]> map)
	{
		for(Entry<String, String[]> kv:map.entrySet())
			if(kv.getValue() != null)
				if(kv.getValue().length > 0)
					dst.put(kv.getKey(), kv.getValue()[0]);
	}
	
	public static Map<String,String> convMap(Map<String,String> map)
	{
		Map<String,String> ret = new HashMap<>();
		for(Entry<String, String> kv:map.entrySet())
			if(kv.getValue() != null)
				ret.put(kv.getKey(), kv.getValue());
		
		return ret;
	}
	
	/**
	 * ami a ? után van: asd=bsd&fgt=jhf
	 * @throws UnsupportedEncodingException 
	 * */
	public static void processArgsRequest(String line, Map<String,String[]> target) throws UnsupportedEncodingException
	{
		if("".equals(line))
		{
			return;
		}
		String[] pairs = line.split("&"); //ez megint gyorsabb
		for (String pair : pairs)
		{
			int idx = pair.indexOf("=");
			String key = idx > 0 ? URLDecoder.decode(pair.substring(0, idx), "UTF-8") : pair;
			String value = idx > 0 && pair.length() > idx + 1 ? URLDecoder.decode(pair.substring(idx + 1), "UTF-8") : "";
			putParam(target, key, value);
		}	
	}
	
	public static void putParam(Map<String,String[]> map, String key, String value)
	{
		String[] in = map.get(key);
		if(in == null)
			map.put(key, new String[]{value});
		else
			map.put(key, ArrayTools.arrayAppend(in, value));
	}
	
	public static String getParam(Map<String,String[]> map, String key)
	{
		return optParam(map, key, null);
	}
	
	public static String optParam(Map<String,String[]> map, String key, String def)
	{
		String[] ks = map.get(key);
		if(ks == null)
			return def;
		
		if(ks.length > 0)
			return ks[0];
		
		return def;
	}
	
	public static String renderRequestParams(Map<String, Object> params)
	{
		StringBuilder sb = new StringBuilder();
		renderRequestParams(params, sb);
		return sb.toString();
	}
	
	public static void renderRequestParams(Map<String, ? extends Object> params, Appendable app)
	{
		if(null == params || params.size() == 0)
		{
			return;
		}
		try
		{
			boolean nfirst = false;
			app.append("?");
			for(Entry<String, ?> kv:params.entrySet())
			{
				String k = kv.getKey();
				Object val = kv.getValue();
				if(null != k)
				{
					if(nfirst)
					{
						app.append("&");
					}
					nfirst = true;
					
					if(val instanceof String[])
					{
						for(String s:(String[])val)
						{
							appendParam(app, k, s);
						}
					}
					else if(val instanceof String)
					{
						appendParam(app, k, (String) val);
					}
					else if(null == val)
					{
						appendParam(app, k, null);
					}
					else
					{
						appendParam(app, k, val.toString());
					}
				}
			}
		}
		catch(Exception e)
		{
			Mirror.throwSoftOrHardButAnyway(e);
		}
	}
	
	public static void appendParam(Appendable app, String key, String val) throws IOException
	{
		app.append(key);
		
		if(null != val && val.length() > 0)
		{
			app.append("=");
			app.append(URLEncoder.encode(val));
		}
	}
}