All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.sphere.internal.util.QueryStringConstruction Maven / Gradle / Ivy

package io.sphere.internal.util;

import com.google.common.base.Joiner;
import com.google.common.base.Strings;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Multimap;
import com.google.common.collect.ObjectArrays;
import com.google.common.collect.Range;
import io.sphere.client.QueryParam;
import io.sphere.client.SphereClientException;
import org.joda.time.DateTime;

import static io.sphere.internal.util.QueryStringFormat.*;

import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.*;

/** Application-level query string helper (for filters & facets). */
public class QueryStringConstruction {

    //-------------------------------------------------------
    // String
    // ------------------------------------------------------

    public static Map addURLParams(Map queryParams, Collection params) {
        Map copyOfParams = copy(queryParams);
        for (QueryParam param: params) {
            String[] values = copyOfParams.get(param.getName());
            if (values == null) {
                copyOfParams.put(param.getName(), new String[]{param.getValue()});
            } else {
                if (!Arrays.asList(values).contains(param.getValue())) {
                    // can't add the same value multiple times
                    copyOfParams.put(param.getName(), ObjectArrays.concat(values, param.getValue()));
                }
            }
        }
        return copyOfParams;
    }

    public static Map removeURLParams(Map queryParams, Collection params) {
        Map copyOfParams = copy(queryParams);
        for (QueryParam param: params) {
            String[] values = copyOfParams.get(param.getName());
            if (values != null) {
                List valueList = new ArrayList();
                Collections.addAll(valueList, values);
                if (valueList.contains(param.getValue())){
                    valueList.remove(param.getValue());
                }
                if (valueList.isEmpty()) {
                    copyOfParams.remove(param.getName());
                } else {
                    copyOfParams.put(param.getName(), valueList.toArray(new String[]{}));
                }
            }
        }
        return copyOfParams;
    }

    public static boolean containsAllURLParams(Map queryParams, Collection params) {
        for (QueryParam param: params) {
            if (!containsURLParam(queryParams, param)) return false;
        }
        return true;
    }

    public static boolean containsURLParam(Map queryParams, QueryParam param) {
        String[] values = queryParams.get(param.getName());
        if (values == null)
            return false;
        return Arrays.asList(values).contains(param.getValue());
    }

    public static Map clearParam(String param, Map queryParams) {
        Map copyOfParams = copy(queryParams);
        copyOfParams.remove(param);
        return copyOfParams;
    }

    public static Map clearParams(Map queryParams, Collection params) {
        Map copyOfParams = copy(queryParams);
        for (QueryParam p: params) {
            copyOfParams.remove(p.getName());
        }
        return copyOfParams;
    }


    //-------------------------------------------------------
    // Double
    // ------------------------------------------------------

    public static String doubleToString(Double d) {
        return d.toString();
    }

    public static String doubleRangeToString(Double from, Double to) {
        return doubleToString(from) + rangeSeparator + doubleToString(to);
    }

    public static String doubleRangeToString(Range range) {
        return (range.hasLowerBound() ? doubleToString(range.lowerEndpoint()) : "") +
                rangeSeparator +
                (range.hasUpperBound() ? doubleToString(range.upperEndpoint()) : "");
    }


    //-------------------------------------------------------
    // BigDecimal
    // ------------------------------------------------------

    public static String decimalToString(BigDecimal d) {
        return d.toString();
    }

    public static String decimalRangeToString(BigDecimal from, BigDecimal to) {
        return decimalToString(from) + rangeSeparator + decimalToString(to);
    }

    public static String decimalRangeToString(Range range) {
        return (range.hasLowerBound() ? decimalToString(range.lowerEndpoint()) : "") +
                rangeSeparator +
                (range.hasUpperBound() ? decimalToString(range.upperEndpoint()) : "");
    }


    //-------------------------------------------------------
    // DateTime
    // ------------------------------------------------------

    public static String dateTimeToString(DateTime dateTime) {
        return dateTimeFormat.print(dateTime);
    }

    public static String dateTimeRangeToString(DateTime from, DateTime to) {
        return dateTimeToString(from) + rangeSeparator + dateTimeToString(to);
    }

    //-------------------------------------------------------
    // Helpers
    // ------------------------------------------------------

    private static Map copy(Map queryParams) {
        return new HashMap(queryParams);
    }

    public static String toQueryString(Multimap queryParams) {
        Map convertedParams = new HashMap();
        for (String key: queryParams.keySet()) {
            Collection values = queryParams.get(key);
            convertedParams.put(key, values.toArray(new String[values.size()]));
        }
        return toQueryString(convertedParams);
    }

    // This will look nicer with FlatMapper from Java 8
    public static String toQueryString(Map queryParams) {
        StringBuilder sb = new StringBuilder();
        boolean first = true;
        for (Map.Entry entry : queryParams.entrySet()) {
            String name = entry.getKey();
            String[] values = entry.getValue();
            for (String v: values) {
                if (!first) {
                    sb.append("&");
                }
                if (Strings.isNullOrEmpty(v)) {
                    sb.append(name);
                } else {
                    try {
                        sb.append(name + "=" + URLEncoder.encode(v, "UTF-8"));
                    } catch (UnsupportedEncodingException e) {
                        throw new SphereClientException(e);
                    }
                }
                first = false;
            }
        }
        return sb.toString();
    }

    /** Creates a link from a query string, for multiselect facet and filter UI. */
    public static String makeLink(String queryString) {
        return "?" + queryString;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy