/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.commons.lang; import javax.ws.rs.core.UriInfo; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLDecoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import static com.google.common.base.Strings.isNullOrEmpty; /** TODO replace this class with URLEncodedUtils */ public class UrlUtils { /** * Retrieve query parameters map from String representation of url * * @param url * @return - <code>Map</code> with parameters names as map keys and parameters values as map values * @throws UnsupportedEncodingException */ public static Map<String, List<String>> getQueryParameters(URL url) throws UnsupportedEncodingException { Map<String, List<String>> params = new HashMap<>(); String query = url.getQuery(); if (query != null) { for (String param : query.split("&")) { String pair[] = param.split("="); String key = URLDecoder.decode(pair[0], "UTF-8"); String value = null; if (pair.length > 1) { value = URLDecoder.decode(pair[1], "UTF-8"); } List<String> values = params.get(key); if (values == null) { values = new ArrayList<>(); params.put(key, values); } values.add(value); } } return params; } /** * Get state query parameter from request url. * * @return state parameter encoded in application/x-www-form-urlencoded MIME format */ public static String getState(URL requestUrl) { final String query = requestUrl.getQuery(); if (!isNullOrEmpty(query)) { int start = query.indexOf("state="); if (start < 0) { return null; } int end = query.indexOf('&', start); if (end < 0) { end = query.length(); } return query.substring(start + 6, end); } return null; } /** * Retrieve parameters map from state parameter. * * @param state * state parameter encoded in application/x-www-form-urlencoded MIME format * @return - <code>Map</code> with parameters names as map keys and parameters values as map values */ public static Map<String, List<String>> getQueryParametersFromState(String state) { Map<String, List<String>> params = new HashMap<>(); if (isNullOrEmpty(state)) { return params; } try { for (String pair : URLDecoder.decode(state, "UTF-8").split("&")) { if (pair.isEmpty()) { continue; } String name; String value; int eq = pair.indexOf('='); if (eq < 0) { name = pair; value = ""; } else { name = pair.substring(0, eq); value = pair.substring(eq + 1); } List<String> paramValues = params.computeIfAbsent(name, values -> new ArrayList<>()); paramValues.add(value); } } catch (UnsupportedEncodingException ignored) { // should never happen, UTF-8 supported. } return params; } /** * Extract parameter value from given parameters map. * * @param parameters * <code>Map</code> with parameters names as map keys and parameters values as map values * @param name * name of the requested parameter * @return parameter value or null if it was not found in parameters map */ public static String getParameter(Map<String, List<String>> parameters, String name) { List<String> l = parameters.get(name); if (!(l == null || l.isEmpty())) { return l.get(0); } return null; } /** * Extract URL from given URI information. */ public static URL getRequestUrl(UriInfo uriInfo) { try { return uriInfo.getRequestUri().toURL(); } catch (MalformedURLException e) { // should never happen throw new RuntimeException(e.getMessage(), e); } } private UrlUtils() { } }