/**
*
*/
package com.trendrr.oss.networking.strest;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.trendrr.oss.DynMap;
/**
* @author Dustin Norlander
* @created Jan 26, 2011
*
*/
public class RequestBuilder {
protected static Log log = LogFactory.getLog(RequestBuilder.class);
StrestRequest request;
public static void main(String...strings) {
}
public static RequestBuilder instance() {
return new RequestBuilder();
}
public static RequestBuilder instance(StrestRequest request) {
return new RequestBuilder(request);
}
public RequestBuilder() {
this(null);
}
public RequestBuilder(StrestRequest request) {
if (request == null) {
this.request = new StrestRequest();
} else {
this.request = request;
}
}
/**
* sets the host and the uri.
*
* this is assumed to be a properly formed url
* @param url
* @return
* @throws MalformedURLException
*/
public RequestBuilder url(String url) throws MalformedURLException {
try {
URL u = new URL(url);
String host = u.getHost();
request.setHeader(StrestHeaders.Names.HOST, host);
String uri = url.substring(url.indexOf(host) + host.length());
request.setUri(uri);
} catch (Exception x) {
MalformedURLException m = new MalformedURLException("Unable to parse: " + url);
m.initCause(x);
throw m;
}
return this;
}
public RequestBuilder uri(String uri) {
request.setUri(uri);
return this;
}
/**
* adds params to the uri.
* @param params
* @return
*/
public RequestBuilder paramsGET(DynMap params) {
String encodedParams = params.toURLString();
if (encodedParams == null || encodedParams.isEmpty()) {
return this;
}
String uri = request.getUri();
if (!uri.contains("?")) {
uri = uri + "?";
} else {
uri = uri + "&";
}
request.setUri(uri + encodedParams);
return this;
}
/**
* adds params to the content section and sets the Content-Type to
*
* @param params
* @return
*/
public RequestBuilder paramsPOST(DynMap params) {
String encodedParams = params.toURLString();
log.info(encodedParams);
if (encodedParams == null || encodedParams.isEmpty()) {
return this;
}
return this.contentUTF8("application/x-www-form-urlencoded", encodedParams);
}
/**
* Adds params to content section as json string, with mime type set to json
* @param params
* @return
*/
public RequestBuilder paramsJSONPOST(DynMap params){
String json = params.toJSONString();
log.info(json);
if(json == null || json.isEmpty()){
return this;
}
return this.contentUTF8("application/json", json);
}
/**
* encodes the text as utf8 and swallows and logs a warning for any character encoding exceptions
* @param mimeType
* @param content
* @return
*/
public RequestBuilder contentUTF8(String mimeType, String content) {
try {
this.content(mimeType, content.getBytes("utf8"));
} catch (UnsupportedEncodingException e) {
log.warn("Swallowed", e);
}
return this;
}
/**
* sets a custom transaction Id. a unique txn id is
* already set, so this call is not manditory.
* @param id
* @return
*/
public RequestBuilder txnId(String id) {
request.setHeader(StrestHeaders.Names.STREST_TXN_ID, id);
return this;
}
/**
* what kind of transactions to accept.
*
* 'single' or multi
*
* @param val
* @return
*/
public RequestBuilder txnAccept(String val) {
request.setHeader(StrestHeaders.Names.STREST_TXN_ACCEPT, val);
return this;
}
public RequestBuilder method(String method) {
request.setMethod(method);
return this;
}
public RequestBuilder header(String header, Object value) {
request.setHeader(header, value);
return this;
}
public RequestBuilder content(String contentType, byte[] bytes) {
request.setContent(contentType, bytes);
return this;
}
public StrestRequest getRequest() {
return this.request;
}
}