package com.github.scribejava.core.model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import com.github.scribejava.core.utils.OAuthEncoder;
import com.github.scribejava.core.utils.Preconditions;
public class ParameterList {
private static final char QUERY_STRING_SEPARATOR = '?';
private static final String PARAM_SEPARATOR = "&";
private static final String PAIR_SEPARATOR = "=";
private static final String EMPTY_STRING = "";
private final List<Parameter> params;
public ParameterList() {
params = new ArrayList<>();
}
ParameterList(List<Parameter> params) {
this.params = new ArrayList<>(params);
}
public ParameterList(Map<String, String> map) {
this();
if (map != null && !map.isEmpty()) {
for (Map.Entry<String, String> entry : map.entrySet()) {
params.add(new Parameter(entry.getKey(), entry.getValue()));
}
}
}
public void add(String key, String value) {
params.add(new Parameter(key, value));
}
public String appendTo(String url) {
Preconditions.checkNotNull(url, "Cannot append to null URL");
final String queryString = asFormUrlEncodedString();
if (queryString.equals(EMPTY_STRING)) {
return url;
} else {
return url
+ (url.indexOf(QUERY_STRING_SEPARATOR) == -1 ? QUERY_STRING_SEPARATOR : PARAM_SEPARATOR)
+ queryString;
}
}
public String asOauthBaseString() {
return OAuthEncoder.encode(asFormUrlEncodedString());
}
public String asFormUrlEncodedString() {
if (params.isEmpty()) {
return EMPTY_STRING;
}
final StringBuilder builder = new StringBuilder();
for (Parameter p : params) {
builder.append(PARAM_SEPARATOR).append(p.asUrlEncodedPair());
}
return builder.substring(1);
}
public void addAll(ParameterList other) {
params.addAll(other.getParams());
}
public void addQuerystring(String queryString) {
if (queryString != null && !queryString.isEmpty()) {
for (String param : queryString.split(PARAM_SEPARATOR)) {
final String[] pair = param.split(PAIR_SEPARATOR);
final String key = OAuthEncoder.decode(pair[0]);
final String value = pair.length > 1 ? OAuthEncoder.decode(pair[1]) : EMPTY_STRING;
params.add(new Parameter(key, value));
}
}
}
public boolean contains(Parameter param) {
return params.contains(param);
}
public int size() {
return params.size();
}
public List<Parameter> getParams() {
return params;
}
public ParameterList sort() {
final ParameterList sorted = new ParameterList(params);
Collections.sort(sorted.getParams());
return sorted;
}
}