package com.bao.lc.client;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.http.Header;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicNameValuePair;
public class RequestBuilder
{
//Optional. Default: GET
private String method;
//Must specify one of the below 3
//1. Raw URI
private URI uri;
//2. baseURI and reference
private URI baseURI;
private String reference;
//3. Raw URI string
private String uriString = null;
//Optional
private Map<String, String> paramMap = null;
private List<NameValuePair> paramList = null;
//Optional
private Map<String, String> headers = null;
//Optional. Default: UTF-8
private String encoding = null;
//Optional.
private boolean allowRelativeURI = false;
public RequestBuilder()
{
reset();
}
private void reset()
{
method = HttpGet.METHOD_NAME;
uri = null;
baseURI = null;
reference = null;
uriString = null;
paramMap = null;
paramList = null;
headers = null;
encoding = "UTF-8";
allowRelativeURI = false;
}
private URI getRequestURI()
{
URI requestURI = null;
do
{
// URI first
if(uri != null)
{
requestURI = uri;
break;
}
// Then baseURI
if(baseURI != null)
{
if(reference == null)
{
throw new IllegalArgumentException(
"must specify 'referrence' when 'baseURI' is available");
}
else
{
requestURI = baseURI.resolve(reference);
}
break;
}
// Last uriString
if(uriString != null)
{
requestURI = URI.create(uriString);
break;
}
// Error here
throw new IllegalArgumentException("must specify URI");
}
while(false);
if(!allowRelativeURI && !requestURI.isAbsolute())
{
throw new IllegalArgumentException("URI must be absolute, URI=" + requestURI.toString());
}
return requestURI;
}
private List<NameValuePair> getParameters()
{
if(paramList != null && paramMap != null)
{
throw new IllegalArgumentException("paramList and paramMap can't exist at the same time.");
}
if(paramList != null)
{
return paramList;
}
if(paramMap != null)
{
return toNameValuePairList(paramMap);
}
return null;
}
public RequestBuilder method(String method)
{
this.method = method;
return this;
}
public RequestBuilder uri(URI uri)
{
this.uri = uri;
return this;
}
public RequestBuilder baseURI(URI baseURI)
{
this.baseURI = baseURI;
return this;
}
public RequestBuilder reference(String referrence)
{
this.reference = referrence;
return this;
}
public RequestBuilder uriStr(String uriString)
{
this.uriString = uriString;
return this;
}
public RequestBuilder paramMap(Map<String, String> paramMap)
{
this.paramMap = paramMap;
return this;
}
public RequestBuilder paramList(List<NameValuePair> paramList)
{
this.paramList = paramList;
return this;
}
public RequestBuilder headers(Map<String, String> headers)
{
this.headers = headers;
return this;
}
public RequestBuilder encoding(String encoding)
{
this.encoding = encoding;
return this;
}
public RequestBuilder allowRelativeURI(boolean allowRelativeURI)
{
this.allowRelativeURI = allowRelativeURI;
return this;
}
public HttpUriRequest create()
{
HttpUriRequest request = null;
if(HttpPost.METHOD_NAME.equalsIgnoreCase(method))
{
request = createPost();
}
else
{
request = createGet();
}
return request;
}
public HttpUriRequest create(String uriString)
{
this.uriString = uriString;
return create();
}
public HttpGet createGet()
{
HttpGet get = null;
try
{
URI requestURI = getRequestURI();
// parameters
List<NameValuePair> parameters = this.getParameters();
if(parameters != null && !parameters.isEmpty())
{
String addedQuery = URLEncodedUtils.format(parameters, encoding);
StringBuilder sb = new StringBuilder();
sb.append(requestURI.toString());
String rawQuery = requestURI.getRawQuery();
//e.g. http://www.yahoo.com/
if(rawQuery == null)
{
sb.append("?");
}
else
{
//e.g. http://www.yahoo.com/a.html?a=1
if(!rawQuery.isEmpty() && !rawQuery.endsWith("&"))
{
sb.append("&");
}
//else case:
//e.g. empty rawQuery: http://www.yahoo.com/?
//e.g. http://www.yahoo.com/a.html?a=1&
}
sb.append(addedQuery);
get = new HttpGet(sb.toString());
}
else
{
get = new HttpGet(requestURI);
}
// Headers
if(null != headers)
{
get.setHeaders(toHeaders(headers));
}
}
finally
{
// reset the properties
reset();
}
return get;
}
public HttpGet createGet(String uriString)
{
this.uriString = uriString;
return createGet();
}
public HttpPost createPost()
{
HttpPost post = null;
try
{
URI requestURI = getRequestURI();
// parameters
List<NameValuePair> parameters = this.getParameters();
if(parameters == null)
{
throw new IllegalArgumentException("must specify 'parameters' for POST");
}
if(encoding == null)
{
throw new IllegalArgumentException("must specify 'encoding' for POST");
}
post = new HttpPost(requestURI);
// Post data
try
{
post.setEntity(new UrlEncodedFormEntity(parameters, encoding));
}
catch(UnsupportedEncodingException e)
{
IllegalArgumentException e2 = new IllegalArgumentException();
e2.initCause(e);
throw e2;
}
// Headers
if(null != headers)
{
post.setHeaders(toHeaders(headers));
}
}
finally
{
// reset the properties
reset();
}
return post;
}
public HttpGet createPost(String uriString)
{
this.uriString = uriString;
return createGet();
}
/**
* Assembly Headers
*
* @param headers
* @return
*/
private static Header[] toHeaders(Map<String, String> headers)
{
Header[] allHeader = new BasicHeader[headers.size()];
int i = 0;
for(String str : headers.keySet())
{
allHeader[i] = new BasicHeader(str, headers.get(str));
i++;
}
return allHeader;
}
private static List<NameValuePair> toNameValuePairList(Map<String, String> paramMap)
{
List<NameValuePair> list = new ArrayList<NameValuePair>(paramMap.size());
for(String paramName : paramMap.keySet())
{
list.add(new BasicNameValuePair(paramName, paramMap.get(paramName)));
}
return list;
}
}