package com.nvarghese.beowulf.common.http.payload;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.entity.ContentType;
import org.apache.http.message.BasicNameValuePair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UrlEncodedRequestPayload implements RequestPayload {
private Map<String, NameValuePair> mappedParameters;
// private final List<NameValuePair> parameters;
private String charset;
static Logger logger = LoggerFactory.getLogger(UrlEncodedRequestPayload.class);
public UrlEncodedRequestPayload(List<NameValuePair> parameters) {
this(parameters, null);
}
public UrlEncodedRequestPayload(List<NameValuePair> parameters, String charset) {
this.mappedParameters = new HashMap<String, NameValuePair>();
this.charset = charset;
if (parameters != null) {
for (NameValuePair nv : parameters) {
mappedParameters.put(nv.getName(), nv);
}
}
}
public void addParameter(NameValuePair parameter) {
if (parameter == null)
return;
mappedParameters.put(parameter.getName(), parameter);
}
public void addParameter(String name, String value) {
BasicNameValuePair bnp = new BasicNameValuePair(name, value);
addParameter(bnp);
}
public void removeParameter(String name) {
mappedParameters.remove(name);
}
public HttpEntity toHttpEntity() {
UrlEncodedFormEntity formEntity = null;
try {
if (charset == null) {
formEntity = new UrlEncodedFormEntity(mappedParameters.values());
} else {
List<NameValuePair> nvp = new ArrayList<NameValuePair>();
nvp.addAll(mappedParameters.values());
formEntity = new UrlEncodedFormEntity(nvp, charset);
}
} catch (UnsupportedEncodingException e) {
logger.error("Problem in converting to URL encoded entity. Reason: {}", e.getMessage(), e);
}
return formEntity;
}
@Override
public byte[] getBody() {
if (charset != null && Charset.isSupported(charset)) {
return URLEncodedUtils.format(mappedParameters.values(), Charset.forName(charset)).getBytes();
} else {
return URLEncodedUtils.format(mappedParameters.values(), Charset.defaultCharset()).getBytes();
}
}
@Override
public ContentType getContentType() {
return ContentType.APPLICATION_FORM_URLENCODED;
}
public String toUrlQueryString() {
if (Charset.isSupported(charset)) {
return URLEncodedUtils.format(mappedParameters.values(), Charset.forName(charset));
} else {
return URLEncodedUtils.format(mappedParameters.values(), Charset.defaultCharset());
}
}
public List<NameValuePair> getParameters() {
List<NameValuePair> nps = new ArrayList<NameValuePair>();
nps.addAll(mappedParameters.values());
return nps;
}
public String getParameterValue(String name) {
NameValuePair nm = mappedParameters.get(name);
return nm.getValue();
}
}