package com.googlecode.mycontainer.commons.http;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.cookie.DateParseException;
import org.apache.http.impl.cookie.DateUtils;
import org.apache.http.message.BasicNameValuePair;
import com.googlecode.mycontainer.commons.util.ContentUtil;
import flexjson.JSON;
public class NamePairs {
private final List<NamePair> pairs = new ArrayList<NamePair>();
public NamePairs() {
}
@JSON(include = true)
public List<NamePair> pairs() {
return pairs;
}
public String encodeParams() {
Iterator<NamePair> it = pairs.iterator();
StringBuilder ret = new StringBuilder();
while (it.hasNext()) {
NamePair pair = it.next();
ret.append(pair.encode());
if (it.hasNext()) {
ret.append('&');
}
}
return ret.toString();
}
@Override
public String toString() {
Iterator<NamePair> it = pairs.iterator();
StringBuilder ret = new StringBuilder();
while (it.hasNext()) {
NamePair pair = it.next();
ret.append(pair);
if (it.hasNext()) {
ret.append('&');
}
}
return ret.toString();
}
public String first(String name) {
return first(name, null);
}
public void set(String key, Collection<String> values) {
clear(key);
for (String v : values) {
pairs.add(new NamePair(key, v.toString()));
}
}
public void clear(String key) {
Iterator<NamePair> iterator = pairs.iterator();
while (iterator.hasNext()) {
NamePair pair = iterator.next();
if (pair.name().equals(key)) {
iterator.remove();
}
}
}
public NamePairs set(String key, String value) {
clear(key);
if (value != null) {
pairs.add(new NamePair(key, value));
}
return this;
}
public void pairs(List<NamePair> pairs) {
this.pairs.clear();
this.pairs.addAll(pairs);
}
public String first(String name, String def) {
for (NamePair pair : pairs) {
if (pair.name().equals(name)) {
return pair.value();
}
}
return def;
}
public void add(String name, String value) {
pairs.add(new NamePair(name, value));
}
public List<String> get(String name) {
List<String> ret = new ArrayList<String>();
for (NamePair pair : pairs) {
if (pair.name().equals(name)) {
ret.add(pair.value());
}
}
return ret;
}
public Integer asInteger(String name) {
String ret = first(name);
if (ret == null) {
return null;
}
return new Integer(ret);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((pairs == null) ? 0 : pairs.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
NamePairs other = (NamePairs) obj;
if (pairs == null) {
if (other.pairs != null)
return false;
} else if (!pairs.equals(other.pairs))
return false;
return true;
}
public String contentType() {
String ret = first("Content-Type");
return ret;
}
public String mediaType() {
String ret = first("Content-Type");
return ContentUtil.getMediaType(ret);
}
public String charset() {
String ret = first("Content-Type");
return ContentUtil.getCharset(ret);
}
public boolean isBinary() {
return charset() == null;
}
public NamePairs contentType(String mediaType, String charset) {
if (charset != null) {
return set("Content-Type", mediaType + "; charset=" + charset);
}
return set("Content-Type", mediaType);
}
public String all(String name) {
StringBuilder ret = new StringBuilder();
Iterator<String> list = get(name).iterator();
while (list.hasNext()) {
String s = list.next();
ret.append(s);
if (list.hasNext()) {
ret.append(", ");
}
}
return ret.toString();
}
public Map<String, String[]> toMap() {
Map<String, String[]> ret = new HashMap<String, String[]>();
Set<String> names = names();
for (String name : names) {
ret.put(name, asArray(name));
}
return ret;
}
public Set<String> names() {
Set<String> ret = new HashSet<String>();
for (NamePair pair : pairs) {
ret.add(pair.name());
}
return ret;
}
public String[] asArray(String name) {
List<String> l = get(name);
return l.toArray(new String[l.size()]);
}
public void remove(String name) {
Iterator<NamePair> it = pairs.iterator();
while (it.hasNext()) {
NamePair pair = it.next();
if (pair.name().equals(name)) {
it.remove();
}
}
}
public String asQueryString() {
List<NameValuePair> pairs = toNamedValues();
return URLEncodedUtils.format(pairs, "utf-8");
}
public List<NameValuePair> toNamedValues() {
List<NameValuePair> pairs = new ArrayList<NameValuePair>(
this.pairs.size());
for (NamePair pair : this.pairs) {
pairs.add(new BasicNameValuePair(pair.name(), pair.value()));
}
return pairs;
}
public Date asDate(String name) {
String str = all(name);
if (str == null) {
return null;
}
try {
return DateUtils.parseDate(str);
} catch (DateParseException e) {
throw new RuntimeException(e);
}
}
}