package com.constellio.app.ui.params; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; import com.vaadin.server.Page; import com.vaadin.ui.UI; public class ParamUtils { public static final String PARAM_SEP = ";"; public static final String NAME_VALUE_SEP = "="; public static String getParams() { String path = Page.getCurrent().getUriFragment(); return getParams(path); } public static Map<String, String> getParamsMap() { String path = getParams(); return getParamsMap(path); } public static String getParams(String path) { if (path != null && path.startsWith("!")) { path = path.substring(1); } path = urlDecode(path); String paramsStr = null; int indexOfSlash = path.lastIndexOf("/"); if (indexOfSlash != -1) { paramsStr = path.substring(indexOfSlash + 1); } else { paramsStr = path; } return paramsStr; } public static void setParams(String newParams) { String viewNameAndParams = UI.getCurrent().getNavigator().getState(); String viewName = StringUtils.substringBefore(viewNameAndParams, "/"); String viewNameAndNewParams = viewName + "/" + newParams; Page.getCurrent().setUriFragment("!" + viewNameAndNewParams, false); } public static void setParams(Map<String, ?> params) { String paramsAsString = addParams("", params); setParams(paramsAsString); } public static String addParams(String viewName, Map<String, ?> params) { String pathWithParams; StringBuffer sb = new StringBuffer(); List<String> keys = new ArrayList<>(); if (params != null) { keys.addAll(params.keySet()); } Collections.sort(keys); if (params != null && !params.isEmpty()) { for (String paramName : keys) { if (sb.length() > 0) { sb.append(PARAM_SEP); } Object paramValue = params.get(paramName); sb.append(paramName); sb.append(NAME_VALUE_SEP); sb.append(paramValue); } } String encodedParams = urlEncode(sb.toString()); if (StringUtils.isNotBlank(viewName)) { pathWithParams = viewName + "/" + encodedParams; } else { pathWithParams = encodedParams; } return pathWithParams; } public static Map<String, String> getParamsMap(String path) { Map<String, String> params = new HashMap<>(); String paramsStr = getParams(path); if (paramsStr != null) { String[] paramsSeparated = paramsStr.split(PARAM_SEP); for (String paramNameAndValue : paramsSeparated) { int indexOfNameValueSep = paramNameAndValue.indexOf(NAME_VALUE_SEP); if (indexOfNameValueSep != -1) { String paramName = paramNameAndValue.substring(0, indexOfNameValueSep); String paramValue = paramNameAndValue.substring(indexOfNameValueSep + 1); params.put(paramName, paramValue); } } } return params; } private static String urlEncode(String text) { try { return URLEncoder.encode(text, "UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } private static String urlDecode(String text) { try { return URLDecoder.decode(text, "UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } }