/**
*
*/
package com.trendrr.strest.server;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.handler.codec.http.DefaultHttpRequest;
import org.jboss.netty.handler.codec.http.DefaultHttpResponse;
import org.jboss.netty.handler.codec.http.HttpHeaders;
import org.jboss.netty.handler.codec.http.HttpMethod;
import org.jboss.netty.handler.codec.http.HttpRequest;
import org.jboss.netty.handler.codec.http.HttpResponse;
import org.jboss.netty.handler.codec.http.HttpResponseStatus;
import org.jboss.netty.handler.codec.http.HttpVersion;
import com.trendrr.oss.DynMap;
import com.trendrr.strest.ContentTypes;
import com.trendrr.strest.StrestUtil;
import com.trendrr.strest.server.v2.models.StrestHeader;
import com.trendrr.strest.server.v2.models.StrestHeader.TxnStatus;
import com.trendrr.strest.server.v2.models.StrestRequest;
import com.trendrr.strest.server.v2.models.StrestResponse;
import com.trendrr.strest.server.v2.models.http.StrestHttpRequest;
import com.trendrr.strest.server.v2.models.http.StrestHttpResponse;
import com.trendrr.strest.server.v2.models.json.StrestJsonRequest;
import com.trendrr.strest.server.v2.models.json.StrestJsonResponse;
/**
* @author Dustin Norlander
* @created Jan 26, 2011
*
*/
public class ResponseBuilder {
protected static Log log = LogFactory.getLog(ResponseBuilder.class);
StrestResponse response;
public static void main(String...strings) {
// ResponseBuilder b = new ResponseBuilder();
}
public static ResponseBuilder instance(StrestRequest request) {
return new ResponseBuilder(request);
}
public static ResponseBuilder instance(StrestResponse response) {
return new ResponseBuilder(response);
}
public ResponseBuilder(StrestResponse response) {
this.response = response;
}
/**
* creates a new response builder based on the txn id of the request.
* @param request
*/
public ResponseBuilder(StrestRequest request) {
if (request instanceof StrestJsonRequest) {
this.response = new StrestJsonResponse();
} else if (request instanceof StrestHttpRequest) {
this.response = new StrestHttpResponse();
}
response.setProtocol(request.getProtocolName(), request.getProtocolVersion());
response.setTxnId(request.getTxnId());
}
public ResponseBuilder txnStatus(TxnStatus status) {
response.setTxnStatus(status);
return this;
}
// /**
// * Sets the status to 302, and the Location to the url. This is a standard (sort of) redirect.
// *
// * This could be problematic for STREST clients, it is up to them to implement
// * redirects (or not).
// *
// * @param url
// * @return
// */
// public ResponseBuilder redirect(String url) {
// this.response.setStatus(HttpResponseStatus.FOUND);
// this.response.setHeader("Location", url);
// return this;
// }
// /**
// * Sets the status of the header.
// *
// * @param status
// * @return
// */
// public ResponseBuilder status(HttpResponseStatus status) {
// this.response.setStatus(status);
// return this;
// }
/**
* Sets the status of the header.
*
* @param status
* @return
*/
public ResponseBuilder status(int code, String message) {
this.response.setStatus(code, message);
return this;
}
/**
* Set the Strest-Txn-Id header.
* @param id
* @return
*/
public ResponseBuilder txnId(String id) {
if (id != null)
response.setTxnId(id);
return this;
}
public ResponseBuilder header(String header, String value) {
response.addHeader(header, value);
return this;
}
public ResponseBuilder content(String mimeType, byte[] bytes) {
response.setContent(mimeType, bytes);
return this;
}
/**
* encodes the text as utf8 and swallows and logs a warning for any character encoding exceptions
* @param mimeType
* @param content
* @return
*/
public ResponseBuilder contentUTF8(String mimeType, String content) {
if (content == null)
return this;
this.response.setContent(mimeType, content);
return this;
}
/**
* same as above but sets mimetype to text/plain
* @param content
* @return
*/
public ResponseBuilder contentUTF8(String content) {
this.contentUTF8(ContentTypes.TEXT, content);
return this;
}
public ResponseBuilder contentJSON(DynMap mp) {
this.response.setContent(mp);
return this;
}
public StrestResponse getResponse() {
return this.response;
}
public void setResponse(StrestResponse response) {
this.response = response;
}
}